ZGlmZiAtLWdpdCBhL3JjMy9DTWFrZUxpc3RzLnR4dCBiL3JjMy9DTWFrZUxpc3RzLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZDYwNjMzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsNSBAQAorY21ha2VfbWluaW11bV9yZXF1aXJlZChWRVJTSU9OIDIuOCBGQVRBTF9FUlJPUikKKworc2V0KE9QRU5NUF9MTFZNX1RPT0xTX0RJUiAiIiBDQUNIRSBQQVRIICJQYXRoIHRvIExMVk0gdG9vbHMgZm9yIHRlc3RpbmciKQorCithZGRfc3ViZGlyZWN0b3J5KHJ1bnRpbWUpCmRpZmYgLS1naXQgYS9yYzMvQ1JFRElUUy50eHQgYi9yYzMvQ1JFRElUUy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThhYjY3YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9DUkVESVRTLnR4dApAQCAtMCwwICsxLDU3IEBACitUaGlzIGZpbGUgaXMgYSBwYXJ0aWFsIGxpc3Qgb2YgcGVvcGxlIHdobyBoYXZlIGNvbnRyaWJ1dGVkIHRvIHRoZSBMTFZNL29wZW5tcAorcHJvamVjdC4gIElmIHlvdSBoYXZlIGNvbnRyaWJ1dGVkIGEgcGF0Y2ggb3IgbWFkZSBzb21lIG90aGVyIGNvbnRyaWJ1dGlvbiB0bworTExWTS9vcGVubXAsIHBsZWFzZSBzdWJtaXQgYSBwYXRjaCB0byB0aGlzIGZpbGUgdG8gYWRkIHlvdXJzZWxmLCBhbmQgaXQgd2lsbCBiZQorZG9uZSEKKworVGhlIGxpc3QgaXMgc29ydGVkIGJ5IHN1cm5hbWUgYW5kIGZvcm1hdHRlZCB0byBhbGxvdyBlYXN5IGdyZXBwaW5nIGFuZAorYmVhdXRpZmljYXRpb24gYnkgc2NyaXB0cy4gIFRoZSBmaWVsZHMgYXJlOiBuYW1lIChOKSwgZW1haWwgKEUpLCB3ZWItYWRkcmVzcworKFcpLCBQR1Aga2V5IElEIGFuZCBmaW5nZXJwcmludCAoUCksIGRlc2NyaXB0aW9uIChEKSwgYW5kIHNuYWlsLW1haWwgYWRkcmVzcworKFMpLgorCitOOiBDYXJsbyBCZXJ0b2xsaQorVzogaHR0cDovL2libS5jb20KK0Q6IElCTSBjb250cmlidXRvciB0byBQb3dlclBDIHN1cHBvcnQgaW4gQ01ha2UgZmlsZXMgYW5kIGVsc2V3aGVyZS4KKworTjogU3VuaXRhIENoYW5kcmFzZWthcmFuCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogQmFyYmFyYSBDaGFwbWFuCitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogVW5pdmVyc2l0eSBvZiBIb3VzdG9uCitXOiBodHRwOi8vd2ViLmNzLnVoLmVkdS9+b3BlbnVoL2Rvd25sb2FkLworRDogT3BlblVIIHRlc3Qgc3VpdGUKKworTjogSW50ZWwgQ29ycG9yYXRpb24gT3Blbk1QIHJ1bnRpbWUgdGVhbQorVzogaHR0cDovL29wZW5tcHJ0bC5vcmcKK0Q6IENyZWF0ZWQgdGhlIHJ1bnRpbWUuCisKK046IEpvaG4gTWVsbG9yLUNydW1tZXkgYW5kIG90aGVyIG1lbWJlcnMgb2YgdGhlIE9wZW5NUCBUb29scyBXb3JraW5nIEdyb3VwCitFOiBqb2hubWNAcmljZS5lZHUKK0Q6IE9wZW5NUCBUb29scyBJbnRlcmZhY2UgKE9NUFQpCisKK046IE1hdHRoaWFzIE11bGxlcgorRDogQ29udHJpYnV0b3IgdG8gdGVzdHN1aXRlIGZyb20gT3BlblVICisKK046IFRhbCBOZXZvCitFOiB0YWxAc2NhbGVtcC5jb20KK0Q6IFNjYWxlTVAgY29udHJpYnV0b3IgdG8gaW1wcm92ZSBydW50aW1lIHBlcmZvcm1hbmNlIHRoZXJlLgorVzogaHR0cDovL3NjYWxlbXAuY29tCisKK046IFBhdmVsIE5leXRjaGV2CitEOiBDb250cmlidXRvciB0byB0ZXN0c3VpdGUgZnJvbSBPcGVuVUgKKworTjogU3RldmVuIE5vb25hbgorRTogc3RldmVuQHVwbGlua2xhYnMubmV0CitEOiBQYXRjaGVzIGZvciB0aGUgQVJNIGFyY2hpdGVjdHVyZSBhbmQgcmVtb3ZhbCBvZiBzZXZlcmFsIGluY29uc2lzdGVuY2llcy4KKworTjogQWxwIFRva2VyCitFOiBhbHBAbnVhbnRpLmNvbQorRDogTWFraW5nIGJ1aWxkIHdvcmsgZm9yIEZyZWVCU0QuCisKK046IENoZW5nIFdhbmcKK0Q6IENvbnRyaWJ1dG9yIHRvIHRlc3RzdWl0ZSBmcm9tIE9wZW5VSAorCitOOiBEaWVnbyBDYWJhbGxlcm8KK0U6IGRpZWdvLmwuY2FiYWxsZXJvQGdtYWlsLmNvbQorRDogRm9yayBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudHMKZGlmZiAtLWdpdCBhL3JjMy9MSUNFTlNFLnR4dCBiL3JjMy9MSUNFTlNFLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kODU4NTUyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL0xJQ0VOU0UudHh0CkBAIC0wLDAgKzEsMTc0IEBACis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIHNvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgYm90aCB0aGUKK1VuaXZlcnNpdHkgb2YgSWxsaW5vaXMgIkJTRC1MaWtlIiBsaWNlbnNlIGFuZCB0aGUgTUlUIGxpY2Vuc2UuICBBcyBhIHVzZXIgb2YKK3RoaXMgY29kZSB5b3UgbWF5IGNob29zZSB0byB1c2UgaXQgdW5kZXIgZWl0aGVyIGxpY2Vuc2UuICBBcyBhIGNvbnRyaWJ1dG9yLAoreW91IGFncmVlIHRvIGFsbG93IHlvdXIgY29kZSB0byBiZSB1c2VkIHVuZGVyIGJvdGguICBUaGUgZnVsbCB0ZXh0IG9mIHRoZQorcmVsZXZhbnQgbGljZW5zZXMgaXMgaW5jbHVkZWQgYmVsb3cuCisKK0luIGFkZGl0aW9uLCBhIGxpY2Vuc2UgYWdyZWVtZW50IGZyb20gdGhlIGNvcHlyaWdodC9wYXRlbnQgaG9sZGVycyBvZiB0aGUKK3NvZnR3YXJlIGNvbnRhaW5lZCBpbiB0aGlzIGRpcmVjdG9yeSB0cmVlIGlzIGluY2x1ZGVkIGJlbG93LgorCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVW5pdmVyc2l0eSBvZiBJbGxpbm9pcy9OQ1NBCitPcGVuIFNvdXJjZSBMaWNlbnNlCisKK0NvcHlyaWdodCAoYykgMTk5Ny0yMDE2IEludGVsIENvcnBvcmF0aW9uCisKK0FsbCByaWdodHMgcmVzZXJ2ZWQuCisKK0RldmVsb3BlZCBieToKKyAgICBPcGVuTVAgUnVudGltZSBUZWFtCisgICAgSW50ZWwgQ29ycG9yYXRpb24KKyAgICBodHRwOi8vd3d3Lm9wZW5tcHJ0bC5vcmcKKworUGVybWlzc2lvbiBpcyBoZXJlYnkgZ3JhbnRlZCwgZnJlZSBvZiBjaGFyZ2UsIHRvIGFueSBwZXJzb24gb2J0YWluaW5nIGEgY29weSBvZgordGhpcyBzb2Z0d2FyZSBhbmQgYXNzb2NpYXRlZCBkb2N1bWVudGF0aW9uIGZpbGVzICh0aGUgIlNvZnR3YXJlIiksIHRvIGRlYWwgd2l0aAordGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cyB0bwordXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbCBjb3BpZXMKK29mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzIGZ1cm5pc2hlZCB0byBkbworc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCisgICAgKiBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgICB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBkaXNjbGFpbWVycy4KKworICAgICogUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQgbm90aWNlLAorICAgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lcnMgaW4gdGhlCisgICAgICBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUgZGlzdHJpYnV0aW9uLgorCisgICAgKiBOZWl0aGVyIHRoZSBuYW1lcyBvZiBJbnRlbCBDb3Jwb3JhdGlvbiBPcGVuTVAgUnVudGltZSBUZWFtIG5vciB0aGUKKyAgICAgIG5hbWVzIG9mIGl0cyBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8gZW5kb3JzZSBvciBwcm9tb3RlIHByb2R1Y3RzCisgICAgICBkZXJpdmVkIGZyb20gdGhpcyBTb2Z0d2FyZSB3aXRob3V0IHNwZWNpZmljIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKworVEhFIFNPRlRXQVJFIElTIFBST1ZJREVEICJBUyBJUyIsIFdJVEhPVVQgV0FSUkFOVFkgT0YgQU5ZIEtJTkQsIEVYUFJFU1MgT1IKK0lNUExJRUQsIElOQ0xVRElORyBCVVQgTk9UIExJTUlURUQgVE8gVEhFIFdBUlJBTlRJRVMgT0YgTUVSQ0hBTlRBQklMSVRZLCBGSVRORVNTCitGT1IgQSBQQVJUSUNVTEFSIFBVUlBPU0UgQU5EIE5PTklORlJJTkdFTUVOVC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQ09OVFJJQlVUT1JTIE9SIENPUFlSSUdIVCBIT0xERVJTIEJFIExJQUJMRSBGT1IgQU5ZIENMQUlNLCBEQU1BR0VTIE9SIE9USEVSCitMSUFCSUxJVFksIFdIRVRIRVIgSU4gQU4gQUNUSU9OIE9GIENPTlRSQUNULCBUT1JUIE9SIE9USEVSV0lTRSwgQVJJU0lORyBGUk9NLAorT1VUIE9GIE9SIElOIENPTk5FQ1RJT04gV0lUSCBUSEUgU09GVFdBUkUgT1IgVEhFIFVTRSBPUiBPVEhFUiBERUFMSU5HUyBXSVRIIFRIRQorU09GVFdBUkUuCisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb3B5cmlnaHQgKGMpIDE5OTctMjAxNiBJbnRlbCBDb3Jwb3JhdGlvbgorCitQZXJtaXNzaW9uIGlzIGhlcmVieSBncmFudGVkLCBmcmVlIG9mIGNoYXJnZSwgdG8gYW55IHBlcnNvbiBvYnRhaW5pbmcgYSBjb3B5CitvZiB0aGlzIHNvZnR3YXJlIGFuZCBhc3NvY2lhdGVkIGRvY3VtZW50YXRpb24gZmlsZXMgKHRoZSAiU29mdHdhcmUiKSwgdG8gZGVhbAoraW4gdGhlIFNvZnR3YXJlIHdpdGhvdXQgcmVzdHJpY3Rpb24sIGluY2x1ZGluZyB3aXRob3V0IGxpbWl0YXRpb24gdGhlIHJpZ2h0cwordG8gdXNlLCBjb3B5LCBtb2RpZnksIG1lcmdlLCBwdWJsaXNoLCBkaXN0cmlidXRlLCBzdWJsaWNlbnNlLCBhbmQvb3Igc2VsbAorY29waWVzIG9mIHRoZSBTb2Z0d2FyZSwgYW5kIHRvIHBlcm1pdCBwZXJzb25zIHRvIHdob20gdGhlIFNvZnR3YXJlIGlzCitmdXJuaXNoZWQgdG8gZG8gc28sIHN1YmplY3QgdG8gdGhlIGZvbGxvd2luZyBjb25kaXRpb25zOgorCitUaGUgYWJvdmUgY29weXJpZ2h0IG5vdGljZSBhbmQgdGhpcyBwZXJtaXNzaW9uIG5vdGljZSBzaGFsbCBiZSBpbmNsdWRlZCBpbgorYWxsIGNvcGllcyBvciBzdWJzdGFudGlhbCBwb3J0aW9ucyBvZiB0aGUgU29mdHdhcmUuCisKK1RIRSBTT0ZUV0FSRSBJUyBQUk9WSURFRCAiQVMgSVMiLCBXSVRIT1VUIFdBUlJBTlRZIE9GIEFOWSBLSU5ELCBFWFBSRVNTIE9SCitJTVBMSUVELCBJTkNMVURJTkcgQlVUIE5PVCBMSU1JVEVEIFRPIFRIRSBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSwKK0ZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFORCBOT05JTkZSSU5HRU1FTlQuIElOIE5PIEVWRU5UIFNIQUxMIFRIRQorQVVUSE9SUyBPUiBDT1BZUklHSFQgSE9MREVSUyBCRSBMSUFCTEUgRk9SIEFOWSBDTEFJTSwgREFNQUdFUyBPUiBPVEhFUgorTElBQklMSVRZLCBXSEVUSEVSIElOIEFOIEFDVElPTiBPRiBDT05UUkFDVCwgVE9SVCBPUiBPVEhFUldJU0UsIEFSSVNJTkcgRlJPTSwKK09VVCBPRiBPUiBJTiBDT05ORUNUSU9OIFdJVEggVEhFIFNPRlRXQVJFIE9SIFRIRSBVU0UgT1IgT1RIRVIgREVBTElOR1MgSU4KK1RIRSBTT0ZUV0FSRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0ludGVsIENvcnBvcmF0aW9uCisKK1NvZnR3YXJlIEdyYW50IExpY2Vuc2UgQWdyZWVtZW50ICgiQWdyZWVtZW50IikKKworRXhjZXB0IGZvciB0aGUgbGljZW5zZSBncmFudGVkIGhlcmVpbiB0byB5b3UsIEludGVsIENvcnBvcmF0aW9uICgiSW50ZWwiKSByZXNlcnZlcworYWxsIHJpZ2h0LCB0aXRsZSwgYW5kIGludGVyZXN0IGluIGFuZCB0byB0aGUgU29mdHdhcmUgKGRlZmluZWQgYmVsb3cpLgorCitEZWZpbml0aW9uCisKKyJTb2Z0d2FyZSIgbWVhbnMgdGhlIGNvZGUgYW5kIGRvY3VtZW50YXRpb24gYXMgd2VsbCBhcyBhbnkgb3JpZ2luYWwgd29yayBvZgorYXV0aG9yc2hpcCwgaW5jbHVkaW5nIGFueSBtb2RpZmljYXRpb25zIG9yIGFkZGl0aW9ucyB0byBhbiBleGlzdGluZyB3b3JrLCB0aGF0CitpcyBpbnRlbnRpb25hbGx5IHN1Ym1pdHRlZCBieSBJbnRlbCB0byBsbHZtLm9yZyAoaHR0cDovL2xsdm0ub3JnKSAoIkxMVk0iKSBmb3IKK2luY2x1c2lvbiBpbiwgb3IgZG9jdW1lbnRhdGlvbiBvZiwgYW55IG9mIHRoZSBwcm9kdWN0cyBvd25lZCBvciBtYW5hZ2VkIGJ5IExMVk0KKyh0aGUgIldvcmsiKS4gRm9yIHRoZSBwdXJwb3NlcyBvZiB0aGlzIGRlZmluaXRpb24sICJzdWJtaXR0ZWQiIG1lYW5zIGFueSBmb3JtIG9mCitlbGVjdHJvbmljLCB2ZXJiYWwsIG9yIHdyaXR0ZW4gY29tbXVuaWNhdGlvbiBzZW50IHRvIExMVk0gb3IgaXRzCityZXByZXNlbnRhdGl2ZXMsIGluY2x1ZGluZyBidXQgbm90IGxpbWl0ZWQgdG8gY29tbXVuaWNhdGlvbiBvbiBlbGVjdHJvbmljCittYWlsaW5nIGxpc3RzLCBzb3VyY2UgY29kZSBjb250cm9sIHN5c3RlbXMsIGFuZCBpc3N1ZSB0cmFja2luZyBzeXN0ZW1zIHRoYXQgYXJlCittYW5hZ2VkIGJ5LCBvciBvbiBiZWhhbGYgb2YsIExMVk0gZm9yIHRoZSBwdXJwb3NlIG9mIGRpc2N1c3NpbmcgYW5kIGltcHJvdmluZwordGhlIFdvcmssIGJ1dCBleGNsdWRpbmcgY29tbXVuaWNhdGlvbiB0aGF0IGlzIGNvbnNwaWN1b3VzbHkgbWFya2VkIG90aGVyd2lzZS4KKworMS4gR3JhbnQgb2YgQ29weXJpZ2h0IExpY2Vuc2UuIFN1YmplY3QgdG8gdGhlIHRlcm1zIGFuZCBjb25kaXRpb25zIG9mIHRoaXMKKyAgIEFncmVlbWVudCwgSW50ZWwgaGVyZWJ5IGdyYW50cyB0byB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUKKyAgIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MuCisKKzIuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEludGVsIGhlcmVieSBncmFudHMgeW91IGFuZCB0byByZWNpcGllbnRzIG9mIHRoZSBTb2Z0d2FyZQorICAgZGlzdHJpYnV0ZWQgYnkgTExWTSBhIHBlcnBldHVhbCwgd29ybGR3aWRlLCBub24tZXhjbHVzaXZlLCBuby1jaGFyZ2UsCisgICByb3lhbHR5LWZyZWUsIGlycmV2b2NhYmxlIChleGNlcHQgYXMgc3RhdGVkIGluIHRoaXMgc2VjdGlvbikgcGF0ZW50IGxpY2Vuc2UKKyAgIHRvIG1ha2UsIGhhdmUgbWFkZSwgdXNlLCBvZmZlciB0byBzZWxsLCBzZWxsLCBpbXBvcnQsIGFuZCBvdGhlcndpc2UgdHJhbnNmZXIKKyAgIHRoZSBXb3JrLCB3aGVyZSBzdWNoIGxpY2Vuc2UgYXBwbGllcyBvbmx5IHRvIHRob3NlIHBhdGVudCBjbGFpbXMgbGljZW5zYWJsZQorICAgYnkgSW50ZWwgdGhhdCBhcmUgbmVjZXNzYXJpbHkgaW5mcmluZ2VkIGJ5IEludGVsJ3MgU29mdHdhcmUgYWxvbmUgb3IgYnkKKyAgIGNvbWJpbmF0aW9uIG9mIHRoZSBTb2Z0d2FyZSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggU29mdHdhcmUgd2FzCisgICBzdWJtaXR0ZWQuIElmIGFueSBlbnRpdHkgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IEludGVsIG9yIGFueQorICAgb3RoZXIgZW50aXR5IChpbmNsdWRpbmcgYSBjcm9zcy1jbGFpbSBvciBjb3VudGVyY2xhaW0gaW4gYSBsYXdzdWl0KSBhbGxlZ2luZworICAgdGhhdCBJbnRlbCdzIFNvZnR3YXJlLCBvciB0aGUgV29yayB0byB3aGljaCBJbnRlbCBoYXMgY29udHJpYnV0ZWQgY29uc3RpdHV0ZXMKKyAgIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQKKyAgIHRvIHRoYXQgZW50aXR5IHVuZGVyIHRoaXMgQWdyZWVtZW50IGZvciB0aGUgU29mdHdhcmUgb3IgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCB0aGUgc29mdHdhcmUgaXMKK3Byb3ZpZGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0FSTSBMaW1pdGVkCisKK1NvZnR3YXJlIEdyYW50IExpY2Vuc2UgQWdyZWVtZW50ICgiQWdyZWVtZW50IikKKworRXhjZXB0IGZvciB0aGUgbGljZW5zZSBncmFudGVkIGhlcmVpbiB0byB5b3UsIEFSTSBMaW1pdGVkICgiQVJNIikgcmVzZXJ2ZXMgYWxsCityaWdodCwgdGl0bGUsIGFuZCBpbnRlcmVzdCBpbiBhbmQgdG8gdGhlIFNvZnR3YXJlIChkZWZpbmVkIGJlbG93KS4KKworRGVmaW5pdGlvbgorCisiU29mdHdhcmUiIG1lYW5zIHRoZSBjb2RlIGFuZCBkb2N1bWVudGF0aW9uIGFzIHdlbGwgYXMgYW55IG9yaWdpbmFsIHdvcmsgb2YKK2F1dGhvcnNoaXAsIGluY2x1ZGluZyBhbnkgbW9kaWZpY2F0aW9ucyBvciBhZGRpdGlvbnMgdG8gYW4gZXhpc3Rpbmcgd29yaywgdGhhdAoraXMgaW50ZW50aW9uYWxseSBzdWJtaXR0ZWQgYnkgQVJNIHRvIGxsdm0ub3JnIChodHRwOi8vbGx2bS5vcmcpICgiTExWTSIpIGZvcgoraW5jbHVzaW9uIGluLCBvciBkb2N1bWVudGF0aW9uIG9mLCBhbnkgb2YgdGhlIHByb2R1Y3RzIG93bmVkIG9yIG1hbmFnZWQgYnkgTExWTQorKHRoZSAiV29yayIpLiBGb3IgdGhlIHB1cnBvc2VzIG9mIHRoaXMgZGVmaW5pdGlvbiwgInN1Ym1pdHRlZCIgbWVhbnMgYW55IGZvcm0gb2YKK2VsZWN0cm9uaWMsIHZlcmJhbCwgb3Igd3JpdHRlbiBjb21tdW5pY2F0aW9uIHNlbnQgdG8gTExWTSBvciBpdHMKK3JlcHJlc2VudGF0aXZlcywgaW5jbHVkaW5nIGJ1dCBub3QgbGltaXRlZCB0byBjb21tdW5pY2F0aW9uIG9uIGVsZWN0cm9uaWMKK21haWxpbmcgbGlzdHMsIHNvdXJjZSBjb2RlIGNvbnRyb2wgc3lzdGVtcywgYW5kIGlzc3VlIHRyYWNraW5nIHN5c3RlbXMgdGhhdCBhcmUKK21hbmFnZWQgYnksIG9yIG9uIGJlaGFsZiBvZiwgTExWTSBmb3IgdGhlIHB1cnBvc2Ugb2YgZGlzY3Vzc2luZyBhbmQgaW1wcm92aW5nCit0aGUgV29yaywgYnV0IGV4Y2x1ZGluZyBjb21tdW5pY2F0aW9uIHRoYXQgaXMgY29uc3BpY3VvdXNseSBtYXJrZWQgb3RoZXJ3aXNlLgorCisxLiBHcmFudCBvZiBDb3B5cmlnaHQgTGljZW5zZS4gU3ViamVjdCB0byB0aGUgdGVybXMgYW5kIGNvbmRpdGlvbnMgb2YgdGhpcworICAgQWdyZWVtZW50LCBBUk0gaGVyZWJ5IGdyYW50cyB0byB5b3UgYW5kIHRvIHJlY2lwaWVudHMgb2YgdGhlIFNvZnR3YXJlCisgICBkaXN0cmlidXRlZCBieSBMTFZNIGEgcGVycGV0dWFsLCB3b3JsZHdpZGUsIG5vbi1leGNsdXNpdmUsIG5vLWNoYXJnZSwKKyAgIHJveWFsdHktZnJlZSwgaXJyZXZvY2FibGUgY29weXJpZ2h0IGxpY2Vuc2UgdG8gcmVwcm9kdWNlLCBwcmVwYXJlIGRlcml2YXRpdmUKKyAgIHdvcmtzIG9mLCBwdWJsaWNseSBkaXNwbGF5LCBwdWJsaWNseSBwZXJmb3JtLCBzdWJsaWNlbnNlLCBhbmQgZGlzdHJpYnV0ZSB0aGUKKyAgIFNvZnR3YXJlIGFuZCBzdWNoIGRlcml2YXRpdmUgd29ya3MuCisKKzIuIEdyYW50IG9mIFBhdGVudCBMaWNlbnNlLiBTdWJqZWN0IHRvIHRoZSB0ZXJtcyBhbmQgY29uZGl0aW9ucyBvZiB0aGlzCisgICBBZ3JlZW1lbnQsIEFSTSBoZXJlYnkgZ3JhbnRzIHlvdSBhbmQgdG8gcmVjaXBpZW50cyBvZiB0aGUgU29mdHdhcmUKKyAgIGRpc3RyaWJ1dGVkIGJ5IExMVk0gYSBwZXJwZXR1YWwsIHdvcmxkd2lkZSwgbm9uLWV4Y2x1c2l2ZSwgbm8tY2hhcmdlLAorICAgcm95YWx0eS1mcmVlLCBpcnJldm9jYWJsZSAoZXhjZXB0IGFzIHN0YXRlZCBpbiB0aGlzIHNlY3Rpb24pIHBhdGVudCBsaWNlbnNlCisgICB0byBtYWtlLCBoYXZlIG1hZGUsIHVzZSwgb2ZmZXIgdG8gc2VsbCwgc2VsbCwgaW1wb3J0LCBhbmQgb3RoZXJ3aXNlIHRyYW5zZmVyCisgICB0aGUgV29yaywgd2hlcmUgc3VjaCBsaWNlbnNlIGFwcGxpZXMgb25seSB0byB0aG9zZSBwYXRlbnQgY2xhaW1zIGxpY2Vuc2FibGUKKyAgIGJ5IEFSTSB0aGF0IGFyZSBuZWNlc3NhcmlseSBpbmZyaW5nZWQgYnkgQVJNJ3MgU29mdHdhcmUgYWxvbmUgb3IgYnkKKyAgIGNvbWJpbmF0aW9uIG9mIHRoZSBTb2Z0d2FyZSB3aXRoIHRoZSBXb3JrIHRvIHdoaWNoIHN1Y2ggU29mdHdhcmUgd2FzCisgICBzdWJtaXR0ZWQuIElmIGFueSBlbnRpdHkgaW5zdGl0dXRlcyBwYXRlbnQgbGl0aWdhdGlvbiBhZ2FpbnN0IEFSTSBvciBhbnkKKyAgIG90aGVyIGVudGl0eSAoaW5jbHVkaW5nIGEgY3Jvc3MtY2xhaW0gb3IgY291bnRlcmNsYWltIGluIGEgbGF3c3VpdCkgYWxsZWdpbmcKKyAgIHRoYXQgQVJNJ3MgU29mdHdhcmUsIG9yIHRoZSBXb3JrIHRvIHdoaWNoIEFSTSBoYXMgY29udHJpYnV0ZWQgY29uc3RpdHV0ZXMKKyAgIGRpcmVjdCBvciBjb250cmlidXRvcnkgcGF0ZW50IGluZnJpbmdlbWVudCwgdGhlbiBhbnkgcGF0ZW50IGxpY2Vuc2VzIGdyYW50ZWQKKyAgIHRvIHRoYXQgZW50aXR5IHVuZGVyIHRoaXMgQWdyZWVtZW50IGZvciB0aGUgU29mdHdhcmUgb3IgV29yayBzaGFsbCB0ZXJtaW5hdGUKKyAgIGFzIG9mIHRoZSBkYXRlIHN1Y2ggbGl0aWdhdGlvbiBpcyBmaWxlZC4KKworVW5sZXNzIHJlcXVpcmVkIGJ5IGFwcGxpY2FibGUgbGF3IG9yIGFncmVlZCB0byBpbiB3cml0aW5nLCB0aGUgc29mdHdhcmUgaXMKK3Byb3ZpZGVkIG9uIGFuICJBUyBJUyIgQkFTSVMsIFdJVEhPVVQgV0FSUkFOVElFUyBPUiBDT05ESVRJT05TIE9GIEFOWSBLSU5ELAorZWl0aGVyIGV4cHJlc3Mgb3IgaW1wbGllZCwgaW5jbHVkaW5nLCB3aXRob3V0IGxpbWl0YXRpb24sIGFueSB3YXJyYW50aWVzIG9yCitjb25kaXRpb25zIG9mIFRJVExFLCBOT04tSU5GUklOR0VNRU5ULCBNRVJDSEFOVEFCSUxJVFksIG9yIEZJVE5FU1MgRk9SIEEKK1BBUlRJQ1VMQVIgUFVSUE9TRS4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9NYWtlZmlsZSBiL3JjMy9vZmZsb2FkL01ha2VmaWxlCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjc1ZTM3NDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9NYWtlZmlsZQpAQCAtMCwwICsxLDIyNCBAQAorIw0KKyMjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8NCisjLy8NCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQ0KKyMvLw0KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuDQorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLg0KKyMvLw0KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLw0KKyMNCisNCisjIE1BS0VGSUxFIFBBUkFNRVRFUlMNCisjDQorIyByb290X2RpciAtIHBhdGggdG8gcm9vdCBkaXJlY3Rvcnkgb2YgbGlib2ZmbG9hZA0KKyMgYnVpbGRfZGlyIC0gcGF0aCB0byBidWlsZCBkaXJlY3RvcnkNCisjIG1wc3NfZGlyIC0gcGF0aCB0byByb290IGRpcmVjdG9yeSBvZiBtcHNzDQorIyBtcHNzX3ZlcnNpb24gLSB2ZXJzaW9uIG9mIHRoZSBtcHNzIChlLmcuLCB2ZXJzaW9uICIzLjMueCIgd291bGQgYmUgIjMzIikNCisjIGxpYmlvbXBfaG9zdF9kaXIgLSBwYXRoIHRvIGhvc3QgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgaXMgaWNjKQ0KKyMgbGliaW9tcF90YXJnZXRfZGlyIC0gcGF0aCB0byB0YXJnZXQgbGliaW9tcCBkaXJlY3RvcnkgKHVubmVjZXNhcnJ5IGlmIGNvbXBpbGVyX3RhcmdldCBpcyBpY2MpDQorIyBvbXBfaGVhZGVyX2RpciAtIHBhdGggdG8gb21wLmggKHVubmVjZXNzYXJ5IGlmIGNvbXBpbGVyX2hvc3QgYW5kIGNvbXBpbGVyX3RhcmdldCBhcmUgaWNjKQ0KKyMgb3NfaG9zdCAtIGhvc3Qgb3BlcmF0aW5nIHN5c3RlbQ0KKyMgb3NfdGFyZ2V0IC0gdGFyZ2V0IG9wZXJhdGluZyBzeXN0ZW0NCisjIGNvbXBpbGVyX2hvc3QgLSBob3N0IGNvbXBpbGVyDQorIyBjb21waWxlcl90YXJnZXQgLSB0YXJnZXQgY29tcGlsZXINCisjIG9wdGlvbnNfaG9zdCAtIGFkZGl0aW9uYWwgb3B0aW9ucyBmb3IgaG9zdCBjb21waWxlcg0KKyMgb3B0aW9uc190YXJnZXQgLSBhZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRhcmdldCBjb21waWxlcg0KKyMNCisNCisjIERpcmVjdG9yaWVzDQorcm9vdF9kaXI/PS4NCitidWlsZF9kaXI/PSQocm9vdF9kaXIpL2J1aWxkDQorYnVpbGRfaG9zdF9kaXI9JChidWlsZF9kaXIpL2hvc3QNCitidWlsZF90YXJnZXRfZGlyPSQoYnVpbGRfZGlyKS90YXJnZXQNCitvYmpfaG9zdF9kaXI9JChidWlsZF9kaXIpL29ial9ob3N0DQorb2JqX3RhcmdldF9kaXI9JChidWlsZF9kaXIpL29ial90YXJnZXQNCitzb3VyY2VfZGlyPSQocm9vdF9kaXIpL3NyYw0KK2ltcG9ydGVkX2Rpcj0kKHNvdXJjZV9kaXIpL2ltcG9ydGVkDQorDQorIyBPUw0KK29zX2hvc3Q/PWxpbnV4DQorb3NfdGFyZ2V0Pz1saW51eA0KK2lmbmVxICgkKG9zX2hvc3QpXyQob3NfdGFyZ2V0KSwgbGludXhfbGludXgpDQorICAkKGVycm9yICJPbmx5IGxpbnV4IGlzIHN1cHBvcnRlZCIpDQorZW5kaWYNCisNCisjIENvbXBpbGVycw0KK2NvbXBpbGVyX2hvc3Q/PWdjYw0KK2NvbXBpbGVyX3RhcmdldD89Z2NjDQorDQorIyBNUFNTDQorbXBzc192ZXJzaW9uPz0zMA0KK21wc3NfZGlyPz0vDQorbXBzc19wcmVzZW50PSQoc2hlbGwgaWYgdGVzdCAtZCAkKG1wc3NfZGlyKTsgdGhlbiBlY2hvIE9LOyBlbHNlIGVjaG8gS087IGZpKQ0KK2lmbmVxICgkKG1wc3NfcHJlc2VudCksIE9LKQ0KKyAgJChlcnJvciAiQ2Fubm90IGZpbmQgTVBTUyBkaXJlY3RvcnkgJChtcHNzX2RpcikiKQ0KK2VuZGlmDQorDQoraWZlcSAoJChzaGVsbCB0ZXN0ICQobXBzc192ZXJzaW9uKSAtZ3QgMzM7IGVjaG8gJCQ/KSwgMCkNCisgIGNvaV9kaXI9JChtcHNzX2Rpcikvc3lzcm9vdHMvazFvbS1tcHNzLWxpbnV4L3Vzcg0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlL2ludGVsLWNvaQ0KKyAgY29pX2xpYl9ob3N0PSQobXBzc19kaXIpL2xpYjY0DQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2xpYjY0DQorZWxzZQ0KKyAgY29pX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL2NvaQ0KKyAgY29pX2luY2x1ZGU9JChjb2lfZGlyKS9pbmNsdWRlDQorICBjb2lfbGliX2hvc3Q9JChjb2lfZGlyKS9ob3N0LWxpbnV4LXJlbGVhc2UvbGliDQorICBjb2lfbGliX2RldmljZT0kKGNvaV9kaXIpL2RldmljZS1saW51eC1yZWxlYXNlL2xpYg0KK2VuZGlmDQorbXlvX2Rpcj0kKG1wc3NfZGlyKS9vcHQvaW50ZWwvbWljL215bw0KKw0KKyMgU291cmNlcw0KK3NyY19saWJvZmZsb2FkX2NvbW1vbj1kdl91dGlsLmNwcCBsaWJvZmZsb2FkX2Vycm9yLmMgbGlib2ZmbG9hZF9tc2cuYyBvZmZsb2FkX2NvbW1vbi5jcHAgb2ZmbG9hZF90YWJsZS5jcHAgb2ZmbG9hZF90cmFjZS5jcHAgb2ZmbG9hZF91dGlsLmNwcA0KKw0KK3NyY19saWJvZmZsb2FkX2hvc3Q9JChzcmNfbGlib2ZmbG9hZF9jb21tb24pIGNlYW5fdXRpbC5jcHAgY29pL2NvaV9jbGllbnQuY3BwIGNvbXBpbGVyX2lmX2hvc3QuY3BwIG9mZmxvYWRfZW5naW5lLmNwcCBvZmZsb2FkX2Vudi5jcHAgb2ZmbG9hZF9ob3N0LmNwcCBvZmZsb2FkX29tcF9ob3N0LmNwcCBvZmZsb2FkX3RpbWVyX2hvc3QuY3BwIG9mZmxvYWRfb3JzbC5jcHAgb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYyBvZmZsb2FkX215b19ob3N0LmNwcA0KK3NyY19saWJvZmZsb2FkX2hvc3Q6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfaG9zdCksJChzb3VyY2VfZGlyKS8kKGZpbGUpKQ0KKw0KK3NyY19saWJvZmZsb2FkX3RhcmdldD0kKHNyY19saWJvZmZsb2FkX2NvbW1vbikgY29pL2NvaV9zZXJ2ZXIuY3BwIGNvbXBpbGVyX2lmX3RhcmdldC5jcHAgb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcCBvZmZsb2FkX3RhcmdldC5jcHAgb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIG9mZmxvYWRfbXlvX3RhcmdldC5jcHANCitzcmNfbGlib2ZmbG9hZF90YXJnZXQ6PSQoZm9yZWFjaCBmaWxlLCQoc3JjX2xpYm9mZmxvYWRfdGFyZ2V0KSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQorc3JjX29mbGQ9b2ZsZGJlZ2luLmNwcCBvZmxkZW5kLmNwcA0KK3NyY19vZmxkOj0kKGZvcmVhY2ggZmlsZSwkKHNyY19vZmxkKSwkKHNvdXJjZV9kaXIpLyQoZmlsZSkpDQorDQoraGVhZGVycz0kKHdpbGRjYXJkICQoc291cmNlX2RpcikvKi5oKSAkKHdpbGRjYXJkICQoc291cmNlX2RpcikvY29pLyouaCkgJCh3aWxkY2FyZCAkKHNvdXJjZV9kaXIpL29yc2wtbGl0ZS9pbmNsdWRlLyouaCkNCitpZm5lcSAoJChvbXBfaGVhZGVyX2RpciksICkNCisgIGhlYWRlcnMrPSQoaW1wb3J0ZWRfZGlyKS9vbXAuaA0KK2VuZGlmDQorDQorIyBPYmplY3RzDQorb2JqX2xpYm9mZmxvYWRfaG9zdD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX2hvc3QpKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX2hvc3Q6PSQob2JqX2xpYm9mZmxvYWRfaG9zdDouYz0ubykNCitvYmpfbGlib2ZmbG9hZF9ob3N0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX2hvc3QpLCQob2JqX2hvc3RfZGlyKS8kKGZpbGUpKQ0KKw0KK29ial9saWJvZmZsb2FkX3RhcmdldD0kKG5vdGRpciAkKHNyY19saWJvZmZsb2FkX3RhcmdldCkpDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKG9ial9saWJvZmZsb2FkX3RhcmdldDouY3BwPS5vKQ0KK29ial9saWJvZmZsb2FkX3RhcmdldDo9JChvYmpfbGlib2ZmbG9hZF90YXJnZXQ6LmM9Lm8pDQorb2JqX2xpYm9mZmxvYWRfdGFyZ2V0Oj0kKGZvcmVhY2ggZmlsZSwkKG9ial9saWJvZmZsb2FkX3RhcmdldCksJChvYmpfdGFyZ2V0X2RpcikvJChmaWxlKSkNCisNCitvYmpfb2ZsZD0kKG5vdGRpciAkKHNyY19vZmxkKSkNCitvYmpfb2ZsZDo9JChvYmpfb2ZsZDouY3BwPS5vKQ0KK29ial9vZmxkX2hvc3Q9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF9ob3N0X2RpcikvJChmaWxlKSkNCitvYmpfb2ZsZF90YXJnZXQ9JChmb3JlYWNoIGZpbGUsJChvYmpfb2ZsZCksJChidWlsZF90YXJnZXRfZGlyKS8kKGZpbGUpKQ0KKw0KKyMgT3B0aW9ucw0KK29wdHNfY29tbW9uPS1PMiAtdyAtZnBpYyAtYyAtRENPSV9MSUJSQVJZX1ZFUlNJT049MiAtRE1ZT19TVVBQT1JUIC1ET0ZGTE9BRF9ERUJVRz0xIC1EU0VQX1NVUFBPUlQgLURUSU1JTkdfU1VQUE9SVCAtSSQoY29pX2luY2x1ZGUpIC1JJChteW9fZGlyKS9pbmNsdWRlIC1JJChzb3VyY2VfZGlyKQ0KK2lmbmVxICgkKG9tcF9oZWFkZXJfZGlyKSwgKQ0KKyAgb3B0c19jb21tb24rPS1JJChpbXBvcnRlZF9kaXIpDQorZW5kaWYNCisNCitvcHRzX2xpYm9mZmxvYWQ9LXNoYXJlZCAtV2wsLXNvbmFtZSxsaWJvZmZsb2FkLnNvLjUgLWxkbCAtbHN0ZGMrKyAtbGlvbXA1DQorDQorb3B0c19saWJvZmZsb2FkX2hvc3Q9JChvcHRzX2xpYm9mZmxvYWQpIC1MJChjb2lfbGliX2hvc3QpIC1sY29pX2hvc3QgLUwkKG15b19kaXIpL2xpYiAtbG15by1jbGllbnQNCitpZm5lcSAoJChsaWJpb21wX2hvc3RfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX2hvc3QrPS1MJChsaWJpb21wX2hvc3RfZGlyKQ0KK2VuZGlmDQorDQorb3B0c19saWJvZmZsb2FkX3RhcmdldD0kKG9wdHNfbGlib2ZmbG9hZCkgLUwkKGNvaV9saWJfZGV2aWNlKSAtbGNvaV9kZXZpY2UgLUwkKG15b19kaXIpL2xpYiAtbG15by1zZXJ2aWNlDQoraWZuZXEgKCQobGliaW9tcF90YXJnZXRfZGlyKSwgKQ0KKyAgb3B0c19saWJvZmZsb2FkX3RhcmdldCs9LUwkKGxpYmlvbXBfdGFyZ2V0X2RpcikNCitlbmRpZg0KKw0KK29wdGlvbnNfaG9zdD89DQorb3B0c19ob3N0PSQob3B0aW9uc19ob3N0KSAtREhPU1RfTElCUkFSWT0xIC1ETVBTU19WRVJTSU9OPSQobXBzc192ZXJzaW9uKQ0KK2lmZXEgKCQob3NfaG9zdCksIGxpbnV4KQ0KKyAgb3B0c19ob3N0Kz0tRExJTlVYDQorZW5kaWYNCisNCitvcHRpb25zX3RhcmdldD89DQorb3B0c190YXJnZXQ9JChvcHRpb25zX3RhcmdldCkgLURIT1NUX0xJQlJBUlk9MA0KK2lmZXEgKCQob3NfdGFyZ2V0KSwgbGludXgpDQorICBvcHRzX3RhcmdldCs9LURMSU5VWA0KK2VuZGlmDQoraWZlcSAoJChjb21waWxlcl90YXJnZXQpLCBpY2MpDQorICBvcHRzX3RhcmdldCs9LW1taWMNCitlbmRpZg0KKw0KKyMgTWFrZSB0YXJnZXRzDQorLlBIT05ZOiBhbGwgY2xlYW4gaW5mbw0KKw0KK2FsbDogaW5mbyAkKGJ1aWxkX2hvc3RfZGlyKS9saWJvZmZsb2FkLnNvICQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbyAkKG9ial9vZmxkX2hvc3QpICQob2JqX29mbGRfdGFyZ2V0KQ0KKw0KKw0KKyQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc286ICQoYnVpbGRfaG9zdF9kaXIpL2xpYm9mZmxvYWQuc28uNSB8ICQoYnVpbGRfaG9zdF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF9ob3N0X2RpcikvbGlib2ZmbG9hZC5zby41OiAkKG9ial9saWJvZmZsb2FkX2hvc3QpIHwgJChidWlsZF9ob3N0X2RpcikNCisJJChjb21waWxlcl9ob3N0KSAkKG9wdHNfbGlib2ZmbG9hZF9ob3N0KSAkKG9wdHNfaG9zdCkgJF4gLW8gJEANCisNCiskKG9ial9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS8lLmNwcCAkKGhlYWRlcnMpIHwgJChvYmpfaG9zdF9kaXIpDQorCSQoY29tcGlsZXJfaG9zdCkgJChvcHRzX2NvbW1vbikgJChvcHRzX2hvc3QpICQ8IC1vICRADQorDQorJChvYmpfaG9zdF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQob2JqX2hvc3RfZGlyKS8lLm86ICQoc291cmNlX2Rpcikvb3JzbC1saXRlL2xpYi8lLmMgJChoZWFkZXJzKSB8ICQob2JqX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvbGlib2ZmbG9hZC5zbzogJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjUgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCWxuIC1mICQ8ICRADQorDQorJChidWlsZF90YXJnZXRfZGlyKS9saWJvZmZsb2FkLnNvLjU6ICQob2JqX2xpYm9mZmxvYWRfdGFyZ2V0KSB8ICQoYnVpbGRfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19saWJvZmZsb2FkX3RhcmdldCkgJChvcHRzX3RhcmdldCkgJF4gLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jICQoaGVhZGVycykgfCAkKG9ial90YXJnZXRfZGlyKQ0KKwkkKGNvbXBpbGVyX3RhcmdldCkgJChvcHRzX2NvbW1vbikgJChvcHRzX3RhcmdldCkgJDwgLW8gJEANCisNCiskKG9ial90YXJnZXRfZGlyKS8lLm86ICQoc291cmNlX2RpcikvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9jb2kvJS5jcHAgJChoZWFkZXJzKSB8ICQob2JqX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKyQob2JqX3RhcmdldF9kaXIpLyUubzogJChzb3VyY2VfZGlyKS9vcnNsLWxpdGUvbGliLyUuYyAkKGhlYWRlcnMpIHwgJChvYmpfdGFyZ2V0X2RpcikNCisJJChjb21waWxlcl90YXJnZXQpICQob3B0c19jb21tb24pICQob3B0c190YXJnZXQpICQ8IC1vICRADQorDQorDQorJChidWlsZF9ob3N0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX2hvc3RfZGlyKQ0KKwkkKGNvbXBpbGVyX2hvc3QpICQob3B0c19jb21tb24pICQob3B0c19ob3N0KSAkPCAtbyAkQA0KKw0KKyQoYnVpbGRfdGFyZ2V0X2RpcikvJS5vOiAkKHNvdXJjZV9kaXIpLyUuY3BwICQoaGVhZGVycykgfCAkKGJ1aWxkX3RhcmdldF9kaXIpDQorCSQoY29tcGlsZXJfdGFyZ2V0KSAkKG9wdHNfY29tbW9uKSAkKG9wdHNfdGFyZ2V0KSAkPCAtbyAkQA0KKw0KKw0KKyQoaW1wb3J0ZWRfZGlyKS9vbXAuaDogJChvbXBfaGVhZGVyX2Rpcikvb21wLmggfCAkKGltcG9ydGVkX2RpcikNCisJY3AgJDwgJEANCisNCisNCiskKGJ1aWxkX2hvc3RfZGlyKSAkKGJ1aWxkX3RhcmdldF9kaXIpICQob2JqX2hvc3RfZGlyKSAkKG9ial90YXJnZXRfZGlyKTogfCAkKGJ1aWxkX2RpcikNCisJJChzaGVsbCBta2RpciAtcCAkQCA+L2Rldi9udWxsIDI+L2Rldi9udWxsKQ0KKwlAZWNobyAiQ3JlYXRlZCAkQCBkaXJlY3RvcnkiDQorDQorJChidWlsZF9kaXIpOg0KKwkkKHNoZWxsIG1rZGlyIC1wICRAID4vZGV2L251bGwgMj4vZGV2L251bGwpDQorCUBlY2hvICJDcmVhdGVkICRAIGRpcmVjdG9yeSINCisNCiskKGltcG9ydGVkX2Rpcik6DQorCSQoc2hlbGwgbWtkaXIgLXAgJEAgPi9kZXYvbnVsbCAyPi9kZXYvbnVsbCkNCisJQGVjaG8gIkNyZWF0ZWQgJEAgZGlyZWN0b3J5Ig0KKw0KKw0KK2NsZWFuOg0KKwkkKHNoZWxsIHJtIC1yZiAkKGJ1aWxkX2RpcikpDQorCUBlY2hvICJSZW1vdmUgJChidWlsZF9kaXIpIGRpcmVjdG9yeSINCisNCisNCitpbmZvOg0KKwlAZWNobyAicm9vdF9kaXIgPSAkKHJvb3RfZGlyKSINCisJQGVjaG8gImJ1aWxkX2RpciA9ICQoYnVpbGRfZGlyKSINCisJQGVjaG8gIm1wc3NfZGlyID0gJChtcHNzX2RpcikiDQorCUBlY2hvICJtcHNzX3ZlcnNpb24gPSAkKG1wc3NfdmVyc2lvbikiDQorCUBlY2hvICJsaWJpb21wX2hvc3RfZGlyID0gJChsaWJpb21wX2hvc3RfZGlyKSINCisJQGVjaG8gImxpYmlvbXBfdGFyZ2V0X2RpciA9ICQobGliaW9tcF90YXJnZXRfZGlyKSINCisJQGVjaG8gIm9tcF9oZWFkZXJfZGlyID0gJChvbXBfaGVhZGVyX2RpcikiDQorCUBlY2hvICJvc19ob3N0ID0gJChvc19ob3N0KSINCisJQGVjaG8gIm9zX3RhcmdldCA9ICQob3NfdGFyZ2V0KSINCisJQGVjaG8gImNvbXBpbGVyX2hvc3QgPSAkKGNvbXBpbGVyX2hvc3QpIg0KKwlAZWNobyAiY29tcGlsZXJfdGFyZ2V0ID0gJChjb21waWxlcl90YXJnZXQpIg0KKwlAZWNobyAib3B0aW9uc19ob3N0ID0gJChvcHRpb25zX2hvc3QpIg0KKwlAZWNobyAib3B0aW9uc190YXJnZXQgPSAkKG9wdGlvbnNfdGFyZ2V0KSINCisNCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9SRUFETUUudHh0IGIvcmMzL29mZmxvYWQvUkVBRE1FLnR4dApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lYjlmYjFkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvUkVBRE1FLnR4dApAQCAtMCwwICsxLDEyOSBAQAorDQorCSAgICAgICBSRUFETUUgZm9yIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorCSAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09DQorDQorSG93IHRvIEJ1aWxkIERvY3VtZW50YXRpb24NCis9PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBtYWluIGRvY3VtZW50YXRpb24gaXMgaW4gRG94eWdlbiogZm9ybWF0LCBhbmQgdGhpcyBkaXN0cmlidXRpb24NCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4NCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoNCisNCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnDQorDQoraW4gdGhpcyBkaXJlY3RvcnkuDQorDQorVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQNCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQ0KK2luZGV4Lmh0bWwgZmlsZSB0aGVyZS4NCisNCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tDQord3d3LmRveHlnZW4ub3JnLg0KKw0KKw0KK1NvZnR3YXJlIFJlcXVpcmVtZW50cw0KKz09PT09PT09PT09PT09PT09PT09PQ0KKw0KK0ludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IHJlcXVpcmVzIGFkZGl0aW9uYWwgc29mdHdhcmU6DQorDQorMSkgSW50ZWwoUikgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkuICBZb3UgY2FuIGVpdGhlciBkb3dubG9hZCB0aGUgc291cmNlDQorY29kZSBmb3IgdGhhdCAoZnJvbSBvcGVubXBydGwub3JnIG9yIG9wZW5tcC5sbHZtLm9yZykgb3Igc2ltcGx5IHVzZSB0aGUNCitjb21waWxlZCB2ZXJzaW9uIGRpc3RyaWJ1dGVkIHdpdGggdGhlIEludGVsIGNvbXBpbGVycy4NCisyKSBJbnRlbChSKSBDT0kgUnVudGltZSBMaWJyYXJ5IGFuZCBJbnRlbChSKSBNWU8gUnVudGltZSBMaWJyYXJ5LiAgVGhlc2UNCitsaWJyYXJpZXMgYXJlIHBhcnQgb2YgSW50ZWwoUikgTWFueWNvcmUgUGxhdGZvcm0gU29mdHdhcmUgU3RhY2sgKE1QU1MpLiAgWW91DQorY2FuIGRvd25sb2FkIE1QU1Mgc291cmNlIGNvZGUgb3IgYmluYXJpZXMgZnJvbQ0KK3NvZnR3YXJlLmludGVsLmNvbS9lbi11cy9hcnRpY2xlcy9pbnRlbC1tYW55Y29yZS1wbGF0Zm9ybS1zb2Z0d2FyZS1zdGFjay1tcHNzLg0KK0JpbmFyaWVzIGluY2x1ZGUgaG9zdCBsaWJyYXJpZXMgZm9yIEludGVsKFIpIDY0IEFyY2hpdGVjdHVyZSBhbmQgdGFyZ2V0DQorbGlicmFyaWVzIGZvciBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuDQorDQorQWxzbyB5b3Ugd2lsbCByZXF1aXJlIGFsbCBvZiB0aGUgbGlicmFyaWVzIHRoYXQgZW5hYmxlIHRoZSB0YXJnZXQgY29kZSB0byBydW4NCitvbiBkZXZpY2UuICBJZiB5b3UgdGFyZ2V0IHRoZSBJbnRlbChSKSBYZW9uIFBoaSAoVE0pIGNvcHJvY2Vzc29yLCB0aGVzZQ0KK2xpYnJhcmllcyBjYW4gYmUgdGFrZW4gZnJvbSBNUFNTIHRvby4NCisNCisNCitIb3cgdG8gQnVpbGQgdGhlIEludGVsKFIpIE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5DQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1RoZSBNYWtlZmlsZSBhdCB0aGUgdG9wLWxldmVsIHdpbGwgYXR0ZW1wdCB0byBkZXRlY3Qgd2hhdCBpdCBuZWVkcyB0bw0KK2J1aWxkIHRoZSBJbnRlbChSKSBPZmZsb2FkIFJ1bnRpbWUgTGlicmFyeS4gIFRvIHNlZSB0aGUgZGVmYXVsdCBzZXR0aW5ncywNCit0eXBlOg0KKw0KK21ha2UgaW5mbw0KKw0KK1lvdSBjYW4gY2hhbmdlIHRoZSBNYWtlZmlsZSdzIGJlaGF2aW9yIHdpdGggdGhlIGZvbGxvd2luZyBvcHRpb25zOg0KKw0KK3Jvb3RfZGlyOgkgICAgICBUaGUgcGF0aCB0byB0aGUgdG9wLWxldmVsIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZQ0KKwkJICAgICAgdG9wLWxldmVsIE1ha2VmaWxlLiAgQnkgZGVmYXVsdCwgdGhpcyB3aWxsIHRha2Ugb24gdGhlDQorCQkgICAgICB2YWx1ZSBvZiB0aGUgY3VycmVudCB3b3JraW5nIGRpcmVjdG9yeS4NCisNCitidWlsZF9kaXI6CSAgICAgIFRoZSBwYXRoIHRvIHRoZSBidWlsZCBkaXJlY3RvcnkuICBCeSBkZWZhdWx0LCB0aGlzIHdpbGwNCisJCSAgICAgIHRha2Ugb24gdmFsdWUgW3Jvb3RfZGlyXS9idWlsZC4NCisNCittcHNzX2RpcjoJICAgICAgVGhlIHBhdGggdG8gdGhlIEludGVsKFIpIE1hbnljb3JlIFBsYXRmb3JtIFNvZnR3YXJlDQorCQkgICAgICBTdGFjayBpbnN0YWxsIGRpcmVjdG9yeS4gIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB0YWtlIG9uDQorCQkgICAgICB0aGUgdmFsdWUgb2Ygb3BlcmF0aW5nIHN5c3RlbSdzIHJvb3QgZGlyZWN0b3J5Lg0KKw0KK2xpYmlvbXBfaG9zdF9kaXI6ICAgICBUaGUgcGF0aCB0byB0aGUgaG9zdCBJbnRlbChSKSBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeS4NCisJCSAgICAgIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIGhvc3QgY29tcGlsZXIgaXMgb3RoZXINCisJCSAgICAgIHRoYW4gaWNjLg0KKw0KK2xpYmlvbXBfdGFyZ2V0X2RpcjogICBUaGUgcGF0aCB0byB0aGUgdGFyZ2V0IEludGVsKFIpIE9wZW5NUCogUnVudGltZQ0KKwkJICAgICAgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIHdoZW4gdGhlIHRhcmdldA0KKwkJICAgICAgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb21wX2hlYWRlcl9kaXI6ICAgICAgIFRoZSBwYXRoIHRvIHRoZSBoZWFkZXIgZmlsZSA8b21wLmg+IG9mIEludGVsKFIpIE9wZW5NUCoNCisJCSAgICAgIFJ1bnRpbWUgTGlicmFyeS4gIFRoaXMgb3B0aW9uIGlzIHJlcXVpcmVkIGlmIGVpdGhlciBob3N0DQorCQkgICAgICBvciB0YXJnZXQgY29tcGlsZXIgaXMgb3RoZXIgdGhhbiBpY2MuDQorDQorb3NfaG9zdDoJICAgICAgT3BlcmF0aW5nIHN5c3RlbSBvbiBob3N0LiAgQ3VycmVudGx5IHN1cHBvcnRzIG9ubHkNCisJCSAgICAgICJsaW51eCIgd2hpY2ggaXMgc2V0IGJ5IGRlZmF1bHQuDQorDQorb3NfdGFyZ2V0OgkgICAgICBPcGVyYXRpbmcgc3lzdGVtIG9uIHRhcmdldCBkZXZpY2UuICBDdXJyZW50bHkgc3VwcG9ydHMNCisJCSAgICAgIG9ubHkgImxpbnV4IiB3aGljaCBpcyBzZXQgYnkgZGVmYXVsdC4NCisNCitjb21waWxlcl9ob3N0OgkgICAgICBXaGljaCBjb21waWxlciB0byB1c2UgZm9yIHRoZSBidWlsZCBvZiB0aGUgaG9zdCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorY29tcGlsZXJfaG9zdDoJICAgICAgV2hpY2ggY29tcGlsZXIgdG8gdXNlIGZvciB0aGUgYnVpbGQgb2YgdGhlIHRhcmdldCBwYXJ0Lg0KKwkJICAgICAgRGVmYXVsdHMgdG8gImdjYyIqLiAgQWxzbyBzdXBwb3J0cyAiaWNjIiBhbmQgImNsYW5nIiouDQorCQkgICAgICBZb3Ugc2hvdWxkIHByb3ZpZGUgdGhlIGZ1bGwgcGF0aCB0byB0aGUgY29tcGlsZXIgb3IgaXQNCisJCSAgICAgIHNob3VsZCBiZSBpbiB0aGUgdXNlcidzIHBhdGguDQorDQorb3B0aW9uc19ob3N0OgkgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSBob3N0IGNvbXBpbGVyLg0KKw0KK29wdGlvbnNfdGFyZ2V0OiAgICAgICBBZGRpdGlvbmFsIG9wdGlvbnMgZm9yIHRoZSB0YXJnZXQgY29tcGlsZXIuDQorDQorVG8gdXNlIGFueSBvZiB0aGUgb3B0aW9ucyBhYm92ZSwgc2ltcGxlIGFkZCA8b3B0aW9uX25hbWU+PTx2YWx1ZT4uICBGb3INCitleGFtcGxlLCBpZiB5b3Ugd2FudCB0byBidWlsZCB3aXRoIGljYyBpbnN0ZWFkIG9mIGdjYywgdHlwZToNCisNCittYWtlIGNvbXBpbGVyX2hvc3Q9aWNjIGNvbXBpbGVyX3RhcmdldD1pY2MNCisNCisNCitTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQ0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJbnRlbChSKSA2NCwgYW5kIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZA0KK0NvcmUgQXJjaGl0ZWN0dXJlDQorDQorCSAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKwkgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgIGNsYW5nICAgIHwNCistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfA0KK3wgTGludXgqIE9TICAgfCAgICAgIFllcyAgICAgIHwgICAgIFllcygxKSAgfCAgICAgWWVzKDEpICB8DQorfCBPUyBYKiAgICAgICB8ICAgICAgIE5vICAgICAgfCAgICAgIE5vICAgICB8ICAgICAgTm8gICAgIHwNCit8IFdpbmRvd3MqIE9TIHwgICAgICAgTm8gICAgICB8ICAgICAgTm8gICAgIHwgICAgICBObyAgICAgfA0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorKDEpIExpYm9mZmxvYWQgcmVxdWlyZXMgX3JkdHNjIGludHJpbnNpYywgd2hpY2ggbWF5IGJlIHVuc3VwcG9ydGVkIGJ5IHNvbWUNCisgICAgdmVyc2lvbnMgb2YgY29tcGlsZXIuICBJbiB0aGlzIGNhc2UgeW91IG5lZWQgdG8gaW5jbHVkZSBzcmMvcmR0c2MuaA0KKyAgICBtYW51YWxseSBieSB1c2luZyBNYWtlZmlsZSBvcHRpb25zIG9wdGlvbnNfaG9zdCBhbmQgb3B0aW9uc190YXJnZXQ6DQorDQorICAgIG1ha2Ugb3B0aW9uc19ob3N0PSItaW5jbHVkZSBzcmMvcmR0c2MuaCIgb3B0aW9uc190YXJnZXQ9Ii1pbmNsdWRlIHNyYy9yZHRzYy5oIg0KKw0KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorTm90aWNlcw0KKz09PT09PT0NCisNCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLg0KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmIGIvcmMzL29mZmxvYWQvZG9jL1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxNzZmMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL2RvYy9SZWZlcmVuY2UucGRmCkJpbmFyeSBmaWxlcyBkaWZmZXIKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL2RvYy9kb3h5Z2VuL2NvbmZpZyBiL3JjMy9vZmZsb2FkL2RvYy9kb3h5Z2VuL2NvbmZpZwpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kNDViNjk2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvZG9jL2RveHlnZW4vY29uZmlnCkBAIC0wLDAgKzEsMjMyOCBAQAorIyBEb3h5ZmlsZSAxLjguNgorCisjIFRoaXMgZmlsZSBkZXNjcmliZXMgdGhlIHNldHRpbmdzIHRvIGJlIHVzZWQgYnkgdGhlIGRvY3VtZW50YXRpb24gc3lzdGVtCisjIGRveHlnZW4gKHd3dy5kb3h5Z2VuLm9yZykgZm9yIGEgcHJvamVjdC4KKyMKKyMgQWxsIHRleHQgYWZ0ZXIgYSBkb3VibGUgaGFzaCAoIyMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCBpcyBwbGFjZWQgaW4KKyMgZnJvbnQgb2YgdGhlIFRBRyBpdCBpcyBwcmVjZWRpbmcuCisjCisjIEFsbCB0ZXh0IGFmdGVyIGEgc2luZ2xlIGhhc2ggKCMpIGlzIGNvbnNpZGVyZWQgYSBjb21tZW50IGFuZCB3aWxsIGJlIGlnbm9yZWQuCisjIFRoZSBmb3JtYXQgaXM6CisjIFRBRyA9IHZhbHVlIFt2YWx1ZSwgLi4uXQorIyBGb3IgbGlzdHMsIGl0ZW1zIGNhbiBhbHNvIGJlIGFwcGVuZGVkIHVzaW5nOgorIyBUQUcgKz0gdmFsdWUgW3ZhbHVlLCAuLi5dCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKFwiIFwiKS4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBQcm9qZWN0IHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIHRoZSBlbmNvZGluZyB1c2VkIGZvciBhbGwgY2hhcmFjdGVycyBpbiB0aGUgY29uZmlnIGZpbGUKKyMgdGhhdCBmb2xsb3cuIFRoZSBkZWZhdWx0IGlzIFVURi04IHdoaWNoIGlzIGFsc28gdGhlIGVuY29kaW5nIHVzZWQgZm9yIGFsbCB0ZXh0CisjIGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUgaWNvbnYKKyMgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252CisjIGZvciB0aGUgbGlzdCBvZiBwb3NzaWJsZSBlbmNvZGluZ3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBVVEYtOC4KKworRE9YWUZJTEVfRU5DT0RJTkcgICAgICA9IFVURi04CisKKyMgVGhlIFBST0pFQ1RfTkFNRSB0YWcgaXMgYSBzaW5nbGUgd29yZCAob3IgYSBzZXF1ZW5jZSBvZiB3b3JkcyBzdXJyb3VuZGVkIGJ5CisjIGRvdWJsZS1xdW90ZXMsIHVubGVzcyB5b3UgYXJlIHVzaW5nIERveHl3aXphcmQpIHRoYXQgc2hvdWxkIGlkZW50aWZ5IHRoZQorIyBwcm9qZWN0IGZvciB3aGljaCB0aGUgZG9jdW1lbnRhdGlvbiBpcyBnZW5lcmF0ZWQuIFRoaXMgbmFtZSBpcyB1c2VkIGluIHRoZQorIyB0aXRsZSBvZiBtb3N0IGdlbmVyYXRlZCBwYWdlcyBhbmQgaW4gYSBmZXcgb3RoZXIgcGxhY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTXkgUHJvamVjdC4KKworUFJPSkVDVF9OQU1FICAgICAgICAgICA9ICJJbnRlbCZyZWc7Jm5ic3A7T2ZmbG9hZCBSdW50aW1lIExpYnJhcnkiCisKKyMgVGhlIFBST0pFQ1RfTlVNQkVSIHRhZyBjYW4gYmUgdXNlZCB0byBlbnRlciBhIHByb2plY3Qgb3IgcmV2aXNpb24gbnVtYmVyLiBUaGlzCisjIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yIGlmIHNvbWUgdmVyc2lvbgorIyBjb250cm9sIHN5c3RlbSBpcyB1c2VkLgorCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0gCisKKyMgVXNpbmcgdGhlIFBST0pFQ1RfQlJJRUYgdGFnIG9uZSBjYW4gcHJvdmlkZSBhbiBvcHRpb25hbCBvbmUgbGluZSBkZXNjcmlwdGlvbgorIyBmb3IgYSBwcm9qZWN0IHRoYXQgYXBwZWFycyBhdCB0aGUgdG9wIG9mIGVhY2ggcGFnZSBhbmQgc2hvdWxkIGdpdmUgdmlld2VyIGEKKyMgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuCisKK1BST0pFQ1RfQlJJRUYgICAgICAgICAgPSAKKworIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcyBpbmNsdWRlZCBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIG1heGltdW0gaGVpZ2h0IG9mIHRoZSBsb2dvIHNob3VsZCBub3QgZXhjZWVkIDU1IHBpeGVscworIyBhbmQgdGhlIG1heGltdW0gd2lkdGggc2hvdWxkIG5vdCBleGNlZWQgMjAwIHBpeGVscy4gRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28KKyMgdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuCisKK1BST0pFQ1RfTE9HTyAgICAgICAgICAgPSAKKworIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpIHBhdGgKKyMgaW50byB3aGljaCB0aGUgZ2VuZXJhdGVkIGRvY3VtZW50YXRpb24gd2lsbCBiZSB3cml0dGVuLiBJZiBhIHJlbGF0aXZlIHBhdGggaXMKKyMgZW50ZXJlZCwgaXQgd2lsbCBiZSByZWxhdGl2ZSB0byB0aGUgbG9jYXRpb24gd2hlcmUgZG94eWdlbiB3YXMgc3RhcnRlZC4gSWYKKyMgbGVmdCBibGFuayB0aGUgY3VycmVudCBkaXJlY3Rvcnkgd2lsbCBiZSB1c2VkLgorCitPVVRQVVRfRElSRUNUT1JZICAgICAgID0gZG9jL2RveHlnZW4vZ2VuZXJhdGVkCisKKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUgNDA5NiBzdWItCisjIGRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQgZm9ybWF0IGFuZAorIyB3aWxsIGRpc3RyaWJ1dGUgdGhlIGdlbmVyYXRlZCBmaWxlcyBvdmVyIHRoZXNlIGRpcmVjdG9yaWVzLiBFbmFibGluZyB0aGlzCisjIG9wdGlvbiBjYW4gYmUgdXNlZnVsIHdoZW4gZmVlZGluZyBkb3h5Z2VuIGEgaHVnZSBhbW91bnQgb2Ygc291cmNlIGZpbGVzLCB3aGVyZQorIyBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkIG90aGVyd2lzZSBjYXVzZXMKKyMgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8KKworIyBUaGUgT1VUUFVUX0xBTkdVQUdFIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlIGxhbmd1YWdlIGluIHdoaWNoIGFsbAorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcworIyBpbmZvcm1hdGlvbiB0byBnZW5lcmF0ZSBhbGwgY29uc3RhbnQgb3V0cHV0IGluIHRoZSBwcm9wZXIgbGFuZ3VhZ2UuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IEFmcmlrYWFucywgQXJhYmljLCBBcm1lbmlhbiwgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLAorIyBDaGluZXNlLVRyYWRpdGlvbmFsLCBDcm9hdGlhbiwgQ3plY2gsIERhbmlzaCwgRHV0Y2gsIEVuZ2xpc2ggKFVuaXRlZCBTdGF0ZXMpLAorIyBFc3BlcmFudG8sIEZhcnNpIChQZXJzaWFuKSwgRmlubmlzaCwgRnJlbmNoLCBHZXJtYW4sIEdyZWVrLCBIdW5nYXJpYW4sCisjIEluZG9uZXNpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoIG1lc3NhZ2VzKSwKKyMgS29yZWFuLCBLb3JlYW4tZW4gKEtvcmVhbiB3aXRoIEVuZ2xpc2ggbWVzc2FnZXMpLCBMYXR2aWFuLCBMaXRodWFuaWFuLAorIyBNYWNlZG9uaWFuLCBOb3J3ZWdpYW4sIFBlcnNpYW4gKEZhcnNpKSwgUG9saXNoLCBQb3J0dWd1ZXNlLCBSb21hbmlhbiwgUnVzc2lhbiwKKyMgU2VyYmlhbiwgU2VyYmlhbi1DeXJpbGxpYywgU2xvdmFrLCBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBUdXJraXNoLAorIyBVa3JhaW5pYW4gYW5kIFZpZXRuYW1lc2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBFbmdsaXNoLgorCitPVVRQVVRfTEFOR1VBR0UgICAgICAgID0gRW5nbGlzaAorCisjIElmIHRoZSBCUklFRl9NRU1CRVJfREVTQyB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBicmllZiBtZW1iZXIKKyMgZGVzY3JpcHRpb25zIGFmdGVyIHRoZSBtZW1iZXJzIHRoYXQgYXJlIGxpc3RlZCBpbiB0aGUgZmlsZSBhbmQgY2xhc3MKKyMgZG9jdW1lbnRhdGlvbiAoc2ltaWxhciB0byBKYXZhZG9jKS4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworQlJJRUZfTUVNQkVSX0RFU0MgICAgICA9IFlFUworCisjIElmIHRoZSBSRVBFQVRfQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIHByZXBlbmQgdGhlIGJyaWVmCisjIGRlc2NyaXB0aW9uIG9mIGEgbWVtYmVyIG9yIGZ1bmN0aW9uIGJlZm9yZSB0aGUgZGV0YWlsZWQgZGVzY3JpcHRpb24KKyMKKyMgTm90ZTogSWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQorIyBicmllZiBkZXNjcmlwdGlvbnMgd2lsbCBiZSBjb21wbGV0ZWx5IHN1cHByZXNzZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMKKworIyBUaGlzIHRhZyBpbXBsZW1lbnRzIGEgcXVhc2ktaW50ZWxsaWdlbnQgYnJpZWYgZGVzY3JpcHRpb24gYWJicmV2aWF0b3IgdGhhdCBpcworIyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcgaW4gdGhpcyBsaXN0LCBpZiBmb3VuZAorIyBhcyB0aGUgbGVhZGluZyB0ZXh0IG9mIHRoZSBicmllZiBkZXNjcmlwdGlvbiwgd2lsbCBiZSBzdHJpcHBlZCBmcm9tIHRoZSB0ZXh0CisjIGFuZCB0aGUgcmVzdWx0LCBhZnRlciBwcm9jZXNzaW5nIHRoZSB3aG9sZSBsaXN0LCBpcyB1c2VkIGFzIHRoZSBhbm5vdGF0ZWQKKyMgdGV4dC4gT3RoZXJ3aXNlLCB0aGUgYnJpZWYgZGVzY3JpcHRpb24gaXMgdXNlZCBhcy1pcy4gSWYgbGVmdCBibGFuaywgdGhlCisjIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCRuYW1lIGlzIGF1dG9tYXRpY2FsbHkgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZgorIyB0aGUgZW50aXR5KTpUaGUgJG5hbWUgY2xhc3MsIFRoZSAkbmFtZSB3aWRnZXQsIFRoZSAkbmFtZSBmaWxlLCBpcywgcHJvdmlkZXMsCisjIHNwZWNpZmllcywgY29udGFpbnMsIHJlcHJlc2VudHMsIGEsIGFuIGFuZCB0aGUuCisKK0FCQlJFVklBVEVfQlJJRUYgICAgICAgPSAiVGhlICRuYW1lIGNsYXNzIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgIlRoZSAkbmFtZSB3aWRnZXQiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAiVGhlICRuYW1lIGZpbGUiIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICBpcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgcHJvdmlkZXMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHNwZWNpZmllcyBcCisgICAgICAgICAgICAgICAgICAgICAgICAgY29udGFpbnMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIHJlcHJlc2VudHMgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGEgXAorICAgICAgICAgICAgICAgICAgICAgICAgIGFuIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0aGUKKworIyBJZiB0aGUgQUxXQVlTX0RFVEFJTEVEX1NFQyBhbmQgUkVQRUFUX0JSSUVGIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYKKyMgZGVzY3JpcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQUxXQVlTX0RFVEFJTEVEX1NFQyAgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsCisjIGluaGVyaXRlZCBtZW1iZXJzIG9mIGEgY2xhc3MgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgdGhhdCBjbGFzcyBhcyBpZiB0aG9zZQorIyBtZW1iZXJzIHdlcmUgb3JkaW5hcnkgY2xhc3MgbWVtYmVycy4gQ29uc3RydWN0b3JzLCBkZXN0cnVjdG9ycyBhbmQgYXNzaWdubWVudAorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8KKworIyBJZiB0aGUgRlVMTF9QQVRIX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBwcmVwZW5kIHRoZSBmdWxsIHBhdGgKKyMgYmVmb3JlIGZpbGVzIG5hbWUgaW4gdGhlIGZpbGUgbGlzdCBhbmQgaW4gdGhlIGhlYWRlciBmaWxlcy4gSWYgc2V0IHRvIE5PIHRoZQorIyBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBZRVMKKworIyBUaGUgU1RSSVBfRlJPTV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLgorIyBTdHJpcHBpbmcgaXMgb25seSBkb25lIGlmIG9uZSBvZiB0aGUgc3BlY2lmaWVkIHN0cmluZ3MgbWF0Y2hlcyB0aGUgbGVmdC1oYW5kCisjIHBhcnQgb2YgdGhlIHBhdGguIFRoZSB0YWcgY2FuIGJlIHVzZWQgdG8gc2hvdyByZWxhdGl2ZSBwYXRocyBpbiB0aGUgZmlsZSBsaXN0LgorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZSBwYXRoIHRvCisjIHN0cmlwLgorIworIyBOb3RlIHRoYXQgeW91IGNhbiBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvIHJlbGF0aXZlIHBhdGhzLCB3aGljaAorIyB3aWxsIGJlIHJlbGF0aXZlIGZyb20gdGhlIGRpcmVjdG9yeSB3aGVyZSBkb3h5Z2VuIGlzIHN0YXJ0ZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBGVUxMX1BBVEhfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKworU1RSSVBfRlJPTV9QQVRIICAgICAgICA9IHNyYy8KKworIyBUaGUgU1RSSVBfRlJPTV9JTkNfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3RyaXAgYSB1c2VyLWRlZmluZWQgcGFydCBvZiB0aGUKKyMgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMgdGhlIHJlYWRlciB3aGljaAorIyBoZWFkZXIgZmlsZSB0byBpbmNsdWRlIGluIG9yZGVyIHRvIHVzZSBhIGNsYXNzLiBJZiBsZWZ0IGJsYW5rIG9ubHkgdGhlIG5hbWUgb2YKKyMgdGhlIGhlYWRlciBmaWxlIGNvbnRhaW5pbmcgdGhlIGNsYXNzIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQKKyMgc3BlY2lmeSB0aGUgbGlzdCBvZiBpbmNsdWRlIHBhdGhzIHRoYXQgYXJlIG5vcm1hbGx5IHBhc3NlZCB0byB0aGUgY29tcGlsZXIKKyMgdXNpbmcgdGhlIC1JIGZsYWcuCisKK1NUUklQX0ZST01fSU5DX1BBVEggICAgPSBzcmMvCisKKyMgSWYgdGhlIFNIT1JUX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgbXVjaCBzaG9ydGVyIChidXQKKyMgbGVzcyByZWFkYWJsZSkgZmlsZSBuYW1lcy4gVGhpcyBjYW4gYmUgdXNlZnVsIGlzIHlvdXIgZmlsZSBzeXN0ZW1zIGRvZXNuJ3QKKyMgc3VwcG9ydCBsb25nIG5hbWVzIGxpa2Ugb24gRE9TLCBNYWMsIG9yIENELVJPTS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSE9SVF9OQU1FUyAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgSkFWQURPQ19BVVRPQlJJRUYgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW50ZXJwcmV0IHRoZQorIyBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIEphdmFkb2Mtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFkb2Mtc3R5bGUgd2lsbCBiZWhhdmUganVzdCBsaWtlIHJlZ3VsYXIgUXQtCisjIHN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZyBhbiBleHBsaWNpdCBAYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZgorIyBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSkFWQURPQ19BVVRPQlJJRUYgICAgICA9IE5PCisKKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0CisjIGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgUXQtc3R5bGUgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmCisjIHNldCB0byBOTywgdGhlIFF0LXN0eWxlIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzCisjIHJlcXVpcmluZyBhbiBleHBsaWNpdCBcYnJpZWYgY29tbWFuZCBmb3IgYSBicmllZiBkZXNjcmlwdGlvbi4pCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUVRfQVVUT0JSSUVGICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgZG94eWdlbiB0cmVhdCBhCisjIG11bHRpLWxpbmUgQysrIHNwZWNpYWwgY29tbWVudCBibG9jayAoaS5lLiBhIGJsb2NrIG9mIC8vISBvciAvLy8gY29tbWVudHMpIGFzCisjIGEgYnJpZWYgZGVzY3JpcHRpb24uIFRoaXMgdXNlZCB0byBiZSB0aGUgZGVmYXVsdCBiZWhhdmlvci4gVGhlIG5ldyBkZWZhdWx0IGlzCisjIHRvIHRyZWF0IGEgbXVsdGktbGluZSBDKysgY29tbWVudCBibG9jayBhcyBhIGRldGFpbGVkIGRlc2NyaXB0aW9uLiBTZXQgdGhpcworIyB0YWcgdG8gWUVTIGlmIHlvdSBwcmVmZXIgdGhlIG9sZCBiZWhhdmlvciBpbnN0ZWFkLgorIworIyBOb3RlIHRoYXQgc2V0dGluZyB0aGlzIHRhZyB0byBZRVMgYWxzbyBtZWFucyB0aGF0IHJhdGlvbmFsIHJvc2UgY29tbWVudHMgYXJlCisjIG5vdCByZWNvZ25pemVkIGFueSBtb3JlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTworCisjIElmIHRoZSBJTkhFUklUX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhbiB1bmRvY3VtZW50ZWQgbWVtYmVyIGluaGVyaXRzIHRoZQorIyBkb2N1bWVudGF0aW9uIGZyb20gYW55IGRvY3VtZW50ZWQgbWVtYmVyIHRoYXQgaXQgcmUtaW1wbGVtZW50cy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworSU5IRVJJVF9ET0NTICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBTRVBBUkFURV9NRU1CRVJfUEFHRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHByb2R1Y2UgYQorIyBuZXcgcGFnZSBmb3IgZWFjaCBtZW1iZXIuIElmIHNldCB0byBOTywgdGhlIGRvY3VtZW50YXRpb24gb2YgYSBtZW1iZXIgd2lsbCBiZQorIyBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTworCisjIFRoZSBUQUJfU0laRSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2Ygc3BhY2VzIGluIGEgdGFiLiBEb3h5Z2VuCisjIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLgorIyBNaW5pbXVtIHZhbHVlOiAxLCBtYXhpbXVtIHZhbHVlOiAxNiwgZGVmYXVsdCB2YWx1ZTogNC4KKworVEFCX1NJWkUgICAgICAgICAgICAgICA9IDgKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3QgYXMgY29tbWFuZHMgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24uIEFuIGFsaWFzIGhhcyB0aGUgZm9ybToKKyMgbmFtZT12YWx1ZQorIyBGb3IgZXhhbXBsZSBhZGRpbmcKKyMgInNpZGVlZmZlY3Q9QHBhciBTaWRlIEVmZmVjdHM6XG4iCisjIHdpbGwgYWxsb3cgeW91IHRvIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZQorIyBkb2N1bWVudGF0aW9uLCB3aGljaCB3aWxsIHJlc3VsdCBpbiBhIHVzZXItZGVmaW5lZCBwYXJhZ3JhcGggd2l0aCBoZWFkaW5nCisjICJTaWRlIEVmZmVjdHM6Ii4gWW91IGNhbiBwdXQgXG4ncyBpbiB0aGUgdmFsdWUgcGFydCBvZiBhbiBhbGlhcyB0byBpbnNlcnQKKyMgbmV3bGluZXMuCisKK0FMSUFTRVMgICAgICAgICAgICAgICAgPSAKKworIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIHdvcmQta2V5d29yZCBtYXBwaW5ncyAoVENMIG9ubHkpLgorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nICJjbGFzcz1pdGNsOjpjbGFzcyIKKyMgd2lsbCBhbGxvdyB5b3UgdG8gdXNlIHRoZSBjb21tYW5kIGNsYXNzIGluIHRoZSBpdGNsOjpjbGFzcyBtZWFuaW5nLgorCitUQ0xfU1VCU1QgICAgICAgICAgICAgID0gCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfRk9SX0MgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgQyBzb3VyY2VzCisjIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuIEZvcgorIyBpbnN0YW5jZSwgc29tZSBvZiB0aGUgbmFtZXMgdGhhdCBhcmUgdXNlZCB3aWxsIGJlIGRpZmZlcmVudC4gVGhlIGxpc3Qgb2YgYWxsCisjIG1lbWJlcnMgd2lsbCBiZSBvbWl0dGVkLCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0ZPUl9DICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9PVVRQVVRfSkFWQSB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBKYXZhIG9yCisjIFB5dGhvbiBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQKKyMgZm9yIHRoYXQgbGFuZ3VhZ2UuIEZvciBpbnN0YW5jZSwgbmFtZXNwYWNlcyB3aWxsIGJlIHByZXNlbnRlZCBhcyBwYWNrYWdlcywKKyMgcXVhbGlmaWVkIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PCisKKyMgU2V0IHRoZSBPUFRJTUlaRV9GT1JfRk9SVFJBTiB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBGb3J0cmFuCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvciBGb3J0cmFuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK09QVElNSVpFX0ZPUl9GT1JUUkFOICAgPSBOTworCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX1ZIREwgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgVkhETAorIyBzb3VyY2VzLiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyB0YWlsb3JlZCBmb3IgVkhETC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8KKworIyBEb3h5Z2VuIHNlbGVjdHMgdGhlIHBhcnNlciB0byB1c2UgZGVwZW5kaW5nIG9uIHRoZSBleHRlbnNpb24gb2YgdGhlIGZpbGVzIGl0CisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuCisjIGV4dGVuc2lvbi4gRG94eWdlbiBoYXMgYSBidWlsdC1pbiBtYXBwaW5nLCBidXQgeW91IGNhbiBvdmVycmlkZSBvciBleHRlbmQgaXQKKyMgdXNpbmcgdGhpcyB0YWcuIFRoZSBmb3JtYXQgaXMgZXh0PWxhbmd1YWdlLCB3aGVyZSBleHQgaXMgYSBmaWxlIGV4dGVuc2lvbiwgYW5kCisjIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLCBKYXZhc2NyaXB0LAorIyBDIywgQywgQysrLCBELCBQSFAsIE9iamVjdGl2ZS1DLCBQeXRob24sIEZvcnRyYW4sIFZIREwuIEZvciBpbnN0YW5jZSB0byBtYWtlCisjIGRveHlnZW4gdHJlYXQgLmluYyBmaWxlcyBhcyBGb3J0cmFuIGZpbGVzIChkZWZhdWx0IGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDCisjIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4KKyMKKyMgTm90ZSBGb3IgZmlsZXMgd2l0aG91dCBleHRlbnNpb24geW91IGNhbiB1c2Ugbm9fZXh0ZW5zaW9uIGFzIGEgcGxhY2Vob2xkZXIuCisjCisjIE5vdGUgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UKKyMgdGhlIGZpbGVzIGFyZSBub3QgcmVhZCBieSBkb3h5Z2VuLgorCitFWFRFTlNJT05fTUFQUElORyAgICAgID0gCisKKyMgSWYgdGhlIE1BUktET1dOX1NVUFBPUlQgdGFnIGlzIGVuYWJsZWQgdGhlbiBkb3h5Z2VuIHByZS1wcm9jZXNzZXMgYWxsIGNvbW1lbnRzCisjIGFjY29yZGluZyB0byB0aGUgTWFya2Rvd24gZm9ybWF0LCB3aGljaCBhbGxvd3MgZm9yIG1vcmUgcmVhZGFibGUKKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLgorIyBUaGUgb3V0cHV0IG9mIG1hcmtkb3duIHByb2Nlc3NpbmcgaXMgZnVydGhlciBwcm9jZXNzZWQgYnkgZG94eWdlbiwgc28geW91IGNhbgorIyBtaXggZG94eWdlbiwgSFRNTCwgYW5kIFhNTCBjb21tYW5kcyB3aXRoIE1hcmtkb3duIGZvcm1hdHRpbmcuIERpc2FibGUgb25seSBpbgorIyBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK01BUktET1dOX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBXaGVuIGVuYWJsZWQgZG94eWdlbiB0cmllcyB0byBsaW5rIHdvcmRzIHRoYXQgY29ycmVzcG9uZCB0byBkb2N1bWVudGVkCisjIGNsYXNzZXMsIG9yIG5hbWVzcGFjZXMgdG8gdGhlaXIgY29ycmVzcG9uZGluZyBkb2N1bWVudGF0aW9uLiBTdWNoIGEgbGluayBjYW4KKyMgYmUgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZAorIyBvciBnbG9iYWxseSBieSBzZXR0aW5nIEFVVE9MSU5LX1NVUFBPUlQgdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMKKworIyBJZiB5b3UgdXNlIFNUTCBjbGFzc2VzIChpLmUuIHN0ZDo6c3RyaW5nLCBzdGQ6OnZlY3RvciwgZXRjLikgYnV0IGRvIG5vdCB3YW50CisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZCBzZXQgdGhpcworIyB0YWcgdG8gWUVTIGluIG9yZGVyIHRvIGxldCBkb3h5Z2VuIG1hdGNoIGZ1bmN0aW9ucyBkZWNsYXJhdGlvbnMgYW5kCisjIGRlZmluaXRpb25zIHdob3NlIGFyZ3VtZW50cyBjb250YWluIFNUTCBjbGFzc2VzIChlLmcuIGZ1bmMoc3RkOjpzdHJpbmcpOworIyB2ZXJzdXMgZnVuYyhzdGQ6OnN0cmluZykge30pLiBUaGlzIGFsc28gbWFrZSB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTworCisjIElmIHlvdSB1c2UgTWljcm9zb2Z0J3MgQysrL0NMSSBsYW5ndWFnZSwgeW91IHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBTSVBfU1VQUE9SVCB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBzaXAgKHNlZToKKyMgaHR0cDovL3d3dy5yaXZlcmJhbmtjb21wdXRpbmcuY28udWsvc29mdHdhcmUvc2lwL2ludHJvKSBzb3VyY2VzIG9ubHkuIERveHlnZW4KKyMgd2lsbCBwYXJzZSB0aGVtIGxpa2Ugbm9ybWFsIEMrKyBidXQgd2lsbCBhc3N1bWUgYWxsIGNsYXNzZXMgdXNlIHB1YmxpYyBpbnN0ZWFkCisjIG9mIHByaXZhdGUgaW5oZXJpdGFuY2Ugd2hlbiBubyBleHBsaWNpdCBwcm90ZWN0aW9uIGtleXdvcmQgaXMgcHJlc2VudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTSVBfU1VQUE9SVCAgICAgICAgICAgID0gTk8KKworIyBGb3IgTWljcm9zb2Z0J3MgSURMIHRoZXJlIGFyZSBwcm9wZ2V0IGFuZCBwcm9wcHV0IGF0dHJpYnV0ZXMgdG8gaW5kaWNhdGUKKyMgZ2V0dGVyIGFuZCBzZXR0ZXIgbWV0aG9kcyBmb3IgYSBwcm9wZXJ0eS4gU2V0dGluZyB0aGlzIG9wdGlvbiB0byBZRVMgd2lsbCBtYWtlCisjIGRveHlnZW4gdG8gcmVwbGFjZSB0aGUgZ2V0IGFuZCBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHdpbGwgb25seSB3b3JrIGlmIHRoZSBtZXRob2RzIGFyZSBpbmRlZWQgZ2V0dGluZyBvciBzZXR0aW5nIGEgc2ltcGxlCisjIHR5cGUuIElmIHRoaXMgaXMgbm90IHRoZSBjYXNlLCBvciB5b3Ugd2FudCB0byBzaG93IHRoZSBtZXRob2RzIGFueXdheSwgeW91CisjIHNob3VsZCBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0lETF9QUk9QRVJUWV9TVVBQT1JUICAgPSBZRVMKKworIyBJZiBtZW1iZXIgZ3JvdXBpbmcgaXMgdXNlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhbmQgdGhlIERJU1RSSUJVVEVfR1JPVVBfRE9DCisjIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCByZXVzZSB0aGUgZG9jdW1lbnRhdGlvbiBvZiB0aGUgZmlyc3QKKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0CisjIGFsbCBtZW1iZXJzIG9mIGEgZ3JvdXAgbXVzdCBiZSBkb2N1bWVudGVkIGV4cGxpY2l0bHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRElTVFJJQlVURV9HUk9VUF9ET0MgICA9IE5PCisKKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTIHRvIGFsbG93IGNsYXNzIG1lbWJlciBncm91cHMgb2YgdGhlIHNhbWUgdHlwZQorIyAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGEgc3ViZ3JvdXAgb2YgdGhhdAorIyB0eXBlIChlLmcuIHVuZGVyIHRoZSBQdWJsaWMgRnVuY3Rpb25zIHNlY3Rpb24pLiBTZXQgaXQgdG8gTk8gdG8gcHJldmVudAorIyBzdWJncm91cGluZy4gQWx0ZXJuYXRpdmVseSwgdGhpcyBjYW4gYmUgZG9uZSBwZXIgY2xhc3MgdXNpbmcgdGhlCisjIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NVQkdST1VQSU5HICAgICAgICAgICAgPSBZRVMKKworIyBXaGVuIHRoZSBJTkxJTkVfR1JPVVBFRF9DTEFTU0VTIHRhZyBpcyBzZXQgdG8gWUVTLCBjbGFzc2VzLCBzdHJ1Y3RzIGFuZCB1bmlvbnMKKyMgYXJlIHNob3duIGluc2lkZSB0aGUgZ3JvdXAgaW4gd2hpY2ggdGhleSBhcmUgaW5jbHVkZWQgKGUuZy4gdXNpbmcgXGluZ3JvdXApCisjIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvciBzZWN0aW9uIChmb3IgTGFUZVgKKyMgYW5kIFJURikuCisjCisjIE5vdGUgdGhhdCB0aGlzIGZlYXR1cmUgZG9lcyBub3Qgd29yayBpbiBjb21iaW5hdGlvbiB3aXRoCisjIFNFUEFSQVRFX01FTUJFUl9QQUdFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitJTkxJTkVfR1JPVVBFRF9DTEFTU0VTID0gTk8KKworIyBXaGVuIHRoZSBJTkxJTkVfU0lNUExFX1NUUlVDVFMgdGFnIGlzIHNldCB0byBZRVMsIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMKKyMgd2l0aCBvbmx5IHB1YmxpYyBkYXRhIGZpZWxkcyBvciBzaW1wbGUgdHlwZWRlZiBmaWVsZHMgd2lsbCBiZSBzaG93biBpbmxpbmUgaW4KKyMgdGhlIGRvY3VtZW50YXRpb24gb2YgdGhlIHNjb3BlIGluIHdoaWNoIHRoZXkgYXJlIGRlZmluZWQgKGkuZS4gZmlsZSwKKyMgbmFtZXNwYWNlLCBvciBncm91cCBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQKKyMgdG8gTk8sIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kCisjIE1hbiBwYWdlcykgb3Igc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOTElORV9TSU1QTEVfU1RSVUNUUyAgPSBOTworCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgdGFnIGlzIGVuYWJsZWQsIGEgdHlwZWRlZiBvZiBhIHN0cnVjdCwgdW5pb24sIG9yCisjIGVudW0gaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvCisjIHR5cGVkZWYgc3RydWN0IFR5cGVTIHt9IFR5cGVULCB3aWxsIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIHN0cnVjdAorIyB3aXRoIG5hbWUgVHlwZVQuIFdoZW4gZGlzYWJsZWQgdGhlIHR5cGVkZWYgd2lsbCBhcHBlYXIgYXMgYSBtZW1iZXIgb2YgYSBmaWxlLAorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkgYmUKKyMgdXNlZnVsIGZvciBDIGNvZGUgaW4gY2FzZSB0aGUgY29kaW5nIGNvbnZlbnRpb24gZGljdGF0ZXMgdGhhdCBhbGwgY29tcG91bmQKKyMgdHlwZXMgYXJlIHR5cGVkZWYnZWQgYW5kIG9ubHkgdGhlIHR5cGVkZWYgaXMgcmVmZXJlbmNlZCwgbmV2ZXIgdGhlIHRhZyBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1RZUEVERUZfSElERVNfU1RSVUNUICAgPSBOTworCisjIFRoZSBzaXplIG9mIHRoZSBzeW1ib2wgbG9va3VwIGNhY2hlIGNhbiBiZSBzZXQgdXNpbmcgTE9PS1VQX0NBQ0hFX1NJWkUuIFRoaXMKKyMgY2FjaGUgaXMgdXNlZCB0byByZXNvbHZlIHN5bWJvbHMgZ2l2ZW4gdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlCisjIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUgc2FtZSBzeW1ib2wgYXBwZWFycyBtdWx0aXBsZSB0aW1lcyBpbiB0aGUKKyMgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mIHByZS1yZXNvbHZlZCBzeW1ib2xzLiBJZiB0aGUgY2FjaGUgaXMgdG9vIHNtYWxsCisjIGRveHlnZW4gd2lsbCBiZWNvbWUgc2xvd2VyLiBJZiB0aGUgY2FjaGUgaXMgdG9vIGxhcmdlLCBtZW1vcnkgaXMgd2FzdGVkLiBUaGUKKyMgY2FjaGUgc2l6ZSBpcyBnaXZlbiBieSB0aGlzIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlCisjIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTY9NjU1MzYKKyMgc3ltYm9scy4gQXQgdGhlIGVuZCBvZiBhIHJ1biBkb3h5Z2VuIHdpbGwgcmVwb3J0IHRoZSBjYWNoZSB1c2FnZSBhbmQgc3VnZ2VzdAorIyB0aGUgb3B0aW1hbCBjYWNoZSBzaXplIGZyb20gYSBzcGVlZCBwb2ludCBvZiB2aWV3LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5LCBkZWZhdWx0IHZhbHVlOiAwLgorCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluCisjIGRvY3VtZW50YXRpb24gYXJlIGRvY3VtZW50ZWQsIGV2ZW4gaWYgbm8gZG9jdW1lbnRhdGlvbiB3YXMgYXZhaWxhYmxlLiBQcml2YXRlCisjIGNsYXNzIG1lbWJlcnMgYW5kIHN0YXRpYyBmaWxlIG1lbWJlcnMgd2lsbCBiZSBoaWRkZW4gdW5sZXNzIHRoZQorIyBFWFRSQUNUX1BSSVZBVEUgcmVzcGVjdGl2ZWx5IEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMuCisjIE5vdGU6IFRoaXMgd2lsbCBhbHNvIGRpc2FibGUgdGhlIHdhcm5pbmdzIGFib3V0IHVuZG9jdW1lbnRlZCBtZW1iZXJzIHRoYXQgYXJlCisjIG5vcm1hbGx5IHByb2R1Y2VkIHdoZW4gV0FSTklOR1MgaXMgc2V0IHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUFJJVkFURSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgcHJpdmF0ZSBtZW1iZXJzIG9mIGEgY2xhc3Mgd2lsbAorIyBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BSSVZBVEUgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfUEFDS0FHRSB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgbWVtYmVycyB3aXRoIHBhY2thZ2Ugb3IgaW50ZXJuYWwKKyMgc2NvcGUgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1BBQ0tBR0UgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWFRSQUNUX1NUQVRJQyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykgZGVmaW5lZAorIyBsb2NhbGx5IGluIHNvdXJjZSBmaWxlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8KKyMgb25seSBjbGFzc2VzIGRlZmluZWQgaW4gaGVhZGVyIGZpbGVzIGFyZSBpbmNsdWRlZC4gRG9lcyBub3QgaGF2ZSBhbnkgZWZmZWN0CisjIGZvciBKYXZhIHNvdXJjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMKKworIyBUaGlzIGZsYWcgaXMgb25seSB1c2VmdWwgZm9yIE9iamVjdGl2ZS1DIGNvZGUuIFdoZW4gc2V0IHRvIFlFUyBsb2NhbCBtZXRob2RzLAorIyB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLiBJZiBzZXQgdG8gTk8gb25seSBtZXRob2RzIGluIHRoZSBpbnRlcmZhY2UgYXJlCisjIGluY2x1ZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0VYVFJBQ1RfTE9DQUxfTUVUSE9EUyAgPSBOTworCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlCisjIGV4dHJhY3RlZCBhbmQgYXBwZWFyIGluIHRoZSBkb2N1bWVudGF0aW9uIGFzIGEgbmFtZXNwYWNlIGNhbGxlZAorIyAnYW5vbnltb3VzX25hbWVzcGFjZXtmaWxlfScsIHdoZXJlIGZpbGUgd2lsbCBiZSByZXBsYWNlZCB3aXRoIHRoZSBiYXNlIG5hbWUgb2YKKyMgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdCBhbm9ueW1vdXMgbmFtZXNwYWNlCisjIGFyZSBoaWRkZW4uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhUUkFDVF9BTk9OX05TUEFDRVMgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfVU5ET0NfTUVNQkVSUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsCisjIHVuZG9jdW1lbnRlZCBtZW1iZXJzIGluc2lkZSBkb2N1bWVudGVkIGNsYXNzZXMgb3IgZmlsZXMuIElmIHNldCB0byBOTyB0aGVzZQorIyBtZW1iZXJzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLCBidXQgbm8gZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9uIGlzIGdlbmVyYXRlZC4gVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBOTworCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFsbAorIyB1bmRvY3VtZW50ZWQgY2xhc3NlcyB0aGF0IGFyZSBub3JtYWxseSB2aXNpYmxlIGluIHRoZSBjbGFzcyBoaWVyYXJjaHkuIElmIHNldAorIyB0byBOTyB0aGVzZSBjbGFzc2VzIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIHZhcmlvdXMgb3ZlcnZpZXdzLiBUaGlzIG9wdGlvbiBoYXMKKyMgbm8gZWZmZWN0IGlmIEVYVFJBQ1RfQUxMIGlzIGVuYWJsZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9VTkRPQ19DTEFTU0VTICAgICA9IE5PCisKKyMgSWYgdGhlIEhJREVfRlJJRU5EX0NPTVBPVU5EUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGhpZGUgYWxsIGZyaWVuZAorIyAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuIElmIHNldCB0byBOTyB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZQorIyBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitISURFX0ZSSUVORF9DT01QT1VORFMgID0gTk8KKworIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBoaWRlIGFueQorIyBkb2N1bWVudGF0aW9uIGJsb2NrcyBmb3VuZCBpbnNpZGUgdGhlIGJvZHkgb2YgYSBmdW5jdGlvbi4gSWYgc2V0IHRvIE5PIHRoZXNlCisjIGJsb2NrcyB3aWxsIGJlIGFwcGVuZGVkIHRvIHRoZSBmdW5jdGlvbidzIGRldGFpbGVkIGRvY3VtZW50YXRpb24gYmxvY2suCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSElERV9JTl9CT0RZX0RPQ1MgICAgICA9IE5PCisKKyMgVGhlIElOVEVSTkFMX0RPQ1MgdGFnIGRldGVybWluZXMgaWYgZG9jdW1lbnRhdGlvbiB0aGF0IGlzIHR5cGVkIGFmdGVyIGEKKyMgXGludGVybmFsIGNvbW1hbmQgaXMgaW5jbHVkZWQuIElmIHRoZSB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gdGhlIGRvY3VtZW50YXRpb24KKyMgd2lsbCBiZSBleGNsdWRlZC4gU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTworCisjIElmIHRoZSBDQVNFX1NFTlNFX05BTUVTIHRhZyBpcyBzZXQgdG8gTk8gdGhlbiBkb3h5Z2VuIHdpbGwgb25seSBnZW5lcmF0ZSBmaWxlCisjIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28KKyMgYWxsb3dlZC4gVGhpcyBpcyB1c2VmdWwgaWYgeW91IGhhdmUgY2xhc3NlcyBvciBmaWxlcyB3aG9zZSBuYW1lcyBvbmx5IGRpZmZlcgorIyBpbiBjYXNlIGFuZCBpZiB5b3VyIGZpbGUgc3lzdGVtIHN1cHBvcnRzIGNhc2Ugc2Vuc2l0aXZlIGZpbGUgbmFtZXMuIFdpbmRvd3MKKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBzeXN0ZW0gZGVwZW5kZW50LgorCitDQVNFX1NFTlNFX05BTUVTICAgICAgID0gTk8KKworIyBJZiB0aGUgSElERV9TQ09QRV9OQU1FUyB0YWcgaXMgc2V0IHRvIE5PIHRoZW4gZG94eWdlbiB3aWxsIHNob3cgbWVtYmVycyB3aXRoCisjIHRoZWlyIGZ1bGwgY2xhc3MgYW5kIG5hbWVzcGFjZSBzY29wZXMgaW4gdGhlIGRvY3VtZW50YXRpb24uIElmIHNldCB0byBZRVMgdGhlCisjIHNjb3BlIHdpbGwgYmUgaGlkZGVuLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hJREVfU0NPUEVfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTSE9XX0lOQ0xVREVfRklMRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgcHV0IGEgbGlzdCBvZgorIyB0aGUgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgYnkgYSBmaWxlIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgZmlsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19JTkNMVURFX0ZJTEVTICAgICA9IFlFUworCisKK1NIT1dfR1JPVVBFRF9NRU1CX0lOQyAgPSBOTworCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBsaXN0IGluY2x1ZGUKKyMgZmlsZXMgd2l0aCBkb3VibGUgcXVvdGVzIGluIHRoZSBkb2N1bWVudGF0aW9uIHJhdGhlciB0aGFuIHdpdGggc2hhcnAgYnJhY2tldHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRk9SQ0VfTE9DQUxfSU5DTFVERVMgICA9IE5PCisKKyMgSWYgdGhlIElOTElORV9JTkZPIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSB0YWcgW2lubGluZV0gaXMgaW5zZXJ0ZWQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gZm9yIGlubGluZSBtZW1iZXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFNPUlRfTUVNQkVSX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUKKyMgKGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGZpbGUgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyCisjIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbiBkZWNsYXJhdGlvbiBvcmRlci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUworCisjIElmIHRoZSBTT1JUX0JSSUVGX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc29ydCB0aGUgYnJpZWYKKyMgZGVzY3JpcHRpb25zIG9mIGZpbGUsIG5hbWVzcGFjZSBhbmQgY2xhc3MgbWVtYmVycyBhbHBoYWJldGljYWxseSBieSBtZW1iZXIKKyMgbmFtZS4gSWYgc2V0IHRvIE5PIHRoZSBtZW1iZXJzIHdpbGwgYXBwZWFyIGluIGRlY2xhcmF0aW9uIG9yZGVyLiBOb3RlIHRoYXQKKyMgdGhpcyB3aWxsIGFsc28gaW5mbHVlbmNlIHRoZSBvcmRlciBvZiB0aGUgY2xhc3NlcyBpbiB0aGUgY2xhc3MgbGlzdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitTT1JUX0JSSUVGX0RPQ1MgICAgICAgID0gTk8KKworIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQorIyAoYnJpZWYgYW5kIGRldGFpbGVkKSBkb2N1bWVudGF0aW9uIG9mIGNsYXNzIG1lbWJlcnMgc28gdGhhdCBjb25zdHJ1Y3RvcnMgYW5kCisjIGRlc3RydWN0b3JzIGFyZSBsaXN0ZWQgZmlyc3QuIElmIHNldCB0byBOTyB0aGUgY29uc3RydWN0b3JzIHdpbGwgYXBwZWFyIGluIHRoZQorIyByZXNwZWN0aXZlIG9yZGVycyBkZWZpbmVkIGJ5IFNPUlRfQlJJRUZfRE9DUyBhbmQgU09SVF9NRU1CRVJfRE9DUy4KKyMgTm90ZTogSWYgU09SVF9CUklFRl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nIGJyaWVmCisjIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBOb3RlOiBJZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTyB0aGlzIG9wdGlvbiBpcyBpZ25vcmVkIGZvciBzb3J0aW5nCisjIGRldGFpbGVkIG1lbWJlciBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfTUVNQkVSU19DVE9SU18xU1QgPSBOTworCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlIGhpZXJhcmNoeQorIyBvZiBncm91cCBuYW1lcyBpbnRvIGFscGhhYmV0aWNhbCBvcmRlci4gSWYgc2V0IHRvIE5PIHRoZSBncm91cCBuYW1lcyB3aWxsCisjIGFwcGVhciBpbiB0aGVpciBkZWZpbmVkIG9yZGVyLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfR1JPVVBfTkFNRVMgICAgICAgPSBOTworCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIGJ5CisjIGZ1bGx5LXF1YWxpZmllZCBuYW1lcywgaW5jbHVkaW5nIG5hbWVzcGFjZXMuIElmIHNldCB0byBOTywgdGhlIGNsYXNzIGxpc3Qgd2lsbAorIyBiZSBzb3J0ZWQgb25seSBieSBjbGFzcyBuYW1lLCBub3QgaW5jbHVkaW5nIHRoZSBuYW1lc3BhY2UgcGFydC4KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4KKyMgTm90ZTogVGhpcyBvcHRpb24gYXBwbGllcyBvbmx5IHRvIHRoZSBjbGFzcyBsaXN0LCBub3QgdG8gdGhlIGFscGhhYmV0aWNhbAorIyBsaXN0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPUlRfQllfU0NPUEVfTkFNRSAgICAgPSBOTworCisjIElmIHRoZSBTVFJJQ1RfUFJPVE9fTUFUQ0hJTkcgb3B0aW9uIGlzIGVuYWJsZWQgYW5kIGRveHlnZW4gZmFpbHMgdG8gZG8gcHJvcGVyCisjIHR5cGUgcmVzb2x1dGlvbiBvZiBhbGwgcGFyYW1ldGVycyBvZiBhIGZ1bmN0aW9uIGl0IHdpbGwgcmVqZWN0IGEgbWF0Y2ggYmV0d2VlbgorIyB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbiBpZiB0aGVyZSBpcworIyBvbmx5IG9uZSBjYW5kaWRhdGUgb3IgaXQgaXMgb2J2aW91cyB3aGljaCBjYW5kaWRhdGUgdG8gY2hvb3NlIGJ5IGRvaW5nIGEKKyMgc2ltcGxlIHN0cmluZyBtYXRjaC4gQnkgZGlzYWJsaW5nIFNUUklDVF9QUk9UT19NQVRDSElORyBkb3h5Z2VuIHdpbGwgc3RpbGwKKyMgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PCisKKyMgVGhlIEdFTkVSQVRFX1RPRE9MSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykgdGhlCisjIHRvZG8gbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdG9kbyBjb21tYW5kcyBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfVE9ET0xJU1QgICAgICA9IFlFUworCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZQorIyB0ZXN0IGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRlc3QgY29tbWFuZHMgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX1RFU1RMSVNUICAgICAgPSBZRVMKKworIyBUaGUgR0VORVJBVEVfQlVHTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlICggWUVTKSBvciBkaXNhYmxlICggTk8pIHRoZSBidWcKKyMgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTCisKKyMgVGhlIEdFTkVSQVRFX0RFUFJFQ0FURURMSVNUIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgKCBZRVMpIG9yIGRpc2FibGUgKCBOTykKKyMgdGhlIGRlcHJlY2F0ZWQgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcZGVwcmVjYXRlZCBjb21tYW5kcyBpbgorIyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworR0VORVJBVEVfREVQUkVDQVRFRExJU1Q9IFlFUworCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwgZG9jdW1lbnRhdGlvbgorIyBzZWN0aW9ucywgbWFya2VkIGJ5IFxpZiA8c2VjdGlvbl9sYWJlbD4gLi4uIFxlbmRpZiBhbmQgXGNvbmQgPHNlY3Rpb25fbGFiZWw+CisjIC4uLiBcZW5kY29uZCBibG9ja3MuCisKK0VOQUJMRURfU0VDVElPTlMgICAgICAgPSAKKworIyBUaGUgTUFYX0lOSVRJQUxJWkVSX0xJTkVTIHRhZyBkZXRlcm1pbmVzIHRoZSBtYXhpbXVtIG51bWJlciBvZiBsaW5lcyB0aGF0IHRoZQorIyBpbml0aWFsIHZhbHVlIG9mIGEgdmFyaWFibGUgb3IgbWFjcm8gLyBkZWZpbmUgY2FuIGhhdmUgZm9yIGl0IHRvIGFwcGVhciBpbiB0aGUKKyMgZG9jdW1lbnRhdGlvbi4gSWYgdGhlIGluaXRpYWxpemVyIGNvbnNpc3RzIG9mIG1vcmUgbGluZXMgdGhhbiBzcGVjaWZpZWQgaGVyZQorIyBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5LiBUaGUKKyMgYXBwZWFyYW5jZSBvZiB0aGUgdmFsdWUgb2YgaW5kaXZpZHVhbCB2YXJpYWJsZXMgYW5kIG1hY3JvcyAvIGRlZmluZXMgY2FuIGJlCisjIGNvbnRyb2xsZWQgdXNpbmcgXHNob3dpbml0aWFsaXplciBvciBcaGlkZWluaXRpYWxpemVyIGNvbW1hbmQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24gcmVnYXJkbGVzcyBvZiB0aGlzIHNldHRpbmcuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiAzMC4KKworTUFYX0lOSVRJQUxJWkVSX0xJTkVTICA9IDMwCisKKyMgU2V0IHRoZSBTSE9XX1VTRURfRklMRVMgdGFnIHRvIE5PIHRvIGRpc2FibGUgdGhlIGxpc3Qgb2YgZmlsZXMgZ2VuZXJhdGVkIGF0CisjIHRoZSBib3R0b20gb2YgdGhlIGRvY3VtZW50YXRpb24gb2YgY2xhc3NlcyBhbmQgc3RydWN0cy4gSWYgc2V0IHRvIFlFUyB0aGUgbGlzdAorIyB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitTSE9XX1VTRURfRklMRVMgICAgICAgID0gWUVTCisKKyMgU2V0IHRoZSBTSE9XX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBGaWxlcyBwYWdlLiBUaGlzCisjIHdpbGwgcmVtb3ZlIHRoZSBGaWxlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleCBhbmQgZnJvbSB0aGUgRm9sZGVyIFRyZWUgVmlldworIyAoaWYgc3BlY2lmaWVkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU0hPV19GSUxFUyAgICAgICAgICAgICA9IFlFUworCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZSBOYW1lc3BhY2VzCisjIHBhZ2UuIFRoaXMgd2lsbCByZW1vdmUgdGhlIE5hbWVzcGFjZXMgZW50cnkgZnJvbSB0aGUgUXVpY2sgSW5kZXggYW5kIGZyb20gdGhlCisjIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1NIT1dfTkFNRVNQQUNFUyAgICAgICAgPSBZRVMKKworIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQKKyMgZG94eWdlbiBzaG91bGQgaW52b2tlIHRvIGdldCB0aGUgY3VycmVudCB2ZXJzaW9uIGZvciBlYWNoIGZpbGUgKHR5cGljYWxseSBmcm9tCisjIHRoZSB2ZXJzaW9uIGNvbnRyb2wgc3lzdGVtKS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgcHJvZ3JhbSBieSBleGVjdXRpbmcgKHZpYQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCBjb21tYW5kIGlucHV0LWZpbGUsIHdoZXJlIGNvbW1hbmQgaXMgdGhlIHZhbHVlIG9mIHRoZQorIyBGSUxFX1ZFUlNJT05fRklMVEVSIHRhZywgYW5kIGlucHV0LWZpbGUgaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZSBwcm92aWRlZAorIyBieSBkb3h5Z2VuLiBXaGF0ZXZlciB0aGUgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0IGlzIHVzZWQgYXMgdGhlIGZpbGUKKyMgdmVyc2lvbi4gRm9yIGFuIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorCitGSUxFX1ZFUlNJT05fRklMVEVSICAgID0gCisKKyMgVGhlIExBWU9VVF9GSUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGF5b3V0IGZpbGUgd2hpY2ggd2lsbCBiZSBwYXJzZWQKKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQKKyMgb3V0cHV0IGZpbGVzIGluIGFuIG91dHB1dCBmb3JtYXQgaW5kZXBlbmRlbnQgd2F5LiBUbyBjcmVhdGUgdGhlIGxheW91dCBmaWxlCisjIHRoYXQgcmVwcmVzZW50cyBkb3h5Z2VuJ3MgZGVmYXVsdHMsIHJ1biBkb3h5Z2VuIHdpdGggdGhlIC1sIG9wdGlvbi4gWW91IGNhbgorIyBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZCBEb3h5Z2VuTGF5b3V0LnhtbAorIyB3aWxsIGJlIHVzZWQgYXMgdGhlIG5hbWUgb2YgdGhlIGxheW91dCBmaWxlLgorIworIyBOb3RlIHRoYXQgaWYgeW91IHJ1biBkb3h5Z2VuIGZyb20gYSBkaXJlY3RvcnkgY29udGFpbmluZyBhIGZpbGUgY2FsbGVkCisjIERveHlnZW5MYXlvdXQueG1sLCBkb3h5Z2VuIHdpbGwgcGFyc2UgaXQgYXV0b21hdGljYWxseSBldmVuIGlmIHRoZSBMQVlPVVRfRklMRQorIyB0YWcgaXMgbGVmdCBlbXB0eS4KKworTEFZT1VUX0ZJTEUgICAgICAgICAgICA9IAorCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMgY29udGFpbmluZworIyB0aGUgcmVmZXJlbmNlIGRlZmluaXRpb25zLiBUaGlzIG11c3QgYmUgYSBsaXN0IG9mIC5iaWIgZmlsZXMuIFRoZSAuYmliCisjIGV4dGVuc2lvbiBpcyBhdXRvbWF0aWNhbGx5IGFwcGVuZGVkIGlmIG9taXR0ZWQuIFRoaXMgcmVxdWlyZXMgdGhlIGJpYnRleCB0b29sCisjIHRvIGJlIGluc3RhbGxlZC4gU2VlIGFsc28gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4KKyMgRm9yIExhVGVYIHRoZSBzdHlsZSBvZiB0aGUgYmlibGlvZ3JhcGh5IGNhbiBiZSBjb250cm9sbGVkIHVzaW5nCisjIExBVEVYX0JJQl9TVFlMRS4gVG8gdXNlIHRoaXMgZmVhdHVyZSB5b3UgbmVlZCBiaWJ0ZXggYW5kIHBlcmwgYXZhaWxhYmxlIGluIHRoZQorIyBzZWFyY2ggcGF0aC4gRG8gbm90IHVzZSBmaWxlIG5hbWVzIHdpdGggc3BhY2VzLCBiaWJ0ZXggY2Fubm90IGhhbmRsZSB0aGVtLiBTZWUKKyMgYWxzbyBcY2l0ZSBmb3IgaW5mbyBob3cgdG8gY3JlYXRlIHJlZmVyZW5jZXMuCisKK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB3YXJuaW5nIGFuZCBwcm9ncmVzcyBtZXNzYWdlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBRVUlFVCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIG1lc3NhZ2VzIHRoYXQgYXJlIGdlbmVyYXRlZCB0bworIyBzdGFuZGFyZCBvdXRwdXQgYnkgZG94eWdlbi4gSWYgUVVJRVQgaXMgc2V0IHRvIFlFUyB0aGlzIGltcGxpZXMgdGhhdCB0aGUKKyMgbWVzc2FnZXMgYXJlIG9mZi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8KKworIyBUaGUgV0FSTklOR1MgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gb24vb2ZmIHRoZSB3YXJuaW5nIG1lc3NhZ2VzIHRoYXQgYXJlCisjIGdlbmVyYXRlZCB0byBzdGFuZGFyZCBlcnJvciAoIHN0ZGVycikgYnkgZG94eWdlbi4gSWYgV0FSTklOR1MgaXMgc2V0IHRvIFlFUworIyB0aGlzIGltcGxpZXMgdGhhdCB0aGUgd2FybmluZ3MgYXJlIG9uLgorIworIyBUaXA6IFR1cm4gd2FybmluZ3Mgb24gd2hpbGUgd3JpdGluZyB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX1VORE9DVU1FTlRFRCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUKKyMgd2FybmluZ3MgZm9yIHVuZG9jdW1lbnRlZCBtZW1iZXJzLiBJZiBFWFRSQUNUX0FMTCBpcyBzZXQgdG8gWUVTIHRoZW4gdGhpcyBmbGFnCisjIHdpbGwgYXV0b21hdGljYWxseSBiZSBkaXNhYmxlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworV0FSTl9JRl9VTkRPQ1VNRU5URUQgICA9IFlFUworCisjIElmIHRoZSBXQVJOX0lGX0RPQ19FUlJPUiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIHdhcm5pbmdzIGZvcgorIyBwb3RlbnRpYWwgZXJyb3JzIGluIHRoZSBkb2N1bWVudGF0aW9uLCBzdWNoIGFzIG5vdCBkb2N1bWVudGluZyBzb21lIHBhcmFtZXRlcnMKKyMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQgZG9uJ3QgZXhpc3Qgb3IgdXNpbmcKKyMgbWFya3VwIGNvbW1hbmRzIHdyb25nbHkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMKKworIyBUaGlzIFdBUk5fTk9fUEFSQU1ET0Mgb3B0aW9uIGNhbiBiZSBlbmFibGVkIHRvIGdldCB3YXJuaW5ncyBmb3IgZnVuY3Rpb25zIHRoYXQKKyMgYXJlIGRvY3VtZW50ZWQsIGJ1dCBoYXZlIG5vIGRvY3VtZW50YXRpb24gZm9yIHRoZWlyIHBhcmFtZXRlcnMgb3IgcmV0dXJuCisjIHZhbHVlLiBJZiBzZXQgdG8gTk8gZG94eWdlbiB3aWxsIG9ubHkgd2FybiBhYm91dCB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlcgorIyBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworV0FSTl9OT19QQVJBTURPQyAgICAgICA9IE5PCisKKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBkb3h5Z2VuCisjIGNhbiBwcm9kdWNlLiBUaGUgc3RyaW5nIHNob3VsZCBjb250YWluIHRoZSAkZmlsZSwgJGxpbmUsIGFuZCAkdGV4dCB0YWdzLCB3aGljaAorIyB3aWxsIGJlIHJlcGxhY2VkIGJ5IHRoZSBmaWxlIGFuZCBsaW5lIG51bWJlciBmcm9tIHdoaWNoIHRoZSB3YXJuaW5nIG9yaWdpbmF0ZWQKKyMgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbiAkdmVyc2lvbiwgd2hpY2ggd2lsbAorIyBiZSByZXBsYWNlZCBieSB0aGUgdmVyc2lvbiBvZiB0aGUgZmlsZSAoaWYgaXQgY291bGQgYmUgb2J0YWluZWQgdmlhCisjIEZJTEVfVkVSU0lPTl9GSUxURVIpCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiAkZmlsZTokbGluZTogJHRleHQuCisKK1dBUk5fRk9STUFUICAgICAgICAgICAgPSAiJGZpbGU6JGxpbmU6ICR0ZXh0IgorCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcgYW5kIGVycm9yCisjIG1lc3NhZ2VzIHNob3VsZCBiZSB3cml0dGVuLiBJZiBsZWZ0IGJsYW5rIHRoZSBvdXRwdXQgaXMgd3JpdHRlbiB0byBzdGFuZGFyZAorIyBlcnJvciAoc3RkZXJyKS4KKworV0FSTl9MT0dGSUxFICAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBpbnB1dCBmaWxlcworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIFRoZSBJTlBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBjb250YWluCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSBteWZpbGUuY3BwIG9yCisjIGRpcmVjdG9yaWVzIGxpa2UgL3Vzci9zcmMvbXlwcm9qZWN0LiBTZXBhcmF0ZSB0aGUgZmlsZXMgb3IgZGlyZWN0b3JpZXMgd2l0aAorIyBzcGFjZXMuCisjIE5vdGU6IElmIHRoaXMgdGFnIGlzIGVtcHR5IHRoZSBjdXJyZW50IGRpcmVjdG9yeSBpcyBzZWFyY2hlZC4KKworSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYworCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzCisjIHRoYXQgZG94eWdlbiBwYXJzZXMuIEludGVybmFsbHkgZG94eWdlbiB1c2VzIHRoZSBVVEYtOCBlbmNvZGluZy4gRG94eWdlbiB1c2VzCisjIGxpYmljb252IChvciB0aGUgaWNvbnYgYnVpbHQgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgdGhlIGxpYmljb252CisjIGRvY3VtZW50YXRpb24gKHNlZTogaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252KSBmb3IgdGhlIGxpc3Qgb2YKKyMgcG9zc2libGUgZW5jb2RpbmdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogVVRGLTguCisKK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVQgdGFnIGNvbnRhaW5zIGRpcmVjdG9yaWVzLCB5b3UgY2FuIHVzZSB0aGUKKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIHRoZQorIyBmb2xsb3dpbmcgcGF0dGVybnMgYXJlIHRlc3RlZDoqLmMsICouY2MsICouY3h4LCAqLmNwcCwgKi5jKyssICouamF2YSwgKi5paSwKKyMgKi5peHgsICouaXBwLCAqLmkrKywgKi5pbmwsICouaWRsLCAqLmRkbCwgKi5vZGwsICouaCwgKi5oaCwgKi5oeHgsICouaHBwLAorIyAqLmgrKywgKi5jcywgKi5kLCAqLnBocCwgKi5waHA0LCAqLnBocDUsICoucGh0bWwsICouaW5jLCAqLm0sICoubWFya2Rvd24sCisjICoubWQsICoubW0sICouZG94LCAqLnB5LCAqLmY5MCwgKi5mLCAqLmZvciwgKi50Y2wsICoudmhkLCAqLnZoZGwsICoudWNmLAorIyAqLnFzZiwgKi5hcyBhbmQgKi5qcy4KKworRklMRV9QQVRURVJOUyAgICAgICAgICA9ICouYyAqLmggKi5jcHAgKi5mOTAKKworIyBUaGUgUkVDVVJTSVZFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHdoZXRoZXIgb3Igbm90IHN1YmRpcmVjdG9yaWVzIHNob3VsZAorIyBiZSBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgYXMgd2VsbC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitSRUNVUlNJVkUgICAgICAgICAgICAgID0gWUVTCisKKyMgVGhlIEVYQ0xVREUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsZXMgYW5kL29yIGRpcmVjdG9yaWVzIHRoYXQgc2hvdWxkIGJlCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhCisjIHN1YmRpcmVjdG9yeSBmcm9tIGEgZGlyZWN0b3J5IHRyZWUgd2hvc2Ugcm9vdCBpcyBzcGVjaWZpZWQgd2l0aCB0aGUgSU5QVVQgdGFnLgorIworIyBOb3RlIHRoYXQgcmVsYXRpdmUgcGF0aHMgYXJlIHJlbGF0aXZlIHRvIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1bi4KKworRVhDTFVERSAgICAgICAgICAgICAgICA9IHNyYy9pbXBvcnRlZCBzcmMvcmR0c2MuaAorCisjIFRoZSBFWENMVURFX1NZTUxJTktTIHRhZyBjYW4gYmUgdXNlZCB0byBzZWxlY3Qgd2hldGhlciBvciBub3QgZmlsZXMgb3IKKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQKKyMgZnJvbSB0aGUgaW5wdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworRVhDTFVERV9TWU1MSU5LUyAgICAgICA9IE5PCisKKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQorIyBFWENMVURFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm5zIHRvIGV4Y2x1ZGUKKyMgY2VydGFpbiBmaWxlcyBmcm9tIHRob3NlIGRpcmVjdG9yaWVzLgorIworIyBOb3RlIHRoYXQgdGhlIHdpbGRjYXJkcyBhcmUgbWF0Y2hlZCBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8KKyMgZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3RvcmllcyBmb3IgZXhhbXBsZSB1c2UgdGhlIHBhdHRlcm4gKi90ZXN0LyoKKworRVhDTFVERV9QQVRURVJOUyAgICAgICA9IAorCisjIFRoZSBFWENMVURFX1NZTUJPTFMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgc3ltYm9sIG5hbWVzCisjIChuYW1lc3BhY2VzLCBjbGFzc2VzLCBmdW5jdGlvbnMsIGV0Yy4pIHRoYXQgc2hvdWxkIGJlIGV4Y2x1ZGVkIGZyb20gdGhlCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQorIyB3aWxkY2FyZCAqIGlzIHVzZWQsIGEgc3Vic3RyaW5nLiBFeGFtcGxlczogQU5hbWVzcGFjZSwgQUNsYXNzLAorIyBBQ2xhc3M6OkFOYW1lc3BhY2UsIEFOYW1lc3BhY2U6OipUZXN0CisjCisjIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkIGFnYWluc3QgdGhlIGZpbGUgd2l0aCBhYnNvbHV0ZSBwYXRoLCBzbyB0bworIyBleGNsdWRlIGFsbCB0ZXN0IGRpcmVjdG9yaWVzIHVzZSB0aGUgcGF0dGVybiAqL3Rlc3QvKgorCitFWENMVURFX1NZTUJPTFMgICAgICAgID0gCisKKyMgVGhlIEVYQU1QTEVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gZXhhbXBsZSBjb2RlIGZyYWdtZW50cyB0aGF0IGFyZSBpbmNsdWRlZCAoc2VlIHRoZSBcaW5jbHVkZQorIyBjb21tYW5kKS4KKworRVhBTVBMRV9QQVRIICAgICAgICAgICA9IAorCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlCisjIEVYQU1QTEVfUEFUVEVSTlMgdGFnIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgd2lsZGNhcmQgcGF0dGVybiAobGlrZSAqLmNwcCBhbmQKKyMgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rIGFsbAorIyBmaWxlcyBhcmUgaW5jbHVkZWQuCisKK0VYQU1QTEVfUEFUVEVSTlMgICAgICAgPSAqCisKKyMgSWYgdGhlIEVYQU1QTEVfUkVDVVJTSVZFIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gc3ViZGlyZWN0b3JpZXMgd2lsbCBiZQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUgY29tbWFuZHMKKyMgaXJyZXNwZWN0aXZlIG9mIHRoZSB2YWx1ZSBvZiB0aGUgUkVDVVJTSVZFIHRhZy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8KKworIyBUaGUgSU1BR0VfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBmaWxlcyBvciBkaXJlY3RvcmllcworIyB0aGF0IGNvbnRhaW4gaW1hZ2VzIHRoYXQgYXJlIHRvIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIChzZWUgdGhlCisjIFxpbWFnZSBjb21tYW5kKS4KKworSU1BR0VfUEFUSCAgICAgICAgICAgICA9IAorCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQKKyMgaW52b2tlIHRvIGZpbHRlciBmb3IgZWFjaCBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBmaWx0ZXIgcHJvZ3JhbQorIyBieSBleGVjdXRpbmcgKHZpYSBwb3BlbigpKSB0aGUgY29tbWFuZDoKKyMKKyMgPGZpbHRlcj4gPGlucHV0LWZpbGU+CisjCisjIHdoZXJlIDxmaWx0ZXI+IGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUKKyMgbmFtZSBvZiBhbiBpbnB1dCBmaWxlLiBEb3h5Z2VuIHdpbGwgdGhlbiB1c2UgdGhlIG91dHB1dCB0aGF0IHRoZSBmaWx0ZXIKKyMgcHJvZ3JhbSB3cml0ZXMgdG8gc3RhbmRhcmQgb3V0cHV0LiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZworIyB3aWxsIGJlIGlnbm9yZWQuCisjCisjIE5vdGUgdGhhdCB0aGUgZmlsdGVyIG11c3Qgbm90IGFkZCBvciByZW1vdmUgbGluZXM7IGl0IGlzIGFwcGxpZWQgYmVmb3JlIHRoZQorIyBjb2RlIGlzIHNjYW5uZWQsIGJ1dCBub3Qgd2hlbiB0aGUgb3V0cHV0IGNvZGUgaXMgZ2VuZXJhdGVkLiBJZiBsaW5lcyBhcmUgYWRkZWQKKyMgb3IgcmVtb3ZlZCwgdGhlIGFuY2hvcnMgd2lsbCBub3QgYmUgcGxhY2VkIGNvcnJlY3RseS4KKworSU5QVVRfRklMVEVSICAgICAgICAgICA9IAorCisjIFRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgZmlsdGVycyBvbiBhIHBlciBmaWxlIHBhdHRlcm4KKyMgYmFzaXMuIERveHlnZW4gd2lsbCBjb21wYXJlIHRoZSBmaWxlIG5hbWUgd2l0aCBlYWNoIHBhdHRlcm4gYW5kIGFwcGx5IHRoZQorIyBmaWx0ZXIgaWYgdGhlcmUgaXMgYSBtYXRjaC4gVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybTogcGF0dGVybj1maWx0ZXIKKyMgKGxpa2UgKi5jcHA9bXlfY3BwX2ZpbHRlcikuIFNlZSBJTlBVVF9GSUxURVIgZm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gb24gaG93CisjIGZpbHRlcnMgYXJlIHVzZWQuIElmIHRoZSBGSUxURVJfUEFUVEVSTlMgdGFnIGlzIGVtcHR5IG9yIGlmIG5vbmUgb2YgdGhlCisjIHBhdHRlcm5zIG1hdGNoIHRoZSBmaWxlIG5hbWUsIElOUFVUX0ZJTFRFUiBpcyBhcHBsaWVkLgorCitGSUxURVJfUEFUVEVSTlMgICAgICAgID0gCisKKyMgSWYgdGhlIEZJTFRFUl9TT1VSQ0VfRklMRVMgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBpbnB1dCBmaWx0ZXIgKGlmIHNldCB1c2luZworIyBJTlBVVF9GSUxURVIgKSB3aWxsIGFsc28gYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHRoYXQgYXJlIHVzZWQgZm9yCisjIHByb2R1Y2luZyB0aGUgc291cmNlIGZpbGVzIHRvIGJyb3dzZSAoaS5lLiB3aGVuIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0ZJTFRFUl9TT1VSQ0VfRklMRVMgICAgPSBOTworCisjIFRoZSBGSUxURVJfU09VUkNFX1BBVFRFUk5TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHNvdXJjZSBmaWx0ZXJzIHBlciBmaWxlCisjIHBhdHRlcm4uIEEgcGF0dGVybiB3aWxsIG92ZXJyaWRlIHRoZSBzZXR0aW5nIGZvciBGSUxURVJfUEFUVEVSTiAoaWYgYW55KSBhbmQKKyMgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybiB1c2luZworIyAqLmV4dD0gKHNvIHdpdGhvdXQgbmFtaW5nIGEgZmlsdGVyKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEZJTFRFUl9TT1VSQ0VfRklMRVMgaXMgc2V0IHRvIFlFUy4KKworRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9IAorCisjIElmIHRoZSBVU0VfTURGSUxFX0FTX01BSU5QQUdFIHRhZyByZWZlcnMgdG8gdGhlIG5hbWUgb2YgYSBtYXJrZG93biBmaWxlIHRoYXQKKyMgaXMgcGFydCBvZiB0aGUgaW5wdXQsIGl0cyBjb250ZW50cyB3aWxsIGJlIHBsYWNlZCBvbiB0aGUgbWFpbiBwYWdlCisjIChpbmRleC5odG1sKS4gVGhpcyBjYW4gYmUgdXNlZnVsIGlmIHlvdSBoYXZlIGEgcHJvamVjdCBvbiBmb3IgaW5zdGFuY2UgR2l0SHViCisjIGFuZCB3YW50IHRvIHJldXNlIHRoZSBpbnRyb2R1Y3Rpb24gcGFnZSBhbHNvIGZvciB0aGUgZG94eWdlbiBvdXRwdXQuCisKK1VTRV9NREZJTEVfQVNfTUFJTlBBR0UgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byBzb3VyY2UgYnJvd3NpbmcKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgU09VUkNFX0JST1dTRVIgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBhIGxpc3Qgb2Ygc291cmNlIGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLiBEb2N1bWVudGVkIGVudGl0aWVzIHdpbGwgYmUgY3Jvc3MtcmVmZXJlbmNlZCB3aXRoIHRoZXNlIHNvdXJjZXMuCisjCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgdGhhdAorIyBhbHNvIFZFUkJBVElNX0hFQURFUlMgaXMgc2V0IHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1NPVVJDRV9CUk9XU0VSICAgICAgICAgPSBZRVMKKworIyBTZXR0aW5nIHRoZSBJTkxJTkVfU09VUkNFUyB0YWcgdG8gWUVTIHdpbGwgaW5jbHVkZSB0aGUgYm9keSBvZiBmdW5jdGlvbnMsCisjIGNsYXNzZXMgYW5kIGVudW1zIGRpcmVjdGx5IGludG8gdGhlIGRvY3VtZW50YXRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworSU5MSU5FX1NPVVJDRVMgICAgICAgICA9IE5PCisKKyMgU2V0dGluZyB0aGUgU1RSSVBfQ09ERV9DT01NRU5UUyB0YWcgdG8gWUVTIHdpbGwgaW5zdHJ1Y3QgZG94eWdlbiB0byBoaWRlIGFueQorIyBzcGVjaWFsIGNvbW1lbnQgYmxvY2tzIGZyb20gZ2VuZXJhdGVkIHNvdXJjZSBjb2RlIGZyYWdtZW50cy4gTm9ybWFsIEMsIEMrKyBhbmQKKyMgRm9ydHJhbiBjb21tZW50cyB3aWxsIGFsd2F5cyByZW1haW4gdmlzaWJsZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworU1RSSVBfQ09ERV9DT01NRU5UUyAgICA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZAorIyBmdW5jdGlvbiBhbGwgZG9jdW1lbnRlZCBmdW5jdGlvbnMgcmVmZXJlbmNpbmcgaXQgd2lsbCBiZSBsaXN0ZWQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworUkVGRVJFTkNFRF9CWV9SRUxBVElPTiA9IFlFUworCisjIElmIHRoZSBSRUZFUkVOQ0VTX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZm9yIGVhY2ggZG9jdW1lbnRlZCBmdW5jdGlvbgorIyBhbGwgZG9jdW1lbnRlZCBlbnRpdGllcyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTworCisjIElmIHRoZSBSRUZFUkVOQ0VTX0xJTktfU09VUkNFIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBTT1VSQ0VfQlJPV1NFUiB0YWcgaXMgc2V0CisjIHRvIFlFUywgdGhlbiB0aGUgaHlwZXJsaW5rcyBmcm9tIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZAorIyBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwgbGluayB0byB0aGUgc291cmNlIGNvZGUuIE90aGVyd2lzZSB0aGV5IHdpbGwKKyMgbGluayB0byB0aGUgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworUkVGRVJFTkNFU19MSU5LX1NPVVJDRSA9IFlFUworCisjIElmIFNPVVJDRV9UT09MVElQUyBpcyBlbmFibGVkICh0aGUgZGVmYXVsdCkgdGhlbiBob3ZlcmluZyBhIGh5cGVybGluayBpbiB0aGUKKyMgc291cmNlIGNvZGUgd2lsbCBzaG93IGEgdG9vbHRpcCB3aXRoIGFkZGl0aW9uYWwgaW5mb3JtYXRpb24gc3VjaCBhcyBwcm90b3R5cGUsCisjIGJyaWVmIGRlc2NyaXB0aW9uIGFuZCBsaW5rcyB0byB0aGUgZGVmaW5pdGlvbiBhbmQgZG9jdW1lbnRhdGlvbi4gU2luY2UgdGhpcworIyB3aWxsIG1ha2UgdGhlIEhUTUwgZmlsZSBsYXJnZXIgYW5kIGxvYWRpbmcgb2YgbGFyZ2UgZmlsZXMgYSBiaXQgc2xvd2VyLCB5b3UKKyMgY2FuIG9wdCB0byBkaXNhYmxlIHRoaXMgZmVhdHVyZS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNPVVJDRV9CUk9XU0VSIGlzIHNldCB0byBZRVMuCisKK1NPVVJDRV9UT09MVElQUyAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgVVNFX0hUQUdTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIHJlZmVyZW5jZXMgdG8gc291cmNlIGNvZGUgd2lsbAorIyBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuIGJ1aWx0LWluCisjIHNvdXJjZSBicm93c2VyLiBUaGUgaHRhZ3MgdG9vbCBpcyBwYXJ0IG9mIEdOVSdzIGdsb2JhbCBzb3VyY2UgdGFnZ2luZyBzeXN0ZW0KKyMgKHNlZSBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvZ2xvYmFsL2dsb2JhbC5odG1sKS4gWW91IHdpbGwgbmVlZCB2ZXJzaW9uCisjIDQuOC42IG9yIGhpZ2hlci4KKyMKKyMgVG8gdXNlIGl0IGRvIHRoZSBmb2xsb3dpbmc6CisjIC0gSW5zdGFsbCB0aGUgbGF0ZXN0IHZlcnNpb24gb2YgZ2xvYmFsCisjIC0gRW5hYmxlIFNPVVJDRV9CUk9XU0VSIGFuZCBVU0VfSFRBR1MgaW4gdGhlIGNvbmZpZyBmaWxlCisjIC0gTWFrZSBzdXJlIHRoZSBJTlBVVCBwb2ludHMgdG8gdGhlIHJvb3Qgb2YgdGhlIHNvdXJjZSB0cmVlCisjIC0gUnVuIGRveHlnZW4gYXMgbm9ybWFsCisjCisjIERveHlnZW4gd2lsbCBpbnZva2UgaHRhZ3MgKGFuZCB0aGF0IHdpbGwgaW4gdHVybiBpbnZva2UgZ3RhZ3MpLCBzbyB0aGVzZQorIyB0b29scyBtdXN0IGJlIGF2YWlsYWJsZSBmcm9tIHRoZSBjb21tYW5kIGxpbmUgKGkuZS4gaW4gdGhlIHNlYXJjaCBwYXRoKS4KKyMKKyMgVGhlIHJlc3VsdDogaW5zdGVhZCBvZiB0aGUgc291cmNlIGJyb3dzZXIgZ2VuZXJhdGVkIGJ5IGRveHlnZW4sIHRoZSBsaW5rcyB0bworIyBzb3VyY2UgY29kZSB3aWxsIG5vdyBwb2ludCB0byB0aGUgb3V0cHV0IG9mIGh0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTT1VSQ0VfQlJPV1NFUiBpcyBzZXQgdG8gWUVTLgorCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgVkVSQkFUSU1fSEVBREVSUyB0YWcgaXMgc2V0IHRoZSBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyB2ZXJiYXRpbSBjb3B5IG9mIHRoZSBoZWFkZXIgZmlsZSBmb3IgZWFjaCBjbGFzcyBmb3Igd2hpY2ggYW4gaW5jbHVkZSBpcworIyBzcGVjaWZpZWQuIFNldCB0byBOTyB0byBkaXNhYmxlIHRoaXMuCisjIFNlZSBhbHNvOiBTZWN0aW9uIFxjbGFzcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworVkVSQkFUSU1fSEVBREVSUyAgICAgICA9IFlFUworCisjIElmIHRoZSBDTEFOR19BU1NJU1RFRF9QQVJTSU5HIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCB1c2UgdGhlCisjIGNsYW5nIHBhcnNlciAoc2VlOiBodHRwOi8vY2xhbmcubGx2bS5vcmcvKSBmb3IgbW9yZSBhY3VyYXRlIHBhcnNpbmcgYXQgdGhlCisjIGNvc3Qgb2YgcmVkdWNlZCBwZXJmb3JtYW5jZS4gVGhpcyBjYW4gYmUgcGFydGljdWxhcmx5IGhlbHBmdWwgd2l0aCB0ZW1wbGF0ZQorIyByaWNoIEMrKyBjb2RlIGZvciB3aGljaCBkb3h5Z2VuJ3MgYnVpbHQtaW4gcGFyc2VyIGxhY2tzIHRoZSBuZWNlc3NhcnkgdHlwZQorIyBpbmZvcm1hdGlvbi4KKyMgTm90ZTogVGhlIGF2YWlsYWJpbGl0eSBvZiB0aGlzIG9wdGlvbiBkZXBlbmRzIG9uIHdoZXRoZXIgb3Igbm90IGRveHlnZW4gd2FzCisjIGNvbXBpbGVkIHdpdGggdGhlIC0td2l0aC1saWJjbGFuZyBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworQ0xBTkdfQVNTSVNURURfUEFSU0lORyA9IE5PCisKKyMgSWYgY2xhbmcgYXNzaXN0ZWQgcGFyc2luZyBpcyBlbmFibGVkIHlvdSBjYW4gcHJvdmlkZSB0aGUgY29tcGlsZXIgd2l0aCBjb21tYW5kCisjIGxpbmUgb3B0aW9ucyB0aGF0IHlvdSB3b3VsZCBub3JtYWxseSB1c2Ugd2hlbiBpbnZva2luZyB0aGUgY29tcGlsZXIuIE5vdGUgdGhhdAorIyB0aGUgaW5jbHVkZSBwYXRocyB3aWxsIGFscmVhZHkgYmUgc2V0IGJ5IGRveHlnZW4gZm9yIHRoZSBmaWxlcyBhbmQgZGlyZWN0b3JpZXMKKyMgc3BlY2lmaWVkIHdpdGggSU5QVVQgYW5kIElOQ0xVREVfUEFUSC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIENMQU5HX0FTU0lTVEVEX1BBUlNJTkcgaXMgc2V0IHRvIFlFUy4KKworQ0xBTkdfT1BUSU9OUyAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBhbHBoYWJldGljYWwgY2xhc3MgaW5kZXgKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgQUxQSEFCRVRJQ0FMX0lOREVYIHRhZyBpcyBzZXQgdG8gWUVTLCBhbiBhbHBoYWJldGljYWwgaW5kZXggb2YgYWxsCisjIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QgY29udGFpbnMgYSBsb3Qgb2YKKyMgY2xhc3Nlcywgc3RydWN0cywgdW5pb25zIG9yIGludGVyZmFjZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMKKworIyBUaGUgQ09MU19JTl9BTFBIQV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbnVtYmVyIG9mIGNvbHVtbnMgaW4KKyMgd2hpY2ggdGhlIGFscGhhYmV0aWNhbCBpbmRleCBsaXN0IHdpbGwgYmUgc3BsaXQuCisjIE1pbmltdW0gdmFsdWU6IDEsIG1heGltdW0gdmFsdWU6IDIwLCBkZWZhdWx0IHZhbHVlOiA1LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgQUxQSEFCRVRJQ0FMX0lOREVYIGlzIHNldCB0byBZRVMuCisKK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1CisKKyMgSW4gY2FzZSBhbGwgY2xhc3NlcyBpbiBhIHByb2plY3Qgc3RhcnQgd2l0aCBhIGNvbW1vbiBwcmVmaXgsIGFsbCBjbGFzc2VzIHdpbGwKKyMgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4LiBUaGUgSUdOT1JFX1BSRUZJWCB0YWcKKyMgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByZWZpeCAob3IgYSBsaXN0IG9mIHByZWZpeGVzKSB0aGF0IHNob3VsZCBiZSBpZ25vcmVkCisjIHdoaWxlIGdlbmVyYXRpbmcgdGhlIGluZGV4IGhlYWRlcnMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBBTFBIQUJFVElDQUxfSU5ERVggaXMgc2V0IHRvIFlFUy4KKworSUdOT1JFX1BSRUZJWCAgICAgICAgICA9IAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBIVE1MIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBIVE1MIG91dHB1dAorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitHRU5FUkFURV9IVE1MICAgICAgICAgID0gWUVTCisKKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogaHRtbC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9PVVRQVVQgICAgICAgICAgICA9IGh0bWwKKworIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yIGVhY2gKKyMgZ2VuZXJhdGVkIEhUTUwgcGFnZSAoZm9yIGV4YW1wbGU6IC5odG0sIC5waHAsIC5hc3ApLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLmh0bWwuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRklMRV9FWFRFTlNJT04gICAgPSAuaHRtbAorCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHVzZXItZGVmaW5lZCBIVE1MIGhlYWRlciBmaWxlIGZvcgorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBzdGFuZGFyZCBoZWFkZXIuCisjCisjIFRvIGdldCB2YWxpZCBIVE1MIHRoZSBoZWFkZXIgZmlsZSB0aGF0IGluY2x1ZGVzIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMKKyMgdGhhdCBkb3h5Z2VuIG5lZWRzLCB3aGljaCBpcyBkZXBlbmRlbnQgb24gdGhlIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyB1c2VkIChlLmcuCisjIHRoZSBzZXR0aW5nIEdFTkVSQVRFX1RSRUVWSUVXKS4gSXQgaXMgaGlnaGx5IHJlY29tbWVuZGVkIHRvIHN0YXJ0IHdpdGggYQorIyBkZWZhdWx0IGhlYWRlciB1c2luZworIyBkb3h5Z2VuIC13IGh0bWwgbmV3X2hlYWRlci5odG1sIG5ld19mb290ZXIuaHRtbCBuZXdfc3R5bGVzaGVldC5jc3MKKyMgWW91ckNvbmZpZ0ZpbGUKKyMgYW5kIHRoZW4gbW9kaWZ5IHRoZSBmaWxlIG5ld19oZWFkZXIuaHRtbC4gU2VlIGFsc28gc2VjdGlvbiAiRG94eWdlbiB1c2FnZSIKKyMgZm9yIGluZm9ybWF0aW9uIG9uIGhvdyB0byBnZW5lcmF0ZSB0aGUgZGVmYXVsdCBoZWFkZXIgdGhhdCBkb3h5Z2VuIG5vcm1hbGx5CisjIHVzZXMuCisjIE5vdGU6IFRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseSBoYXZlIHRvIHJlZ2VuZXJhdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHdoZW4gdXBncmFkaW5nIHRvIGEgbmV3ZXIgdmVyc2lvbiBvZiBkb3h5Z2VuLiBGb3IgYSBkZXNjcmlwdGlvbgorIyBvZiB0aGUgcG9zc2libGUgbWFya2VycyBhbmQgYmxvY2sgbmFtZXMgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitIVE1MX0hFQURFUiAgICAgICAgICAgID0gCisKKyMgVGhlIEhUTUxfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIEhUTUwgZm9vdGVyIGZvciBlYWNoCisjIGdlbmVyYXRlZCBIVE1MIHBhZ2UuIElmIHRoZSB0YWcgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZAorIyBmb290ZXIuIFNlZSBIVE1MX0hFQURFUiBmb3IgbW9yZSBpbmZvcm1hdGlvbiBvbiBob3cgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0CisjIGZvb3RlciBhbmQgd2hhdCBzcGVjaWFsIGNvbW1hbmRzIGNhbiBiZSB1c2VkIGluc2lkZSB0aGUgZm9vdGVyLiBTZWUgYWxzbworIyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBkZWZhdWx0IGZvb3RlcgorIyB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9GT09URVIgICAgICAgICAgICA9IAorCisjIFRoZSBIVE1MX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSB1c2VyLWRlZmluZWQgY2FzY2FkaW5nIHN0eWxlCisjIHNoZWV0IHRoYXQgaXMgdXNlZCBieSBlYWNoIEhUTUwgcGFnZS4gSXQgY2FuIGJlIHVzZWQgdG8gZmluZS10dW5lIHRoZSBsb29rIG9mCisjIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBkZWZhdWx0IHN0eWxlIHNoZWV0LgorIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZSBzdHlsZQorIyBzaGVldCB0aGF0IGRveHlnZW4gbm9ybWFsbHkgdXNlcy4KKyMgTm90ZTogSXQgaXMgcmVjb21tZW5kZWQgdG8gdXNlIEhUTUxfRVhUUkFfU1RZTEVTSEVFVCBpbnN0ZWFkIG9mIHRoaXMgdGFnLCBhcworIyBpdCBpcyBtb3JlIHJvYnVzdCBhbmQgdGhpcyB0YWcgKEhUTUxfU1RZTEVTSEVFVCkgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZQorIyBvYnNvbGV0ZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9TVFlMRVNIRUVUICAgICAgICA9IAorCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbCB1c2VyLQorIyBkZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZCBzdHlsZSBzaGVldHMKKyMgY3JlYXRlZCBieSBkb3h5Z2VuLiBVc2luZyB0aGlzIG9wdGlvbiBvbmUgY2FuIG92ZXJydWxlIGNlcnRhaW4gc3R5bGUgYXNwZWN0cy4KKyMgVGhpcyBpcyBwcmVmZXJyZWQgb3ZlciB1c2luZyBIVE1MX1NUWUxFU0hFRVQgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUKKyMgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUgcm9idXN0IGFnYWluc3QgZnV0dXJlIHVwZGF0ZXMuCisjIERveHlnZW4gd2lsbCBjb3B5IHRoZSBzdHlsZSBzaGVldCBmaWxlIHRvIHRoZSBvdXRwdXQgZGlyZWN0b3J5LiBGb3IgYW4gZXhhbXBsZQorIyBzZWUgdGhlIGRvY3VtZW50YXRpb24uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRVhUUkFfU1RZTEVTSEVFVCAgPSAKKworIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3IKKyMgb3RoZXIgc291cmNlIGZpbGVzIHdoaWNoIHNob3VsZCBiZSBjb3BpZWQgdG8gdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gTm90ZQorIyB0aGF0IHRoZXNlIGZpbGVzIHdpbGwgYmUgY29waWVkIHRvIHRoZSBiYXNlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeS4gVXNlIHRoZQorIyAkcmVscGF0aF4gbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQorIyBmaWxlcy4gSW4gdGhlIEhUTUxfU1RZTEVTSEVFVCBmaWxlLCB1c2UgdGhlIGZpbGUgbmFtZSBvbmx5LiBBbHNvIG5vdGUgdGhhdCB0aGUKKyMgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvciBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9FWFRSQV9GSUxFUyAgICAgICA9IAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfSFVFIHRhZyBjb250cm9scyB0aGUgY29sb3Igb2YgdGhlIEhUTUwgb3V0cHV0LiBEb3h5Z2VuCisjIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlc2hlZXQgYW5kIGJhY2tncm91bmQgaW1hZ2VzIGFjY29yZGluZyB0bworIyB0aGlzIGNvbG9yLiBIdWUgaXMgc3BlY2lmaWVkIGFzIGFuIGFuZ2xlIG9uIGEgY29sb3J3aGVlbCwgc2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLiBGb3IgaW5zdGFuY2UgdGhlIHZhbHVlCisjIDAgcmVwcmVzZW50cyByZWQsIDYwIGlzIHllbGxvdywgMTIwIGlzIGdyZWVuLCAxODAgaXMgY3lhbiwgMjQwIGlzIGJsdWUsIDMwMAorIyBwdXJwbGUsIGFuZCAzNjAgaXMgcmVkIGFnYWluLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAzNTksIGRlZmF1bHQgdmFsdWU6IDIyMC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0hVRSAgICA9IDIyMAorCisjIFRoZSBIVE1MX0NPTE9SU1RZTEVfU0FUIHRhZyBjb250cm9scyB0aGUgcHVyaXR5IChvciBzYXR1cmF0aW9uKSBvZiB0aGUgY29sb3JzCisjIGluIHRoZSBIVE1MIG91dHB1dC4gRm9yIGEgdmFsdWUgb2YgMCB0aGUgb3V0cHV0IHdpbGwgdXNlIGdyYXlzY2FsZXMgb25seS4gQQorIyB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjU1LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfQ09MT1JTVFlMRV9TQVQgICAgPSAxMDAKKworIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvIHRoZQorIyBsdW1pbmFuY2UgY29tcG9uZW50IG9mIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBWYWx1ZXMgYmVsb3cgMTAwCisjIGdyYWR1YWxseSBtYWtlIHRoZSBvdXRwdXQgbGlnaHRlciwgd2hlcmVhcyB2YWx1ZXMgYWJvdmUgMTAwIG1ha2UgdGhlIG91dHB1dAorIyBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsIHNvIDgwIHJlcHJlc2VudHMKKyMgYSBnYW1tYSBvZiAwLjgsIFRoZSB2YWx1ZSAyMjAgcmVwcmVzZW50cyBhIGdhbW1hIG9mIDIuMiwgYW5kIDEwMCBkb2VzIG5vdAorIyBjaGFuZ2UgdGhlIGdhbW1hLgorIyBNaW5pbXVtIHZhbHVlOiA0MCwgbWF4aW11bSB2YWx1ZTogMjQwLCBkZWZhdWx0IHZhbHVlOiA4MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwCisKKyMgSWYgdGhlIEhUTUxfVElNRVNUQU1QIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGZvb3RlciBvZiBlYWNoIGdlbmVyYXRlZCBIVE1MCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZyB0aGlzCisjIHRvIE5PIGNhbiBoZWxwIHdoZW4gY29tcGFyaW5nIHRoZSBvdXRwdXQgb2YgbXVsdGlwbGUgcnVucy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBIVE1MX0RZTkFNSUNfU0VDVElPTlMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZ2VuZXJhdGVkIEhUTUwKKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUKKyMgcGFnZSBoYXMgbG9hZGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfRFlOQU1JQ19TRUNUSU9OUyAgPSBOTworCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YgZW50cmllcworIyBzaG93biBpbiB0aGUgdmFyaW91cyB0cmVlIHN0cnVjdHVyZWQgaW5kaWNlcyBpbml0aWFsbHk7IHRoZSB1c2VyIGNhbiBleHBhbmQKKyMgYW5kIGNvbGxhcHNlIGVudHJpZXMgZHluYW1pY2FsbHkgbGF0ZXIgb24uIERveHlnZW4gd2lsbCBleHBhbmQgdGhlIHRyZWUgdG8KKyMgc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZSB2aXNpYmxlICh1bmxlc3MKKyMgYSBmdWxseSBjb2xsYXBzZWQgdHJlZSBhbHJlYWR5IGV4Y2VlZHMgdGhpcyBhbW91bnQpLiBTbyBzZXR0aW5nIHRoZSBudW1iZXIgb2YKKyMgZW50cmllcyAxIHdpbGwgcHJvZHVjZSBhIGZ1bGwgY29sbGFwc2VkIHRyZWUgYnkgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUKKyMgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzIGFuZCB3aWxsIHJlc3VsdCBpbiBhIGZ1bGwgZXhwYW5kZWQKKyMgdHJlZSBieSBkZWZhdWx0LgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiA5OTk5LCBkZWZhdWx0IHZhbHVlOiAxMDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0hUTUxfSU5ERVhfTlVNX0VOVFJJRVMgPSAxMDAKKworIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIEFwcGxlJ3MgWGNvZGUgMyBpbnRlZ3JhdGVkIGRldmVsb3BtZW50CisjIGVudmlyb25tZW50IChzZWU6IGh0dHA6Ly9kZXZlbG9wZXIuYXBwbGUuY29tL3Rvb2xzL3hjb2RlLyksIGludHJvZHVjZWQgd2l0aAorIyBPU1ggMTAuNSAoTGVvcGFyZCkuIFRvIGNyZWF0ZSBhIGRvY3VtZW50YXRpb24gc2V0LCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQorIyBNYWtlZmlsZSBpbiB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBSdW5uaW5nIG1ha2Ugd2lsbCBwcm9kdWNlIHRoZSBkb2NzZXQgaW4KKyMgdGhhdCBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgbWFrZSBpbnN0YWxsIHdpbGwgaW5zdGFsbCB0aGUgZG9jc2V0IGluCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZCBpdCBhdAorIyBzdGFydHVwLiBTZWUgaHR0cDovL2RldmVsb3Blci5hcHBsZS5jb20vdG9vbHMvY3JlYXRpbmdkb2NzZXRzd2l0aGRveHlnZW4uaHRtbAorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8KKworIyBUaGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZSBkb2NzZXQgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMKKyMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUgZG9jdW1lbnRhdGlvbiBzZXRzIGZyb20gYSBzaW5nbGUgcHJvdmlkZXIKKyMgKHN1Y2ggYXMgYSBjb21wYW55IG9yIHByb2R1Y3Qgc3VpdGUpIGNhbiBiZSBncm91cGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogRG94eWdlbiBnZW5lcmF0ZWQgZG9jcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfRkVFRE5BTUUgICAgICAgID0gIkRveHlnZW4gZ2VuZXJhdGVkIGRvY3MiCisKKyMgVGhpcyB0YWcgc3BlY2lmaWVzIGEgc3RyaW5nIHRoYXQgc2hvdWxkIHVuaXF1ZWx5IGlkZW50aWZ5IHRoZSBkb2N1bWVudGF0aW9uCisjIHNldCBidW5kbGUuIFRoaXMgc2hvdWxkIGJlIGEgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4KKyMgY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbiB3aWxsIGFwcGVuZCAuZG9jc2V0IHRvIHRoZSBuYW1lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogb3JnLmRveHlnZW4uUHJvamVjdC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIFRoZSBET0NTRVRfUFVCTElTSEVSX0lEIHRhZyBzcGVjaWZpZXMgYSBzdHJpbmcgdGhhdCBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkKKyMgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUgc3R5bGUKKyMgc3RyaW5nLCBlLmcuIGNvbS5teWNvbXBhbnkuTXlEb2NTZXQuZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0RPQ1NFVCBpcyBzZXQgdG8gWUVTLgorCitET0NTRVRfUFVCTElTSEVSX0lEICAgID0gb3JnLmRveHlnZW4uUHVibGlzaGVyCisKKyMgVGhlIERPQ1NFVF9QVUJMSVNIRVJfTkFNRSB0YWcgaWRlbnRpZmllcyB0aGUgZG9jdW1lbnRhdGlvbiBwdWJsaXNoZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBQdWJsaXNoZXIuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NTRVQgaXMgc2V0IHRvIFlFUy4KKworRE9DU0VUX1BVQkxJU0hFUl9OQU1FICA9IFB1Ymxpc2hlcgorCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gZ2VuZXJhdGVzIHRocmVlCisjIGFkZGl0aW9uYWwgSFRNTCBpbmRleCBmaWxlczogaW5kZXguaGhwLCBpbmRleC5oaGMsIGFuZCBpbmRleC5oaGsuIFRoZQorIyBpbmRleC5oaHAgaXMgYSBwcm9qZWN0IGZpbGUgdGhhdCBjYW4gYmUgcmVhZCBieSBNaWNyb3NvZnQncyBIVE1MIEhlbHAgV29ya3Nob3AKKyMgKHNlZTogaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL2VuLXVzL2Rvd25sb2FkL2RldGFpbHMuYXNweD9pZD0yMTEzOCkgb24KKyMgV2luZG93cy4KKyMKKyMgVGhlIEhUTUwgSGVscCBXb3Jrc2hvcCBjb250YWlucyBhIGNvbXBpbGVyIHRoYXQgY2FuIGNvbnZlcnQgYWxsIEhUTUwgb3V0cHV0CisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGludG8gYSBzaW5nbGUgY29tcGlsZWQgSFRNTCBmaWxlICguY2htKS4gQ29tcGlsZWQgSFRNTAorIyBmaWxlcyBhcmUgbm93IHVzZWQgYXMgdGhlIFdpbmRvd3MgOTggaGVscCBmb3JtYXQsIGFuZCB3aWxsIHJlcGxhY2UgdGhlIG9sZAorIyBXaW5kb3dzIGhlbHAgZm9ybWF0ICguaGxwKSBvbiBhbGwgV2luZG93cyBwbGF0Zm9ybXMgaW4gdGhlIGZ1dHVyZS4gQ29tcHJlc3NlZAorIyBIVE1MIGZpbGVzIGFsc28gY29udGFpbiBhbiBpbmRleCwgYSB0YWJsZSBvZiBjb250ZW50cywgYW5kIHlvdSBjYW4gc2VhcmNoIGZvcgorIyB3b3JkcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gVGhlIEhUTUwgd29ya3Nob3AgYWxzbyBjb250YWlucyBhIHZpZXdlciBmb3IKKyMgY29tcHJlc3NlZCBIVE1MIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0hUTUxIRUxQICAgICAgPSBOTworCisjIFRoZSBDSE1fRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobQorIyBmaWxlLiBZb3UgY2FuIGFkZCBhIHBhdGggaW4gZnJvbnQgb2YgdGhlIGZpbGUgaWYgdGhlIHJlc3VsdCBzaG91bGQgbm90IGJlCisjIHdyaXR0ZW4gdG8gdGhlIGh0bWwgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0NITV9GSUxFICAgICAgICAgICAgICAgPSAKKworIyBUaGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBsb2NhdGlvbiAoYWJzb2x1dGUgcGF0aAorIyBpbmNsdWRpbmcgZmlsZSBuYW1lKSBvZiB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyICggaGhjLmV4ZSkuIElmIG5vbi1lbXB0eQorIyBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biB0aGUgSFRNTCBoZWxwIGNvbXBpbGVyIG9uIHRoZSBnZW5lcmF0ZWQgaW5kZXguaGhwLgorIyBUaGUgZmlsZSBoYXMgdG8gYmUgc3BlY2lmaWVkIHdpdGggZnVsbCBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworSEhDX0xPQ0FUSU9OICAgICAgICAgICA9IAorCisjIFRoZSBHRU5FUkFURV9DSEkgZmxhZyBjb250cm9scyBpZiBhIHNlcGFyYXRlIC5jaGkgaW5kZXggZmlsZSBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIHRoYXQgaXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBtYXN0ZXIgLmNobSBmaWxlICggTk8pLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MSEVMUCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9DSEkgICAgICAgICAgID0gTk8KKworIyBUaGUgQ0hNX0lOREVYX0VOQ09ESU5HIGlzIHVzZWQgdG8gZW5jb2RlIEh0bWxIZWxwIGluZGV4ICggaGhrKSwgY29udGVudCAoIGhoYykKKyMgYW5kIHByb2plY3QgZmlsZSBjb250ZW50LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTEhFTFAgaXMgc2V0IHRvIFlFUy4KKworQ0hNX0lOREVYX0VOQ09ESU5HICAgICA9IAorCisjIFRoZSBCSU5BUllfVE9DIGZsYWcgY29udHJvbHMgd2hldGhlciBhIGJpbmFyeSB0YWJsZSBvZiBjb250ZW50cyBpcyBnZW5lcmF0ZWQgKAorIyBZRVMpIG9yIGEgbm9ybWFsIHRhYmxlIG9mIGNvbnRlbnRzICggTk8pIGluIHRoZSAuY2htIGZpbGUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTworCisjIFRoZSBUT0NfRVhQQU5EIGZsYWcgY2FuIGJlIHNldCB0byBZRVMgdG8gYWRkIGV4dHJhIGl0ZW1zIGZvciBncm91cCBtZW1iZXJzIHRvCisjIHRoZSB0YWJsZSBvZiBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUxIRUxQIGlzIHNldCB0byBZRVMuCisKK1RPQ19FWFBBTkQgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHRU5FUkFURV9RSFAgdGFnIGlzIHNldCB0byBZRVMgYW5kIGJvdGggUUhQX05BTUVTUEFDRSBhbmQKKyMgUUhQX1ZJUlRVQUxfRk9MREVSIGFyZSBzZXQsIGFuIGFkZGl0aW9uYWwgaW5kZXggZmlsZSB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0CisjIGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGEgUXQgQ29tcHJlc3NlZCBIZWxwCisjICgucWNoKSBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9RSFAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeQorIyB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLnFjaCBmaWxlLiBUaGUgcGF0aCBzcGVjaWZpZWQgaXMgcmVsYXRpdmUgdG8KKyMgdGhlIEhUTUwgb3V0cHV0IGZvbGRlci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRQ0hfRklMRSAgICAgICAgICAgICAgID0gCisKKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcgUXQgSGVscAorIyBQcm9qZWN0IG91dHB1dC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBOYW1lc3BhY2UKKyMgKHNlZTogaHR0cDovL3F0LXByb2plY3Qub3JnL2RvYy9xdC00LjgvcXRoZWxwcHJvamVjdC5odG1sI25hbWVzcGFjZSkuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBvcmcuZG94eWdlbi5Qcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUUhQIGlzIHNldCB0byBZRVMuCisKK1FIUF9OQU1FU1BBQ0UgICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0CisKKyMgVGhlIFFIUF9WSVJUVUFMX0ZPTERFUiB0YWcgc3BlY2lmaWVzIHRoZSBuYW1lc3BhY2UgdG8gdXNlIHdoZW4gZ2VuZXJhdGluZyBRdAorIyBIZWxwIFByb2plY3Qgb3V0cHV0LiBGb3IgbW9yZSBpbmZvcm1hdGlvbiBwbGVhc2Ugc2VlIFF0IEhlbHAgUHJvamVjdCAvIFZpcnR1YWwKKyMgRm9sZGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC0KKyMgZm9sZGVycykuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBkb2MuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYworCisjIElmIHRoZSBRSFBfQ1VTVF9GSUxURVJfTkFNRSB0YWcgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20KKyMgZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0gCisKKyMgVGhlIFFIUF9DVVNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIG9mIHRoZQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZSBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20KKyMgRmlsdGVycyAoc2VlOiBodHRwOi8vcXQtcHJvamVjdC5vcmcvZG9jL3F0LTQuOC9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLQorIyBmaWx0ZXJzKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSFBfQ1VTVF9GSUxURVJfQVRUUlMgID0gCisKKyMgVGhlIFFIUF9TRUNUX0ZJTFRFUl9BVFRSUyB0YWcgc3BlY2lmaWVzIHRoZSBsaXN0IG9mIHRoZSBhdHRyaWJ1dGVzIHRoaXMKKyMgcHJvamVjdCdzIGZpbHRlciBzZWN0aW9uIG1hdGNoZXMuIFF0IEhlbHAgUHJvamVjdCAvIEZpbHRlciBBdHRyaWJ1dGVzIChzZWU6CisjIGh0dHA6Ly9xdC1wcm9qZWN0Lm9yZy9kb2MvcXQtNC44L3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcykuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9RSFAgaXMgc2V0IHRvIFlFUy4KKworUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9IAorCisjIFRoZSBRSEdfTE9DQVRJT04gdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGxvY2F0aW9uIG9mIFF0J3MKKyMgcWhlbHBnZW5lcmF0b3IuIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUKKyMgZ2VuZXJhdGVkIC5xaHAgZmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1FIUCBpcyBzZXQgdG8gWUVTLgorCitRSEdfTE9DQVRJT04gICAgICAgICAgID0gCisKKyMgSWYgdGhlIEdFTkVSQVRFX0VDTElQU0VIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzIHdpbGwgYmUKKyMgZ2VuZXJhdGVkLCB0b2dldGhlciB3aXRoIHRoZSBIVE1MIGZpbGVzLCB0aGV5IGZvcm0gYW4gRWNsaXBzZSBoZWxwIHBsdWdpbi4gVG8KKyMgaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMgbWVudSBpbgorIyBFY2xpcHNlLCB0aGUgY29udGVudHMgb2YgdGhlIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgbmVlZHMKKyMgdG8gYmUgY29waWVkIGludG8gdGhlIHBsdWdpbnMgZGlyZWN0b3J5IG9mIGVjbGlwc2UuIFRoZSBuYW1lIG9mIHRoZSBkaXJlY3RvcnkKKyMgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhlIEVDTElQU0VfRE9DX0lEIHZhbHVlLgorIyBBZnRlciBjb3B5aW5nIEVjbGlwc2UgbmVlZHMgdG8gYmUgcmVzdGFydGVkIGJlZm9yZSB0aGUgaGVscCBhcHBlYXJzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX0VDTElQU0VIRUxQICAgPSBOTworCisjIEEgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoZSBFY2xpcHNlIGhlbHAgcGx1Z2luLiBXaGVuIGluc3RhbGxpbmcgdGhlIHBsdWdpbgorIyB0aGUgZGlyZWN0b3J5IG5hbWUgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MIGZpbGVzIHNob3VsZCBhbHNvIGhhdmUgdGhpcworIyBuYW1lLiBFYWNoIGRvY3VtZW50YXRpb24gc2V0IHNob3VsZCBoYXZlIGl0cyBvd24gaWRlbnRpZmllci4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IG9yZy5kb3h5Z2VuLlByb2plY3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9FQ0xJUFNFSEVMUCBpcyBzZXQgdG8gWUVTLgorCitFQ0xJUFNFX0RPQ19JRCAgICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdAorCisjIElmIHlvdSB3YW50IGZ1bGwgY29udHJvbCBvdmVyIHRoZSBsYXlvdXQgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIHBhZ2VzIGl0IG1pZ2h0CisjIGJlIG5lY2Vzc2FyeSB0byBkaXNhYmxlIHRoZSBpbmRleCBhbmQgcmVwbGFjZSBpdCB3aXRoIHlvdXIgb3duLiBUaGUKKyMgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykgYXQgdG9wCisjIG9mIGVhY2ggSFRNTCBwYWdlLiBBIHZhbHVlIG9mIE5PIGVuYWJsZXMgdGhlIGluZGV4IGFuZCB0aGUgdmFsdWUgWUVTIGRpc2FibGVzCisjIGl0LiBTaW5jZSB0aGUgdGFicyBpbiB0aGUgaW5kZXggY29udGFpbiB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgbmF2aWdhdGlvbgorIyB0cmVlLCB5b3UgY2FuIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgaWYgeW91IGFsc28gc2V0IEdFTkVSQVRFX1RSRUVWSUVXIHRvIFlFUy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitESVNBQkxFX0lOREVYICAgICAgICAgID0gTk8KKworIyBUaGUgR0VORVJBVEVfVFJFRVZJRVcgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGV0aGVyIGEgdHJlZS1saWtlIGluZGV4CisjIHN0cnVjdHVyZSBzaG91bGQgYmUgZ2VuZXJhdGVkIHRvIGRpc3BsYXkgaGllcmFyY2hpY2FsIGluZm9ybWF0aW9uLiBJZiB0aGUgdGFnCisjIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZCBjb250YWluaW5nIGEgdHJlZS1saWtlCisjIGluZGV4IHN0cnVjdHVyZSAoanVzdCBsaWtlIHRoZSBvbmUgdGhhdCBpcyBnZW5lcmF0ZWQgZm9yIEhUTUwgSGVscCkuIEZvciB0aGlzCisjIHRvIHdvcmsgYSBicm93c2VyIHRoYXQgc3VwcG9ydHMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkCisjIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuIFdpbmRvd3MgdXNlcnMgYXJlIHByb2JhYmx5IGJldHRlciBvZmYgdXNpbmcgdGhlCisjIEhUTUwgaGVscCBmZWF0dXJlLiBWaWEgY3VzdG9tIHN0eWxlc2hlZXRzIChzZWUgSFRNTF9FWFRSQV9TVFlMRVNIRUVUKSBvbmUgY2FuCisjIGZ1cnRoZXIgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBpbmRleC4gQXMgYW4gZXhhbXBsZSwgdGhlIGRlZmF1bHQgc3R5bGUKKyMgc2hlZXQgZ2VuZXJhdGVkIGJ5IGRveHlnZW4gaGFzIGFuIGV4YW1wbGUgdGhhdCBzaG93cyBob3cgdG8gcHV0IGFuIGltYWdlIGF0CisjIHRoZSByb290IG9mIHRoZSB0cmVlIGluc3RlYWQgb2YgdGhlIFBST0pFQ1RfTkFNRS4gU2luY2UgdGhlIHRyZWUgYmFzaWNhbGx5IGhhcworIyB0aGUgc2FtZSBpbmZvcm1hdGlvbiBhcyB0aGUgdGFiIGluZGV4LCB5b3UgY291bGQgY29uc2lkZXIgc2V0dGluZworIyBESVNBQkxFX0lOREVYIHRvIFlFUyB3aGVuIGVuYWJsaW5nIHRoaXMgb3B0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0dFTkVSQVRFX1RSRUVWSUVXICAgICAgPSBOTworCisjIFRoZSBFTlVNX1ZBTFVFU19QRVJfTElORSB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBudW1iZXIgb2YgZW51bSB2YWx1ZXMgdGhhdAorIyBkb3h5Z2VuIHdpbGwgZ3JvdXAgb24gb25lIGxpbmUgaW4gdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uCisjCisjIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtIHZhbHVlcyBmcm9tIGFwcGVhcmluZworIyBpbiB0aGUgb3ZlcnZpZXcgc2VjdGlvbi4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMjAsIGRlZmF1bHQgdmFsdWU6IDQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0VOVU1fVkFMVUVTX1BFUl9MSU5FICAgPSA0CisKKyMgSWYgdGhlIHRyZWV2aWV3IGlzIGVuYWJsZWQgKHNlZSBHRU5FUkFURV9UUkVFVklFVykgdGhlbiB0aGlzIHRhZyBjYW4gYmUgdXNlZAorIyB0byBzZXQgdGhlIGluaXRpYWwgd2lkdGggKGluIHBpeGVscykgb2YgdGhlIGZyYW1lIGluIHdoaWNoIHRoZSB0cmVlIGlzIHNob3duLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxNTAwLCBkZWZhdWx0IHZhbHVlOiAyNTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTAKKworIyBXaGVuIHRoZSBFWFRfTElOS1NfSU5fV0lORE9XIG9wdGlvbiBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBvcGVuIGxpbmtzIHRvCisjIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfSFRNTCBpcyBzZXQgdG8gWUVTLgorCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8KKworIyBVc2UgdGhpcyB0YWcgdG8gY2hhbmdlIHRoZSBmb250IHNpemUgb2YgTGFUZVggZm9ybXVsYXMgaW5jbHVkZWQgYXMgaW1hZ2VzIGluCisjIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bAorIyBkb3h5Z2VuIHJ1biB5b3UgbmVlZCB0byBtYW51YWxseSByZW1vdmUgYW55IGZvcm1fKi5wbmcgaW1hZ2VzIGZyb20gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB0byBmb3JjZSB0aGVtIHRvIGJlIHJlZ2VuZXJhdGVkLgorIyBNaW5pbXVtIHZhbHVlOiA4LCBtYXhpbXVtIHZhbHVlOiA1MCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9IVE1MIGlzIHNldCB0byBZRVMuCisKK0ZPUk1VTEFfRk9OVFNJWkUgICAgICAgPSAxMAorCisjIFVzZSB0aGUgRk9STVVMQV9UUkFOUEFSRU5UIHRhZyB0byBkZXRlcm1pbmUgd2hldGhlciBvciBub3QgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgZm9yIGZvcm11bGFzIGFyZSB0cmFuc3BhcmVudCBQTkdzLiBUcmFuc3BhcmVudCBQTkdzIGFyZSBub3QKKyMgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuCisjCisjIE5vdGUgdGhhdCB3aGVuIGNoYW5naW5nIHRoaXMgb3B0aW9uIHlvdSBuZWVkIHRvIGRlbGV0ZSBhbnkgZm9ybV8qLnBuZyBmaWxlcyBpbgorIyB0aGUgSFRNTCBvdXRwdXQgZGlyZWN0b3J5IGJlZm9yZSB0aGUgY2hhbmdlcyBoYXZlIGVmZmVjdC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUworCisjIEVuYWJsZSB0aGUgVVNFX01BVEhKQVggb3B0aW9uIHRvIHJlbmRlciBMYVRlWCBmb3JtdWxhcyB1c2luZyBNYXRoSmF4IChzZWUKKyMgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUgcmVuZGVyaW5nCisjIGluc3RlYWQgb2YgdXNpbmcgcHJlcmVuZGVyZWQgYml0bWFwcy4gVXNlIHRoaXMgaWYgeW91IGRvIG5vdCBoYXZlIExhVGVYCisjIGluc3RhbGxlZCBvciBpZiB5b3Ugd2FudCB0byBmb3JtdWxhcyBsb29rIHByZXR0aWVyIGluIHRoZSBIVE1MIG91dHB1dC4gV2hlbgorIyBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZCBjb25maWd1cmUgdGhlIHBhdGgKKyMgdG8gaXQgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworVVNFX01BVEhKQVggICAgICAgICAgICA9IE5PCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IGNhbiBzZXQgdGhlIGRlZmF1bHQgb3V0cHV0IGZvcm1hdCB0byBiZSB1c2VkIGZvcgorIyB0aGUgTWF0aEpheCBvdXRwdXQuIFNlZSB0aGUgTWF0aEpheCBzaXRlIChzZWU6CisjIGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4KKyMgUG9zc2libGUgdmFsdWVzIGFyZTogSFRNTC1DU1MgKHdoaWNoIGlzIHNsb3dlciwgYnV0IGhhcyB0aGUgYmVzdAorIyBjb21wYXRpYmlsaXR5KSwgTmF0aXZlTU1MIChpLmUuIE1hdGhNTCkgYW5kIFNWRy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhUTUwtQ1NTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9GT1JNQVQgICAgICAgICA9IEhUTUwtQ1NTCisKKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlIEhUTUwKKyMgb3V0cHV0IGRpcmVjdG9yeSB1c2luZyB0aGUgTUFUSEpBWF9SRUxQQVRIIG9wdGlvbi4gVGhlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeQorIyBzaG91bGQgY29udGFpbiB0aGUgTWF0aEpheC5qcyBzY3JpcHQuIEZvciBpbnN0YW5jZSwgaWYgdGhlIG1hdGhqYXggZGlyZWN0b3J5CisjIGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbgorIyBNQVRISkFYX1JFTFBBVEggc2hvdWxkIGJlIC4uL21hdGhqYXguIFRoZSBkZWZhdWx0IHZhbHVlIHBvaW50cyB0byB0aGUgTWF0aEpheAorIyBDb250ZW50IERlbGl2ZXJ5IE5ldHdvcmsgc28geW91IGNhbiBxdWlja2x5IHNlZSB0aGUgcmVzdWx0IHdpdGhvdXQgaW5zdGFsbGluZworIyBNYXRoSmF4LiBIb3dldmVyLCBpdCBpcyBzdHJvbmdseSByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGEgbG9jYWwgY29weSBvZgorIyBNYXRoSmF4IGZyb20gaHR0cDovL3d3dy5tYXRoamF4Lm9yZyBiZWZvcmUgZGVwbG95bWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IGh0dHA6Ly9jZG4ubWF0aGpheC5vcmcvbWF0aGpheC9sYXRlc3QuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX1JFTFBBVEggICAgICAgID0gaHR0cDovL2Nkbi5tYXRoamF4Lm9yZy9tYXRoamF4L2xhdGVzdAorCisjIFRoZSBNQVRISkFYX0VYVEVOU0lPTlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTWF0aEpheAorIyBleHRlbnNpb24gbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuIEZvciBleGFtcGxlCisjIE1BVEhKQVhfRVhURU5TSU9OUyA9IFRlWC9BTVNtYXRoIFRlWC9BTVNzeW1ib2xzCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBVU0VfTUFUSEpBWCBpcyBzZXQgdG8gWUVTLgorCitNQVRISkFYX0VYVEVOU0lPTlMgICAgID0gCisKKyMgVGhlIE1BVEhKQVhfQ09ERUZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHdpdGggamF2YXNjcmlwdCBwaWVjZXMKKyMgb2YgY29kZSB0aGF0IHdpbGwgYmUgdXNlZCBvbiBzdGFydHVwIG9mIHRoZSBNYXRoSmF4IGNvZGUuIFNlZSB0aGUgTWF0aEpheCBzaXRlCisjIChzZWU6IGh0dHA6Ly9kb2NzLm1hdGhqYXgub3JnL2VuL2xhdGVzdC9vdXRwdXQuaHRtbCkgZm9yIG1vcmUgZGV0YWlscy4gRm9yIGFuCisjIGV4YW1wbGUgc2VlIHRoZSBkb2N1bWVudGF0aW9uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgVVNFX01BVEhKQVggaXMgc2V0IHRvIFlFUy4KKworTUFUSEpBWF9DT0RFRklMRSAgICAgICA9IAorCisjIFdoZW4gdGhlIFNFQVJDSEVOR0lORSB0YWcgaXMgZW5hYmxlZCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzZWFyY2ggYm94IGZvcgorIyB0aGUgSFRNTCBvdXRwdXQuIFRoZSB1bmRlcmx5aW5nIHNlYXJjaCBlbmdpbmUgdXNlcyBqYXZhc2NyaXB0IGFuZCBESFRNTCBhbmQKKyMgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZyBIVE1MIGhlbHAKKyMgKEdFTkVSQVRFX0hUTUxIRUxQKSwgUXQgaGVscCAoR0VORVJBVEVfUUhQKSwgb3IgZG9jc2V0cyAoR0VORVJBVEVfRE9DU0VUKQorIyB0aGVyZSBpcyBhbHJlYWR5IGEgc2VhcmNoIGZ1bmN0aW9uIHNvIHRoaXMgb25lIHNob3VsZCB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuCisjIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lIGNhbiBiZSBzbG93LCB0aGVuCisjIGVuYWJsaW5nIFNFUlZFUl9CQVNFRF9TRUFSQ0ggbWF5IHByb3ZpZGUgYSBiZXR0ZXIgc29sdXRpb24uIEl0IGlzIHBvc3NpYmxlIHRvCisjIHNlYXJjaCB1c2luZyB0aGUga2V5Ym9hcmQ7IHRvIGp1bXAgdG8gdGhlIHNlYXJjaCBib3ggdXNlIDxhY2Nlc3Mga2V5PiArIFMKKyMgKHdoYXQgdGhlIDxhY2Nlc3Mga2V5PiBpcyBkZXBlbmRzIG9uIHRoZSBPUyBhbmQgYnJvd3NlciwgYnV0IGl0IGlzIHR5cGljYWxseQorIyA8Q1RSTD4sIDxBTFQ+LzxvcHRpb24+LCBvciBib3RoKS4gSW5zaWRlIHRoZSBzZWFyY2ggYm94IHVzZSB0aGUgPGN1cnNvciBkb3duCisjIGtleT4gdG8ganVtcCBpbnRvIHRoZSBzZWFyY2ggcmVzdWx0cyB3aW5kb3csIHRoZSByZXN1bHRzIGNhbiBiZSBuYXZpZ2F0ZWQKKyMgdXNpbmcgdGhlIDxjdXJzb3Iga2V5cz4uIFByZXNzIDxFbnRlcj4gdG8gc2VsZWN0IGFuIGl0ZW0gb3IgPGVzY2FwZT4gdG8gY2FuY2VsCisjIHRoZSBzZWFyY2guIFRoZSBmaWx0ZXIgb3B0aW9ucyBjYW4gYmUgc2VsZWN0ZWQgd2hlbiB0aGUgY3Vyc29yIGlzIGluc2lkZSB0aGUKKyMgc2VhcmNoIGJveCBieSBwcmVzc2luZyA8U2hpZnQ+KzxjdXJzb3IgZG93bj4uIEFsc28gaGVyZSB1c2UgdGhlIDxjdXJzb3Iga2V5cz4KKyMgdG8gc2VsZWN0IGEgZmlsdGVyIGFuZCA8RW50ZXI+IG9yIDxlc2NhcGU+IHRvIGFjdGl2YXRlIG9yIGNhbmNlbCB0aGUgZmlsdGVyCisjIG9wdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0hUTUwgaXMgc2V0IHRvIFlFUy4KKworU0VBUkNIRU5HSU5FICAgICAgICAgICA9IFlFUworCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQorIyBpbXBsZW1lbnRlZCB1c2luZyBhIHdlYiBzZXJ2ZXIgaW5zdGVhZCBvZiBhIHdlYiBjbGllbnQgdXNpbmcgSmF2YXNjcmlwdC4gVGhlcmUKKyMgYXJlIHR3byBmbGF2b3VycyBvZiB3ZWIgc2VydmVyIGJhc2VkIHNlYXJjaGluZyBkZXBlbmRpbmcgb24gdGhlCisjIEVYVEVSTkFMX1NFQVJDSCBzZXR0aW5nLiBXaGVuIGRpc2FibGVkLCBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBQSFAgc2NyaXB0IGZvcgorIyBzZWFyY2hpbmcgYW5kIGFuIGluZGV4IGZpbGUgdXNlZCBieSB0aGUgc2NyaXB0LiBXaGVuIEVYVEVSTkFMX1NFQVJDSCBpcworIyBlbmFibGVkIHRoZSBpbmRleGluZyBhbmQgc2VhcmNoaW5nIG5lZWRzIHRvIGJlIHByb3ZpZGVkIGJ5IGV4dGVybmFsIHRvb2xzLiBTZWUKKyMgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZCBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBTRUFSQ0hFTkdJTkUgaXMgc2V0IHRvIFlFUy4KKworU0VSVkVSX0JBU0VEX1NFQVJDSCAgICA9IE5PCisKKyMgV2hlbiBFWFRFUk5BTF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIG5vIGxvbmdlciBnZW5lcmF0ZSB0aGUgUEhQCisjIHNjcmlwdCBmb3Igc2VhcmNoaW5nLiBJbnN0ZWFkIHRoZSBzZWFyY2ggcmVzdWx0cyBhcmUgd3JpdHRlbiB0byBhbiBYTUwgZmlsZQorIyB3aGljaCBuZWVkcyB0byBiZSBwcm9jZXNzZWQgYnkgYW4gZXh0ZXJuYWwgaW5kZXhlci4gRG94eWdlbiB3aWxsIGludm9rZSBhbgorIyBleHRlcm5hbCBzZWFyY2ggZW5naW5lIHBvaW50ZWQgdG8gYnkgdGhlIFNFQVJDSEVOR0lORV9VUkwgb3B0aW9uIHRvIG9idGFpbiB0aGUKKyMgc2VhcmNoIHJlc3VsdHMuCisjCisjIERveHlnZW4gc2hpcHMgd2l0aCBhbiBleGFtcGxlIGluZGV4ZXIgKCBkb3h5aW5kZXhlcikgYW5kIHNlYXJjaCBlbmdpbmUKKyMgKGRveHlzZWFyY2guY2dpKSB3aGljaCBhcmUgYmFzZWQgb24gdGhlIG9wZW4gc291cmNlIHNlYXJjaCBlbmdpbmUgbGlicmFyeQorIyBYYXBpYW4gKHNlZTogaHR0cDovL3hhcGlhbi5vcmcvKS4KKyMKKyMgU2VlIHRoZSBzZWN0aW9uICJFeHRlcm5hbCBJbmRleGluZyBhbmQgU2VhcmNoaW5nIiBmb3IgZGV0YWlscy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSCAgICAgICAgPSBOTworCisjIFRoZSBTRUFSQ0hFTkdJTkVfVVJMIHNob3VsZCBwb2ludCB0byBhIHNlYXJjaCBlbmdpbmUgaG9zdGVkIGJ5IGEgd2ViIHNlcnZlcgorIyB3aGljaCB3aWxsIHJldHVybiB0aGUgc2VhcmNoIHJlc3VsdHMgd2hlbiBFWFRFUk5BTF9TRUFSQ0ggaXMgZW5hYmxlZC4KKyMKKyMgRG94eWdlbiBzaGlwcyB3aXRoIGFuIGV4YW1wbGUgaW5kZXhlciAoIGRveHlpbmRleGVyKSBhbmQgc2VhcmNoIGVuZ2luZQorIyAoZG94eXNlYXJjaC5jZ2kpIHdoaWNoIGFyZSBiYXNlZCBvbiB0aGUgb3BlbiBzb3VyY2Ugc2VhcmNoIGVuZ2luZSBsaWJyYXJ5CisjIFhhcGlhbiAoc2VlOiBodHRwOi8veGFwaWFuLm9yZy8pLiBTZWUgdGhlIHNlY3Rpb24gIkV4dGVybmFsIEluZGV4aW5nIGFuZAorIyBTZWFyY2hpbmciIGZvciBkZXRhaWxzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSEVOR0lORV9VUkwgICAgICAgPSAKKworIyBXaGVuIFNFUlZFUl9CQVNFRF9TRUFSQ0ggYW5kIEVYVEVSTkFMX1NFQVJDSCBhcmUgYm90aCBlbmFibGVkIHRoZSB1bmluZGV4ZWQKKyMgc2VhcmNoIGRhdGEgaXMgd3JpdHRlbiB0byBhIGZpbGUgZm9yIGluZGV4aW5nIGJ5IGFuIGV4dGVybmFsIHRvb2wuIFdpdGggdGhlCisjIFNFQVJDSERBVEFfRklMRSB0YWcgdGhlIG5hbWUgb2YgdGhpcyBmaWxlIGNhbiBiZSBzcGVjaWZpZWQuCisjIFRoZSBkZWZhdWx0IGZpbGUgaXM6IHNlYXJjaGRhdGEueG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK1NFQVJDSERBVEFfRklMRSAgICAgICAgPSBzZWFyY2hkYXRhLnhtbAorCisjIFdoZW4gU0VSVkVSX0JBU0VEX1NFQVJDSCBhbmQgRVhURVJOQUxfU0VBUkNIIGFyZSBib3RoIGVuYWJsZWQgdGhlCisjIEVYVEVSTkFMX1NFQVJDSF9JRCB0YWcgY2FuIGJlIHVzZWQgYXMgYW4gaWRlbnRpZmllciBmb3IgdGhlIHByb2plY3QuIFRoaXMgaXMKKyMgdXNlZnVsIGluIGNvbWJpbmF0aW9uIHdpdGggRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRvIHNlYXJjaCB0aHJvdWdoIG11bHRpcGxlCisjIHByb2plY3RzIGFuZCByZWRpcmVjdCB0aGUgcmVzdWx0cyBiYWNrIHRvIHRoZSByaWdodCBwcm9qZWN0LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVEVSTkFMX1NFQVJDSF9JRCAgICAgPSAKKworIyBUaGUgRVhUUkFfU0VBUkNIX01BUFBJTkdTIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgc2VhcmNoaW5nIHRocm91Z2ggZG94eWdlbgorIyBwcm9qZWN0cyBvdGhlciB0aGFuIHRoZSBvbmUgZGVmaW5lZCBieSB0aGlzIGNvbmZpZ3VyYXRpb24gZmlsZSwgYnV0IHRoYXQgYXJlCisjIGFsbCBhZGRlZCB0byB0aGUgc2FtZSBleHRlcm5hbCBzZWFyY2ggaW5kZXguIEVhY2ggcHJvamVjdCBuZWVkcyB0byBoYXZlIGEKKyMgdW5pcXVlIGlkIHNldCB2aWEgRVhURVJOQUxfU0VBUkNIX0lELiBUaGUgc2VhcmNoIG1hcHBpbmcgdGhlbiBtYXBzIHRoZSBpZCBvZgorIyB0byBhIHJlbGF0aXZlIGxvY2F0aW9uIHdoZXJlIHRoZSBkb2N1bWVudGF0aW9uIGNhbiBiZSBmb3VuZC4gVGhlIGZvcm1hdCBpczoKKyMgRVhUUkFfU0VBUkNIX01BUFBJTkdTID0gdGFnbmFtZTE9bG9jMSB0YWduYW1lMj1sb2MyIC4uLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgU0VBUkNIRU5HSU5FIGlzIHNldCB0byBZRVMuCisKK0VYVFJBX1NFQVJDSF9NQVBQSU5HUyAgPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBMYVRlWCBvdXRwdXQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0dFTkVSQVRFX0xBVEVYICAgICAgICAgPSBZRVMKKworIyBUaGUgTEFURVhfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIExhVGVYIGRvY3Mgd2lsbCBiZSBwdXQuIElmIGEKKyMgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluIGZyb250IG9mCisjIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGxhdGV4LgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfT1VUUFVUICAgICAgICAgICA9IGxhdGV4CisKKyMgVGhlIExBVEVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBMYVRlWCBjb21tYW5kIG5hbWUgdG8gYmUKKyMgaW52b2tlZC4KKyMKKyMgTm90ZSB0aGF0IHdoZW4gZW5hYmxpbmcgVVNFX1BERkxBVEVYIHRoaXMgb3B0aW9uIGlzIG9ubHkgdXNlZCBmb3IgZ2VuZXJhdGluZworIyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlIE1ha2VmaWxlIHRoYXQgaXMKKyMgd3JpdHRlbiB0byB0aGUgb3V0cHV0IGRpcmVjdG9yeS4KKyMgVGhlIGRlZmF1bHQgZmlsZSBpczogbGF0ZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9DTURfTkFNRSAgICAgICAgID0gbGF0ZXgKKworIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8gZ2VuZXJhdGUKKyMgaW5kZXggZm9yIExhVGVYLgorIyBUaGUgZGVmYXVsdCBmaWxlIGlzOiBtYWtlaW5kZXguCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4CisKKyMgSWYgdGhlIENPTVBBQ1RfTEFURVggdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiBnZW5lcmF0ZXMgbW9yZSBjb21wYWN0IExhVGVYCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTworCisjIFRoZSBQQVBFUl9UWVBFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHBhcGVyIHR5cGUgdGhhdCBpcyB1c2VkIGJ5IHRoZQorIyBwcmludGVyLgorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCAoMjEwIHggMjk3IG1tKSwgbGV0dGVyICg4LjUgeCAxMSBpbmNoZXMpLCBsZWdhbCAoOC41IHgKKyMgMTQgaW5jaGVzKSBhbmQgZXhlY3V0aXZlICg3LjI1IHggMTAuNSBpbmNoZXMpLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogYTQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQQVBFUl9UWVBFICAgICAgICAgICAgID0gYTQKKworIyBUaGUgRVhUUkFfUEFDS0FHRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgTGFUZVggcGFja2FnZSBuYW1lcworIyB0aGF0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgTGFUZVggb3V0cHV0LiBUbyBnZXQgdGhlIHRpbWVzIGZvbnQgZm9yCisjIGluc3RhbmNlIHlvdSBjYW4gc3BlY2lmeQorIyBFWFRSQV9QQUNLQUdFUz10aW1lcworIyBJZiBsZWZ0IGJsYW5rIG5vIGV4dHJhIHBhY2thZ2VzIHdpbGwgYmUgaW5jbHVkZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitFWFRSQV9QQUNLQUdFUyAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGhlYWRlciBmb3IgdGhlCisjIGdlbmVyYXRlZCBMYVRlWCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsIHRoZSBmaXJzdAorIyBjaGFwdGVyLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIHN0YW5kYXJkIGhlYWRlci4gU2VlCisjIHNlY3Rpb24gIkRveHlnZW4gdXNhZ2UiIGZvciBpbmZvcm1hdGlvbiBvbiBob3cgdG8gbGV0IGRveHlnZW4gd3JpdGUgdGhlCisjIGRlZmF1bHQgaGVhZGVyIHRvIGEgc2VwYXJhdGUgZmlsZS4KKyMKKyMgTm90ZTogT25seSB1c2UgYSB1c2VyLWRlZmluZWQgaGVhZGVyIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyEgVGhlCisjIGZvbGxvd2luZyBjb21tYW5kcyBoYXZlIGEgc3BlY2lhbCBtZWFuaW5nIGluc2lkZSB0aGUgaGVhZGVyOiAkdGl0bGUsCisjICRkYXRldGltZSwgJGRhdGUsICRkb3h5Z2VudmVyc2lvbiwgJHByb2plY3RuYW1lLCAkcHJvamVjdG51bWJlci4gRG94eWdlbiB3aWxsCisjIHJlcGxhY2UgdGhlbSBieSByZXNwZWN0aXZlbHkgdGhlIHRpdGxlIG9mIHRoZSBwYWdlLCB0aGUgY3VycmVudCBkYXRlIGFuZCB0aW1lLAorIyBvbmx5IHRoZSBjdXJyZW50IGRhdGUsIHRoZSB2ZXJzaW9uIG51bWJlciBvZiBkb3h5Z2VuLCB0aGUgcHJvamVjdCBuYW1lIChzZWUKKyMgUFJPSkVDVF9OQU1FKSwgb3IgdGhlIHByb2plY3QgbnVtYmVyIChzZWUgUFJPSkVDVF9OVU1CRVIpLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTEFURVggaXMgc2V0IHRvIFlFUy4KKworTEFURVhfSEVBREVSICAgICAgICAgICA9IGRvYy9kb3h5Z2VuL2hlYWRlci50ZXgKKworIyBUaGUgTEFURVhfRk9PVEVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggZm9vdGVyIGZvciB0aGUKKyMgZ2VuZXJhdGVkIExhVGVYIGRvY3VtZW50LiBUaGUgZm9vdGVyIHNob3VsZCBjb250YWluIGV2ZXJ5dGhpbmcgYWZ0ZXIgdGhlIGxhc3QKKyMgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYSBzdGFuZGFyZCBmb290ZXIuCisjCisjIE5vdGU6IE9ubHkgdXNlIGEgdXNlci1kZWZpbmVkIGZvb3RlciBpZiB5b3Uga25vdyB3aGF0IHlvdSBhcmUgZG9pbmchCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9GT09URVIgICAgICAgICAgID0gCisKKyMgVGhlIExBVEVYX0VYVFJBX0ZJTEVTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGV4dHJhIGltYWdlcyBvcgorIyBvdGhlciBzb3VyY2UgZmlsZXMgd2hpY2ggc2hvdWxkIGJlIGNvcGllZCB0byB0aGUgTEFURVhfT1VUUFVUIG91dHB1dAorIyBkaXJlY3RvcnkuIE5vdGUgdGhhdCB0aGUgZmlsZXMgd2lsbCBiZSBjb3BpZWQgYXMtaXM7IHRoZXJlIGFyZSBubyBjb21tYW5kcyBvcgorIyBtYXJrZXJzIGF2YWlsYWJsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0VYVFJBX0ZJTEVTICAgICAgPSAKKworIyBJZiB0aGUgUERGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBMYVRlWCB0aGF0IGlzIGdlbmVyYXRlZCBpcworIyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBQREYgKHVzaW5nIHBzMnBkZiBvciBwZGZsYXRleCkuIFRoZSBQREYgZmlsZSB3aWxsCisjIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTCBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzCisjIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZSBicm93c2luZyB1c2luZyBhIFBERiB2aWV3ZXIuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitQREZfSFlQRVJMSU5LUyAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIExBVEVYX1BERkxBVEVYIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgdXNlIHBkZmxhdGV4IHRvIGdlbmVyYXRlCisjIHRoZSBQREYgZmlsZSBkaXJlY3RseSBmcm9tIHRoZSBMYVRlWCBmaWxlcy4gU2V0IHRoaXMgb3B0aW9uIHRvIFlFUyB0byBnZXQgYQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK1VTRV9QREZMQVRFWCAgICAgICAgICAgPSBZRVMKKworIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcYmF0Y2htb2RlCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXAgcnVubmluZworIyBpZiBlcnJvcnMgb2NjdXIsIGluc3RlYWQgb2YgYXNraW5nIHRoZSB1c2VyIGZvciBoZWxwLiBUaGlzIG9wdGlvbiBpcyBhbHNvIHVzZWQKKyMgd2hlbiBnZW5lcmF0aW5nIGZvcm11bGFzIGluIEhUTUwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX0xBVEVYIGlzIHNldCB0byBZRVMuCisKK0xBVEVYX0JBVENITU9ERSAgICAgICAgPSBOTworCisjIElmIHRoZSBMQVRFWF9ISURFX0lORElDRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgbm90IGluY2x1ZGUgdGhlCisjIGluZGV4IGNoYXB0ZXJzIChzdWNoIGFzIEZpbGUgSW5kZXgsIENvbXBvdW5kIEluZGV4LCBldGMuKSBpbiB0aGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9ISURFX0lORElDRVMgICAgID0gTk8KKworIyBJZiB0aGUgTEFURVhfU09VUkNFX0NPREUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgaW5jbHVkZSBzb3VyY2UKKyMgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4KKyMKKyMgTm90ZSB0aGF0IHdoaWNoIHNvdXJjZXMgYXJlIHNob3duIGFsc28gZGVwZW5kcyBvbiBvdGhlciBzZXR0aW5ncyBzdWNoIGFzCisjIFNPVVJDRV9CUk9XU0VSLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9TT1VSQ0VfQ09ERSAgICAgID0gTk8KKworIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQorIyBiaWJsaW9ncmFwaHksIGUuZy4gcGxhaW5uYXQsIG9yIGllZWV0ci4gU2VlCisjIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvQmliVGVYIGFuZCBcY2l0ZSBmb3IgbW9yZSBpbmZvLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogcGxhaW4uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9MQVRFWCBpcyBzZXQgdG8gWUVTLgorCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQuIFRoZQorIyBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHRvbyBwcmV0dHkgd2l0aCBvdGhlciBSVEYKKyMgcmVhZGVycy9lZGl0b3JzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1JURiAgICAgICAgICAgPSBOTworCisjIFRoZSBSVEZfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFJURiBkb2NzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4KKyMgVGhlIGRlZmF1bHQgZGlyZWN0b3J5IGlzOiBydGYuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9SVEYgaXMgc2V0IHRvIFlFUy4KKworUlRGX09VVFBVVCAgICAgICAgICAgICA9IHJ0ZgorCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBkb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QgUlRGCisjIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8gc2F2ZSBzb21lCisjIHRyZWVzIGluIGdlbmVyYWwuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgUlRGX0hZUEVSTElOS1MgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBSVEYgdGhhdCBpcyBnZW5lcmF0ZWQgd2lsbAorIyBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsIGNvbnRhaW4gbGlua3MgKGp1c3QgbGlrZSB0aGUgSFRNTAorIyBvdXRwdXQpIGluc3RlYWQgb2YgcGFnZSByZWZlcmVuY2VzLiBUaGlzIG1ha2VzIHRoZSBvdXRwdXQgc3VpdGFibGUgZm9yIG9ubGluZQorIyBicm93c2luZyB1c2luZyBXb3JkIG9yIHNvbWUgb3RoZXIgV29yZCBjb21wYXRpYmxlIHJlYWRlcnMgdGhhdCBzdXBwb3J0IHRob3NlCisjIGZpZWxkcy4KKyMKKyMgTm90ZTogV29yZFBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfSFlQRVJMSU5LUyAgICAgICAgID0gTk8KKworIyBMb2FkIHN0eWxlc2hlZXQgZGVmaW5pdGlvbnMgZnJvbSBmaWxlLiBTeW50YXggaXMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnCisjIGZpbGUsIGkuZS4gYSBzZXJpZXMgb2YgYXNzaWdubWVudHMuIFlvdSBvbmx5IGhhdmUgdG8gcHJvdmlkZSByZXBsYWNlbWVudHMsCisjIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLgorIworIyBTZWUgYWxzbyBzZWN0aW9uICJEb3h5Z2VuIHVzYWdlIiBmb3IgaW5mb3JtYXRpb24gb24gaG93IHRvIGdlbmVyYXRlIHRoZQorIyBkZWZhdWx0IHN0eWxlIHNoZWV0IHRoYXQgZG94eWdlbiBub3JtYWxseSB1c2VzLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfUlRGIGlzIHNldCB0byBZRVMuCisKK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPSAKKworIyBTZXQgb3B0aW9uYWwgdmFyaWFibGVzIHVzZWQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYW4gUlRGIGRvY3VtZW50LiBTeW50YXggaXMKKyMgc2ltaWxhciB0byBkb3h5Z2VuJ3MgY29uZmlnIGZpbGUuIEEgdGVtcGxhdGUgZXh0ZW5zaW9ucyBmaWxlIGNhbiBiZSBnZW5lcmF0ZWQKKyMgdXNpbmcgZG94eWdlbiAtZSBydGYgZXh0ZW5zaW9uRmlsZS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1JURiBpcyBzZXQgdG8gWUVTLgorCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0gCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIG1hbiBwYWdlIG91dHB1dAorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIElmIHRoZSBHRU5FUkFURV9NQU4gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG1hbiBwYWdlcyBmb3IKKyMgY2xhc3NlcyBhbmQgZmlsZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PCisKKyMgVGhlIE1BTl9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgbWFuIHBhZ2VzIHdpbGwgYmUgcHV0LiBJZiBhCisjIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlIHB1dCBpbiBmcm9udCBvZgorIyBpdC4gQSBkaXJlY3RvcnkgbWFuMyB3aWxsIGJlIGNyZWF0ZWQgaW5zaWRlIHRoZSBkaXJlY3Rvcnkgc3BlY2lmaWVkIGJ5CisjIE1BTl9PVVRQVVQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogbWFuLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfTUFOIGlzIHNldCB0byBZRVMuCisKK01BTl9PVVRQVVQgICAgICAgICAgICAgPSBtYW4KKworIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8gdGhlIGdlbmVyYXRlZAorIyBtYW4gcGFnZXMuIEluIGNhc2UgdGhlIG1hbnVhbCBzZWN0aW9uIGRvZXMgbm90IHN0YXJ0IHdpdGggYSBudW1iZXIsIHRoZSBudW1iZXIKKyMgMyBpcyBwcmVwZW5kZWQuIFRoZSBkb3QgKC4pIGF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIE1BTl9FWFRFTlNJT04gdGFnIGlzCisjIG9wdGlvbmFsLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogLjMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0VYVEVOU0lPTiAgICAgICAgICA9IC4zCisKKyMgSWYgdGhlIE1BTl9MSU5LUyB0YWcgaXMgc2V0IHRvIFlFUyBhbmQgZG94eWdlbiBnZW5lcmF0ZXMgbWFuIG91dHB1dCwgdGhlbiBpdAorIyB3aWxsIGdlbmVyYXRlIG9uZSBhZGRpdGlvbmFsIG1hbiBmaWxlIGZvciBlYWNoIGVudGl0eSBkb2N1bWVudGVkIGluIHRoZSByZWFsCisjIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzIG9ubHkgc291cmNlIHRoZSByZWFsIG1hbiBwYWdlLCBidXQgd2l0aG91dAorIyB0aGVtIHRoZSBtYW4gY29tbWFuZCB3b3VsZCBiZSB1bmFibGUgdG8gZmluZCB0aGUgY29ycmVjdCBwYWdlLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9NQU4gaXMgc2V0IHRvIFlFUy4KKworTUFOX0xJTktTICAgICAgICAgICAgICA9IE5PCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFhNTCBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfWE1MIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhbiBYTUwgZmlsZSB0aGF0CisjIGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTworCisjIFRoZSBYTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIFhNTCBwYWdlcyB3aWxsIGJlIHB1dC4gSWYgYQorIyByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZSBwdXQgaW4gZnJvbnQgb2YKKyMgaXQuCisjIFRoZSBkZWZhdWx0IGRpcmVjdG9yeSBpczogeG1sLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgR0VORVJBVEVfWE1MIGlzIHNldCB0byBZRVMuCisKK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwKKworIyBUaGUgWE1MX1NDSEVNQSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIFhNTCBzY2hlbWEsIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEKKyMgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZSBzeW50YXggb2YgdGhlIFhNTCBmaWxlcy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfU0NIRU1BICAgICAgICAgICAgID0gCisKKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBYTUwgRFRELCB3aGljaCBjYW4gYmUgdXNlZCBieSBhCisjIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9YTUwgaXMgc2V0IHRvIFlFUy4KKworWE1MX0RURCAgICAgICAgICAgICAgICA9IAorCisjIElmIHRoZSBYTUxfUFJPR1JBTUxJU1RJTkcgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGR1bXAgdGhlIHByb2dyYW0KKyMgbGlzdGluZ3MgKGluY2x1ZGluZyBzeW50YXggaGlnaGxpZ2h0aW5nIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8KKyMgdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZSB0aGUgc2l6ZQorIyBvZiB0aGUgWE1MIG91dHB1dC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEdFTkVSQVRFX1hNTCBpcyBzZXQgdG8gWUVTLgorCitYTUxfUFJPR1JBTUxJU1RJTkcgICAgID0gWUVTCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIERPQ0JPT0sgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX0RPQ0JPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIERvY2Jvb2sgZmlsZXMKKyMgdGhhdCBjYW4gYmUgdXNlZCB0byBnZW5lcmF0ZSBQREYuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKworR0VORVJBVEVfRE9DQk9PSyAgICAgICA9IE5PCisKKyMgVGhlIERPQ0JPT0tfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIERvY2Jvb2sgcGFnZXMgd2lsbCBiZSBwdXQuCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUgcHV0IGluCisjIGZyb250IG9mIGl0LgorIyBUaGUgZGVmYXVsdCBkaXJlY3RvcnkgaXM6IGRvY2Jvb2suCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9ET0NCT09LIGlzIHNldCB0byBZRVMuCisKK0RPQ0JPT0tfT1VUUFVUICAgICAgICAgPSBkb2Nib29rCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgQXV0b0dlbiBEZWZpbml0aW9ucyBvdXRwdXQKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBJZiB0aGUgR0VORVJBVEVfQVVUT0dFTl9ERUYgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGFuIEF1dG9HZW4KKyMgRGVmaW5pdGlvbnMgKHNlZSBodHRwOi8vYXV0b2dlbi5zZi5uZXQpIGZpbGUgdGhhdCBjYXB0dXJlcyB0aGUgc3RydWN0dXJlIG9mCisjIHRoZSBjb2RlIGluY2x1ZGluZyBhbGwgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbAorIyBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlIG1vbWVudC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitHRU5FUkFURV9BVVRPR0VOX0RFRiAgID0gTk8KKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUGVybCBtb2R1bGUgb3V0cHV0CisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEdFTkVSQVRFX1BFUkxNT0QgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgUGVybCBtb2R1bGUKKyMgZmlsZSB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLgorIworIyBOb3RlIHRoYXQgdGhpcyBmZWF0dXJlIGlzIHN0aWxsIGV4cGVyaW1lbnRhbCBhbmQgaW5jb21wbGV0ZSBhdCB0aGUgbW9tZW50LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0dFTkVSQVRFX1BFUkxNT0QgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgbmVjZXNzYXJ5CisjIE1ha2VmaWxlIHJ1bGVzLCBQZXJsIHNjcmlwdHMgYW5kIExhVGVYIGNvZGUgdG8gYmUgYWJsZSB0byBnZW5lcmF0ZSBQREYgYW5kIERWSQorIyBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTworCisjIElmIHRoZSBQRVJMTU9EX1BSRVRUWSB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgUGVybCBtb2R1bGUgb3V0cHV0IHdpbGwgYmUgbmljZWx5CisjIGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLiBUaGlzIGlzIHVzZWZ1bCBpZiB5b3Ugd2FudCB0bworIyB1bmRlcnN0YW5kIHdoYXQgaXMgZ29pbmcgb24uIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzIHRhZyBpcyBzZXQgdG8gTk8gdGhlCisjIHNpemUgb2YgdGhlIFBlcmwgbW9kdWxlIG91dHB1dCB3aWxsIGJlIG11Y2ggc21hbGxlciBhbmQgUGVybCB3aWxsIHBhcnNlIGl0CisjIGp1c3QgdGhlIHNhbWUuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfUFJFVFRZICAgICAgICAgPSBZRVMKKworIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZSBhcmUKKyMgcHJlZml4ZWQgd2l0aCB0aGUgc3RyaW5nIGNvbnRhaW5lZCBpbiBQRVJMTU9EX01BS0VWQVJfUFJFRklYLiBUaGlzIGlzIHVzZWZ1bAorIyBzbyBkaWZmZXJlbnQgZG94eXJ1bGVzLm1ha2UgZmlsZXMgaW5jbHVkZWQgYnkgdGhlIHNhbWUgTWFrZWZpbGUgZG9uJ3QKKyMgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBHRU5FUkFURV9QRVJMTU9EIGlzIHNldCB0byBZRVMuCisKK1BFUkxNT0RfTUFLRVZBUl9QUkVGSVggPSAKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBDb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgcHJlcHJvY2Vzc29yCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBldmFsdWF0ZSBhbGwKKyMgQy1wcmVwcm9jZXNzb3IgZGlyZWN0aXZlcyBmb3VuZCBpbiB0aGUgc291cmNlcyBhbmQgaW5jbHVkZSBmaWxlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRU5BQkxFX1BSRVBST0NFU1NJTkcgICA9IFlFUworCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8gbmFtZXMKKyMgaW4gdGhlIHNvdXJjZSBjb2RlLiBJZiBzZXQgdG8gTk8gb25seSBjb25kaXRpb25hbCBjb21waWxhdGlvbiB3aWxsIGJlCisjIHBlcmZvcm1lZC4gTWFjcm8gZXhwYW5zaW9uIGNhbiBiZSBkb25lIGluIGEgY29udHJvbGxlZCB3YXkgYnkgc2V0dGluZworIyBFWFBBTkRfT05MWV9QUkVERUYgdG8gWUVTLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitNQUNST19FWFBBTlNJT04gICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUyB0aGVuCisjIHRoZSBtYWNybyBleHBhbnNpb24gaXMgbGltaXRlZCB0byB0aGUgbWFjcm9zIHNwZWNpZmllZCB3aXRoIHRoZSBQUkVERUZJTkVEIGFuZAorIyBFWFBBTkRfQVNfREVGSU5FRCB0YWdzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitFWFBBTkRfT05MWV9QUkVERUYgICAgID0gWUVTCisKKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGUgaW5jbHVkZXMgZmlsZXMgaW4gdGhlCisjIElOQ0xVREVfUEFUSCB3aWxsIGJlIHNlYXJjaGVkIGlmIGEgI2luY2x1ZGUgaXMgZm91bmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitTRUFSQ0hfSU5DTFVERVMgICAgICAgID0gWUVTCisKKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0CisjIGNvbnRhaW4gaW5jbHVkZSBmaWxlcyB0aGF0IGFyZSBub3QgaW5wdXQgZmlsZXMgYnV0IHNob3VsZCBiZSBwcm9jZXNzZWQgYnkgdGhlCisjIHByZXByb2Nlc3Nvci4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIFNFQVJDSF9JTkNMVURFUyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX1BBVEggICAgICAgICAgID0gCisKKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZAorIyBwYXR0ZXJucyAobGlrZSAqLmggYW5kICouaHBwKSB0byBmaWx0ZXIgb3V0IHRoZSBoZWFkZXItZmlsZXMgaW4gdGhlCisjIGRpcmVjdG9yaWVzLiBJZiBsZWZ0IGJsYW5rLCB0aGUgcGF0dGVybnMgc3BlY2lmaWVkIHdpdGggRklMRV9QQVRURVJOUyB3aWxsIGJlCisjIHVzZWQuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitJTkNMVURFX0ZJTEVfUEFUVEVSTlMgID0gCisKKyMgVGhlIFBSRURFRklORUQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbWFjcm8gbmFtZXMgdGhhdCBhcmUKKyMgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YgZS5nLgorIyBnY2MpLiBUaGUgYXJndW1lbnQgb2YgdGhlIHRhZyBpcyBhIGxpc3Qgb2YgbWFjcm9zIG9mIHRoZSBmb3JtOiBuYW1lIG9yCisjIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSAiPSIgYXJlIG9taXR0ZWQsICI9MSIKKyMgaXMgYXNzdW1lZC4gVG8gcHJldmVudCBhIG1hY3JvIGRlZmluaXRpb24gZnJvbSBiZWluZyB1bmRlZmluZWQgdmlhICN1bmRlZiBvcgorIyByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yIGluc3RlYWQgb2YgdGhlID0gb3BlcmF0b3IuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBFTkFCTEVfUFJFUFJPQ0VTU0lORyBpcyBzZXQgdG8gWUVTLgorCitQUkVERUZJTkVEICAgICAgICAgICAgID0gQ09JX0xJQlJBUllfVkVSU0lPTj0yIC1ETVlPX1NVUFBPUlQgLURPRkZMT0FEX0RFQlVHPTEgLURTRVBfU1VQUE9SVCAtRFRJTUlOR19TVVBQT1JUCisKKyMgSWYgdGhlIE1BQ1JPX0VYUEFOU0lPTiBhbmQgRVhQQU5EX09OTFlfUFJFREVGIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiB0aGlzCisjIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4gVGhlCisjIG1hY3JvIGRlZmluaXRpb24gdGhhdCBpcyBmb3VuZCBpbiB0aGUgc291cmNlcyB3aWxsIGJlIHVzZWQuIFVzZSB0aGUgUFJFREVGSU5FRAorIyB0YWcgaWYgeW91IHdhbnQgdG8gdXNlIGEgZGlmZmVyZW50IG1hY3JvIGRlZmluaXRpb24gdGhhdCBvdmVycnVsZXMgdGhlCisjIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworRVhQQU5EX0FTX0RFRklORUQgICAgICA9IAorCisjIElmIHRoZSBTS0lQX0ZVTkNUSU9OX01BQ1JPUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4ncyBwcmVwcm9jZXNzb3Igd2lsbAorIyByZW1vdmUgYWxsIHJlZmVyZW5jZXMgdG8gZnVuY3Rpb24tbGlrZSBtYWNyb3MgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuCisjIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhIHNlbWljb2xvbi4gU3VjaCBmdW5jdGlvbiBtYWNyb3MgYXJlCisjIHR5cGljYWxseSB1c2VkIGZvciBib2lsZXItcGxhdGUgY29kZSwgYW5kIHdpbGwgY29uZnVzZSB0aGUgcGFyc2VyIGlmIG5vdAorIyByZW1vdmVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgRU5BQkxFX1BSRVBST0NFU1NJTkcgaXMgc2V0IHRvIFlFUy4KKworU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBUaGUgVEFHRklMRVMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnIGZpbGVzLiBGb3IgZWFjaCB0YWcKKyMgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUgZm9ybWF0IG9mCisjIGEgdGFnIGZpbGUgd2l0aG91dCB0aGlzIGxvY2F0aW9uIGlzIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uCisjIEFkZGluZyBsb2NhdGlvbiBmb3IgdGhlIHRhZyBmaWxlcyBpcyBkb25lIGFzIGZvbGxvd3M6CisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4KKyMgd2hlcmUgbG9jMSBhbmQgbG9jMiBjYW4gYmUgcmVsYXRpdmUgb3IgYWJzb2x1dGUgcGF0aHMgb3IgVVJMcy4gU2VlIHRoZQorIyBzZWN0aW9uICJMaW5raW5nIHRvIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2UKKyMgb2YgdGFnIGZpbGVzLgorIyBOb3RlOiBFYWNoIHRhZyBmaWxlIG11c3QgaGF2ZSBhbiB1bmlxdWUgbmFtZSAod2hlcmUgdGhlIG5hbWUgZG9lcyBOT1QgaW5jbHVkZQorIyB0aGUgcGF0aCkuIElmIGEgdGFnIGZpbGUgaXMgbm90IGxvY2F0ZWQgaW4gdGhlIGRpcmVjdG9yeSBpbiB3aGljaCBkb3h5Z2VuIGlzCisjIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuCisKK1RBR0ZJTEVTICAgICAgICAgICAgICAgPSAKKworIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlIGEKKyMgdGFnIGZpbGUgdGhhdCBpcyBiYXNlZCBvbiB0aGUgaW5wdXQgZmlsZXMgaXQgcmVhZHMuIFNlZSBzZWN0aW9uICJMaW5raW5nIHRvCisjIGV4dGVybmFsIGRvY3VtZW50YXRpb24iIGZvciBtb3JlIGluZm9ybWF0aW9uIGFib3V0IHRoZSB1c2FnZSBvZiB0YWcgZmlsZXMuCisKK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPSAKKworIyBJZiB0aGUgQUxMRVhURVJOQUxTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBjbGFzcyB3aWxsIGJlIGxpc3RlZCBpbiB0aGUKKyMgY2xhc3MgaW5kZXguIElmIHNldCB0byBOTyBvbmx5IHRoZSBpbmhlcml0ZWQgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorCitBTExFWFRFUk5BTFMgICAgICAgICAgID0gTk8KKworIyBJZiB0aGUgRVhURVJOQUxfR1JPVVBTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBncm91cHMgd2lsbCBiZSBsaXN0ZWQgaW4KKyMgdGhlIG1vZHVsZXMgaW5kZXguIElmIHNldCB0byBOTywgb25seSB0aGUgY3VycmVudCBwcm9qZWN0J3MgZ3JvdXBzIHdpbGwgYmUKKyMgbGlzdGVkLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorCitFWFRFUk5BTF9HUk9VUFMgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIEVYVEVSTkFMX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBleHRlcm5hbCBwYWdlcyB3aWxsIGJlIGxpc3RlZCBpbgorIyB0aGUgcmVsYXRlZCBwYWdlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBwYWdlcyB3aWxsCisjIGJlIGxpc3RlZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKworRVhURVJOQUxfUEFHRVMgICAgICAgICA9IFlFUworCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdAorIyBpbnRlcnByZXRlciAoaS5lLiB0aGUgcmVzdWx0IG9mICd3aGljaCBwZXJsJykuCisjIFRoZSBkZWZhdWx0IGZpbGUgKHdpdGggYWJzb2x1dGUgcGF0aCkgaXM6IC91c3IvYmluL3BlcmwuCisKK1BFUkxfUEFUSCAgICAgICAgICAgICAgPSAvdXNyL2Jpbi9wZXJsCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGRvdCB0b29sCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgSWYgdGhlIENMQVNTX0RJQUdSQU1TIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNsYXNzIGRpYWdyYW0KKyMgKGluIEhUTUwgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2Ugb3Igc3VwZXIgY2xhc3Nlcy4gU2V0dGluZyB0aGUgdGFnIHRvCisjIE5PIHR1cm5zIHRoZSBkaWFncmFtcyBvZmYuIE5vdGUgdGhhdCB0aGlzIG9wdGlvbiBhbHNvIHdvcmtzIHdpdGggSEFWRV9ET1QKKyMgZGlzYWJsZWQsIGJ1dCBpdCBpcyByZWNvbW1lbmRlZCB0byBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZQorIyBwb3dlcmZ1bCBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0NMQVNTX0RJQUdSQU1TICAgICAgICAgPSBZRVMKKworIyBZb3UgY2FuIGRlZmluZSBtZXNzYWdlIHNlcXVlbmNlIGNoYXJ0cyB3aXRoaW4gZG94eWdlbiBjb21tZW50cyB1c2luZyB0aGUgXG1zYworIyBjb21tYW5kLiBEb3h5Z2VuIHdpbGwgdGhlbiBydW4gdGhlIG1zY2dlbiB0b29sIChzZWU6CisjIGh0dHA6Ly93d3cubWN0ZXJuYW4ubWUudWsvbXNjZ2VuLykpIHRvIHByb2R1Y2UgdGhlIGNoYXJ0IGFuZCBpbnNlcnQgaXQgaW4gdGhlCisjIGRvY3VtZW50YXRpb24uIFRoZSBNU0NHRU5fUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUKKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUKKyMgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworTVNDR0VOX1BBVEggICAgICAgICAgICA9IAorCisjIFlvdSBjYW4gaW5jbHVkZSBkaWFncmFtcyBtYWRlIHdpdGggZGlhIGluIGRveHlnZW4gZG9jdW1lbnRhdGlvbi4gRG94eWdlbiB3aWxsCisjIHRoZW4gcnVuIGRpYSB0byBwcm9kdWNlIHRoZSBkaWFncmFtIGFuZCBpbnNlcnQgaXQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZQorIyBESUFfUEFUSCB0YWcgYWxsb3dzIHlvdSB0byBzcGVjaWZ5IHRoZSBkaXJlY3Rvcnkgd2hlcmUgdGhlIGRpYSBiaW5hcnkgcmVzaWRlcy4KKyMgSWYgbGVmdCBlbXB0eSBkaWEgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUgZGVmYXVsdCBzZWFyY2ggcGF0aC4KKworRElBX1BBVEggICAgICAgICAgICAgICA9IAorCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBoaWRlIGluaGVyaXRhbmNlCisjIGFuZCB1c2FnZSByZWxhdGlvbnMgaWYgdGhlIHRhcmdldCBpcyB1bmRvY3VtZW50ZWQgb3IgaXMgbm90IGEgY2xhc3MuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisKK0hJREVfVU5ET0NfUkVMQVRJT05TICAgPSBZRVMKKworIyBJZiB5b3Ugc2V0IHRoZSBIQVZFX0RPVCB0YWcgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGFzc3VtZSB0aGUgZG90IHRvb2wgaXMKKyMgYXZhaWxhYmxlIGZyb20gdGhlIHBhdGguIFRoaXMgdG9vbCBpcyBwYXJ0IG9mIEdyYXBodml6IChzZWU6CisjIGh0dHA6Ly93d3cuZ3JhcGh2aXoub3JnLyksIGEgZ3JhcGggdmlzdWFsaXphdGlvbiB0b29sa2l0IGZyb20gQVQmVCBhbmQgTHVjZW50CisjIEJlbGwgTGFicy4gVGhlIG90aGVyIG9wdGlvbnMgaW4gdGhpcyBzZWN0aW9uIGhhdmUgbm8gZWZmZWN0IGlmIHRoaXMgb3B0aW9uIGlzCisjIHNldCB0byBOTworIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisKK0hBVkVfRE9UICAgICAgICAgICAgICAgPSBOTworCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMgYWxsb3dlZAorIyB0byBydW4gaW4gcGFyYWxsZWwuIFdoZW4gc2V0IHRvIDAgZG94eWdlbiB3aWxsIGJhc2UgdGhpcyBvbiB0aGUgbnVtYmVyIG9mCisjIHByb2Nlc3NvcnMgYXZhaWxhYmxlIGluIHRoZSBzeXN0ZW0uIFlvdSBjYW4gc2V0IGl0IGV4cGxpY2l0bHkgdG8gYSB2YWx1ZQorIyBsYXJnZXIgdGhhbiAwIHRvIGdldCBjb250cm9sIG92ZXIgdGhlIGJhbGFuY2UgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZworIyBzcGVlZC4KKyMgTWluaW11bSB2YWx1ZTogMCwgbWF4aW11bSB2YWx1ZTogMzIsIGRlZmF1bHQgdmFsdWU6IDAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMAorCisjIFdoZW4geW91IHdhbnQgYSBkaWZmZXJlbnRseSBsb29raW5nIGZvbnQgbiB0aGUgZG90IGZpbGVzIHRoYXQgZG94eWdlbgorIyBnZW5lcmF0ZXMgeW91IGNhbiBzcGVjaWZ5IHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlCisjIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZCB0aGUgZm9udCwgd2hpY2ggY2FuIGJlIGRvbmUgYnkgcHV0dGluZyBpdCBpbiBhCisjIHN0YW5kYXJkIGxvY2F0aW9uIG9yIGJ5IHNldHRpbmcgdGhlIERPVEZPTlRQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlIG9yIGJ5CisjIHNldHRpbmcgRE9UX0ZPTlRQQVRIIHRvIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IEhlbHZldGljYS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9GT05UTkFNRSAgICAgICAgICAgPSBIZWx2ZXRpY2EKKworIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgKGluIHBvaW50cykgb2YgdGhlIGZvbnQgb2YKKyMgZG90IGdyYXBocy4KKyMgTWluaW11bSB2YWx1ZTogNCwgbWF4aW11bSB2YWx1ZTogMjQsIGRlZmF1bHQgdmFsdWU6IDEwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX0ZPTlRTSVpFICAgICAgICAgICA9IDEwCisKKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdGVsbCBkb3QgdG8gdXNlIHRoZSBkZWZhdWx0IGZvbnQgYXMgc3BlY2lmaWVkIHdpdGgKKyMgRE9UX0ZPTlROQU1FLiBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHNldAorIyB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQgdXNpbmcgdGhpcyB0YWcuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfRk9OVFBBVEggICAgICAgICAgID0gCisKKyMgSWYgdGhlIENMQVNTX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGluaGVyaXRhbmNlIHJlbGF0aW9ucy4KKyMgU2V0dGluZyB0aGlzIHRhZyB0byBZRVMgd2lsbCBmb3JjZSB0aGUgQ0xBU1NfRElBR1JBTVMgdGFnIHRvIE5PLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBDT0xMQUJPUkFUSU9OX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEKKyMgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kIGluZGlyZWN0IGltcGxlbWVudGF0aW9uCisjIGRlcGVuZGVuY2llcyAoaW5oZXJpdGFuY2UsIGNvbnRhaW5tZW50LCBhbmQgY2xhc3MgcmVmZXJlbmNlcyB2YXJpYWJsZXMpIG9mIHRoZQorIyBjbGFzcyB3aXRoIG90aGVyIGRvY3VtZW50ZWQgY2xhc3Nlcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMKKworIyBJZiB0aGUgR1JPVVBfR1JBUEhTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yCisjIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBpbmhlcml0YW5jZSBhbmQKKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcKKyMgTGFuZ3VhZ2UuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBVTUxfTE9PSyB0YWcgaXMgZW5hYmxlZCwgdGhlIGZpZWxkcyBhbmQgbWV0aG9kcyBhcmUgc2hvd24gaW5zaWRlIHRoZQorIyBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUgZ3JhcGggbWF5CisjIGJlY29tZSB0b28gYmlnIHRvIGJlIHVzZWZ1bC4gVGhlIFVNTF9MSU1JVF9OVU1fRklFTERTIHRocmVzaG9sZCBsaW1pdHMgdGhlCisjIG51bWJlciBvZiBpdGVtcyBmb3IgZWFjaCB0eXBlIHRvIG1ha2UgdGhlIHNpemUgbW9yZSBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwCisjIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlIGV4Y2VlZGVkIGJ5IDUwJSBiZWZvcmUgdGhlIGxpbWl0CisjIGlzIGVuZm9yY2VkLiBTbyB3aGVuIHlvdSBzZXQgdGhlIHRocmVzaG9sZCB0byAxMCwgdXAgdG8gMTUgZmllbGRzIG1heSBhcHBlYXIsCisjIGJ1dCBpZiB0aGUgbnVtYmVyIGV4Y2VlZHMgMTUsIHRoZSB0b3RhbCBhbW91bnQgb2YgZmllbGRzIHNob3duIGlzIGxpbWl0ZWQgdG8KKyMgMTAuCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMCwgZGVmYXVsdCB2YWx1ZTogMTAuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTAKKworIyBJZiB0aGUgVEVNUExBVEVfUkVMQVRJT05TIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gdGhlIGluaGVyaXRhbmNlIGFuZAorIyBjb2xsYWJvcmF0aW9uIGdyYXBocyB3aWxsIHNob3cgdGhlIHJlbGF0aW9ucyBiZXR3ZWVuIHRlbXBsYXRlcyBhbmQgdGhlaXIKKyMgaW5zdGFuY2VzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitURU1QTEFURV9SRUxBVElPTlMgICAgID0gTk8KKworIyBJZiB0aGUgSU5DTFVERV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZSBzZXQgdG8KKyMgWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcgdGhlCisjIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERV9HUkFQSCAgICAgICAgICA9IFlFUworCisjIElmIHRoZSBJTkNMVURFRF9CWV9HUkFQSCwgRU5BQkxFX1BSRVBST0NFU1NJTkcgYW5kIFNFQVJDSF9JTkNMVURFUyB0YWdzIGFyZQorIyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBmaWxlIHNob3dpbmcKKyMgdGhlIGRpcmVjdCBhbmQgaW5kaXJlY3QgaW5jbHVkZSBkZXBlbmRlbmNpZXMgb2YgdGhlIGZpbGUgd2l0aCBvdGhlciBkb2N1bWVudGVkCisjIGZpbGVzLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworSU5DTFVERURfQllfR1JBUEggICAgICA9IFlFUworCisjIElmIHRoZSBDQUxMX0dSQVBIIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgY2FsbAorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocyBmb3Igc2VsZWN0ZWQKKyMgZnVuY3Rpb25zIG9ubHkgdXNpbmcgdGhlIFxjYWxsZ3JhcGggY29tbWFuZC4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PCisKKyMgSWYgdGhlIENBTExFUl9HUkFQSCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlcgorIyBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24gb3IgY2xhc3MgbWV0aG9kLgorIworIyBOb3RlIHRoYXQgZW5hYmxpbmcgdGhpcyBvcHRpb24gd2lsbCBzaWduaWZpY2FudGx5IGluY3JlYXNlIHRoZSB0aW1lIG9mIGEgcnVuLgorIyBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsZXIgZ3JhcGhzIGZvciBzZWxlY3RlZAorIyBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBOTy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0NBTExFUl9HUkFQSCAgICAgICAgICAgPSBOTworCisjIElmIHRoZSBHUkFQSElDQUxfSElFUkFSQ0hZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdyYXBoaWNhbAorIyBoaWVyYXJjaHkgb2YgYWxsIGNsYXNzZXMgaW5zdGVhZCBvZiBhIHRleHR1YWwgb25lLgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogWUVTLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworR1JBUEhJQ0FMX0hJRVJBUkNIWSAgICA9IFlFUworCisjIElmIHRoZSBESVJFQ1RPUllfR1JBUEggdGFnIGlzIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuIHdpbGwgc2hvdyB0aGUKKyMgZGVwZW5kZW5jaWVzIGEgZGlyZWN0b3J5IGhhcyBvbiBvdGhlciBkaXJlY3RvcmllcyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZQorIyBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUgcmVsYXRpb25zIGJldHdlZW4gdGhlCisjIGZpbGVzIGluIHRoZSBkaXJlY3Rvcmllcy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IFlFUy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RJUkVDVE9SWV9HUkFQSCAgICAgICAgPSBZRVMKKworIyBUaGUgRE9UX0lNQUdFX0ZPUk1BVCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBpbWFnZSBmb3JtYXQgb2YgdGhlIGltYWdlcworIyBnZW5lcmF0ZWQgYnkgZG90LgorIyBOb3RlOiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQgSFRNTF9GSUxFX0VYVEVOU0lPTiB0byB4aHRtbCBpbiBvcmRlcgorIyB0byBtYWtlIHRoZSBTVkcgZmlsZXMgdmlzaWJsZSBpbiBJRSA5KyAob3RoZXIgYnJvd3NlcnMgZG8gbm90IGhhdmUgdGhpcworIyByZXF1aXJlbWVudCkuCisjIFBvc3NpYmxlIHZhbHVlcyBhcmU6IHBuZywganBnLCBnaWYgYW5kIHN2Zy4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IHBuZy4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9JTUFHRV9GT1JNQVQgICAgICAgPSBwbmcKKworIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8KKyMgZW5hYmxlIGdlbmVyYXRpb24gb2YgaW50ZXJhY3RpdmUgU1ZHIGltYWdlcyB0aGF0IGFsbG93IHpvb21pbmcgYW5kIHBhbm5pbmcuCisjCisjIE5vdGUgdGhhdCB0aGlzIHJlcXVpcmVzIGEgbW9kZXJuIGJyb3dzZXIgb3RoZXIgdGhhbiBJbnRlcm5ldCBFeHBsb3Jlci4gVGVzdGVkCisjIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLgorIyBOb3RlOiBGb3IgSUUgOSsgeW91IG5lZWQgdG8gc2V0IEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZQorIyB0aGUgU1ZHIGZpbGVzIHZpc2libGUuIE9sZGVyIHZlcnNpb25zIG9mIElFIGRvIG5vdCBoYXZlIFNWRyBzdXBwb3J0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitJTlRFUkFDVElWRV9TVkcgICAgICAgID0gTk8KKworIyBUaGUgRE9UX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQorIyBmb3VuZC4gSWYgbGVmdCBibGFuaywgaXQgaXMgYXNzdW1lZCB0aGUgZG90IHRvb2wgY2FuIGJlIGZvdW5kIGluIHRoZSBwYXRoLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1BBVEggICAgICAgICAgICAgICA9IAorCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdAorIyBjb250YWluIGRvdCBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZSBcZG90ZmlsZQorIyBjb21tYW5kKS4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVEZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgTVNDRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBtc2MgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXG1zY2ZpbGUKKyMgY29tbWFuZCkuCisKK01TQ0ZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRElBRklMRV9ESVJTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGRpcmVjdG9yaWVzIHRoYXQKKyMgY29udGFpbiBkaWEgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUgXGRpYWZpbGUKKyMgY29tbWFuZCkuCisKK0RJQUZJTEVfRElSUyAgICAgICAgICAgPSAKKworIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZiBub2RlcworIyB0aGF0IHdpbGwgYmUgc2hvd24gaW4gdGhlIGdyYXBoLiBJZiB0aGUgbnVtYmVyIG9mIG5vZGVzIGluIGEgZ3JhcGggYmVjb21lcworIyBsYXJnZXIgdGhhbiB0aGlzIHZhbHVlLCBkb3h5Z2VuIHdpbGwgdHJ1bmNhdGUgdGhlIGdyYXBoLCB3aGljaCBpcyB2aXN1YWxpemVkCisjIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUgbnVtYmVyIG9mIGRpcmVjdAorIyBjaGlsZHJlbiBvZiB0aGUgcm9vdCBub2RlIGluIGEgZ3JhcGggaXMgYWxyZWFkeSBsYXJnZXIgdGhhbgorIyBET1RfR1JBUEhfTUFYX05PREVTIHRoZW4gdGhlIGdyYXBoIHdpbGwgbm90IGJlIHNob3duIGF0IGFsbC4gQWxzbyBub3RlIHRoYXQKKyMgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguCisjIE1pbmltdW0gdmFsdWU6IDAsIG1heGltdW0gdmFsdWU6IDEwMDAwLCBkZWZhdWx0IHZhbHVlOiA1MC4KKyMgVGhpcyB0YWcgcmVxdWlyZXMgdGhhdCB0aGUgdGFnIEhBVkVfRE9UIGlzIHNldCB0byBZRVMuCisKK0RPVF9HUkFQSF9NQVhfTk9ERVMgICAgPSA1MAorCisjIFRoZSBNQVhfRE9UX0dSQVBIX0RFUFRIIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG1heGltdW0gZGVwdGggb2YgdGhlIGdyYXBocworIyBnZW5lcmF0ZWQgYnkgZG90LiBBIGRlcHRoIHZhbHVlIG9mIDMgbWVhbnMgdGhhdCBvbmx5IG5vZGVzIHJlYWNoYWJsZSBmcm9tIHRoZQorIyByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2RlcyB0aGF0IGxheQorIyBmdXJ0aGVyIGZyb20gdGhlIHJvb3Qgbm9kZSB3aWxsIGJlIG9taXR0ZWQuIE5vdGUgdGhhdCBzZXR0aW5nIHRoaXMgb3B0aW9uIHRvIDEKKyMgb3IgMiBtYXkgZ3JlYXRseSByZWR1Y2UgdGhlIGNvbXB1dGF0aW9uIHRpbWUgbmVlZGVkIGZvciBsYXJnZSBjb2RlIGJhc2VzLiBBbHNvCisjIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkKKyMgRE9UX0dSQVBIX01BWF9OT0RFUy4gVXNpbmcgYSBkZXB0aCBvZiAwIG1lYW5zIG5vIGRlcHRoIHJlc3RyaWN0aW9uLgorIyBNaW5pbXVtIHZhbHVlOiAwLCBtYXhpbXVtIHZhbHVlOiAxMDAwLCBkZWZhdWx0IHZhbHVlOiAwLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworTUFYX0RPVF9HUkFQSF9ERVBUSCAgICA9IDAKKworIyBTZXQgdGhlIERPVF9UUkFOU1BBUkVOVCB0YWcgdG8gWUVTIHRvIGdlbmVyYXRlIGltYWdlcyB3aXRoIGEgdHJhbnNwYXJlbnQKKyMgYmFja2dyb3VuZC4gVGhpcyBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LCBiZWNhdXNlIGRvdCBvbiBXaW5kb3dzIGRvZXMgbm90IHNlZW0KKyMgdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LgorIworIyBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsIGVuYWJsaW5nIHRoaXMgb3B0aW9uIG1heSBsZWFkIHRvCisjIGJhZGx5IGFudGktYWxpYXNlZCBsYWJlbHMgb24gdGhlIGVkZ2VzIG9mIGEgZ3JhcGggKGkuZS4gdGhleSBiZWNvbWUgaGFyZCB0bworIyByZWFkKS4KKyMgVGhlIGRlZmF1bHQgdmFsdWUgaXM6IE5PLgorIyBUaGlzIHRhZyByZXF1aXJlcyB0aGF0IHRoZSB0YWcgSEFWRV9ET1QgaXMgc2V0IHRvIFlFUy4KKworRE9UX1RSQU5TUEFSRU5UICAgICAgICA9IE5PCisKKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQKKyMgZmlsZXMgaW4gb25lIHJ1biAoaS5lLiBtdWx0aXBsZSAtbyBhbmQgLVQgb3B0aW9ucyBvbiB0aGUgY29tbWFuZCBsaW5lKS4gVGhpcworIyBtYWtlcyBkb3QgcnVuIGZhc3RlciwgYnV0IHNpbmNlIG9ubHkgbmV3ZXIgdmVyc2lvbnMgb2YgZG90ICg+MS44LjEwKSBzdXBwb3J0CisjIHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0LgorIyBUaGUgZGVmYXVsdCB2YWx1ZSBpczogTk8uCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfTVVMVElfVEFSR0VUUyAgICAgID0gTk8KKworIyBJZiB0aGUgR0VORVJBVEVfTEVHRU5EIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGxlZ2VuZCBwYWdlCisjIGV4cGxhaW5pbmcgdGhlIG1lYW5pbmcgb2YgdGhlIHZhcmlvdXMgYm94ZXMgYW5kIGFycm93cyBpbiB0aGUgZG90IGdlbmVyYXRlZAorIyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTCisKKyMgSWYgdGhlIERPVF9DTEVBTlVQIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCByZW1vdmUgdGhlIGludGVybWVkaWF0ZSBkb3QKKyMgZmlsZXMgdGhhdCBhcmUgdXNlZCB0byBnZW5lcmF0ZSB0aGUgdmFyaW91cyBncmFwaHMuCisjIFRoZSBkZWZhdWx0IHZhbHVlIGlzOiBZRVMuCisjIFRoaXMgdGFnIHJlcXVpcmVzIHRoYXQgdGhlIHRhZyBIQVZFX0RPVCBpcyBzZXQgdG8gWUVTLgorCitET1RfQ0xFQU5VUCAgICAgICAgICAgID0gWUVTCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9kb2MvZG94eWdlbi9oZWFkZXIudGV4IGIvcmMzL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41ZTk2M2MyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvZG9jL2RveHlnZW4vaGVhZGVyLnRleApAQCAtMCwwICsxLDkwIEBACislIExhdGV4IGhlYWRlciBmb3IgZG94eWdlbiAxLjguMy4xDQorXGRvY3VtZW50Y2xhc3N7Ym9va30NCitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9DQorXHVzZXBhY2thZ2V7bWFrZWlkeH0NCitcdXNlcGFja2FnZXtuYXRiaWJ9DQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9DQorXHVzZXBhY2thZ2V7bXVsdGljb2x9DQorXHVzZXBhY2thZ2V7ZmxvYXR9DQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9DQorXHVzZXBhY2thZ2V7Y29sb3J9DQorXHVzZXBhY2thZ2V7aWZ0aGVufQ0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9DQorXHVzZXBhY2thZ2V7dGV4dGNvbXB9DQorXHVzZXBhY2thZ2V7YWxsdHR9DQorXHVzZXBhY2thZ2V7aWZwZGZ9DQorXGlmcGRmDQorXHVzZXBhY2thZ2VbcGRmdGV4LA0KKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsDQorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLA0KKyAgICAgICAgICAgIGxpbmtjb2xvcj1ibHVlLA0KKyAgICAgICAgICAgIHVuaWNvZGUNCisgICAgICAgICAgIF17aHlwZXJyZWZ9DQorXGVsc2UNCitcdXNlcGFja2FnZVtwczJwZGYsDQorICAgICAgICAgICAgcGFnZWJhY2tyZWY9dHJ1ZSwNCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsDQorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsDQorICAgICAgICAgICAgdW5pY29kZQ0KKyAgICAgICAgICAgXXtoeXBlcnJlZn0NCitcdXNlcGFja2FnZXtwc3BpY3R1cmV9DQorXGZpDQorXHVzZXBhY2thZ2VbdXRmOF17aW5wdXRlbmN9DQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9DQorXHVzZXBhY2thZ2Vbc2NhbGVkPS45MF17aGVsdmV0fQ0KK1x1c2VwYWNrYWdle2NvdXJpZXJ9DQorXHVzZXBhY2thZ2V7c2VjdHN0eX0NCitcdXNlcGFja2FnZXthbXNzeW1ifQ0KK1x1c2VwYWNrYWdlW3RpdGxlc117dG9jbG9mdH0NCitcdXNlcGFja2FnZXtkb3h5Z2VufQ0KK1x1c2VwYWNrYWdle2ZhbmN5aGRyfQ0KK1xwYWdlc3R5bGV7ZmFuY3l9DQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0NCitcbWFrZWluZGV4DQorXHNldGNvdW50ZXJ7dG9jZGVwdGh9ezN9DQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9DQorXHJlbmV3Y29tbWFuZHtcZmFtaWx5ZGVmYXVsdH17XHNmZGVmYXVsdH0NCitcaGZ1eno9MTVwdA0KK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9DQorXGhiYWRuZXNzPTc1MA0KK1x0b2xlcmFuY2U9NzUwDQorXGJlZ2lue2RvY3VtZW50fQ0KK1xoeXBlcnNldHVwe3BhZ2VhbmNob3I9ZmFsc2UsY2l0ZWNvbG9yPWJsdWV9DQorXGJlZ2lue3RpdGxlcGFnZX0NCitcdnNwYWNlKns3Y219DQorXGJlZ2lue2NlbnRlcn0NCit7XExhcmdlIEludGVsXHRleHRzdXBlcnNjcmlwdHtcdGV4dHJlZ2lzdGVyZWR9IE9mZmxvYWQgUnVudGltZSBMaWJyYXJ5IH1cXA0KK1x2c3BhY2UqezFjbX0NCit7XGxhcmdlIEdlbmVyYXRlZCBieSBEb3h5Z2VuICRkb3h5Z2VudmVyc2lvbiB9XFwNCitcdnNwYWNlKnswLjVjbX0NCit7XHNtYWxsICRkYXRldGltZSB9XFwNCitcZW5ke2NlbnRlcn0NCitcZW5ke3RpdGxlcGFnZX0NCisNCit7XGJmIEZUQyBPcHRpbWl6YXRpb24gTm90aWNlfQ0KKw0KK0ludGVsJ3MgY29tcGlsZXJzIG1heSBvciBtYXkgbm90IG9wdGltaXplIHRvIHRoZSBzYW1lIGRlZ3JlZSBmb3Igbm9uLUludGVsIG1pY3JvcHJvY2Vzc29ycyBmb3INCitvcHRpbWl6YXRpb25zIHRoYXQgYXJlIG5vdCB1bmlxdWUgdG8gSW50ZWwgbWljcm9wcm9jZXNzb3JzLiBUaGVzZSBvcHRpbWl6YXRpb25zIGluY2x1ZGUgU1NFMiwNCitTU0UzLCBhbmQgU1NTRTMgaW5zdHJ1Y3Rpb24gc2V0cyBhbmQgb3RoZXIgb3B0aW1pemF0aW9ucy4gSW50ZWwgZG9lcyBub3QgZ3VhcmFudGVlIHRoZQ0KK2F2YWlsYWJpbGl0eSwgZnVuY3Rpb25hbGl0eSwgb3IgZWZmZWN0aXZlbmVzcyBvZiBhbnkgb3B0aW1pemF0aW9uIG9uIG1pY3JvcHJvY2Vzc29ycyBub3QNCittYW51ZmFjdHVyZWQgYnkgSW50ZWwuDQorDQorTWljcm9wcm9jZXNzb3ItZGVwZW5kZW50IG9wdGltaXphdGlvbnMgaW4gdGhpcyBwcm9kdWN0IGFyZSBpbnRlbmRlZCBmb3IgdXNlIHdpdGggSW50ZWwNCittaWNyb3Byb2Nlc3NvcnMuIENlcnRhaW4gb3B0aW1pemF0aW9ucyBub3Qgc3BlY2lmaWMgdG8gSW50ZWwgbWljcm9hcmNoaXRlY3R1cmUgYXJlIHJlc2VydmVkIGZvcg0KK0ludGVsIG1pY3JvcHJvY2Vzc29ycy4gUGxlYXNlIHJlZmVyIHRvIHRoZSBhcHBsaWNhYmxlIHByb2R1Y3QgVXNlciBhbmQgUmVmZXJlbmNlIEd1aWRlcyBmb3INCittb3JlIGluZm9ybWF0aW9uIHJlZ2FyZGluZyB0aGUgc3BlY2lmaWMgaW5zdHJ1Y3Rpb24gc2V0cyBjb3ZlcmVkIGJ5IHRoaXMgbm90aWNlLg0KKw0KK05vdGljZSByZXZpc2lvbiBcIzIwMTEwODA0DQorDQorXHZzcGFjZSp7MC41Y219DQorDQore1xiZiBUcmFkZW1hcmtzfQ0KKw0KK0ludGVsLCBYZW9uLCBhbmQgSW50ZWwgWGVvbiBQaGkgYXJlIHRyYWRlbWFya3Mgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyIGNvdW50cmllcy4NCisNCitUaGlzIGRvY3VtZW50IGlzIENvcHlyaWdodCBcdGV4dGNvcHlyaWdodCAyMDE0LCBJbnRlbCBDb3Jwb3JhdGlvbi4gQWxsIHJpZ2h0cyByZXNlcnZlZC4gDQorDQorXHBhZ2VudW1iZXJpbmd7cm9tYW59DQorXHRhYmxlb2Zjb250ZW50cw0KK1xwYWdlbnVtYmVyaW5ne2FyYWJpY30NCitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9DQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvY2Vhbl91dGlsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZTE4OTBiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5jcHAKQEAgLTAsMCArMSwzNDQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImNlYW5fdXRpbC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisKKy8vIDEuIGFsbG9jYXRlIGVsZW1lbnQgb2YgQ2VhblJlYWRSYW5nZXMgdHlwZQorLy8gMi4gaW5pdGlhbGl6ZWQgaXQgZm9yIHJlYWRpbmcgY29uc2VxdWVudGx5IGNvbnRpZ3VvdXMgcmFuZ2VzCisvLyAgICBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCkKK3sKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlczsKKworICAgIC8vIGZpbmQgdGhlIG1heCBjb250aWd1b3VzIHJhbmdlCisgICAgaW50NjRfdCByYW5rID0gYXAtPnJhbmsgLSAxOworICAgIGludDY0X3QgbGVuZ3RoID0gYXAtPmRpbVtyYW5rXS5zaXplOworICAgIGZvciAoOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS5zdHJpZGUgPT0gMSkgeworICAgICAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgICAgICAgICAgaWYgKHJhbmsgPiAwICYmIGxlbmd0aCAhPSBhcC0+ZGltW3JhbmsgLSAxXS5zaXplKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJlcyA9KENlYW5SZWFkUmFuZ2VzICopbWFsbG9jKHNpemVvZihDZWFuUmVhZFJhbmdlcykgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhcC0+cmFuayAtIHJhbmspICogc2l6ZW9mKENlYW5SZWFkRGltKSk7CisgICAgcmVzLT5jdXJyZW50X251bWJlciA9IDA7CisgICAgcmVzLT5yYW5nZV9zaXplID0gbGVuZ3RoOworICAgIHJlcy0+bGFzdF9ub25jb250X2luZCA9IHJhbms7CisKKyAgICAvLyBjYWxjdWxhdGUgbnVtYmVyIG9mIGNvbnRpZ3VvdXMgcmFuZ2VzIGluc2lkZSBub25jb250aWd1b3VzIGRpbWVuc2lvbnMKKyAgICBpbnQgY291bnQgPSAxOworICAgIGJvb2wgcHJldl9pc19jb250ID0gdHJ1ZTsKKyAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uY291bnQgPSBjb3VudDsKKyAgICAgICAgcmVzLT5EaW1bcmFua10uc2l6ZSA9IGFwLT5kaW1bcmFua10uc3RyaWRlICogYXAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICBjb3VudCAqPSAocHJldl9pc19jb250ICYmIGFwLT5kaW1bcmFua10uc3RyaWRlID09IDE/IDEgOgorICAgICAgICAgICAgKGFwLT5kaW1bcmFua10udXBwZXIgLSBhcC0+ZGltW3JhbmtdLmxvd2VyICsKKyAgICAgICAgICAgIGFwLT5kaW1bcmFua10uc3RyaWRlKSAvIGFwLT5kaW1bcmFua10uc3RyaWRlKTsKKyAgICAgICAgcHJldl9pc19jb250ID0gZmFsc2U7CisgICAgICAgIG9mZnNldCArPShhcC0+ZGltW3JhbmtdLmxvd2VyIC0gYXAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS5zaXplOworICAgIH0KKyAgICByZXMtPnJhbmdlX21heF9udW1iZXIgPSBjb3VudDsKKyAgICByZXMgLT4gcHRyID0gKHZvaWQqKWFwLT5iYXNlOworICAgIHJlcyAtPiBpbml0X29mZnNldCA9IG9mZnNldDsKKyAgICByZXR1cm4gcmVzOworfQorCisvLyBjaGVjayBpZiByYW5nZXMgZGVzY3JpYmVkIGJ5IDEgYXJndW1lbnQgY291bGQgYmUgdHJhbnNmZXJyZWQgaW50byByYW5nZXMKKy8vIGRlc2NyaWJlZCBieSAyLW5kIG9uZQorYm9vbCBjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMSwKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nMgorKQoreworICAgIHJldHVybiAoIHJlYWRfcm5nMSA9PSBOVUxMIHx8IHJlYWRfcm5nMiA9PSBOVUxMIHx8CisgICAgICAgICAgICAocmVhZF9ybmcxLT5yYW5nZV9zaXplICUgcmVhZF9ybmcyLT5yYW5nZV9zaXplID09IDAgfHwKKyAgICAgICAgICAgIHJlYWRfcm5nMi0+cmFuZ2Vfc2l6ZSAlIHJlYWRfcm5nMS0+cmFuZ2Vfc2l6ZSA9PSAwKSk7Cit9CisKKy8vIFNldCBuZXh0IG9mZnNldCBhbmQgbGVuZ3RoIGFuZCByZXR1cm5zIHRydWUgZm9yIG5leHQgcmFuZ2UuCisvLyBSZXR1cm5zIGZhbHNlIGlmIHRoZSByYW5nZXMgYXJlIG92ZXIuCitib29sIGdldF9uZXh0X3JhbmdlKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcsCisgICAgaW50NjRfdCAqb2Zmc2V0CispCit7CisgICAgaWYgKCsrcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID4gcmVhZF9ybmctPnJhbmdlX21heF9udW1iZXIpIHsKKyAgICAgICAgcmVhZF9ybmctPmN1cnJlbnRfbnVtYmVyID0gMDsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICBpbnQgcmFuayA9IDA7CisgICAgaW50IG51bSA9IHJlYWRfcm5nLT5jdXJyZW50X251bWJlciAtIDE7CisgICAgaW50NjRfdCBjdXJfb2Zmc2V0ID0gMDsKKyAgICBpbnQgbnVtX2xvYzsKKyAgICBmb3IgKDsgcmFuayA8PSByZWFkX3JuZy0+bGFzdF9ub25jb250X2luZDsgcmFuaysrKSB7CisgICAgICAgIG51bV9sb2MgPSBudW0gLyByZWFkX3JuZy0+RGltW3JhbmtdLmNvdW50OworICAgICAgICBjdXJfb2Zmc2V0ICs9IG51bV9sb2MgKiByZWFkX3JuZy0+RGltW3JhbmtdLnNpemU7CisgICAgICAgIG51bSA9IG51bSAlIHJlYWRfcm5nLT5EaW1bcmFua10uY291bnQ7CisgICAgfQorICAgICpvZmZzZXQgPSBjdXJfb2Zmc2V0ICsgcmVhZF9ybmctPmluaXRfb2Zmc2V0OworICAgIHJldHVybiB0cnVlOworfQorCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKQoreworICAgIGludDY0X3QgcmFuayA9IGFwLT5yYW5rIC0gMTsKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGFwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgaWYgKGFwLT5kaW1bcmFua10uc3RyaWRlID4gMSAmJgorICAgICAgICAgICAgYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChsZW5ndGggIT0gYXAtPmRpbVtyYW5rXS5zaXplKSB7CisgICAgICAgICAgICBmb3IgKDsgcmFuayA+PSAwOyByYW5rLS0pIHsKKyAgICAgICAgICAgICAgICBpZiAoYXAtPmRpbVtyYW5rXS51cHBlciAtIGFwLT5kaW1bcmFua10ubG93ZXIgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoICo9IChhcC0+ZGltW3JhbmtdLnVwcGVyIC0gYXAtPmRpbVtyYW5rXS5sb3dlciArIDEpOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworaW50NjRfdCBjZWFuX2dldF90cmFuc2Zfc2l6ZShDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nKQoreworICAgIHJldHVybihyZWFkX3JuZy0+cmFuZ2VfbWF4X251bWJlciAqIHJlYWRfcm5nLT5yYW5nZV9zaXplKTsKK30KKworc3RhdGljIHVpbnQ2NF90IGxhc3RfbGVmdCwgbGFzdF9yaWdodDsKK3R5cGVkZWYgdm9pZCAoKmZwcCkoY29uc3QgY2hhciAqc3BhY2VzLCB1aW50NjRfdCBsb3csIHVpbnQ2NF90IGhpZ2gsIGludCBlc2l6ZSk7CisKK3N0YXRpYyB2b2lkIGdlbmVyYXRlX29uZV9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbHJhbmdlLAorICAgIHVpbnQ2NF90IHJyYW5nZSwKKyAgICBmcHAgZnAsCisgICAgaW50IGVzaXplCispCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgZ2VuZXJhdGVfb25lX3JhbmdlKGxyYW5nZT0lcCwgcnJhbmdlPSVwLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWxyYW5nZSwgKHZvaWQqKXJyYW5nZSwgZXNpemUpOworICAgIGlmIChsYXN0X2xlZnQgPT0gLTEpIHsKKyAgICAgICAgLy8gRmlyc3QgcmFuZ2UKKyAgICAgICAgbGFzdF9sZWZ0ID0gbHJhbmdlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaWYgKGxyYW5nZSA9PSBsYXN0X3JpZ2h0KzEpIHsKKyAgICAgICAgICAgIC8vIEV4dGVuZCBwcmV2aW91cyByYW5nZSwgZG9uJ3QgcHJpbnQKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICgqZnApKHNwYWNlcywgbGFzdF9sZWZ0LCBsYXN0X3JpZ2h0LCBlc2l6ZSk7CisgICAgICAgICAgICBsYXN0X2xlZnQgPSBscmFuZ2U7CisgICAgICAgIH0KKyAgICB9CisgICAgbGFzdF9yaWdodCA9IHJyYW5nZTsKK30KKworc3RhdGljIHZvaWQgZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuaygKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgYmFzZSwKKyAgICB1aW50NjRfdCByYW5rLAorICAgIGNvbnN0IHN0cnVjdCBkaW1fZGVzYyAqZGRwLAorICAgIGZwcCBmcCwKKyAgICBpbnQgZXNpemUKKykKK3sKKyAgICB1aW50NjRfdCBsaW5kZXggPSBkZHAtPmxpbmRleDsKKyAgICB1aW50NjRfdCBsb3dlciA9IGRkcC0+bG93ZXI7CisgICAgdWludDY0X3QgdXBwZXIgPSBkZHAtPnVwcGVyOworICAgIHVpbnQ2NF90IHN0cmlkZSA9IGRkcC0+c3RyaWRlOworICAgIHVpbnQ2NF90IHNpemUgPSBkZHAtPnNpemU7CisgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAiJXMgICAgIgorICAgICAgICAiZ2VuZXJhdGVfbWVtX3Jhbmdlc19vbmVfcmFuayhiYXNlPSVwLCByYW5rPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZCwgc2l6ZT0lbGxkLCBlc2l6ZT0lZClcbiIsCisgICAgICAgIHNwYWNlcywgKHZvaWQqKWJhc2UsIHJhbmssIGxpbmRleCwgbG93ZXIsIHVwcGVyLCBzdHJpZGUsIHNpemUsIGVzaXplKTsKKyAgICBpZiAocmFuayA9PSAxKSB7CisgICAgICAgIHVpbnQ2NF90IGxyYW5nZSwgcnJhbmdlOworICAgICAgICBpZiAoc3RyaWRlID09IDEpIHsKKyAgICAgICAgICAgIGxyYW5nZSA9IGJhc2UgKyAobG93ZXItbGluZGV4KSpzaXplOworICAgICAgICAgICAgcnJhbmdlID0gbHJhbmdlICsgKHVwcGVyLWxvd2VyKzEpKnNpemUgLSAxOworICAgICAgICAgICAgZ2VuZXJhdGVfb25lX3JhbmdlKHNwYWNlcywgbHJhbmdlLCBycmFuZ2UsIGZwLCBlc2l6ZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgICAgICBscmFuZ2UgPSBiYXNlICsgaSpzaXplOworICAgICAgICAgICAgICAgIHJyYW5nZSA9IGxyYW5nZSArIHNpemUgLSAxOworICAgICAgICAgICAgICAgIGdlbmVyYXRlX29uZV9yYW5nZShzcGFjZXMsIGxyYW5nZSwgcnJhbmdlLCBmcCwgZXNpemUpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmb3IgKGludCBpPWxvd2VyLWxpbmRleDsgaTw9dXBwZXItbGluZGV4OyBpKz1zdHJpZGUpIHsKKyAgICAgICAgICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgICAgICAgICAgc3BhY2VzLCBiYXNlK2kqc2l6ZSwgcmFuay0xLCBkZHArMSwgZnAsIGVzaXplKTsKKworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBnZW5lcmF0ZV9tZW1fcmFuZ2VzKAorICAgIGNvbnN0IGNoYXIgKnNwYWNlcywKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYsCisgICAgZnBwIGZwCispCit7CisgICAgdWludDY0X3QgZXNpemU7CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsCisgICAgICAgICIlcyAgICAiCisgICAgICAgICJnZW5lcmF0ZV9tZW1fcmFuZ2VzKGFkcD0lcCwgZGVyZWY9JWQsIGZwKVxuIiwKKyAgICAgICAgc3BhY2VzLCBhZHAsIGRlcmVmKTsKKyAgICBsYXN0X2xlZnQgPSAtMTsKKyAgICBsYXN0X3JpZ2h0ID0gLTI7CisKKyAgICAvLyBFbGVtZW50IHNpemUgaXMgZGVyaXZlZCBmcm9tIGxhc3QgZGltZW5zaW9uCisgICAgZXNpemUgPSBhZHAtPmRpbVthZHAtPnJhbmstMV0uc2l6ZTsKKworICAgIGdlbmVyYXRlX21lbV9yYW5nZXNfb25lX3JhbmsoCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyIHRoZSBiYXNlIGFkZHIgaXMgdGhlIGFkZHJlc3Mgb2YgdGhlIGRhdGEKKyAgICAgICAgLy8gRm9yIGNfY2Vhbl92YXJfcHRyIHRoZSBiYXNlIGFkZHIgaXMgZGVyZWZlcmVuY2VkIHRvIGdldCB0byB0aGUgZGF0YQorICAgICAgICBzcGFjZXMsIGRlcmVmID8gKigodWludDY0X3QqKShhZHAtPmJhc2UpKSA6IGFkcC0+YmFzZSwKKyAgICAgICAgYWRwLT5yYW5rLCAmYWRwLT5kaW1bMF0sIGZwLCBlc2l6ZSk7CisgICAgKCpmcCkoc3BhY2VzLCBsYXN0X2xlZnQsIGxhc3RfcmlnaHQsIGVzaXplKTsKK30KKworLy8gcmV0dXJucyBvZmZzZXQgYW5kIGxlbmd0aCBvZiB0aGUgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAordm9pZCBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKAorICAgIGNvbnN0IGFycl9kZXNjICphZHAsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJmxlbmd0aAorKQoreworICAgIGludDY0X3QgcmFuayA9IGFkcC0+cmFuayAtIDE7CisgICAgaW50NjRfdCBzaXplID0gYWRwLT5kaW1bcmFua10uc2l6ZTsKKyAgICBpbnQ2NF90IHJfb2ZmID0gMDsgLy8gb2Zmc2V0IGZyb20gcmlnaHQgYm91bmRhcnkKKworICAgIC8vIGZpbmQgdGhlIHJpZ2h0bW9zdCBkaW1lbnNpb24gd2hpY2ggdGFrZXMganVzdCBwYXJ0IG9mIGl0cworICAgIC8vIHJhbmdlLiBXZSBkZWZpbmUgaXQgaWYgdGhlIHNpemUgb2YgbGVmdCByYW5rIGlzIG5vdCBlcXVhbAorICAgIC8vIHRoZSByYW5nZSdzIGxlbmd0aCBiZXR3ZWVuIHVwcGVyIGFuZCBsb3dlciBib3VuZ2FyaWVzCisgICAgd2hpbGUgKHJhbmsgPiAwKSB7CisgICAgICAgIHNpemUgKj0gKGFkcC0+ZGltW3JhbmtdLnVwcGVyIC0gYWRwLT5kaW1bcmFua10ubG93ZXIgKyAxKTsKKyAgICAgICAgaWYgKHNpemUgIT0gYWRwLT5kaW1bcmFuayAtIDFdLnNpemUpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHJhbmstLTsKKyAgICB9CisKKyAgICBvZmZzZXQgPSAoYWRwLT5kaW1bcmFua10ubG93ZXIgLSBhZHAtPmRpbVtyYW5rXS5saW5kZXgpICoKKyAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworCisgICAgLy8gZmluZCBnYXBzIGJvdGggZnJvbSB0aGUgbGVmdCAtIG9mZnNldCBhbmQgZnJvbSB0aGUgcmlnaHQgLSByX29mZgorICAgIGZvciAocmFuay0tOyByYW5rID49IDA7IHJhbmstLSkgeworICAgICAgICBvZmZzZXQgKz0gKGFkcC0+ZGltW3JhbmtdLmxvd2VyIC0gYWRwLT5kaW1bcmFua10ubGluZGV4KSAqCisgICAgICAgICAgICAgICAgICBhZHAtPmRpbVtyYW5rXS5zaXplOworICAgICAgICByX29mZiArPSBhZHAtPmRpbVtyYW5rXS5zaXplIC0KKyAgICAgICAgICAgICAgICAgKGFkcC0+ZGltW3JhbmsgKyAxXS51cHBlciAtIGFkcC0+ZGltW3JhbmsgKyAxXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgICAgIGFkcC0+ZGltW3JhbmsgKyAxXS5zaXplOworICAgIH0KKyAgICBsZW5ndGggPSAoYWRwLT5kaW1bMF0udXBwZXIgLSBhZHAtPmRpbVswXS5saW5kZXggKyAxKSAqCisgICAgICAgICAgICAgYWRwLT5kaW1bMF0uc2l6ZSAtIG9mZnNldCAtIHJfb2ZmOworfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKwordm9pZCBwcmludF9yYW5nZSgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgdWludDY0X3QgbG93LAorICAgIHVpbnQ2NF90IGhpZ2gsCisgICAgaW50IGVzaXplCispCit7CisgICAgY2hhciBidWZmZXJbMTAyNF07CisgICAgY2hhciBudW1iZXJbMzJdOworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgICAgICAgIHByaW50X3JhbmdlKGxvdz0lcCwgaGlnaD0lcCwgZXNpemU9JWQpXG4iLAorICAgICAgICBzcGFjZXMsICh2b2lkKilsb3csICh2b2lkKiloaWdoLCBlc2l6ZSk7CisKKyAgICBpZiAoY29uc29sZV9lbmFibGVkIDwgNCkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIE9GRkxPQURfVFJBQ0UoNCwgIiVzICAgICAgICAgICAgdmFsdWVzOlxuIiwgc3BhY2VzKTsKKyAgICBpbnQgY291bnQgPSAwOworICAgIGJ1ZmZlclswXSA9ICdcMCc7CisgICAgd2hpbGUgKGxvdyA8PSBoaWdoKQorICAgIHsKKyAgICAgICAgc3dpdGNoIChlc2l6ZSkKKyAgICAgICAgeworICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICBzcHJpbnRmKG51bWJlciwgIiVkICIsICooKGNoYXIgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAxOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoc2hvcnQgKilsb3cpKTsKKyAgICAgICAgICAgIGxvdyArPSAyOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgNDoKKyAgICAgICAgICAgIHNwcmludGYobnVtYmVyLCAiJWQgIiwgKigoaW50ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gNDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgc3ByaW50ZihudW1iZXIsICIweCUwMTZ4ICIsICooKHVpbnQ2NF90ICopbG93KSk7CisgICAgICAgICAgICBsb3cgKz0gODsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIHN0cmNhdChidWZmZXIsIG51bWJlcik7CisgICAgICAgIGNvdW50Kys7CisgICAgICAgIGlmIChjb3VudCA9PSAxMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSg0LCAiJXMgICAgICAgICAgICAlc1xuIiwgc3BhY2VzLCBidWZmZXIpOworICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgYnVmZmVyWzBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoY291bnQgIT0gMCkgeworICAgICAgICBPRkZMT0FEX1RSQUNFKDQsICIlcyAgICAgICAgICAgICVzXG4iLCBzcGFjZXMsIGJ1ZmZlcik7CisgICAgfQorfQorCit2b2lkIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWYKKykKK3sKKyAgICBPRkZMT0FEX1RSQUNFKDIsICIlcyVzIENFQU4gZXhwcmVzc2lvbiAlcFxuIiwgc3BhY2VzLCBuYW1lLCBhZHApOworCisgICAgaWYgKGFkcCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiVzICAgIGJhc2U9JWxseCwgcmFuaz0lbGxkXG4iLAorICAgICAgICAgICAgc3BhY2VzLCBhZHAtPmJhc2UsIGFkcC0+cmFuayk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBhZHAtPnJhbms7IGkrKykgeworICAgICAgICAgICAgT0ZGTE9BRF9UUkFDRSgyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMgICAgZGltZW5zaW9uICVkOiBzaXplPSVsbGQsIGxpbmRleD0lbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsb3dlcj0lbGxkLCB1cHBlcj0lbGxkLCBzdHJpZGU9JWxsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3BhY2VzLCBpLCBhZHAtPmRpbVtpXS5zaXplLCBhZHAtPmRpbVtpXS5saW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGFkcC0+ZGltW2ldLmxvd2VyLCBhZHAtPmRpbVtpXS51cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgYWRwLT5kaW1baV0uc3RyaWRlKTsKKyAgICAgICAgfQorICAgICAgICAvLyBGb3IgY19jZWFuX3ZhciB0aGUgYmFzZSBhZGRyIGlzIHRoZSBhZGRyZXNzIG9mIHRoZSBkYXRhCisgICAgICAgIC8vIEZvciBjX2NlYW5fdmFyX3B0ciB0aGUgYmFzZSBhZGRyIGlzIGRlcmVmZXJlbmNlZCB0byBnZXQgdG8gdGhlIGRhdGEKKyAgICAgICAgZ2VuZXJhdGVfbWVtX3JhbmdlcyhzcGFjZXMsIGFkcCwgZGVyZWYsICZwcmludF9yYW5nZSk7CisgICAgfQorfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuaCBiL3JjMy9vZmZsb2FkL3NyYy9jZWFuX3V0aWwuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMGRlYmNjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL2NlYW5fdXRpbC5oCkBAIC0wLDAgKzEsMTAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgQ0VBTl9VVElMX0hfSU5DTFVERUQKKyNkZWZpbmUgQ0VBTl9VVElMX0hfSU5DTFVERUQKKworI2lmIE1QU1NfVkVSU0lPTiA+IDMzCisjaW5jbHVkZSA8c291cmNlL0NPSUJ1ZmZlcl9zb3VyY2UuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWYgTVBTU19WRVJTSU9OIDw9IDMzCisvLyBDRUFOIGV4cHJlc3Npb24gcmVwcmVzZW50YXRpb24KK3N0cnVjdCBkaW1fZGVzYyB7CisgICAgaW50NjRfdCBzaXplOyAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlCisgICAgaW50NjRfdCBsaW5kZXg7ICAgICAvLyBMb3dlciBpbmRleAorICAgIGludDY0X3QgbG93ZXI7ICAgICAgLy8gTG93ZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3QgdXBwZXI7ICAgICAgLy8gVXBwZXIgc2VjdGlvbiBib3VuZAorICAgIGludDY0X3Qgc3RyaWRlOyAgICAgLy8gU3RyaWRlCit9OworCitzdHJ1Y3QgYXJyX2Rlc2MgeworICAgIGludDY0X3QgYmFzZTsgICAgICAgLy8gQmFzZSBhZGRyZXNzCisgICAgaW50NjRfdCByYW5rOyAgICAgICAvLyBSYW5rIG9mIGFycmF5CisgICAgZGltX2Rlc2MgZGltWzFdOworfTsKKyNlbmRpZgorCitzdHJ1Y3QgQ2VhblJlYWREaW0geworICAgIGludDY0X3QgY291bnQ7IC8vIFRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhpcyBkaW1lbnNpb24KKyAgICBpbnQ2NF90IHNpemU7ICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgIC8vIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uLgorfTsKKworc3RydWN0IENlYW5SZWFkUmFuZ2VzIHsKKyAgICB2b2lkICogIHB0cjsKKyAgICBpbnQ2NF90IGN1cnJlbnRfbnVtYmVyOyAgIC8vIHRoZSBudW1iZXIgb2YgcmFuZ2VzIHJlYWQKKyAgICBpbnQ2NF90IHJhbmdlX21heF9udW1iZXI7IC8vIG51bWJlciBvZiBjb250aWd1b3VzIHJhbmdlcworICAgIGludDY0X3QgcmFuZ2Vfc2l6ZTsgICAgICAgLy8gc2l6ZSBvZiBtYXggY29udGlndW91cyByYW5nZQorICAgIGludCAgICAgbGFzdF9ub25jb250X2luZDsgLy8gc2l6ZSBvZiBEaW0gYXJyYXkKKyAgICBpbnQ2NF90IGluaXRfb2Zmc2V0OyAgICAgIC8vIG9mZnNldCBvZiAxLXN0IGVsZW1lbnQgZnJvbSBhcnJheSBsZWZ0IGJvdW5kCisgICAgQ2VhblJlYWREaW0gRGltWzFdOworfTsKKworLy8gYXJyYXkgZGVzY3JpcHRvciBsZW5ndGgKKyNkZWZpbmUgX19hcnJfZGVzY19sZW5ndGgocmFuaykgXAorICAgIChzaXplb2YoaW50NjRfdCkgKyBzaXplb2YoZGltX2Rlc2MpICogKHJhbmspKQorCisvLyByZXR1cm5zIG9mZnNldCBhbmQgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlIHRyYW5zZmVycmVkCit2b2lkIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoY29uc3QgYXJyX2Rlc2MgKmFkcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90ICZvZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCAmbGVuZ3RoKTsKKworLy8gZGVmaW5lIGlmIGRhdGEgYXJyYXkgZGVzY3JpYmVkIGJ5IGFyZ3VtZW50IGlzIGNvbnRpZ3VvdXMgb25lCitib29sIGlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoY29uc3QgYXJyX2Rlc2MgKmFwKTsKKworLy8gYWxsb2NhdGUgZWxlbWVudCBvZiBDZWFuUmVhZFJhbmdlcyB0eXBlIGluaXRpYWxpemVkCisvLyB0byByZWFkIGNvbnNlcXVlbnRseSBjb250aWd1b3VzIHJhbmdlcyBkZXNjcmliZWQgYnkgImFwIiBhcmd1bWVudAorQ2VhblJlYWRSYW5nZXMgKiBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGNvbnN0IGFycl9kZXNjICphcCk7CisKKy8vIGNoZWNrIGlmIHJhbmdlcyBkZXNjcmliZWQgYnkgMSBhcmd1bWVudCBjb3VsZCBiZSB0cmFuc2ZlcnJlZCBpbnRvIHJhbmdlcworLy8gZGVzY3JpYmVkIGJ5IDItbmQgb25lCitib29sIGNlYW5fcmFuZ2VzX21hdGNoKAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcxLAorICAgIENlYW5SZWFkUmFuZ2VzICogcmVhZF9ybmcyCispOworCisvLyBmaXJzdCBhcmd1bWVudCAtIHJldHVybmVkIHZhbHVlIGJ5IGNhbGwgdG8gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYy4KKy8vIHJldHVybnMgdHJ1ZSBpZiBvZmZzZXQgYW5kIGxlbmd0aCBvZiBuZXh0IHJhbmdlIGlzIHNldCBzdWNjZXNzZnVseS4KKy8vIHJldHVybnMgZmFsc2UgaWYgdGhlIHJhbmdlcyBpcyBvdmVyLgorYm9vbCBnZXRfbmV4dF9yYW5nZSgKKyAgICBDZWFuUmVhZFJhbmdlcyAqIHJlYWRfcm5nLAorICAgIGludDY0X3QgKm9mZnNldAorKTsKKworLy8gcmV0dXJucyBudW1iZXIgb2YgdHJhbnNmZXJyZWQgYnl0ZXMKK2ludDY0X3QgY2Vhbl9nZXRfdHJhbnNmX3NpemUoQ2VhblJlYWRSYW5nZXMgKiByZWFkX3JuZyk7CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorLy8gcHJpbnRzIGFycmF5IGRlc2NyaXB0b3IgY29udGVudHMgdG8gc3RkZXJyCit2b2lkICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICBjb25zdCBjaGFyICpzcGFjZXMsCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBjb25zdCBhcnJfZGVzYyAqYWRwLAorICAgIGJvb2wgZGVyZWZlcmVuY2UpOworI2Vsc2UKKyNkZWZpbmUgX19hcnJfZGVzY19kdW1wKAorICAgIHNwYWNlcywKKyAgICBuYW1lLAorICAgIGFkcCwKKyAgICBkZXJlZmVyZW5jZSkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBDRUFOX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2NvaS9jb2lfY2xpZW50LmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYWI4YzdmNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5jcHAKQEAgLTAsMCArMSwzNTAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBob3N0IGludGVyZmFjZQorCisjaW5jbHVkZSAiY29pX2NsaWVudC5oIgorI2luY2x1ZGUgIi4uL29mZmxvYWRfY29tbW9uLmgiCisKK25hbWVzcGFjZSBDT0kgeworCisjZGVmaW5lIENPSV9WRVJTSU9OMSAgICAiQ09JXzEuMCIKKyNkZWZpbmUgQ09JX1ZFUlNJT04yICAgICJDT0lfMi4wIgorCitib29sICAgICAgICAgICAgaXNfYXZhaWxhYmxlOworc3RhdGljIHZvaWQqICAgIGxpYl9oYW5kbGU7CisKKy8vIHBvaW50ZXJzIHRvIGZ1bmN0aW9ucyBmcm9tIENPSSBsaWJyYXJ5CitDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqRW5naW5lR2V0SGFuZGxlKShDT0lfSVNBX1RZUEUsIHVpbnQzMl90LCBDT0lFTkdJTkUqKTsKKworQ09JUkVTVUxUICgqUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkpKENPSUVOR0lORSwgY29uc3QgY2hhciosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBpbnQsIGNvbnN0IGNoYXIqKiwgdWludDhfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKTsKK0NPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LCBpbnQ4X3QqLCB1aW50MzJfdCopOworQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsIGNvbnN0IGNoYXIqKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUZVTkNUSU9OKik7CitDT0lSRVNVTFQgKCpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KShDT0lQUk9DRVNTLCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JTElCUkFSWSopOworQ09JUkVTVUxUICgqUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzKSh1aW50MzJfdCwgY29uc3Qgdm9pZCoqLCBjb25zdCB1aW50NjRfdCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgY29uc3QgdWludDY0X3QqKTsKKworQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsIENPSVBJUEVMSU5FKik7CitDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK0NPSVJFU1VMVCAoKlBpcGVsaW5lUnVuRnVuY3Rpb24pKENPSVBJUEVMSU5FLCBDT0lGVU5DVElPTiwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lCVUZGRVIqLCBjb25zdCBDT0lfQUNDRVNTX0ZMQUdTKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDE2X3QsIHZvaWQqLCB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqQnVmZmVyQ3JlYXRlKSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwgY29uc3Qgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90LCBjb25zdCBDT0lQUk9DRVNTKiwgQ09JQlVGRkVSKik7CitDT0lSRVNVTFQgKCpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KSh1aW50NjRfdCwgQ09JX0JVRkZFUl9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQqLCB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckRlc3Ryb3kpKENPSUJVRkZFUik7CitDT0lSRVNVTFQgKCpCdWZmZXJNYXApKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLCB2b2lkKiopOworQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLCBDT0lFVkVOVCopOworQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLAorICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckNvcHkpKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK0NPSVJFU1VMVCAoKkJ1ZmZlckdldFNpbmtBZGRyZXNzKShDT0lCVUZGRVIsIHVpbnQ2NF90Kik7CitDT0lSRVNVTFQgKCpCdWZmZXJTZXRTdGF0ZSkoQ09JQlVGRkVSLCBDT0lQUk9DRVNTLCBDT0lfQlVGRkVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCAgIENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKKworQ09JUkVTVUxUICgqRXZlbnRXYWl0KSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LCB1aW50MzJfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90Kik7CisKK3VpbnQ2NF90ICAoKlBlcmZHZXRDeWNsZUZyZXF1ZW5jeSkodm9pZCk7CisKK2Jvb2wgaW5pdCh2b2lkKQoreworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICBjb25zdCBjaGFyICpsaWJfbmFtZSA9ICJsaWJjb2lfaG9zdC5zby4wIjsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImNvaV9ob3N0LmRsbCI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIENPSSBsaWJyYXJ5ICVzIC4uLlxuIiwgbGliX25hbWUpOworICAgIGxpYl9oYW5kbGUgPSBETF9vcGVuKGxpYl9uYW1lKTsKKyAgICBpZiAobGliX2hhbmRsZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBsb2FkIHRoZSBsaWJyYXJ5XG4iKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldENvdW50ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRDb3VudCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEVuZ2luZUdldENvdW50ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUVuZ2luZUdldENvdW50Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEVuZ2luZUdldEhhbmRsZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSV9JU0FfVFlQRSwgdWludDMyX3QsIENPSUVOR0lORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lFbmdpbmVHZXRIYW5kbGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChFbmdpbmVHZXRIYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JRW5naW5lR2V0SGFuZGxlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFByb2Nlc3NDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwgY29uc3Qgdm9pZCosIHVpbnQ2NF90LCBpbnQsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqKiwgdWludDhfdCwgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsIENPSVBST0NFU1MqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUHJvY2Vzc0NyZWF0ZUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQcm9jZXNzRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGludDMyX3QsIHVpbnQ4X3QsIGludDhfdCosCisgICAgICAgICAgICAgICAgICAgICAgIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUHJvY2Vzc0Rlc3Ryb3kgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JUHJvY2Vzc0Rlc3Ryb3kiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcyA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIHVpbnQzMl90LCBjb25zdCBjaGFyKiosIENPSUZVTkNUSU9OKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChQcm9jZXNzR2V0RnVuY3Rpb25IYW5kbGVzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc0xvYWRMaWJyYXJ5RnJvbU1lbW9yeSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBST0NFU1MsIGNvbnN0IHZvaWQqLCB1aW50NjRfdCwgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCBjb25zdCBjaGFyKiwgdWludDY0X3QsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lMSUJSQVJZKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiLCBDT0lfVkVSU0lPTjIpOworICAgIGlmIChQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUHJvY2Vzc1JlZ2lzdGVyTGlicmFyaWVzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDMyX3QsIGNvbnN0IHZvaWQqKiwgY29uc3QgdWludDY0X3QqLCBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSVByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFByb2Nlc3NSZWdpc3RlckxpYnJhcmllcyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGlwZWxpbmVDcmVhdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lQUk9DRVNTLCBDT0lfQ1BVX01BU0ssIHVpbnQzMl90LCBDT0lQSVBFTElORSopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZUNyZWF0ZSIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKFBpcGVsaW5lQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lQ3JlYXRlIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIFBpcGVsaW5lRGVzdHJveSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSVBJUEVMSU5FKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGlwZWxpbmVEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVEZXN0cm95ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBpcGVsaW5lRGVzdHJveSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBQaXBlbGluZVJ1bkZ1bmN0aW9uID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JUElQRUxJTkUsIENPSUZVTkNUSU9OLCB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JX0FDQ0VTU19GTEFHUyosIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosIHVpbnQxNl90LCBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGlwZWxpbmVSdW5GdW5jdGlvbiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lQaXBlbGluZVJ1bkZ1bmN0aW9uIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckNyZWF0ZSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsIHVpbnQzMl90LCBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSVBST0NFU1MqLCBDT0lCVUZGRVIqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyQ3JlYXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckNyZWF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBCdWZmZXJDcmVhdGVGcm9tTWVtb3J5ID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsIHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ3JlYXRlRnJvbU1lbW9yeSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDcmVhdGVGcm9tTWVtb3J5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckRlc3Ryb3kgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIpKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJEZXN0cm95IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyRGVzdHJveSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJEZXN0cm95Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlck1hcCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHVpbnQ2NF90LCBDT0lfTUFQX1RZUEUsIHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKiwgQ09JTUFQSU5TVEFOQ0UqLAorICAgICAgICAgICAgICAgICAgICAgICB2b2lkKiopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJNYXAiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJNYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyTWFwIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclVubWFwID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JTUFQSU5TVEFOQ0UsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclVubWFwIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyVW5tYXAgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyVW5tYXAiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyV3JpdGUgPQorICAgICAgICAoQ09JUkVTVUxUICgqKShDT0lCVUZGRVIsIHVpbnQ2NF90LCBjb25zdCB2b2lkKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1RZUEUsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlcldyaXRlIiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyV3JpdGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBDT0kgbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQ09JQnVmZmVyV3JpdGUiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyUmVhZCA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgdWludDY0X3QsIHZvaWQqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUJ1ZmZlclJlYWQiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJSZWFkID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlclJlYWQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgQnVmZmVyQ29weSA9CisgICAgICAgIChDT0lSRVNVTFQgKCopKENPSUJVRkZFUiwgQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwgY29uc3QgQ09JRVZFTlQqLAorICAgICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJDb3B5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoQnVmZmVyQ29weSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJDb3B5Iik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlckdldFNpbmtBZGRyZXNzID0KKyAgICAgICAgKENPSVJFU1VMVCAoKikoQ09JQlVGRkVSLCB1aW50NjRfdCopKQorICAgICAgICAgICAgRExfc3ltKGxpYl9oYW5kbGUsICJDT0lCdWZmZXJHZXRTaW5rQWRkcmVzcyIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEJ1ZmZlckdldFNpbmtBZGRyZXNzID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSUJ1ZmZlckdldFNpbmtBZGRyZXNzIik7CisgICAgICAgIGZpbmkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIEJ1ZmZlclNldFN0YXRlID0KKyAgICAgICAgKENPSVJFU1VMVCgqKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9NT1ZFX0ZMQUcsIHVpbnQzMl90LCBjb25zdCBDT0lFVkVOVCosCisgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JQnVmZmVyU2V0U3RhdGUiLCBDT0lfVkVSU0lPTjEpOworICAgIGlmIChCdWZmZXJTZXRTdGF0ZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lCdWZmZXJTZXRTdGF0ZSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBFdmVudFdhaXQgPQorICAgICAgICAoQ09JUkVTVUxUICgqKSh1aW50MTZfdCwgY29uc3QgQ09JRVZFTlQqLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCosIHVpbnQzMl90KikpCisgICAgICAgICAgICBETF9zeW0obGliX2hhbmRsZSwgIkNPSUV2ZW50V2FpdCIsIENPSV9WRVJTSU9OMSk7CisgICAgaWYgKEV2ZW50V2FpdCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIENPSSBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJDT0lFdmVudFdhaXQiKTsKKyAgICAgICAgZmluaSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID0KKyAgICAgICAgKHVpbnQ2NF90ICgqKSh2b2lkKSkKKyAgICAgICAgICAgIERMX3N5bShsaWJfaGFuZGxlLCAiQ09JUGVyZkdldEN5Y2xlRnJlcXVlbmN5IiwgQ09JX1ZFUlNJT04xKTsKKyAgICBpZiAoUGVyZkdldEN5Y2xlRnJlcXVlbmN5ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gQ09JIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNPSVBlcmZHZXRDeWNsZUZyZXF1ZW5jeSIpOworICAgICAgICBmaW5pKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBpc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgZmluaSh2b2lkKQoreworICAgIGlzX2F2YWlsYWJsZSA9IGZhbHNlOworCisgICAgaWYgKGxpYl9oYW5kbGUgIT0gMCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgRExfY2xvc2UobGliX2hhbmRsZSk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGxpYl9oYW5kbGUgPSAwOworICAgIH0KK30KKworfSAvLyBuYW1lc3BhY2UgQ09JCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaCBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX2NsaWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ3NzVhOGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvY29pL2NvaV9jbGllbnQuaApAQCAtMCwwICsxLDExOCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgaG9zdAorCisjaWZuZGVmIENPSV9DTElFTlRfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfQ0xJRU5UX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lQZXJmX2NvbW1vbi5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lFbmdpbmVfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVByb2Nlc3Nfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSVBpcGVsaW5lX3NvdXJjZS5oPgorI2luY2x1ZGUgPHNvdXJjZS9DT0lCdWZmZXJfc291cmNlLmg+CisjaW5jbHVkZSA8c291cmNlL0NPSUV2ZW50X3NvdXJjZS5oPgorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisKKyNpbmNsdWRlICIuLi9saWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF91dGlsLmgiCisKKyNkZWZpbmUgTUlDX0VOR0lORVNfTUFYICAgICAxMjgKKworI2lmIE1JQ19FTkdJTkVTX01BWCA8IENPSV9NQVhfSVNBX01JQ19ERVZJQ0VTCisjZXJyb3IgTUlDX0VOR0lORVNfTUFYIG5lZWQgdG8gYmUgaW5jcmVhc2VkCisjZW5kaWYKKworLy8gQ09JIGxpYnJhcnkgaW50ZXJmYWNlCituYW1lc3BhY2UgQ09JIHsKKworZXh0ZXJuIGJvb2wgaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIGZpbmkodm9pZCk7CisKK2V4dGVybiBib29sIGlzX2F2YWlsYWJsZTsKKworLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gQ09JIGxpYnJhcnkKK2V4dGVybiBDT0lSRVNVTFQgKCpFbmdpbmVHZXRDb3VudCkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkVuZ2luZUdldEhhbmRsZSkoQ09JX0lTQV9UWVBFLCB1aW50MzJfdCwgQ09JRU5HSU5FKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSkoQ09JRU5HSU5FLCBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwgdWludDY0X3QsIGludCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosIHVpbnQ4X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUFJPQ0VTUyopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NEZXN0cm95KShDT0lQUk9DRVNTLCBpbnQzMl90LCB1aW50OF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludDhfdCosIHVpbnQzMl90Kik7CitleHRlcm4gQ09JUkVTVUxUICgqUHJvY2Vzc0dldEZ1bmN0aW9uSGFuZGxlcykoQ09JUFJPQ0VTUywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lGVU5DVElPTiopOworZXh0ZXJuIENPSVJFU1VMVCAoKlByb2Nlc3NMb2FkTGlicmFyeUZyb21NZW1vcnkpKENPSVBST0NFU1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSUxJQlJBUlkqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMpKHVpbnQzMl90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB2b2lkKiosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHVpbnQ2NF90KiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhcioqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCB1aW50NjRfdCopOworCitleHRlcm4gQ09JUkVTVUxUICgqUGlwZWxpbmVDcmVhdGUpKENPSVBST0NFU1MsIENPSV9DUFVfTUFTSywgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JUElQRUxJTkUqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZURlc3Ryb3kpKENPSVBJUEVMSU5FKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpQaXBlbGluZVJ1bkZ1bmN0aW9uKShDT0lQSVBFTElORSwgQ09JRlVOQ1RJT04sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JQlVGRkVSKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSV9BQ0NFU1NfRkxBR1MqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MTZfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MTZfdCwgQ09JRVZFTlQqKTsKKworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZSkodWludDY0X3QsIENPSV9CVUZGRVJfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHZvaWQqLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgQ09JUFJPQ0VTUyosIENPSUJVRkZFUiopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkpKHVpbnQ2NF90LCBDT0lfQlVGRkVSX1RZUEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgdm9pZCosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50MzJfdCwgY29uc3QgQ09JUFJPQ0VTUyosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJEZXN0cm95KShDT0lCVUZGRVIpOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlck1hcCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdWludDY0X3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfVFlQRSwgdWludDMyX3QsIGNvbnN0IENPSUVWRU5UKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQqLCBDT0lNQVBJTlNUQU5DRSosIHZvaWQqKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyVW5tYXApKENPSU1BUElOU1RBTkNFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyV3JpdGUpKENPSUJVRkZFUiwgdWludDY0X3QsIGNvbnN0IHZvaWQqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyUmVhZCkoQ09JQlVGRkVSLCB1aW50NjRfdCwgdm9pZCosIHVpbnQ2NF90LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVFlQRSwgdWludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBDT0lFVkVOVCosIENPSUVWRU5UKik7CitleHRlcm4gQ09JUkVTVUxUICgqQnVmZmVyQ29weSkoQ09JQlVGRkVSLCBDT0lCVUZGRVIsIHVpbnQ2NF90LCB1aW50NjRfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVpbnQ2NF90LCBDT0lfQ09QWV9UWVBFLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IENPSUVWRU5UKiwgQ09JRVZFTlQqKTsKK2V4dGVybiBDT0lSRVNVTFQgKCpCdWZmZXJHZXRTaW5rQWRkcmVzcykoQ09JQlVGRkVSLCB1aW50NjRfdCopOworZXh0ZXJuIENPSVJFU1VMVCAoKkJ1ZmZlclNldFN0YXRlKShDT0lCVUZGRVIsIENPSVBST0NFU1MsIENPSV9CVUZGRVJfU1RBVEUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTU9WRV9GTEFHLCB1aW50MzJfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgICBDT0lFVkVOVCosIENPSUVWRU5UKik7CisKK2V4dGVybiBDT0lSRVNVTFQgKCpFdmVudFdhaXQpKHVpbnQxNl90LCBjb25zdCBDT0lFVkVOVCosIGludDMyX3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50OF90LCB1aW50MzJfdCosIHVpbnQzMl90Kik7CisKK2V4dGVybiB1aW50NjRfdCAgKCpQZXJmR2V0Q3ljbGVGcmVxdWVuY3kpKHZvaWQpOworCit9IC8vIG5hbWVzcGFjZSBDT0kKKworI2VuZGlmIC8vIENPSV9DTElFTlRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzNlNmMyZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5jcHAKQEAgLTAsMCArMSwxMzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gVGhlIENPSSBpbnRlcmZhY2Ugb24gdGhlIHRhcmdldAorCisjaW5jbHVkZSAiY29pX3NlcnZlci5oIgorCisjaW5jbHVkZSAiLi4vb2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICIuLi9vZmZsb2FkX3RpbWVyLmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICIuLi9vZmZsb2FkX215b190YXJnZXQuaCIgICAgICAvLyBmb3IgX19vZmZsb2FkX215b0xpYkluaXQvRmluaQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfY29tcHV0ZSgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHVpbnQ2NF90KiBidWZmZXJzX2xlbiwKKyAgICB2b2lkKiAgICAgbWlzY19kYXRhLAorICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgIHZvaWQqICAgICByZXR1cm5fZGF0YSwKKyAgICB1aW50MTZfdCAgcmV0dXJuX2RhdGFfbGVuCispCit7CisgICAgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWQoYnVmZmVyX2NvdW50LCBidWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2NfZGF0YSwgbWlzY19kYXRhX2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm5fZGF0YSwgcmV0dXJuX2RhdGFfbGVuKTsKK30KKworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBzdHJ1Y3QgaW5pdF9kYXRhIHsKKyAgICAgICAgaW50ICBkZXZpY2VfaW5kZXg7CisgICAgICAgIGludCAgZGV2aWNlc190b3RhbDsKKyAgICAgICAgaW50ICBjb25zb2xlX2xldmVsOworICAgICAgICBpbnQgIG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIH0gKmRhdGEgPSAoc3RydWN0IGluaXRfZGF0YSopIG1pc2NfZGF0YTsKKworICAgIC8vIHNldCBkZXZpY2UgaW5kZXggYW5kIG51bWJlciBvZiB0b3RhbCBkZXZpY2VzCisgICAgbWljX2luZGV4ID0gZGF0YS0+ZGV2aWNlX2luZGV4OworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGF0YS0+ZGV2aWNlc190b3RhbDsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UgbGV2ZWwKKyAgICBjb25zb2xlX2VuYWJsZWQgPSBkYXRhLT5jb25zb2xlX2xldmVsOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZGF0YS0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisKKyAgICAvLyByZXR1cm4gYmFjayB0aGUgcHJvY2VzcyBpZAorICAgICooKHBpZF90KikgcmV0dXJuX2RhdGEpID0gZ2V0cGlkKCk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX3NpemUoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIHN0cnVjdCBQYXJhbXMgeworICAgICAgICBpbnQ2NF90IG5lbGVtczsKKyAgICAgICAgaW50NjRfdCBsZW5ndGg7CisgICAgfSAqcGFyYW1zOworCisgICAgcGFyYW1zID0gc3RhdGljX2Nhc3Q8UGFyYW1zKj4ocmV0dXJuX2RhdGEpOworICAgIHBhcmFtcy0+bGVuZ3RoID0gX19vZmZsb2FkX3ZhcnMudGFibGVfc2l6ZShwYXJhbXMtPm5lbGVtcyk7Cit9CisKK0NPSU5BVElWRUxJQkVYUE9SVAordm9pZCBzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF92YXJzLnRhYmxlX2NvcHkoYnVmZmVyc1swXSwgKnN0YXRpY19jYXN0PGludDY0X3QqPihtaXNjX2RhdGEpKTsKK30KKworI2lmZGVmIE1ZT19TVVBQT1JUCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3Igb2YgbXlvaUxpYkluaXQvRmluaSBjYWxscworQ09JTkFUSVZFTElCRVhQT1JUCit2b2lkIHNlcnZlcl9teW9pbml0KAorICAgIHVpbnQzMl90ICBidWZmZXJfY291bnQsCisgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgdWludDY0X3QqIGJ1ZmZlcnNfbGVuLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworfQorCitDT0lOQVRJVkVMSUJFWFBPUlQKK3ZvaWQgc2VydmVyX215b2ZpbmkoCisgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICB2b2lkKiogICAgYnVmZmVycywKKyAgICB1aW50NjRfdCogYnVmZmVyc19sZW4sCisgICAgdm9pZCogICAgIG1pc2NfZGF0YSwKKyAgICB1aW50MTZfdCAgbWlzY19kYXRhX2xlbiwKKyAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgdWludDE2X3QgIHJldHVybl9kYXRhX2xlbgorKQoreworICAgIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7Cit9CisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oIGIvcmMzL29mZmxvYWQvc3JjL2NvaS9jb2lfc2VydmVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTc0NGQ5ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9jb2kvY29pX3NlcnZlci5oCkBAIC0wLDAgKzEsNzQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy9UaGUgaW50ZXJmYWNlIGJldHdlZW4gb2ZmbG9hZCBsaWJyYXJ5IGFuZCB0aGUgQ09JIEFQSSBvbiB0aGUgdGFyZ2V0LgorCisjaWZuZGVmIENPSV9TRVJWRVJfSF9JTkNMVURFRAorI2RlZmluZSBDT0lfU0VSVkVSX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGNvbW1vbi9DT0lFbmdpbmVfY29tbW9uLmg+CisjaW5jbHVkZSA8Y29tbW9uL0NPSVBlcmZfY29tbW9uLmg+CisjaW5jbHVkZSA8c2luay9DT0lQcm9jZXNzX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSVBpcGVsaW5lX3NpbmsuaD4KKyNpbmNsdWRlIDxzaW5rL0NPSUJ1ZmZlcl9zaW5rLmg+CisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgIi4uL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gd3JhcHBlcnMgZm9yIENPSSBBUEkKKyNkZWZpbmUgUGlwZWxpbmVTdGFydEV4ZWN1dGluZ1J1bkZ1bmN0aW9ucygpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgUHJvY2Vzc1dhaXRGb3JTaHV0ZG93bigpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSVByb2Nlc3NXYWl0Rm9yU2h1dGRvd24oKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyQWRkUmVmKGJ1ZikgXAorICAgIHsgXAorICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JQnVmZmVyQWRkUmVmKGJ1Zik7IFwKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeyBcCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYnVmX2FkZF9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgQnVmZmVyUmVsZWFzZVJlZihidWYpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSUJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19idWZfcmVsZWFzZV9yZWYsIG1pY19pbmRleCwgcmVzKTsgXAorICAgICAgICAgICAgZXhpdCgxKTsgXAorICAgICAgICB9IFwKKyAgICB9CisKKyNkZWZpbmUgRW5naW5lR2V0SW5kZXgoaW5kZXgpIFwKKyAgICB7IFwKKyAgICAgICAgQ09JX0lTQV9UWVBFIGlzYV90eXBlOyBcCisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0lFbmdpbmVHZXRJbmRleCgmaXNhX3R5cGUsIGluZGV4KTsgXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19nZXRfZW5naW5lX2luZGV4LCBtaWNfaW5kZXgsIHJlcyk7IFwKKyAgICAgICAgICAgIGV4aXQoMSk7IFwKKyAgICAgICAgfSBcCisgICAgfQorCisjZW5kaWYgLy8gQ09JX1NFUlZFUl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmJjNDMwYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmNwcApAQCAtMCwwICsxLDMyMyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfaG9zdC5oIgorCisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGFsbG9jYS5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LiAKKy8vIFRoaXMgdmFyaWFibGUgaXMgdXNlZCBpZiBQMk9QVF9vZmZsb2FkX2RvX2RhdGFfcGVyc2lzdGVuY2UgPT0gMi4KKy8vIFRoZSB2YXJpYWJsZSB1c2VkIHRvIGlkZW50aWZ5IG9mZmxvYWQgY29uc3RydWN0cyBjb250YWluZWQgaW4gb25lIHByb2NlZHVyZS4KKy8vIEluY3JlbWVudCBvZiBPRkZMT0FEX0NBTExfQ09VTlQgaXMgaW5zZXJ0ZWQgYXQgZW50cmllcyBvZiBIT1NUIHJvdXRpbmVzIHdpdGgKKy8vIG9mZmxvYWQgY29uc3RydWN0cy4KK3N0YXRpYyBpbnQgb2ZmbG9hZF9jYWxsX2NvdW50ID0gMDsKKworZXh0ZXJuICJDIiBPRkZMT0FEIE9GRkxPQURfVEFSR0VUX0FDUVVJUkUoCisgICAgVEFSR0VUX1RZUEUgICAgICB0YXJnZXRfdHlwZSwKKyAgICBpbnQgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsCisgICAgaW50ICAgICAgICAgICAgICBpc19vcHRpb25hbCwKKyAgICBfT2ZmbG9hZF9zdGF0dXMqIHN0YXR1cywKKyAgICBjb25zdCBjaGFyKiAgICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgICBsaW5lCispCit7CisgICAgYm9vbCByZXR2YWw7CisgICAgT0ZGTE9BRCBvZmxkOworCisgICAgLy8gaW5pdGlhbGl6ZSBzdGF0dXMKKyAgICBpZiAoc3RhdHVzICE9IDApIHsKKyAgICAgICAgc3RhdHVzLT5yZXN1bHQgPSBPRkZMT0FEX1VOQVZBSUxBQkxFOworICAgICAgICBzdGF0dXMtPmRldmljZV9udW1iZXIgPSAtMTsKKyAgICAgICAgc3RhdHVzLT5kYXRhX3NlbnQgPSAwOworICAgICAgICBzdGF0dXMtPmRhdGFfcmVjZWl2ZWQgPSAwOworICAgIH0KKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQKKyAgICByZXR2YWwgPSBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhID0gT0ZGTE9BRF9USU1FUl9JTklUKGZpbGUsIGxpbmUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICAvLyBpbml0aWFsaXplIGFsbCBkZXZpY2VzIGlzIGluaXRfdHlwZSBpcyBvbl9vZmZsb2FkX2FsbAorICAgIGlmIChyZXR2YWwgJiYgX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fb2ZmbG9hZF9hbGwpIHsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdCgpOworICAgICAgICB9CisgICAgfQorICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUpOworCisgICAgaWYgKHRhcmdldF90eXBlID09IFRBUkdFVF9IT1NUKSB7CisgICAgICAgIC8vIEhvc3QgYWx3YXlzIGF2YWlsYWJsZQorICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBlbHNlIGlmICh0YXJnZXRfdHlwZSA9PSBUQVJHRVRfTUlDKSB7CisgICAgICAgIGlmICh0YXJnZXRfbnVtYmVyID49IC0xKSB7CisgICAgICAgICAgICBpZiAocmV0dmFsKSB7CisgICAgICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBVc2VyIHByb3ZpZGVkIHRoZSBkZXZpY2UgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSB0YXJnZXRfbnVtYmVyICUgbWljX2VuZ2luZXNfdG90YWw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIGlmIChpc19vcHRpb25hbCkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIU9SU0w6OnRyeV9yZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gLTE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghT1JTTDo6cmVzZXJ2ZSh0YXJnZXRfbnVtYmVyKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICAgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA+PSAwICYmCisgICAgICAgICAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKyAgICAgICAgICAgICAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gQ1BVCisgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpZiAodGFyZ2V0X251bWJlciA8IDAgfHwgIXJldHZhbCkgeworICAgICAgICAgICAgICAgIGlmICghaXNfb3B0aW9uYWwgJiYgc3RhdHVzID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR2YWwgPSBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChyZXR2YWwpIHsKKyAgICAgICAgb2ZsZCA9IG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCBzdGF0dXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIWlzX29wdGlvbmFsLCBmYWxzZSwgdGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworICAgICAgICBPZmZsb2FkX1JlcG9ydF9Qcm9sb2codGltZXJfZGF0YSk7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgyLCB0aW1lcl9kYXRhLT5vZmZsb2FkX251bWJlciwgY19vZmZsb2FkX3N0YXJ0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlN0YXJ0aW5nIG9mZmxvYWQ6IHRhcmdldF90eXBlID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJudW1iZXIgPSAlZCwgaXNfb3B0aW9uYWwgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBpc19vcHRpb25hbCk7CisKKyAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG9mbGQgPSBOVUxMOworCisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90YXJnZXRfYWNxdWlyZSk7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkKTsKKyAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKHRpbWVyX2RhdGEpOworICAgIH0KKworICAgIHJldHVybiBvZmxkOworfQorCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgZGV2aWNlX251bSwKKyAgICBjb25zdCBjaGFyKiBmaWxlLAorICAgIHVpbnQ2NF90ICAgIGxpbmUKKykKK3sKKyAgICBpbnQgdGFyZ2V0X251bWJlcjsKKworICAgIC8vIG1ha2Ugc3VyZSBsaWJyYXkgaXMgaW5pdGlhbGl6ZWQgYW5kIGF0IGxlYXN0IG9uZSBkZXZpY2UgaXMgYXZhaWxhYmxlCisgICAgaWYgKCFfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBPRkZMT0FEX1RJTUVSX0lOSVQgbXVzdCBmb2xsb3cgY2FsbCB0byBfX29mZmxvYWRfaW5pdF9saWJyYXJ5CisKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEgPSBPRkZMT0FEX1RJTUVSX0lOSVQoZmlsZSwgbGluZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfaW5pdF90eXBlID09IGNfaW5pdF9vbl9vZmZsb2FkX2FsbCkgeworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AodGltZXJfZGF0YSwgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIC8vIHVzZSBkZWZhdWx0IGRldmljZSBudW1iZXIgaWYgaXQgaXMgbm90IHByb3ZpZGVkCisgICAgaWYgKGRldmljZV9udW0gIT0gMCkgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gKmRldmljZV9udW07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0YXJnZXRfbnVtYmVyID0gX19vbXBfZGV2aWNlX251bTsKKyAgICB9CisKKyAgICAvLyBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlCisgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICAvLyBzaG91bGQgd2UgZG8gdGhpcyBmb3IgT3Blbk1QPworICAgIHRhcmdldF9udW1iZXIgJT0gbWljX2VuZ2luZXNfdG90YWw7CisKKyAgICAvLyByZXNlcnZlIGRldmljZSBpbiBPUlNMCisgICAgaWYgKCFPUlNMOjpyZXNlcnZlKHRhcmdldF9udW1iZXIpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UocykKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X2luaXRpYWxpemUpOworCisgICAgaWYgKF9fb2ZmbG9hZF9pbml0X3R5cGUgPT0gY19pbml0X29uX29mZmxvYWQpIHsKKyAgICAgICAgbWljX2VuZ2luZXNbdGFyZ2V0X251bWJlcl0uaW5pdCgpOworICAgIH0KKworICAgIE9GRkxPQURfVElNRVJfU1RPUCh0aW1lcl9kYXRhLCBjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKTsKKworICAgIE9GRkxPQUQgb2ZsZCA9CisgICAgICAgIG5ldyBPZmZsb2FkRGVzY3JpcHRvcih0YXJnZXRfbnVtYmVyLCAwLCB0cnVlLCB0cnVlLCB0aW1lcl9kYXRhKTsKKworICAgIE9GRkxPQURfVElNRVJfSE9TVF9NSUNfTlVNKHRpbWVyX2RhdGEsIHRhcmdldF9udW1iZXIpOworCisgICAgT2ZmbG9hZF9SZXBvcnRfUHJvbG9nKHRpbWVyX2RhdGEpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyLCBjX29mZmxvYWRfc3RhcnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJTdGFydGluZyBPcGVuTVAgb2ZmbG9hZCwgZGV2aWNlID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlKTsKKworICAgIHJldHVybiBvZmxkOworfQorCitpbnQgb2ZmbG9hZF9vZmZsb2FkX3dyYXAoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgYm9vbCByZXQgPSBvZmxkLT5vZmZsb2FkKG5hbWUsIGlzX2VtcHR5LCB2YXJzLCB2YXJzMiwgbnVtX3ZhcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzLCBudW1fd2FpdHMsIHNpZ25hbCwgZW50cnlfaWQsIHN0YWNrX2FkZHIpOworICAgIGlmICghcmV0IHx8IHNpZ25hbCA9PSAwKSB7CisgICAgICAgIGRlbGV0ZSBvZmxkOworICAgIH0KKyAgICByZXR1cm4gcmV0OworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQxKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbAorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIE5VTEwsIE5VTEwpOworfQorCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKQoreworICAgIHJldHVybiBvZmZsb2FkX29mZmxvYWRfd3JhcChvZmxkLCBuYW1lLCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdmFycywgdmFycywgdmFyczIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3dhaXRzLCB3YWl0cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9PRkZMT0FEKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgY29uc3Qgdm9pZCAqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgLy8gc2lnbmFsIGlzIHBhc3NlZCBieSByZWZlcmVuY2Ugbm93CisgICAgY29uc3Qgdm9pZCAqKnNpZ25hbF9uZXcgPSAoc2lnbmFsICE9IDApID8gJnNpZ25hbCA6IDA7CisgICAgY29uc3Qgdm9pZCAqKndhaXRzX25ldyA9IDA7CisgICAgaW50IG51bV93YWl0c19uZXcgPSAwOworCisgICAgLy8gcmVtb3ZlIE5VTEwgdmFsdWVzIGZyb20gdGhlIGxpc3Qgb2Ygc2lnbmFscyB0byB3YWl0IGZvcgorICAgIGlmIChudW1fd2FpdHMgPiAwKSB7CisgICAgICAgIHdhaXRzX25ldyA9IChjb25zdCB2b2lkKiopIGFsbG9jYShzaXplb2Yodm9pZCopICogbnVtX3dhaXRzKTsKKyAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworICAgICAgICAgICAgaWYgKHdhaXRzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICB3YWl0c19uZXdbbnVtX3dhaXRzX25ldysrXSA9IHdhaXRzW2ldOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE9GRkxPQURfT0ZGTE9BRDEob2ZsZCwgbmFtZSwgaXNfZW1wdHksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3ZhcnMsIHZhcnMsIHZhcnMyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV93YWl0c19uZXcsIHdhaXRzX25ldywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWduYWxfbmV3KTsKK30KKworZXh0ZXJuICJDIiBpbnQgT0ZGTE9BRF9DQUxMX0NPVU5UKCkKK3sKKyAgICBvZmZsb2FkX2NhbGxfY291bnQrKzsKKyAgICByZXR1cm4gb2ZmbG9hZF9jYWxsX2NvdW50OworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX2hvc3QuaCBiL3JjMy9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIzNGM1MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl9ob3N0LmgKQEAgLTAsMCArMSwxMzMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBpbnRlcmZhY2UgYmV0d2VlbiBjb21waWxlci1nZW5lcmF0ZWQgaG9zdCBjb2RlIGFuZCBydW50aW1lIGxpYnJhcnkKKyovCisKKyNpZm5kZWYgQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfYWNxdWlyZTEpCisjZGVmaW5lIE9GRkxPQURfT0ZGTE9BRCAgICAgICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgob2ZmbG9hZCkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMSAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMSkKKyNkZWZpbmUgT0ZGTE9BRF9PRkZMT0FEMiAgICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkMikKKyNkZWZpbmUgT0ZGTE9BRF9DQUxMX0NPVU5UICAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWChvZmZsb2FkX2NhbGxfY291bnQpCisKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFCisgICAgXGJyaWVmIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgdGFyZ2V0LgorICAgIFxwYXJhbSB0YXJnZXRfdHlwZSAgIFRoZSB0eXBlIG9mIHRhcmdldC4KKyAgICBccGFyYW0gdGFyZ2V0X251bWJlciBUaGUgZGV2aWNlIG51bWJlci4KKyAgICBccGFyYW0gaXNfb3B0aW9uYWwgICBXaGV0aGVyIENQVSBmYWxsLWJhY2sgaXMgYWxsb3dlZC4KKyAgICBccGFyYW0gc3RhdHVzICAgICAgICBBZGRyZXNzIG9mIHZhcmlhYmxlIHRvIGhvbGQgb2ZmbG9hZCBzdGF0dXMuCisgICAgXHBhcmFtIGZpbGUgICAgICAgICAgRmlsZW5hbWUgaW4gd2hpY2ggdGhpcyBvZmZsb2FkIG9jY3VycmVkLgorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSgKKyAgICBUQVJHRVRfVFlQRSAgICAgIHRhcmdldF90eXBlLAorICAgIGludCAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgICAgICAgICAgICAgIGlzX29wdGlvbmFsLAorICAgIF9PZmZsb2FkX3N0YXR1cyogc3RhdHVzLAorICAgIGNvbnN0IGNoYXIqICAgICAgZmlsZSwKKyAgICB1aW50NjRfdCAgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEKKyAgICBcYnJpZWYgQWNxdWlyZSB0aGUgdGFyZ2V0IGZvciBvZmZsb2FkIChPcGVuTVApLgorICAgIFxwYXJhbSBkZXZpY2VfbnVtYmVyIERldmljZSBudW1iZXIgb3IgbnVsbCBpZiBub3Qgc3BlY2lmaWVkLgorICAgIFxwYXJhbSBmaWxlICAgICAgICAgIEZpbGVuYW1lIGluIHdoaWNoIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZAorICAgIFxwYXJhbSBsaW5lICAgICAgICAgIExpbmUgbnVtYmVyIGluIHRoZSBmaWxlIHdoZXJlIHRoaXMgb2ZmbG9hZCBvY2N1cnJlZC4KKyovCitleHRlcm4gIkMiIE9GRkxPQUQgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRTEoCisgICAgY29uc3QgaW50KiAgICAgIGRldmljZV9udW1iZXIsCisgICAgY29uc3QgY2hhciogICAgIGZpbGUsCisgICAgdWludDY0X3QgICAgICAgIGxpbmUKKyk7CisKKy8qISBcZm4gT0ZGTE9BRF9PRkZMT0FEMQorICAgIFxicmllZiBSdW4gZnVuY3Rpb24gb24gdGFyZ2V0IHVzaW5nIGludGVyZmFjZSBmb3Igb2xkIGRhdGEgcGVyc2lzdGVuY2UuCisgICAgXHBhcmFtIG8gT2ZmbG9hZCBkZXNjcmlwdG9yIGNyZWF0ZWQgYnkgT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRS4KKyAgICBccGFyYW0gbmFtZSBOYW1lIG9mIG9mZmxvYWQgZW50cnkgcG9pbnQuCisgICAgXHBhcmFtIGlzX2VtcHR5IElmIG5vIGNvZGUgdG8gZXhlY3V0ZSAoZS5nLiBvZmZsb2FkX3RyYW5zZmVyKQorICAgIFxwYXJhbSBudW1fdmFycyBOdW1iZXIgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMuCisgICAgXHBhcmFtIHZhcnMgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJzMiBQb2ludGVyIHRvIFZhckRlc2MyIGFycmF5LgorICAgIFxwYXJhbSBudW1fd2FpdHMgTnVtYmVyIG9mICJ3YWl0IiB2YWx1ZXMuCisgICAgXHBhcmFtIHdhaXRzIFBvaW50ZXIgdG8gYXJyYXkgb2Ygd2FpdCB2YWx1ZXMuCisgICAgXHBhcmFtIHNpZ25hbCBQb2ludGVyIHRvIHNpZ25hbCB2YWx1ZSBvciBOVUxMLgorKi8KK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRDEoCisgICAgT0ZGTE9BRCBvLAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgaW50IGlzX2VtcHR5LAorICAgIGludCBudW1fdmFycywKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgbnVtX3dhaXRzLAorICAgIGNvbnN0IHZvaWQqKiB3YWl0cywKKyAgICBjb25zdCB2b2lkKiogc2lnbmFsCispOworCisvKiEgXGZuIE9GRkxPQURfT0ZGTE9BRDIKKyAgICBcYnJpZWYgUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCB1c2luZyBpbnRlcmZhY2UgZm9yIG5ldyBkYXRhIHBlcnNpc3RlbmNlLgorICAgIFxwYXJhbSBvIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisgICAgXHBhcmFtIG5hbWUgTmFtZSBvZiBvZmZsb2FkIGVudHJ5IHBvaW50LgorICAgIFxwYXJhbSBpc19lbXB0eSBJZiBubyBjb2RlIHRvIGV4ZWN1dGUgKGUuZy4gb2ZmbG9hZF90cmFuc2ZlcikKKyAgICBccGFyYW0gbnVtX3ZhcnMgTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJzIFBvaW50ZXIgdG8gVmFyRGVzYyBhcnJheS4KKyAgICBccGFyYW0gdmFyczIgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyAgICBccGFyYW0gbnVtX3dhaXRzIE51bWJlciBvZiAid2FpdCIgdmFsdWVzLgorICAgIFxwYXJhbSB3YWl0cyBQb2ludGVyIHRvIGFycmF5IG9mIHdhaXQgdmFsdWVzLgorICAgIFxwYXJhbSBzaWduYWwgUG9pbnRlciB0byBzaWduYWwgdmFsdWUgb3IgTlVMTC4KKyAgICBccGFyYW0gZW50cnlfaWQgQSBzaWduYXR1cmUgZm9yIHRoZSBmdW5jdGlvbiBkb2luZyB0aGUgb2ZmbG9hZC4KKyAgICBccGFyYW0gc3RhY2tfYWRkciBUaGUgc3RhY2sgZnJhbWUgYWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24gZG9pbmcgb2ZmbG9hZC4KKyovCitleHRlcm4gIkMiIGludCBPRkZMT0FEX09GRkxPQUQyKAorICAgIE9GRkxPQUQgbywKKyAgICBjb25zdCBjaGFyICpuYW1lLAorICAgIGludCBpc19lbXB0eSwKKyAgICBpbnQgbnVtX3ZhcnMsCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkKiogd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQsCisgICAgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcgorKTsKKworLy8gUnVuIGZ1bmN0aW9uIG9uIHRhcmdldCAob2Jzb2xldGUpLgorLy8gQHBhcmFtIG8gICAgT0ZGTE9BRCBvYmplY3QKKy8vIEBwYXJhbSBuYW1lIGZ1bmN0aW9uIG5hbWUKK2V4dGVybiAiQyIgaW50IE9GRkxPQURfT0ZGTE9BRCgKKyAgICBPRkZMT0FEIG8sCisgICAgY29uc3QgY2hhciAqbmFtZSwKKyAgICBpbnQgaXNfZW1wdHksCisgICAgaW50IG51bV92YXJzLAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCBudW1fd2FpdHMsCisgICAgY29uc3Qgdm9pZCoqIHdhaXRzLAorICAgIGNvbnN0IHZvaWQqIHNpZ25hbCwKKyAgICBpbnQgZW50cnlfaWQgPSAwLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIgPSBOVUxMCispOworCisvLyBHbG9iYWwgY291bnRlciBvbiBob3N0LgorLy8gVGhpcyB2YXJpYWJsZSBpcyB1c2VkIGlmIFAyT1BUX29mZmxvYWRfZG9fZGF0YV9wZXJzaXN0ZW5jZSA9PSAyLgorLy8gVGhlIHZhcmlhYmxlIHVzZWQgdG8gaWRlbnRpZnkgb2ZmbG9hZCBjb25zdHJ1Y3RzIGNvbnRhaW5lZCBpbiBvbmUgcHJvY2VkdXJlLgorLy8gQ2FsbCB0byBPRkZMT0FEX0NBTExfQ09VTlQoKSBpcyBpbnNlcnRlZCBhdCBIT1NUIG9uIGVudHJ5IG9mIHRoZSByb3V0aW5lLgorZXh0ZXJuICJDIiBpbnQgIE9GRkxPQURfQ0FMTF9DT1VOVCgpOworCisjZW5kaWYgLy8gQ09NUElMRVJfSUZfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9jb21waWxlcl9pZl90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFhZjgyYjgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDQ0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJjb21waWxlcl9pZl90YXJnZXQuaCIKKworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0VOVEVSKAorICAgIE9GRkxPQUQgb2ZsZCwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlZCwgJXAsICVwKVxuIiwgX19mdW5jX18sIG9mbGQsCisgICAgICAgICAgICAgICAgICAgICAgICB2YXJzX3RvdGFsLCB2YXJzLCB2YXJzMik7CisgICAgb2ZsZC0+bWVyZ2VfdmFyX2Rlc2NzKHZhcnMsIHZhcnMyLCB2YXJzX3RvdGFsKTsKKyAgICBvZmxkLT5zY2F0dGVyX2NvcHlpbl9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9MRUFWRSgKKyAgICBPRkZMT0FEIG9mbGQKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBvZmxkKTsKKyAgICBvZmxkLT5nYXRoZXJfY29weW91dF9kYXRhKCk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBPRkZMT0FEX1RBUkdFVF9NQUlOKHZvaWQpCit7CisgICAgLy8gaW5pdGlhbGl6ZSB0YXJnZXQgcGFydAorICAgIF9fb2ZmbG9hZF90YXJnZXRfaW5pdCgpOworCisgICAgLy8gcGFzcyBjb250cm9sIHRvIENPSQorICAgIFBpcGVsaW5lU3RhcnRFeGVjdXRpbmdSdW5GdW5jdGlvbnMoKTsKKyAgICBQcm9jZXNzV2FpdEZvclNodXRkb3duKCk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJFeGl0aW5nIG1haW4uLi5cbiIpOworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5oIGIvcmMzL29mZmxvYWQvc3JjL2NvbXBpbGVyX2lmX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZDJjMWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvY29tcGlsZXJfaWZfdGFyZ2V0LmgKQEAgLTAsMCArMSw1MCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIGludGVyZmFjZSBiZXR3ZWVuIGNvbXBpbGVyLWdlbmVyYXRlZCB0YXJnZXQgY29kZSBhbmQgcnVudGltZSBsaWJyYXJ5CisqLworCisjaWZuZGVmIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisjZGVmaW5lIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCisjZGVmaW5lIE9GRkxPQURfVEFSR0VUX0VOVEVSICAgICAgICAgICAgT0ZGTE9BRF9QUkVGSVgodGFyZ2V0X2VudGVyKQorI2RlZmluZSBPRkZMT0FEX1RBUkdFVF9MRUFWRSAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKHRhcmdldF9sZWF2ZSkKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfTUFJTiAgICAgICAgICAgICBPRkZMT0FEX1BSRUZJWCh0YXJnZXRfbWFpbikKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9FTlRFUgorICAgIFxicmllZiBGaWxsIGluIHZhcmlhYmxlIGFkZHJlc3NlcyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxicmllZiBUaGVuIGNhbGwgYmFjayB0aGUgcnVudGltZSBsaWJyYXJ5IHRvIGZldGNoIGRhdGEuCisgICAgXHBhcmFtIG9mbGQgICAgICAgICBPZmZsb2FkIGRlc2NyaXB0b3IgY3JlYXRlZCBieSBydW50aW1lLgorICAgIFxwYXJhbSB2YXJfZGVzY19udW0gTnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzLgorICAgIFxwYXJhbSB2YXJfZGVzYyAgICAgUG9pbnRlciB0byBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSB2YXJfZGVzYzIgICAgUG9pbnRlciB0byBWYXJEZXNjMiBhcnJheS4KKyovCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfRU5URVIoCisgICAgT0ZGTE9BRCBvZmxkLAorICAgIGludCB2YXJfZGVzY19udW0sCisgICAgVmFyRGVzYyAqdmFyX2Rlc2MsCisgICAgVmFyRGVzYzIgKnZhcl9kZXNjMgorKTsKKworLyohIFxmbiBPRkZMT0FEX1RBUkdFVF9MRUFWRQorICAgIFxicmllZiBDYWxsIGJhY2sgdGhlIHJ1bnRpbWUgbGlicmFyeSB0byBnYXRoZXIgb3V0cHV0cyB1c2luZyBWYXJEZXNjIGFycmF5LgorICAgIFxwYXJhbSBvZmxkIE9mZmxvYWQgZGVzY3JpcHRvciBjcmVhdGVkIGJ5IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUuCisqLworZXh0ZXJuICJDIiB2b2lkIE9GRkxPQURfVEFSR0VUX0xFQVZFKAorICAgIE9GRkxPQUQgb2ZsZAorKTsKKworLy8gRW50cnkgcG9pbnQgZm9yIHRoZSB0YXJnZXQgYXBwbGljYXRpb24uCitleHRlcm4gIkMiIHZvaWQgT0ZGTE9BRF9UQVJHRVRfTUFJTih2b2lkKTsKKworI2VuZGlmIC8vIENPTVBJTEVSX0lGX1RBUkdFVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvZHZfdXRpbC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvZHZfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGFkNzI3MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9kdl91dGlsLmNwcApAQCAtMCwwICsxLDEzMSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworYm9vbCBfX2R2X2lzX2NvbnRpZ3VvdXMoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGlmIChkdnAtPkZsYWdzICYgQXJyRGVzY0ZsYWdzQ29udGlndW91cykgeworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBpZiAoZHZwLT5SYW5rICE9IDApIHsKKyAgICAgICAgaWYgKGR2cC0+RGltWzBdLk11bHQgIT0gZHZwLT5MZW4pIHsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGludCBpID0gMTsgaSA8IGR2cC0+UmFuazsgaSsrKSB7CisgICAgICAgICAgICBpZiAoZHZwLT5EaW1baV0uTXVsdCAhPQorICAgICAgICAgICAgICAgIGR2cC0+RGltW2ktMV0uRXh0ZW50ICogZHZwLT5EaW1baS0xXS5NdWx0KSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIF9fZHZfaXNfYWxsb2NhdGVkKGNvbnN0IEFyckRlc2MgKmR2cCkKK3sKKyAgICByZXR1cm4gKGR2cC0+RmxhZ3MgJiBBcnJEZXNjRmxhZ3NEZWZpbmVkKTsKK30KKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgdWludDY0X3Qgc2l6ZTsKKworICAgIGlmIChkdnAtPlJhbmsgPT0gMCkgeworICAgICAgICBzaXplID0gZHZwLT5MZW47CisgICAgICAgIHJldHVybiBzaXplOworICAgIH0KKworICAgIHNpemUgPSBkdnAtPkxlbjsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGR2cC0+UmFuazsgKytpKSB7CisgICAgICAgIHNpemUgKz0gKGR2cC0+RGltW2ldLkV4dGVudC0xKSAqIGR2cC0+RGltW2ldLk11bHQ7CisgICAgfQorICAgIHJldHVybiBzaXplOworfQorCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBjb3VudCkKK3sKKyAgICBpZiAoZHZwLT5SYW5rID09IDApIHsKKyAgICAgICAgcmV0dXJuIGNvdW50OworICAgIH0KKworICAgIHJldHVybiBjb3VudCAqIGR2cC0+RGltWzBdLk11bHQ7Cit9CisKKy8vIENyZWF0ZSBDZWFuUmVhZFJhbmdlcyBkYXRhIGZvciByZWFkaW5nIGNvbnRpZ3VvdXMgcmFuZ2VzIG9mCisvLyBub25jb250aWd1b3VzIGFycmF5IGRlZmluZWQgYnkgdGhlIGFyZ3VtZW50CitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKQoreworICAgIGludDY0X3QgICAgICAgICBsZW47CisgICAgaW50ICAgICAgICAgICAgIGNvdW50OworICAgIGludCAgICAgICAgICAgICByYW5rID0gZHZwLT5SYW5rOworICAgIENlYW5SZWFkUmFuZ2VzICpyZXMgPSBOVUxMOworCisgICAgaWYgKHJhbmsgIT0gMCkgeworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGxlbiA9IGR2cC0+TGVuOworICAgICAgICBpZiAoZHZwLT5EaW1bMF0uTXVsdCA9PSBsZW4pIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPCByYW5rOyBpKyspIHsKKyAgICAgICAgICAgICAgICBsZW4gKj0gZHZwLT5EaW1baS0xXS5FeHRlbnQ7CisgICAgICAgICAgICAgICAgaWYgKGR2cC0+RGltW2ldLk11bHQgIT0gbGVuKSB7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXMgPSAoQ2VhblJlYWRSYW5nZXMgKiltYWxsb2MoCisgICAgICAgICAgICBzaXplb2YoQ2VhblJlYWRSYW5nZXMpICsgKHJhbmsgLSBpKSAqIHNpemVvZihDZWFuUmVhZERpbSkpOworICAgICAgICByZXMgLT4gbGFzdF9ub25jb250X2luZCA9IHJhbmsgLSBpIC0gMTsKKyAgICAgICAgY291bnQgPSAxOworICAgICAgICBmb3IgKDsgaSA8IHJhbms7IGkrKykgeworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5jb3VudCA9IGNvdW50OworICAgICAgICAgICAgcmVzLT5EaW1bcmFuayAtIGkgLSAxXS5zaXplID0gZHZwLT5EaW1baV0uTXVsdDsKKyAgICAgICAgICAgIGNvdW50ICo9IGR2cC0+RGltW2ldLkV4dGVudDsKKyAgICAgICAgfQorICAgICAgICByZXMgLT4gcmFuZ2VfbWF4X251bWJlciA9IGNvdW50OworICAgICAgICByZXMgLT4gcmFuZ2Vfc2l6ZSA9IGxlbjsKKyAgICAgICAgcmVzIC0+IHB0ciA9ICh2b2lkKilkdnAtPkJhc2U7CisgICAgICAgIHJlcyAtPiBjdXJyZW50X251bWJlciA9IDA7CisgICAgICAgIHJlcyAtPiBpbml0X29mZnNldCA9IDA7CisgICAgfQorICAgIHJldHVybiByZXM7Cit9CisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAordm9pZCBfX2R2X2Rlc2NfZHVtcChjb25zdCBjaGFyICpuYW1lLCBjb25zdCBBcnJEZXNjICpkdnApCit7CisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiJXMgRFYgJXBcbiIsIG5hbWUsIGR2cCk7CisKKyAgICBpZiAoZHZwICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLAorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkJhc2UgICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+TGVuICAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5PZmZzZXQgPSAweCVseFxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgZHYtPkZsYWdzICA9IDB4JWx4XG4iCisgICAgICAgICAgICAgICAgICAgICAgIiAgICBkdi0+UmFuayAgID0gMHglbHhcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiICAgIGR2LT5SZXNydmQgPSAweCVseFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPkJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5MZW4sCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5PZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5GbGFncywKKyAgICAgICAgICAgICAgICAgICAgICBkdnAtPlJhbmssCisgICAgICAgICAgICAgICAgICAgICAgZHZwLT5SZXNlcnZlZCk7CisKKyAgICAgICAgZm9yIChpbnQgaSA9IDAgOyBpIDwgZHZwLT5SYW5rOyBpKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAoJWQpIEV4dGVudD0lbGQsIE11bHRpcGxpZXI9JWxkLCBMb3dlckJvdW5kPSVsZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZHZwLT5EaW1baV0uRXh0ZW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5NdWx0LAorICAgICAgICAgICAgICAgICAgICAgICAgICBkdnAtPkRpbVtpXS5Mb3dlckJvdW5kKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2R2X3V0aWwuaCBiL3JjMy9vZmZsb2FkL3NyYy9kdl91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmRmYTc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9kdl91dGlsLmgKQEAgLTAsMCArMSw2MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIERWX1VUSUxfSF9JTkNMVURFRAorI2RlZmluZSBEVl9VVElMX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGludC5oPgorCisvLyBEb3BlIHZlY3RvciBkZWNsYXJhdGlvbnMKKyNkZWZpbmUgQXJyRGVzY01heEFycmF5UmFuayAgICAgICAgIDMxCisKKy8vIERvcGUgdmVjdG9yIGZsYWdzCisjZGVmaW5lIEFyckRlc2NGbGFnc0RlZmluZWQgICAgICAgICAxCisjZGVmaW5lIEFyckRlc2NGbGFnc05vZGVhbGxvYyAgICAgICAyCisjZGVmaW5lIEFyckRlc2NGbGFnc0NvbnRpZ3VvdXMgICAgICA0CisKK3R5cGVkZWYgaW50NjRfdCBkdl9zaXplOworCit0eXBlZGVmIHN0cnVjdCBEaW1EZXNjIHsKKyAgICBkdl9zaXplICAgICAgICBFeHRlbnQ7ICAgICAgLy8gTnVtYmVyIG9mIGVsZW1lbnRzIGluIHRoaXMgZGltZW5zaW9uCisgICAgZHZfc2l6ZSAgICAgICAgTXVsdDsgICAgICAgIC8vIE11bHRpcGxpZXIgZm9yIHRoaXMgZGltZW5zaW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgbnVtYmVyIG9mIGJ5dGVzIGJldHdlZW4gc3VjY2Vzc2l2ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBlbGVtZW50cyBpbiB0aGlzIGRpbWVuc2lvbi4KKyAgICBkdl9zaXplICAgICAgICBMb3dlckJvdW5kOyAgLy8gTG93ZXJCb3VuZCBvZiB0aGlzIGRpbWVuc2lvbgorfSBEaW1EZXNjIDsKKwordHlwZWRlZiBzdHJ1Y3QgQXJyRGVzYyB7CisgICAgZHZfc2l6ZSAgICAgICAgQmFzZTsgICAgICAgIC8vIEJhc2UgYWRkcmVzcworICAgIGR2X3NpemUgICAgICAgIExlbjsgICAgICAgICAvLyBMZW5ndGggb2YgZGF0YSB0eXBlLCB1c2VkIG9ubHkgZm9yCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNoYXJhY3RlciBzdHJpbmdzLgorICAgIGR2X3NpemUgICAgICAgIE9mZnNldDsKKyAgICBkdl9zaXplICAgICAgICBGbGFnczsgICAgICAgLy8gRmxhZ3MKKyAgICBkdl9zaXplICAgICAgICBSYW5rOyAgICAgICAgLy8gUmFuayBvZiBwb2ludGVyCisgICAgZHZfc2l6ZSAgICAgICAgUmVzZXJ2ZWQ7ICAgIC8vIHJlc2VydmVkIGZvciBvcGVubXAgcmVxdWVzdHMKKyAgICBEaW1EZXNjIERpbVtBcnJEZXNjTWF4QXJyYXlSYW5rXTsKK30gQXJyRGVzYyA7CisKK3R5cGVkZWYgQXJyRGVzYyogcEFyckRlc2M7CisKK2Jvb2wgX19kdl9pc19jb250aWd1b3VzKGNvbnN0IEFyckRlc2MgKmR2cCk7CisKK2Jvb2wgX19kdl9pc19hbGxvY2F0ZWQoY29uc3QgQXJyRGVzYyAqZHZwKTsKKwordWludDY0X3QgX19kdl9kYXRhX2xlbmd0aChjb25zdCBBcnJEZXNjICpkdnApOworCit1aW50NjRfdCBfX2R2X2RhdGFfbGVuZ3RoKGNvbnN0IEFyckRlc2MgKmR2cCwgaW50NjRfdCBuZWxlbXMpOworCitDZWFuUmVhZFJhbmdlcyAqIGluaXRfcmVhZF9yYW5nZXNfZHYoY29uc3QgQXJyRGVzYyAqZHZwKTsKKworI2lmIE9GRkxPQURfREVCVUcgPiAwCit2b2lkICAgIF9fZHZfZGVzY19kdW1wKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IEFyckRlc2MgKmR2cCk7CisjZWxzZSAvLyBPRkZMT0FEX0RFQlVHCisjZGVmaW5lIF9fZHZfZGVzY19kdW1wKG5hbWUsIGR2cCkKKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKyNlbmRpZiAvLyBEVl9VVElMX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX2Vycm9yLmMgYi9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZjMTVmOGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvci5jCkBAIC0wLDAgKzEsNDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2lmbmRlZiB2YV9jb3B5CisjZGVmaW5lIHZhX2NvcHkoZHN0LCBzcmMpICgoZHN0KSA9IChzcmMpKQorI2VuZGlmCisKKyNpbmNsdWRlICJsaWJvZmZsb2FkX21zZy5oIgorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiBlcnJvci1oYW5kbGluZyBmdW5jdGlvbiwgbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0ICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3ZvaWQgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQoZXJyb3JfdHlwZXMgaW5wdXRfdGFnLCAuLi4pCit7CisgICAgdmFfbGlzdCBhcmdzOworICAgIHZhX3N0YXJ0KGFyZ3MsIGlucHV0X3RhZyk7CisKKyAgICBzd2l0Y2ggKGlucHV0X3RhZykgeworICAgICAgICBjYXNlIGNfZGV2aWNlX2lzX25vdF9hdmFpbGFibGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGV2aWNlX2lzX25vdF9hdmFpbGFibGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19pbnZhbGlkX2RldmljZV9udW1iZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfc2VuZF9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19zZW5kX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcmVjZWl2ZV9mdW5jX3B0cjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9tYWxsb2M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb2ZmbG9hZF9tYWxsb2MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Vua25vd25fdmFyX3R5cGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgY191bmtub3duX3Zhcl90eXBlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2ludmFsaWRfZW52X3JlcG9ydF92YWx1ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19pbnZhbGlkX2Vudl9yZXBvcnRfdmFsdWUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbGVkMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19vZmZsb2FkX3NpZ25hbGVkMSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2lnbmFsZWQyOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvd3JhcHBlcl9jaGVja3Jlc3VsdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19teW93cmFwcGVyX2NoZWNrcmVzdWx0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX215b3RhcmdldF9jaGVja3Jlc3VsdCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MxLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWVyZ2VfdmFyX2Rlc2NzMjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tZXJnZV92YXJfZGVzY3MyLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDE6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19wcm9jZXNzX2V4aXRfcmV0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWc6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfcHJvY2Vzc19leGl0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19wcm9jZXNzX2V4aXQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbWljX2luaXQ0OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX21pY19pbml0NCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX21pY19pbml0NToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19taWNfaW5pdDUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfaW5pdDY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfbWljX2luaXQ2LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbm9fc3RhdGljX3Zhcl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3B0cl9kYXRhOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vX3B0cl9kYXRhLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZ2V0X2VuZ2luZV9oYW5kbGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19nZXRfZW5naW5lX2luZGV4OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2dldF9lbmdpbmVfaW5kZXgsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX2NyZWF0ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93bjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wcm9jZXNzX3dhaXRfc2h1dGRvd24sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX3Byb3h5X2ZsdXNoOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXM6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfbG9hZF9saWJyYXJ5OgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2xvYWRfbGlicmFyeSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2NvaXBpcGVfbWF4X251bWJlcjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX2NyZWF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19waXBlbGluZV9ydW5fZnVuYzoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9ydW5fZnVuYywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9jcmVhdGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfY3JlYXRlX291dF9vZl9tZW06CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2Rlc3Ryb3k6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2Rlc3Ryb3ksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfbWFwOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2J1Zl9tYXAsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfdW5tYXA6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3VubWFwLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlYWQsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfd3JpdGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3dyaXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2NvcHk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2NvcHksIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2dldF9hZGRyZXNzLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX2FkZF9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX2FkZF9yZWYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19idWZfcmVsZWFzZV9yZWY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYnVmX3JlbGVhc2VfcmVmLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYnVmX3NldF9zdGF0ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19idWZfc2V0X3N0YXRlLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfZXZlbnRfd2FpdDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19ldmVudF93YWl0LCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfcHRyX2xlbjoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ19wdHJfbGVuLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZToKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfYmFkX3B0cl9tZW1fcmFuZ2U6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfYmFkX3B0cl9tZW1fcmFuZ2UsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19yYW5nZXNfZG9udF9tYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX2Rlc3RpbmF0aW9uX2lzX292ZXI6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXk6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaDoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19wb2ludGVyX2FycmF5X21pc21hdGNoLCBhcmdzKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnY6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX29tcF9pbnZhbGlkX2RldmljZV9udW0sIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY191bmtub3duX2JpbmFyeV90eXBlOgorICAgICAgICAgICAgd3JpdGVfbWVzc2FnZShzdGRlcnIsIG1zZ19jX3Vua25vd25fYmluYXJ5X3R5cGUsIGFyZ3MpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19tdWx0aXBsZV90YXJnZXRfZXhlczoKKyAgICAgICAgICAgIHdyaXRlX21lc3NhZ2Uoc3RkZXJyLCBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcywgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX3RhcmdldF9leGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2Nfbm9fdGFyZ2V0X2V4ZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGU6CisgICAgICAgICAgICB3cml0ZV9tZXNzYWdlKHN0ZGVyciwgbXNnX2NfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwgYXJncyk7CisgICAgICAgICAgICBicmVhazsKKyAgICB9CisgICAgdmFfZW5kKGFyZ3MpOworfQorCitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpCit7CisgICAgc3dpdGNoIChpbnB1dF90YWcpIHsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90aXRsZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RpdGxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZnJvbV9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZnJvbV9maWxlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfb2ZmbG9hZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X29mZmxvYWQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9maWxlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZmlsZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2xpbmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9saW5lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3QpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF90YWc6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YWcpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdGltZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NwdV90aW1lKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2Vjb25kczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlY29uZHMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9jcHVfdG9fbWljX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcHVfdG9fbWljX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9ieXRlczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2J5dGVzKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfdGltZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X21pY190b19jcHVfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jb3B5aW5fZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfY3JlYXRlX2J1Zl9taWM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2Rlc3Ryb3k6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9kZXN0cm95KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZV9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zaWduYWw6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zaWduYWwpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF93YWl0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfd2FpdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X2luaXQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9pbml0KSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfaW5pdF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaW5pdF9mdW5jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbG9naWNhbF9jYXJkOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19mcHRyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbWljX215b19mcHRyKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9taWNfbXlvX3NoYXJlZCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b2FjcXVpcmU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9hY3F1aXJlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvZmluaToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X215b2ZpbmkpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9pbml0OgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvaW5pdCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3JlZ2lzdGVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9yZWxlYXNlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvcmVsZWFzZSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYykpOworICAgICAgICBjYXNlIGNfcmVwb3J0X215b3NoYXJlZGZyZWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9teW9zaGFyZWRmcmVlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcGh5c2ljYWxfY2FyZDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3BoeXNpY2FsX2NhcmQpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfcmVnaXN0ZXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9yZWdpc3RlcikpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NjYXR0ZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3NlbmRfcG9pbnRlcl9kYXRhOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfc3RhcnQ6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9zdGFydCkpOworICAgICAgICBjYXNlIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF9zdGF0ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3N0YXRlKSk7CisgICAgICAgIGNhc2UgY19yZXBvcnRfdW5yZWdpc3RlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3VucmVnaXN0ZXIpKTsKKyAgICAgICAgY2FzZSBjX3JlcG9ydF92YXI6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF92YXIpKTsKKworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CisKK2NoYXIgY29uc3QgKiByZXBvcnRfZ2V0X2hvc3Rfc3RhZ2Vfc3RyKGludCBpKQoreworICAgIHN3aXRjaCAoaSkgeworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQ6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZToKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfaW5pdGlhbGl6ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3RhcmdldF9hY3F1aXJlOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2V0dXBfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3Rfc2V0dXBfYnVmZmVycykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGE6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcikpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X3NlbmRfcG9pbnRlcnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3NlbmRfcG9pbnRlcnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9nYXRoZXJfaW5wdXRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfbWFwX2luX2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlcjoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIoCisgICAgICAgICAgICAgICAgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfd2FpdF9jb21wdXRlOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3Rfc2NhdHRlcl9vdXRwdXRzOgorICAgICAgICAgICAgcmV0dXJuICgKKyAgICAgICAgICAgICAgICBvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfaG9zdF9zY2F0dGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cigKKyAgICAgICAgICAgICAgICBtc2dfY19yZXBvcnRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcykpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVyczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzKSk7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KK30KKworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSkKK3sKKyAgICBzd2l0Y2ggKGkpIHsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3RvdGFsX3RpbWU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cDoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9kZXNjcmlwdG9yX3NldHVwKSk7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3RhcmdldF9mdW5jX2xvb2t1cDoKKyAgICAgICAgICAgIHJldHVybiAob2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lOgorICAgICAgICAgICAgcmV0dXJuIChvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihtc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHM6CisgICAgICAgICAgICByZXR1cm4gKAorICAgICAgICAgICAgICAgIG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmczoKKyAgICAgICAgICAgIHJldHVybiAoCisgICAgICAgICAgICAgICAgb2ZmbG9hZF9nZXRfbWVzc2FnZV9zdHIobXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGU6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKG1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSkpOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyCisgICAgICAgICAgICAgICAgKG1zZ19jX3JlcG9ydF90YXJnZXRfZ2F0aGVyX291dHB1dHMpKTsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnM6CisgICAgICAgICAgICByZXR1cm4gKG9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKAorICAgICAgICAgICAgICAgIG1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcykpOworICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3JlcG9ydF91bmtub3duX3RpbWVyX25vZGUpOworICAgICAgICAgICAgYWJvcnQoKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9lcnJvcl9jb2Rlcy5oIGIvcmMzL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODIxNjdiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfZXJyb3JfY29kZXMuaApAQCAtMCwwICsxLDI3NiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWYgIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQorI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SX0NPREVTX0gKKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorCit0eXBlZGVmIGVudW0KK3sKKyAgICBjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlID0gMCwKKyAgICBjX2ludmFsaWRfZGV2aWNlX251bWJlciwKKyAgICBjX29mZmxvYWQxLAorICAgIGNfdW5rbm93bl92YXJfdHlwZSwKKyAgICBjX3NlbmRfZnVuY19wdHIsCisgICAgY19yZWNlaXZlX2Z1bmNfcHRyLAorICAgIGNfb2ZmbG9hZF9tYWxsb2MsCisgICAgY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsCisgICAgY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLAorICAgIGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgIGNfb2ZmbG9hZF9zaWduYWxlZDEsCisgICAgY19vZmZsb2FkX3NpZ25hbGVkMiwKKyAgICBjX215b3RhcmdldF9jaGVja3Jlc3VsdCwKKyAgICBjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisgICAgY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwKKyAgICBjX21lcmdlX3Zhcl9kZXNjczEsCisgICAgY19tZXJnZV92YXJfZGVzY3MyLAorICAgIGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEsCisgICAgY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKyAgICBjX21pY19wcm9jZXNzX2V4aXRfcmV0LAorICAgIGNfbWljX3Byb2Nlc3NfZXhpdF9zaWcsCisgICAgY19taWNfcHJvY2Vzc19leGl0LAorICAgIGNfbWljX2luaXQzLAorICAgIGNfbWljX2luaXQ0LAorICAgIGNfbWljX2luaXQ1LAorICAgIGNfbWljX2luaXQ2LAorICAgIGNfbm9fc3RhdGljX3Zhcl9kYXRhLAorICAgIGNfbm9fcHRyX2RhdGEsCisgICAgY19nZXRfZW5naW5lX2hhbmRsZSwKKyAgICBjX2dldF9lbmdpbmVfaW5kZXgsCisgICAgY19wcm9jZXNzX2NyZWF0ZSwKKyAgICBjX3Byb2Nlc3NfZ2V0X2Z1bmNfaGFuZGxlcywKKyAgICBjX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biwKKyAgICBjX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisgICAgY19sb2FkX2xpYnJhcnksCisgICAgY19waXBlbGluZV9jcmVhdGUsCisgICAgY19waXBlbGluZV9ydW5fZnVuYywKKyAgICBjX3BpcGVsaW5lX3N0YXJ0X3J1bl9mdW5jcywKKyAgICBjX2J1Zl9jcmVhdGUsCisgICAgY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisgICAgY19idWZfY3JlYXRlX2Zyb21fbWVtLAorICAgIGNfYnVmX2Rlc3Ryb3ksCisgICAgY19idWZfbWFwLAorICAgIGNfYnVmX3VubWFwLAorICAgIGNfYnVmX3JlYWQsCisgICAgY19idWZfd3JpdGUsCisgICAgY19idWZfY29weSwKKyAgICBjX2J1Zl9nZXRfYWRkcmVzcywKKyAgICBjX2J1Zl9hZGRfcmVmLAorICAgIGNfYnVmX3JlbGVhc2VfcmVmLAorICAgIGNfYnVmX3NldF9zdGF0ZSwKKyAgICBjX2V2ZW50X3dhaXQsCisgICAgY196ZXJvX29yX25lZ19wdHJfbGVuLAorICAgIGNfemVyb19vcl9uZWdfdHJhbnNmZXJfc2l6ZSwKKyAgICBjX2JhZF9wdHJfbWVtX3JhbmdlLAorICAgIGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICBjX3Jhbmdlc19kb250X21hdGNoLAorICAgIGNfZGVzdGluYXRpb25faXNfb3ZlciwKKyAgICBjX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisgICAgY19ub25fY29udGlndW91c19kb3BlX3ZlY3RvciwKKyAgICBjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsCisgICAgY19vbXBfaW52YWxpZF9kZXZpY2VfbnVtX2VudiwKKyAgICBjX29tcF9pbnZhbGlkX2RldmljZV9udW0sCisgICAgY191bmtub3duX2JpbmFyeV90eXBlLAorICAgIGNfbXVsdGlwbGVfdGFyZ2V0X2V4ZXMsCisgICAgY19ub190YXJnZXRfZXhlLAorICAgIGNfcmVwb3J0X2hvc3QsCisgICAgY19yZXBvcnRfdGFyZ2V0LAorICAgIGNfcmVwb3J0X3RpdGxlLAorICAgIGNfcmVwb3J0X2Zyb21fZmlsZSwKKyAgICBjX3JlcG9ydF9maWxlLAorICAgIGNfcmVwb3J0X2xpbmUsCisgICAgY19yZXBvcnRfdGFnLAorICAgIGNfcmVwb3J0X3NlY29uZHMsCisgICAgY19yZXBvcnRfYnl0ZXMsCisgICAgY19yZXBvcnRfbWljLAorICAgIGNfcmVwb3J0X2NwdV90aW1lLAorICAgIGNfcmVwb3J0X2NwdV90b19taWNfZGF0YSwKKyAgICBjX3JlcG9ydF9taWNfdGltZSwKKyAgICBjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisgICAgY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlLAorICAgIGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSwKKyAgICBjX3JlcG9ydF9vZmZsb2FkLAorICAgIGNfcmVwb3J0X3dfdGFnLAorICAgIGNfcmVwb3J0X3N0YXRlLAorICAgIGNfcmVwb3J0X3N0YXJ0LAorICAgIGNfcmVwb3J0X2luaXQsCisgICAgY19yZXBvcnRfbG9naWNhbF9jYXJkLAorICAgIGNfcmVwb3J0X3BoeXNpY2FsX2NhcmQsCisgICAgY19yZXBvcnRfcmVnaXN0ZXIsCisgICAgY19yZXBvcnRfaW5pdF9mdW5jLAorICAgIGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCwKKyAgICBjX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKyAgICBjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSwKKyAgICBjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfY29weWluX2RhdGEsCisgICAgY19yZXBvcnRfc3RhdGVfc2lnbmFsLAorICAgIGNfcmVwb3J0X3NpZ25hbCwKKyAgICBjX3JlcG9ydF93YWl0LAorICAgIGNfcmVwb3J0X2NvbXB1dGUsCisgICAgY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisgICAgY19yZXBvcnRfcmVjZWl2ZWRfcG9pbnRlcl9kYXRhLAorICAgIGNfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfcmVwb3J0X3ZhciwKKyAgICBjX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhLAorICAgIGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisgICAgY19yZXBvcnRfY29weW91dF9kYXRhLAorICAgIGNfcmVwb3J0X3VucmVnaXN0ZXIsCisgICAgY19yZXBvcnRfZGVzdHJveSwKKyAgICBjX3JlcG9ydF9teW9pbml0LAorICAgIGNfcmVwb3J0X215b3JlZ2lzdGVyLAorICAgIGNfcmVwb3J0X215b2ZpbmksCisgICAgY19yZXBvcnRfbWljX215b19zaGFyZWQsCisgICAgY19yZXBvcnRfbWljX215b19mcHRyLAorICAgIGNfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKyAgICBjX3JlcG9ydF9teW9zaGFyZWRmcmVlLAorICAgIGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRtYWxsb2MsCisgICAgY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgY19yZXBvcnRfbXlvYWNxdWlyZSwKKyAgICBjX3JlcG9ydF9teW9yZWxlYXNlLAorICAgIGNfY29pcGlwZV9tYXhfbnVtYmVyCit9IGVycm9yX3R5cGVzOworCitlbnVtIE9mZmxvYWRIb3N0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgb24gaG9zdCBmb3IgZW50aXJlIG9mZmxvYWQKKyAgICBjX29mZmxvYWRfaG9zdF90b3RhbF9vZmZsb2FkID0gMCwKKworICAgIC8vIFRpbWUgdG8gbG9hZCB0YXJnZXQgYmluYXJ5CisgICAgY19vZmZsb2FkX2hvc3RfaW5pdGlhbGl6ZSwKKworICAgIC8vIFRpbWUgdG8gYWNxdWlyZSBscmIgYXZhaWxhYmlsaXR5IGR5bmFtaWNhbGx5CisgICAgY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgZm9yIGRlcGVuZGVuY2llcworICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcywKKworICAgIC8vIFRpbWUgdG8gYWxsb2NhdGUgcG9pbnRlciBidWZmZXJzLCBpbml0aWF0ZSB3cml0ZXMgZm9yIHBvaW50ZXJzCisgICAgLy8gYW5kIGNhbGN1bGF0ZSBzaXplIG9mIGNvcHlpbi9jb3B5b3V0IGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGFsbG9jYXRlIHBvaW50ZXIgYnVmZmVycworICAgIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgbWlzYyBkYXRhCisgICAgY19vZmZsb2FkX2hvc3Rfc2V0dXBfbWlzY19kYXRhLAorCisgICAgLy8gVGltZSB0byBhbGxvY2F0ZSBjb3B5aW4vY29weW91dCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciwKKworICAgIC8vIFRpbWUgdG8gaW5pdGlhdGUgd3JpdGVzIGZyb20gaG9zdCBwb2ludGVycyB0byBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycywKKworICAgIC8vIFRpbWUgdG8gR2F0aGVyIElOIGRhdGEgb2Ygb2ZmbG9hZCBpbnRvIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHVubWFwIGJ1ZmZlcgorICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byBzdGFydCByZW1vdGUgZnVuY3Rpb24gY2FsbCB0aGF0IGRvZXMgY29tcHV0YXRpb24gb24gbHJiCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfY29tcHV0ZSwKKworICAgIC8vIFRpbWUgdG8gd2FpdCBmb3IgY29tcHV0ZSB0byBmaW5pc2gKKyAgICBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYXRlIHJlYWRzIGZyb20gcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gdXBkYXRlIGhvc3QgdmFyaWFiZWxzIHdpdGggT1VUIGRhdGEgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMsCisKKyAgICAvLyBUaW1lIHRvIG1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCisgICAgLy8gVGltZSB0byB1bm1hcCBidWZmZXIKKyAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIsCisKKyAgICAvLyBUaW1lIHRvIHdhaXQgcmVhZHMgZnJvbSBidWZmZXJzIHRvIGZpbmlzaAorICAgIGNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcywKKworICAgIC8vIFRpbWUgdG8gZGVzdHJveSBidWZmZXJzIHRoYXQgYXJlIG5vIGxvbmdlciBuZWVkZWQKKyAgICBjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMsCisKKyAgICAvLyBMQVNUIFRJTUUgTU9OSVRPUgorICAgIGNfb2ZmbG9hZF9ob3N0X21heF9waGFzZQorfTsKKworZW51bSBPZmZsb2FkVGFyZ2V0UGhhc2UgeworICAgIC8vIFRvdGFsIHRpbWUgc3BlbnQgb24gdGhlIHRhcmdldAorICAgIGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSA9IDAsCisKKyAgICAvLyBUaW1lIHRvIGluaXRpYWxpemUgb2ZmbG9hZCBkZXNjcmlwdG9yCisgICAgY19vZmZsb2FkX3RhcmdldF9kZXNjcmlwdG9yX3NldHVwLAorCisgICAgLy8gVGltZSB0byBmaW5kIHRhcmdldCBlbnRyeSBwb2ludCBpbiBsb29rdXAgdGFibGUKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfbG9va3VwLAorCisgICAgLy8gVG90YWwgdGltZSBzcGVuZCBleGVjdXRpbmcgb2ZmbG9hZCBlbnRyeQorICAgIGNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lLAorCisgICAgLy8gVGltZSB0byBpbml0aWFsaXplIHRhcmdldCB2YXJpYWJsZXMgd2l0aCBJTiB2YWx1ZXMgZnJvbSBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCisgICAgLy8gVGltZSB0byBhZGQgYnVmZmVyIHJlZmVyZW5jZSBmb3IgcG9pbnRlciBidWZmZXJzCisgICAgY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMsCisKKyAgICAvLyBUb3RhbCB0aW1lIG9uIGxyYiBmb3IgY29tcHV0YXRpb24KKyAgICBjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUsCisKKyAgICAvLyBPbiBscmIsIHRpbWUgdG8gY29weSBPVVQgaW50byBidWZmZXIKKyAgICBjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCisgICAgLy8gVGltZSB0byByZWxlYXNlIGJ1ZmZlciByZWZlcmVuY2VzCisgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzLAorCisgICAgLy8gTEFTVCBUSU1FIE1PTklUT1IKKyAgICBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZQorfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2xpYm9mZmxvYWRfZXJyb3Jfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7Cit2b2lkIF9fbGlib2ZmbG9hZF9yZXBvcnRfc3VwcG9ydChlcnJvcl90eXBlcyBpbnB1dF90YWcsIC4uLik7CitjaGFyIGNvbnN0ICpvZmZsb2FkX2dldF9tZXNzYWdlX3N0cihpbnQgbXNnQ29kZSk7CitjaGFyIGNvbnN0ICogcmVwb3J0X2dldF9tZXNzYWdlX3N0cihlcnJvcl90eXBlcyBpbnB1dF90YWcpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIoaW50IGkpOworY2hhciBjb25zdCAqIHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihpbnQgaSk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZGVmaW5lIHRlc3RfbXNnX2NhdChubSwgbXNnKSBcCisgICAgZnByaW50ZihzdGRlcnIsICJcdCBURVNUIGZvciAlcyBcbiBcdCIsIG5tKTsgXAorICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KG1zZyk7CisKKyNkZWZpbmUgdGVzdF9tc2dfY2F0MShubSwgbXNnLCAuLi4pIFwKKyAgICBmcHJpbnRmKHN0ZGVyciwgIlx0IFRFU1QgZm9yICVzIFxuIFx0Iiwgbm0pOyBcCisgICAgX19saWJvZmZsb2FkX2Vycm9yX3N1cHBvcnQobXNnLCBfX1ZBX0FSR1NfXyk7CisKK3ZvaWQgd3JpdGVfbWVzc2FnZShGSUxFICogZmlsZSwgaW50IG1zZ0NvZGUsIHZhX2xpc3QgYXJnc19wKTsKKworI2RlZmluZSBMSUJPRkZMT0FEX0VSUk9SIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTElCT0ZGTE9BRF9BQk9SVCBcCisgICAgICAgICBfc2V0X2Fib3J0X2JlaGF2aW9yKDAsIF9XUklURV9BQk9SVF9NU0cpOyBcCisgICAgICAgICBhYm9ydCgpCisjZWxzZQorI2RlZmluZSBMSUJPRkZMT0FEX0FCT1JUIFwKKyAgICAgICAgIGFib3J0KCkKKyNlbmRpZgorCisjZW5kaWYgLy8gIWRlZmluZWQoTElCT0ZGTE9BRF9FUlJPUl9DT0RFU19IKQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMgYi9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMTYwMzkyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL2xpYm9mZmxvYWRfbXNnLmMKQEAgLTAsMCArMSwzNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisKKyNpbmNsdWRlIDxzdGRpby5oPgorCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy8vIEJyaW5nIGluIHRoZSBzdGF0aWMgc3RyaW5nIHRhYmxlIGFuZCB0aGUgZW51bWVyYXRpb25zIGZvciBpbmRleGluZyBpbnRvCisvLyBpdC4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisjaW5jbHVkZSAibGlib2ZmbG9hZF9tc2cuaCIKKworIyBkZWZpbmUgRFlOQVJUX1NUREVSUl9QVVRTKF9fbWVzc2FnZV90ZXh0X18pIGZwdXRzKChfX21lc3NhZ2VfdGV4dF9fKSxzdGRlcnIpCisKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTm93IHRoZSBjb2RlIGZvciBhY2Nlc3NpbmcgdGhlIG1lc3NhZ2UgY2F0YWxvZ3MKKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCisKKyAgICB2b2lkIHdyaXRlX21lc3NhZ2UoRklMRSAqIGZpbGUsIGludCBtc2dDb2RlKSB7CisgICAgICAgIGZwdXRzKE1FU1NBR0VfVEFCTEVfTkFNRVsgbXNnQ29kZSBdLCBmaWxlKTsKKyAgICAgICAgZmZsdXNoKGZpbGUpOworICAgIH0KKworICAgIGNoYXIgY29uc3QgKm9mZmxvYWRfZ2V0X21lc3NhZ2Vfc3RyKGludCBtc2dDb2RlKSB7CisgICAgICAgIHJldHVybiBNRVNTQUdFX1RBQkxFX05BTUVbIG1zZ0NvZGUgXTsKKyAgICB9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaCBiL3JjMy9vZmZsb2FkL3NyYy9saWJvZmZsb2FkX21zZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMxNDQ1ZjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvbGlib2ZmbG9hZF9tc2cuaApAQCAtMCwwICsxLDMyNiBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworLy8gZmlsZTogbGlib2ZmbG9hZF9tc2cuaAorZW51bSB7CisJX19kdW1teV9fID0gMCwKKwltc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSwKKwltc2dfY19pbnZhbGlkX2RldmljZV9udW1iZXIsCisJbXNnX2Nfc2VuZF9mdW5jX3B0ciwKKwltc2dfY19yZWNlaXZlX2Z1bmNfcHRyLAorCW1zZ19jX29mZmxvYWRfbWFsbG9jLAorCW1zZ19jX29mZmxvYWQxLAorCW1zZ19jX3Vua25vd25fdmFyX3R5cGUsCisJbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorCW1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisJbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQxLAorCW1zZ19jX29mZmxvYWRfc2lnbmFsZWQyLAorCW1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsCisJbXNnX2NfbXlvdGFyZ2V0X2NoZWNrcmVzdWx0LAorCW1zZ19jX29mZmxvYWRfZGVzY3JpcHRvcl9vZmZsb2FkLAorCW1zZ19jX21lcmdlX3Zhcl9kZXNjczEsCisJbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMiwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MSwKKwltc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3JldCwKKwltc2dfY19taWNfcHJvY2Vzc19leGl0X3NpZywKKwltc2dfY19taWNfcHJvY2Vzc19leGl0LAorCW1zZ19jX21pY19pbml0MywKKwltc2dfY19taWNfaW5pdDQsCisJbXNnX2NfbWljX2luaXQ1LAorCW1zZ19jX21pY19pbml0NiwKKwltc2dfY19ub19zdGF0aWNfdmFyX2RhdGEsCisJbXNnX2Nfbm9fcHRyX2RhdGEsCisJbXNnX2NfZ2V0X2VuZ2luZV9oYW5kbGUsCisJbXNnX2NfZ2V0X2VuZ2luZV9pbmRleCwKKwltc2dfY19wcm9jZXNzX2NyZWF0ZSwKKwltc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMsCisJbXNnX2NfcHJvY2Vzc193YWl0X3NodXRkb3duLAorCW1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2gsCisJbXNnX2NfbG9hZF9saWJyYXJ5LAorCW1zZ19jX3BpcGVsaW5lX2NyZWF0ZSwKKwltc2dfY19waXBlbGluZV9ydW5fZnVuYywKKwltc2dfY19waXBlbGluZV9zdGFydF9ydW5fZnVuY3MsCisJbXNnX2NfYnVmX2NyZWF0ZSwKKwltc2dfY19idWZfY3JlYXRlX291dF9vZl9tZW0sCisJbXNnX2NfYnVmX2NyZWF0ZV9mcm9tX21lbSwKKwltc2dfY19idWZfZGVzdHJveSwKKwltc2dfY19idWZfbWFwLAorCW1zZ19jX2J1Zl91bm1hcCwKKwltc2dfY19idWZfcmVhZCwKKwltc2dfY19idWZfd3JpdGUsCisJbXNnX2NfYnVmX2NvcHksCisJbXNnX2NfYnVmX2dldF9hZGRyZXNzLAorCW1zZ19jX2J1Zl9hZGRfcmVmLAorCW1zZ19jX2J1Zl9yZWxlYXNlX3JlZiwKKwltc2dfY19idWZfc2V0X3N0YXRlLAorCW1zZ19jX2V2ZW50X3dhaXQsCisJbXNnX2NfemVyb19vcl9uZWdfcHRyX2xlbiwKKwltc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplLAorCW1zZ19jX2JhZF9wdHJfbWVtX3JhbmdlLAorCW1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisJbXNnX2Nfbm9uX2NvbnRpZ3VvdXNfZG9wZV92ZWN0b3IsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisJbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSwKKwltc2dfY191bmtub3duX2JpbmFyeV90eXBlLAorCW1zZ19jX211bHRpcGxlX3RhcmdldF9leGVzLAorCW1zZ19jX25vX3RhcmdldF9leGUsCisJbXNnX2NfcmVwb3J0X3Vua25vd25fdGltZXJfbm9kZSwKKwltc2dfY19yZXBvcnRfdW5rbm93bl90cmFjZV9ub2RlLAorCW1zZ19jX3JlcG9ydF9ob3N0LAorCW1zZ19jX3JlcG9ydF9taWMsCisJbXNnX2NfcmVwb3J0X3RpdGxlLAorCW1zZ19jX3JlcG9ydF9zZWNvbmRzLAorCW1zZ19jX3JlcG9ydF9ieXRlcywKKwltc2dfY19yZXBvcnRfY3B1X3RpbWUsCisJbXNnX2NfcmVwb3J0X21pY190aW1lLAorCW1zZ19jX3JlcG9ydF90YWcsCisJbXNnX2NfcmVwb3J0X2Zyb21fZmlsZSwKKwltc2dfY19yZXBvcnRfZmlsZSwKKwltc2dfY19yZXBvcnRfbGluZSwKKwltc2dfY19yZXBvcnRfY3B1X3RvX21pY19kYXRhLAorCW1zZ19jX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEsCisJbXNnX2NfcmVwb3J0X29mZmxvYWQsCisJbXNnX2NfcmVwb3J0X3dfdGFnLAorCW1zZ19jX3JlcG9ydF9zdGF0ZSwKKwltc2dfY19yZXBvcnRfc3RhcnQsCisJbXNnX2NfcmVwb3J0X2luaXQsCisJbXNnX2NfcmVwb3J0X2xvZ2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcGh5c2ljYWxfY2FyZCwKKwltc2dfY19yZXBvcnRfcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X2luaXRfZnVuYywKKwltc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0LAorCW1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYywKKwltc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhLAorCW1zZ19jX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlpbl9kYXRhLAorCW1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwsCisJbXNnX2NfcmVwb3J0X3NpZ25hbCwKKwltc2dfY19yZXBvcnRfd2FpdCwKKwltc2dfY19yZXBvcnRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEsCisJbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKwltc2dfY19yZXBvcnRfc3RhcnRfdGFyZ2V0X2Z1bmMsCisJbXNnX2NfcmVwb3J0X3ZhciwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSwKKwltc2dfY19yZXBvcnRfZ2F0aGVyX2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEsCisJbXNnX2NfcmVwb3J0X2NvcHlvdXRfZGF0YSwKKwltc2dfY19yZXBvcnRfdW5yZWdpc3RlciwKKwltc2dfY19yZXBvcnRfZGVzdHJveSwKKwltc2dfY19yZXBvcnRfbXlvaW5pdCwKKwltc2dfY19yZXBvcnRfbXlvcmVnaXN0ZXIsCisJbXNnX2NfcmVwb3J0X215b2ZpbmksCisJbXNnX2NfcmVwb3J0X21pY19teW9fc2hhcmVkLAorCW1zZ19jX3JlcG9ydF9taWNfbXlvX2ZwdHIsCisJbXNnX2NfcmVwb3J0X215b3NoYXJlZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkZnJlZSwKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYywKKwltc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisJbXNnX2NfcmVwb3J0X215b2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X215b3JlbGVhc2UsCisJbXNnX2NfcmVwb3J0X2hvc3RfdG90YWxfb2ZmbG9hZF90aW1lLAorCW1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUsCisJbXNnX2NfcmVwb3J0X2hvc3RfdGFyZ2V0X2FjcXVpcmUsCisJbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfYnVmZmVycywKKwltc2dfY19yZXBvcnRfaG9zdF9zZXR1cF9taXNjX2RhdGEsCisJbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIsCisJbXNnX2NfcmVwb3J0X2hvc3Rfc2VuZF9wb2ludGVycywKKwltc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X21hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF91bm1hcF9pbl9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlLAorCW1zZ19jX3JlcG9ydF9ob3N0X3dhaXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfaG9zdF9zdGFydF9idWZmZXJzX3JlYWRzLAorCW1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cywKKwltc2dfY19yZXBvcnRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyLAorCW1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX291dF9kYXRhX2J1ZmZlciwKKwltc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMsCisJbXNnX2NfcmVwb3J0X2hvc3RfZGVzdHJveV9idWZmZXJzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfdG90YWxfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAsCisJbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2Z1bmNfdGltZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfY29tcHV0ZSwKKwltc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzLAorCW1zZ19jX3JlcG9ydF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcywKKwltc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciwKKwltc2dfY19yYW5nZXNfZG9udF9tYXRjaCwKKwltc2dfY19kZXN0aW5hdGlvbl9pc19vdmVyLAorCW1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXksCisJbXNnX2NfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwKKwlsYXN0TXNnID0gMTUyLAorCWZpcnN0TXNnID0gMQorfTsKKworCisjaWYgIWRlZmluZWQoTUVTU0FHRV9UQUJMRV9OQU1FKQorIyAgICBkZWZpbmUgTUVTU0FHRV9UQUJMRV9OQU1FIF9fbGlib2ZmbG9hZF9tZXNzYWdlX3RhYmxlCisjZW5kaWYKKworc3RhdGljIGNoYXIgY29uc3QgKiBNRVNTQUdFX1RBQkxFX05BTUVbXSA9IHsKKwkvKiAgIDAgX19kdW1teV9fICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovICJVbi11c2VkIG1lc3NhZ2UiLAorCS8qICAgMSBtc2dfY19kZXZpY2VfaXNfbm90X2F2YWlsYWJsZSAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBvZmZsb2FkIHRvIE1JQyAtIGRldmljZSBpcyBub3QgYXZhaWxhYmxlIiwKKwkvKiAgIDIgbXNnX2NfaW52YWxpZF9kZXZpY2VfbnVtYmVyICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBleHBlY3RlZCBhIG51bWJlciBncmVhdGVyIHRoYW4gb3IgZXF1YWwgdG8gLTEiLAorCS8qICAgMyBtc2dfY19zZW5kX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGZ1bmN0aW9uIG5hbWUgZm9yIGFkZHJlc3MgJXAiLAorCS8qICAgNCBtc2dfY19yZWNlaXZlX2Z1bmNfcHRyICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGFkZHJlc3Mgb2YgZnVuY3Rpb24gJXMiLAorCS8qICAgNSBtc2dfY19vZmZsb2FkX21hbGxvYyAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCAocmVxdWVzdGVkPSVsbGQgYnl0ZXMsIGFsaWduICVsbGQpIiwKKwkvKiAgIDYgbXNnX2Nfb2ZmbG9hZDEgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgJWQgZG9lcyBub3QgaGF2ZSBhIHBlbmRpbmcgc2lnbmFsIGZvciB3YWl0KCVwKSIsCisJLyogICA3IG1zZ19jX3Vua25vd25fdmFyX3R5cGUgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB2YXJpYWJsZSB0eXBlICVkIiwKKwkvKiAgIDggbXNnX2NfaW52YWxpZF9lbnZfdmFyX3ZhbHVlICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nIGludmFsaWQgdmFsdWUgc3BlY2lmaWVkIGZvciAlcyIsCisJLyogICA5IG1zZ19jX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUgICAgICAgICAqLyAib2ZmbG9hZCB3YXJuaW5nOiBzcGVjaWZ5IGFuIGludGVnZXIgdmFsdWUgZm9yICVzIiwKKwkvKiAgMTAgbXNnX2NfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIHZhbHVlIGluIHJhbmdlIDEtMyIsCisJLyogIDExIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQxICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBkZXZpY2UgbnVtYmVyICVkIHNwZWNpZmllZCBpbiBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEyIG1zZ19jX29mZmxvYWRfc2lnbmFsZWQyICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogaW52YWxpZCBzaWduYWwgJXAgc3BlY2lmaWVkIGZvciBfT2ZmbG9hZF9zaWduYWxlZCIsCisJLyogIDEzIG1zZ19jX215b3dyYXBwZXJfY2hlY2tyZXN1bHQgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogJXMgZmFpbGVkIHdpdGggZXJyb3IgJWQiLAorCS8qICAxNCBtc2dfY19teW90YXJnZXRfY2hlY2tyZXN1bHQgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6ICVzIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMTUgbXNnX2Nfb2ZmbG9hZF9kZXNjcmlwdG9yX29mZmxvYWQgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZmluZCBvZmZsb2FkIGVudHJ5ICVzIiwKKwkvKiAgMTYgbXNnX2NfbWVyZ2VfdmFyX2Rlc2NzMSAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycyIsCisJLyogIDE3IG1zZ19jX21lcmdlX3Zhcl9kZXNjczIgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5leHBlY3RlZCB2YXJpYWJsZSB0eXBlIiwKKwkvKiAgMTggbXNnX2NfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEgICAgICAgICAgICovICJvZmZsb2FkX2Vycm9yOiBNSUMgZW52aXJvbm1lbnQgdmFyaWFibGUgbXVzdCBiZWdpbiB3aXRoIGFuIGFscGFiZXRpYyBjaGFyYWN0ZXIiLAorCS8qICAxOSBtc2dfY19taWNfcGFyc2VfZW52X3Zhcl9saXN0MiAgICAgICAgICAgKi8gIm9mZmxvYWRfZXJyb3I6IE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZSB2YWx1ZSBtdXN0IGJlIHNwZWNpZmllZCB3aXRoIJE9kiIsCisJLyogIDIwIG1zZ19jX21pY19wcm9jZXNzX2V4aXRfcmV0ICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogcHJvY2VzcyBvbiB0aGUgZGV2aWNlICVkIHVuZXhwZWN0ZWRseSBleGl0ZWQgd2l0aCBjb2RlICVkIiwKKwkvKiAgMjEgbXNnX2NfbWljX3Byb2Nlc3NfZXhpdF9zaWcgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWQgd2FzIHRlcm1pbmF0ZWQgYnkgc2lnbmFsICVkICglcykiLAorCS8qICAyMiBtc2dfY19taWNfcHJvY2Vzc19leGl0ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCB3YXMgdW5leHBlY3RlZGx5IHRlcm1pbmF0ZWQiLAorCS8qICAyMyBtc2dfY19taWNfaW5pdDMgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogaWdub3JpbmcgTUlDX1NUQUNLU0laRSBzZXR0aW5nOyB1c2UgYSB2YWx1ZSA+PSAxNksgYW5kIGEgbXVsdGlwbGUgb2YgNEsiLAorCS8qICAyNCBtc2dfY19taWNfaW5pdDQgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRocmVhZCBrZXkgY3JlYXRlIGZhaWxlZCB3aXRoIGVycm9yICVkIiwKKwkvKiAgMjUgbXNnX2NfbWljX2luaXQ1ICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IHNwZWNpZnkgT0ZGTE9BRF9ERVZJQ0VTIGFzIGNvbW1hLXNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgbnVtYmVycyBvciAnbm9uZSciLAorCS8qICAyNiBtc2dfY19taWNfaW5pdDYgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgd2FybmluZzogT0ZGTE9BRF9ERVZJQ0VTIGRldmljZSBudW1iZXIgJWQgZG9lcyBub3QgY29ycmVzcG9uZCB0byBhIHBoeXNpY2FsIGRldmljZSIsCisJLyogIDI3IG1zZ19jX25vX3N0YXRpY192YXJfZGF0YSAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGUgJXAiLAorCS8qICAyOCBtc2dfY19ub19wdHJfZGF0YSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBmaW5kIGRhdGEgYXNzb2NpYXRlZCB3aXRoIHBvaW50ZXIgdmFyaWFibGUgJXAiLAorCS8qICAyOSBtc2dfY19nZXRfZW5naW5lX2hhbmRsZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZGV2aWNlICVkIGhhbmRsZSAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMCBtc2dfY19nZXRfZW5naW5lX2luZGV4ICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgcGh5c2ljYWwgaW5kZXggZm9yIGxvZ2ljYWwgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMxIG1zZ19jX3Byb2Nlc3NfY3JlYXRlICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IHN0YXJ0IHByb2Nlc3Mgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzMiBtc2dfY19wcm9jZXNzX2dldF9mdW5jX2hhbmRsZXMgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBnZXQgZnVuY3Rpb24gaGFuZGxlcyBvbiB0aGUgZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDMzIG1zZ19jX3Byb2Nlc3Nfd2FpdF9zaHV0ZG93biAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogd2FpdCBmb3IgcHJvY2VzcyBzaHV0ZG93biBmYWlsZWQgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDM0IG1zZ19jX3Byb2Nlc3NfcHJveHlfZmx1c2ggICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogY2Fubm90IGZsdXNoIHByb2Nlc3Mgb3V0cHV0IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNSBtc2dfY19sb2FkX2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNiBtc2dfY19waXBlbGluZV9jcmVhdGUgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgcGlwZWxpbmUgb24gdGhlIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICAzNyBtc2dfY19waXBlbGluZV9ydW5fZnVuYyAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBleGVjdXRlIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzggbXNnX2NfcGlwZWxpbmVfc3RhcnRfcnVuX2Z1bmNzICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3Qgc3RhcnQgZXhlY3V0aW5nIHBpcGVsaW5lIGZ1bmN0aW9uIG9uIHRoZSBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgMzkgbXNnX2NfYnVmX2NyZWF0ZSAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDAgbXNnX2NfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgY3JlYXRlIGJ1ZmZlciBvbiBkZXZpY2UgJWQsIG91dCBvZiBtZW1vcnkiLAorCS8qICA0MSBtc2dfY19idWZfY3JlYXRlX2Zyb21fbWVtICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCBjcmVhdGUgYnVmZmVyIGZyb20gbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MiBtc2dfY19idWZfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBkZXN0cm95IGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0MyBtc2dfY19idWZfbWFwICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciBtYXAgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDQ0IG1zZ19jX2J1Zl91bm1hcCAgICAgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHVubWFwIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NSBtc2dfY19idWZfcmVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciByZWFkIGZhaWxlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0NiBtc2dfY19idWZfd3JpdGUgICAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGJ1ZmZlciB3cml0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDcgbXNnX2NfYnVmX2NvcHkgICAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBidWZmZXIgY29weSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNDggbXNnX2NfYnVmX2dldF9hZGRyZXNzICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBjYW5ub3QgZ2V0IGJ1ZmZlciBhZGRyZXNzIG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA0OSBtc2dfY19idWZfYWRkX3JlZiAgICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZXVzZSBidWZmZXIgbWVtb3J5IG9uIGRldmljZSAlZCAoZXJyb3IgY29kZSAlZCkiLAorCS8qICA1MCBtc2dfY19idWZfcmVsZWFzZV9yZWYgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGNhbm5vdCByZWxlYXNlIGJ1ZmZlciBtZW1vcnkgb24gZGV2aWNlICVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUxIG1zZ19jX2J1Zl9zZXRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogYnVmZmVyIHNldCBzdGF0ZSBmYWlsZWQgKGVycm9yIGNvZGUgJWQpIiwKKwkvKiAgNTIgbXNnX2NfZXZlbnRfd2FpdCAgICAgICAgICAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB3YWl0IGZvciBldmVudCB0byBiZWNvbWUgc2lnbmFsZWQgZmFpbGVkIChlcnJvciBjb2RlICVkKSIsCisJLyogIDUzIG1zZ19jX3plcm9fb3JfbmVnX3B0cl9sZW4gICAgICAgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogbWVtb3J5IGFsbG9jYXRpb24gb2YgbmVnYXRpdmUgbGVuZ3RoIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NCBtc2dfY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGRhdGEgdHJhbnNmZXIgb2YgemVybyBvciBuZWdhdGl2ZSBzaXplIGlzIG5vdCBzdXBwb3J0ZWQiLAorCS8qICA1NSBtc2dfY19iYWRfcHRyX21lbV9yYW5nZSAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IGFkZHJlc3MgcmFuZ2UgcGFydGlhbGx5IG92ZXJsYXBzIHdpdGggZXhpc3RpbmcgYWxsb2NhdGlvbiIsCisJLyogIDU2IG1zZ19jX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogc2l6ZSBvZiB0aGUgc291cmNlICVkIGRpZmZlcnMgZnJvbSBzaXplIG9mIHRoZSBkZXN0aW5hdGlvbiAlZCIsCisJLyogIDU3IG1zZ19jX25vbl9jb250aWd1b3VzX2RvcGVfdmVjdG9yICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogb2ZmbG9hZCBkYXRhIHRyYW5zZmVyIHN1cHBvcnRzIG9ubHkgYSBzaW5nbGUgY29udGlndW91cyBtZW1vcnkgcmFuZ2UgcGVyIHZhcmlhYmxlIiwKKwkvKiAgNTggbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYgICAgICAgICovICJvZmZsb2FkIHdhcm5pbmc6IGlnbm9yaW5nICVzIHNldHRpbmc7IHVzZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNTkgbXNnX2Nfb21wX2ludmFsaWRfZGV2aWNlX251bSAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiBkZXZpY2UgbnVtYmVyIHNob3VsZCBiZSBhIG5vbi1uZWdhdGl2ZSBpbnRlZ2VyIHZhbHVlIiwKKwkvKiAgNjAgbXNnX2NfdW5rbm93bl9iaW5hcnlfdHlwZSAgICAgICAgICAgICAgICovICJvZmZsb2FkIGVycm9yOiB1bmV4cGVjdGVkIGVtYmVkZGVkIHRhcmdldCBiaW5hcnkgdHlwZSwgZXhwZWN0ZWQgZWl0aGVyIGFuIGV4ZWN1dGFibGUgb3Igc2hhcmVkIGxpYnJhcnkiLAorCS8qICA2MSBtc2dfY19tdWx0aXBsZV90YXJnZXRfZXhlcyAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IG1vcmUgdGhhdCBvbmUgdGFyZ2V0IGV4ZWN1dGFibGUgZm91bmQiLAorCS8qICA2MiBtc2dfY19ub190YXJnZXRfZXhlICAgICAgICAgICAgICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHRhcmdldCBleGVjdXRhYmxlIGlzIG5vdCBhdmFpbGFibGUiLAorCS8qICA2MyBtc2dfY19yZXBvcnRfdW5rbm93bl90aW1lcl9ub2RlICAgICAgICAgKi8gIm9mZmxvYWQgZXJyb3I6IHVua25vd24gdGltZXIgbm9kZSIsCisJLyogIDY0IG1zZ19jX3JlcG9ydF91bmtub3duX3RyYWNlX25vZGUgICAgICAgICAqLyAib2ZmbG9hZCBlcnJvcjogdW5rbm93biB0cmFjZSBub2RlIiwKKwkvKiAgNjUgbXNnX2NfcmVwb3J0X2hvc3QgICAgICAgICAgICAgICAgICAgICAgICovICJIT1NUIiwKKwkvKiAgNjYgbXNnX2NfcmVwb3J0X21pYyAgICAgICAgICAgICAgICAgICAgICAgICovICJNSUMiLAorCS8qICA2NyBtc2dfY19yZXBvcnRfdGl0bGUgICAgICAgICAgICAgICAgICAgICAgKi8gInRpbWVyIGRhdGEgICAgICAgKHNlYykiLAorCS8qICA2OCBtc2dfY19yZXBvcnRfc2Vjb25kcyAgICAgICAgICAgICAgICAgICAgKi8gIihzZWNvbmRzKSIsCisJLyogIDY5IG1zZ19jX3JlcG9ydF9ieXRlcyAgICAgICAgICAgICAgICAgICAgICAqLyAiKGJ5dGVzKSIsCisJLyogIDcwIG1zZ19jX3JlcG9ydF9jcHVfdGltZSAgICAgICAgICAgICAgICAgICAqLyAiQ1BVIFRpbWUiLAorCS8qICA3MSBtc2dfY19yZXBvcnRfbWljX3RpbWUgICAgICAgICAgICAgICAgICAgKi8gIk1JQyBUaW1lIiwKKwkvKiAgNzIgbXNnX2NfcmVwb3J0X3RhZyAgICAgICAgICAgICAgICAgICAgICAgICovICJUYWciLAorCS8qICA3MyBtc2dfY19yZXBvcnRfZnJvbV9maWxlICAgICAgICAgICAgICAgICAgKi8gIk9mZmxvYWQgZnJvbSBmaWxlIiwKKwkvKiAgNzQgbXNnX2NfcmVwb3J0X2ZpbGUgICAgICAgICAgICAgICAgICAgICAgICovICJGaWxlIiwKKwkvKiAgNzUgbXNnX2NfcmVwb3J0X2xpbmUgICAgICAgICAgICAgICAgICAgICAgICovICJMaW5lIiwKKwkvKiAgNzYgbXNnX2NfcmVwb3J0X2NwdV90b19taWNfZGF0YSAgICAgICAgICAgICovICJDUFUtPk1JQyBEYXRhIiwKKwkvKiAgNzcgbXNnX2NfcmVwb3J0X21pY190b19jcHVfZGF0YSAgICAgICAgICAgICovICJNSUMtPkNQVSBEYXRhIiwKKwkvKiAgNzggbXNnX2NfcmVwb3J0X29mZmxvYWQgICAgICAgICAgICAgICAgICAgICovICJPZmZsb2FkIiwKKwkvKiAgNzkgbXNnX2NfcmVwb3J0X3dfdGFnICAgICAgICAgICAgICAgICAgICAgICovICJUYWcgJWQiLAorCS8qICA4MCBtc2dfY19yZXBvcnRfc3RhdGUgICAgICAgICAgICAgICAgICAgICAgKi8gIlN0YXRlIiwKKwkvKiAgODEgbXNnX2NfcmVwb3J0X3N0YXJ0ICAgICAgICAgICAgICAgICAgICAgICovICJTdGFydCB0YXJnZXQiLAorCS8qICA4MiBtc2dfY19yZXBvcnRfaW5pdCAgICAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUiLAorCS8qICA4MyBtc2dfY19yZXBvcnRfbG9naWNhbF9jYXJkICAgICAgICAgICAgICAgKi8gImxvZ2ljYWwgY2FyZCIsCisJLyogIDg0IG1zZ19jX3JlcG9ydF9waHlzaWNhbF9jYXJkICAgICAgICAgICAgICAqLyAicGh5c2ljYWwgY2FyZCIsCisJLyogIDg1IG1zZ19jX3JlcG9ydF9yZWdpc3RlciAgICAgICAgICAgICAgICAgICAqLyAiUmVnaXN0ZXIgc3RhdGljIGRhdGEgdGFibGVzIiwKKwkvKiAgODYgbXNnX2NfcmVwb3J0X2luaXRfZnVuYyAgICAgICAgICAgICAgICAgICovICJTZXR1cCB0YXJnZXQgZW50cnkiLAorCS8qICA4NyBtc2dfY19yZXBvcnRfY3JlYXRlX2J1Zl9ob3N0ICAgICAgICAgICAgKi8gIkNyZWF0ZSBob3N0IGJ1ZmZlciIsCisJLyogIDg4IG1zZ19jX3JlcG9ydF9jcmVhdGVfYnVmX21pYyAgICAgICAgICAgICAqLyAiQ3JlYXRlIHRhcmdldCBidWZmZXIiLAorCS8qICA4OSBtc2dfY19yZXBvcnRfc2VuZF9wb2ludGVyX2RhdGEgICAgICAgICAgKi8gIlNlbmQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTAgbXNnX2NfcmVwb3J0X3NlbnRfcG9pbnRlcl9kYXRhICAgICAgICAgICovICJIb3N0LT50YXJnZXQgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTEgbXNnX2NfcmVwb3J0X2dhdGhlcl9jb3B5aW5fZGF0YSAgICAgICAgICovICJHYXRoZXIgY29weWluIGRhdGEiLAorCS8qICA5MiBtc2dfY19yZXBvcnRfY29weWluX2RhdGEgICAgICAgICAgICAgICAgKi8gIkhvc3QtPnRhcmdldCBjb3B5aW4gZGF0YSIsCisJLyogIDkzIG1zZ19jX3JlcG9ydF9zdGF0ZV9zaWduYWwgICAgICAgICAgICAgICAqLyAiU2lnbmFsIiwKKwkvKiAgOTQgbXNnX2NfcmVwb3J0X3NpZ25hbCAgICAgICAgICAgICAgICAgICAgICovICJzaWduYWwgOiIsCisJLyogIDk1IG1zZ19jX3JlcG9ydF93YWl0ICAgICAgICAgICAgICAgICAgICAgICAqLyAid2FpdHMgIDoiLAorCS8qICA5NiBtc2dfY19yZXBvcnRfY29tcHV0ZSAgICAgICAgICAgICAgICAgICAgKi8gIkV4ZWN1dGUgdGFzayBvbiB0YXJnZXQiLAorCS8qICA5NyBtc2dfY19yZXBvcnRfcmVjZWl2ZV9wb2ludGVyX2RhdGEgICAgICAgKi8gIlJlY2VpdmUgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTggbXNnX2NfcmVwb3J0X3JlY2VpdmVkX3BvaW50ZXJfZGF0YSAgICAgICovICJUYXJnZXQtPmhvc3QgcG9pbnRlciBkYXRhIiwKKwkvKiAgOTkgbXNnX2NfcmVwb3J0X3N0YXJ0X3RhcmdldF9mdW5jICAgICAgICAgICovICJTdGFydCB0YXJnZXQgZW50cnkiLAorCS8qIDEwMCBtc2dfY19yZXBvcnRfdmFyICAgICAgICAgICAgICAgICAgICAgICAgKi8gIlZhciIsCisJLyogMTAxIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlpbl9kYXRhICAgICAgICAqLyAiU2NhdHRlciBjb3B5aW4gZGF0YSIsCisJLyogMTAyIG1zZ19jX3JlcG9ydF9nYXRoZXJfY29weW91dF9kYXRhICAgICAgICAqLyAiR2F0aGVyIGNvcHlvdXQgZGF0YSIsCisJLyogMTAzIG1zZ19jX3JlcG9ydF9zY2F0dGVyX2NvcHlvdXRfZGF0YSAgICAgICAqLyAiU2NhdHRlciBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNCBtc2dfY19yZXBvcnRfY29weW91dF9kYXRhICAgICAgICAgICAgICAgKi8gIlRhcmdldC0+aG9zdCBjb3B5b3V0IGRhdGEiLAorCS8qIDEwNSBtc2dfY19yZXBvcnRfdW5yZWdpc3RlciAgICAgICAgICAgICAgICAgKi8gIlVucmVnaXN0ZXIgZGF0YSB0YWJsZXMiLAorCS8qIDEwNiBtc2dfY19yZXBvcnRfZGVzdHJveSAgICAgICAgICAgICAgICAgICAgKi8gIkRlc3Ryb3kiLAorCS8qIDEwNyBtc2dfY19yZXBvcnRfbXlvaW5pdCAgICAgICAgICAgICAgICAgICAgKi8gIkluaXRpYWxpemUgTVlPIiwKKwkvKiAxMDggbXNnX2NfcmVwb3J0X215b3JlZ2lzdGVyICAgICAgICAgICAgICAgICovICJSZWdpc3RlciBNWU8gdGFibGVzIiwKKwkvKiAxMDkgbXNnX2NfcmVwb3J0X215b2ZpbmkgICAgICAgICAgICAgICAgICAgICovICJGaW5hbGl6ZSBNWU8iLAorCS8qIDExMCBtc2dfY19yZXBvcnRfbWljX215b19zaGFyZWQgICAgICAgICAgICAgKi8gIk1JQyBNWU8gc2hhcmVkIHRhYmxlIHJlZ2lzdGVyIiwKKwkvKiAxMTEgbXNnX2NfcmVwb3J0X21pY19teW9fZnB0ciAgICAgICAgICAgICAgICovICJNSUMgTVlPIGZwdHIgdGFibGUgcmVnaXN0ZXIiLAorCS8qIDExMiBtc2dfY19yZXBvcnRfbXlvc2hhcmVkbWFsbG9jICAgICAgICAgICAgKi8gIk1ZTyBzaGFyZWQgbWFsbG9jIiwKKwkvKiAxMTMgbXNnX2NfcmVwb3J0X215b3NoYXJlZGZyZWUgICAgICAgICAgICAgICovICJNWU8gc2hhcmVkIGZyZWUiLAorCS8qIDExNCBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBtYWxsb2MiLAorCS8qIDExNSBtc2dfY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZGZyZWUgICAgICAgKi8gIk1ZTyBzaGFyZWQgYWxpZ25lZCBmcmVlIiwKKwkvKiAxMTYgbXNnX2NfcmVwb3J0X215b2FjcXVpcmUgICAgICAgICAgICAgICAgICovICJNWU8gYWNxdWlyZSIsCisJLyogMTE3IG1zZ19jX3JlcG9ydF9teW9yZWxlYXNlICAgICAgICAgICAgICAgICAqLyAiTVlPIHJlbGVhc2UiLAorCS8qIDExOCBtc2dfY19yZXBvcnRfaG9zdF90b3RhbF9vZmZsb2FkX3RpbWUgICAgKi8gImhvc3Q6IHRvdGFsIG9mZmxvYWQgdGltZSIsCisJLyogMTE5IG1zZ19jX3JlcG9ydF9ob3N0X2luaXRpYWxpemUgICAgICAgICAgICAqLyAiaG9zdDogaW5pdGlhbGl6ZSB0YXJnZXQiLAorCS8qIDEyMCBtc2dfY19yZXBvcnRfaG9zdF90YXJnZXRfYWNxdWlyZSAgICAgICAgKi8gImhvc3Q6IGFjcXVpcmUgdGFyZ2V0IiwKKwkvKiAxMjEgbXNnX2NfcmVwb3J0X2hvc3Rfd2FpdF9kZXBzICAgICAgICAgICAgICovICJob3N0OiB3YWl0IGRlcGVuZGVuY2llcyIsCisJLyogMTIyIG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogc2V0dXAgYnVmZmVycyIsCisJLyogMTIzIG1zZ19jX3JlcG9ydF9ob3N0X2FsbG9jX2J1ZmZlcnMgICAgICAgICAqLyAiaG9zdDogYWxsb2NhdGUgYnVmZmVycyIsCisJLyogMTI0IG1zZ19jX3JlcG9ydF9ob3N0X3NldHVwX21pc2NfZGF0YSAgICAgICAqLyAiaG9zdDogc2V0dXAgbWlzY19kYXRhIiwKKwkvKiAxMjUgbXNnX2NfcmVwb3J0X2hvc3RfYWxsb2NfZGF0YV9idWZmZXIgICAgICovICJob3N0OiBhbGxvY2F0ZSBidWZmZXIiLAorCS8qIDEyNiBtc2dfY19yZXBvcnRfaG9zdF9zZW5kX3BvaW50ZXJzICAgICAgICAgKi8gImhvc3Q6IHNlbmQgcG9pbnRlcnMiLAorCS8qIDEyNyBtc2dfY19yZXBvcnRfaG9zdF9nYXRoZXJfaW5wdXRzICAgICAgICAgKi8gImhvc3Q6IGdhdGhlciBpbnB1dHMiLAorCS8qIDEyOCBtc2dfY19yZXBvcnRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIgICAgKi8gImhvc3Q6IG1hcCBJTiBkYXRhIGJ1ZmZlciIsCisJLyogMTI5IG1zZ19jX3JlcG9ydF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyICAqLyAiaG9zdDogdW5tYXAgSU4gZGF0YSBidWZmZXIiLAorCS8qIDEzMCBtc2dfY19yZXBvcnRfaG9zdF9zdGFydF9jb21wdXRlICAgICAgICAgKi8gImhvc3Q6IGluaXRpYXRlIGNvbXB1dGUiLAorCS8qIDEzMSBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2NvbXB1dGUgICAgICAgICAgKi8gImhvc3Q6IHdhaXQgY29tcHV0ZSIsCisJLyogMTMyIG1zZ19jX3JlcG9ydF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMgICAqLyAiaG9zdDogaW5pdGlhdGUgcG9pbnRlciByZWFkcyIsCisJLyogMTMzIG1zZ19jX3JlcG9ydF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyAgICAgICAqLyAiaG9zdDogc2NhdHRlciBvdXRwdXRzIiwKKwkvKiAxMzQgbXNnX2NfcmVwb3J0X2hvc3RfbWFwX291dF9kYXRhX2J1ZmZlciAgICovICJob3N0OiBtYXAgT1VUIGRhdGEgYnVmZmVyIiwKKwkvKiAxMzUgbXNnX2NfcmVwb3J0X2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyICovICJob3N0OiB1bm1hcCBPVVQgZGF0YSBidWZmZXIiLAorCS8qIDEzNiBtc2dfY19yZXBvcnRfaG9zdF93YWl0X2J1ZmZlcnNfcmVhZHMgICAgKi8gImhvc3Q6IHdhaXQgcG9pbnRlciByZWFkcyIsCisJLyogMTM3IG1zZ19jX3JlcG9ydF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyAgICAgICAqLyAiaG9zdDogZGVzdHJveSBidWZmZXJzIiwKKwkvKiAxMzggbXNnX2NfcmVwb3J0X3RhcmdldF90b3RhbF90aW1lICAgICAgICAgICovICJ0YXJnZXQ6IHRvdGFsIHRpbWUiLAorCS8qIDEzOSBtc2dfY19yZXBvcnRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXAgICAgKi8gInRhcmdldDogc2V0dXAgb2ZmbG9hZCBkZXNjcmlwdG9yIiwKKwkvKiAxNDAgbXNnX2NfcmVwb3J0X3RhcmdldF9mdW5jX2xvb2t1cCAgICAgICAgICovICJ0YXJnZXQ6IGVudHJ5IGxvb2t1cCIsCisJLyogMTQxIG1zZ19jX3JlcG9ydF90YXJnZXRfZnVuY190aW1lICAgICAgICAgICAqLyAidGFyZ2V0OiBlbnRyeSB0aW1lIiwKKwkvKiAxNDIgbXNnX2NfcmVwb3J0X3RhcmdldF9zY2F0dGVyX2lucHV0cyAgICAgICovICJ0YXJnZXQ6IHNjYXR0ZXIgaW5wdXRzIiwKKwkvKiAxNDMgbXNnX2NfcmVwb3J0X3RhcmdldF9hZGRfYnVmZmVyX3JlZnMgICAgICovICJ0YXJnZXQ6IGFkZCBidWZmZXIgcmVmZXJlbmNlIiwKKwkvKiAxNDQgbXNnX2NfcmVwb3J0X3RhcmdldF9jb21wdXRlICAgICAgICAgICAgICovICJ0YXJnZXQ6IGNvbXB1dGUiLAorCS8qIDE0NSBtc2dfY19yZXBvcnRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzICAgICAgKi8gInRhcmdldDogZ2F0aGVyIG91dHB1dHMiLAorCS8qIDE0NiBtc2dfY19yZXBvcnRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMgKi8gInRhcmdldDogcmVtb3ZlIGJ1ZmZlciByZWZlcmVuY2UiLAorCS8qIDE0NyBtc2dfY19jb2lfcGlwZWxpbmVfbWF4X251bWJlciAgICAgICAgICAgKi8gIm51bWJlciBvZiBob3N0IHRocmVhZHMgZG9pbmcgb2ZmbG9hZCBleGNlZWRzIG1heGltdW0gb2YgJWQiLAorCS8qIDE0OCBtc2dfY19yYW5nZXNfZG9udF9tYXRjaCAgICAgICAgICAgICAgICAgKi8gInJhbmdlcyBvZiBzb3VyY2UgYW5kIGRlc3RpbmF0aW9uIGRvbid0IG1hdGNoIHRvZ2V0aGVyIiwKKwkvKiAxNDkgbXNnX2NfZGVzdGluYXRpb25faXNfb3ZlciAgICAgICAgICAgICAgICovICJpbnN1ZmZpY2llbnQgZGVzdGluYXRpb24gbWVtb3J5IHRvIHRyYW5zZmVyIHNvdXJjZSIsCisJLyogMTUwIG1zZ19jX3NsaWNlX29mX25vbmNvbnRfYXJyYXkgICAgICAgICAgICAqLyAiYSBub24tY29udGlndW91cyBzbGljZSBtYXkgYmUgdGFrZW4gb2YgY29udGlndW91cyBhcnJheXMgb25seSIsCisJLyogMTUxIG1zZ19jX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2ggICAgICAgICAgICAqLyAibnVtYmVyIG9mICVzIGVsZW1lbnRzIGlzIGxlc3MgdGhhbiBkZXNjcmliZWQgYnkgdGhlIHNvdXJjZSIsCit9OwpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL21pY19saWIuZjkwIGIvcmMzL29mZmxvYWQvc3JjL21pY19saWIuZjkwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBjMmU0ZGUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvbWljX2xpYi5mOTAKQEAgLTAsMCArMSw0NDEgQEAKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgKiBUaGlzIGZpbGUgaXMgaW50ZW5kZWQgdG8gc3VwcG9ydCB0aGUgSW50ZWwocikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgorISAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCishIGZyZWUgZm9ybSBGb3J0cmFuIHNvdXJjZSAtIHNob3VsZCBiZSBuYW1lZCAuZjkwCishIGxpbmVzIGFyZSBsb25nZXIgdGhhbiA3MiBjaGFyYWN0ZXJzCisKK21vZHVsZSBtaWNfbGliCit1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKK2ludGVnZXIsIHBhcmFtZXRlcjo6IHRhcmdldF9taWM9MgoraW50ZWdlciwgcGFyYW1ldGVyOjogZGVmYXVsdF90YXJnZXRfdHlwZT10YXJnZXRfbWljCitpbnRlZ2VyLCBwYXJhbWV0ZXI6OiBkZWZhdWx0X3RhcmdldF9udW1iZXI9MAorCitlbnVtLCBiaW5kKEMpCisgICAgZW51bWVyYXRvciA6OiBPRkZMT0FEX1NVQ0NFU1MgID0gMAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9ESVNBQkxFRCAgICAgICAgICAhIG9mZmxvYWQgaXMgZGlzYWJsZWQKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfVU5BVkFJTEFCTEUgICAgICAgISBjYXJkIGlzIG5vdCBhdmFpbGFibGUKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfT1VUX09GX01FTU9SWSAgICAgISBub3QgZW5vdWdoIG1lbW9yeSBvbiBkZXZpY2UKKyAgICBlbnVtZXJhdG9yIDo6IE9GRkxPQURfUFJPQ0VTU19ESUVEICAgICAgISB0YXJnZXQgcHJvY2VzcyBoYXMgZGllZAorICAgIGVudW1lcmF0b3IgOjogT0ZGTE9BRF9FUlJPUiAgICAgICAgICAgICAhIHVuc3BlY2lmaWVkIGVycm9yCitlbmQgZW51bQorCit0eXBlLCBiaW5kIChDKSA6OiBvZmZsb2FkX3N0YXR1cworICAgIGludGVnZXIoa2luZD1jX2ludCkgICAgOjogIHJlc3VsdCAgICAgICAgICA9IE9GRkxPQURfRElTQUJMRUQKKyAgICBpbnRlZ2VyKGtpbmQ9Y19pbnQpICAgIDo6ICBkZXZpY2VfbnVtYmVyICAgPSAtMQorICAgIGludGVnZXIoa2luZD1jX3NpemVfdCkgOjogIGRhdGFfc2VudCAgICAgICA9IDAKKyAgICBpbnRlZ2VyKGtpbmQ9Y19zaXplX3QpIDo6ICBkYXRhX3JlY2VpdmVkICAgPSAwCitlbmQgdHlwZSBvZmZsb2FkX3N0YXR1cworCitpbnRlcmZhY2UKK2Z1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMgKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIl9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzIikKKyFkZWMkIGF0dHJpYnV0ZXMgZGVmYXVsdCA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzCishZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcworZW5kIGZ1bmN0aW9uIG9mZmxvYWRfbnVtYmVyX29mX2RldmljZXMKKworZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZCh0YXJnZXRfbnVtYmVyLCBzaWduYWwpICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfc2lnbmFsZWQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfc2lnbmFsZWQKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludDY0X3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgOjogb2ZmbG9hZF9zaWduYWxlZAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50NjRfdCksIHZhbHVlIDo6IHNpZ25hbAorIWRlYyQgYXR0cmlidXRlcyBvZmZsb2FkOm1pYyA6OiBvZmZsb2FkX3NpZ25hbGVkCitlbmQgZnVuY3Rpb24gb2ZmbG9hZF9zaWduYWxlZAorCitzdWJyb3V0aW5lIG9mZmxvYWRfcmVwb3J0KHZhbCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9yZXBvcnQiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfcmVwb3J0CisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdmFsCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfcmVwb3J0CitlbmQgc3Vicm91dGluZSBvZmZsb2FkX3JlcG9ydAorCitmdW5jdGlvbiBvZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlciIpCishZGVjJCBhdHRyaWJ1dGVzIGRlZmF1bHQgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKyFkZWMkIGF0dHJpYnV0ZXMgb2ZmbG9hZDptaWMgOjogb2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcgorZW5kIGZ1bmN0aW9uIG9mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIKKworZnVuY3Rpb24gb2ZmbG9hZF9nZXRfcGh5c2ljYWxfZGV2aWNlX251bWJlcigpICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAiX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIiKQorIWRlYyQgYXR0cmlidXRlcyBkZWZhdWx0IDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCishZGVjJCBhdHRyaWJ1dGVzIG9mZmxvYWQ6bWljIDo6IG9mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIKK2VuZCBmdW5jdGlvbiBvZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyCisKKyEgT3Blbk1QIEFQSSB3cmFwcGVycworCitzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMpICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9udW1fdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcworZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fdGhyZWFkcykgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9keW5hbWljX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG51bV90aHJlYWRzCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0CisKK2Z1bmN0aW9uIG9tcF9nZXRfZHluYW1pY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IG9tcF9nZXRfZHluYW1pY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5lc3RlZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZF90YXJnZXQKKworZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2dldF9uZXN0ZWRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfZ2V0X25lc3RlZF90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWRfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwga2luZCwgbW9kaWZpZXIKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0CisKK3N1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBraW5kLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGlmaWVyKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBraW5kLCBtb2RpZmllcgorZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZV90YXJnZXQKKworISBsb2NrIEFQSSBmdW5jdGlvbnMKKworc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9pbml0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfaW5pdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgICFkaXIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6ICBvbXBfZGVzdHJveV9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfc2V0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF9zZXRfbG9ja190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgIWRpciQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogIG9tcF9zZXRfbG9ja190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IGxvY2sKK2VuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICAhZGlyJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiAgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9ja190YXJnZXQKKworZnVuY3Rpb24gb21wX3Rlc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBvbXBfdGVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2tfdGFyZ2V0CisKKyEgbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsb2NrKSAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldAorCitzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3NldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQKKworc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2spICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gIm9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBsb2NrCitlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldAorCitmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAib21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjogb21wX3Rlc3RfbmVzdF9sb2NrX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbG9jaworZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQKKworISBrbXAgQVBJIGZ1bmN0aW9ucworCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfc3RhY2tzaXplX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3RhcmdldAorCitzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBzaXplCitlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCitlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfc190YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlcikgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAmCisgICAgICAgICAgIGJpbmQgKEMsIG5hbWUgPSAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1vZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbW9kZQorZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeV90YXJnZXQKKworc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHRzKSAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2NoYXIKKyBjaGFyYWN0ZXIgKGtpbmQ9Y19jaGFyKSA6OiBkZWZhdWx0cygqKQorIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0c190YXJnZXQKKworISBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3N1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpLCB2YWx1ZSA6OiB0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlcgorICBpbnRlZ2VyIChraW5kPWNfaW50cHRyX3QpLCB2YWx1ZSA6OiBtYXNrCitlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0CisKK3N1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQKKworZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV90YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXNrKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50LCBjX2ludHB0cl90CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfc2V0X2FmZmluaXR5X3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0CisKK2Z1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0ICh0YXJnZXRfdHlwZSwgICAgICAgICAgICAgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIsICAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX2dldF9hZmZpbml0eV90YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKSAgICAgICAgICAgICAgJgorICAgICAgICAgICBiaW5kIChDLCBuYW1lID0gImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0IikKKyAgaW1wb3J0IDo6IGNfaW50CisgIGludGVnZXIgKGtpbmQ9Y19pbnQpICAgICAgICA6OiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIKK2VuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCAodGFyZ2V0X3R5cGUsICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyLCAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2MsICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWFzaykgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIpCisgIGltcG9ydCA6OiBjX2ludCwgY19pbnRwdHJfdAorICBpbnRlZ2VyIChraW5kPWNfaW50KSAgICAgICAgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQKKyAgaW50ZWdlciAoa2luZD1jX2ludCksIHZhbHVlIDo6IHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBwcm9jCisgIGludGVnZXIgKGtpbmQ9Y19pbnRwdHJfdCksIHZhbHVlIDo6IG1hc2sKK2VuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQgKHRhcmdldF90eXBlLCAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGFyZ2V0X251bWJlciwgICAgICAgICAgICAgJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jLCAgICAgICAgICAgICAgICAgICAgICAmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hc2spICAgICAgICAgICAgICAgICAgICAgICYKKyAgICAgICAgICAgYmluZCAoQywgbmFtZSA9ICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiKQorICBpbXBvcnQgOjogY19pbnQsIGNfaW50cHRyX3QKKyAgaW50ZWdlciAoa2luZD1jX2ludCkgICAgICAgIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorICBpbnRlZ2VyIChraW5kPWNfaW50KSwgdmFsdWUgOjogdGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHByb2MKKyAgaW50ZWdlciAoa2luZD1jX2ludHB0cl90KSwgdmFsdWUgOjogbWFzaworZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldAorCitlbmQgaW50ZXJmYWNlCitlbmQgbW9kdWxlIG1pY19saWIKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkLmggYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4OTE0YjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZC5oCkBAIC0wLDAgKzEsNDc0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgKiBJbmNsdWRlIGZpbGUgZm9yIE9mZmxvYWQgQVBJLgorICovCisKKyNpZm5kZWYgT0ZGTE9BRF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfSF9JTkNMVURFRAorCisjaWYgZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorI2luY2x1ZGUgPGJpdHMvZnVuY3RleGNlcHQuaD4KKyNlbmRpZgorCisjaW5jbHVkZSA8c3RkZGVmLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworI2RlZmluZSBUQVJHRVRfQVRUUklCVVRFIF9fZGVjbHNwZWModGFyZ2V0KG1pYykpCisKKy8qCisgKiAgVGhlIHRhcmdldCBhcmNoaXRlY3R1cmUuCisgKi8KK3R5cGVkZWYgZW51bSBUQVJHRVRfVFlQRSB7CisgICAgVEFSR0VUX05PTkUsICAgIC8qIFVuZGVmaW5lIHRhcmdldCAqLworICAgIFRBUkdFVF9IT1NULCAgICAvKiBIb3N0IHVzZWQgYXMgdGFyZ2V0ICovCisgICAgVEFSR0VUX01JQyAgICAgIC8qIE1JQyB0YXJnZXQgKi8KK30gVEFSR0VUX1RZUEU7CisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IHR5cGUuCisgKi8KKyNkZWZpbmUgREVGQVVMVF9UQVJHRVRfVFlQRSBUQVJHRVRfTUlDCisKKy8qCisgKiAgVGhlIGRlZmF1bHQgdGFyZ2V0IG51bWJlci4KKyAqLworI2RlZmluZSBERUZBVUxUX1RBUkdFVF9OVU1CRVIgMAorCisvKgorICogIE9mZmxvYWQgc3RhdHVzLgorICovCit0eXBlZGVmIGVudW0geworICAgIE9GRkxPQURfU1VDQ0VTUyA9IDAsCisgICAgT0ZGTE9BRF9ESVNBQkxFRCwgICAgICAgICAgICAgICAvKiBvZmZsb2FkIGlzIGRpc2FibGVkICovCisgICAgT0ZGTE9BRF9VTkFWQUlMQUJMRSwgICAgICAgICAgICAvKiBjYXJkIGlzIG5vdCBhdmFpbGFibGUgKi8KKyAgICBPRkZMT0FEX09VVF9PRl9NRU1PUlksICAgICAgICAgIC8qIG5vdCBlbm91Z2ggbWVtb3J5IG9uIGRldmljZSAqLworICAgIE9GRkxPQURfUFJPQ0VTU19ESUVELCAgICAgICAgICAgLyogdGFyZ2V0IHByb2Nlc3MgaGFzIGRpZWQgKi8KKyAgICBPRkZMT0FEX0VSUk9SICAgICAgICAgICAgICAgICAgIC8qIHVuc3BlY2lmaWVkIGVycm9yICovCit9IF9PZmZsb2FkX3Jlc3VsdDsKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIF9PZmZsb2FkX3Jlc3VsdCByZXN1bHQ7ICAgICAgICAgLyogcmVzdWx0LCBzZWUgYWJvdmUgKi8KKyAgICBpbnQgICAgICAgICAgICAgZGV2aWNlX251bWJlcjsgIC8qIGRldmljZSBudW1iZXIgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9zZW50OyAgICAgIC8qIG51bWJlciBvZiBieXRlcyBzZW50IHRvIHRoZSB0YXJnZXQgKi8KKyAgICBzaXplX3QgICAgICAgICAgZGF0YV9yZWNlaXZlZDsgIC8qIG51bWJlciBvZiBieXRlcyByZWNlaXZlZCBieSBob3N0ICovCit9IF9PZmZsb2FkX3N0YXR1czsKKworI2RlZmluZSBPRkZMT0FEX1NUQVRVU19JTklUKHgpIFwKKyAgICAoKHgpLnJlc3VsdCA9IE9GRkxPQURfRElTQUJMRUQpCisKKyNkZWZpbmUgT0ZGTE9BRF9TVEFUVVNfSU5JVElBTElaRVIgXAorICAgIHsgT0ZGTE9BRF9ESVNBQkxFRCwgLTEsIDAsIDAgfQorCisvKiBPZmZsb2FkIHJ1bnRpbWUgaW50ZXJmYWNlcyAqLworCitleHRlcm4gaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpOworZXh0ZXJuIGludCBfT2ZmbG9hZF9nZXRfZGV2aWNlX251bWJlcih2b2lkKTsKK2V4dGVybiBpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCk7CisKK2V4dGVybiB2b2lkKiBfT2ZmbG9hZF9zaGFyZWRfbWFsbG9jKHNpemVfdCBzaXplKTsKK2V4dGVybiB2b2lkICBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpOworCitleHRlcm4gdm9pZCogX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfbWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pOworZXh0ZXJuIHZvaWQgIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKTsKKworZXh0ZXJuIGludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCk7CitleHRlcm4gdm9pZCBfT2ZmbG9hZF9yZXBvcnQoaW50IHZhbCk7CisKKy8qIE9wZW5NUCBBUEkgKi8KKworZXh0ZXJuIHZvaWQgb21wX3NldF9kZWZhdWx0X2RldmljZShpbnQgbnVtKTsKK2V4dGVybiBpbnQgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2Uodm9pZCk7CitleHRlcm4gaW50ICBvbXBfZ2V0X251bV9kZXZpY2VzKHZvaWQpOworCisvKiBPcGVuTVAgQVBJIHdyYXBwZXJzICovCisKKy8qIFNldCBudW1fdGhyZWFkcyBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IG1heF90aHJlYWRzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCisvKiBHZXQgbnVtX3Byb2NzIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IGR5bmFtaWMgb24gdGFyZ2V0ICovCitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworLyogR2V0IGR5bmFtaWMgZnJvbSB0YXJnZXQgKi8KK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworLyogU2V0IG5lc3RlZCBvbiB0YXJnZXQgKi8KK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbmVzdGVkCispOworCisvKiBHZXQgbmVzdGVkIGZyb20gdGFyZ2V0ICovCitleHRlcm4gaW50IG9tcF9nZXRfbmVzdGVkX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gaW50IG9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKyk7CisKK2V4dGVybiBpbnQgb21wX2dldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKTsKKworZXh0ZXJuIGludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispOworCitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispOworCisvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcF9sb2NrX3QgbG9jazsKK30gb21wX2xvY2tfdGFyZ2V0X3Q7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCisvKiBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zICovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXBfbmVzdF9sb2NrX3QgbG9jazsKK30gb21wX25lc3RfbG9ja190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKyk7CisKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispOworCitleHRlcm4gaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKTsKKworLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBzaXplCispOworCitleHRlcm4gaW50IGttcF9nZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKyk7CisKK2V4dGVybiBzaXplX3Qga21wX2dldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgdGltZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbW9kZQorKTsKKworZXh0ZXJuIGludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispOworCitleHRlcm4gdm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKTsKKworLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX2FmZmluaXR5X21hc2tfdCBtYXNrOworfSBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdDsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworZXh0ZXJuIHZvaWQga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKyk7CisKK2V4dGVybiBpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKyk7CisKK2V4dGVybiBpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispOworCitleHRlcm4gaW50IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9IC8qIGV4dGVybiAiQyIgKi8KKworLyogTmFtZXNwYWNlIGZvciB0aGUgc2hhcmVkX2FsbG9jYXRvci4gKi8KK25hbWVzcGFjZSBfX29mZmxvYWQgeworICAvKiBUaGlzIGZvbGxvd3MgdGhlIHNwZWNpZmljYXRpb24gZm9yIHN0ZDo6YWxsb2NhdG9yLiAqLworICAvKiBGb3J3YXJkIGRlY2xhcmF0aW9uIG9mIHRoZSBjbGFzcyB0ZW1wbGF0ZS4gKi8KKyAgdGVtcGxhdGUgPHR5cGVuYW1lIFQ+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I7CisKKyAgLyogU3BlY2lhbGl6YXRpb24gZm9yIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4uICovCisgIHRlbXBsYXRlIDw+CisgIGNsYXNzIHNoYXJlZF9hbGxvY2F0b3I8dm9pZD4geworICBwdWJsaWM6CisgICAgdHlwZWRlZiB2b2lkICAgICAgICpwb2ludGVyOworICAgIHR5cGVkZWYgY29uc3Qgdm9pZCAqY29uc3RfcG9pbnRlcjsKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgIHZhbHVlX3R5cGU7CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHN0cnVjdCByZWJpbmQgeyB0eXBlZGVmIHNoYXJlZF9hbGxvY2F0b3I8VT4gb3RoZXI7IH07CisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBvZiBzaGFyZWRfYWxsb2NhdG9yPFQ+LiAqLworICB0ZW1wbGF0ZSA8Y2xhc3MgVD4KKyAgY2xhc3Mgc2hhcmVkX2FsbG9jYXRvciB7CisgIHB1YmxpYzoKKyAgICB0eXBlZGVmIHNpemVfdCAgICAgc2l6ZV90eXBlOworICAgIHR5cGVkZWYgcHRyZGlmZl90ICBkaWZmZXJlbmNlX3R5cGU7CisgICAgdHlwZWRlZiBUICAgICAgICAgKnBvaW50ZXI7CisgICAgdHlwZWRlZiBjb25zdCBUICAgKmNvbnN0X3BvaW50ZXI7CisgICAgdHlwZWRlZiBUICAgICAgICAgJnJlZmVyZW5jZTsKKyAgICB0eXBlZGVmIGNvbnN0IFQgICAmY29uc3RfcmVmZXJlbmNlOworICAgIHR5cGVkZWYgVCAgICAgICAgICB2YWx1ZV90eXBlOworICAgIHRlbXBsYXRlIDxjbGFzcyBVPiBzdHJ1Y3QgcmViaW5kIHsgdHlwZWRlZiBzaGFyZWRfYWxsb2NhdG9yPFU+IG90aGVyOyB9OworICAgIHNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvciYpIHRocm93KCkgeyB9CisgICAgdGVtcGxhdGUgPGNsYXNzIFU+IHNoYXJlZF9hbGxvY2F0b3IoY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxVPiYpIHRocm93KCkgeyB9CisgICAgfnNoYXJlZF9hbGxvY2F0b3IoKSB0aHJvdygpIHsgfQorICAgIHBvaW50ZXIgYWRkcmVzcyhyZWZlcmVuY2UgeCkgY29uc3QgeyByZXR1cm4gJng7IH0KKyAgICBjb25zdF9wb2ludGVyIGFkZHJlc3MoY29uc3RfcmVmZXJlbmNlIHgpIGNvbnN0IHsgcmV0dXJuICZ4OyB9CisgICAgcG9pbnRlciBhbGxvY2F0ZSgKKyAgICAgIHNpemVfdHlwZSwgc2hhcmVkX2FsbG9jYXRvcjx2b2lkPjo6Y29uc3RfcG9pbnRlciBoaW50ID0gMCk7CisgICAgdm9pZCBkZWFsbG9jYXRlKHBvaW50ZXIgcCwgc2l6ZV90eXBlIG4pOworICAgIHNpemVfdHlwZSBtYXhfc2l6ZSgpIGNvbnN0IHRocm93KCkgeworICAgICAgcmV0dXJuIHNpemVfdHlwZSgtMSkvc2l6ZW9mKFQpOworICAgIH0gLyogbWF4X3NpemUgKi8KKyAgICB2b2lkIGNvbnN0cnVjdChwb2ludGVyIHAsIGNvbnN0IFQmIGFyZykgeworICAgICAgOjpuZXcgKHApIFQoYXJnKTsKKyAgICB9IC8qIGNvbnN0cnVjdCAqLworICAgIHZvaWQgZGVzdHJveShwb2ludGVyIHApIHsKKyAgICAgIHAtPn5UKCk7CisgICAgfSAvKiBkZXN0cm95ICovCisgIH07CisKKyAgLyogRGVmaW5pdGlvbiBmb3IgYWxsb2NhdGUuICovCisgIHRlbXBsYXRlIDxjbGFzcyBUPgorICB0eXBlbmFtZSBzaGFyZWRfYWxsb2NhdG9yPFQ+Ojpwb2ludGVyCisgIHNoYXJlZF9hbGxvY2F0b3I8VD46OmFsbG9jYXRlKHNoYXJlZF9hbGxvY2F0b3I8VD46OnNpemVfdHlwZSBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPHZvaWQ+Ojpjb25zdF9wb2ludGVyKSB7CisgICAgLyogQWxsb2NhdGUgZnJvbSBzaGFyZWQgbWVtb3J5LiAqLworICAgIHZvaWQgKnB0ciA9IF9PZmZsb2FkX3NoYXJlZF9tYWxsb2MocypzaXplb2YoVCkpOworICAgIGlmIChwdHIgPT0gMCkgc3RkOjpfX3Rocm93X2JhZF9hbGxvYygpOworICAgIHJldHVybiBzdGF0aWNfY2FzdDxwb2ludGVyPihwdHIpOworICB9IC8qIGFsbG9jYXRlICovCisKKyAgdGVtcGxhdGUgPGNsYXNzIFQ+CisgIHZvaWQgc2hhcmVkX2FsbG9jYXRvcjxUPjo6ZGVhbGxvY2F0ZShwb2ludGVyIHAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaGFyZWRfYWxsb2NhdG9yPFQ+OjpzaXplX3R5cGUpIHsKKyAgICAvKiBGcmVlIHRoZSBzaGFyZWQgbWVtb3J5LiAqLworICAgIF9PZmZsb2FkX3NoYXJlZF9mcmVlKHApOworICB9IC8qIGRlYWxsb2NhdGUgKi8KKworICB0ZW1wbGF0ZSA8dHlwZW5hbWUgX1QxLCB0eXBlbmFtZSBfVDI+CisgIGlubGluZSBib29sIG9wZXJhdG9yPT0oY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDE+ICYsIAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNoYXJlZF9hbGxvY2F0b3I8X1QyPiAmKSB0aHJvdygpIHsKKyAgICByZXR1cm4gdHJ1ZTsKKyAgfSAgLyogb3BlcmF0b3I9PSAqLworCisgIHRlbXBsYXRlIDx0eXBlbmFtZSBfVDEsIHR5cGVuYW1lIF9UMj4KKyAgaW5saW5lIGJvb2wgb3BlcmF0b3IhPShjb25zdCBzaGFyZWRfYWxsb2NhdG9yPF9UMT4gJiwgCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2hhcmVkX2FsbG9jYXRvcjxfVDI+ICYpIHRocm93KCkgeworICAgIHJldHVybiBmYWxzZTsKKyAgfSAgLyogb3BlcmF0b3IhPSAqLworfSAgLyogX19vZmZsb2FkICovCisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIE9GRkxPQURfSF9JTkNMVURFRCAqLwpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfY29tbW9uLmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzY4MWIwNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5jcHAKQEAgLTAsMCArMSwxNzAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKKyNpbmNsdWRlIDxtbV9tYWxsb2MuaD4KKyNlbmRpZgorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKworLy8gVGhlIGRlYnVnIHJvdXRpbmVzCisKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorCit2b2lkIF9fZHVtcF9ieXRlcygKKyAgICBpbnQgdHJhY2VfbGV2ZWwsCisgICAgY29uc3Qgdm9pZCAqZGF0YSwKKyAgICBpbnQgbGVuCispCit7CisgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IHRyYWNlX2xldmVsKSB7CisgICAgICAgIGNvbnN0IHVpbnQ4X3QgKmFyciA9IChjb25zdCB1aW50OF90KikgZGF0YTsKKyAgICAgICAgY2hhciBidWZmZXJbNDA5Nl07CisgICAgICAgIGNoYXIgKmJ1ZmZlcnA7CisgICAgICAgIGludCBjb3VudCA9IDA7CisKKyAgICAgICAgYnVmZmVycCA9IGJ1ZmZlcjsKKyAgICAgICAgd2hpbGUgKGxlbi0tKSB7CisgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIlMDJ4IiwgKmFycisrKTsKKyAgICAgICAgICAgIGJ1ZmZlcnAgKz0gMjsKKyAgICAgICAgICAgIGNvdW50Kys7CisgICAgICAgICAgICBpZiAoKGNvdW50JjMpID09IDApIHsKKyAgICAgICAgICAgICAgICBzcHJpbnRmKGJ1ZmZlcnAsICIgIik7CisgICAgICAgICAgICAgICAgYnVmZmVycCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKChjb3VudCY2MykgPT0gMCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgICAgICAgICBidWZmZXJwID0gYnVmZmVyOworICAgICAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoY291bnQpIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UodHJhY2VfbGV2ZWwsICIlc1xuIiwgYnVmZmVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHCisKKy8vIFRoZSBNYXJzaGFsbGVyIGFuZCBhc3NvY2lhdGVkIHJvdXRpbmVzCisKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9kYXRhKAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50NjRfdCBsZW5ndGgKKykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJzZW5kX2RhdGEoJXAsICVsbGQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgbGVuZ3RoKTsKKyAgICBtZW1jcHkoYnVmZmVyX3B0ciwgZGF0YSwgKHNpemVfdClsZW5ndGgpOworICAgIGJ1ZmZlcl9wdHIgKz0gbGVuZ3RoOworICAgIHRmcl9zaXplICs9IGxlbmd0aDsKK30KKwordm9pZCBNYXJzaGFsbGVyOjpyZWNlaXZlX2RhdGEoCisgICAgdm9pZCAqZGF0YSwKKyAgICBpbnQ2NF90IGxlbmd0aAorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgInJlY2VpdmVfZGF0YSglcCwgJWxsZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBsZW5ndGgpOworICAgIG1lbWNweShkYXRhLCBidWZmZXJfcHRyLCAoc2l6ZV90KWxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6c2VuZF9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiBkYXRhCispCit7CisgICAgY29uc3QgY2hhciogbmFtZTsKKyAgICBzaXplX3QgICAgICBsZW5ndGg7CisKKyAgICBpZiAoZGF0YSAhPSAwKSB7CisgICAgICAgIG5hbWUgPSBfX29mZmxvYWRfZnVuY3MuZmluZF9uYW1lKGRhdGEpOworICAgICAgICBpZiAobmFtZSA9PSAwKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPiAyKSB7CisgICAgICAgICAgICAgICAgX19vZmZsb2FkX2Z1bmNzLmR1bXAoKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBPRkZMT0FEX0RFQlVHID4gMAorCisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2VuZF9mdW5jX3B0ciwgZGF0YSk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgICAgIGxlbmd0aCA9IHN0cmxlbihuYW1lKSArIDE7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuYW1lID0gIiI7CisgICAgICAgIGxlbmd0aCA9IDE7CisgICAgfQorCisgICAgbWVtY3B5KGJ1ZmZlcl9wdHIsIG5hbWUsIGxlbmd0aCk7CisgICAgYnVmZmVyX3B0ciArPSBsZW5ndGg7CisgICAgdGZyX3NpemUgKz0gbGVuZ3RoOworfQorCisvLyBSZWNlaXZlIGZ1bmN0aW9uIHBvaW50ZXIKK3ZvaWQgTWFyc2hhbGxlcjo6cmVjZWl2ZV9mdW5jX3B0cigKKyAgICBjb25zdCB2b2lkKiogZGF0YQorKQoreworICAgIGNvbnN0IGNoYXIqIG5hbWU7CisgICAgc2l6ZV90ICAgICAgbGVuZ3RoOworCisgICAgbmFtZSA9IChjb25zdCBjaGFyKikgYnVmZmVyX3B0cjsKKyAgICBpZiAobmFtZVswXSAhPSAnXDAnKSB7CisgICAgICAgICpkYXRhID0gX19vZmZsb2FkX2Z1bmNzLmZpbmRfYWRkcihuYW1lKTsKKyAgICAgICAgaWYgKCpkYXRhID09IDApIHsKKyNpZiBPRkZMT0FEX0RFQlVHID4gMAorICAgICAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgICAgICBfX29mZmxvYWRfZnVuY3MuZHVtcCgpOworICAgICAgICAgICAgfQorI2VuZGlmIC8vIE9GRkxPQURfREVCVUcgPiAwCisKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19yZWNlaXZlX2Z1bmNfcHRyLCBuYW1lKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoID0gc3RybGVuKG5hbWUpICsgMTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgICpkYXRhID0gMDsKKyAgICAgICAgbGVuZ3RoID0gMTsKKyAgICB9CisKKyAgICBidWZmZXJfcHRyICs9IGxlbmd0aDsKKyAgICB0ZnJfc2l6ZSArPSBsZW5ndGg7Cit9CisKKy8vIEVuZCBvZiB0aGUgTWFyc2hhbGxlciBhbmQgYXNzb2NpYXRlZCByb3V0aW5lcworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0MoCisgICAgc2l6ZV90IHNpemUsCisgICAgc2l6ZV90IGFsaWduCispCit7CisgICAgdm9pZCAqcHRyOworICAgIGludCAgIGVycjsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKGFsaWduIDwgc2l6ZW9mKHZvaWQqKSkgeworICAgICAgICBhbGlnbiA9IHNpemVvZih2b2lkKik7CisgICAgfQorCisgICAgcHRyID0gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgaWYgKHB0ciA9PSBOVUxMKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX21hbGxvYywgc2l6ZSwgYWxpZ24pOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIiVzIHJldHVybmVkICVwXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIHJldHVybiBwdHI7Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2NvbW1vbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExY2I4YmIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9jb21tb24uaApAQCAtMCwwICsxLDQ0NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKiEgXGZpbGUKKyAgICBcYnJpZWYgVGhlIHBhcnRzIG9mIHRoZSBydW50aW1lIGxpYnJhcnkgY29tbW9uIHRvIGhvc3QgYW5kIHRhcmdldAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0NPTU1PTl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfQ09NTU9OX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bWVtb3J5Lmg+CisKKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YWJsZS5oIgorI2luY2x1ZGUgIm9mZmxvYWRfdHJhY2UuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAiY2Vhbl91dGlsLmgiCisjaW5jbHVkZSAiZHZfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2luY2x1ZGUgPHN0ZGFyZy5oPgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworLy8gSG9zdCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2V4dGVybiBpbnQgY29uc29sZV9lbmFibGVkOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKworI2RlZmluZSBPRkZMT0FEX0RPX1RSQUNFIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA9PSAzKQorCitleHRlcm4gY29uc3QgY2hhciAqcHJlZml4OworZXh0ZXJuIGludCBvZmZsb2FkX251bWJlcjsKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisjaWYgSE9TVF9MSUJSQVJZCit2b2lkIE9mZmxvYWRfUmVwb3J0X1Byb2xvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YSk7Cit2b2lkIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpOwordm9pZCBPZmZsb2FkX1RpbWVyX1ByaW50KHZvaWQpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0lOQ1JfT0ZMRF9OVU0oKSBcCisgICAgICAgIF9fc3luY19hZGRfYW5kX2ZldGNoKCZvZmZsb2FkX251bWJlciwgMSkKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfSU5DUl9PRkxEX05VTSgpIFwKKyAgICAgICAgX0ludGVybG9ja2VkSW5jcmVtZW50KHJlaW50ZXJwcmV0X2Nhc3Q8bG9uZyo+KCZvZmZsb2FkX251bWJlcikpCisjZW5kaWYKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1BSSU5UX1RBR19QUkVGSVgoKSBcCisgICAgICAgIHByaW50ZigiJXM6ICAiLCBwcmVmaXgpOworCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzOiAgIiwgcHJlZml4KTsKKyNlbHNlCisjZGVmaW5lIE9GRkxPQURfREVCVUdfUFJJTlRfUFJFRklYKCkgXAorICAgICAgICBwcmludGYoIiVzJWQ6ICAiLCBwcmVmaXgsIG1pY19pbmRleCk7CisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKyNkZWZpbmUgT0ZGTE9BRF9UUkFDRSh0cmFjZV9sZXZlbCwgLi4uKSAgXAorICAgIGlmIChjb25zb2xlX2VuYWJsZWQgPj0gdHJhY2VfbGV2ZWwpIHsgXAorICAgICAgICBPRkZMT0FEX0RFQlVHX1BSSU5UX1BSRUZJWCgpOyBcCisgICAgICAgIHByaW50ZihfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX1RSQUNFKGxldmVsLCAuLi4pIFwKKyAgICBPRkZMT0FEX1RSQUNFKGxldmVsLCBfX1ZBX0FSR1NfXykKKworI2RlZmluZSBPRkZMT0FEX1JFUE9SVChsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfREVCVUdfVFJBQ0VfMShsZXZlbCwgb2ZmbG9hZF9udW1iZXIsIHN0YWdlLCAuLi4pIFwKKyAgICBpZiAoT0ZGTE9BRF9ET19UUkFDRSkgeyBcCisgICAgICAgIG9mZmxvYWRfc3RhZ2VfcHJpbnQoc3RhZ2UsIG9mZmxvYWRfbnVtYmVyLCBfX1ZBX0FSR1NfXyk7IFwKKyAgICAgICAgZmZsdXNoKE5VTEwpOyBcCisgICAgfSBcCisgICAgaWYgKCFPRkZMT0FEX0RPX1RSQUNFKSB7IFwKKyAgICAgICAgT0ZGTE9BRF9UUkFDRShsZXZlbCwgX19WQV9BUkdTX18pIFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKGxldmVsLCBhLCBiKSBcCisgICAgX19kdW1wX2J5dGVzKGxldmVsLCBhLCBiKQorCitleHRlcm4gdm9pZCBfX2R1bXBfYnl0ZXMoCisgICAgaW50IGxldmVsLAorICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgaW50IGxlbgorKTsKKworI2Vsc2UKKworI2RlZmluZSBPRkZMT0FEX0RFQlVHX0xPRyhsZXZlbCwgLi4uKQorI2RlZmluZSBPRkZMT0FEX0RFQlVHX0RVTVBfQllURVMobGV2ZWwsIGEsIGIpCisKKyNlbmRpZgorCisvLyBSdW50aW1lIGludGVyZmFjZQorCisjZGVmaW5lIE9GRkxPQURfUFJFRklYKGEpIF9fb2ZmbG9hZF8jI2EKKworI2RlZmluZSBPRkZMT0FEX01BTExPQyAgICAgICAgICAgIE9GRkxPQURfUFJFRklYKG1hbGxvYykKKyNkZWZpbmUgT0ZGTE9BRF9GUkVFKGEpICAgICAgICAgICBfbW1fZnJlZShhKQorCisvLyBGb3J3YXJkIGZ1bmN0aW9ucworCitleHRlcm4gdm9pZCAqT0ZGTE9BRF9NQUxMT0Moc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbik7CisKKy8vIFRoZSBNYXJzaGFsbGVyCisKKy8vISBcZW51bSBJbmRpY2F0b3IgZm9yIHRoZSB0eXBlIG9mIGVudHJ5IG9uIGFuIG9mZmxvYWQgaXRlbSBsaXN0LgorZW51bSBPZmZsb2FkSXRlbVR5cGUgeworICAgIGNfZGF0YSA9ICAgMSwgICAgICAgLy8hPCBQbGFpbiBkYXRhCisgICAgY19kYXRhX3B0ciwgICAgICAgICAvLyE8IFBvaW50ZXIgZGF0YQorICAgIGNfZnVuY19wdHIsICAgICAgICAgLy8hPCBGdW5jdGlvbiBwb2ludGVyCisgICAgY192b2lkX3B0ciwgICAgICAgICAvLyE8IHZvaWQqCisgICAgY19zdHJpbmdfcHRyLCAgICAgICAvLyE8IEMgc3RyaW5nCisgICAgY19kdiwgICAgICAgICAgICAgICAvLyE8IERvcGUgdmVjdG9yIHZhcmlhYmxlCisgICAgY19kdl9kYXRhLCAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIGRhdGEKKyAgICBjX2R2X2RhdGFfc2xpY2UsICAgIC8vITwgRG9wZS12ZWN0b3IgZGF0YSdzIHNsaWNlCisgICAgY19kdl9wdHIsICAgICAgICAgICAvLyE8IERvcGUtdmVjdG9yIHZhcmlhYmxlIHBvaW50ZXIKKyAgICBjX2R2X3B0cl9kYXRhLCAgICAgIC8vITwgRG9wZS12ZWN0b3IgcG9pbnRlciBkYXRhCisgICAgY19kdl9wdHJfZGF0YV9zbGljZSwvLyE8IERvcGUtdmVjdG9yIHBvaW50ZXIgZGF0YSdzIHNsaWNlCisgICAgY19jZWFuX3ZhciwgICAgICAgICAvLyE8IENFQU4gdmFyaWFibGUKKyAgICBjX2NlYW5fdmFyX3B0ciwgICAgIC8vITwgUG9pbnRlciB0byBDRUFOIHZhcmlhYmxlCisgICAgY19kYXRhX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZGF0YSBwb2ludGVyIGFycmF5CisgICAgY19mdW5jX3B0cl9hcnJheSwgICAvLyE8IFBvaW50ZXIgdG8gZnVuY3Rpb24gcG9pbnRlciBhcnJheQorICAgIGNfdm9pZF9wdHJfYXJyYXksICAgLy8hPCBQb2ludGVyIHRvIHZvaWQqIHBvaW50ZXIgYXJyYXkKKyAgICBjX3N0cmluZ19wdHJfYXJyYXkgIC8vITwgUG9pbnRlciB0byBjaGFyKiBwb2ludGVyIGFycmF5Cit9OworCisjZGVmaW5lIFZBUl9UWVBFX0lTX1BUUih0KSAoKHQpID09IGNfc3RyaW5nX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZGF0YV9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyX3B0ciB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyKQorCisjZGVmaW5lIFZBUl9UWVBFX0lTX1NDQUxBUih0KSAoKHQpID09IGNfZGF0YSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfdm9pZF9wdHIgfHwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2NlYW5fdmFyIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAodCkgPT0gY19kdikKKworI2RlZmluZSBWQVJfVFlQRV9JU19EVl9EQVRBKHQpICgodCkgPT0gY19kdl9kYXRhIHx8IFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHQpID09IGNfZHZfcHRyX2RhdGEpCisKKyNkZWZpbmUgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0KSAoKHQpID09IGNfZHZfZGF0YV9zbGljZSB8fCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0KSA9PSBjX2R2X3B0cl9kYXRhX3NsaWNlKQorCisKKy8vISBcZW51bSBTcGVjaWZ5IGRpcmVjdGlvbiB0byBjb3B5IG9mZmxvYWRlZCB2YXJpYWJsZS4KK2VudW0gT2ZmbG9hZFBhcmFtZXRlclR5cGUgeworICAgIGNfcGFyYW1ldGVyX3Vua25vd24gPSAtMSwgLy8hPCBVbmtub3duIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX25vY29weSwgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm5vY29weSIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW4sICAgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW4iIGNsYXVzZQorICAgIGNfcGFyYW1ldGVyX291dCwgICAgICAgICAgLy8hPCBWYXJpYWJsZSBsaXN0ZWQgaW4gIm91dCIgY2xhdXNlCisgICAgY19wYXJhbWV0ZXJfaW5vdXQgICAgICAgICAvLyE8IFZhcmlhYmxlIGxpc3RlZCBpbiAiaW5vdXQiIGNsYXVzZQorfTsKKworLy8hIEFuIE9mZmxvYWQgVmFyaWFibGUgZGVzY3JpcHRvcgorc3RydWN0IFZhckRlc2MgeworICAgIC8vISBPZmZsb2FkSXRlbVR5cGVzIG9mIHNvdXJjZSBhbmQgZGVzdGluYXRpb24KKyAgICB1bmlvbiB7CisgICAgICAgIHN0cnVjdCB7CisgICAgICAgICAgICB1aW50OF90IGRzdCA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIGRlc3RpbmF0aW9uCisgICAgICAgICAgICB1aW50OF90IHNyYyA6IDQ7IC8vITwgT2ZmbG9hZEl0ZW1UeXBlIG9mIHNvdXJjZQorICAgICAgICB9OworICAgICAgICB1aW50OF90IGJpdHM7CisgICAgfSB0eXBlOworCisgICAgLy8hIE9mZmxvYWRQYXJhbWV0ZXJUeXBlIHRoYXQgZGVzY3JpYmVzIGRpcmVjdGlvbiBvZiBkYXRhIHRyYW5zZmVyCisgICAgdW5pb24geworICAgICAgICBzdHJ1Y3QgeworICAgICAgICAgICAgdWludDhfdCBpbiAgOiAxOyAvLyE8IFNldCBpZiBJTiBvciBJTk9VVAorICAgICAgICAgICAgdWludDhfdCBvdXQgOiAxOyAvLyE8IFNldCBpZiBPVVQgb3IgSU5PVVQKKyAgICAgICAgfTsKKyAgICAgICAgdWludDhfdCBiaXRzOworICAgIH0gZGlyZWN0aW9uOworCisgICAgdWludDhfdCBhbGxvY19pZjsgICAgICAgIC8vITwgYWxsb2NfaWYgbW9kaWZpZXIgdmFsdWUKKyAgICB1aW50OF90IGZyZWVfaWY7ICAgICAgICAgLy8hPCBmcmVlX2lmIG1vZGlmaWVyIHZhbHVlCisgICAgdWludDMyX3QgYWxpZ247ICAgICAgICAgIC8vITwgTUlDIGFsaWdubWVudCByZXF1ZXN0ZWQgZm9yIHBvaW50ZXIgZGF0YQorICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBkYXRhIGZyb20gc3RhcnQgb2YgTUlDIGJ1ZmZlciAqLworICAgIHVpbnQzMl90IG1pY19vZmZzZXQ7CisgICAgLy8hIEZsYWdzIGRlc2NyaWJpbmcgdGhpcyB2YXJpYWJsZQorICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgIC8vISBzb3VyY2UgdmFyaWFibGUgaGFzIHBlcnNpc3RlbnQgc3RvcmFnZQorICAgICAgICAgICAgdWludDMyX3QgaXNfc3RhdGljIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiB2YXJpYWJsZSBoYXMgcGVyc2lzdGVudCBzdG9yYWdlCisgICAgICAgICAgICB1aW50MzJfdCBpc19zdGF0aWNfZHN0biA6IDE7CisgICAgICAgICAgICAvLyEgaGFzIGxlbmd0aCBmb3IgY19kdiAmJiBjX2R2X3B0cgorICAgICAgICAgICAgdWludDMyX3QgaGFzX2xlbmd0aCA6IDE7CisgICAgICAgICAgICAvLyEgcGVyc2lzdGVkIGxvY2FsIHNjYWxhciBpcyBpbiBzdGFjayBidWZmZXIKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX3N0YWNrX2J1ZiA6IDE7CisgICAgICAgICAgICAvLyEgYnVmZmVyIGFkZHJlc3MgaXMgc2VudCBpbiBkYXRhCisgICAgICAgICAgICB1aW50MzJfdCBzaW5rX2FkZHIgOiAxOworICAgICAgICAgICAgLy8hIGFsbG9jIGRpc3BsYWNlbWVudCBpcyBzZW50IGluIGRhdGEKKyAgICAgICAgICAgIHVpbnQzMl90IGFsbG9jX2Rpc3AgOiAxOworICAgICAgICAgICAgLy8hIHNvdXJjZSBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfc3JjIDogMTsKKyAgICAgICAgICAgIC8vISBkZXN0aW5hdGlvbiBkYXRhIGlzIG5vbmNvbnRpZ3VvdXMKKyAgICAgICAgICAgIHVpbnQzMl90IGlzX25vbmNvbnRfZHN0IDogMTsKKyAgICAgICAgfTsKKyAgICAgICAgdWludDMyX3QgYml0czsKKyAgICB9IGZsYWdzOworICAgIC8vISBOb3QgdXNlZCBieSBjb21waWxlcjsgc2V0IHRvIDAKKyAgICAvKiEgVXNlZCBieSBydW50aW1lIGFzIG9mZnNldCB0byBiYXNlIGZyb20gZGF0YSBzdG9yZWQgaW4gYSBidWZmZXIgKi8KKyAgICBpbnQ2NF90IG9mZnNldDsKKyAgICAvLyEgRWxlbWVudCBieXRlLXNpemUgb2YgZGF0YSB0byBiZSB0cmFuc2ZlcnJlZAorICAgIC8qISBGb3IgZG9wZS12ZWN0b3IsIHRoZSBzaXplIG9mIHRoZSBkb3BlLXZlY3RvciAgICAgICovCisgICAgaW50NjRfdCBzaXplOworICAgIHVuaW9uIHsKKyAgICAgICAgLy8hIFNldCB0byAwIGZvciBhcnJheSBleHByZXNzaW9ucyBhbmQgZG9wZS12ZWN0b3JzCisgICAgICAgIC8qISBTZXQgdG8gMSBmb3Igc2NhbGFycyAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgLyohIFNldCB0byB2YWx1ZSBvZiBsZW5ndGggbW9kaWZpZXIgZm9yIHBvaW50ZXJzICAqLworICAgICAgICBpbnQ2NF90IGNvdW50OworICAgICAgICAvLyEgRGlzcGxhY2VtZW50IG5vdCB1c2VkIGJ5IGNvbXBpbGVyCisgICAgICAgIGludDY0X3QgZGlzcDsKKyAgICB9OworCisgICAgLy8hIFRoaXMgZmllbGQgbm90IHVzZWQgYnkgT3Blbk1QIDQuMAorICAgIC8qISBUaGUgYWxsb2Mgc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICovCisgICAgdW5pb24geworICAgICAgIHZvaWQgKmFsbG9jOworICAgICAgIGludDY0X3QgcHRyX2Fycl9vZmZzZXQ7CisgICAgfTsKKworICAgIC8vISBUaGlzIGZpZWxkIG5vdCB1c2VkIGJ5IE9wZW5NUCA0LjAKKyAgICAvKiEgVGhlIGludG8gc2VjdGlvbiBleHByZXNzaW9uIGluICNwcmFnbWEgb2ZmbG9hZCAgICAqLworICAgIC8qISBGb3IgY19kYXRhX3B0cl9hcnJheSB0aGlzIGlzIHRoZSBpbnRvIHB0ciBhcnJheSAgICovCisgICAgdm9pZCAqaW50bzsKKworICAgIC8vISBGb3IgYW4gb3JkaW5hcnkgdmFyaWFibGUsIGFkZHJlc3Mgb2YgdGhlIHZhcmlhYmxlCisgICAgLyohIEZvciBjX2NlYW5fdmFyIChDL0MrKyBhcnJheSBleHByZXNzaW9uKSwKKyAgICAgICAgcG9pbnRlciB0byBhcnJfZGVzYywgd2hpY2ggaXMgYW4gYXJyYXkgZGVzY3JpcHRvci4gKi8KKyAgICAvKiEgRm9yIGNfZGF0YV9wdHJfYXJyYXkgKGFycmF5IG9mIGRhdGEgcG9pbnRlcnMpLAorICAgICAgICBwb2ludGVyIHRvIHB0cl9hcnJheV9kZXNjcmlwdG9yLAorICAgICAgICB3aGljaCBpcyBhIGRlc2NyaXB0b3IgZm9yIHBvaW50ZXIgYXJyYXkgdHJhbnNmZXJzLiAqLworICAgIHZvaWQgKnB0cjsKK307CisKKy8vISBBdXhpbGlhcnkgc3RydWN0IHVzZWQgd2hlbiAtZyBpcyBlbmFibGVkIHRoYXQgaG9sZHMgdmFyaWFibGUgbmFtZXMKK3N0cnVjdCBWYXJEZXNjMiB7CisgICAgY29uc3QgY2hhciAqc25hbWU7IC8vITwgU291cmNlIG5hbWUKKyAgICBjb25zdCBjaGFyICpkbmFtZTsgLy8hPCBEZXN0aW5hdGlvbiBuYW1lICh3aGVuICJpbnRvIiBpcyB1c2VkKQorfTsKKworLyohIFdoZW4gdGhlIE9mZmxvYWRJdGVtVHlwZSBpcyBjX2RhdGFfcHRyX2FycmF5CisgICAgdGhlIHB0ciBmaWVsZCBvZiB0aGUgbWFpbiBkZXNjcmlwdG9yIHBvaW50cyB0byB0aGlzIHN0cnVjdC4gICAgICAgICAgKi8KKy8qISBUaGUgdHlwZSBpbiBWYXJEZXNjMSBtZXJlbHkgc2F5cyBjX2NlYW5fZGF0YV9wdHIsIGJ1dCB0aGUgcG9pbnRlcgorICAgIHR5cGUgY2FuIGJlIGNfZGF0YV9wdHIsIGNfZnVuY19wdHIsIGNfdm9pZF9wdHIsIG9yIGNfc3RyaW5nX3B0ci4KKyAgICBUaGVyZWZvcmUgdGhlIGFjdHVhbCBwb2ludGVyIHR5cGUgaXMgaW4gdGhlIGZsYWdzIGZpZWxkIG9mIFZhckRlc2MzLiAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAwIHRoZW4gYWxpZ25tZW50L2FsbG9jX2lmL2ZyZWVfaWYgYXJlIHNwZWNpZmllZCBpbiBWYXJEZXNjMS4gICAgICAqLworLyohIElmIGZsYWdfYWxpZ25faXNfYXJyYXkvZmxhZ19hbGxvY19pZl9pc19hcnJheS9mbGFnX2ZyZWVfaWZfaXNfYXJyYXkKKyAgICBpcyAxIHRoZW4gYWxpZ25fYXJyYXkvYWxsb2NfaWZfYXJyYXkvZnJlZV9pZl9hcnJheSBzcGVjaWZ5CisgICAgdGhlIHNldCBvZiBhbGlnbm1lbnQvYWxsb2NfaWYvZnJlZV9pZiB2YWx1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qISBGb3IgdGhlIG90aGVyIGZpZWxkcywgaWYgbmVpdGhlciB0aGUgc2NhbGFyIG5vciB0aGUgYXJyYXkgZmxhZworICAgIGlzIHNldCwgdGhlbiB0aGF0IG1vZGlmaWVyIHdhcyBub3Qgc3BlY2lmaWVkLiBJZiB0aGUgYml0cyBhcmUgc2V0CisgICAgdGhleSBzcGVjaWZ5IHdoaWNoIG1vZGlmaWVyIHdhcyBzZXQgYW5kIHdoZXRoZXIgaXQgd2FzIGEKKyAgICBzY2FsYXIgb3IgYW4gYXJyYXkgZXhwcmVzc2lvbi4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworc3RydWN0IFZhckRlc2MzCit7CisgICAgdm9pZCAqcHRyX2FycmF5OyAgICAgICAgLy8hPCBQb2ludGVyIHRvIGFycl9kZXNjIG9mIGFycmF5IG9mIHBvaW50ZXJzCisgICAgdm9pZCAqYWxpZ25fYXJyYXk7ICAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX2lmX2FycmF5OyAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICpmcmVlX2lmX2FycmF5OyAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqZXh0ZW50X3N0YXJ0OyAgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmV4dGVudF9lbGVtZW50czsgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICppbnRvX3N0YXJ0OyAgICAgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgdm9pZCAqaW50b19lbGVtZW50czsgICAgLy8hPCBTY2FsYXIgdmFsdWUgb3IgcG9pbnRlciB0byBhcnJfZGVzYworICAgIHZvaWQgKmFsbG9jX3N0YXJ0OyAgICAgIC8vITwgU2NhbGFyIHZhbHVlIG9yIHBvaW50ZXIgdG8gYXJyX2Rlc2MKKyAgICB2b2lkICphbGxvY19lbGVtZW50czsgICAvLyE8IFNjYWxhciB2YWx1ZSBvciBwb2ludGVyIHRvIGFycl9kZXNjCisgICAgLyohIEZsYWdzIHRoYXQgZGVzY3JpYmUgdGhlIHBvaW50ZXIgdHlwZSBhbmQgd2hldGhlciBlYWNoIGZpZWxkCisgICAgICAgIGlzIGEgc2NhbGFyIHZhbHVlIG9yIGFuIGFycmF5IGV4cHJlc3Npb24uICAgICAgICAqLworICAgIC8qISBGaXJzdCA2IGJpdHMgYXJlIHBvaW50ZXIgYXJyYXkgZWxlbWVudCB0eXBlOgorICAgICAgICBjX2RhdGFfcHRyLCBjX2Z1bmNfcHRyLCBjX3ZvaWRfcHRyLCBjX3N0cmluZ19wdHIgKi8KKyAgICAvKiEgVGhlbiBzaW5nbGUgYml0cyBzcGVjaWZ5OiAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBhbGlnbl9hcnJheSBpcyBhbiBhcnJheSAgICAgICAgICAgICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGZyZWVfaWZfYXJyYXkgaXMgYW4gYXJyYXkgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfc3RhcnQgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgICAqLworICAgIC8qISAgICAgZXh0ZW50X3N0YXJ0IGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICAgKi8KKyAgICAvKiEgICAgIGV4dGVudF9lbGVtZW50cyBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICovCisgICAgLyohICAgICBleHRlbnRfZWxlbWVudHMgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAqLworICAgIC8qISAgICAgaW50b19zdGFydCBpcyBhIHNjYWxhciBleHByZXNzaW9uICAgICAgICAgICAgKi8KKyAgICAvKiEgICAgIGludG9fc3RhcnQgaXMgYW4gYXJyYXkgZXhwcmVzc2lvbiAgICAgICAgICAgICovCisgICAgLyohICAgICBpbnRvX2VsZW1lbnRzIGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAqLworICAgIC8qISAgICAgaW50b19lbGVtZW50cyBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX3N0YXJ0IGlzIGEgc2NhbGFyIGV4cHJlc3Npb24gICAgICAgICAgICovCisgICAgLyohICAgICBhbGxvY19zdGFydCBpcyBhbiBhcnJheSBleHByZXNzaW9uICAgICAgICAgICAqLworICAgIC8qISAgICAgYWxsb2NfZWxlbWVudHMgaXMgYSBzY2FsYXIgZXhwcmVzc2lvbiAgICAgICAgKi8KKyAgICAvKiEgICAgIGFsbG9jX2VsZW1lbnRzIGlzIGFuIGFycmF5IGV4cHJlc3Npb24gICAgICAgICovCisgICAgdWludDMyX3QgYXJyYXlfZmllbGRzOworfTsKK2NvbnN0IGludCBmbGFnX2FsaWduX2lzX2FycmF5ID0gNjsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2lmX2lzX2FycmF5ID0gNzsKK2NvbnN0IGludCBmbGFnX2ZyZWVfaWZfaXNfYXJyYXkgPSA4OworY29uc3QgaW50IGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhciA9IDk7Citjb25zdCBpbnQgZmxhZ19leHRlbnRfc3RhcnRfaXNfYXJyYXkgPSAxMDsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIgPSAxMTsKK2NvbnN0IGludCBmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSA9IDEyOworY29uc3QgaW50IGZsYWdfaW50b19zdGFydF9pc19zY2FsYXIgPSAxMzsKK2NvbnN0IGludCBmbGFnX2ludG9fc3RhcnRfaXNfYXJyYXkgPSAxNDsKK2NvbnN0IGludCBmbGFnX2ludG9fZWxlbWVudHNfaXNfc2NhbGFyID0gMTU7Citjb25zdCBpbnQgZmxhZ19pbnRvX2VsZW1lbnRzX2lzX2FycmF5ID0gMTY7Citjb25zdCBpbnQgZmxhZ19hbGxvY19zdGFydF9pc19zY2FsYXIgPSAxNzsKK2NvbnN0IGludCBmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5ID0gMTg7Citjb25zdCBpbnQgZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIgPSAxOTsKK2NvbnN0IGludCBmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5ID0gMjA7CisKKy8vIFRoZSBNYXJzaGFsbGVyCitjbGFzcyBNYXJzaGFsbGVyCit7Citwcml2YXRlOgorICAgIC8vIFN0YXJ0IGFkZHJlc3Mgb2YgYnVmZmVyCisgICAgY2hhciAqYnVmZmVyX3N0YXJ0OworCisgICAgLy8gQ3VycmVudCBwb2ludGVyIHdpdGhpbiBidWZmZXIKKyAgICBjaGFyICpidWZmZXJfcHRyOworCisgICAgLy8gUGh5c2ljYWwgc2l6ZSBvZiBkYXRhIHNlbnQgKGluY2x1ZGluZyBmbGFncykKKyAgICBsb25nIGxvbmcgYnVmZmVyX3NpemU7CisKKyAgICAvLyBVc2VyIGRhdGEgc2VudC9yZWNlaXZlZAorICAgIGxvbmcgbG9uZyB0ZnJfc2l6ZTsKKworcHVibGljOgorICAgIC8vIENvbnN0cnVjdG9yCisgICAgTWFyc2hhbGxlcigpIDoKKyAgICAgICAgYnVmZmVyX3N0YXJ0KDApLCBidWZmZXJfcHRyKDApLAorICAgICAgICBidWZmZXJfc2l6ZSgwKSwgdGZyX3NpemUoMCkKKyAgICB7CisgICAgfQorCisgICAgLy8gUmV0dXJuIGNvdW50IG9mIHVzZXIgZGF0YSBzZW50L3JlY2VpdmVkCisgICAgbG9uZyBsb25nIGdldF90ZnJfc2l6ZSgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gdGZyX3NpemU7CisgICAgfQorCisgICAgLy8gUmV0dXJuIHBvaW50ZXIgdG8gYnVmZmVyCisgICAgY2hhciAqZ2V0X2J1ZmZlcl9zdGFydCgpIGNvbnN0CisgICAgeworICAgICAgICByZXR1cm4gYnVmZmVyX3N0YXJ0OworICAgIH0KKworICAgIC8vIFJldHVybiBjdXJyZW50IHNpemUgb2YgZGF0YSBpbiBidWZmZXIKKyAgICBsb25nIGxvbmcgZ2V0X2J1ZmZlcl9zaXplKCkgY29uc3QKKyAgICB7CisgICAgICAgIHJldHVybiBidWZmZXJfc2l6ZTsKKyAgICB9CisKKyAgICAvLyBTZXQgYnVmZmVyIHBvaW50ZXIKKyAgICB2b2lkIGluaXRfYnVmZmVyKAorICAgICAgICBjaGFyICpkLAorICAgICAgICBsb25nIGxvbmcgcworICAgICkKKyAgICB7CisgICAgICAgIGJ1ZmZlcl9zdGFydCA9IGJ1ZmZlcl9wdHIgPSBkOworICAgICAgICBidWZmZXJfc2l6ZSA9IHM7CisgICAgfQorCisgICAgLy8gU2VuZCBkYXRhCisgICAgdm9pZCBzZW5kX2RhdGEoCisgICAgICAgIGNvbnN0IHZvaWQgKmRhdGEsCisgICAgICAgIGludDY0X3QgbGVuZ3RoCisgICAgKTsKKworICAgIC8vIFJlY2VpdmUgZGF0YQorICAgIHZvaWQgcmVjZWl2ZV9kYXRhKAorICAgICAgICB2b2lkICpkYXRhLAorICAgICAgICBpbnQ2NF90IGxlbmd0aAorICAgICk7CisKKyAgICAvLyBTZW5kIGZ1bmN0aW9uIHBvaW50ZXIKKyAgICB2b2lkIHNlbmRfZnVuY19wdHIoCisgICAgICAgIGNvbnN0IHZvaWQqIGRhdGEKKyAgICApOworCisgICAgLy8gUmVjZWl2ZSBmdW5jdGlvbiBwb2ludGVyCisgICAgdm9pZCByZWNlaXZlX2Z1bmNfcHRyKAorICAgICAgICBjb25zdCB2b2lkKiogZGF0YQorICAgICk7Cit9OworCisvLyBFbmQgb2YgdGhlIE1hcnNoYWxsZXIKKworLy8gVGhlIG9mZmxvYWRlZCBmdW5jdGlvbiBkZXNjcmlwdG9yLgorLy8gU2VudCBmcm9tIGhvc3QgdG8gdGFyZ2V0IHRvIHNwZWNpZnkgd2hpY2ggZnVuY3Rpb24gdG8gcnVuLgorLy8gQWxzbywgc2V0cyBjb25zb2xlIGFuZCBmaWxlIHRyYWNpbmcgbGV2ZWxzLgorc3RydWN0IEZ1bmN0aW9uRGVzY3JpcHRvcgoreworICAgIC8vIElucHV0IGRhdGEgc2l6ZS4KKyAgICBsb25nIGxvbmcgaW5fZGF0YWxlbjsKKworICAgIC8vIE91dHB1dCBkYXRhIHNpemUuCisgICAgbG9uZyBsb25nIG91dF9kYXRhbGVuOworCisgICAgLy8gV2hldGhlciB0cmFjZSBpcyByZXF1ZXN0ZWQgb24gY29uc29sZS4KKyAgICAvLyBBIHZhbHVlIG9mIDEgcHJvZHVjZXMgb25seSBmdW5jdGlvbiBuYW1lIGFuZCBkYXRhIHNlbnQvcmVjZWl2ZWQuCisgICAgLy8gVmFsdWVzID4gMSBwcm9kdWNlIGNvcGlvdXMgdHJhY2UgaW5mb3JtYXRpb24uCisgICAgdWludDhfdCBjb25zb2xlX2VuYWJsZWQ7CisKKyAgICAvLyBGbGFnIGNvbnRyb2xsaW5nIHRpbWluZyBvbiB0aGUgdGFyZ2V0IHNpZGUuCisgICAgLy8gVmFsdWVzID4gMCBlbmFibGUgdGltaW5nIG9uIHNpbmsuCisgICAgdWludDhfdCB0aW1lcl9lbmFibGVkOworCisgICAgaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworICAgIGludCBvZmZsb2FkX251bWJlcjsKKworICAgIC8vIG51bWJlciBvZiB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIGludCB2YXJzX251bTsKKworICAgIC8vIGlub3V0IGRhdGEgb2Zmc2V0IGlmIGRhdGEgaXMgcGFzc2VkIGFzIG1pc2MvcmV0dXJuIGRhdGEKKyAgICAvLyBvdGhlcndpc2UgaXQgc2hvdWxkIGJlIHplcm8uCisgICAgaW50IGRhdGFfb2Zmc2V0OworCisgICAgLy8gVGhlIG5hbWUgb2YgdGhlIG9mZmxvYWRlZCBmdW5jdGlvbgorICAgIGNoYXIgZGF0YVtdOworfTsKKworLy8gdHlwZWRlZiBPRkZMT0FELgorLy8gUG9pbnRlciB0byBPZmZsb2FkRGVzY3JpcHRvci4KK3R5cGVkZWYgc3RydWN0IE9mZmxvYWREZXNjcmlwdG9yICpPRkZMT0FEOworCisjZW5kaWYgLy8gT0ZGTE9BRF9DT01NT05fSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDY5YjYwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2VuZ2luZS5jcHAKQEAgLTAsMCArMSw1MzEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfZW5naW5lLmgiCisjaW5jbHVkZSA8c2lnbmFsLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKworI2luY2x1ZGUgPGFsZ29yaXRobT4KKyNpbmNsdWRlIDx2ZWN0b3I+CisKKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhYmxlLmgiCisKK2NvbnN0IGNoYXIqIEVuZ2luZTo6bV9mdW5jX25hbWVzW0VuZ2luZTo6Y19mdW5jc190b3RhbF0gPQoreworICAgICJzZXJ2ZXJfY29tcHV0ZSIsCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX215b2luaXQiLAorICAgICJzZXJ2ZXJfbXlvZmluaSIsCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKKyAgICAic2VydmVyX2luaXQiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX3NpemUiLAorICAgICJzZXJ2ZXJfdmFyX3RhYmxlX2NvcHkiCit9OworCisvLyBTeW1ib2xpYyByZXByZXNlbnRhdGlvbiBvZiBzeXN0ZW0gc2lnbmFscy4gRml4IGZvciBDUTIzMzU5MworY29uc3QgY2hhciogRW5naW5lOjpjX3NpZ25hbF9uYW1lc1tFbmdpbmU6OmNfc2lnbmFsX21heF0gPQoreworICAgICJVbmtub3duIFNJR05BTCIsCisgICAgIlNJR0hVUCIsICAgIC8qICAxLCBIYW5ndXAgKFBPU0lYKS4gICovCisgICAgIlNJR0lOVCIsICAgIC8qICAyLCBJbnRlcnJ1cHQgKEFOU0kpLiAgKi8KKyAgICAiU0lHUVVJVCIsICAgLyogIDMsIFF1aXQgKFBPU0lYKS4gICovCisgICAgIlNJR0lMTCIsICAgIC8qICA0LCBJbGxlZ2FsIGluc3RydWN0aW9uIChBTlNJKS4gICovCisgICAgIlNJR1RSQVAiLCAgIC8qICA1LCBUcmFjZSB0cmFwIChQT1NJWCkuICAqLworICAgICJTSUdBQlJUIiwgICAvKiAgNiwgQWJvcnQgKEFOU0kpLiAgKi8KKyAgICAiU0lHQlVTIiwgICAgLyogIDcsIEJVUyBlcnJvciAoNC4yIEJTRCkuICAqLworICAgICJTSUdGUEUiLCAgICAvKiAgOCwgRmxvYXRpbmctcG9pbnQgZXhjZXB0aW9uIChBTlNJKS4gICovCisgICAgIlNJR0tJTEwiLCAgIC8qICA5LCBLaWxsLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVNSMSIsICAgLyogMTAsIFVzZXItZGVmaW5lZCBzaWduYWwgMSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHU0VHViIsICAgLyogMTEsIFNlZ21lbnRhdGlvbiB2aW9sYXRpb24gKEFOU0kpLiAgKi8KKyAgICAiU0lHVVNSMiIsICAgLyogMTIsIFVzZXItZGVmaW5lZCBzaWduYWwgMiAoUE9TSVgpLiAgKi8KKyAgICAiU0lHUElQRSIsICAgLyogMTMsIEJyb2tlbiBwaXBlIChQT1NJWCkuICAqLworICAgICJTSUdBTFJNIiwgICAvKiAxNCwgQWxhcm0gY2xvY2sgKFBPU0lYKS4gICovCisgICAgIlNJR1RFUk0iLCAgIC8qIDE1LCBUZXJtaW5hdGlvbiAoQU5TSSkuICAqLworICAgICJTSUdTVEtGTFQiLCAvKiAxNiwgU3RhY2sgZmF1bHQuICAqLworICAgICJTSUdDSExEIiwgICAvKiAxNywgQ2hpbGQgc3RhdHVzIGhhcyBjaGFuZ2VkIChQT1NJWCkuICAqLworICAgICJTSUdDT05UIiwgICAvKiAxOCwgQ29udGludWUgKFBPU0lYKS4gICovCisgICAgIlNJR1NUT1AiLCAgIC8qIDE5LCBTdG9wLCB1bmJsb2NrYWJsZSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVFNUUCIsICAgLyogMjAsIEtleWJvYXJkIHN0b3AgKFBPU0lYKS4gICovCisgICAgIlNJR1RUSU4iLCAgIC8qIDIxLCBCYWNrZ3JvdW5kIHJlYWQgZnJvbSB0dHkgKFBPU0lYKS4gICovCisgICAgIlNJR1RUT1UiLCAgIC8qIDIyLCBCYWNrZ3JvdW5kIHdyaXRlIHRvIHR0eSAoUE9TSVgpLiAgKi8KKyAgICAiU0lHVVJHIiwgICAgLyogMjMsIFVyZ2VudCBjb25kaXRpb24gb24gc29ja2V0ICg0LjIgQlNEKS4gICovCisgICAgIlNJR1hDUFUiLCAgIC8qIDI0LCBDUFUgbGltaXQgZXhjZWVkZWQgKDQuMiBCU0QpLiAgKi8KKyAgICAiU0lHWEZTWiIsICAgLyogMjUsIEZpbGUgc2l6ZSBsaW1pdCBleGNlZWRlZCAoNC4yIEJTRCkuICAqLworICAgICJTSUdWVEFMUk0iLCAvKiAyNiwgVmlydHVhbCBhbGFybSBjbG9jayAoNC4yIEJTRCkuICAqLworICAgICJTSUdQUk9GIiwgICAvKiAyNywgUHJvZmlsaW5nIGFsYXJtIGNsb2NrICg0LjIgQlNEKS4gICovCisgICAgIlNJR1dJTkNIIiwgIC8qIDI4LCBXaW5kb3cgc2l6ZSBjaGFuZ2UgKDQuMyBCU0QsIFN1bikuICAqLworICAgICJTSUdJTyIsICAgICAvKiAyOSwgSS9PIG5vdyBwb3NzaWJsZSAoNC4yIEJTRCkuICAqLworICAgICJTSUdQV1IiLCAgICAvKiAzMCwgUG93ZXIgZmFpbHVyZSByZXN0YXJ0IChTeXN0ZW0gVikuICAqLworICAgICJTSUdTWVMiICAgICAvKiAzMSwgQmFkIHN5c3RlbSBjYWxsLiAgKi8KK307CisKK3ZvaWQgRW5naW5lOjppbml0KHZvaWQpCit7CisgICAgaWYgKCFtX3JlYWR5KSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihtX2xvY2spOworCisgICAgICAgIGlmICghbV9yZWFkeSkgeworICAgICAgICAgICAgLy8gc3RhcnQgcHJvY2VzcyBpZiBub3QgZG9uZSB5ZXQKKyAgICAgICAgICAgIGlmIChtX3Byb2Nlc3MgPT0gMCkgeworICAgICAgICAgICAgICAgIGluaXRfcHJvY2VzcygpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBsb2FkIHBlbmdpbmcgaW1hZ2VzCisgICAgICAgICAgICBsb2FkX2xpYnJhcmllcygpOworCisgICAgICAgICAgICAvLyBhbmQgKHJlKWJ1aWxkIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgIGluaXRfcHRyX2RhdGEoKTsKKworICAgICAgICAgICAgLy8gaXQgaXMgcmVhZHkgbm93CisgICAgICAgICAgICBtX3JlYWR5ID0gdHJ1ZTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHJvY2Vzcyh2b2lkKQoreworICAgIENPSUVOR0lORSBlbmdpbmU7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBjb25zdCBjaGFyICoqZW52aXJvbjsKKworICAgIC8vIGNyZWF0ZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzCisgICAgZW52aXJvbiA9IChjb25zdCBjaGFyKiopIG1pY19lbnZfdmFycy5jcmVhdGVfZW52aXJvbl9mb3JfY2FyZChtX2luZGV4KTsKKyAgICBpZiAoZW52aXJvbiAhPSAwKSB7CisgICAgICAgIGZvciAoY29uc3QgY2hhciAqKnAgPSBlbnZpcm9uOyAqcCAhPSAwOyBwKyspIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIkVudiBWYXIgZm9yIGNhcmQgJWQ6ICVzXG4iLCBtX2luZGV4LCAqcCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBDcmVhdGUgZXhlY3V0aW9uIGNvbnRleHQgaW4gdGhlIHNwZWNpZmllZCBkZXZpY2UKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJHZXR0aW5nIGRldmljZSAlZCAoZW5naW5lICVkKSBoYW5kbGVcbiIsIG1faW5kZXgsCisgICAgICAgICAgICAgICAgICAgICAgICBtX3BoeXNpY2FsX2luZGV4KTsKKyAgICByZXMgPSBDT0k6OkVuZ2luZUdldEhhbmRsZShDT0lfSVNBX0tOQywgbV9waHlzaWNhbF9pbmRleCwgJmVuZ2luZSk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19nZXRfZW5naW5lX2hhbmRsZSwgbV9pbmRleCwgcmVzKTsKKworICAgIC8vIFRhcmdldCBleGVjdXRhYmxlIHNob3VsZCBiZSBhdmFpbGFibGUgYnkgdGhlIHRpbWUgd2hlbiB3ZQorICAgIC8vIGF0dGVtcHQgdG8gaW5pdGlhbGl6ZSB0aGUgZGV2aWNlCisgICAgaWYgKF9fdGFyZ2V0X2V4ZSA9PSAwKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19ub190YXJnZXRfZXhlKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsCisgICAgICAgICJMb2FkaW5nIHRhcmdldCBleGVjdXRhYmxlIFwiJXNcIiBmcm9tICVwLCBzaXplICVsbGRcbiIsCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgX190YXJnZXRfZXhlLT5kYXRhLCBfX3RhcmdldF9leGUtPnNpemUpOworCisgICAgcmVzID0gQ09JOjpQcm9jZXNzQ3JlYXRlRnJvbU1lbW9yeSgKKyAgICAgICAgZW5naW5lLCAgICAgICAgICAgICAgICAgLy8gaW5fRW5naW5lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+bmFtZSwgICAgIC8vIGluX3BCaW5hcnlOYW1lCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+ZGF0YSwgICAgIC8vIGluX3BCaW5hcnlCdWZmZXIKKyAgICAgICAgX190YXJnZXRfZXhlLT5zaXplLCAgICAgLy8gaW5fQmluYXJ5QnVmZmVyTGVuZ3RoLAorICAgICAgICAwLCAgICAgICAgICAgICAgICAgICAgICAvLyBpbl9BcmdjCisgICAgICAgIDAsICAgICAgICAgICAgICAgICAgICAgIC8vIGluX3BwQXJndgorICAgICAgICBlbnZpcm9uID09IDAsICAgICAgICAgICAvLyBpbl9EdXBFbnYKKyAgICAgICAgZW52aXJvbiwgICAgICAgICAgICAgICAgLy8gaW5fcHBBZGRpdGlvbmFsRW52CisgICAgICAgIG1pY19wcm94eV9pbywgICAgICAgICAgIC8vIGluX1Byb3h5QWN0aXZlCisgICAgICAgIG1pY19wcm94eV9mc19yb290LCAgICAgIC8vIGluX1Byb3h5ZnNSb290CisgICAgICAgIG1pY19idWZmZXJfc2l6ZSwgICAgICAgIC8vIGluX0J1ZmZlclNwYWNlCisgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsICAgICAgIC8vIGluX0xpYnJhcnlTZWFyY2hQYXRoCisgICAgICAgIF9fdGFyZ2V0X2V4ZS0+b3JpZ2luLCAgIC8vIGluX0ZpbGVPZk9yaWdpbgorICAgICAgICBfX3RhcmdldF9leGUtPm9mZnNldCwgICAvLyBpbl9GaWxlT2ZPcmlnaW5PZmZzZXQKKyAgICAgICAgJm1fcHJvY2VzcyAgICAgICAgICAgICAgLy8gb3V0X3BQcm9jZXNzCisgICAgKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX3Byb2Nlc3NfY3JlYXRlLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gZ2V0IGZ1bmN0aW9uIGhhbmRsZXMKKyAgICByZXMgPSBDT0k6OlByb2Nlc3NHZXRGdW5jdGlvbkhhbmRsZXMobV9wcm9jZXNzLCBjX2Z1bmNzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNfbmFtZXMsIG1fZnVuY3MpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcHJvY2Vzc19nZXRfZnVuY19oYW5kbGVzLCBtX2luZGV4LCByZXMpOworCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IHBpZCA9IGluaXRfZGV2aWNlKCk7CisKKyAgICAvLyBGb3IgSURCCisgICAgaWYgKF9fZGJnX2lzX2F0dGFjaGVkKSB7CisgICAgICAgIC8vIFRPRE86IHdlIGhhdmUgaW4tbWVtb3J5IGV4ZWN1dGFibGUgbm93LgorICAgICAgICAvLyBDaGVjayB3aXRoIElEQiB0ZWFtIHdoYXQgc2hvdWxkIHdlIHByb3ZpZGUgdGhlbSBub3c/CisgICAgICAgIGlmIChzdHJsZW4oX190YXJnZXRfZXhlLT5uYW1lKSA8IE1BWF9UQVJHRVRfTkFNRSkgeworICAgICAgICAgICAgc3RyY3B5KF9fZGJnX3RhcmdldF9leGVfbmFtZSwgX190YXJnZXRfZXhlLT5uYW1lKTsKKyAgICAgICAgfQorICAgICAgICBfX2RiZ190YXJnZXRfc29fcGlkID0gcGlkOworICAgICAgICBfX2RiZ190YXJnZXRfaWQgPSBtX3BoeXNpY2FsX2luZGV4OworICAgICAgICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisgICAgfQorfQorCit2b2lkIEVuZ2luZTo6ZmluaV9wcm9jZXNzKGJvb2wgdmVyYm9zZSkKK3sKKyAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgdWludDMyX3Qgc2lnOworICAgICAgICBpbnQ4X3QgcmV0OworCisgICAgICAgIC8vIGRlc3Ryb3kgdGFyZ2V0IHByb2Nlc3MKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRGVzdHJveWluZyBwcm9jZXNzIG9uIHRoZSBkZXZpY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbmRleCk7CisKKyAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6UHJvY2Vzc0Rlc3Ryb3kobV9wcm9jZXNzLCAtMSwgMCwgJnJldCwgJnNpZyk7CisgICAgICAgIG1fcHJvY2VzcyA9IDA7CisKKyAgICAgICAgaWYgKHJlcyA9PSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiRGV2aWNlIHByb2Nlc3M6IHNpZ25hbCAlZCwgZXhpdCBjb2RlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaWcsIHJldCk7CisgICAgICAgICAgICBpZiAodmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChzaWcgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKAorICAgICAgICAgICAgICAgICAgICAgICAgY19taWNfcHJvY2Vzc19leGl0X3NpZywgbV9pbmRleCwgc2lnLAorICAgICAgICAgICAgICAgICAgICAgICAgY19zaWduYWxfbmFtZXNbc2lnID49IGNfc2lnbmFsX21heCA/IDAgOiBzaWddKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcHJvY2Vzc19leGl0X3JldCwgbV9pbmRleCwgcmV0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIGZvciBpZGIKKyAgICAgICAgICAgIGlmIChfX2RiZ19pc19hdHRhY2hlZCkgeworICAgICAgICAgICAgICAgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKHZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3Byb2Nlc3NfZXhpdCwgbV9pbmRleCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3ZvaWQgRW5naW5lOjpsb2FkX2xpYnJhcmllcygpCit7CisgICAgLy8gbG9hZCBsaWJyYXJpZXMgY29sbGVjdGVkIHNvIGZhcgorICAgIGZvciAoVGFyZ2V0SW1hZ2VMaXN0OjppdGVyYXRvciBpdCA9IG1faW1hZ2VzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBtX2ltYWdlcy5lbmQoKTsgaXQrKykgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJMb2FkaW5nIGxpYnJhcnkgXCIlc1wiIGZyb20gJXAsIHNpemUgJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwgaXQtPmRhdGEsIGl0LT5zaXplKTsKKworICAgICAgICAvLyBsb2FkIGxpYnJhcnkgdG8gdGhlIGRldmljZQorICAgICAgICBDT0lMSUJSQVJZIGxpYjsKKyAgICAgICAgQ09JUkVTVUxUIHJlczsKKyAgICAgICAgcmVzID0gQ09JOjpQcm9jZXNzTG9hZExpYnJhcnlGcm9tTWVtb3J5KG1fcHJvY2VzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT5kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+bmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pY19saWJyYXJ5X3BhdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdC0+b3JpZ2luLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQtPm9mZnNldCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9MT0FETElCUkFSWV9WMV9GTEFHUywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZsaWIpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MgJiYgcmVzICE9IENPSV9BTFJFQURZX0VYSVNUUykgeworICAgICAgICAgICAgY2hlY2tfcmVzdWx0KHJlcywgY19sb2FkX2xpYnJhcnksIG1faW5kZXgsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisgICAgbV9pbWFnZXMuY2xlYXIoKTsKK30KKworc3RhdGljIGJvb2wgdGFyZ2V0X2VudHJ5X2NtcCgKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmbCwKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAmcgorKQoreworICAgIGNvbnN0IGNoYXIgKmxfbmFtZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KGwubmFtZSk7CisgICAgY29uc3QgY2hhciAqcl9uYW1lID0gcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oci5uYW1lKTsKKyAgICByZXR1cm4gc3RyY21wKGxfbmFtZSwgcl9uYW1lKSA8IDA7Cit9CisKK3N0YXRpYyBib29sIGhvc3RfZW50cnlfY21wKAorICAgIGNvbnN0IFZhclRhYmxlOjpFbnRyeSAqbCwKKyAgICBjb25zdCBWYXJUYWJsZTo6RW50cnkgKnIKKykKK3sKKyAgICByZXR1cm4gc3RyY21wKGwtPm5hbWUsIHItPm5hbWUpIDwgMDsKK30KKwordm9pZCBFbmdpbmU6OmluaXRfcHRyX2RhdGEodm9pZCkKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworICAgIENPSUVWRU5UIGV2ZW50OworCisgICAgLy8gUHJlcGFyZSB0YWJsZSBvZiBob3N0IGVudHJpZXMKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPiBob3N0X3RhYmxlKF9fb2ZmbG9hZF92YXJzLmJlZ2luKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX29mZmxvYWRfdmFycy5lbmQoKSk7CisKKyAgICAvLyBubyBuZWVkIHRvIGRvIGFueXRoaW5nIGZ1cnRoZXIgaXMgaG9zdCB0YWJsZSBpcyBlbXB0eQorICAgIGlmIChob3N0X3RhYmxlLnNpemUoKSA8PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBHZXQgdmFyIHRhYmxlIGVudHJpZXMgZnJvbSB0aGUgdGFyZ2V0LgorICAgIC8vIEZpcnN0IHdlIG5lZWQgdG8gZ2V0IHNpemUgZm9yIHRoZSBidWZmZXIgdG8gY29weSBkYXRhCisgICAgc3RydWN0IHsKKyAgICAgICAgaW50NjRfdCBuZWxlbXM7CisgICAgICAgIGludDY0X3QgbGVuZ3RoOworICAgIH0gcGFyYW1zOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY192YXJfdGFibGVfc2l6ZV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwYXJhbXMsIHNpemVvZihwYXJhbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICBpZiAocGFyYW1zLmxlbmd0aCA9PSAwKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjcmVhdGUgYnVmZmVyIGZvciB0YXJnZXQgZW50cmllcyBhbmQgY29weSBkYXRhIHRvIGhvc3QKKyAgICBDT0lCVUZGRVIgYnVmZmVyOworICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKHBhcmFtcy5sZW5ndGgsIENPSV9CVUZGRVJfTk9STUFMLCAwLCAwLCAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX3Byb2Nlc3MsICZidWZmZXIpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfYnVmX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgIENPSV9BQ0NFU1NfRkxBR1MgZmxhZ3MgPSBDT0lfU0lOS19XUklURTsKKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX3Zhcl90YWJsZV9jb3B5XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwgJmJ1ZmZlciwgJmZsYWdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcGFyYW1zLm5lbGVtcywgc2l6ZW9mKHBhcmFtcy5uZWxlbXMpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZXZlbnQpOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkV2ZW50V2FpdCgxLCAmZXZlbnQsIC0xLCAxLCAwLCAwKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2V2ZW50X3dhaXQsIHJlcyk7CisKKyAgICAvLyBwYXRjaCBuYW1lcyBpbiB0YXJnZXQgZGF0YQorICAgIFZhckxpc3Q6OkJ1ZkVudHJ5ICp0YXJnZXRfdGFibGU7CisgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgcmVzID0gQ09JOjpCdWZmZXJNYXAoYnVmZmVyLCAwLCBwYXJhbXMubGVuZ3RoLCBDT0lfTUFQX1JFQURfT05MWSwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAwLCAmbWFwX2luc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZ0YXJnZXRfdGFibGUpKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9tYXAsIHJlcyk7CisKKyAgICBWYXJMaXN0Ojp0YWJsZV9wYXRjaF9uYW1lcyh0YXJnZXRfdGFibGUsIHBhcmFtcy5uZWxlbXMpOworCisgICAgLy8gYW5kIHNvcnQgZW50cmllcworICAgIHN0ZDo6c29ydCh0YXJnZXRfdGFibGUsIHRhcmdldF90YWJsZSArIHBhcmFtcy5uZWxlbXMsIHRhcmdldF9lbnRyeV9jbXApOworICAgIHN0ZDo6c29ydChob3N0X3RhYmxlLmJlZ2luKCksIGhvc3RfdGFibGUuZW5kKCksIGhvc3RfZW50cnlfY21wKTsKKworICAgIC8vIG1lcmdlIGhvc3QgYW5kIHRhcmdldCBlbnRyaWVzIGFuZCBlbnRlciBtYXRjaGluZyB2YXJzIG1hcAorICAgIHN0ZDo6dmVjdG9yPGNvbnN0IFZhclRhYmxlOjpFbnRyeSo+Ojpjb25zdF9pdGVyYXRvciBoaSA9CisgICAgICAgIGhvc3RfdGFibGUuYmVnaW4oKTsKKyAgICBzdGQ6OnZlY3Rvcjxjb25zdCBWYXJUYWJsZTo6RW50cnkqPjo6Y29uc3RfaXRlcmF0b3IgaGUgPQorICAgICAgICBob3N0X3RhYmxlLmVuZCgpOworICAgIGNvbnN0IFZhckxpc3Q6OkJ1ZkVudHJ5ICp0aSA9IHRhcmdldF90YWJsZTsKKyAgICBjb25zdCBWYXJMaXN0OjpCdWZFbnRyeSAqdGUgPSB0YXJnZXRfdGFibGUgKyBwYXJhbXMubmVsZW1zOworCisgICAgd2hpbGUgKGhpICE9IGhlICYmIHRpICE9IHRlKSB7CisgICAgICAgIGludCByZXMgPSBzdHJjbXAoKCpoaSktPm5hbWUsIHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KHRpLT5uYW1lKSk7CisgICAgICAgIGlmIChyZXMgPT0gMCkgeworICAgICAgICAgICAgLy8gYWRkIG1hdGNoaW5nIGVudHJ5IHRvIHZhciBtYXAKKyAgICAgICAgICAgIHN0ZDo6cGFpcjxQdHJTZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgICAgIG1fcHRyX3NldC5pbnNlcnQoUHRyRGF0YSgoKmhpKS0+YWRkciwgKCpoaSktPnNpemUpKTsKKworICAgICAgICAgICAgLy8gc3RvcmUgYWRkcmVzcyBmb3IgbmV3IGVudHJpZXMKKyAgICAgICAgICAgIGlmIChyZXMuc2Vjb25kKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyID0gY29uc3RfY2FzdDxQdHJEYXRhKj4ocmVzLmZpcnN0Lm9wZXJhdG9yLT4oKSk7CisgICAgICAgICAgICAgICAgcHRyLT5taWNfYWRkciA9IHRpLT5hZGRyOworICAgICAgICAgICAgICAgIHB0ci0+aXNfc3RhdGljID0gdHJ1ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAocmVzIDwgMCkgeworICAgICAgICAgICAgaGkrKzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRpKys7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBjbGVhbnVwCisgICAgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19idWZfdW5tYXAsIHJlcyk7CisKKyAgICByZXMgPSBDT0k6OkJ1ZmZlckRlc3Ryb3koYnVmZmVyKTsKKyAgICBjaGVja19yZXN1bHQocmVzLCBjX2J1Zl9kZXN0cm95LCByZXMpOworfQorCitDT0lSRVNVTFQgRW5naW5lOjpjb21wdXRlKAorICAgIGNvbnN0IHN0ZDo6bGlzdDxDT0lCVUZGRVI+ICZidWZmZXJzLAorICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIGRhdGFfc2l6ZSwKKyAgICB2b2lkKiAgICAgICAgICAgICAgIHJldCwKKyAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgIHVpbnQzMl90ICAgICAgICAgICAgbnVtX2RlcHMsCisgICAgY29uc3QgQ09JRVZFTlQqICAgICBkZXBzLAorICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKykgLyogY29uc3QgKi8KK3sKKyAgICBDT0lCVUZGRVIgKmJ1ZnM7CisgICAgQ09JX0FDQ0VTU19GTEFHUyAqZmxhZ3M7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNvbnZlcnQgYnVmZmVycyBsaXN0IHRvIGFycmF5CisgICAgaW50IG51bV9idWZzID0gYnVmZmVycy5zaXplKCk7CisgICAgaWYgKG51bV9idWZzID4gMCkgeworICAgICAgICBidWZzID0gKENPSUJVRkZFUiopIGFsbG9jYShudW1fYnVmcyAqIHNpemVvZihDT0lCVUZGRVIpKTsKKyAgICAgICAgZmxhZ3MgPSAoQ09JX0FDQ0VTU19GTEFHUyopIGFsbG9jYShudW1fYnVmcyAqCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKENPSV9BQ0NFU1NfRkxBR1MpKTsKKworICAgICAgICBpbnQgaSA9IDA7CisgICAgICAgIGZvciAoc3RkOjpsaXN0PENPSUJVRkZFUj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gYnVmZmVycy5iZWdpbigpOworICAgICAgICAgICAgIGl0ICE9IGJ1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIGJ1ZnNbaV0gPSAqaXQ7CisKKyAgICAgICAgICAgIC8vIFRPRE86IHRoaXMgc2hvdWxkIGJlIGZpeGVkCisgICAgICAgICAgICBmbGFnc1tpKytdID0gQ09JX1NJTktfV1JJVEU7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGJ1ZnMgPSAwOworICAgICAgICBmbGFncyA9IDA7CisgICAgfQorCisgICAgLy8gc3RhcnQgY29tcHV0YXRpb24KKyAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX2NvbXB1dGVdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudW1fYnVmcywgYnVmcywgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9kZXBzLCBkZXBzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkYXRhLCBkYXRhX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICByZXR1cm4gcmVzOworfQorCitwaWRfdCBFbmdpbmU6OmluaXRfZGV2aWNlKHZvaWQpCit7CisgICAgc3RydWN0IGluaXRfZGF0YSB7CisgICAgICAgIGludCAgZGV2aWNlX2luZGV4OworICAgICAgICBpbnQgIGRldmljZXNfdG90YWw7CisgICAgICAgIGludCAgY29uc29sZV9sZXZlbDsKKyAgICAgICAgaW50ICBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICB9IGRhdGE7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBDT0lFVkVOVCBldmVudDsKKyAgICBwaWRfdCBwaWQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgMCwgY19vZmZsb2FkX2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJJbml0aWFsaXppbmcgZGV2aWNlIHdpdGggbG9naWNhbCBpbmRleCAlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhbmQgcGh5c2ljYWwgaW5kZXggJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luZGV4LCBtX3BoeXNpY2FsX2luZGV4KTsKKworICAgIC8vIHNldHVwIG1pc2MgZGF0YQorICAgIGRhdGEuZGV2aWNlX2luZGV4ID0gbV9pbmRleDsKKyAgICBkYXRhLmRldmljZXNfdG90YWwgPSBtaWNfZW5naW5lc190b3RhbDsKKyAgICBkYXRhLmNvbnNvbGVfbGV2ZWwgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgZGF0YS5vZmZsb2FkX3JlcG9ydF9sZXZlbCA9IG9mZmxvYWRfcmVwb3J0X2xldmVsOworCisgICAgcmVzID0gQ09JOjpQaXBlbGluZVJ1bkZ1bmN0aW9uKGdldF9waXBlbGluZSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19pbml0XSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmRhdGEsIHNpemVvZihkYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnBpZCwgc2l6ZW9mKHBpZCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZldmVudCk7CisgICAgY2hlY2tfcmVzdWx0KHJlcywgY19waXBlbGluZV9ydW5fZnVuYywgbV9pbmRleCwgcmVzKTsKKworICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KDEsICZldmVudCwgLTEsIDEsIDAsIDApOworICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfZXZlbnRfd2FpdCwgcmVzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkRldmljZSBwcm9jZXNzIHBpZCBpcyAlZFxuIiwgcGlkKTsKKworICAgIHJldHVybiBwaWQ7Cit9CisKKy8vIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdGhyZWFkCitzdHJ1Y3QgVGhyZWFkIHsKKyAgICBUaHJlYWQobG9uZyogYWRkcl9jb2lwaXBlX2NvdW50ZXIpIHsKKyAgICAgICAgbV9hZGRyX2NvaXBpcGVfY291bnRlciA9IGFkZHJfY29pcGlwZV9jb3VudGVyOworICAgICAgICBtZW1zZXQobV9waXBlbGluZXMsIDAsIHNpemVvZihtX3BpcGVsaW5lcykpOworICAgIH0KKworICAgIH5UaHJlYWQoKSB7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBfX3N5bmNfc3ViX2FuZF9mZXRjaChtX2FkZHJfY29pcGlwZV9jb3VudGVyLCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBfSW50ZXJsb2NrZWREZWNyZW1lbnQobV9hZGRyX2NvaXBpcGVfY291bnRlcik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICAgICAgaWYgKG1fcGlwZWxpbmVzW2ldICE9IDApIHsKKyAgICAgICAgICAgICAgICBDT0k6OlBpcGVsaW5lRGVzdHJveShtX3BpcGVsaW5lc1tpXSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBnZXRfcGlwZWxpbmUoaW50IGluZGV4KSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3BpcGVsaW5lc1tpbmRleF07CisgICAgfQorCisgICAgdm9pZCBzZXRfcGlwZWxpbmUoaW50IGluZGV4LCBDT0lQSVBFTElORSBwaXBlbGluZSkgeworICAgICAgICBtX3BpcGVsaW5lc1tpbmRleF0gPSBwaXBlbGluZTsKKyAgICB9CisKKyAgICBBdXRvU2V0JiBnZXRfYXV0b192YXJzKCkgeworICAgICAgICByZXR1cm4gbV9hdXRvX3ZhcnM7CisgICAgfQorCitwcml2YXRlOgorICAgIGxvbmcqICAgICAgIG1fYWRkcl9jb2lwaXBlX2NvdW50ZXI7CisgICAgQXV0b1NldCAgICAgbV9hdXRvX3ZhcnM7CisgICAgQ09JUElQRUxJTkUgbV9waXBlbGluZXNbTUlDX0VOR0lORVNfTUFYXTsKK307CisKK0NPSVBJUEVMSU5FIEVuZ2luZTo6Z2V0X3BpcGVsaW5lKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICBDT0lQSVBFTElORSBwaXBlbGluZSA9IHRocmVhZC0+Z2V0X3BpcGVsaW5lKG1faW5kZXgpOworICAgIGlmIChwaXBlbGluZSA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGludCBwcm9jX251bTsKKworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfX3N5bmNfZmV0Y2hfYW5kX2FkZCgmbV9wcm9jX251bWJlciwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcHJvY19udW0gPSBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJm1fcHJvY19udW1iZXIpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGlmIChwcm9jX251bSA+IENPSV9QSVBFTElORV9NQVhfUElQRUxJTkVTKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfY29pcGlwZV9tYXhfbnVtYmVyLCBDT0lfUElQRUxJTkVfTUFYX1BJUEVMSU5FUyk7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIC8vIGNyZWF0ZSBwaXBlbGluZSBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgcmVzID0gQ09JOjpQaXBlbGluZUNyZWF0ZShtX3Byb2Nlc3MsIDAsIG1pY19zdGFja19zaXplLCAmcGlwZWxpbmUpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX2NyZWF0ZSwgbV9pbmRleCwgcmVzKTsKKworICAgICAgICB0aHJlYWQtPnNldF9waXBlbGluZShtX2luZGV4LCBwaXBlbGluZSk7CisgICAgfQorICAgIHJldHVybiBwaXBlbGluZTsKK30KKworQXV0b1NldCYgRW5naW5lOjpnZXRfYXV0b192YXJzKHZvaWQpCit7CisgICAgVGhyZWFkKiB0aHJlYWQgPSAoVGhyZWFkKikgdGhyZWFkX2dldHNwZWNpZmljKG1pY190aHJlYWRfa2V5KTsKKyAgICBpZiAodGhyZWFkID09IDApIHsKKyAgICAgICAgdGhyZWFkID0gbmV3IFRocmVhZCgmbV9wcm9jX251bWJlcik7CisgICAgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhtaWNfdGhyZWFkX2tleSwgdGhyZWFkKTsKKyAgICB9CisKKyAgICByZXR1cm4gdGhyZWFkLT5nZXRfYXV0b192YXJzKCk7Cit9CisKK3ZvaWQgRW5naW5lOjpkZXN0cm95X3RocmVhZF9kYXRhKHZvaWQgKmRhdGEpCit7CisgICAgZGVsZXRlIHN0YXRpY19jYXN0PFRocmVhZCo+KGRhdGEpOworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmggYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbmdpbmUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWE5NjMxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW5naW5lLmgKQEAgLTAsMCArMSw0ODIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5HSU5FX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpbWl0cy5oPgorCisjaW5jbHVkZSA8bGlzdD4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAiY29pL2NvaV9jbGllbnQuaCIKKworLy8gQWRkcmVzcyByYW5nZQorY2xhc3MgTWVtUmFuZ2UgeworcHVibGljOgorICAgIE1lbVJhbmdlKCkgOiBtX3N0YXJ0KDApLCBtX2xlbmd0aCgwKSB7fQorICAgIE1lbVJhbmdlKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOiBtX3N0YXJ0KGFkZHIpLCBtX2xlbmd0aChsZW4pIHt9CisKKyAgICBjb25zdCB2b2lkKiBzdGFydCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fc3RhcnQ7CisgICAgfQorCisgICAgY29uc3Qgdm9pZCogZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gc3RhdGljX2Nhc3Q8Y29uc3QgY2hhcio+KG1fc3RhcnQpICsgbV9sZW5ndGg7CisgICAgfQorCisgICAgdWludDY0X3QgbGVuZ3RoKCkgY29uc3QgeworICAgICAgICByZXR1cm4gbV9sZW5ndGg7CisgICAgfQorCisgICAgLy8gcmV0dXJucyB0cnVlIGlmIGdpdmVuIHJhbmdlIG92ZXJsYXBzIHdpdGggYW5vdGhlciBvbmUKKyAgICBib29sIG92ZXJsYXBzKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIC8vIFR3byBhZGRyZXNzIHJhbmdlcyBBW3N0YXJ0LCBlbmQpIGFuZCBCW3N0YXJ0LGVuZCkgb3ZlcmxhcAorICAgICAgICAvLyBpZiBBLnN0YXJ0IDwgQi5lbmQgYW5kIEEuZW5kID4gQi5zdGFydC4KKyAgICAgICAgcmV0dXJuIHN0YXJ0KCkgPCBvLmVuZCgpICYmIGVuZCgpID4gby5zdGFydCgpOworICAgIH0KKworICAgIC8vIHJldHVybnMgdHJ1ZSBpZiBnaXZlbiByYW5nZSBjb250YWlucyB0aGUgb3RoZXIgcmFuZ2UKKyAgICBib29sIGNvbnRhaW5zKGNvbnN0IE1lbVJhbmdlICZvKSBjb25zdCB7CisgICAgICAgIHJldHVybiBzdGFydCgpIDw9IG8uc3RhcnQoKSAmJiBvLmVuZCgpIDw9IGVuZCgpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBjb25zdCB2b2lkKiBtX3N0YXJ0OworICAgIHVpbnQ2NF90ICAgIG1fbGVuZ3RoOworfTsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggYSBwb2ludGVyIHZhcmlhYmxlCitjbGFzcyBQdHJEYXRhIHsKK3B1YmxpYzoKKyAgICBQdHJEYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCBjcHVfYnVmKDApLAorICAgICAgICBtaWNfYWRkcigwKSwgYWxsb2NfZGlzcCgwKSwgbWljX2J1ZigwKSwgbWljX29mZnNldCgwKSwKKyAgICAgICAgcmVmX2NvdW50KDApLCBpc19zdGF0aWMoZmFsc2UpCisgICAge30KKworICAgIC8vCisgICAgLy8gQ29weSBjb25zdHJ1Y3RvcgorICAgIC8vCisgICAgUHRyRGF0YShjb25zdCBQdHJEYXRhJiBwdHIpOgorICAgICAgICBjcHVfYWRkcihwdHIuY3B1X2FkZHIpLCBjcHVfYnVmKHB0ci5jcHVfYnVmKSwKKyAgICAgICAgbWljX2FkZHIocHRyLm1pY19hZGRyKSwgYWxsb2NfZGlzcChwdHIuYWxsb2NfZGlzcCksCisgICAgICAgIG1pY19idWYocHRyLm1pY19idWYpLCBtaWNfb2Zmc2V0KHB0ci5taWNfb2Zmc2V0KSwKKyAgICAgICAgcmVmX2NvdW50KHB0ci5yZWZfY291bnQpLCBpc19zdGF0aWMocHRyLmlzX3N0YXRpYykKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgUHRyRGF0YSAmbykgY29uc3QgeworICAgICAgICAvLyBWYXJpYWJsZXMgYXJlIHNvcnRlZCBieSB0aGUgQ1BVIHN0YXJ0IGFkZHJlc3MuCisgICAgICAgIC8vIE92ZXJsYXBwaW5nIG1lbW9yeSByYW5nZXMgYXJlIGNvbnNpZGVyZWQgZXF1YWwuCisgICAgICAgIHJldHVybiAoY3B1X2FkZHIuc3RhcnQoKSA8IG8uY3B1X2FkZHIuc3RhcnQoKSkgJiYKKyAgICAgICAgICAgICAgICFjcHVfYWRkci5vdmVybGFwcyhvLmNwdV9hZGRyKTsKKyAgICB9CisKKyAgICBsb25nIGFkZF9yZWZlcmVuY2UoKSB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyAgICAgICAgaWYgKGlzX3N0YXRpYykgeworICAgICAgICAgICAgcmV0dXJuIExPTkdfTUFYOworICAgICAgICB9CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnJlZl9jb3VudCwgMSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9JbnRlcmxvY2tlZERlY3JlbWVudCgmcmVmX2NvdW50KTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB9CisKKyAgICBsb25nIGdldF9yZWZlcmVuY2UoKSBjb25zdCB7CisgICAgICAgIGlmIChpc19zdGF0aWMpIHsKKyAgICAgICAgICAgIHJldHVybiBMT05HX01BWDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmVmX2NvdW50OworICAgIH0KKworcHVibGljOgorICAgIC8vIENQVSBhZGRyZXNzIHJhbmdlCisgICAgY29uc3QgTWVtUmFuZ2UgIGNwdV9hZGRyOworCisgICAgLy8gQ1BVIGFuZCBNSUMgYnVmZmVycworICAgIENPSUJVRkZFUiAgICAgICBjcHVfYnVmOworICAgIENPSUJVRkZFUiAgICAgICBtaWNfYnVmOworCisgICAgLy8gcGxhY2Vob2xkZXIgZm9yIGJ1ZmZlciBhZGRyZXNzIG9uIG1pYworICAgIHVpbnQ2NF90ICAgICAgICBtaWNfYWRkcjsKKworICAgIHVpbnQ2NF90ICAgICAgICBhbGxvY19kaXNwOworCisgICAgLy8gYWRkaXRpb25hbCBvZmZzZXQgdG8gcG9pbnRlciBkYXRhIG9uIE1JQyBmb3IgaW1wcm92aW5nIGJhbmR3aWR0aCBmb3IKKyAgICAvLyBkYXRhIHdoaWNoIGlzIG5vdCA0SyBhbGlnbmVkCisgICAgdWludDMyX3QgICAgICAgIG1pY19vZmZzZXQ7CisKKyAgICAvLyBpZiB0cnVlIGJ1ZmZlcnMgYXJlIGNyZWF0ZWQgZnJvbSBzdGF0aWMgbWVtb3J5CisgICAgYm9vbCAgICAgICAgICAgIGlzX3N0YXRpYzsKKyAgICBtdXRleF90ICAgICAgICAgYWxsb2NfcHRyX2RhdGFfbG9jazsKKworcHJpdmF0ZToKKyAgICAvLyByZWZlcmVuY2UgY291bnQgZm9yIHRoZSBlbnRyeQorICAgIGxvbmcgICAgICAgICAgICByZWZfY291bnQ7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQdHJEYXRhKj4gUHRyRGF0YUxpc3Q7CisKKy8vIERhdGEgYXNzb2NpYXRlZCB3aXRoIGF1dG9tYXRpYyB2YXJpYWJsZQorY2xhc3MgQXV0b0RhdGEgeworcHVibGljOgorICAgIEF1dG9EYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IGxlbikgOgorICAgICAgICBjcHVfYWRkcihhZGRyLCBsZW4pLCByZWZfY291bnQoMCkKKyAgICB7fQorCisgICAgYm9vbCBvcGVyYXRvcjwoY29uc3QgQXV0b0RhdGEgJm8pIGNvbnN0IHsKKyAgICAgICAgLy8gVmFyaWFibGVzIGFyZSBzb3J0ZWQgYnkgdGhlIENQVSBzdGFydCBhZGRyZXNzLgorICAgICAgICAvLyBPdmVybGFwcGluZyBtZW1vcnkgcmFuZ2VzIGFyZSBjb25zaWRlcmVkIGVxdWFsLgorICAgICAgICByZXR1cm4gKGNwdV9hZGRyLnN0YXJ0KCkgPCBvLmNwdV9hZGRyLnN0YXJ0KCkpICYmCisgICAgICAgICAgICAgICAhY3B1X2FkZHIub3ZlcmxhcHMoby5jcHVfYWRkcik7CisgICAgfQorCisgICAgbG9uZyBhZGRfcmVmZXJlbmNlKCkgeworI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgcmV0dXJuIF9fc3luY19mZXRjaF9hbmRfYWRkKCZyZWZfY291bnQsIDEpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfSW50ZXJsb2NrZWRJbmNyZW1lbnQoJnJlZl9jb3VudCkgLSAxOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgcmVtb3ZlX3JlZmVyZW5jZSgpIHsKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIHJldHVybiBfX3N5bmNfc3ViX2FuZF9mZXRjaCgmcmVmX2NvdW50LCAxKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICByZXR1cm4gX0ludGVybG9ja2VkRGVjcmVtZW50KCZyZWZfY291bnQpOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworICAgIGxvbmcgZ2V0X3JlZmVyZW5jZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIHJlZl9jb3VudDsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBDUFUgYWRkcmVzcyByYW5nZQorICAgIGNvbnN0IE1lbVJhbmdlIGNwdV9hZGRyOworCitwcml2YXRlOgorICAgIC8vIHJlZmVyZW5jZSBjb3VudCBmb3IgdGhlIGVudHJ5CisgICAgbG9uZyByZWZfY291bnQ7Cit9OworCisvLyBTZXQgb2YgYXV0aW1hdGljIHZhcmlhYmxlcwordHlwZWRlZiBzdGQ6OnNldDxBdXRvRGF0YT4gQXV0b1NldDsKKworLy8gVGFyZ2V0IGltYWdlIGRhdGEKK3N0cnVjdCBUYXJnZXRJbWFnZQoreworICAgIFRhcmdldEltYWdlKGNvbnN0IGNoYXIgKl9uYW1lLCBjb25zdCB2b2lkICpfZGF0YSwgdWludDY0X3QgX3NpemUsCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqX29yaWdpbiwgdWludDY0X3QgX29mZnNldCkgOgorICAgICAgICBuYW1lKF9uYW1lKSwgZGF0YShfZGF0YSksIHNpemUoX3NpemUpLAorICAgICAgICBvcmlnaW4oX29yaWdpbiksIG9mZnNldChfb2Zmc2V0KQorICAgIHt9CisKKyAgICAvLyBsaWJyYXJ5IG5hbWUKKyAgICBjb25zdCBjaGFyKiBuYW1lOworCisgICAgLy8gY29udGVudHMgYW5kIHNpemUKKyAgICBjb25zdCB2b2lkKiBkYXRhOworICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyAgICAvLyBmaWxlIG9mIG9yaWdpbiBhbmQgb2Zmc2V0IHdpdGhpbiB0aGF0IGZpbGUKKyAgICBjb25zdCBjaGFyKiBvcmlnaW47CisgICAgdWludDY0X3QgICAgb2Zmc2V0OworfTsKKwordHlwZWRlZiBzdGQ6Omxpc3Q8VGFyZ2V0SW1hZ2U+IFRhcmdldEltYWdlTGlzdDsKKworLy8gRGF0YSBhc3NvY2lhdGVkIHdpdGggcGVyc2lzdGVudCBhdXRvIG9iamVjdHMKK3N0cnVjdCBQZXJzaXN0RGF0YQoreworICAgIFBlcnNpc3REYXRhKGNvbnN0IHZvaWQgKmFkZHIsIHVpbnQ2NF90IHJvdXRpbmVfbnVtLCB1aW50NjRfdCBzaXplKSA6CisgICAgICAgIHN0YWNrX2NwdV9hZGRyKGFkZHIpLCByb3V0aW5lX2lkKHJvdXRpbmVfbnVtKQorICAgIHsKKyAgICAgICAgc3RhY2tfcHRyX2RhdGEgPSBuZXcgUHRyRGF0YSgwLCBzaXplKTsKKyAgICB9CisgICAgLy8gMS1zdCBrZXkgdmFsdWUgLSBiZWdpbm5pbmcgb2YgdGhlIHN0YWNrIGF0IENQVQorICAgIGNvbnN0IHZvaWQgKiAgIHN0YWNrX2NwdV9hZGRyOworICAgIC8vIDItbmQga2V5IHZhbHVlIC0gaWRlbnRpZmllciBvZiByb3V0aW5lIGludm9jYXRpb24gYXQgQ1BVCisgICAgdWludDY0X3QgICByb3V0aW5lX2lkOworICAgIC8vIGNvcnJlc3BvbmRlZCBQdHJEYXRhOyBvbmx5IHN0YWNrX3B0cl9kYXRhLT5taWNfYnVmIGlzIHVzZWQKKyAgICBQdHJEYXRhICogc3RhY2tfcHRyX2RhdGE7CisgICAgLy8gdXNlZCB0byBnZXQgb2Zmc2V0IG9mIHRoZSB2YXJpYWJsZSBpbiBzdGFjayBidWZmZXIKKyAgICBjaGFyICogY3B1X3N0YWNrX2FkZHI7Cit9OworCit0eXBlZGVmIHN0ZDo6bGlzdDxQZXJzaXN0RGF0YT4gUGVyc2lzdERhdGFMaXN0OworCisvLyBjbGFzcyByZXByZXNlbnRpbmcgYSBzaW5nbGUgZW5naW5lCitzdHJ1Y3QgRW5naW5lIHsKKyAgICBmcmllbmQgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CisgICAgZnJpZW5kIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKTsKKworI2RlZmluZSBjaGVja19yZXN1bHQocmVzLCB0YWcsIC4uLikgXAorICAgIHsgXAorICAgICAgICBpZiAocmVzID09IENPSV9QUk9DRVNTX0RJRUQpIHsgXAorICAgICAgICAgICAgZmluaV9wcm9jZXNzKHRydWUpOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7IFwKKyAgICAgICAgICAgIF9fbGlib2ZmbG9hZF9lcnJvcl9zdXBwb3J0KHRhZywgX19WQV9BUkdTX18pOyBcCisgICAgICAgICAgICBleGl0KDEpOyBcCisgICAgICAgIH0gXAorICAgIH0KKworICAgIGludCBnZXRfbG9naWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faW5kZXg7CisgICAgfQorCisgICAgaW50IGdldF9waHlzaWNhbF9pbmRleCgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fcGh5c2ljYWxfaW5kZXg7CisgICAgfQorCisgICAgY29uc3QgQ09JUFJPQ0VTUyYgZ2V0X3Byb2Nlc3MoKSBjb25zdCB7CisgICAgICAgIHJldHVybiBtX3Byb2Nlc3M7CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBkZXZpY2UKKyAgICB2b2lkIGluaXQodm9pZCk7CisKKyAgICAvLyBhZGQgbmV3IGxpYnJhcnkKKyAgICB2b2lkIGFkZF9saWIoY29uc3QgVGFyZ2V0SW1hZ2UgJmxpYikKKyAgICB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisgICAgICAgIG1fcmVhZHkgPSBmYWxzZTsKKyAgICAgICAgbV9pbWFnZXMucHVzaF9iYWNrKGxpYik7CisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBDT0lSRVNVTFQgY29tcHV0ZSgKKyAgICAgICAgY29uc3Qgc3RkOjpsaXN0PENPSUJVRkZFUj4gJmJ1ZmZlcnMsCisgICAgICAgIGNvbnN0IHZvaWQqICAgICAgICAgZGF0YSwKKyAgICAgICAgdWludDE2X3QgICAgICAgICAgICBkYXRhX3NpemUsCisgICAgICAgIHZvaWQqICAgICAgICAgICAgICAgcmV0LAorICAgICAgICB1aW50MTZfdCAgICAgICAgICAgIHJldF9zaXplLAorICAgICAgICB1aW50MzJfdCAgICAgICAgICAgIG51bV9kZXBzLAorICAgICAgICBjb25zdCBDT0lFVkVOVCogICAgIGRlcHMsCisgICAgICAgIENPSUVWRU5UKiAgICAgICAgICAgZXZlbnQKKyAgICApOworCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKKyAgICB2b2lkIGluaXRfbXlvKENPSUVWRU5UICpldmVudCkgeworICAgICAgICBDT0lSRVNVTFQgcmVzOworICAgICAgICByZXMgPSBDT0k6OlBpcGVsaW5lUnVuRnVuY3Rpb24oZ2V0X3BpcGVsaW5lKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2Z1bmNzW2NfZnVuY19teW9faW5pdF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICBjaGVja19yZXN1bHQocmVzLCBjX3BpcGVsaW5lX3J1bl9mdW5jLCBtX2luZGV4LCByZXMpOworICAgIH0KKworICAgIHZvaWQgZmluaV9teW8oQ09JRVZFTlQgKmV2ZW50KSB7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6UGlwZWxpbmVSdW5GdW5jdGlvbihnZXRfcGlwZWxpbmUoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fZnVuY3NbY19mdW5jX215b19maW5pXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgIGNoZWNrX3Jlc3VsdChyZXMsIGNfcGlwZWxpbmVfcnVuX2Z1bmMsIG1faW5kZXgsIHJlcyk7CisgICAgfQorI2VuZGlmIC8vIE1ZT19TVVBQT1JUCisKKyAgICAvLworICAgIC8vIE1lbW9yeSBhc3NvY2lhdGlvbiB0YWJsZQorICAgIC8vCisgICAgUHRyRGF0YSogZmluZF9wdHJfZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgbV9wdHJfbG9jay5sb2NrKCk7CisgICAgICAgIFB0clNldDo6aXRlcmF0b3IgcmVzID0gbV9wdHJfc2V0LmZpbmQoUHRyRGF0YShwdHIsIDApKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKyAgICAgICAgaWYgKHJlcyA9PSBtX3B0cl9zZXQuZW5kKCkpIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMub3BlcmF0b3ItPigpKTsKKyAgICB9CisKKyAgICBQdHJEYXRhKiBpbnNlcnRfcHRyX2RhdGEoY29uc3Qgdm9pZCAqcHRyLCB1aW50NjRfdCBsZW4sIGJvb2wgJmlzX25ldykgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgc3RkOjpwYWlyPFB0clNldDo6aXRlcmF0b3IsIGJvb2w+IHJlcyA9CisgICAgICAgICAgICBtX3B0cl9zZXQuaW5zZXJ0KFB0ckRhdGEocHRyLCBsZW4pKTsKKyAgICAgICAgUHRyRGF0YSogcHRyX2RhdGEgPSBjb25zdF9jYXN0PFB0ckRhdGEqPihyZXMuZmlyc3Qub3BlcmF0b3ItPigpKTsKKyAgICAgICAgbV9wdHJfbG9jay51bmxvY2soKTsKKworICAgICAgICBpc19uZXcgPSByZXMuc2Vjb25kOworICAgICAgICBpZiAoaXNfbmV3KSB7CisgICAgICAgICAgICAvLyBJdCdzIG5lY2Vzc2FyeSB0byBsb2NrIGFzIHNvb24gYXMgcG9zc2libGUuCisgICAgICAgICAgICAvLyB1bmxvY2sgbXVzdCBiZSBkb25lIGF0IGNhbGwgc2l0ZSBvZiBpbnNlcnRfcHRyX2RhdGEgYXQKKyAgICAgICAgICAgIC8vIGJyYW5jaCBmb3IgaXNfbmV3CisgICAgICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay5sb2NrKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHB0cl9kYXRhOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX3B0cl9kYXRhKGNvbnN0IHZvaWQgKnB0cikgeworICAgICAgICBtX3B0cl9sb2NrLmxvY2soKTsKKyAgICAgICAgbV9wdHJfc2V0LmVyYXNlKFB0ckRhdGEocHRyLCAwKSk7CisgICAgICAgIG1fcHRyX2xvY2sudW5sb2NrKCk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBdXRvbWF0aWMgdmFyaWFibGVzCisgICAgLy8KKyAgICBBdXRvRGF0YSogZmluZF9hdXRvX2RhdGEoY29uc3Qgdm9pZCAqcHRyKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgQXV0b1NldDo6aXRlcmF0b3IgcmVzID0gYXV0b192YXJzLmZpbmQoQXV0b0RhdGEocHRyLCAwKSk7CisgICAgICAgIGlmIChyZXMgPT0gYXV0b192YXJzLmVuZCgpKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIEF1dG9EYXRhKiBpbnNlcnRfYXV0b19kYXRhKGNvbnN0IHZvaWQgKnB0ciwgdWludDY0X3QgbGVuKSB7CisgICAgICAgIEF1dG9TZXQgJmF1dG9fdmFycyA9IGdldF9hdXRvX3ZhcnMoKTsKKyAgICAgICAgc3RkOjpwYWlyPEF1dG9TZXQ6Oml0ZXJhdG9yLCBib29sPiByZXMgPQorICAgICAgICAgICAgYXV0b192YXJzLmluc2VydChBdXRvRGF0YShwdHIsIGxlbikpOworICAgICAgICByZXR1cm4gY29uc3RfY2FzdDxBdXRvRGF0YSo+KHJlcy5maXJzdC5vcGVyYXRvci0+KCkpOworICAgIH0KKworICAgIHZvaWQgcmVtb3ZlX2F1dG9fZGF0YShjb25zdCB2b2lkICpwdHIpIHsKKyAgICAgICAgZ2V0X2F1dG9fdmFycygpLmVyYXNlKEF1dG9EYXRhKHB0ciwgMCkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gU2lnbmFscworICAgIC8vCisgICAgdm9pZCBhZGRfc2lnbmFsKGNvbnN0IHZvaWQgKnNpZ25hbCwgT2ZmbG9hZERlc2NyaXB0b3IgKmRlc2MpIHsKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIG1fc2lnbmFsX21hcFtzaWduYWxdID0gZGVzYzsKKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICBPZmZsb2FkRGVzY3JpcHRvciogZmluZF9zaWduYWwoY29uc3Qgdm9pZCAqc2lnbmFsLCBib29sIHJlbW92ZSkgeworICAgICAgICBPZmZsb2FkRGVzY3JpcHRvciAqZGVzYyA9IDA7CisKKyAgICAgICAgbV9zaWduYWxfbG9jay5sb2NrKCk7CisgICAgICAgIHsKKyAgICAgICAgICAgIFNpZ25hbE1hcDo6aXRlcmF0b3IgaXQgPSBtX3NpZ25hbF9tYXAuZmluZChzaWduYWwpOworICAgICAgICAgICAgaWYgKGl0ICE9IG1fc2lnbmFsX21hcC5lbmQoKSkgeworICAgICAgICAgICAgICAgIGRlc2MgPSBpdC0+c2Vjb25kOworICAgICAgICAgICAgICAgIGlmIChyZW1vdmUpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zaWduYWxfbWFwLmVyYXNlKGl0KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgbV9zaWduYWxfbG9jay51bmxvY2soKTsKKworICAgICAgICByZXR1cm4gZGVzYzsKKyAgICB9CisKKyAgICAvLyBzdG9wIGRldmljZSBwcm9jZXNzCisgICAgdm9pZCBmaW5pX3Byb2Nlc3MoYm9vbCB2ZXJib3NlKTsKKworICAgIC8vIGxpc3Qgb2Ygc3RhY2tzIGFjdGl2ZSBhdCB0aGUgZW5naW5lCisgICAgUGVyc2lzdERhdGFMaXN0IG1fcGVyc2lzdF9saXN0OworCitwcml2YXRlOgorICAgIEVuZ2luZSgpIDogbV9pbmRleCgtMSksIG1fcGh5c2ljYWxfaW5kZXgoLTEpLCBtX3Byb2Nlc3MoMCksIG1fcmVhZHkoZmFsc2UpLAorICAgICAgICAgICAgICAgbV9wcm9jX251bWJlcigwKQorICAgIHt9CisKKyAgICB+RW5naW5lKCkgeworICAgICAgICBpZiAobV9wcm9jZXNzICE9IDApIHsKKyAgICAgICAgICAgIGZpbmlfcHJvY2VzcyhmYWxzZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzZXQgaW5kZXhlcworICAgIHZvaWQgc2V0X2luZGV4ZXMoaW50IGxvZ2ljYWxfaW5kZXgsIGludCBwaHlzaWNhbF9pbmRleCkgeworICAgICAgICBtX2luZGV4ID0gbG9naWNhbF9pbmRleDsKKyAgICAgICAgbV9waHlzaWNhbF9pbmRleCA9IHBoeXNpY2FsX2luZGV4OworICAgIH0KKworICAgIC8vIHN0YXJ0IHByb2Nlc3Mgb24gZGV2aWNlCisgICAgdm9pZCBpbml0X3Byb2Nlc3MoKTsKKworICAgIHZvaWQgbG9hZF9saWJyYXJpZXModm9pZCk7CisgICAgdm9pZCBpbml0X3B0cl9kYXRhKHZvaWQpOworCisgICAgLy8gcGVyZm9ybXMgbGlicmFyeSBpbnRpYWxpemF0aW9uIG9uIHRoZSBkZXZpY2Ugc2lkZQorICAgIHBpZF90IGluaXRfZGV2aWNlKHZvaWQpOworCitwcml2YXRlOgorICAgIC8vIGdldCBwaXBlbGluZSBhc3NvY2lhdGVkIHdpdGggYSBjYWxsaW5nIHRocmVhZAorICAgIENPSVBJUEVMSU5FIGdldF9waXBlbGluZSh2b2lkKTsKKworICAgIC8vIGdldCBhdXRvbWF0aWMgdmFycyBzZXQgYXNzb2NpYXRlZCB3aXRoIHRoZSBjYWxsaW5nIHRocmVhZAorICAgIEF1dG9TZXQmIGdldF9hdXRvX3ZhcnModm9pZCk7CisKKyAgICAvLyBkZXN0cnVjdG9yIGZvciB0aHJlYWQgZGF0YQorICAgIHN0YXRpYyB2b2lkIGRlc3Ryb3lfdGhyZWFkX2RhdGEodm9pZCAqZGF0YSk7CisKK3ByaXZhdGU6CisgICAgdHlwZWRlZiBzdGQ6OnNldDxQdHJEYXRhPiBQdHJTZXQ7CisgICAgdHlwZWRlZiBzdGQ6Om1hcDxjb25zdCB2b2lkKiwgT2ZmbG9hZERlc2NyaXB0b3IqPiBTaWduYWxNYXA7CisKKyAgICAvLyBkZXZpY2UgaW5kZXhlcworICAgIGludCAgICAgICAgIG1faW5kZXg7CisgICAgaW50ICAgICAgICAgbV9waHlzaWNhbF9pbmRleDsKKworICAgIC8vIG51bWJlciBvZiBDT0kgcGlwZXMgY3JlYXRlZCBmb3IgdGhlIGVuZ2luZQorICAgIGxvbmcgICAgICAgIG1fcHJvY19udW1iZXI7CisKKyAgICAvLyBwcm9jZXNzIGhhbmRsZQorICAgIENPSVBST0NFU1MgIG1fcHJvY2VzczsKKworICAgIC8vIElmIGZhbHNlLCBkZXZpY2UgZWl0aGVyIGhhcyBub3QgYmVlbiBpbml0aWFsaXplZCBvciBuZXcgbGlicmFyaWVzCisgICAgLy8gaGF2ZSBiZWVuIGFkZGVkLgorICAgIGJvb2wgICAgICAgIG1fcmVhZHk7CisgICAgbXV0ZXhfdCAgICAgbV9sb2NrOworCisgICAgLy8gTGlzdCBvZiBsaWJyYXJpZXMgdG8gYmUgbG9hZGVkCisgICAgVGFyZ2V0SW1hZ2VMaXN0IG1faW1hZ2VzOworCisgICAgLy8gdmFyIHRhYmxlCisgICAgUHRyU2V0ICAgICAgbV9wdHJfc2V0OworICAgIG11dGV4X3QgICAgIG1fcHRyX2xvY2s7CisKKyAgICAvLyBzaWduYWxzCisgICAgU2lnbmFsTWFwIG1fc2lnbmFsX21hcDsKKyAgICBtdXRleF90ICAgbV9zaWduYWxfbG9jazsKKworICAgIC8vIGNvbnN0YW50cyBmb3IgYWNjZXNzaW5nIGRldmljZSBmdW5jdGlvbiBoYW5kbGVzCisgICAgZW51bSB7CisgICAgICAgIGNfZnVuY19jb21wdXRlID0gMCwKKyNpZmRlZiBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfbXlvX2luaXQsCisgICAgICAgIGNfZnVuY19teW9fZmluaSwKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorICAgICAgICBjX2Z1bmNfaW5pdCwKKyAgICAgICAgY19mdW5jX3Zhcl90YWJsZV9zaXplLAorICAgICAgICBjX2Z1bmNfdmFyX3RhYmxlX2NvcHksCisgICAgICAgIGNfZnVuY3NfdG90YWwKKyAgICB9OworICAgIHN0YXRpYyBjb25zdCBjaGFyKiBtX2Z1bmNfbmFtZXNbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBkZXZpY2UgZnVuY3Rpb24gaGFuZGxlcworICAgIENPSUZVTkNUSU9OIG1fZnVuY3NbY19mdW5jc190b3RhbF07CisKKyAgICAvLyBpbnQgLT4gbmFtZSBtYXBwaW5nIGZvciBkZXZpY2Ugc2lnbmFscworICAgIHN0YXRpYyBjb25zdCBpbnQgICBjX3NpZ25hbF9tYXggPSAzMjsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogY19zaWduYWxfbmFtZXNbY19zaWduYWxfbWF4XTsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOR0lORV9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9lbnYuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMDM3MzM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmNwcApAQCAtMCwwICsxLDM1NCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9lbnYuaCIKKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgIm9mZmxvYWRfdXRpbC5oIgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworLy8gZm9yIGVudmlyb25tZW50IHZhcmlhYmxlcyB2YWxpZCBvbiBhbGwgY2FyZHMKK2NvbnN0IGludCBNaWNFbnZWYXI6OmFueV9jYXJkID0gLTE7CisKK01pY0VudlZhcjo6fk1pY0VudlZhcigpCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpDYXJkRW52VmFycyo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX3NwZWNfbGlzdC5iZWdpbigpOworICAgICAgICAgaXQgIT0gY2FyZF9zcGVjX2xpc3QuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgQ2FyZEVudlZhcnMgKmNhcmRfZGF0YSA9ICppdDsKKyAgICAgICAgZGVsZXRlIGNhcmRfZGF0YTsKKyAgICB9Cit9CisKK01pY0VudlZhcjo6VmFyVmFsdWU6On5WYXJWYWx1ZSgpCit7CisgICAgZnJlZShlbnZfdmFyX3ZhbHVlKTsKK30KKworTWljRW52VmFyOjpDYXJkRW52VmFyczo6fkNhcmRFbnZWYXJzKCkKK3sKKyAgICBmb3IgKHN0ZDo6bGlzdDxNaWNFbnZWYXI6OlZhclZhbHVlKj46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgaXQgIT0gZW52X3ZhcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIFZhclZhbHVlICp2YXJfdmFsdWUgPSAqaXQ7CisgICAgICAgICAgICBkZWxldGUgdmFyX3ZhbHVlOworICAgIH0KK30KKworLy8gU2VhcmNoaW5nIGZvciBjYXJkIGluICJjYXJkX3NwZWNfbGlzdCIgbGlzdCB3aXRoIHRoZSBzYW1lICJudW1iZXIiCisKK01pY0VudlZhcjo6Q2FyZEVudlZhcnMqIE1pY0VudlZhcjo6Z2V0X2NhcmQoaW50IG51bWJlcikKK3sKKyAgICBpZiAobnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIHJldHVybiAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGZvciAoc3RkOjpsaXN0PE1pY0VudlZhcjo6Q2FyZEVudlZhcnMqPjo6Y29uc3RfaXRlcmF0b3IKKyAgICAgICAgIGl0ID0gY2FyZF9zcGVjX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgIGl0ICE9IGNhcmRfc3BlY19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGEgPSAqaXQ7CisgICAgICAgIGlmIChjYXJkX2RhdGEtPmNhcmRfbnVtYmVyID09IG51bWJlcikgeworICAgICAgICAgICAgcmV0dXJuIGNhcmRfZGF0YTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworLy8gU2VhcmNoaW5nIGZvciBlbnZpcm9ubWVudCB2YXJpYWJsZSBpbiAiZW52X3ZhciIgbGlzdCB3aXRoIHRoZSBzYW1lIG5hbWUKKworTWljRW52VmFyOjpWYXJWYWx1ZSogTWljRW52VmFyOjpDYXJkRW52VmFyczo6ZmluZF92YXIoCisgICAgY2hhciogZW52X3Zhcl9uYW1lLAorICAgIGludCBlbnZfdmFyX25hbWVfbGVuZ3RoCispCit7CisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvciBpdCA9IGVudl92YXJzLmJlZ2luKCk7CisgICAgICAgIGl0ICE9IGVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgaWYgKHZhcl92YWx1ZS0+bGVuZ3RoID09IGVudl92YXJfbmFtZV9sZW5ndGggJiYKKyAgICAgICAgICAgICAgICAhc3RybmNtcCh2YXJfdmFsdWUtPmVudl92YXIsIGVudl92YXJfbmFtZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKSkgeworICAgICAgICAgICAgICAgIHJldHVybiB2YXJfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkIE1pY0VudlZhcjo6YW5hbHl6ZV9lbnZfdmFyKGNoYXIgKmVudl92YXJfc3RyaW5nKQoreworICAgIGNoYXIgICAgICAgICAgKmVudl92YXJfbmFtZTsKKyAgICBjaGFyICAgICAgICAgICplbnZfdmFyX2RlZjsKKyAgICBpbnQgICAgICAgICAgIGNhcmRfbnVtYmVyOworICAgIGludCAgICAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aDsKKyAgICBNaWNFbnZWYXJLaW5kIGVudl92YXJfa2luZDsKKworICAgIGVudl92YXJfa2luZCA9IGdldF9lbnZfdmFyX2tpbmQoZW52X3Zhcl9zdHJpbmcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9uYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZW52X3Zhcl9kZWYpOworICAgIHN3aXRjaCAoZW52X3Zhcl9raW5kKSB7CisgICAgICAgIGNhc2UgY19taWNfdmFyOgorICAgICAgICBjYXNlIGNfbWljX2NhcmRfdmFyOgorICAgICAgICAgICAgYWRkX2Vudl92YXIoY2FyZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgZW52X3Zhcl9kZWYpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19taWNfY2FyZF9lbnY6CisgICAgICAgICAgICBtaWNfcGFyc2VfZW52X3Zhcl9saXN0KGNhcmRfbnVtYmVyLCBlbnZfdmFyX2RlZik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX25vX21pYzoKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KK30KKwordm9pZCBNaWNFbnZWYXI6OmFkZF9lbnZfdmFyKAorICAgIGludCBjYXJkX251bWJlciwKKyAgICBjaGFyICplbnZfdmFyX25hbWUsCisgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqZW52X3Zhcl9kZWYKKykKK3sKKyAgICBWYXJWYWx1ZSAqdmFyOworICAgIENhcmRFbnZWYXJzICpjYXJkOworCisgICAgLy8gVGhlIGNhc2UgY29ycmVzcG9uZHMgdG8gY29tbW9uIGVudiB2YXIgZGVmaW5pdGlvbiBvZiBraW5kCisgICAgLy8gPG1pYy1wcmVmaXg+Xzx2YXI+CisgICAgaWYgKGNhcmRfbnVtYmVyID09IGFueV9jYXJkKSB7CisgICAgICAgIGNhcmQgPSAmY29tbW9uX3ZhcnM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBjYXJkID0gZ2V0X2NhcmQoY2FyZF9udW1iZXIpOworICAgICAgICBpZiAoIWNhcmQpIHsKKyAgICAgICAgICAgIC8vIGRlZmluaXRpb24gZm9yIG5ldyBjYXJkIG9jY3VycmVkCisgICAgICAgICAgICBjYXJkID0gbmV3IENhcmRFbnZWYXJzKGNhcmRfbnVtYmVyKTsKKyAgICAgICAgICAgIGNhcmRfc3BlY19saXN0LnB1c2hfYmFjayhjYXJkKTsKKyAgICAgICAgfQorCisgICAgfQorICAgIHZhciA9IGNhcmQtPmZpbmRfdmFyKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCk7CisgICAgaWYgKCF2YXIpIHsKKyAgICAgICAgLy8gcHV0IG5ldyBlbnYgdmFyIGRlZmluaXRpb24gaW4gImVudl92YXIiIGxpc3QKKyAgICAgICAgdmFyID0gbmV3IFZhclZhbHVlKGVudl92YXJfbmFtZSwgZW52X3Zhcl9uYW1lX2xlbmd0aCwgZW52X3Zhcl9kZWYpOworICAgICAgICBjYXJkLT5lbnZfdmFycy5wdXNoX2JhY2sodmFyKTsKKyAgICB9Cit9CisKKy8vIFRoZSByb3V0aW5lIGFuYWx5c2VzIHN0cmluZyBwb2ludGVkIGJ5ICJlbnZfdmFyX3N0cmluZyIgYXJndW1lbnQKKy8vIGFjY29yZGluZyB0byB0aGUgZm9sbG93aW5nIHN5bnRheDoKKy8vCisvLyBTcGVjaWZpY2F0aW9uIG9mIHByZWZpeCBmb3IgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlcworLy8gTUlDX0VOVl9QUkVGSVg9PG1pYy1wcmVmaXg+CisvLworLy8gU2V0dGluZyBzaW5nbGUgTUlDIGVudmlyb25tZW50IHZhcmlhYmxlCisvLyA8bWljLXByZWZpeD5fPHZhcj49PHZhbHVlPgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fPHZhcj49PHZhbHVlPgorCisvLyBTZXR0aW5nIG11bHRpcGxlIE1JQyBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+X0VOVj08ZW52LXZhcnM+CisKK01pY0VudlZhcktpbmQgTWljRW52VmFyOjpnZXRfZW52X3Zhcl9raW5kKAorICAgIGNoYXIgKmVudl92YXJfc3RyaW5nLAorICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgY2hhciAqKmVudl92YXJfbmFtZSwKKyAgICBpbnQgKmVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgY2hhciAqKmVudl92YXJfZGVmCispCit7CisgICAgaW50IGxlbiA9IHN0cmxlbihwcmVmaXgpOworICAgIGNoYXIgKmMgPSBlbnZfdmFyX3N0cmluZzsKKyAgICBpbnQgbnVtID0gMDsKKyAgICBib29sIGNhcmRfaXNfc2V0ID0gZmFsc2U7CisKKyAgICBpZiAoc3RybmNtcChjLCBwcmVmaXgsIGxlbikgIT0gMCB8fCBjW2xlbl0gIT0gJ18nKSB7CisgICAgICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMgKz0gbGVuICsgMTsKKworICAgICpjYXJkX251bWJlciA9IGFueV9jYXJkOworICAgIGlmIChpc2RpZ2l0KCpjKSkgeworICAgICAgICB3aGlsZSAoaXNkaWdpdCAoKmMpKSB7CisgICAgICAgICAgICBudW0gPSAoKmMrKyAtICcwJykgKyAobnVtICogMTApOworICAgICAgICB9CisgICAgaWYgKCpjICE9ICdfJykgeworICAgICAgICByZXR1cm4gY19ub19taWM7CisgICAgfQorICAgIGMrKzsKKyAgICAgICAgKmNhcmRfbnVtYmVyID0gbnVtOworICAgICAgICBjYXJkX2lzX3NldCA9IHRydWU7CisgICAgfQorICAgIGlmICghaXNhbHBoYSgqYykpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9uYW1lID0gKmVudl92YXJfZGVmID0gYzsKKyAgICBpZiAoc3RybmNtcChjLCAiRU5WPSIsIDQpID09IDApIHsKKyAgICAgICAgaWYgKCFjYXJkX2lzX3NldCkgeworICAgICAgICAgICAgKmVudl92YXJfbmFtZV9sZW5ndGggPSAzOworICAgICAgICAgICAgKmVudl92YXJfbmFtZSA9ICplbnZfdmFyX2RlZiA9IGM7CisgICAgICAgICAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICAgICAgICAgIHJldHVybiAgY19taWNfdmFyOworICAgICAgICB9CisgICAgICAgICplbnZfdmFyX2RlZiA9IGMgKyBzdHJsZW4oIkVOVj0iKTsKKyAgICAgICAgKmVudl92YXJfZGVmID0gc3RyZHVwKCplbnZfdmFyX2RlZik7CisgICAgICAgIHJldHVybiBjX21pY19jYXJkX2VudjsKKyAgICB9CisgICAgaWYgKGlzYWxwaGEoKmMpKSB7CisgICAgICAgICplbnZfdmFyX25hbWVfbGVuZ3RoID0gMDsKKyAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgKCplbnZfdmFyX25hbWVfbGVuZ3RoKSsrOworICAgICAgICB9CisgICAgfQorICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgcmV0dXJuIGNfbm9fbWljOworICAgIH0KKyAgICAqZW52X3Zhcl9kZWYgPSBzdHJkdXAoKmVudl92YXJfZGVmKTsKKyAgICByZXR1cm4gY2FyZF9pc19zZXQ/IGNfbWljX2NhcmRfdmFyIDogY19taWNfdmFyOworfQorCisvLyBhbmFseXNpbmcgPGVudi12YXJzPiBpbiBmb3JtOgorLy8gPG1pYy1wcmVmaXg+XzxjYXJkLW51bWJlcj5fRU5WPTxlbnYtdmFycz4KKy8vIHdoZXJlOgorLy8KKy8vIDxlbnYtdmFycz46CisvLyAgICAgICAgICAgICAgICA8ZW52LXZhcj4KKy8vICAgICAgICAgICAgICAgIDxlbnYtdmFycz4gfCA8ZW52LXZhcj4KKy8vCisvLyA8ZW52LXZhcj46CisvLyAgICAgICAgICAgICAgICB2YXJpYWJsZT12YWx1ZQorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9InZhbHVlIgorLy8gICAgICAgICAgICAgICAgdmFyaWFibGU9CisKK3ZvaWQgTWljRW52VmFyOjptaWNfcGFyc2VfZW52X3Zhcl9saXN0KAorICAgIGludCBjYXJkX251bWJlciwgY2hhciAqZW52X3ZhcnNfZGVmX2xpc3QpCit7CisgICAgY2hhciAqYyA9IGVudl92YXJzX2RlZl9saXN0OworICAgIGNoYXIgKmVudl92YXJfbmFtZTsKKyAgICBpbnQgIGVudl92YXJfbmFtZV9sZW5ndGg7CisgICAgY2hhciAqZW52X3Zhcl9kZWY7CisgICAgYm9vbCB2YXJfaXNfcXVvdGVkOworCisgICAgaWYgKCpjID09ICciJykgeworICAgICAgICBjKys7CisgICAgfQorICAgIHdoaWxlICgqYyAhPSAwKSB7CisgICAgICAgIHZhcl9pc19xdW90ZWQgPSBmYWxzZTsKKyAgICAgICAgZW52X3Zhcl9uYW1lID0gYzsKKyAgICAgICAgZW52X3Zhcl9uYW1lX2xlbmd0aCA9IDA7CisgICAgICAgIGlmIChpc2FscGhhKCpjKSkgeworICAgICAgICAgICAgd2hpbGUgKGlzYWxudW0oKmMpIHx8ICpjID09ICdfJykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWVfbGVuZ3RoKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX3BhcnNlX2Vudl92YXJfbGlzdDEpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGlmICgqYyAhPSAnPScpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfcGFyc2VfZW52X3Zhcl9saXN0Mik7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYysrOworCisgICAgICAgIGlmICgqYyA9PSAnIicpIHsKKyAgICAgICAgICAgIHZhcl9pc19xdW90ZWQgPSB0cnVlOworICAgICAgICAgICAgYysrOworICAgICAgICB9CisgICAgICAgIC8vIEVudmlyb25tZW50IHZhcmlhYmxlIHZhbHVlcyB0aGF0IGNvbnRhaW4gfCB3aWxsIG5lZWQgdG8gYmUgZXNjYXBlZC4KKyAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgIT0gJ3wnICYmCisgICAgICAgICAgICAgICAoIXZhcl9pc19xdW90ZWQgfHwgKmMgIT0gJyInKSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gc2tpcCBlc2NhcGVkIHN5bWJvbAorICAgICAgICAgICAgaWYgKCpjID09ICdcXCcpIHsKKyAgICAgICAgICAgICAgICBjKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHZhcl9pc19xdW90ZWQpIHsKKyAgICAgICAgICAgIGMrKzsgLy8gZm9yICIKKyAgICAgICAgICAgIHdoaWxlICgqYyAhPSAwICYmICpjICE9ICd8JykgeworICAgICAgICAgICAgICAgIGMrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGludCBzeiA9IGMgLSBlbnZfdmFyX25hbWU7CisgICAgICAgIGVudl92YXJfZGVmID0gKGNoYXIqKW1hbGxvYyhzeik7CisgICAgICAgIG1lbWNweShlbnZfdmFyX2RlZiwgZW52X3Zhcl9uYW1lLCBzeik7CisgICAgICAgIGVudl92YXJfZGVmW3N6XSA9IDA7CisKKyAgICAgICAgaWYgKCpjID09ICd8JykgeworICAgICAgICAgICAgYysrOworICAgICAgICAgICAgd2hpbGUgKCpjICE9IDAgJiYgKmMgPT0gJyAnKSB7CisgICAgICAgICAgICAgICAgYysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGFkZF9lbnZfdmFyKGNhcmRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICBlbnZfdmFyX25hbWUsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgICAgICAgICAgICAgIGVudl92YXJfZGVmKTsKKyAgICB9Cit9CisKKy8vIENvbGxlY3QgYWxsIGRlZmluaXRpb25zIGZvciB0aGUgY2FyZCB3aXRoIG51bWJlciAiY2FyZF9udW0iLgorLy8gVGhlIHJldHVybmVkIHJlc3VsdCBpcyB2ZWN0b3Igb2Ygc3RyaW5nIHBvaW50ZXJzIGRlZmluaW5nIG9uZQorLy8gZW52aXJvbm1lbnQgdmFyaWFibGUuIFRoZSB2ZWN0b3IgaXMgdGVybWluYXRlZCBieSBOVUxMIHBvaW50ZXIuCisvLyBJbiB0aGUgYmVnaW5uaW5nIG9mIHRoZSB2ZWN0b3IgdGhlcmUgYXJlIGVudiB2YXJzIGRlZmluZWQgYXMKKy8vIDxtaWMtcHJlZml4Pl88Y2FyZC1udW1iZXI+Xzx2YXI+PTx2YWx1ZT4KKy8vIG9yCisvLyA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlY9PGVudi12YXJzPgorLy8gd2hlcmUgPGNhcmQtbnVtYmVyPiBpcyBlcXVhbCB0byAiY2FyZF9udW0iCisvLyBUaGV5IGFyZSBmb2xsb3dlZCBieSBkZWZpbml0aW9ucyB2YWxpZCBmb3IgYW55IGNhcmQKKy8vIGFuZCBhYnNlbnQgaW4gcHJldmlvdXMgZGVmaW5pdGlvbnMuCisKK2NoYXIqKiBNaWNFbnZWYXI6OmNyZWF0ZV9lbnZpcm9uX2Zvcl9jYXJkKGludCBjYXJkX251bSkKK3sKKyAgICBWYXJWYWx1ZSAqdmFyX3ZhbHVlOworICAgIFZhclZhbHVlICp2YXJfdmFsdWVfZmluZDsKKyAgICBDYXJkRW52VmFycyAqY2FyZF9kYXRhID0gZ2V0X2NhcmQoY2FyZF9udW0pOworICAgIENhcmRFbnZWYXJzICpjYXJkX2RhdGFfY29tbW9uOworICAgIHN0ZDo6bGlzdDxjaGFyKj4gbmV3X2VudjsKKyAgICBjaGFyICoqcmV6OworCisgICAgaWYgKCFwcmVmaXgpIHsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIC8vIFRoZXJlIGlzIG5vIHBlcnNvbmVsIGVudiB2YXIgZGVmaW5pdGlvbnMgZm9yIHRoZSBjYXJkIHdpdGgKKyAgICAvLyBudW1iZXIgImNhcmRfbnVtIgorICAgIGlmICghY2FyZF9kYXRhKSB7CisgICAgICAgIHJldHVybiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChhbnlfY2FyZCk7CisgICAgfQorCisgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgaXQgPSBjYXJkX2RhdGEtPmVudl92YXJzLmJlZ2luKCk7CisgICAgICAgICBpdCAhPSBjYXJkX2RhdGEtPmVudl92YXJzLmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHZhcl92YWx1ZSA9ICppdDsKKyAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICB9CisKKyAgICBpZiAoY2FyZF9udW0gIT0gYW55X2NhcmQpIHsKKyAgICAgICAgY2FyZF9kYXRhX2NvbW1vbiA9IGdldF9jYXJkKGFueV9jYXJkKTsKKyAgICAgICAgZm9yIChzdGQ6Omxpc3Q8TWljRW52VmFyOjpWYXJWYWx1ZSo+Ojpjb25zdF9pdGVyYXRvcgorICAgICAgICAgICAgIGl0ID0gY2FyZF9kYXRhX2NvbW1vbi0+ZW52X3ZhcnMuYmVnaW4oKTsKKyAgICAgICAgICAgICBpdCAhPSBjYXJkX2RhdGFfY29tbW9uLT5lbnZfdmFycy5lbmQoKTsgaXQrKykgeworICAgICAgICAgICAgdmFyX3ZhbHVlID0gKml0OworICAgICAgICAgICAgdmFyX3ZhbHVlX2ZpbmQgPSBjYXJkX2RhdGEtPmZpbmRfdmFyKHZhcl92YWx1ZS0+ZW52X3ZhciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2YXJfdmFsdWUtPmxlbmd0aCk7CisgICAgICAgICAgICBpZiAoIXZhcl92YWx1ZV9maW5kKSB7CisgICAgICAgICAgICAgICAgbmV3X2Vudi5wdXNoX2JhY2sodmFyX3ZhbHVlLT5lbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBuZXdfZW52X3NpemUgPSBuZXdfZW52LnNpemUoKTsKKyAgICByZXogPSAoY2hhcioqKSBtYWxsb2MoKG5ld19lbnZfc2l6ZSArIDEpICogc2l6ZW9mKGNoYXIqKSk7CisgICAgc3RkOjpjb3B5KG5ld19lbnYuYmVnaW4oKSwgbmV3X2Vudi5lbmQoKSwgcmV6KTsKKyAgICByZXpbbmV3X2Vudl9zaXplXSA9IDA7CisgICAgcmV0dXJuIHJlejsKK30KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfZW52LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjAzNWZmNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2Vudi5oCkBAIC0wLDAgKzEsOTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfRU5WX0hfSU5DTFVERUQKKworI2luY2x1ZGUgPGxpc3Q+CisKKy8vIGRhdGEgc3RydWN0dXJlIGFuZCByb3V0aW5lcyB0byBwYXJzZSBNSUMgdXNlciBlbnZpcm9ubWVudCBhbmQgcGFzcyB0byBNSUMKKworZW51bSBNaWNFbnZWYXJLaW5kCit7CisgICAgY19ub19taWMsICAgICAgICAgLy8gbm90IE1JQyBlbnYgdmFyCisgICAgY19taWNfdmFyLCAgICAgICAgLy8gZm9yIDxtaWMtcHJlZml4Pl88dmFyPgorICAgIGNfbWljX2NhcmRfdmFyLCAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl88dmFyPgorICAgIGNfbWljX2NhcmRfZW52ICAgIC8vIGZvciA8bWljLXByZWZpeD5fPGNhcmQtbnVtYmVyPl9FTlYKK307CisKK3N0cnVjdCBNaWNFbnZWYXIgeworcHVibGljOgorICAgIE1pY0VudlZhcigpIDogcHJlZml4KDApIHt9CisgICAgfk1pY0VudlZhcigpOworCisgICAgdm9pZCBhbmFseXplX2Vudl92YXIoY2hhciAqZW52X3Zhcl9zdHJpbmcpOworICAgIGNoYXIqKiBjcmVhdGVfZW52aXJvbl9mb3JfY2FyZChpbnQgY2FyZF9udW0pOworICAgIE1pY0VudlZhcktpbmQgZ2V0X2Vudl92YXJfa2luZCgKKyAgICAgICAgY2hhciAqZW52X3Zhcl9zdHJpbmcsCisgICAgICAgIGludCAqY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKiplbnZfdmFyX25hbWUsCisgICAgICAgIGludCAqZW52X3Zhcl9uYW1lX2xlbmd0aCwKKyAgICAgICAgY2hhciAqKmVudl92YXJfZGVmCisgICAgKTsKKyAgICB2b2lkIGFkZF9lbnZfdmFyKAorICAgICAgICBpbnQgY2FyZF9udW1iZXIsCisgICAgICAgIGNoYXIgKmVudl92YXJfbmFtZSwKKyAgICAgICAgaW50IGVudl92YXJfbmFtZV9sZW5ndGgsCisgICAgICAgIGNoYXIgKmVudl92YXJfZGVmCisgICAgKTsKKworICAgIHZvaWQgc2V0X3ByZWZpeChjb25zdCBjaGFyICpwcmVmKSB7CisgICAgICAgIHByZWZpeCA9IChwcmVmICYmICpwcmVmICE9ICdcMCcpID8gcHJlZiA6IDA7CisgICAgfQorCisgICAgc3RydWN0IFZhclZhbHVlIHsKKyAgICBwdWJsaWM6CisgICAgICAgIGNoYXIqIGVudl92YXI7CisgICAgICAgIGludCAgIGxlbmd0aDsKKyAgICAgICAgY2hhciogZW52X3Zhcl92YWx1ZTsKKworICAgICAgICBWYXJWYWx1ZShjaGFyKiB2YXIsIGludCBsbiwgY2hhciogdmFsdWUpCisgICAgICAgIHsKKyAgICAgICAgICAgIGVudl92YXIgPSB2YXI7CisgICAgICAgICAgICBsZW5ndGggPSBsbjsKKyAgICAgICAgICAgIGVudl92YXJfdmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgfQorICAgICAgICB+VmFyVmFsdWUoKTsKKyAgICB9OworCisgICAgc3RydWN0IENhcmRFbnZWYXJzIHsKKyAgICBwdWJsaWM6CisKKyAgICAgICAgaW50IGNhcmRfbnVtYmVyOworICAgICAgICBzdGQ6Omxpc3Q8c3RydWN0IFZhclZhbHVlKj4gZW52X3ZhcnM7CisKKyAgICAgICAgQ2FyZEVudlZhcnMoKSB7IGNhcmRfbnVtYmVyID0gYW55X2NhcmQ7IH0KKyAgICAgICAgQ2FyZEVudlZhcnMoaW50IG51bSkgeyBjYXJkX251bWJlciA9IG51bTsgfQorICAgICAgICB+Q2FyZEVudlZhcnMoKTsKKworICAgICAgICB2b2lkIGFkZF9uZXdfZW52X3ZhcihpbnQgbnVtYmVyLCBjaGFyICplbnZfdmFyLCBpbnQgbGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICplbnZfdmFyX3ZhbHVlKTsKKyAgICAgICAgVmFyVmFsdWUqIGZpbmRfdmFyKGNoYXIqIGVudl92YXJfbmFtZSwgaW50IGVudl92YXJfbmFtZV9sZW5ndGgpOworICAgIH07CisgICAgc3RhdGljIGNvbnN0IGludCBhbnlfY2FyZDsKKworcHJpdmF0ZToKKyAgICB2b2lkICAgICAgICAgbWljX3BhcnNlX2Vudl92YXJfbGlzdChpbnQgY2FyZF9udW1iZXIsIGNoYXIgKmVudl92YXJfZGVmKTsKKyAgICBDYXJkRW52VmFycyogZ2V0X2NhcmQoaW50IG51bWJlcik7CisKKyAgICBjb25zdCBjaGFyICpwcmVmaXg7CisgICAgc3RkOjpsaXN0PHN0cnVjdCBDYXJkRW52VmFycyAqPiBjYXJkX3NwZWNfbGlzdDsKKyAgICBDYXJkRW52VmFycyBjb21tb25fdmFyczsKK307CisKKyNlbmRpZiAvLyBPRkZMT0FEX0VOVl9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM4ZDUxMzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmNwcApAQCAtMCwwICsxLDQzNjAgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBhcyB0aGUgZm9sbG93aW5nIDIgZnVuY3Rpb25zIGFyZSBkZWNsYXJlZCBhcyBmcmllbmQgaW4gb2ZmbG9hZF9lbmdpbmUuaAorLy8gQ0xBTkcgZG9lcyBub3QgbGlrZSBzdGF0aWMgdG8gYmVlbiBhZnRlciBmcmllbmQgZGVjbGFyYXRpb24uCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfaW5pdF9saWJyYXJ5X29uY2Uodm9pZCk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfZmluaV9saWJyYXJ5KHZvaWQpOworCisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisjaWZkZWYgTVlPX1NVUFBPUlQKKyNpbmNsdWRlICJvZmZsb2FkX215b19ob3N0LmgiCisjZW5kaWYKKworI2luY2x1ZGUgPG1hbGxvYy5oPgorI2lmbmRlZiBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxhbGxvY2EuaD4KKyNpbmNsdWRlIDxlbGYuaD4KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3lzL3N0YXQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorCisjaW5jbHVkZSA8YWxnb3JpdGhtPgorI2luY2x1ZGUgPGJpdHNldD4KKworI2lmIGRlZmluZWQoSE9TVF9XSU5OVCkKKyNkZWZpbmUgUEFUSF9TRVBBUkFUT1IgIjsiCisjZWxzZQorI2RlZmluZSBQQVRIX1NFUEFSQVRPUiAiOiIKKyNlbmRpZgorCisjZGVmaW5lIEdFVF9PRkZMT0FEX05VTUJFUih0aW1lcl9kYXRhKSBcCisgICAgdGltZXJfZGF0YT8gdGltZXJfZGF0YS0+b2ZmbG9hZF9udW1iZXIgOiAwCisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKy8vIFNtYWxsIHN1YnNldCBvZiBFTEYgZGVjbGFyYXRpb25zIGZvciBXaW5kb3dzIHdoaWNoIGlzIG5lZWRlZCB0byBjb21waWxlCisvLyB0aGlzIGZpbGUuIEVMRiBoZWFkZXIgaXMgdXNlZCB0byB1bmRlcnN0YW5kIHdoYXQgYmluYXJ5IHR5cGUgaXMgY29udGFpbmVkCisvLyBpbiB0aGUgdGFyZ2V0IGltYWdlIC0gc2hhcmVkIGxpYnJhcnkgb3IgZXhlY3V0YWJsZS4KKwordHlwZWRlZiB1aW50MTZfdCBFbGY2NF9IYWxmOwordHlwZWRlZiB1aW50MzJfdCBFbGY2NF9Xb3JkOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9BZGRyOwordHlwZWRlZiB1aW50NjRfdCBFbGY2NF9PZmY7CisKKyNkZWZpbmUgRUlfTklERU5UICAgMTYKKworI2RlZmluZSBFVF9FWEVDICAgICAyCisjZGVmaW5lIEVUX0RZTiAgICAgIDMKKwordHlwZWRlZiBzdHJ1Y3QKK3sKKyAgICB1bnNpZ25lZCBjaGFyIGVfaWRlbnRbRUlfTklERU5UXTsKKyAgICBFbGY2NF9IYWxmICAgIGVfdHlwZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfbWFjaGluZTsKKyAgICBFbGY2NF9Xb3JkICAgIGVfdmVyc2lvbjsKKyAgICBFbGY2NF9BZGRyICAgIGVfZW50cnk7CisgICAgRWxmNjRfT2ZmICAgICBlX3Bob2ZmOworICAgIEVsZjY0X09mZiAgICAgZV9zaG9mZjsKKyAgICBFbGY2NF9Xb3JkICAgIGVfZmxhZ3M7CisgICAgRWxmNjRfSGFsZiAgICBlX2Voc2l6ZTsKKyAgICBFbGY2NF9IYWxmICAgIGVfcGhlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9waG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hlbnRzaXplOworICAgIEVsZjY0X0hhbGYgICAgZV9zaG51bTsKKyAgICBFbGY2NF9IYWxmICAgIGVfc2hzdHJuZHg7Cit9IEVsZjY0X0VoZHI7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIEhvc3QgY29uc29sZSBhbmQgZmlsZSBsb2dnaW5nCitjb25zdCBjaGFyICpwcmVmaXg7CitpbnQgY29uc29sZV9lbmFibGVkID0gMDsKK2ludCBvZmZsb2FkX251bWJlciA9IDA7CisKK3N0YXRpYyBjb25zdCBjaGFyICpodHJhY2VfZW52bmFtZSA9ICJIX1RSQUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyICpvZmZsb2FkX3JlcG9ydF9lbnZuYW1lID0gIk9GRkxPQURfUkVQT1JUIjsKK3N0YXRpYyBjaGFyICp0aW1lcl9lbnZuYW1lID0gIkhfVElNRSI7CisKKy8vIFRyYWNlIGluZm9ybWF0aW9uCitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW10gPSB7CisgICAgIk5PQ09QWSIsCisgICAgIklOIiwKKyAgICAiT1VUIiwKKyAgICAiSU5PVVQiCit9Oworc3RhdGljIGNvbnN0IGNoYXIqIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbXSA9IHsKKyAgICAidW5rbm93biIsCisgICAgImRhdGEiLAorICAgICJkYXRhX3B0ciIsCisgICAgImZ1bmNfcHRyIiwKKyAgICAidm9pZF9wdHIiLAorICAgICJzdHJpbmdfcHRyIiwKKyAgICAiZHYiLAorICAgICJkdl9kYXRhIiwKKyAgICAiZHZfZGF0YV9zbGljZSIsCisgICAgImR2X3B0ciIsCisgICAgImR2X3B0cl9kYXRhIiwKKyAgICAiZHZfcHRyX2RhdGFfc2xpY2UiLAorICAgICJjZWFuX3ZhciIsCisgICAgImNlYW5fdmFyX3B0ciIsCisgICAgImNfZGF0YV9wdHJfYXJyYXkiLAorICAgICJjX2Z1bmNfcHRyX2FycmF5IiwKKyAgICAiY192b2lkX3B0cl9hcnJheSIsCisgICAgImNfc3RyaW5nX3B0cl9hcnJheSIKK307CisKK0VuZ2luZSogICAgICAgICBtaWNfZW5naW5lcyA9IDA7Cit1aW50MzJfdCAgICAgICAgbWljX2VuZ2luZXNfdG90YWwgPSAwOworcHRocmVhZF9rZXlfdCAgIG1pY190aHJlYWRfa2V5OworTWljRW52VmFyICAgICAgIG1pY19lbnZfdmFyczsKK3VpbnQ2NF90ICAgICAgICBjcHVfZnJlcXVlbmN5ID0gMDsKKworLy8gTUlDX1NUQUNLU0laRQordWludDMyX3QgbWljX3N0YWNrX3NpemUgPSAxMiAqIDEwMjQgKiAxMDI0OworCisvLyBNSUNfQlVGRkVSU0laRQordWludDY0X3QgbWljX2J1ZmZlcl9zaXplID0gMDsKKworLy8gTUlDX0xEX0xJQlJBUllfUEFUSAorY2hhciogbWljX2xpYnJhcnlfcGF0aCA9IDA7CisKKy8vIE1JQ19QUk9YWV9JTworYm9vbCBtaWNfcHJveHlfaW8gPSB0cnVlOworCisvLyBNSUNfUFJPWFlfRlNfUk9PVAorY2hhciogbWljX3Byb3h5X2ZzX3Jvb3QgPSAwOworCisvLyBUaHJlc2hvbGQgZm9yIGNyZWF0aW5nIGJ1ZmZlcnMgd2l0aCBsYXJnZSBwYWdlcy4gQnVmZmVyIGlzIGNyZWF0ZWQKKy8vIHdpdGggbGFyZ2UgcGFnZXMgaGludCBpZiBpdHMgc2l6ZSBleGNlZWRzIHRoZSB0aHJlc2hvbGQgdmFsdWUuCisvLyBCeSBkZWZhdWx0IGxhcmdlIHBhZ2VzIGFyZSBkaXNhYmxlZCByaWdodCBub3cgKGJ5IHNldHRpbmcgZGVmYXVsdAorLy8gdmFsdWUgZm9yIHRocmVzaG9sZCB0byBNQVgpIGR1ZSB0byBIU0QgNDExNDYyOS4KK3VpbnQ2NF90IF9fb2ZmbG9hZF91c2VfMm1iX2J1ZmZlcnMgPSAweGZmZmZmZmZmZmZmZmZmZmZVTEw7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lICA9CisgICAgIk1JQ19VU0VfMk1CX0JVRkZFUlMiOworCitzdGF0aWMgdWludDY0X3QgX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUgPSAyICogMTAyNCAqIDEwMjQ7CitzdGF0aWMgY29uc3QgY2hhciAqbWljX3VzZV9hc3luY19idWZmZXJfd3JpdGVfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9XUklURSI7CisKK3N0YXRpYyB1aW50NjRfdCBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkID0gMiAqIDEwMjQgKiAxMDI0Oworc3RhdGljIGNvbnN0IGNoYXIgKm1pY191c2VfYXN5bmNfYnVmZmVyX3JlYWRfZW52bmFtZSAgPQorICAgICJNSUNfVVNFX0FTWU5DX0JVRkZFUl9SRUFEIjsKKworLy8gZGV2aWNlIGluaXRpYWxpemF0aW9uIHR5cGUKK09mZmxvYWRJbml0VHlwZSBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWRfYWxsOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfaW5pdF9lbnZuYW1lID0gIk9GRkxPQURfSU5JVCI7CisKKy8vIGFjdGl2ZSB3YWl0CitzdGF0aWMgYm9vbCBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSB0cnVlOworc3RhdGljIGNvbnN0IGNoYXIgKm9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSA9ICJPRkZMT0FEX0FDVElWRV9XQUlUIjsKKworLy8gT01QX0RFRkFVTFRfREVWSUNFCitpbnQgX19vbXBfZGV2aWNlX251bSA9IDA7CitzdGF0aWMgY29uc3QgY2hhciAqb21wX2RldmljZV9udW1fZW52bmFtZSA9ICJPTVBfREVGQVVMVF9ERVZJQ0UiOworCisvLyBUaGUgbGlzdCBvZiBwZW5kaW5nIHRhcmdldCBsaWJyYXJpZXMKK3N0YXRpYyBib29sICAgICAgICAgICAgX190YXJnZXRfbGliczsKK3N0YXRpYyBUYXJnZXRJbWFnZUxpc3QgX190YXJnZXRfbGlic19saXN0Oworc3RhdGljIG11dGV4X3QgICAgICAgICBfX3RhcmdldF9saWJzX2xvY2s7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgIHN0YWNrX2FsbG9jX2xvY2s7CisKKy8vIFRhcmdldCBleGVjdXRhYmxlCitUYXJnZXRJbWFnZSogICAgICAgICAgIF9fdGFyZ2V0X2V4ZTsKKworc3RhdGljIGNoYXIgKiBvZmZsb2FkX2dldF9zcmNfYmFzZSh2b2lkICogcHRyLCB1aW50OF90IHR5cGUpCit7CisgICAgY2hhciAqYmFzZTsKKyAgICBpZiAoVkFSX1RZUEVfSVNfUFRSKHR5cGUpKSB7CisgICAgICAgIGJhc2UgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19TQ0FMQVIodHlwZSkpIHsKKyAgICAgICAgYmFzZSA9IHN0YXRpY19jYXN0PGNoYXIqPihwdHIpOworICAgIH0KKyAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKHR5cGUpIHx8IFZBUl9UWVBFX0lTX0RWX0RBVEEodHlwZSkpIHsKKyAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSkgeworICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihwdHIpOworICAgICAgICAgICAgZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlKSA/CisgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PEFyckRlc2MqPihhcC0+YmFzZSkgOgorICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkdnAgPSAodHlwZSA9PSBjX2R2X2RhdGEpID8KKyAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihwdHIpIDoKKyAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KHB0cik7CisgICAgICAgIH0KKyAgICAgICAgYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGR2cC0+QmFzZSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBiYXNlID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIGJhc2U7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OnJlcG9ydF9jb2lfZXJyb3IoZXJyb3JfdHlwZXMgbXNnLCBDT0lSRVNVTFQgcmVzKQoreworICAgIC8vIHNwZWNpYWwgY2FzZSBmb3IgdGhlICdwcm9jZXNzIGRpZWQnIGVycm9yCisgICAgaWYgKHJlcyA9PSBDT0lfUFJPQ0VTU19ESUVEKSB7CisgICAgICAgIG1fZGV2aWNlLmZpbmlfcHJvY2Vzcyh0cnVlKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHN3aXRjaCAobXNnKSB7CisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZToKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IENPSV9PVVRfT0ZfTUVNT1JZKSB7CisgICAgICAgICAgICAgICAgICAgIG1zZyA9IGNfYnVmX2NyZWF0ZV9vdXRfb2ZfbWVtOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfYnVmX2NyZWF0ZV9mcm9tX21lbToKKyAgICAgICAgICAgIGNhc2UgY19idWZfZ2V0X2FkZHJlc3M6CisgICAgICAgICAgICBjYXNlIGNfcGlwZWxpbmVfY3JlYXRlOgorICAgICAgICAgICAgY2FzZSBjX3BpcGVsaW5lX3J1bl9mdW5jOgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IobXNnLCBtX2RldmljZS5nZXRfbG9naWNhbF9pbmRleCgpLCByZXMpOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfYnVmX3JlYWQ6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3dyaXRlOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9jb3B5OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9tYXA6CisgICAgICAgICAgICBjYXNlIGNfYnVmX3VubWFwOgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9kZXN0cm95OgorICAgICAgICAgICAgY2FzZSBjX2J1Zl9zZXRfc3RhdGU6CisgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihtc2csIHJlcyk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBleGl0KDEpOworfQorCitfT2ZmbG9hZF9yZXN1bHQgT2ZmbG9hZERlc2NyaXB0b3I6OnRyYW5zbGF0ZV9jb2lfZXJyb3IoQ09JUkVTVUxUIHJlcykgY29uc3QKK3sKKyAgICBzd2l0Y2ggKHJlcykgeworICAgICAgICBjYXNlIENPSV9TVUNDRVNTOgorICAgICAgICAgICAgcmV0dXJuIE9GRkxPQURfU1VDQ0VTUzsKKworICAgICAgICBjYXNlIENPSV9QUk9DRVNTX0RJRUQ6CisgICAgICAgICAgICByZXR1cm4gT0ZGTE9BRF9QUk9DRVNTX0RJRUQ7CisKKyAgICAgICAgY2FzZSBDT0lfT1VUX09GX01FTU9SWToKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX09VVF9PRl9NRU1PUlk7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiBPRkZMT0FEX0VSUk9SOworICAgIH0KK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6YWxsb2NfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBpbnQ2NF90IGFsbG9jX2Rpc3AsCisgICAgaW50IGFsaWduCispCit7CisgICAgLy8gdG90YWwgbGVuZ3RoIG9mIGJhc2UKKyAgICBpbnQ2NF90IGxlbmd0aCA9IGRpc3AgKyBzaXplOworICAgIGJvb2wgaXNfbmV3OworCisgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYXNzb2NpYXRpb24gZm9yIGRhdGE6IGFkZHIgJXAsIGxlbmd0aCAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgYmFzZSwgbGVuZ3RoKTsKKworICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmluc2VydF9wdHJfZGF0YShiYXNlLCBsZW5ndGgsIGlzX25ldyk7CisgICAgaWYgKGlzX25ldykgeworCisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkFkZGVkIG5ldyBhc3NvY2lhdGlvblxuIik7CisKKyAgICAgICAgaWYgKGxlbmd0aCA+IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9hbGxvY19idWZmZXJzKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXM7CisKKyAgICAgICAgICAgIC8vIGFsaWduIHNob3VsZCBiZSBhIHBvd2VyIG9mIDIKKyAgICAgICAgICAgIGlmIChhbGlnbiA+IDAgJiYgKGFsaWduICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAvLyBvZmZzZXQgd2l0aGluIG1pY19idWZmZXIuIENhbiBkbyBvZmZzZXQgb3B0aW1pemF0aW9uCisgICAgICAgICAgICAgICAgLy8gb25seSB3aGVuIHNvdXJjZSBhZGRyZXNzIGFsaWdubWVudCBzYXRpc2ZpZXMgcmVxdWVzdGVkCisgICAgICAgICAgICAgICAgLy8gYWxpZ25tZW50IG9uIHRoZSB0YXJnZXQgKGNxMTcyNzM2KS4KKyAgICAgICAgICAgICAgICBpZiAoKHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJhc2UpICYgKGFsaWduIC0gMSkpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihiYXNlKSAmIDQwOTU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBidWZmZXIgc2l6ZSBhbmQgZmxhZ3MKKyAgICAgICAgICAgIHVpbnQ2NF90IGJ1ZmZlcl9zaXplID0gbGVuZ3RoICsgcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICB1aW50MzJfdCBidWZmZXJfZmxhZ3MgPSAwOworCisgICAgICAgICAgICAvLyBjcmVhdGUgYnVmZmVyIHdpdGggbGFyZ2UgcGFnZXMgaWYgZGF0YSBsZW5ndGggZXhjZWVkcworICAgICAgICAgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICAgICAgICAgIGlmIChsZW5ndGggPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICAgICAgICAgIGJ1ZmZlcl9mbGFncyA9IENPSV9PUFRJTUlaRV9IVUdFX1BBR0VfU0laRTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gY3JlYXRlIENQVSBidWZmZXIKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICJDcmVhdGluZyBidWZmZXIgZnJvbSBzb3VyY2UgbWVtb3J5ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJsZW5ndGggJWxsZFxuIiwgYmFzZSwgbGVuZ3RoKTsKKworICAgICAgICAgICAgLy8gcmVzdWx0IGlzIG5vdCBjaGVja2VkIGJlY2F1c2Ugd2UgY2FuIGNvbnRpbnVlIHdpdGhvdXQgY3B1CisgICAgICAgICAgICAvLyBidWZmZXIuIEluIHRoaXMgY2FzZSB3ZSB3aWxsIHVzZSBDT0lCdWZmZXJSZWFkL1dyaXRlIGluc3RlYWQKKyAgICAgICAgICAgIC8vIG9mIENPSUJ1ZmZlckNvcHkuCisgICAgICAgICAgICBDT0k6OkJ1ZmZlckNyZWF0ZUZyb21NZW1vcnkobGVuZ3RoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZwdHJfZGF0YS0+Y3B1X2J1Zik7CisKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgzLAorICAgICAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX21pYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIkNyZWF0aW5nIGJ1ZmZlciBmb3Igc2luazogc2l6ZSAlbGxkLCBvZmZzZXQgJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImZsYWdzID0weCV4XG4iLCBidWZmZXJfc2l6ZSAtIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfb2Zmc2V0LCBidWZmZXJfZmxhZ3MpOworCisgICAgICAgICAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoYnVmZmVyX3NpemUgLSBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJfZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtX2RldmljZS5nZXRfcHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBtYWtlIGJ1ZmZlciB2YWxpZCBvbiB0aGUgZGV2aWNlLgorICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJTZXRTdGF0ZShwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfUFJPQ0VTU19TT1VSQ0UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfSU5WQUxJRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0JVRkZFUl9OT19NT1ZFLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3NldF9zdGF0ZSwgcmVzKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmFsbG9jX3B0cl9kYXRhX2xvY2sudW5sb2NrKCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgcHRyX2RhdGEtPmFsbG9jX2Rpc3AgPSBhbGxvY19kaXNwOworICAgICAgICBwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jay51bmxvY2soKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihwdHJfZGF0YS0+YWxsb2NfcHRyX2RhdGFfbG9jayk7CisKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiRm91bmQgZXhpc3RpbmcgYXNzb2NpYXRpb246IGFkZHIgJXAsIGxlbmd0aCAlbGxkLCAiCisgICAgICAgICAgICAgICAgICAgICAgImlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSwgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5pc19zdGF0aWMpOworCisgICAgICAgIC8vIFRoaXMgaXMgbm90IGEgbmV3IGVudHJ5LiBNYWtlIHN1cmUgdGhhdCBwcm92aWRlZCBhZGRyZXNzIHJhbmdlIGZpdHMKKyAgICAgICAgLy8gaW50byBleGlzdGluZyBvbmUuCisgICAgICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoIC0gcHRyX2RhdGEtPmFsbG9jX2Rpc3ApOworICAgICAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2JhZF9wdHJfbWVtX3JhbmdlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpZiB0aGUgZW50cnkgaXMgYXNzb2NpYXRlZCB3aXRoIHN0YXRpYyBkYXRhIGl0IG1heSBub3QgaGF2ZSBidWZmZXJzCisgICAgICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICAgICAgaWYgKHB0cl9kYXRhLT5pc19zdGF0aWMgJiYgIWluaXRfc3RhdGljX3B0cl9kYXRhKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmZpbmRfcHRyX2RhdGEoCisgICAgUHRyRGF0YSogJnB0cl9kYXRhLAorICAgIHZvaWQgKmJhc2UsCisgICAgaW50NjRfdCBkaXNwLAorICAgIGludDY0X3Qgc2l6ZSwKKyAgICBib29sIHJlcG9ydF9lcnJvcgorKQoreworICAgIC8vIHRvdGFsIGxlbmd0aCBvZiBiYXNlCisgICAgaW50NjRfdCBsZW5ndGggPSBkaXNwICsgc2l6ZTsKKworICAgIE9GRkxPQURfVFJBQ0UoMywgIkxvb2tpbmcgZm9yIGFzc29jaWF0aW9uIGZvciBkYXRhOiBhZGRyICVwLCAiCisgICAgICAgICAgICAgICAgICAibGVuZ3RoICVsbGRcbiIsIGJhc2UsIGxlbmd0aCk7CisKKyAgICAvLyBmaW5kIGV4aXN0aW5nIGFzc29jaWF0aW9uIGluIHBvaW50ZXIgdGFibGUKKyAgICBwdHJfZGF0YSA9IG1fZGV2aWNlLmZpbmRfcHRyX2RhdGEoYmFzZSk7CisgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgaWYgKHJlcG9ydF9lcnJvcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX25vX3B0cl9kYXRhLCBiYXNlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQXNzb2NpYXRpb24gZG9lcyBub3QgZXhpc3RcbiIpOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJGb3VuZCBhc3NvY2lhdGlvbjogYmFzZSAlcCwgbGVuZ3RoICVsbGQsIGlzX3N0YXRpYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpLCBwdHJfZGF0YS0+Y3B1X2FkZHIubGVuZ3RoKCksCisgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+aXNfc3RhdGljKTsKKworICAgIC8vIG1ha2Ugc3VyZSB0aGF0IHByb3ZpZGVkIGFkZHJlc3MgcmFuZ2UgZml0cyBpbnRvIGV4aXN0aW5nIG9uZQorICAgIE1lbVJhbmdlIGFkZHJfcmFuZ2UoYmFzZSwgbGVuZ3RoKTsKKyAgICBpZiAoIXB0cl9kYXRhLT5jcHVfYWRkci5jb250YWlucyhhZGRyX3JhbmdlKSkgeworICAgICAgICBpZiAocmVwb3J0X2Vycm9yKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfYmFkX3B0cl9tZW1fcmFuZ2UpOworICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgfQorICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJFeGlzdGluZyBhc3NvY2lhdGlvbiBwYXJ0aWFsbHkgb3ZlcmxhcHMgd2l0aCAiCisgICAgICAgICAgICAgICAgICAgICAgImRhdGEgYWRkcmVzcyByYW5nZVxuIik7CisgICAgICAgIHB0cl9kYXRhID0gMDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgLy8gaWYgdGhlIGVudHJ5IGlzIGFzc29jaWF0ZWQgd2l0aCBzdGF0aWMgZGF0YSBpdCBtYXkgbm90IGhhdmUgYnVmZmVycworICAgIC8vIGNyZWF0ZWQgYmVjYXVzZSB0aGV5IGFyZSBjcmVhdGVkIG9uIGRlbWFuZC4KKyAgICBpZiAocHRyX2RhdGEtPmlzX3N0YXRpYyAmJiAhaW5pdF9zdGF0aWNfcHRyX2RhdGEocHRyX2RhdGEpKSB7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6aW5pdF9zdGF0aWNfcHRyX2RhdGEoUHRyRGF0YSAqcHRyX2RhdGEpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2FsbG9jX2J1ZmZlcnMpOworCisgICAgaWYgKHB0cl9kYXRhLT5jcHVfYnVmID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9UUkFDRSgzLCAiQ3JlYXRpbmcgYnVmZmVyIGZyb20gc291cmNlIG1lbW9yeSAlbGx4XG4iLAorICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICAwLAorICAgICAgICAgICAgY29uc3RfY2FzdDx2b2lkKj4ocHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPmNwdV9idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIkNyZWF0aW5nIGJ1ZmZlciBmcm9tIHNpbmsgbWVtb3J5ICVsbHhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19hZGRyKTsKKworICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGVGcm9tTWVtb3J5KAorICAgICAgICAgICAgcHRyX2RhdGEtPmNwdV9hZGRyLmxlbmd0aCgpLAorICAgICAgICAgICAgQ09JX0JVRkZFUl9OT1JNQUwsCisgICAgICAgICAgICBDT0lfU0lOS19NRU1PUlksCisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PHZvaWQqPihwdHJfZGF0YS0+bWljX2FkZHIpLAorICAgICAgICAgICAgMSwgJm1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19idWYpOworCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NyZWF0ZV9mcm9tX21lbSwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKQoreworICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwICYmIHB0cl9kYXRhLT5taWNfYWRkciA9PSAwKSB7CisgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlckdldFNpbmtBZGRyZXNzKHB0cl9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2dldF9hZGRyZXNzLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpudWxsaWZ5X3RhcmdldF9zdGFjaygKKyAgICBDT0lCVUZGRVIgdGFyZ19idWYsCisgICAgdWludDY0X3Qgc2l6ZQorKQoreworICAgIGNoYXIgKiBwdHIgPSAoY2hhciopbWFsbG9jKHNpemUpOworICAgIENPSVJFU1VMVCByZXM7CisKKyAgICBtZW1zZXQocHRyLCAwLCBzaXplKTsKKyAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICB0YXJnX2J1ZiwKKyAgICAgICAgMCwKKyAgICAgICAgcHRyLAorICAgICAgICBzaXplLAorICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgZnJlZShwdHIpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl93cml0ZSwgcmVzKTsKKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6Om9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLAorICAgIGludCAgcm91dGluZV9pZCwKKyAgICBpbnQgIGJ1Zl9zaXplLAorICAgIGludCAgYWxpZ24sCisgICAgYm9vbCAqaXNfbmV3KQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihzdGFja19hbGxvY19sb2NrKTsKKworICAgIFBlcnNpc3REYXRhICogbmV3X2VsOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfYmVnaW4gPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgIFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXRfZW5kOworICAgIGludCBlcmFzZSA9IDA7CisKKyAgICAqaXNfbmV3ID0gZmFsc2U7CisKKyAgICBmb3IgKFBlcnNpc3REYXRhTGlzdDo6aXRlcmF0b3IgaXQgPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5iZWdpbigpOworICAgICAgICBpdCAhPSBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBQZXJzaXN0RGF0YSBjdXJfZWwgPSAqaXQ7CisKKyAgICAgICAgaWYgKHN0YWNrX2JlZ2luID4gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgIG1fZGVzdHJveV9zdGFjay5wdXNoX2Zyb250KGN1cl9lbC5zdGFja19wdHJfZGF0YSk7CisgICAgICAgICAgICBpdF9lbmQgPSBpdDsKKyAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RhY2tfYmVnaW4gPT0gaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBpZiAocm91dGluZV9pZCAhPSBpdC0+IHJvdXRpbmVfaWQpIHsKKyAgICAgICAgICAgICAgICAvLyB0aGlzIHN0YWNrIGRhdGEgbXVzdCBiZSBkZXN0cm95ZWQKKyAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2sucHVzaF9mcm9udChjdXJfZWwuc3RhY2tfcHRyX2RhdGEpOworICAgICAgICAgICAgICAgIGl0X2VuZCA9IGl0OworICAgICAgICAgICAgICAgIGVyYXNlKys7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBzdGFjayBkYXRhIGlzIHJldXNlZAorICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEgPSBpdC0+c3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGVyYXNlID4gMCkgeworICAgICAgICAgICAgICAgICAgICAvLyBhbGwgb2Jzb2xldGUgc3RhY2sgc2VjdGlvbnMgbXVzdCBiZSBlcmFzZWQgZnJvbSB0aGUgbGlzdAorICAgICAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5lcmFzZShpdF9iZWdpbiwgKytpdF9lbmQpOworCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPQorICAgICAgICAgICAgICAgICAgICAgICAgZXJhc2UgKiBzaXplb2YobmV3X2VsLT5zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZXVzZSBvZiBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHN0YWNrX2JlZ2luIDwgaXQtPnN0YWNrX2NwdV9hZGRyKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChlcmFzZSA+IDApIHsKKyAgICAgICAgLy8gYWxsIG9ic29sZXRlIHN0YWNrIHNlY3Rpb25zIG11c3QgYmUgZXJhc2VkIGZyb20gdGhlIGxpc3QKKyAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZXJhc2UoaXRfYmVnaW4sICsraXRfZW5kKTsKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IGVyYXNlICogc2l6ZW9mKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICB9CisgICAgLy8gbmV3IHN0YWNrIHRhYmxlIGlzIGNyZWF0ZWQKKyAgICBuZXdfZWwgPSBuZXcgUGVyc2lzdERhdGEoc3RhY2tfYmVnaW4sIHJvdXRpbmVfaWQsIGJ1Zl9zaXplKTsKKyAgICAvLyBjcmVhdGUgTUlDIGJ1ZmZlcgorICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgYnVmZmVyX2ZsYWdzID0gMDsKKworICAgIC8vIGNyZWF0ZSBidWZmZXIgd2l0aCBsYXJnZSBwYWdlcyBpZiBkYXRhIGxlbmd0aCBleGNlZWRzCisgICAgLy8gbGFyZ2UgcGFnZSB0aHJlc2hvbGQKKyAgICBpZiAoYnVmX3NpemUgPj0gX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVycykgeworICAgICAgICBidWZmZXJfZmxhZ3MgPSBDT0lfT1BUSU1JWkVfSFVHRV9QQUdFX1NJWkU7CisgICAgfQorICAgIHJlcyA9IENPSTo6QnVmZmVyQ3JlYXRlKGJ1Zl9zaXplLAorICAgICAgICBDT0lfQlVGRkVSX05PUk1BTCwKKyAgICAgICAgYnVmZmVyX2ZsYWdzLAorICAgICAgICAwLAorICAgICAgICAxLAorICAgICAgICAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgJm5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gbWFrZSBidWZmZXIgdmFsaWQgb24gdGhlIGRldmljZS4KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIG1fZGV2aWNlLmdldF9wcm9jZXNzKCksCisgICAgICAgIENPSV9CVUZGRVJfVkFMSUQsCisgICAgICAgIENPSV9CVUZGRVJfTk9fTU9WRSwKKyAgICAgICAgMCwgMCwgMCk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChtX2lzX21hbmRhdG9yeSkgeworICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9zZXRfc3RhdGUsIHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXMgPSBDT0k6OkJ1ZmZlclNldFN0YXRlKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgIENPSV9QUk9DRVNTX1NPVVJDRSwKKyAgICAgICAgQ09JX0JVRkZFUl9JTlZBTElELAorICAgICAgICBDT0lfQlVGRkVSX05PX01PVkUsCisgICAgICAgIDAsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAobV9pc19tYW5kYXRvcnkpIHsKKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfc2V0X3N0YXRlLCByZXMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisgICAgLy8gcGVyc2lzdGVuY2UgYWxnb3JpdGhtIHJlcXVpcmVzIHRhcmdldCBzdGFjayBpbml0aWFseSB0byBiZSBudWxsaWZpZWQKKyAgICBpZiAoIW51bGxpZnlfdGFyZ2V0X3N0YWNrKG5ld19lbC0+c3RhY2tfcHRyX2RhdGEtPm1pY19idWYsIGJ1Zl9zaXplKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zdGFja19wdHJfZGF0YSA9IG5ld19lbC0+c3RhY2tfcHRyX2RhdGE7CisgICAgaW5pdF9taWNfYWRkcmVzcyhtX3N0YWNrX3B0cl9kYXRhKTsKKyAgICBPRkZMT0FEX1RSQUNFKDMsICJBbGxvY2F0aW5nIHN0YWNrIGJ1ZmZlciB3aXRoIGFkZHIgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbV9zdGFja19wdHJfZGF0YS0+bWljX2FkZHIpOworICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LnB1c2hfZnJvbnQoKm5ld19lbCk7CisgICAgaW5pdF9taWNfYWRkcmVzcyhuZXdfZWwtPnN0YWNrX3B0cl9kYXRhKTsKKyAgICAqaXNfbmV3ID0gdHJ1ZTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2V0dXBfZGVzY3JpcHRvcnMoCisgICAgVmFyRGVzYyAqdmFycywKKyAgICBWYXJEZXNjMiAqdmFyczIsCisgICAgaW50IHZhcnNfdG90YWwsCisgICAgaW50IGVudHJ5X2lkLAorICAgIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIKKykKK3sKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMpOworCisgICAgLy8gbWFrZSBhIGNvcHkgb2YgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBtX3ZhcnNfdG90YWwgPSB2YXJzX3RvdGFsOworICAgIGlmICh2YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyhtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtZW1jcHkobV92YXJzLCB2YXJzLCBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYykpOworICAgICAgICBtX3ZhcnNfZXh0cmEgPSAoVmFyRXh0cmEqKSBtYWxsb2MobV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgfQorCisgICAgLy8gZGVwZW5kZW5jaWVzCisgICAgbV9pbl9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiAobV92YXJzX3RvdGFsICArIDEpKTsKKyAgICBpZiAobV92YXJzX3RvdGFsID4gMCkgeworICAgICAgICBtX291dF9kZXBzID0gKENPSUVWRU5UKikgbWFsbG9jKHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworICAgIH0KKworICAgIC8vIGNvcHlpbi9jb3B5b3V0IGRhdGEgbGVuZ3RoCisgICAgbV9pbl9kYXRhbGVuID0gMDsKKyAgICBtX291dF9kYXRhbGVuID0gMDsKKworICAgIC8vIEZpcnN0IHBhc3Mgb3ZlciB2YXJpYWJsZSBkZXNjcmlwdG9ycworICAgIC8vIC0gQ2FsY3VsYXRlIHNpemUgb2YgdGhlIGlucHV0IGFuZCBvdXRwdXQgbm9uLXBvaW50ZXIgZGF0YQorICAgIC8vIC0gQWxsb2NhdGUgYnVmZmVycyBmb3IgaW5wdXQgYW5kIG91dHB1dCBwb2ludGVycworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgdm9pZCogICBhbGxvY19iYXNlID0gTlVMTDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19kaXNwID0gMDsKKyAgICAgICAgaW50NjRfdCBhbGxvY19zaXplOworICAgICAgICBib29sICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisKKyAgICAgICAgY29uc3QgY2hhciAqdmFyX3NuYW1lID0gIiI7CisgICAgICAgIGlmICh2YXJzMiAhPSBOVUxMICYmIGkgPCB2YXJzX3RvdGFsKSB7CisgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIHZhcl9zbmFtZSA9IHZhcnMyW2ldLnNuYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgaSwgdmFyX3NuYW1lLAorICAgICAgICAgICAgdmFyZGVzY19kaXJlY3Rpb25fYXNfc3RyaW5nW21fdmFyc1tpXS5kaXJlY3Rpb24uYml0c10sCisgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICBpZiAodmFyczIgIT0gTlVMTCAmJiBpIDwgdmFyc190b3RhbCAmJiB2YXJzMltpXS5kbmFtZSAhPSBOVUxMKSB7CisgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsICIgICAgICAgICAgICAgIGludG89JXMsICVzXG4iLCB2YXJzMltpXS5kbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwLCBpbnRvPSVwXG4iLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjLAorICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0LAorICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmLAorICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxpZ24sCisgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5iaXRzLAorICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LAorICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgIGNvbnN0IGFycl9kZXNjICphcCA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uYWxsb2MpOworCisgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiQUxMT0MiLCBhcCwgMCk7CisKKyAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGFsbG9jX2Rpc3AsIGFsbG9jX3NpemUpOworCisgICAgICAgICAgICBhbGxvY19iYXNlID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSAwOworICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0gMDsKKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9IDA7CisgICAgICAgIC8vIGZsYWcgaXNfYXJyX3B0cl9lbCBpcyAxIG9ubHkgZm9yIHZhcl9kZXNjcyBnZW5lcmF0ZWQKKyAgICAgICAgLy8gZm9yIGNfZGF0YV9wdHJfYXJyYXkgdHlwZQorICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5pc19hcnJfcHRyX2VsID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuc3JjKSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IFZhckRlc2MzICp2ZDMgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgVmFyRGVzYzMqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaW50IGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgZmxhZ3MgPSAlMDR4XG4iLCBmbGFncyk7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgIHBvaW50ZXIgYXJyYXkgdHlwZSBpcyAlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIHZhcmRlc2NfdHlwZV9hc19zdHJpbmdbZmxhZ3MgJiAweDNmXSk7CisgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPnB0cl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiICAgICAgICAgICAgICAiLCAicHRyIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImludG8gYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+YWxpZ25fYXJyYXkpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJhbGlnbiBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2lmIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19mcmVlX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+ZnJlZV9pZl9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImZyZWVfaWYgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmV4dGVudF9zdGFydCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImV4dGVudF9zdGFydCBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBleHRlbnRfc3RhcnQgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAodmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJleHRlbnRfZWxlbWVudHMgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgZXh0ZW50X2VsZW1lbnRzIHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+ZXh0ZW50X2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fc3RhcnQpOworICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICAgICAgICAgICAgICIsICJpbnRvX3N0YXJ0IGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19pbnRvX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBpbnRvX3N0YXJ0IHNjYWxhciA9ICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChpbnQ2NF90KXZkMy0+aW50b19zdGFydCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5pbnRvX2VsZW1lbnRzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiaW50b19lbGVtZW50cyBhcnJheSIsIGFwLCAwKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmICgoZmxhZ3MgJgorICAgICAgICAgICAgICAgICAgICAgICAgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgaW50b19lbGVtZW50cyBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19hbGxvY19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICAiLCAiYWxsb2Nfc3RhcnQgYXJyYXkiLCBhcCwgMCk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoKGZsYWdzICYKKyAgICAgICAgICAgICAgICAgICAgICAgICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgICAgICAgICAgICBhbGxvY19zdGFydCBzY2FsYXIgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoaW50NjRfdCl2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgIiwgImFsbG9jX2VsZW1lbnRzIGFycmF5IiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKChmbGFncyAmCisgICAgICAgICAgICAgICAgICAgICAgICAoMTw8ZmxhZ19hbGxvY19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiAgICAgICAgICAgICAgYWxsb2NfZWxlbWVudHMgc2NhbGFyID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGludDY0X3QpdmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCFnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGkpKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIC8vIEluIGFsbCB1c2VzIGxhdGVyCisgICAgICAgICAgICAgICAgLy8gVmFyRGVzYy5zaXplIHdpbGwgaGF2ZSB0aGUgbGVuZ3RoIG9mIHRoZSBkYXRhIHRvIGJlCisgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQKKyAgICAgICAgICAgICAgICAvLyBWYXJEZXNjLmRpc3Agd2lsbCBoYXZlIGFuIG9mZnNldCBmcm9tIGJhc2UKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2Rlc2NfZHVtcCgiIiwgIklOL09VVCIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gbWFrZSBzdXJlIHRoYXQgdHJhbnNmZXIgc2l6ZSA+IDAKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5zaXplIDw9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ190cmFuc2Zlcl9zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5wdHIgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50byA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IHB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN0YXRpYyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgYnkgb21wIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVwZGF0ZSBjb25zdHJ1Y3Qgd2hpY2ggcGFzc2VzIHplcm9zIGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jX2lmIGFuZCBmcmVlX2lmLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIEF1dG9EYXRhICphdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgPSBtX2RldmljZS5pbnNlcnRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciwgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmFkZF9yZWZlcmVuY2UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IHdoYXQgc2hvdWxkIGJlIGRvbmUgaWYgdmFyIGlzIG5vdCBpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgdGFibGU/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGF1dG9fZGF0YSA9IG1fZGV2aWNlLmZpbmRfYXV0b19kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGF1dG9tYXRpYyB2YXJpYWJsZXMgZGF0YSBpcyB0cmFuc2ZlcnJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9ubHkgaWYgYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgobV92YXJzW2ldLmFsbG9jX2lmIHx8IG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEgIT0gMCAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhdXRvX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIGRhdGEgZm9yIGxhdGVyIHVzZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGEgPSBhdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIG5vbi1zdGF0aWMgdGFyZ2V0IGRlc3RpbmF0aW9uIGRlZmluZWQgYXMgQ0VBTgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZXhwcmVzc2lvbiB3ZSBwYXNzIHRvIHRhcmdldCBpdHMgc2l6ZSBhbmQgZGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMgPT0gY19jZWFuX3ZhcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSAyICogc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU4vT1VUIiwgZHZwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGNvbnRlbnRzIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IDE7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5jb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4oKnN0YXRpY19jYXN0PGNoYXIqKj4obV92YXJzW2ldLnB0cikpICsgMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLyogZmFsbHRocnUgKi8KKworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHRoaXMgdmFyX2Rlc2MgaXMgZm9yIHN0YWNrIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICBib29sIGlzX25ldzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIW9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhY2tfYWRkciwgZW50cnlfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmNvdW50LCBtX3ZhcnNbaV0uYWxpZ24sICZpc19uZXcpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGlzX25ldykgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhY2tfcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UubV9wZXJzaXN0X2xpc3QuZnJvbnQoKS5jcHVfc3RhY2tfYWRkciA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKG1fc3RhY2tfcHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9IG1fZGVzdHJveV9zdGFjay5zaXplKCk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA9IG1fc3RhY2tfcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvKiBmYWxsdGhydSAqLworCisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXJfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwID0KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiIsICJJTi9PVVQiLCBhcCwgMSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUgYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kYXRhX29mZnNldF9hbmRfbGVuZ3RoKGFwLCBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIGFsbCBuZWNlc3NhcnkgaW5mb3JtYXRpb24gYWJvdXQgbGVuZ3RoIGFuZCBvZmZzZXQgaXMKKyAgICAgICAgICAgICAgICAgICAgLy8gdHJhbnNmZXJyZWQgaW4gdmFyIGRlc2NyaXB0b3IuIFRoZXJlIGlzIG5vIG5lZWQgdG8gc2VuZAorICAgICAgICAgICAgICAgICAgICAvLyBhcnJheSBkZXNjcmlwdG9yIHRvIHRoZSB0YXJnZXQgc2lkZS4KKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfcHRyKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gc2VuZCBEViB0byB0aGUgZGV2aWNlIHVubGVzcyBpdCBpcyAnbm9jb3B5JworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOL09VVCIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gbm8gZGlzcGxhY2VtZW50CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGNfZGF0YV9wdHIgb3IgY19zdHJpbmdfcHRyCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplICo9IG1fdmFyc1tpXS5jb3VudDsKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AgPSAwOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGNoZWNrIHRoYXQgYnVmZmVyIGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwICsgbV92YXJzW2ldLnNpemUgPCAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfemVyb19vcl9uZWdfcHRyX2xlbik7CisgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYmFzZSBhZGRyZXNzCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJhc2UgPSAqc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY2F0ZSBidWZmZXIgaWYgd2UgaGF2ZSBubyBJTlRPIGFuZCBkb24ndCBuZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRpb24gZm9yIHRoZSBwdHIgYXQgdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBmb3Igc3RhY2sgcGVyc2lzdGVudCBvYmplY3RzIHB0ciBkYXRhIGlzIGNyZWF0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBieSB2YXJfZGVzYyB3aXRoIG51bWJlciAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEl0cyBwdHJfZGF0YSBpcyBzdG9yZWQgYXQgbV9zdGFja19wdHJfZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhID0gbV9zdGFja19wdHJfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS5hbGxvY19pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFkZCBuZXcgZW50cnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWFsbG9jX3B0cl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AgOiBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0uYWxpZ24pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIGJ1ZmZlciB0byB0aGUgbGlzdCBvZiBidWZmZXJzIHRoYXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjaygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgc2VuZCBidWZmZXIgYWRkcmVzcyB0byBkZXZpY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFwdHJfZGF0YS0+aXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gYWRkIHJlZmVyZW5jZSBmb3IgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBlcnJvcl9pZl9ub3RfZm91bmQgPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3Igb21wIHRhcmdldCB1cGRhdGUgdmFyaWFibGUgaXMgaWdub3JlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBpZiBpdCBkb2VzIG5vdCBleGlzdC4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kID0gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2lmX25vdF9mb3VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYWtlIHZhciBub2NvcHkgaWYgaXQgZG9lcyBub3QgZXhpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19wYXJhbWV0ZXJfbm9jb3B5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX2lzX29wZW5tcCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkYXRhIGlzIHRyYW5zZmVycmVkIG9ubHkgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NfaWYgPT0gMCAmJiBmcmVlX2lmID09IDAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gb3IgcmVmZXJlbmNlIGNvdW50IGlzIDEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKChtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5nZXRfcmVmZXJlbmNlKCkgIT0gMSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuYWxsb2NfZGlzcCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YocHRyX2RhdGEtPm1pY19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBvbiB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgdG8gYmFzZSBmcm9tIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGJ1ZmZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgPSAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY29weSBvdGhlciBwb2ludGVyIHByb3BlcnRpZXMgdG8gdmFyIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMgPSBwdHJfZGF0YS0+aXNfc3RhdGljOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzYXZlIHBvaW50ZXIgZGF0YQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEgPSBwdHJfZGF0YTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gX19vZmZsb2FkX2Z1bmNzLm1heF9uYW1lX2xlbmd0aCgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQpIHsKKyAgICAgICAgICAgICAgICAgICAgbV9vdXRfZGF0YWxlbiArPSBfX29mZmxvYWRfZnVuY3MubWF4X25hbWVfbGVuZ3RoKCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwOworICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKj4oYXAtPmJhc2UpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKnJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyoqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkdnAgPSAobV92YXJzW2ldLnR5cGUuc3JjID09IGNfZHZfZGF0YSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLnB0cikgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBpZiBhbGxvY2F0YWJsZSBkb3BlIHZlY3RvciBpc24ndCBhbGxvY2F0ZWQgZG9uJ3QKKyAgICAgICAgICAgICAgICAvLyB0cmFuc2ZlciBpdHMgZGF0YQorICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19hbGxvY2F0ZWQoZHZwKSkgeworICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiA9IDA7CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworCisgICAgICAgICAgICAgICAgICAgIGlmIChWQVJfVFlQRV9JU19EVl9EQVRBX1NMSUNFKG1fdmFyc1tpXS50eXBlLnNyYykpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGVzY19kdW1wKCIiLCAiSU4vT1VUIiwgYXAsIDApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmICghX19kdl9pc19jb250aWd1b3VzKGR2cCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2R2KGR2cCk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBzaXplIGFuZCBkaXNwbGFjZW1lbnQKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IGFuZCBsZW5ndGggYXJlIGRlcml2ZWQgZnJvbSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFycmF5IGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfc2xpY2Vfb2Zfbm9uY29udF9hcnJheSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0X3JlYWRfcmFuZ2VzX2Fycl9kZXNjKGFwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmhhc19sZW5ndGgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPSBfX2R2X2RhdGFfbGVuZ3RoKGR2cCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBjaGVjayB0aGF0IGxlbmd0aCA+PSAwCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZGlzcCArIG1fdmFyc1tpXS5zaXplIDwgMCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY196ZXJvX29yX25lZ19wdHJfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworCisgICAgICAgICAgICAgICAgICAgIC8vIGFsbG9jYXRlIGJ1ZmZlciBpZiB3ZSBoYXZlIG5vIElOVE8gYW5kIGRvbid0IG5lZWQKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGlvbiBmb3IgdGhlIHB0ciBhdCB0YXJnZXQKKyAgICAgICAgICAgICAgICAgICAgaWYgKHNyY19pc19mb3JfbWljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGFsbG9jX2Jhc2UgIT0gTlVMTCkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBib29sIGVycm9yX2lmX25vdF9mb3VuZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBvbXAgdGFyZ2V0IHVwZGF0ZSB2YXJpYWJsZSBpcyBpZ25vcmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGl0IGRvZXMgbm90IGV4aXN0LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9pZl9ub3RfZm91bmQgPSBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBleGlzdGluZyBhc3NvY2lhdGlvbiBmcm9tIHBvaW50ZXIgdGFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWZpbmRfcHRyX2RhdGEocHRyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfaWZfbm90X2ZvdW5kKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1ha2UgdmFyIG5vY29weSBpZiBpdCBkb2VzIG5vdCBleGlzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3BhcmFtZXRlcl9ub2NvcHk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRhdGEgaXMgdHJhbnNmZXJyZWQgb25seSBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhbGxvY19pZiA9PSAwICYmIGZyZWVfaWYgPT0gMAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvciByZWZlcmVuY2UgY291bnQgaXMgMQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoKG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPmdldF9yZWZlcmVuY2UoKSAhPSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfcGFyYW1ldGVyX25vY29weTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihhbGxvY19kaXNwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBnZXQgYnVmZmVycydzIGFkZHJlc3Mgb24gdGhlIHNpbmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX25lZWRfcnVuZnVuY3Rpb24gPSB0cnVlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjb3B5IG90aGVyIHBvaW50ZXIgcHJvcGVydGllcyB0byB2YXIgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ID0gcHRyX2RhdGEtPm1pY19vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA9IHB0cl9kYXRhLT5pc19zdGF0aWM7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7IC8vICFzcmNfaXNfZm9yX21pYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmFsc2UpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCA9ICFwdHJfZGF0YSA/IDAgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGFfcHRyX2FycmF5KSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYyAmJiBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmKSB7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpIC0KKyAgICAgICAgICAgICAgICBtX2RldmljZS5tX3BlcnNpc3RfbGlzdC5mcm9udCgpLmNwdV9zdGFja19hZGRyOworICAgICAgICB9CisgICAgICAgIC8vIGlmIHNvdXJjZSBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvID09IE5VTEwgfHwgbV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgPSBtX3ZhcnNbaV0ub2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmICJpbnRvIiBpcyBkZWZpbmUgd2UgbmVlZCB0byBkbyB0aGUgc2ltaWxhciB3b3JrIGZvciBpdAorICAgICAgICBpZiAoIW1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGludDY0X3QgaW50b19kaXNwID0wLCBpbnRvX29mZnNldCA9IDA7CisKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOiB7CisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplID0gbV92YXJzW2ldLnNpemU7CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKj4oYXAtPmJhc2UpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9zcmMgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYykgOgorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0gbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA/CisgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIDoKKyAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAvLyBJdCdzIHN1cHBvc2VkIHRoYXQgImludG8iIHNpemUgbXVzdCBiZSBub3QgbGVzcworICAgICAgICAgICAgICAgIC8vIHRoYW4gc3JjIHNpemUKKyAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfZGlmZmVyZW50X3NyY19hbmRfZHN0bl9zaXplcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3NyYywgc2l6ZV9kc3QpOworICAgICAgICAgICAgICAgICAgICBleGl0KDEpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZpbmQgZGF0YSBhc3NvY2lhdGVkIHdpdGggdmFyaWFibGUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwgbV92YXJzW2ldLmludG8sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19kaXNwLCBzaXplLCBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG9mZnNldCB0byBiYXNlIGZyb20gdGhlIGJlZ2lubmluZyBvZiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWVtb3J5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIG1fdmFyc1tpXS5pbnRvIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKSBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0biA9IGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICAvLyBmb3Igbm9uLXN0YXRpYyB0YXJnZXQgZGVzdGluYXRpb24gZGVmaW5lZCBhcyBDRUFOCisgICAgICAgICAgICAgICAgICAgIC8vIGV4cHJlc3Npb24gd2UgcGFzcyB0byB0YXJnZXQgaXRzIHNpemUgYW5kIGRpc3QKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gMiAqIHNpemVvZih1aW50NjRfdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnAgPSBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIC8vIGRlYnVnIGR1bXAKKyAgICAgICAgICAgICAgICAgICAgX19kdl9kZXNjX2R1bXAoIklOVE8iLCBkdnApOworCisgICAgICAgICAgICAgICAgICAgIC8vIHNlbmQgZG9wZSB2ZWN0b3IgY29udGVudHMgZXhjbHVkaW5nIGJhc2UKKyAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc1tpXS5zaXplIC0gc2l6ZW9mKHVpbnQ2NF90KTsKKyAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19zdHJpbmdfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHI6IHsKKyAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19jZWFuX3Zhcl9wdHIpIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gYXJyYXkgZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICBjb25zdCBhcnJfZGVzYyAqYXAgPQorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVidWcgZHVtcAorICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAxKTsKKworICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheSBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgIF9fYXJyX2RhdGFfb2Zmc2V0X2FuZF9sZW5ndGgoYXAsIGludG9fZGlzcCwgc2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFjZWFuX3Jhbmdlc19tYXRjaCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3Jhbmdlc19kb250X21hdGNoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihhcC0+YmFzZSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X3B0cikgeworICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHNlbmQgRFYgdG8gdGhlIGRldmljZSB1bmxlc3MgaXQgaXMgJ25vY29weScKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2R2X2Rlc2NfZHVtcCgiSU5UTyIsIGR2cCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9IG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMgPworICAgICAgICAgICAgICAgICAgICBjZWFuX2dldF90cmFuc2Zfc2l6ZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA6CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZV9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID8KKyAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICBzaXplOworICAgICAgICAgICAgICAgIC8vIEl0J3Mgc3VwcG9zZWQgdGhhdCAiaW50byIgc2l6ZSBtdXN0IGJlIG5vdCBsZXNzIHRoYW4KKyAgICAgICAgICAgICAgICAvLyBzcmMgc2l6ZQorICAgICAgICAgICAgICAgIGlmIChzaXplX3NyYyA+IHNpemVfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kaWZmZXJlbnRfc3JjX2FuZF9kc3RuX3NpemVzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfc3JjLCBzaXplX2RzdCk7CisgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cykgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YTsKKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9ICpzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5pbnRvKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBzdGFjayBwZXJzaXN0ZW50IG9iamVjdHMgcHRyIGRhdGEgaXMgY3JlYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHZhcl9kZXNjIHdpdGggbnVtYmVyIDAuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gSXRzIHB0cl9kYXRhIGlzIHN0b3JlZCBhdCBtX3N0YWNrX3B0cl9kYXRhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3N0YWNrX3B0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWRkX3JlZmVyZW5jZSgpID09IDAgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMgdGhhdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkciA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+YWxsb2NfZGlzcCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmFsbG9jX2Rpc3AgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiArPSBzaXplb2YoYWxsb2NfZGlzcCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZ2V0IGJ1ZmZlcnMncyBhZGRyZXNzIG9uIHRoZSBzaW5rCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpbml0X21pY19hZGRyZXNzKHB0cl9kYXRhKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kYXRhbGVuICs9IHNpemVvZihwdHJfZGF0YS0+bWljX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMgJiYgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIG9uIHRhcmdldAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fbmVlZF9ydW5mdW5jdGlvbiA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmYWxzZSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHB0cl9kYXRhKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnRvX29mZnNldCA9IHB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBjYXNlIGNfZnVuY19wdHI6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyB8fAorICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgY29uc3QgYXJyX2Rlc2MgKmFwOworICAgICAgICAgICAgICAgICAgICBBcnJEZXNjICpkdnA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3A7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZWJ1ZyBkdW1wCisgICAgICAgICAgICAgICAgICAgICAgICBfX2Fycl9kZXNjX2R1bXAoIiAgICAiLCAiSU5UTyIsIGFwLCAwKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgZHZwID0gKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KGFwLT5iYXNlKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KGFwLT5iYXNlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGR2cCA9IChtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxBcnJEZXNjKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxBcnJEZXNjKio+KG1fdmFyc1tpXS5pbnRvKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIV9fZHZfaXNfY29udGlndW91cyhkdnApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdF9yZWFkX3Jhbmdlc19kdihkdnApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIC8vIHNpemUgYW5kIGRpc3BsYWNlbWVudAorICAgICAgICAgICAgICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVzY3JpcHRvcgorICAgICAgICAgICAgICAgICAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgaW50b19kaXNwLCBzaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWlzX2Fycl9kZXNjX2NvbnRpZ3VvdXMoYXApKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19zbGljZV9vZl9ub25jb250X2FycmF5KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXRfcmVhZF9yYW5nZXNfYXJyX2Rlc2MoYXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIWNlYW5fcmFuZ2VzX21hdGNoKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmFuZ2VzX2RvbnRfbWF0Y2gpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5oYXNfbGVuZ3RoKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwLCBtX3ZhcnNbaV0uY291bnQpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZSA9IF9fZHZfZGF0YV9sZW5ndGgoZHZwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplX3NyYyA9CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjID8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNlYW5fZ2V0X3RyYW5zZl9zaXplKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemVfZHN0ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QgPworICAgICAgICAgICAgICAgICAgICAgICAgY2Vhbl9nZXRfdHJhbnNmX3NpemUobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgOgorICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgLy8gSXQncyBzdXBwb3NlZCB0aGF0ICJpbnRvIiBzaXplIG11c3QgYmUgbm90IGxlc3MKKyAgICAgICAgICAgICAgICAgICAgLy8gdGhhbiBzcmMgc2l6ZQorICAgICAgICAgICAgICAgICAgICBpZiAoc2l6ZV9zcmMgPiBzaXplX2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RpZmZlcmVudF9zcmNfYW5kX2RzdG5fc2l6ZXMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV9zcmMsIHNpemVfZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBiYXNlIGFkZHJlc3MKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCo+KGR2cC0+QmFzZSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gYWxsb2NhdGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYWRkIG5ldyBlbnRyeQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghYWxsb2NfcHRyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxsb2NfZGlzcCA6IGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChhbGxvY19iYXNlICE9IE5VTEwpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGxvY19zaXplIDogc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoYWxsb2NfYmFzZSAhPSBOVUxMKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5hbGlnbikpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFkZF9yZWZlcmVuY2UoKSA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYnVmICE9MCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBhZGQgYnVmZmVyIHRvIHRoZSBsaXN0IG9mIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9jb21wdXRlX2J1ZmZlcnMucHVzaF9iYWNrKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2lsbCBzZW5kIGJ1ZmZlciBhZGRyZXNzIHRvIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXB0cl9kYXRhLT5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmVlZCB0byBhZGQgcmVmZXJlbmNlIGZvciBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB1c2UgZXhpc3RpbmcgYXNzb2NpYXRpb24gZnJvbSBwb2ludGVyIHRhYmxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFmaW5kX3B0cl9kYXRhKHB0cl9kYXRhLCBiYXNlLCBpbnRvX2Rpc3AsIHNpemUpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBuZWVkIHRvIHVwZGF0ZSBiYXNlIGluIGRvcGUgdmVjdG9yIG9uIGRldmljZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmFsbG9jX2Rpc3AgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKGFsbG9jX2Rpc3ApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdldCBidWZmZXJzJ3MgYWRkcmVzcyBvbiB0aGUgc2luaworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaW5pdF9taWNfYWRkcmVzcyhwdHJfZGF0YSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RhdGFsZW4gKz0gc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghcHRyX2RhdGEtPmlzX3N0YXRpYyAmJiBtX3ZhcnNbaV0uZnJlZV9pZikgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5lZWQgdG8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2Ugb24gdGFyZ2V0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gb2Zmc2V0IHRvIGJhc2UgZnJvbSB0aGUgYmVnaW5uaW5nIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1lbW9yeQorICAgICAgICAgICAgICAgICAgICAgICAgaW50b19vZmZzZXQgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChjaGFyKikgYmFzZSAtIChjaGFyKikgcHRyX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcHkgb3RoZXIgcG9pbnRlciBwcm9wZXJ0aWVzIHRvIHZhciBkZXNjcmlwdG9yCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCA9IHB0cl9kYXRhLT5taWNfb2Zmc2V0OworICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuID0gcHRyX2RhdGEtPmlzX3N0YXRpYzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsgLy8gc3JjX2lzX2Zvcl9taWMKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZmluZF9wdHJfZGF0YShwdHJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBiYXNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludG9fZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZhbHNlKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gIXB0cl9kYXRhID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopIGJhc2UgLSAoY2hhciopIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSBwb2ludGVyIGRhdGEKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhID0gcHRyX2RhdGE7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgLy8gaWYgaW50byBpcyB1c2VkIGF0IENQVSBzYXZlIGl0cyBvZmZzZXQgYW5kIGRpc3AKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCA9IGludG9fb2Zmc2V0OworICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwICAgPSBpbnRvX2Rpc3A7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZikgeworICAgICAgICAgICAgICAgIGludG9fb2Zmc2V0ID0gc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLm1fcGVyc2lzdF9saXN0LmZyb250KCkuY3B1X3N0YWNrX2FkZHI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gaW50b19vZmZzZXQ7CisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCAgID0gaW50b19kaXNwOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnNldHVwX21pc2NfZGF0YShjb25zdCBjaGFyICpuYW1lKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zZXR1cF9taXNjX2RhdGEpOworCisgICAgLy8gd2UgY2FuIHNraXAgcnVuIGZ1bmN0b24gY2FsbCB0b2dldGhlciB3aXRoIHdhaXQgaWYgb2ZmbG9hZGVkCisgICAgLy8gcmVnaW9uIGlzIGVtcHR5IGFuZCB0aGVyZSBpcyBubyB1c2VyIGRlZmluZWQgbm9uLXBvaW50ZXIgSU4vT1VUIGRhdGEKKyAgICBpZiAobV9uZWVkX3J1bmZ1bmN0aW9uKSB7CisgICAgICAgIC8vIHZhcmlhYmxlIGRlc2NyaXB0b3JzIGFyZSBzZW50IGFzIGlucHV0IGRhdGEKKyAgICAgICAgbV9pbl9kYXRhbGVuICs9IG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKTsKKworICAgICAgICAvLyB0aW1lciBkYXRhIGlzIHNlbnQgYXMgYSBwYXJ0IG9mIHRoZSBvdXRwdXQgZGF0YQorICAgICAgICBtX291dF9kYXRhbGVuICs9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIC8vIG1heCBmcm9tIGlucHV0IGRhdGEgYW5kIG91dHB1dCBkYXRhIGxlbmd0aAorICAgICAgICB1aW50NjRfdCBkYXRhX2xlbiA9IG1faW5fZGF0YWxlbiA+IG1fb3V0X2RhdGFsZW4gPyBtX2luX2RhdGFsZW4gOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuOworCisgICAgICAgIC8vIE1pc2MgZGF0YSBoYXMgdGhlIGZvbGxvd2luZyBsYXlvdXQKKyAgICAgICAgLy8gICAgIDxGdW5jdGlvbiBEZXNjcmlwdG9yPgorICAgICAgICAvLyAgICAgPEZ1bmN0aW9uIE5hbWU+CisgICAgICAgIC8vICAgICA8SW4vT3V0IERhdGE+ICAgICAgICAgICAgKG9wdGlvbmFsKQorICAgICAgICAvLworICAgICAgICAvLyBXZSBjYW4gdHJhbnNmZXIgY29weWluL2NvcHlvdXQgZGF0YSBpbiBtaXNjL3JldHVybiBkYXRhIHdoaWNoIGNhbgorICAgICAgICAvLyBiZSBwYXNzZWQgdG8gcnVuIGZ1bmN0aW9uIGNhbGwgaWYgaXRzIHNpemUgZG9lcyBub3QgZXhjZWVkCisgICAgICAgIC8vIENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTi4gT3RoZXJ3aXNlIHdlIGhhdmUgdG8gYWxsb2NhdGUKKyAgICAgICAgLy8gYnVmZmVyIGZvciBpdC4KKworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gc2l6ZW9mKEZ1bmN0aW9uRGVzY3JpcHRvcikgKyBzdHJsZW4obmFtZSkgKyAxOworICAgICAgICBtX2Z1bmNfZGVzY19zaXplID0gKG1fZnVuY19kZXNjX3NpemUgKyA3KSAmIH43OworCisgICAgICAgIGludCBtaXNjX2RhdGFfb2Zmc2V0ID0gMDsKKyAgICAgICAgaW50IG1pc2NfZGF0YV9zaXplID0gMDsKKyAgICAgICAgaWYgKGRhdGFfbGVuID4gMCkgeworICAgICAgICAgICAgaWYgKG1fZnVuY19kZXNjX3NpemUgKworICAgICAgICAgICAgICAgIG1faW5fZGF0YWxlbiA8PSBDT0lfUElQRUxJTkVfTUFYX0lOX01JU0NfREFUQV9MRU4gJiYKKyAgICAgICAgICAgICAgICBtX291dF9kYXRhbGVuIDw9IENPSV9QSVBFTElORV9NQVhfSU5fTUlTQ19EQVRBX0xFTikgeworICAgICAgICAgICAgICAgIC8vIHVzZSBtaXNjL3JldHVybiBkYXRhIGZvciBjb3B5aW4vY29weW91dAorICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9vZmZzZXQgPSBtX2Z1bmNfZGVzY19zaXplOworICAgICAgICAgICAgICAgIG1pc2NfZGF0YV9zaXplID0gZGF0YV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfYnVmKGdldF90aW1lcl9kYXRhKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlcik7CisKKyAgICAgICAgICAgICAgICAvLyBzZW5kL3JlY2VpdmUgZGF0YSB1c2luZyBidWZmZXIKKyAgICAgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJDcmVhdGUoZGF0YV9sZW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9CVUZGRVJfTk9STUFMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxLCAmbV9kZXZpY2UuZ2V0X3Byb2Nlc3MoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY3JlYXRlLCByZXMpOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIG1fY29tcHV0ZV9idWZmZXJzLnB1c2hfYmFjayhtX2lub3V0X2J1Zik7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKG1faW5vdXRfYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIGluaXRpYWxpemUgZnVuY3Rpb24gZGVzY3JpcHRvcgorICAgICAgICBtX2Z1bmNfZGVzYyA9IChGdW5jdGlvbkRlc2NyaXB0b3IqKSBtYWxsb2MobV9mdW5jX2Rlc2Nfc2l6ZSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaXNjX2RhdGFfc2l6ZSk7CisgICAgICAgIG1fZnVuY19kZXNjLT5jb25zb2xlX2VuYWJsZWQgPSBjb25zb2xlX2VuYWJsZWQ7CisgICAgICAgIG1fZnVuY19kZXNjLT50aW1lcl9lbmFibGVkID0KKyAgICAgICAgICAgIHRpbWVyX2VuYWJsZWQgfHwgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpOworICAgICAgICBtX2Z1bmNfZGVzYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWwgPSBvZmZsb2FkX3JlcG9ydF9sZXZlbDsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm9mZmxvYWRfbnVtYmVyID0gR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpOworICAgICAgICBtX2Z1bmNfZGVzYy0+aW5fZGF0YWxlbiA9IG1faW5fZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPm91dF9kYXRhbGVuID0gbV9vdXRfZGF0YWxlbjsKKyAgICAgICAgbV9mdW5jX2Rlc2MtPnZhcnNfbnVtID0gbV92YXJzX3RvdGFsOworICAgICAgICBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPSBtaXNjX2RhdGFfb2Zmc2V0OworCisgICAgICAgIC8vIGFwcGVuZCBlbnRyeSBuYW1lCisgICAgICAgIHN0cmNweShtX2Z1bmNfZGVzYy0+ZGF0YSwgbmFtZSk7CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OndhaXRfZGVwZW5kZW5jaWVzKAorICAgIGNvbnN0IHZvaWQgKip3YWl0cywKKyAgICBpbnQgbnVtX3dhaXRzCispCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyk7CisgICAgYm9vbCByZXQgPSB0cnVlOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fd2FpdHM7IGkrKykgeworCisgICAgICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0gbV9kZXZpY2UuZmluZF9zaWduYWwod2FpdHNbaV0sIHRydWUpOworICAgICAgICBpZiAodGFzayA9PSAwKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZDEsIG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdhaXRzW2ldKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBpZiAoIXRhc2stPm9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgICAgIHJldCA9IGZhbHNlOworICAgICAgICB9CisKKyAgICAgICAgdGFzay0+Y2xlYW51cCgpOworICAgICAgICBkZWxldGUgdGFzazsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0OworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkKAorICAgIGNvbnN0IGNoYXIgKm5hbWUsCisgICAgYm9vbCBpc19lbXB0eSwKKyAgICBWYXJEZXNjICp2YXJzLAorICAgIFZhckRlc2MyICp2YXJzMiwKKyAgICBpbnQgdmFyc190b3RhbCwKKyAgICBjb25zdCB2b2lkICoqd2FpdHMsCisgICAgaW50IG51bV93YWl0cywKKyAgICBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgIGludCBlbnRyeV9pZCwKKyAgICBjb25zdCB2b2lkICpzdGFja19hZGRyCispCit7CisgICAgaWYgKHNpZ25hbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSgxLAorICAgICAgICAgICAgICAgICAgICAgIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgICAgICAgICAgICAgICAgICAgICJPZmZsb2FkIGZ1bmN0aW9uICVzLCBpc19lbXB0eT0lZCwgI3ZhckRlc2NzPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgIiN3YWl0cz0lZCwgc2lnbmFsPW5vbmVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgbmFtZSwgaXNfZW1wdHksIHZhcnNfdG90YWwsIG51bV93YWl0cyk7CisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgIiNXYWl0IDogJWQgXG4iLCBudW1fd2FpdHMpOworICAgICAgICBPRkZMT0FEX1JFUE9SVCgzLCBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICAgICAgICAgICAgICAgICAgICAibm9uZSAlZFxuIiwgMCk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwKKyAgICAgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksCisgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2luaXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAiT2ZmbG9hZCBmdW5jdGlvbiAlcywgaXNfZW1wdHk9JWQsICN2YXJEZXNjcz0lZCwgIgorICAgICAgICAgICAgICAgICAgICAgICIjd2FpdHM9JWQsIHNpZ25hbD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBuYW1lLCBpc19lbXB0eSwgdmFyc190b3RhbCwgbnVtX3dhaXRzLAorICAgICAgICAgICAgICAgICAgICAgICpzaWduYWwpOworCisgICAgICAgIE9GRkxPQURfUkVQT1JUKDMsIEdFVF9PRkZMT0FEX05VTUJFUihnZXRfdGltZXJfZGF0YSgpKSwKKyAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfc2lnbmFsLAorICAgICAgICAgICAgICAgICAgICAgICIlZFxuIiwgc2lnbmFsKTsKKyAgICB9CisgICAgT0ZGTE9BRF9SRVBPUlQoMywgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF93YWl0LAorICAgICAgICAgICAgICAgICAgICAgICIjV2FpdCA6ICVkICAlcFxuIiwgbnVtX3dhaXRzLCB3YWl0cyk7CisKKyAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gT0ZGTE9BRF9TVUNDRVNTOworICAgICAgICBtX3N0YXR1cy0+ZGV2aWNlX251bWJlciA9IG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCk7CisgICAgfQorCisgICAgbV9uZWVkX3J1bmZ1bmN0aW9uID0gIWlzX2VtcHR5OworCisgICAgLy8gd2FpdCBmb3IgZGVwZW5kZW5jaWVzIHRvIGZpbmlzaAorICAgIGlmICghd2FpdF9kZXBlbmRlbmNpZXMod2FpdHMsIG51bV93YWl0cykpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gc2V0dXAgYnVmZmVycworICAgIGlmICghc2V0dXBfZGVzY3JpcHRvcnModmFycywgdmFyczIsIHZhcnNfdG90YWwsIGVudHJ5X2lkLCBzdGFja19hZGRyKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpbml0aWF0ZSBzZW5kIGZvciBwb2ludGVycy4gV2FudCB0byBkbyBpdCBhcyBlYXJseSBhcyBwb3NzaWJsZS4KKyAgICBpZiAoIXNlbmRfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBzZXR1cCBtaXNjIGRhdGEgZm9yIHJ1biBmdW5jdGlvbgorICAgIGlmICghc2V0dXBfbWlzY19kYXRhKG5hbWUpKSB7CisgICAgICAgIGNsZWFudXAoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIC8vIGdhdGhlciBjb3B5aW4gZGF0YSBpbnRvIGJ1ZmZlcgorICAgIGlmICghZ2F0aGVyX2NvcHlpbl9kYXRhKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gU3RhcnQgdGhlIGNvbXB1dGF0aW9uCisgICAgaWYgKCFjb21wdXRlKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgLy8gaW5pdGlhdGUgcmVjZWl2ZSBmb3IgcG9pbnRlcnMKKyAgICBpZiAoIXJlY2VpdmVfcG9pbnRlcl9kYXRhKHNpZ25hbCAhPSAwKSkgeworICAgICAgICBjbGVhbnVwKCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICAvLyBpZiB0aGVyZSBpcyBhIHNpZ25hbCBzYXZlIGRlc2NyaXB0b3IgZm9yIHRoZSBsYXRlciB1c2UuCisgICAgaWYgKHNpZ25hbCAhPSAwKSB7CisgICAgICAgIG1fZGV2aWNlLmFkZF9zaWduYWwoKnNpZ25hbCwgdGhpcyk7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKworICAgIC8vIHdhaXQgZm9yIHRoZSBvZmZsb2FkIHRvIGZpbmlzaC4KKyAgICBpZiAoIW9mZmxvYWRfZmluaXNoKCkpIHsKKyAgICAgICAgY2xlYW51cCgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgY2xlYW51cCgpOworICAgIHJldHVybiB0cnVlOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpvZmZsb2FkX2ZpbmlzaCgpCit7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIHdhaXQgZm9yIGNvbXB1dGUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX2luX2RlcHNfdG90YWwgPiAwKSB7CisgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUpOworCisgICAgICAgIGlmIChfX29mZmxvYWRfYWN0aXZlX3dhaXQpIHsKKyAgICAgICAgICAgIC8vIGtlZXAgQ1BVIGJ1c3kKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkV2ZW50V2FpdChtX2luX2RlcHNfdG90YWwsIG1faW5fZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1faW5fZGVwc190b3RhbCwgbV9pbl9kZXBzLCAtMSwgMSwgMCwgMCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBzY2F0dGVyIGNvcHlvdXQgZGF0YSByZWNlaXZlZCBmcm9tIHRhcmdldAorICAgIGlmICghc2NhdHRlcl9jb3B5b3V0X2RhdGEoKSkgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorICAgIC8vIHdhaXQgZm9yIHJlY2VpdmUgZGVwZW5kZW5jaWVzIHRvIGJlY29tZSBzaWduYWxlZAorICAgIGlmIChtX291dF9kZXBzX3RvdGFsID4gMCkgeworICAgICAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfd2FpdF9idWZmZXJzX3JlYWRzKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX2FjdGl2ZV93YWl0KSB7CisgICAgICAgICAgICAvLyBrZWVwIENQVSBidXN5CisgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB3aGlsZSAocmVzID09IENPSV9USU1FX09VVF9SRUFDSEVEKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1fb3V0X2RlcHNfdG90YWwsIG1fb3V0X2RlcHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfZXZlbnRfd2FpdCwgcmVzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgIHsKKyAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2Rlc3Ryb3lfYnVmZmVycyk7CisKKyAgICAgICAgZm9yIChCdWZmZXJMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IG1fZGVzdHJveV9idWZmZXJzLmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X2J1ZmZlcnMuZW5kKCk7IGl0KyspIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyRGVzdHJveSgqaXQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9kZXN0cm95LCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgT2ZmbG9hZERlc2NyaXB0b3I6OmNsZWFudXAoKQoreworICAgIC8vIHJlbGVhc2UgZGV2aWNlIGluIG9yc2wKKyAgICBPUlNMOjpyZWxlYXNlKG1fZGV2aWNlLmdldF9sb2dpY2FsX2luZGV4KCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3RvdGFsX29mZmxvYWQpOworCisgICAgLy8gcmVwb3J0IHN0dWZmCisgICAgT2ZmbG9hZF9SZXBvcnRfRXBpbG9nKGdldF90aW1lcl9kYXRhKCkpOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjppc19zaWduYWxlZCgpCit7CisgICAgYm9vbCBzaWduYWxlZCA9IHRydWU7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIGNoZWNrIGNvbXB1dGUgYW5kIHJlY2VpdmUgZGVwZW5kZW5jaWVzCisgICAgaWYgKG1faW5fZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9pbl9kZXBzX3RvdGFsLCBtX2luX2RlcHMsIDAsIDEsIDAsIDApOworICAgICAgICBzaWduYWxlZCA9IHNpZ25hbGVkICYmIChyZXMgPT0gQ09JX1NVQ0NFU1MpOworICAgIH0KKyAgICBpZiAobV9vdXRfZGVwc190b3RhbCA+IDApIHsKKyAgICAgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobV9vdXRfZGVwc190b3RhbCwgbV9vdXRfZGVwcywgMCwgMSwgMCwgMCk7CisgICAgICAgIHNpZ25hbGVkID0gc2lnbmFsZWQgJiYgKHJlcyA9PSBDT0lfU1VDQ0VTUyk7CisgICAgfQorCisgICAgcmV0dXJuIHNpZ25hbGVkOworfQorCisvLyBTZW5kIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIFB0ckRhdGEqIHNyY19kYXRhLAorICAgIFB0ckRhdGEqIGRzdF9kYXRhLAorICAgIENPSUVWRU5UICpldmVudAorICAgICkKK3sKKyAgICBpbnQ2NF90IG9mZnNldF9zcmMsIG9mZnNldF9kc3Q7CisgICAgaW50NjRfdCBsZW5ndGhfc3JjLCBsZW5ndGhfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyY19jdXIsIGxlbmd0aF9kc3RfY3VyOworICAgIGludDY0X3Qgc2VuZF9zaXplLCBkYXRhX3NlbnQgPSAwOworICAgIENPSVJFU1VMVCByZXM7CisgICAgYm9vbCBkc3RfaXNfZW1wdHkgPSB0cnVlOworICAgIGJvb2wgc3JjX2lzX2VtcHR5ID0gdHJ1ZTsKKworICAgIC8vIFNldCBsZW5ndGhfc3JjIGFuZCBsZW5ndGhfZHN0CisgICAgbGVuZ3RoX3NyYyA9IChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSA/CisgICAgICAgIG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMtPnJhbmdlX3NpemUgOiBtX3ZhcnNbaV0uc2l6ZTsKKyAgICBsZW5ndGhfZHN0ID0gIW1fdmFyc1tpXS5pbnRvID8gbGVuZ3RoX3NyYyA6CisgICAgICAgICAgICAgICAgICAgICAobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCkgPworICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdC0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIHNlbmRfc2l6ZSA9IChsZW5ndGhfc3JjIDwgbGVuZ3RoX2RzdCkgPyBsZW5ndGhfc3JjIDogbGVuZ3RoX2RzdDsKKworICAgIC8vIGNvbnNlcXVlbnRseSBnZXQgY29udGlndW91cyByYW5nZXMsCisgICAgLy8gZGVmaW5lIGNvcnJlc3BvbmRlZCBkZXN0aW5hdGlvbiBvZmZzZXQgYW5kIHNlbmQgZGF0YQorICAgIGRvIHsKKyAgICAgICAgaWYgKHNyY19pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpIHsKKyAgICAgICAgICAgICAgICBpZiAoIWdldF9uZXh0X3JhbmdlKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMsCisgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHNvdXJjZSByYW5nZXMgYXJlIG92ZXIgLSBub3RoaW5nIHRvIHNlbmQKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoZGF0YV9zZW50ID09IDApIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfc3JjID0gbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSBzZW5kX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gc2VuZF9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UobV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX2RzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm9mZnNldF9kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkZXN0aW5hdGlvbiByYW5nZXMgYXJlIG92ZXIKKyAgICAgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19kZXN0aW5hdGlvbl9pc19vdmVyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAvLyBpbnRvIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbGVuZ3RoX2RzdF9jdXIgPSBsZW5ndGhfZHN0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gc2FtZSBhcyBzb3VyY2UKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBvZmZzZXRfc3JjOworICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX3NyYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGlmIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMgb3IgaXRzIGNvbnRpZ3VvdXMgcmFuZ2UgaXMgZ3JlYXRlcgorICAgICAgICAgICAgLy8gdGhhbiBzb3VyY2Ugb25lCisgICAgICAgICAgICBvZmZzZXRfZHN0ICs9IHNlbmRfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBsZW5ndGhfZHN0X2N1ciAtPSBzZW5kX3NpemU7CisgICAgICAgIGRzdF9pc19lbXB0eSA9IGxlbmd0aF9kc3RfY3VyID09IDA7CisKKyAgICAgICAgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsgb2Zmc2V0X3NyYywKKyAgICAgICAgICAgICAgICBzZW5kX3NpemUsCisgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworCisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlcldyaXRlKAorICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfc3JjLAorICAgICAgICAgICAgICAgIHNlbmRfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZGF0YV9zZW50ICs9IGxlbmd0aF9zcmM7CisgICAgfQorICAgIHdoaWxlICh0cnVlKTsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2VuZF9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYykKK3sKKyAgICBPZmZsb2FkVGltZXIgdGltZXIoZ2V0X3RpbWVyX2RhdGEoKSwgY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyk7CisKKyAgICB1aW50NjRfdCBwdHJfc2VudCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKworICAgIC8vIEluaXRpYXRlIHNlbmQgZm9yIHBvaW50ZXIgZGF0YQorICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgc3dpdGNoIChtX3ZhcnNbaV0udHlwZS5kc3QpIHsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgY19kYXRhOgorICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICBDT0lFVkVOVCAqZXZlbnQgPQorICAgICAgICAgICAgICAgICAgICAgICAgKGlzX2FzeW5jIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfd3JpdGUpID8KKyAgICAgICAgICAgICAgICAgICAgICAgICZtX2luX2RlcHNbbV9pbl9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogZHN0X2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPQorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5zcmMpICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIXNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBkc3RfZGF0YSwgZXZlbnQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICE9IDAgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0gZHN0X2RhdGEtPmFsbG9jX2Rpc3AgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJiBtX3ZhcnNbaV0uc2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIGRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhID0KKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYyA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDogMDsKKworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgIT0gMCAmJiBzcmNfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3JjX2RhdGEtPmNwdV9idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmluICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID4gMCkgeworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YTsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSogc3JjX2RhdGEgPSBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGE7CisKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplID49IF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3dyaXRlKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9pbl9kZXBzW21faW5fZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzZW5kX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIHNyY19kYXRhLCBwdHJfZGF0YSwgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKHNyY19kYXRhICYmIHNyY19kYXRhLT5jcHVfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzcmNfZGF0YS0+Y3B1X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgcHRyX2RhdGEtPm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9jb3B5LCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKG1fdmFyc1tpXS5wdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyV3JpdGUoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEtPm1pY19vZmZzZXQgLSBwdHJfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3dyaXRlLCByZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIHB0cl9zZW50ICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIFB0ckRhdGEgKmRzdF9kYXRhID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICBQdHJEYXRhKiBzcmNfZGF0YSA9CisgICAgICAgICAgICAgICAgICAgICAgICAoVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEEobV92YXJzW2ldLnR5cGUuc3JjKSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5zcmMpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19TQ0FMQVIobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YSA6IDA7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1faW5fZGVwc1ttX2luX2RlcHNfdG90YWwrK10gOiAwOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfc3JjIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaSwgc3JjX2RhdGEsIGRzdF9kYXRhLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc3JjX2RhdGEgJiYgc3JjX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJDb3B5KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNyY19kYXRhLT5jcHVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgLSBkc3RfZGF0YS0+YWxsb2NfZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2RhdGEtPm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpiYXNlID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMpOworICAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJXcml0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfZGF0YS0+bWljX29mZnNldCAtIGRzdF9kYXRhLT5hbGxvY19kaXNwICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfd3JpdGUsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBwdHJfc2VudCArPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBhbGxvYyBmaWVsZCBpc24ndCB1c2VkIGF0IHRhcmdldC4KKyAgICAgICAgLy8gV2UgY2FuIHJldXNlIGl0IGZvciBvZmZzZXQgb2YgYXJyYXkgcG9pbnRlcnMuCisgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0uaXNfYXJyX3B0cl9lbCkgeworICAgICAgICAgICAgbV92YXJzW2ldLnB0cl9hcnJfb2Zmc2V0ID0gbV92YXJzX2V4dHJhW2ldLnB0cl9hcnJfb2Zmc2V0OworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3NlbnQgKz0gcHRyX3NlbnQ7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1NEQVRBKGdldF90aW1lcl9kYXRhKCksIHB0cl9zZW50KTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3NlbnRfcG9pbnRlcl9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIHBvaW50ZXIgZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgcHRyX3NlbnQpOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OmdhdGhlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX2luX2RhdGFsZW4gPiAwKSB7CisgICAgICAgIENPSU1BUElOU1RBTkNFIG1hcF9pbnN0OworICAgICAgICBjaGFyICpkYXRhOworCisgICAgICAgIC8vIGluaXQgbWFyc2hhbGxlcgorICAgICAgICBpZiAobV9pbm91dF9idWYgIT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJNYXAobV9pbm91dF9idWYsIDAsIG1faW5fZGF0YWxlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBDT0lfTUFQX1dSSVRFX0VOVElSRV9CVUZGRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgJm1hcF9pbnN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCoqPigmZGF0YSkpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBkYXRhID0gKGNoYXIqKSBtX2Z1bmNfZGVzYyArIG1fZnVuY19kZXNjLT5kYXRhX29mZnNldDsKKyAgICAgICAgfQorCisgICAgICAgIC8vIHNlbmQgdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICAgICAgbWVtY3B5KGRhdGEsIG1fdmFycywgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckRlc2MpKTsKKyAgICAgICAgZGF0YSArPSBtX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgLy8gaW5pdCBtYXJzaGFsbGVyCisgICAgICAgIG1faW4uaW5pdF9idWZmZXIoZGF0YSwgbV9pbl9kYXRhbGVuKTsKKworICAgICAgICAvLyBHYXRoZXIgY29weSBkYXRhIGludG8gYnVmZmVyCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbV92YXJzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPT0gTlVMTCk7CisgICAgICAgICAgICBQdHJEYXRhKiBwdHJfZGF0YSA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhOworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEoJnB0cl9kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihwdHJfZGF0YS0+YWxsb2NfZGlzcCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZW5kIHNpbmsgYWRkcmVzcyB0byB0aGUgdGFyZ2V0CisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCZwdHJfZGF0YS0+bWljX2FkZHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLmRzdCkgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4gJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgY2hhciAqcHRyID0gb2ZmbG9hZF9nZXRfc3JjX2Jhc2UobV92YXJzW2ldLnB0ciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfY2Vhbl92YXIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZmZzZXQgYW5kIGxlbmd0aCBhcmUgZGVyaXZlZCBmcm9tIHRoZSBhcnJheQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc2NyaXB0b3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQ2NF90IGRpc3AgPSBtX3ZhcnNbaV0uZGlzcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShyZWludGVycHJldF9jYXN0PGNoYXIqPigmZGlzcCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5zZW5kX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzIHx8CisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBzZW5kIGRvcGUgdmVjdG9yIGV4Y2x1ZGluZyBiYXNlCisgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnNlbmRfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgLSBzaXplb2YodWludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgLy8gc2VuZCB0byB0YXJnZXQgYWRkcmVzc2VzIG9mIG9ic29sZXRlCisgICAgICAgICAgICAgICAgICAgIC8vIHN0YWNrcyB0byBiZSByZWxlYXNlZAorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1ZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5kaXJlY3Rpb24uYml0cyAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmICYmCisgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKFB0ckRhdGFMaXN0OjppdGVyYXRvciBpdCA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqIHB0cl9kYXRhID0gKml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9kYXRhKCYocHRyX2RhdGEtPm1pY19hZGRyKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKHB0cl9kYXRhLT5taWNfYWRkcikpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24uaW4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uc2VuZF9mdW5jX3B0cigqKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgICAgICBtX3N0YXR1cy0+ZGF0YV9zZW50ICs9IG1faW4uZ2V0X3Rmcl9zaXplKCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0ID09IDApIHsKKyAgICAgICAgICAgIE9mZmxvYWRUaW1lciB0aW1lcl91bm1hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9ob3N0X3VubWFwX2luX2RhdGFfYnVmZmVyKTsKKyAgICAgICAgICAgIENPSVJFU1VMVCByZXMgPSBDT0k6OkJ1ZmZlclVubWFwKG1hcF9pbnN0LCAwLCAwLCAwKTsKKyAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfdW5tYXAsIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfU0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsCisgICAgICAgICAgICAgICAgICBHRVRfT0ZGTE9BRF9OVU1CRVIoZ2V0X3RpbWVyX2RhdGEoKSksIGNfb2ZmbG9hZF9jb3B5aW5fZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBjb3B5aW4gZGF0YSBzZW50IHRvIHRhcmdldDogWyVsbGRdIGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfdGZyX3NpemUoKSk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6Y29tcHV0ZSgpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbikgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX2NvbXB1dGUsICJDb21wdXRlIHRhc2sgb24gTUlDXG4iKTsKKworICAgICAgICB2b2lkKiBtaXNjID0gbV9mdW5jX2Rlc2M7CisgICAgICAgIGludCAgIG1pc2NfbGVuID0gbV9mdW5jX2Rlc2Nfc2l6ZTsKKyAgICAgICAgdm9pZCogcmV0ID0gMDsKKyAgICAgICAgaW50ICAgcmV0X2xlbiA9IDA7CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBtaXNjX2xlbiArPSBtX2luX2RhdGFsZW47CisKKyAgICAgICAgICAgIGlmIChtX291dF9kYXRhbGVuID4gMCkgeworICAgICAgICAgICAgICAgIHJldCA9IChjaGFyKikgbV9mdW5jX2Rlc2MgKyBtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQ7CisgICAgICAgICAgICAgICAgcmV0X2xlbiA9IG1fb3V0X2RhdGFsZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBkaXNwYXRjaCB0YXNrCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIENPSUVWRU5UIGV2ZW50OworICAgICAgICByZXMgPSBtX2RldmljZS5jb21wdXRlKG1fY29tcHV0ZV9idWZmZXJzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pc2MsIG1pc2NfbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldCwgcmV0X2xlbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJmV2ZW50KTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19waXBlbGluZV9ydW5fZnVuYywgcmVzKTsKKyAgICAgICAgfQorCisgICAgICAgIG1faW5fZGVwc190b3RhbCA9IDE7CisgICAgICAgIG1faW5fZGVwc1swXSA9IGV2ZW50OworICAgIH0KKworICAgIHJldHVybiB0cnVlOworfQorCisvLyByZWNlaXZlIHBvaW50ZXIgZGF0YSBpZiBzb3VyY2Ugb3IgZGVzdGluYXRpb24gb3IgYm90aCBvZiB0aGVtIGFyZQorLy8gbm9uY29udGlndW91cy4gVGhlcmUgaXMgZ3VhcmFudGVlIHRoYXQgbGVuZ3RoIG9mIGRlc3RpbmF0aW9uIGVub3VnaCBmb3IKKy8vIHRyYW5zZmVycmVkIGRhdGEuCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpyZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgIGludCBpLAorICAgIGNoYXIqIGJhc2UsCisgICAgQ09JQlVGRkVSIGRzdF9idWYsCisgICAgQ09JRVZFTlQgKmV2ZW50CispCit7CisgICAgaW50NjRfdCBvZmZzZXRfc3JjLCBvZmZzZXRfZHN0OworICAgIGludDY0X3QgbGVuZ3RoX3NyYywgbGVuZ3RoX2RzdDsKKyAgICBpbnQ2NF90IGxlbmd0aF9zcmNfY3VyLCBsZW5ndGhfZHN0X2N1cjsKKyAgICBpbnQ2NF90IHJlY2VpdmVfc2l6ZSwgZGF0YV9yZWNlaXZlZCA9IDA7CisgICAgQ09JUkVTVUxUIHJlczsKKyAgICBib29sIGRzdF9pc19lbXB0eSA9IHRydWU7CisgICAgYm9vbCBzcmNfaXNfZW1wdHkgPSB0cnVlOworCisgICAgLy8gU2V0IGxlbmd0aF9zcmMgYW5kIGxlbmd0aF9kc3QKKyAgICBsZW5ndGhfc3JjID0gKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19zcmMpID8KKyAgICAgICAgbV92YXJzX2V4dHJhW2ldLnJlYWRfcm5nX3NyYy0+cmFuZ2Vfc2l6ZSA6IG1fdmFyc1tpXS5zaXplOworICAgIGxlbmd0aF9kc3QgPSAhbV92YXJzW2ldLmludG8gPyBsZW5ndGhfc3JjIDoKKyAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0KSA/CisgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LT5yYW5nZV9zaXplIDogbV92YXJzW2ldLnNpemU7CisgICAgcmVjZWl2ZV9zaXplID0gKGxlbmd0aF9zcmMgPCBsZW5ndGhfZHN0KSA/IGxlbmd0aF9zcmMgOiBsZW5ndGhfZHN0OworCisgICAgLy8gY29uc2VxdWVudGx5IGdldCBjb250aWd1b3VzIHJhbmdlcywKKyAgICAvLyBkZWZpbmUgY29ycmVzcG9uZGVkIGRlc3RpbmF0aW9uIG9mZnNldCBhbmQgcmVjZWl2ZSBkYXRhCisgICAgZG8geworICAgICAgICAvLyBnZXQgc29yY2Ugb2Zmc2V0CisgICAgICAgIGlmIChzcmNfaXNfZW1wdHkpIHsKKyAgICAgICAgICAgIGlmIChtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjKSB7CisgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfc3JjLAorICAgICAgICAgICAgICAgICAgICAgICAgICZvZmZzZXRfc3JjKSkgeworICAgICAgICAgICAgICAgICAgICAvLyBzb3VyY2UgcmFuZ2VzIGFyZSBvdmVyIC0gbm90aGluZyB0byBzZW5kCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGRhdGFfcmVjZWl2ZWQgPT0gMCkgeworICAgICAgICAgICAgICAgIG9mZnNldF9zcmMgPSAwOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsZW5ndGhfc3JjX2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBzb3VyY2UgaXMgY29udGlndW91cyBvciBpdHMgY29udGlndW91cyByYW5nZSBpcyBncmVhdGVyCisgICAgICAgICAgICAvLyB0aGFuIGRlc3RpbmF0aW9uIG9uZQorICAgICAgICAgICAgb2Zmc2V0X3NyYyArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX3NyY19jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBzcmNfaXNfZW1wdHkgPSBsZW5ndGhfc3JjX2N1ciA9PSAwOworCisgICAgICAgIC8vIGdldCBkZXN0aW5hdGlvbiBvZmZzZXQKKyAgICAgICAgaWYgKGRzdF9pc19lbXB0eSkgeworICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc19leHRyYVtpXS5yZWFkX3JuZ19kc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCFnZXRfbmV4dF9yYW5nZShtX3ZhcnNfZXh0cmFbaV0ucmVhZF9ybmdfZHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb2Zmc2V0X2RzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2Rlc3RpbmF0aW9uX2lzX292ZXIpOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIGRlc3RpbmF0aW9uIGlzIGNvbnRpZ3VvdXMuCisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldF9kc3QgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxlbmd0aF9kc3RfY3VyID0gbGVuZ3RoX2RzdDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHNhbWUgYXMgc291cmNlCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBvZmZzZXRfZHN0ID0gb2Zmc2V0X3NyYzsKKyAgICAgICAgICAgICAgICBsZW5ndGhfZHN0X2N1ciA9IGxlbmd0aF9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLyBpZiBkZXN0aW5hdGlvbiBpcyBjb250aWd1b3VzIG9yIGl0cyBjb250aWd1b3VzIHJhbmdlIGlzIGdyZWF0ZXIKKyAgICAgICAgICAgIC8vIHRoYW4gc291cmNlIG9uZQorICAgICAgICAgICAgb2Zmc2V0X2RzdCArPSByZWNlaXZlX3NpemU7CisgICAgICAgIH0KKyAgICAgICAgbGVuZ3RoX2RzdF9jdXIgLT0gcmVjZWl2ZV9zaXplOworICAgICAgICBkc3RfaXNfZW1wdHkgPSBsZW5ndGhfZHN0X2N1ciA9PSAwOworCisgICAgICAgIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArIG9mZnNldF9kc3QsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLm9mZnNldCArIG9mZnNldF9zcmMgKworICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPmFsbG9jX2Rpc3AsCisgICAgICAgICAgICAgICAgcmVjZWl2ZV9zaXplLAorICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBvZmZzZXRfc3JjICsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgIGJhc2UgKyBvZmZzZXRfZHN0LAorICAgICAgICAgICAgICAgIHJlY2VpdmVfc2l6ZSwKKyAgICAgICAgICAgICAgICBDT0lfQ09QWV9VTlNQRUNJRklFRCwKKyAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwsCisgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsID4gMCA/IG1faW5fZGVwcyA6IDAsCisgICAgICAgICAgICAgICAgZXZlbnQpOworICAgICAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgICAgIGlmIChtX3N0YXR1cyAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIG1fc3RhdHVzLT5yZXN1bHQgPSB0cmFuc2xhdGVfY29pX2Vycm9yKHJlcyk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmVwb3J0X2NvaV9lcnJvcihjX2J1Zl9yZWFkLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGRhdGFfcmVjZWl2ZWQgKz0gcmVjZWl2ZV9zaXplOworICAgIH0KKyAgICB3aGlsZSAodHJ1ZSk7CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgT2ZmbG9hZERlc2NyaXB0b3I6OnJlY2VpdmVfcG9pbnRlcl9kYXRhKGJvb2wgaXNfYXN5bmMpCit7CisgICAgT2ZmbG9hZFRpbWVyIHRpbWVyKGdldF90aW1lcl9kYXRhKCksIGNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2J1ZmZlcnNfcmVhZHMpOworCisgICAgdWludDY0X3QgcHRyX3JlY2VpdmVkID0gMDsKKyAgICBDT0lSRVNVTFQgcmVzOworCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQ09JRVZFTlQgKmV2ZW50ID0KKyAgICAgICAgICAgICAgICAgICAgICAgIChpc19hc3luYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSA+PSBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAmbV9vdXRfZGVwc1ttX291dF9kZXBzX3RvdGFsKytdIDogMDsKKyAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiA9IE5VTEw7IC8vIGJ1ZmZlciBhdCBob3N0CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2U7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKFZBUl9UWVBFX0lTX1NDQUxBUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uZHN0X2RhdGEgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGRzdF9idWYgPSBwdHJfZGF0YSA/IHB0cl9kYXRhLT5jcHVfYnVmIDogTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfbm9uY29udF9zcmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X2RzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpLCBiYXNlLCBkc3RfYnVmLCBldmVudCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoZHN0X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlckNvcHkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uc3JjX2RhdGEtPm1pY19idWYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5jcHVfZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfY29weSwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgcmVzID0gQ09JOjpCdWZmZXJSZWFkKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ICsgbV92YXJzW2ldLmRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSArIG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ09JX0NPUFlfVU5TUEVDSUZJRUQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbl9kZXBzX3RvdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCA+IDAgPyBtX2luX2RlcHMgOiAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV9zdGF0dXMgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3N0YXR1cy0+cmVzdWx0ID0gdHJhbnNsYXRlX2NvaV9lcnJvcihyZXMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlcG9ydF9jb2lfZXJyb3IoY19idWZfcmVhZCwgcmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBwdHJfcmVjZWl2ZWQgKz0gbV92YXJzW2ldLnNpemU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjogeworICAgICAgICAgICAgICAgIENPSUJVRkZFUiBkc3RfYnVmID0gTlVMTDsgLy8gYnVmZmVyIG9uIGhvc3QKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgJiYgbV92YXJzW2ldLnNpemUgPiAwKSB7CisgICAgICAgICAgICAgICAgICAgIENPSUVWRU5UICpldmVudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoaXNfYXN5bmMgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgPj0gX19vZmZsb2FkX3VzZV9hc3luY19idWZmZXJfcmVhZCkgPworICAgICAgICAgICAgICAgICAgICAgICAgJm1fb3V0X2RlcHNbbV9vdXRfZGVwc190b3RhbCsrXSA6IDA7CisKKyAgICAgICAgICAgICAgICAgICAgdWludDY0X3QgZHN0X29mZnNldCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGNoYXIgKmJhc2UgPSBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0cik7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKFZBUl9UWVBFX0lTX1BUUihtX3ZhcnNbaV0udHlwZS5kc3QpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhID8gcHRyX2RhdGEtPmNwdV9idWYgOiBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfU0NBTEFSKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmID0gbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YS0+Y3B1X2J1ZiA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5jcHVfYnVmOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRzdF9idWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZHN0X29mZnNldCA9IG1fdmFyc19leHRyYVtpXS5jcHVfb2Zmc2V0ICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3A7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuZHN0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSBtX3ZhcnNbaV0uaW50byAhPSAwID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmRzdF9kYXRhIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2J1ZiA9IHB0cl9kYXRhICE9IDAgPyBwdHJfZGF0YS0+Y3B1X2J1ZiA6IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoZHN0X2J1ZiA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYmFzZSA9IG9mZmxvYWRfZ2V0X3NyY19iYXNlKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLnB0ciksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLmRzdCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGRzdF9vZmZzZXQgPSBtX3ZhcnNfZXh0cmFbaV0uY3B1X29mZnNldCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5pc19ub25jb250X3NyYyB8fAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmlzX25vbmNvbnRfZHN0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZWNlaXZlX25vbmNvbnRpZ3VvdXNfcG9pbnRlcl9kYXRhKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGksIGJhc2UsIGRzdF9idWYsIGV2ZW50KTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChkc3RfYnVmICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlcyA9IENPSTo6QnVmZmVyQ29weSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc19leHRyYVtpXS5zcmNfZGF0YS0+bWljX2J1ZiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX2NvcHksIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXMgPSBDT0k6OkJ1ZmZlclJlYWQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5taWNfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5vZmZzZXQgKyBtX3ZhcnNbaV0uZGlzcCArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0IC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhLT5hbGxvY19kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJhc2UgKyBkc3Rfb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9DT1BZX1VOU1BFQ0lGSUVELAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1faW5fZGVwc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX2luX2RlcHNfdG90YWwgPiAwID8gbV9pbl9kZXBzIDogMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBldmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3JlYWQsIHJlcyk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgcHRyX3JlY2VpdmVkICs9IG1fdmFyc1tpXS5zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycyBmb3Igb2Jzb2xldGUgc3RhY2tzCisgICAgICAgIGlmIChtX2Rlc3Ryb3lfc3RhY2suc2l6ZSgpICE9IDApIHsKKyAgICAgICAgICAgIGZvciAoUHRyRGF0YUxpc3Q6Oml0ZXJhdG9yIGl0ID0gbV9kZXN0cm95X3N0YWNrLmJlZ2luKCk7CisgICAgICAgICAgICAgICAgaXQgIT0gbV9kZXN0cm95X3N0YWNrLmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAgICAgUHRyRGF0YSAqcHRyX2RhdGEgPSAqaXQ7CisgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBzdGFjayBidWZmZXIgd2l0aCBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5taWNfYWRkcik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBtX2Rlc3Ryb3lfc3RhY2suY2xlYXIoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV92YXJzW2ldLmZyZWVfaWYpIHsKKyAgICAgICAgICAgIC8vIHJlbW92ZSBhc3NvY2lhdGlvbiBmb3IgYXV0b21hdGljIHZhcmlhYmxlcworICAgICAgICAgICAgaWYgKG1faXNfb3Blbm1wICYmICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljICYmCisgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfdm9pZF9wdHIgfHwKKyAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuc3JjID09IGNfY2Vhbl92YXIpKSB7CisgICAgICAgICAgICAgICAgQXV0b0RhdGEgKmF1dG9fZGF0YSA9IG1fdmFyc19leHRyYVtpXS5hdXRvX2RhdGE7CisgICAgICAgICAgICAgICAgaWYgKGF1dG9fZGF0YSAhPSAwICYmIGF1dG9fZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX2F1dG9fZGF0YShhdXRvX2RhdGEtPmNwdV9hZGRyLnN0YXJ0KCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwgbV92YXJzW2ldLmludG8gPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGlmICghVkFSX1RZUEVfSVNfUFRSKG1fdmFyc1tpXS50eXBlLnNyYykgJiYKKyAgICAgICAgICAgICAgICAgICAgIVZBUl9UWVBFX0lTX0RWX0RBVEFfU0xJQ0UobV92YXJzW2ldLnR5cGUuc3JjKSAmJgorICAgICAgICAgICAgICAgICAgICAhVkFSX1RZUEVfSVNfRFZfREFUQShtX3ZhcnNbaV0udHlwZS5zcmMpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFB0ckRhdGEgKnB0cl9kYXRhID0gbV92YXJzX2V4dHJhW2ldLnNyY19kYXRhOworICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+cmVtb3ZlX3JlZmVyZW5jZSgpID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gZGVzdHJveSBidWZmZXJzCisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+Y3B1X2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPmNwdV9idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChwdHJfZGF0YS0+bWljX2J1ZiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2Rlc3Ryb3lfYnVmZmVycy5wdXNoX2JhY2socHRyX2RhdGEtPm1pY19idWYpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMywgIlJlbW92aW5nIGFzc29jaWF0aW9uIGZvciBhZGRyICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKworICAgICAgICAgICAgICAgICAgICAvLyByZW1vdmUgYXNzb2NpYXRpb24gZnJvbSBtYXAKKyAgICAgICAgICAgICAgICAgICAgbV9kZXZpY2UucmVtb3ZlX3B0cl9kYXRhKHB0cl9kYXRhLT5jcHVfYWRkci5zdGFydCgpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChWQVJfVFlQRV9JU19QVFIobV92YXJzW2ldLnR5cGUuZHN0KSB8fAorICAgICAgICAgICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRShtX3ZhcnNbaV0udHlwZS5kc3QpIHx8CisgICAgICAgICAgICAgICAgICAgICBWQVJfVFlQRV9JU19EVl9EQVRBKG1fdmFyc1tpXS50eXBlLmRzdCkpIHsKKyAgICAgICAgICAgICAgICBQdHJEYXRhICpwdHJfZGF0YSA9IG1fdmFyc19leHRyYVtpXS5kc3RfZGF0YTsKKyAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPnJlbW92ZV9yZWZlcmVuY2UoKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRlc3Ryb3kgYnVmZmVycworICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPmNwdV9idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5jcHVfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocHRyX2RhdGEtPm1pY19idWYgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9kZXN0cm95X2J1ZmZlcnMucHVzaF9iYWNrKHB0cl9kYXRhLT5taWNfYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RSQUNFKDMsICJSZW1vdmluZyBhc3NvY2lhdGlvbiBmb3IgYWRkciAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gcmVtb3ZlIGFzc29jaWF0aW9uIGZyb20gbWFwCisgICAgICAgICAgICAgICAgICAgIG1fZGV2aWNlLnJlbW92ZV9wdHJfZGF0YShwdHJfZGF0YS0+Y3B1X2FkZHIuc3RhcnQoKSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKG1fc3RhdHVzKSB7CisgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IHB0cl9yZWNlaXZlZDsKKyAgICB9CisKKyAgICBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgcHRyX3JlY2VpdmVkKTsKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMSwgR0VUX09GRkxPQURfTlVNQkVSKGdldF90aW1lcl9kYXRhKCkpLAorICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3JlY2VpdmVkX3BvaW50ZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICJUb3RhbCBwb2ludGVyIGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIHB0cl9yZWNlaXZlZCk7CisKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworYm9vbCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5b3V0X2RhdGEoKQoreworICAgIE9mZmxvYWRUaW1lciB0aW1lcihnZXRfdGltZXJfZGF0YSgpLCBjX29mZmxvYWRfaG9zdF9zY2F0dGVyX291dHB1dHMpOworCisgICAgaWYgKG1fbmVlZF9ydW5mdW5jdGlvbiAmJiBtX291dF9kYXRhbGVuID4gMCkgeworCisgICAgICAgIC8vIHRvdGFsIHNpemUgdGhhdCBuZWVkIHRvIGJlIHRyYW5zZmVycmVkIGZyb20gdGFyZ2V0IHRvIGhvc3QKKyAgICAgICAgQ09JTUFQSU5TVEFOQ0UgbWFwX2luc3Q7CisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIGNoYXIgKmRhdGE7CisKKyAgICAgICAgLy8gb3V0cHV0IGRhdGEgYnVmZmVyCisgICAgICAgIGlmIChtX2Z1bmNfZGVzYy0+ZGF0YV9vZmZzZXQgPT0gMCkgeworICAgICAgICAgICAgT2ZmbG9hZFRpbWVyIHRpbWVyX21hcChnZXRfdGltZXJfZGF0YSgpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKTsKKworICAgICAgICAgICAgQ09JUkVTVUxUIHJlcyA9IENPSTo6QnVmZmVyTWFwKG1faW5vdXRfYnVmLCAwLCBtX291dF9kYXRhbGVuLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIENPSV9NQVBfUkVBRF9PTkxZLCAwLCAwLCAwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZtYXBfaW5zdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkYXRhKSk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX21hcCwgcmVzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRhdGEgPSAoY2hhciopIG1fZnVuY19kZXNjICsgbV9mdW5jX2Rlc2MtPmRhdGFfb2Zmc2V0OworICAgICAgICB9CisKKyAgICAgICAgLy8gZ2V0IHRpbWluZyBkYXRhCisgICAgICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEoZ2V0X3RpbWVyX2RhdGEoKSwgZGF0YSk7CisgICAgICAgIGRhdGEgKz0gT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCk7CisKKyAgICAgICAgLy8gaW5pdGlhbGl6ZSBvdXRwdXQgbWFyc2hhbGxlcgorICAgICAgICBtX291dC5pbml0X2J1ZmZlcihkYXRhLCBtX291dF9kYXRhbGVuKTsKKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cl9hcnJheToKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICAgICAgY2FzZSBjX3ZvaWRfcHRyOgorICAgICAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyICpwdHIgPSBvZmZsb2FkX2dldF9zcmNfYmFzZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5pbnRvKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEocHRyICsgbV92YXJzX2V4dHJhW2ldLmNwdV9kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2RhdGEoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNfZXh0cmFbaV0uY3B1X2Rpc3AsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5zaXplKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0KSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX291dC5yZWNlaXZlX2Z1bmNfcHRyKChjb25zdCB2b2lkKiopIG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV9zdGF0dXMpIHsKKyAgICAgICAgICAgIG1fc3RhdHVzLT5kYXRhX3JlY2VpdmVkICs9IG1fb3V0LmdldF90ZnJfc2l6ZSgpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKG1fZnVuY19kZXNjLT5kYXRhX29mZnNldCA9PSAwKSB7CisgICAgICAgICAgICBPZmZsb2FkVGltZXIgdGltZXJfdW5tYXAoZ2V0X3RpbWVyX2RhdGEoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfaG9zdF91bm1hcF9vdXRfZGF0YV9idWZmZXIpOworCisgICAgICAgICAgICBDT0lSRVNVTFQgcmVzID0gQ09JOjpCdWZmZXJVbm1hcChtYXBfaW5zdCwgMCwgMCwgMCk7CisgICAgICAgICAgICBpZiAocmVzICE9IENPSV9TVUNDRVNTKSB7CisgICAgICAgICAgICAgICAgaWYgKG1fc3RhdHVzICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9zdGF0dXMtPnJlc3VsdCA9IHRyYW5zbGF0ZV9jb2lfZXJyb3IocmVzKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXBvcnRfY29pX2Vycm9yKGNfYnVmX3VubWFwLCByZXMpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9IT1NUX1JEQVRBKGdldF90aW1lcl9kYXRhKCksIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5b3V0IGRhdGEgcmVjZWl2ZWQgZnJvbSB0YXJnZXQ6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIGdldF9hcnJfZGVzY19udW1iZXJzKAorICAgIGNvbnN0IGFycl9kZXNjICphcCwKKyAgICBpbnQ2NF90IGVsX3NpemUsCisgICAgaW50NjRfdCAmb2Zmc2V0LAorICAgIGludDY0X3QgJnNpemUsCisgICAgaW50ICAgICAmZWxfbnVtYmVyLAorICAgIENlYW5SZWFkUmFuZ2VzKiAmcHRyX3JhbmdlcworKQoreworICAgIGlmIChpc19hcnJfZGVzY19jb250aWd1b3VzKGFwKSkgeworICAgICAgICBwdHJfcmFuZ2VzID0gTlVMTDsKKyAgICAgICAgX19hcnJfZGF0YV9vZmZzZXRfYW5kX2xlbmd0aChhcCwgb2Zmc2V0LCBzaXplKTsKKyAgICAgICAgZWxfbnVtYmVyID0gc2l6ZSAvIGVsX3NpemU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBwdHJfcmFuZ2VzID0gaW5pdF9yZWFkX3Jhbmdlc19hcnJfZGVzYyhhcCk7CisgICAgICAgIGVsX251bWJlciA9IChwdHJfcmFuZ2VzLT5yYW5nZV9zaXplIC8gZWxfc2l6ZSkgKgorICAgICAgICAgICAgICAgICAgICBwdHJfcmFuZ2VzLT5yYW5nZV9tYXhfbnVtYmVyOworICAgICAgICBzaXplID0gcHRyX3Jhbmdlcy0+cmFuZ2Vfc2l6ZTsKKyAgICB9Cit9CisKK2Fycl9kZXNjICogbWFrZV9hcnJfZGVzYygKKyAgICB2b2lkKiAgIHB0cl92YWwsCisgICAgaW50NjRfdCBleHRlbnRfc3RhcnRfdmFsLAorICAgIGludDY0X3QgZXh0ZW50X2VsZW1lbnRzX3ZhbCwKKyAgICBpbnQ2NF90IHNpemUKKykKK3sKKyAgICBhcnJfZGVzYyAqcmVzOworICAgIHJlcyA9IChhcnJfZGVzYyAqKW1hbGxvYyhzaXplb2YoYXJyX2Rlc2MpKTsKKyAgICByZXMtPmJhc2UgPSByZWludGVycHJldF9jYXN0PGludDY0X3Q+KHB0cl92YWwpOworICAgIHJlcy0+cmFuayA9IDE7CisgICAgcmVzLT5kaW1bMF0uc2l6ZSA9IHNpemU7CisgICAgcmVzLT5kaW1bMF0ubGluZGV4ID0gMDsKKyAgICByZXMtPmRpbVswXS5sb3dlciA9IGV4dGVudF9zdGFydF92YWw7CisgICAgcmVzLT5kaW1bMF0udXBwZXIgPSBleHRlbnRfZWxlbWVudHNfdmFsICsgZXh0ZW50X3N0YXJ0X3ZhbCAtIDE7CisgICAgcmVzLT5kaW1bMF0uc3RyaWRlID0gMTsKKyAgICByZXR1cm4gcmVzOworfQorCitib29sIE9mZmxvYWREZXNjcmlwdG9yOjpnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKQoreworICAgIGludCAgICAgICAgICAgICBwb2ludGVyc19udW1iZXI7CisgICAgaW50ICAgICAgICAgICAgIHRtcF92YWw7CisgICAgaW50ICAgICAgICAgICAgIG5ld19pbmRleCA9IG1fdmFyc190b3RhbDsKKyAgICBjb25zdCBhcnJfZGVzYyAqYXA7CisgICAgY29uc3QgVmFyRGVzYzMgKnZkMyA9IHN0YXRpY19jYXN0PGNvbnN0IFZhckRlc2MzKj4obV92YXJzW2ldLnB0cik7CisgICAgaW50ICAgICAgICAgICAgIGZsYWdzID0gdmQzLT5hcnJheV9maWVsZHM7CisgICAgYm9vbCAgICAgICAgICAgIHNyY19pc19mb3JfbWljID0gKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0IHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5pbnRvID09IE5VTEwpOworCisgICAgUmVhZEFyckVsZW1lbnRzPHZvaWQgKj4gIHB0cjsKKyAgICBSZWFkQXJyRWxlbWVudHM8dm9pZCAqPiAgaW50bzsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZXh0X3N0YXJ0OworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBleHRfZWxlbWVudHM7CisgICAgUmVhZEFyckVsZW1lbnRzPGludDY0X3Q+IGFsaWduOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gZnJlZV9pZjsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gaW50b19lbGVtOworICAgIFJlYWRBcnJFbGVtZW50czxpbnQ2NF90PiBhbGxvY19zdGFydDsKKyAgICBSZWFkQXJyRWxlbWVudHM8aW50NjRfdD4gYWxsb2NfZWxlbTsKKworCisgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+cHRyX2FycmF5KTsKKworICAgIC8vICJwb2ludGVyc19udW1iZXIiIGZvciB0b3RhbCBudW1iZXIgb2YgdHJhbnNmZXJyZWQgcG9pbnRlcnMuCisgICAgLy8gRm9yIGVhY2ggb2YgdGhlbSB3ZSBjcmVhdGUgbmV3IHZhcl9kZXNjIGFuZCBwdXQgaXQgYXQgdGhlIGJvdHRvbQorICAgIC8vIG9mIHRoZSB2YXJfZGVzYydzIGFycmF5CisgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIHNpemVvZih2b2lkICopLCBwdHIub2Zmc2V0LCBwdHIuc2l6ZSwKKyAgICAgICAgcG9pbnRlcnNfbnVtYmVyLCBwdHIucmFuZ2VzKTsKKyAgICBwdHIuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKworICAgIC8vIDIuIHByZXBhcmUgbWVtb3J5IGZvciBuZXcgdmFyX2Rlc2NzCisgICAgbV92YXJzX3RvdGFsICs9IHBvaW50ZXJzX251bWJlcjsKKyAgICBtX3ZhcnMgICAgICAgPSAoVmFyRGVzYyopcmVhbGxvYyhtX3ZhcnMsIG1fdmFyc190b3RhbCAqIHNpemVvZihWYXJEZXNjKSk7CisgICAgbV92YXJzX2V4dHJhID0KKyAgICAgICAgKFZhckV4dHJhKilyZWFsbG9jKG1fdmFyc19leHRyYSwgbV92YXJzX3RvdGFsICogc2l6ZW9mKFZhckV4dHJhKSk7CisgICAgbV9pbl9kZXBzICAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1faW5fZGVwcywgc2l6ZW9mKENPSUVWRU5UKSAqIChtX3ZhcnNfdG90YWwgKyAxKSk7CisgICAgbV9vdXRfZGVwcyAgID0KKyAgICAgICAgKENPSUVWRU5UKilyZWFsbG9jKG1fb3V0X2RlcHMsIHNpemVvZihDT0lFVkVOVCkgKiBtX3ZhcnNfdG90YWwpOworCisgICAgLy8gMy4gUHJlcGFyZSBmb3IgcmVhZGluZyBuZXcgdmFyX2Rlc2MncyBmaWVsZHMKKyAgICAvLyAgICBFWFRFTlQgU1RBUlQKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfc3RhcnQpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGV4dF9zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBleHRfc3RhcnQuc2l6ZSwgdG1wX3ZhbCwgZXh0X3N0YXJ0LnJhbmdlcyk7CisgICAgICAgIGV4dF9zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBleHRfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2V4dGVudF9zdGFydF9pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAoaW50NjRfdCl2ZDMtPmV4dGVudF9zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGV4dF9zdGFydC52YWwgPSAwOworICAgIH0KKworICAgIC8vICAgIEVYVEVOVCBFTEVNRU5UUyBOVU1CRVIKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5leHRlbnRfZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsCisgICAgICAgICAgICBleHRfZWxlbWVudHMub2Zmc2V0LCBleHRfZWxlbWVudHMuc2l6ZSwKKyAgICAgICAgICAgIHRtcF92YWwsIGV4dF9lbGVtZW50cy5yYW5nZXMpOworICAgICAgICBleHRfZWxlbWVudHMuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZXh0X2VsZW1lbnRzLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJleHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIGlmICgoZmxhZ3MgJiAoMTw8ZmxhZ19leHRlbnRfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gKGludDY0X3QpdmQzLT5leHRlbnRfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBleHRfZWxlbWVudHMudmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIEFMTE9DX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19pZl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfaWYub2Zmc2V0LAorICAgICAgICAgICAgYWxsb2NfaWYuc2l6ZSwgdG1wX3ZhbCwgYWxsb2NfaWYucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2NfaWYuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2lmIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBGUkVFX0lGCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmZyZWVfaWZfYXJyYXkpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGZyZWVfaWYub2Zmc2V0LAorICAgICAgICAgICAgZnJlZV9pZi5zaXplLCB0bXBfdmFsLCBmcmVlX2lmLnJhbmdlcyk7CisgICAgICAgIGZyZWVfaWYuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgZnJlZV9pZi5lbF9zaXplID0gYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemU7CisKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZnJlZV9pZiIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlX2lmLnZhbCA9IG1fdmFyc1tpXS5jb3VudDsKKyAgICB9CisKKyAgICAvLyAgICBBTElHTgorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsaWduX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGlnbl9hcnJheSk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxpZ24ub2Zmc2V0LAorICAgICAgICAgICAgYWxpZ24uc2l6ZSwgdG1wX3ZhbCwgYWxpZ24ucmFuZ2VzKTsKKyAgICAgICAgYWxpZ24uYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxpZ24uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsaWduIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsaWduLnZhbCA9IG1fdmFyc1tpXS5hbGlnbjsKKyAgICB9CisKKyAgICAvLyAzLjEgSU5UTworCisgICAgaWYgKG1fdmFyc1tpXS5pbnRvKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50by5vZmZzZXQsCisgICAgICAgICAgICBpbnRvLnNpemUsIHRtcF92YWwsIGludG8ucmFuZ2VzKTsKKyAgICAgICAgaW50by5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIDMuMiBJTlRPX1NUQVJUCisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpICE9IDApIHsKKyAgICAgICAgYXAgPSBzdGF0aWNfY2FzdDxjb25zdCBhcnJfZGVzYyo+KHZkMy0+aW50b19zdGFydCk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgaW50b19zdGFydC5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX3N0YXJ0LnNpemUsIHRtcF92YWwsIGludG9fc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgaW50b19zdGFydC5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX3N0YXJ0LmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKworICAgICAgICBpZiAodG1wX3ZhbCA8IHBvaW50ZXJzX251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fc3RhcnRfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBpbnRvX3N0YXJ0LnZhbCA9IChpbnQ2NF90KXZkMy0+aW50b19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGludG9fc3RhcnQudmFsID0gMDsKKyAgICB9CisKKyAgICAvLyAzLjMgSU5UT19FTEVNRU5UUworCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmludG9fZWxlbWVudHMpOworICAgICAgICBnZXRfYXJyX2Rlc2NfbnVtYmVycyhhcCwgYXAtPmRpbVthcC0+cmFuayAtIDFdLnNpemUsIGludG9fZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBpbnRvX2VsZW0uc2l6ZSwgdG1wX3ZhbCwgaW50b19lbGVtLnJhbmdlcyk7CisgICAgICAgIGludG9fZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBpbnRvX2VsZW0uZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfaW50b19lbGVtZW50c19pc19zY2FsYXIpKSAhPSAwKSB7CisgICAgICAgIGludG9fZWxlbS52YWwgPSAoaW50NjRfdCl2ZDMtPmludG9fZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbnRvX2VsZW0udmFsID0gbV92YXJzW2ldLmNvdW50OworICAgIH0KKworICAgIC8vICAgIGFsbG9jX3N0YXJ0CisKKyAgICBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2Nfc3RhcnRfaXNfYXJyYXkpKSAhPSAwKSB7CisgICAgICAgIGFwID0gc3RhdGljX2Nhc3Q8Y29uc3QgYXJyX2Rlc2MqPih2ZDMtPmFsbG9jX3N0YXJ0KTsKKyAgICAgICAgZ2V0X2Fycl9kZXNjX251bWJlcnMoYXAsIGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQub2Zmc2V0LCBhbGxvY19zdGFydC5zaXplLCB0bXBfdmFsLAorICAgICAgICAgICAgYWxsb2Nfc3RhcnQucmFuZ2VzKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuYmFzZSA9IHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcio+KGFwLT5iYXNlKTsKKyAgICAgICAgYWxsb2Nfc3RhcnQuZWxfc2l6ZSA9IGFwLT5kaW1bYXAtPnJhbmsgLSAxXS5zaXplOworCisgICAgICAgIGlmICh0bXBfdmFsIDwgcG9pbnRlcnNfbnVtYmVyKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImFsbG9jX2V4dGVudCBzdGFydCIpOworICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX3NjYWxhcikpICE9IDApIHsKKyAgICAgICAgYWxsb2Nfc3RhcnQudmFsID0gKGludDY0X3QpdmQzLT5hbGxvY19zdGFydDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGFsbG9jX3N0YXJ0LnZhbCA9IDA7CisgICAgfQorCisgICAgLy8gICAgYWxsb2NfZWxlbQorCisgICAgaWYgKChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2VsZW1lbnRzX2lzX2FycmF5KSkgIT0gMCkgeworICAgICAgICBhcCA9IHN0YXRpY19jYXN0PGNvbnN0IGFycl9kZXNjKj4odmQzLT5hbGxvY19lbGVtZW50cyk7CisgICAgICAgIGdldF9hcnJfZGVzY19udW1iZXJzKGFwLCBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZSwgYWxsb2NfZWxlbS5vZmZzZXQsCisgICAgICAgICAgICBhbGxvY19lbGVtLnNpemUsIHRtcF92YWwsIGFsbG9jX2VsZW0ucmFuZ2VzKTsKKyAgICAgICAgYWxsb2NfZWxlbS5iYXNlID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oYXAtPmJhc2UpOworICAgICAgICBhbGxvY19lbGVtLmVsX3NpemUgPSBhcC0+ZGltW2FwLT5yYW5rIC0gMV0uc2l6ZTsKKyAgICAgICAgaWYgKHRtcF92YWwgPCBwb2ludGVyc19udW1iZXIpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYWxsb2NfZXh0ZW50IGVsZW1lbnRzIik7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoKGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfc2NhbGFyKSkgIT0gMCkgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IChpbnQ2NF90KXZkMy0+YWxsb2NfZWxlbWVudHM7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBhbGxvY19lbGVtLnZhbCA9IDA7CisgICAgfQorCisgICAgZm9yIChpbnQgayA9IDA7IGsgPCBwb2ludGVyc19udW1iZXI7IGsrKykgeworICAgICAgICBpbnQgdHlwZSA9IGZsYWdzICYgMHgzZjsKKyAgICAgICAgaW50IHR5cGVfc3JjLCB0eXBlX2RzdDsKKyAgICAgICAgLy8gIEdldCBuZXcgdmFsdWVzCisgICAgICAgIC8vIHR5cGVfc3JjLCB0eXBlX2RzdAorICAgICAgICB0eXBlX3NyYyA9IHR5cGVfZHN0ID0gKHR5cGUgPT0gY19kYXRhX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19kYXRhX3B0ciAgIDogKHR5cGUgPT0gY19mdW5jX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19mdW5jX3B0ciAgIDogKHR5cGUgPT0gY192b2lkX3B0cl9hcnJheSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY192b2lkX3B0ciAgIDogKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgOiAwOworCisgICAgICAgIC8vIEdldCBwdHIgdmFsCisgICAgICAgIGlmICghcHRyLnJlYWRfbmV4dCh0cnVlKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBwdHIudmFsID0gKHZvaWQqKShwdHIuYmFzZSArIHB0ci5vZmZzZXQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gISEhIElmIHdlIGdvdCBlcnJvciBhdCBwaGFzZSBvZiByZWFkaW5nIC0gaXQncyBhbiBpbnRlcm5hbAorICAgICAgICAvLyAhISEgZXJyb3IsIGFzIHdlIG11c3QgZGV0ZWN0IG1pc21hdGNoIGJlZm9yZQorCisgICAgICAgIC8vIEdldCBpbnRvIHZhbAorICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIGlmICghaW50by5yZWFkX25leHQodHJ1ZSkpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG8iKTsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgaW50by52YWwgPSAodm9pZCopKGludG8uYmFzZSArIGludG8ub2Zmc2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vIEdldCBvdGhlciBjb21wb25lbnRzIG9mIHRoZSBjbGF1c2UKKyAgICAgICAgaWYgKCFleHRfc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfZXh0ZW50X3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghZXh0X2VsZW1lbnRzLnJlYWRfbmV4dCgKKyAgICAgICAgICAgICAgICBmbGFncyAmICgxPDxmbGFnX2V4dGVudF9lbGVtZW50c19pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImV4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX2lmX2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfaWYiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCFmcmVlX2lmLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ZyZWVfaWZfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJmcmVlX2lmIik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxpZ24ucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfYWxpZ25faXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGlnbiIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWludG9fc3RhcnQucmVhZF9uZXh0KGZsYWdzICYgKDE8PGZsYWdfaW50b19zdGFydF9pc19hcnJheSkpKSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcG9pbnRlcl9hcnJheV9taXNtYXRjaCwgImludG9fZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghaW50b19lbGVtLnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2ludG9fZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJpbnRvX2V4dGVudCBlbGVtZW50cyIpOworICAgICAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICAgICAgfQorICAgICAgICBpZiAoIWFsbG9jX3N0YXJ0LnJlYWRfbmV4dChmbGFncyAmICgxPDxmbGFnX2FsbG9jX3N0YXJ0X2lzX2FycmF5KSkpIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19wb2ludGVyX2FycmF5X21pc21hdGNoLCAiYWxsb2NfZXh0ZW50IHN0YXJ0Iik7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0FCT1JUOworICAgICAgICB9CisgICAgICAgIGlmICghYWxsb2NfZWxlbS5yZWFkX25leHQoCisgICAgICAgICAgICAgICAgIGZsYWdzICYgKDE8PGZsYWdfYWxsb2NfZWxlbWVudHNfaXNfYXJyYXkpKSkgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX3BvaW50ZXJfYXJyYXlfbWlzbWF0Y2gsICJhbGxvY19leHRlbnQgZWxlbWVudHMiKTsKKyAgICAgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uZGlyZWN0aW9uLmJpdHMgPSBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvY19pZiA9IGFsbG9jX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmZyZWVfaWYgPSBmcmVlX2lmLnZhbDsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmFsaWduID0gYWxpZ24udmFsOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ubWljX29mZnNldCA9IDA7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5mbGFncy5iaXRzID0gbV92YXJzW2ldLmZsYWdzLmJpdHM7CisgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5vZmZzZXQgPSAwOworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IG1fdmFyc1tpXS5zaXplOworCisgICAgICAgIGlmIChleHRfc3RhcnQudmFsID09IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5jb3VudCA9IGV4dF9lbGVtZW50cy52YWw7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10ucHRyID0gcHRyLnZhbDsKKyAgICAgICAgICAgIGlmICh0eXBlX3NyYyA9PSBjX3N0cmluZ19wdHIpIHsKKyAgICAgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uc2l6ZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uY291bnQgPSAwOworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnB0ciA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBleHRfc3RhcnQudmFsLAorICAgICAgICAgICAgICAgIGV4dF9lbGVtZW50cy52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKworICAgICAgICAgICAgdHlwZV9zcmMgPSB0eXBlX3NyYyA9PSBjX2RhdGFfcHRyID8gY19jZWFuX3Zhcl9wdHIgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX3N0cmluZ19wdHIgPyBjX2NlYW5fdmFyX3B0ciA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uaW50bykgeworICAgICAgICAgICAgICAgIHR5cGVfZHN0ID0gdHlwZV9zcmM7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8gJiYgaW50b19lbGVtLnZhbCAhPSAwKSB7CisgICAgICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10uaW50byA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgaW50by52YWwsCisgICAgICAgICAgICAgICAgaW50b19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgaW50b19lbGVtLnZhbCwKKyAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSkpOworICAgICAgICAgICAgdHlwZV9kc3QgPSAodHlwZSA9PSBjX2RhdGFfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgKHR5cGUgPT0gY19zdHJpbmdfcHRyX2FycmF5KSA/IGNfY2Vhbl92YXJfcHRyIDoKKyAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVfc3JjOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLmludG8gPSBOVUxMOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGFsbG9jX2VsZW0udmFsICE9IDApIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9CisgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCo+KG1ha2VfYXJyX2Rlc2MoCisgICAgICAgICAgICAgICAgcHRyLnZhbCwKKyAgICAgICAgICAgICAgICBhbGxvY19zdGFydC52YWwsCisgICAgICAgICAgICAgICAgYWxsb2NfZWxlbS52YWwsCisgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIG1fdmFyc1tuZXdfaW5kZXggKyBrXS5hbGxvYyA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICBtX3ZhcnNbbmV3X2luZGV4ICsga10udHlwZS5zcmMgPSB0eXBlX3NyYzsKKyAgICAgICAgbV92YXJzW25ld19pbmRleCArIGtdLnR5cGUuZHN0ID0gdHlwZV9kc3Q7CisKKyAgICAgICAgbV92YXJzX2V4dHJhW25ld19pbmRleCArIGtdLmlzX2Fycl9wdHJfZWwgPSAxOworICAgICAgICBtX3ZhcnNfZXh0cmFbbmV3X2luZGV4ICsga10ucHRyX2Fycl9vZmZzZXQgPQorICAgICAgICAgICAgc3JjX2lzX2Zvcl9taWMgPyBwdHIub2Zmc2V0IDogaW50by5vZmZzZXQ7CisgICAgfQorICAgIC8vIGNvdW50IGFuZCBhbGxvYyBmaWVsZHMgYXJlIHVzZWxlc3MgYXQgdGFyZ2V0LiBUaGV5IGNhbiBiZSByZXVzZWQKKyAgICAvLyBmb3IgcG9pbnRlciBhcnJheXMuCisgICAgbV92YXJzW2ldLmNvdW50ID0gcG9pbnRlcnNfbnVtYmVyOworICAgIG1fdmFyc1tpXS5wdHJfYXJyX29mZnNldCA9IG5ld19pbmRleDsKKyAgICByZXR1cm4gdHJ1ZTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX2ZpbmlfbGlicmFyeSh2b2lkKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkNsZWFudXAgb2ZmbG9hZCBsaWJyYXJ5IC4uLlxuIik7CisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsID4gMCkgeworICAgICAgICBkZWxldGVbXSBtaWNfZW5naW5lczsKKworICAgICAgICBpZiAobWljX3Byb3h5X2ZzX3Jvb3QgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtaWNfcHJveHlfZnNfcm9vdCk7CisgICAgICAgICAgICBtaWNfcHJveHlfZnNfcm9vdCA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAobWljX2xpYnJhcnlfcGF0aCAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1pY19saWJyYXJ5X3BhdGgpOworICAgICAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IDA7CisgICAgICAgIH0KKworICAgICAgICAvLyBkZXN0cm95IHRocmVhZCBrZXkKKyAgICAgICAgdGhyZWFkX2tleV9kZWxldGUobWljX3RocmVhZF9rZXkpOworICAgIH0KKworICAgIC8vIHVubG9hZCBDT0kgbGlicmFyeQorICAgIGlmIChDT0k6OmlzX2F2YWlsYWJsZSkgeworICAgICAgICBDT0k6OmZpbmkoKTsKKyAgICB9CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJDbGVhbnVwIG9mZmxvYWQgbGlicmFyeSAuLi4gZG9uZVxuIik7Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSh2b2lkKQoreworICAgIENPSVJFU1VMVCByZXM7CisgICAgdWludDMyX3QgbnVtX2RldmljZXM7CisgICAgc3RkOjpiaXRzZXQ8TUlDX0VOR0lORVNfTUFYPiBkZXZpY2VzOworCisgICAgcHJlZml4ID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ob3N0KTsKKworICAgIC8vIGluaXRpYWxpemUgdHJhY2UKKyAgICBjb25zdCBjaGFyICplbnZfdmFyID0gZ2V0ZW52KGh0cmFjZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGNvbnNvbGVfZW5hYmxlZCA9IG5ld192YWwgJiAweDBmOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX3JlcG9ydF9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBlbnZfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgZW52X3ZhbCkpIHsKKyAgICAgICAgICAgIGlmIChlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzEgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzIgfHwKKyAgICAgICAgICAgICAgICBlbnZfdmFsID09IE9GRkxPQURfUkVQT1JUXzMpIHsKKyAgICAgICAgICAgICAgICBvZmZsb2FkX3JlcG9ydF9sZXZlbCA9IGVudl92YWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfcmVwb3J0X3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX2ludF92YWx1ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2ZmbG9hZF9yZXBvcnRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIW9mZmxvYWRfcmVwb3J0X2xldmVsKSB7CisgICAgICAgIGVudl92YXIgPSBnZXRlbnYodGltZXJfZW52bmFtZSk7CisgICAgICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICAgICAgdGltZXJfZW5hYmxlZCA9IGF0b2koZW52X3Zhcik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBpbml0aWFsaXplIENPSQorICAgIGlmICghQ09JOjppbml0KCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGdldCBudW1iZXIgb2YgZGV2aWNlcyBpbnN0YWxsZWQgaW4gdGhlIHN5c3RlbQorICAgIHJlcyA9IENPSTo6RW5naW5lR2V0Q291bnQoQ09JX0lTQV9LTkMsICZudW1fZGV2aWNlcyk7CisgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKG51bV9kZXZpY2VzID4gTUlDX0VOR0lORVNfTUFYKSB7CisgICAgICAgIG51bV9kZXZpY2VzID0gTUlDX0VOR0lORVNfTUFYOworICAgIH0KKworICAgIC8vIGZpbGwgaW4gdGhlIGxpc3Qgb2YgZGV2aWNlcyB0aGF0IGNhbiBiZSB1c2VkIGZvciBvZmZsb2FkaW5nCisgICAgZW52X3ZhciA9IGdldGVudigiT0ZGTE9BRF9ERVZJQ0VTIik7CisgICAgaWYgKGVudl92YXIgIT0gMCkgeworICAgICAgICBpZiAoc3RyY2FzZWNtcChlbnZfdmFyLCAibm9uZSIpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHZhbHVlIGlzIGNvbXBvc2VkIG9mIGNvbW1hIHNlcGFyYXRlZCBwaHlzaWNhbCBkZXZpY2UgaW5kZXhlcworICAgICAgICAgICAgY2hhciAqYnVmID0gc3RyZHVwKGVudl92YXIpOworICAgICAgICAgICAgY2hhciAqc3RyLCAqcHRyOworICAgICAgICAgICAgZm9yIChzdHIgPSBzdHJ0b2tfcihidWYsICIsIiwgJnB0cik7IHN0ciAhPSAwOworICAgICAgICAgICAgICAgICBzdHIgPSBzdHJ0b2tfcigwLCAiLCIsICZwdHIpKSB7CisgICAgICAgICAgICAgICAgLy8gY29udmVydCBzdHJpbmcgdG8gYW4gaW50CisgICAgICAgICAgICAgICAgaW50NjRfdCBudW07CisgICAgICAgICAgICAgICAgaWYgKCFfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhzdHIsIG51bSkpIHsKKyAgICAgICAgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX21pY19pbml0NSk7CisKKyAgICAgICAgICAgICAgICAgICAgLy8gZmFsbGJhY2sgdG8gdXNpbmcgYWxsIGluc3RhbGxlZCBkZXZpY2VzCisgICAgICAgICAgICAgICAgICAgIGRldmljZXMucmVzZXQoKTsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBudW1fZGV2aWNlczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKG51bSA8IDAgfHwgbnVtID49IG51bV9kZXZpY2VzKSB7CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDYsIG51bSk7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChudW0pOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZnJlZShidWYpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLyB1c2UgYWxsIGF2YWlsYWJsZSBkZXZpY2VzCisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbnVtX2RldmljZXM7IGkrKykgeworICAgICAgICAgICAgQ09JRU5HSU5FIGVuZ2luZTsKKyAgICAgICAgICAgIHJlcyA9IENPSTo6RW5naW5lR2V0SGFuZGxlKENPSV9JU0FfS05DLCBpLCAmZW5naW5lKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgICAgICAgICBkZXZpY2VzLnNldChpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1pY19lbmdpbmVzX3RvdGFsID0gZGV2aWNlcy5jb3VudCgpOworCisgICAgLy8gbm8gbmVlZCB0byBjb250aW51ZSBpZiB0aGVyZSBhcmUgbm8gZGV2aWNlcyB0byBvZmZsb2FkIHRvCisgICAgaWYgKG1pY19lbmdpbmVzX3RvdGFsIDw9IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGluaXRpYWxpemUgaW5kZXhlcyBmb3IgYXZhaWxhYmxlIGRldmljZXMKKyAgICBtaWNfZW5naW5lcyA9IG5ldyBFbmdpbmVbbWljX2VuZ2luZXNfdG90YWxdOworICAgIGZvciAoaW50IHBfaWR4ID0gMCwgbF9pZHggPSAwOyBwX2lkeCA8IG51bV9kZXZpY2VzOyBwX2lkeCsrKSB7CisgICAgICAgIGlmIChkZXZpY2VzW3BfaWR4XSkgeworICAgICAgICAgICAgbWljX2VuZ2luZXNbbF9pZHhdLnNldF9pbmRleGVzKGxfaWR4LCBwX2lkeCk7CisgICAgICAgICAgICBsX2lkeCsrOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gbGlicmFyeSBzZWFyY2ggcGF0aCBmb3IgZGV2aWNlIGJpbmFyaWVzCisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX0xEX0xJQlJBUllfUEFUSCIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgbWljX2xpYnJhcnlfcGF0aCA9IHN0cmR1cChlbnZfdmFyKTsKKyAgICB9CisKKyAgICAvLyBtZW1vcnkgc2l6ZSByZXNlcnZlZCBmb3IgQ09JIGJ1ZmZlcnMKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfQlVGRkVSU0laRSIpOworICAgIGlmIChlbnZfdmFyICE9IDApIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBtaWNfYnVmZmVyX3NpemUgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfdmFsdWUsICJNSUNfQlVGRkVSU0laRSIpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gZGV0ZXJtaW5lIHN0YWNrc2l6ZSBmb3IgdGhlIHBpcGVsaW5lIG9uIHRoZSBkZXZpY2UKKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfU1RBQ0tTSVpFIik7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIHVpbnQ2NF90IG5ld19zaXplOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGVudl92YXIsIG5ld19zaXplKSAmJgorICAgICAgICAgICAgKG5ld19zaXplID49IDE2Mzg0KSAmJiAoKG5ld19zaXplICYgNDA5NSkgPT0gMCkpIHsKKyAgICAgICAgICAgIG1pY19zdGFja19zaXplID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWljX2luaXQzKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIHByb3h5IEkvTworICAgIGVudl92YXIgPSBnZXRlbnYoIk1JQ19QUk9YWV9JTyIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBpbnQ2NF90IG5ld192YWw7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2VfaW50X3N0cmluZyhlbnZfdmFyLCBuZXdfdmFsKSkgeworICAgICAgICAgICAgbWljX3Byb3h5X2lvID0gbmV3X3ZhbDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2Vudl92YXJfaW50X3ZhbHVlLCAiTUlDX1BST1hZX0lPIik7CisgICAgICAgIH0KKyAgICB9CisgICAgZW52X3ZhciA9IGdldGVudigiTUlDX1BST1hZX0ZTX1JPT1QiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgbWljX3Byb3h5X2ZzX3Jvb3QgPSBzdHJkdXAoZW52X3Zhcik7CisgICAgfQorCisgICAgLy8gUHJlcGFyZSBlbnZpcm9ubWVudCBmb3IgdGhlIHRhcmdldCBwcm9jZXNzIHVzaW5nIHRoZSBmb2xsb3dpbmcKKyAgICAvLyBydWxlcworICAgIC8vIC0gSWYgTUlDX0VOVl9QUkVGSVggaXMgc2V0IHRoZW4gYW55IGVudmlyb25tZW50IHZhcmlhYmxlIG9uIHRoZQorICAgIC8vICAgaG9zdCB3aGljaCBoYXMgdGhhdCBwcmVmaXggYXJlIGNvcGllZCB0byB0aGUgZGV2aWNlIHdpdGhvdXQKKyAgICAvLyAgIHRoZSBwcmVmaXguCisgICAgLy8gICBBbGwgb3RoZXIgaG9zdCBlbnZpcm9ubWVudCB2YXJpYWJsZXMgYXJlIGlnbm9yZWQuCisgICAgLy8gLSBJZiBNSUNfRU5WX1BSRUZJWCBpcyBub3Qgc2V0IG9yIGlmIE1JQ19FTlZfUFJFRklYPSIiIHRoZW4gaG9zdAorICAgIC8vICAgZW52aXJvbm1lbnQgaXMgZHVwbGljYXRlZC4KKyAgICBlbnZfdmFyID0gZ2V0ZW52KCJNSUNfRU5WX1BSRUZJWCIpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICBtaWNfZW52X3ZhcnMuc2V0X3ByZWZpeChlbnZfdmFyKTsKKworICAgICAgICBpbnQgbGVuID0gc3RybGVuKGVudl92YXIpOworICAgICAgICBmb3IgKGludCBpID0gMDsgZW52aXJvbltpXSAhPSAwOyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGVudmlyb25baV0sIGVudl92YXIsIGxlbikgPT0gMCAmJgorICAgICAgICAgICAgICAgIHN0cm5jbXAoZW52aXJvbltpXSwgIk1JQ19MRF9MSUJSQVJZX1BBVEgiLCAxOSkgIT0gMCAmJgorICAgICAgICAgICAgICAgIGVudmlyb25baV1bbGVuXSAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBtaWNfZW52X3ZhcnMuYW5hbHl6ZV9lbnZfdmFyKGVudmlyb25baV0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLy8gY3JlYXRlIGtleSBmb3IgdGhyZWFkIGRhdGEKKyAgICBpZiAodGhyZWFkX2tleV9jcmVhdGUoJm1pY190aHJlYWRfa2V5LCBFbmdpbmU6OmRlc3Ryb3lfdGhyZWFkX2RhdGEpKSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19taWNfaW5pdDQsIGVycm5vKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIGNwdSBmcmVxdWVuY3kKKyAgICBjcHVfZnJlcXVlbmN5ID0gQ09JOjpQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKKworICAgIGVudl92YXIgPSBnZXRlbnYobWljX3VzZV8ybWJfYnVmZmVyc19lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlXzJtYl9idWZmZXJzID0gbmV3X3NpemU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfaW52YWxpZF9lbnZfdmFyX3ZhbHVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtaWNfdXNlXzJtYl9idWZmZXJzX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZV9lbnZuYW1lKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgdWludDY0X3QgbmV3X3NpemU7CisgICAgICAgIGlmIChfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoZW52X3ZhciwgbmV3X3NpemUpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfdXNlX2FzeW5jX2J1ZmZlcl93cml0ZSA9IG5ld19zaXplOworICAgICAgICB9CisgICAgfQorCisgICAgZW52X3ZhciA9IGdldGVudihtaWNfdXNlX2FzeW5jX2J1ZmZlcl9yZWFkX2Vudm5hbWUpOworICAgIGlmIChlbnZfdmFyICE9IDAgJiYgKmVudl92YXIgIT0gJ1wwJykgeworICAgICAgICB1aW50NjRfdCBuZXdfc2l6ZTsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9zaXplX3N0cmluZyhlbnZfdmFyLCBuZXdfc2l6ZSkpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF91c2VfYXN5bmNfYnVmZmVyX3JlYWQgPSBuZXdfc2l6ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIG1pYyBpbml0aWFsaXphdGlvbiB0eXBlCisgICAgZW52X3ZhciA9IGdldGVudihvZmZsb2FkX2luaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGlmIChzdHJjbXAoZW52X3ZhciwgIm9uX29mZmxvYWQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX29mZmxvYWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoc3RyY21wKGVudl92YXIsICJvbl9vZmZsb2FkX2FsbCIpID09IDApIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9pbml0X3R5cGUgPSBjX2luaXRfb25fb2ZmbG9hZF9hbGw7CisgICAgICAgIH0KKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgaWYgKHN0cmNtcChlbnZfdmFyLCAib25fc3RhcnQiKSA9PSAwKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfaW5pdF90eXBlID0gY19pbml0X29uX3N0YXJ0OworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl92YWx1ZSwgb2ZmbG9hZF9pbml0X2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gYWN0aXZlIHdhaXQKKyAgICBlbnZfdmFyID0gZ2V0ZW52KG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpKSB7CisgICAgICAgICAgICBfX29mZmxvYWRfYWN0aXZlX3dhaXQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9mZmxvYWRfYWN0aXZlX3dhaXRfZW52bmFtZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBvbXAgZGV2aWNlIG51bQorICAgIGVudl92YXIgPSBnZXRlbnYob21wX2RldmljZV9udW1fZW52bmFtZSk7CisgICAgaWYgKGVudl92YXIgIT0gMCAmJiAqZW52X3ZhciAhPSAnXDAnKSB7CisgICAgICAgIGludDY0X3QgbmV3X3ZhbDsKKyAgICAgICAgaWYgKF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGVudl92YXIsIG5ld192YWwpICYmIG5ld192YWwgPj0gMCkgeworICAgICAgICAgICAgX19vbXBfZGV2aWNlX251bSA9IG5ld192YWw7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb21wX2ludmFsaWRfZGV2aWNlX251bV9lbnYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9kZXZpY2VfbnVtX2Vudm5hbWUpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gaW5pdCBPUlNMCisgICAgT1JTTDo6aW5pdCgpOworfQorCitleHRlcm4gaW50IF9fb2ZmbG9hZF9pbml0X2xpYnJhcnkodm9pZCkKK3sKKyAgICAvLyBkbyBvbmUgdGltZSBpbnRpYWxpemF0aW9uCisgICAgc3RhdGljIE9mZmxvYWRPbmNlQ29udHJvbCBjdHJsID0gT0ZGTE9BRF9PTkNFX0NPTlRST0xfSU5JVDsKKyAgICBfX29mZmxvYWRfcnVuX29uY2UoJmN0cmwsIF9fb2ZmbG9hZF9pbml0X2xpYnJhcnlfb25jZSk7CisKKyAgICAvLyBvZmZsb2FkIGlzIGF2YWlsYWJsZSBpZiBDT0kgaXMgYXZhaWxhYmxlIGFuZCB0aGUgbnVtYmVyIG9mIGRldmljZXMgPiAwCisgICAgYm9vbCBpc19hdmFpbGFibGUgPSBDT0k6OmlzX2F2YWlsYWJsZSAmJiAobWljX2VuZ2luZXNfdG90YWwgPiAwKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgbGlicmFyaWVzIGlmIHRoZXJlIGFyZSBhbnkKKyAgICBpZiAoaXNfYXZhaWxhYmxlICYmIF9fdGFyZ2V0X2xpYnMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fdGFyZ2V0X2xpYnNfbG9jayk7CisKKyAgICAgICAgZm9yIChUYXJnZXRJbWFnZUxpc3Q6Oml0ZXJhdG9yIGl0ID0gX190YXJnZXRfbGlic19saXN0LmJlZ2luKCk7CisgICAgICAgICAgICAgaXQgIT0gX190YXJnZXRfbGlic19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgICAgICAvLyBSZWdpc3RlciBsaWJyYXJ5IGluIENPSQorICAgICAgICAgICAgQ09JOjpQcm9jZXNzUmVnaXN0ZXJMaWJyYXJpZXMoMSwgJml0LT5kYXRhLCAmaXQtPnNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmaXQtPm9yaWdpbiwgJml0LT5vZmZzZXQpOworCisgICAgICAgICAgICAvLyBhZGQgbGliIHRvIGFsbCBlbmdpbmVzCisgICAgICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5hZGRfbGliKCppdCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBfX3RhcmdldF9saWJzID0gZmFsc2U7CisgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5jbGVhcigpOworICAgIH0KKworICAgIHJldHVybiBpc19hdmFpbGFibGU7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIGNvbnN0IHN0cnVjdCBJbWFnZSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworICAgIHVpbnQ2NF90ICAgIHNpemUgPSBpbWFnZS0+c2l6ZTsKKyAgICBjb25zdCBjaGFyICpvcmlnaW4gPSAwOworICAgIHVpbnQ2NF90ICAgIG9mZnNldCA9IDA7CisKKyAgICAvLyBvdXIgYWN0aW9ucyBkZXBlbmQgb24gdGhlIGltYWdlIHR5cGUKKyAgICBjb25zdCBFbGY2NF9FaGRyICpoZHIgPSBzdGF0aWNfY2FzdDxjb25zdCBFbGY2NF9FaGRyKj4oZGF0YSk7CisgICAgc3dpdGNoIChoZHItPmVfdHlwZSkgeworICAgICAgICBjYXNlIEVUX0VYRUM6CisgICAgICAgICAgICAvLyBFYWNoIG9mZmxvYWQgYXBwbGljYXRpb24gaXMgc3VwcG9zZWQgdG8gaGF2ZSBvbmx5IG9uZSB0YXJnZXQKKyAgICAgICAgICAgIC8vIGltYWdlIHJlcHJlc2VudGluZyB0YXJnZXQgZXhlY3V0YWJsZS4KKyAgICAgICAgICAgIC8vIE5vIHRocmVhZCBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgaGVyZSBhcyB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICAgICAgICAgIC8vIGNvZGUgaXMgYWx3YXlzIGV4ZWN1dGVkIGluIGEgc2luZ2xlIHRocmVhZC4KKyAgICAgICAgICAgIGlmIChfX3RhcmdldF9leGUgIT0gMCkgeworICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19tdWx0aXBsZV90YXJnZXRfZXhlcyk7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fdGFyZ2V0X2V4ZSA9IG5ldyBUYXJnZXRJbWFnZShuYW1lLCBkYXRhLCBzaXplLCBvcmlnaW4sIG9mZnNldCk7CisKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBleGVjcyBpcyBhbHdheXMgY2FsbGVkIGZyb20gdGhlIGNvbnRleHQKKyAgICAgICAgICAgIC8vIG9mIG1haW4gYW5kIHRodXMgd2UgY2FuIHNhZmVseSBjYWxsIGFueSBmdW5jdGlvbiBoZXJlLAorICAgICAgICAgICAgLy8gaW5jbHVkaW5nIExvYWRMaWJyYXJ5IEFQSSBvbiB3aW5kb3dzLiBUaGlzIGlzIHRoZSBwbGFjZSB3aGVyZQorICAgICAgICAgICAgLy8gd2UgZG8gdGhlIG9mZmxvYWQgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KKyAgICAgICAgICAgIGlmIChfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCkpIHsKKyAgICAgICAgICAgICAgICAvLyBpbml0aWFsaXplIGVuZ2luZSBpZiBpbml0X3R5cGUgaXMgb25fc3RhcnQKKyAgICAgICAgICAgICAgICBpZiAoX19vZmZsb2FkX2luaXRfdHlwZSA9PSBjX2luaXRfb25fc3RhcnQpIHsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtaWNfZW5naW5lc190b3RhbDsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIEVUX0RZTjoKKyAgICAgICAgICAgIC8vIFJlZ2lzdHJhdGlvbiBjb2RlIGZvciBsaWJyYXJpZXMgaXMgY2FsbGVkIGZyb20gdGhlIERsbE1haW4KKyAgICAgICAgICAgIC8vIGNvbnRleHQgKG9uIHdpbmRvd3MpIGFuZCB0aHVzIHdlIGNhbm5vdCBkbyBhbnl0aGluZyB1c2VmdWwKKyAgICAgICAgICAgIC8vIGhlcmUuIFNvIHdlIGp1c3QgYWRkIGl0IHRvIHRoZSBsaXN0IG9mIHBlbmRpbmcgbGlicmFyaWVzIGZvcgorICAgICAgICAgICAgLy8gdGhlIGxhdGVyIHVzZS4KKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay5sb2NrKCk7CisgICAgICAgICAgICBfX3RhcmdldF9saWJzID0gdHJ1ZTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbGlzdC5wdXNoX2JhY2soVGFyZ2V0SW1hZ2UobmFtZSwgZGF0YSwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3JpZ2luLCBvZmZzZXQpKTsKKyAgICAgICAgICAgIF9fdGFyZ2V0X2xpYnNfbG9jay51bmxvY2soKTsKKyAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAvLyBzb21ldGhpbmcgaXMgZGVmaW5pdGVseSB3cm9uZywgaXNzdWUgYW4gZXJyb3IgYW5kIGV4aXQKKyAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX2JpbmFyeV90eXBlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCAqdGFyZ2V0X2ltYWdlKQoreworICAgIC8vIFRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93czoKKyAgICAvLyAgICAgIDggYnl0ZXMgICAgICAgICAgICAgICAgLSBzaXplIG9mIHRoZSB0YXJnZXQgYmluYXJ5CisgICAgLy8gICAgICBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIC0gYmluYXJ5IG5hbWUKKyAgICAvLyAgICAgIDxzaXplPiBieXRlcyAgICAgICAgICAgLSBiaW5hcnkgY29udGVudHMKKyAgICBjb25zdCBzdHJ1Y3QgSW1hZ2UgeworICAgICAgICAgaW50NjRfdCBzaXplOworICAgICAgICAgY2hhciBkYXRhW107CisgICAgfSAqaW1hZ2UgPSBzdGF0aWNfY2FzdDxjb25zdCBzdHJ1Y3QgSW1hZ2UqPih0YXJnZXRfaW1hZ2UpOworCisgICAgLy8gZGVjb2RlIGltYWdlCisgICAgY29uc3QgY2hhciAqbmFtZSA9IGltYWdlLT5kYXRhOworICAgIGNvbnN0IHZvaWQgKmRhdGEgPSBpbWFnZS0+ZGF0YSArIHN0cmxlbihpbWFnZS0+ZGF0YSkgKyAxOworCisgICAgLy8gb3VyIGFjdGlvbnMgZGVwZW5kIG9uIHRoZSBpbWFnZSB0eXBlCisgICAgY29uc3QgRWxmNjRfRWhkciAqaGRyID0gc3RhdGljX2Nhc3Q8Y29uc3QgRWxmNjRfRWhkcio+KGRhdGEpOworICAgIGlmIChoZHItPmVfdHlwZSA9PSBFVF9FWEVDKSB7CisgICAgICAgIC8vIFdlIGFyZSBleGVjdXRpbmcgZXhlYydzIGRlc2N0cnVjdG9ycy4KKyAgICAgICAgLy8gSXQgaXMgdGltZSB0byBkbyBhIGxpYnJhcnkgY2xlYW51cC4KKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQpIHsKKyAgICAgICAgICAgIE9mZmxvYWRfVGltZXJfUHJpbnQoKTsKKyAgICAgICAgfQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICAgICAgX19vZmZsb2FkX215b0ZpbmkoKTsKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisgICAgICAgIF9fb2ZmbG9hZF9maW5pX2xpYnJhcnkoKTsKKyAgICB9Cit9CisKKy8vIFJ1bnRpbWUgdHJhY2UgaW50ZXJmYWNlIGZvciB1c2VyIHByb2dyYW1zCisKK3ZvaWQgX19vZmZsb2FkX2NvbnNvbGVfdHJhY2UoaW50IGxldmVsKQoreworICAgIGNvbnNvbGVfZW5hYmxlZCA9IGxldmVsOworfQorCisvLyBVc2VyLXZpc2libGUgb2ZmbG9hZCBBUEkKKworaW50IF9PZmZsb2FkX251bWJlcl9vZl9kZXZpY2VzKHZvaWQpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgX09mZmxvYWRfZ2V0X3BoeXNpY2FsX2RldmljZV9udW1iZXIodm9pZCkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBfT2ZmbG9hZF9zaWduYWxlZChpbnQgaW5kZXgsIHZvaWQgKnNpZ25hbCkKK3sKKyAgICBfX29mZmxvYWRfaW5pdF9saWJyYXJ5KCk7CisKKyAgICAvLyBjaGVjayBpbmRleCB2YWx1ZQorICAgIGlmIChpbmRleCA8IDAgfHwgbWljX2VuZ2luZXNfdG90YWwgPD0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDEsIGluZGV4KTsKKyAgICAgICAgTElCT0ZGTE9BRF9BQk9SVDsKKyAgICB9CisKKyAgICAvLyBmaW5kIGFzc29jaWF0ZWQgYXN5bmMgdGFzaworICAgIE9mZmxvYWREZXNjcmlwdG9yICp0YXNrID0KKyAgICAgICAgbWljX2VuZ2luZXNbaW5kZXggJSBtaWNfZW5naW5lc190b3RhbF0uZmluZF9zaWduYWwoc2lnbmFsLCBmYWxzZSk7CisgICAgaWYgKHRhc2sgPT0gMCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfb2ZmbG9hZF9zaWduYWxlZDIsIHNpZ25hbCk7CisgICAgICAgIExJQk9GRkxPQURfQUJPUlQ7CisgICAgfQorCisgICAgcmV0dXJuIHRhc2stPmlzX3NpZ25hbGVkKCk7Cit9CisKK3ZvaWQgX09mZmxvYWRfcmVwb3J0KGludCB2YWwpCit7CisgICAgaWYgKHZhbCA9PSBPRkZMT0FEX1JFUE9SVF9PTiB8fAorICAgICAgICB2YWwgPT0gT0ZGTE9BRF9SRVBPUlRfT0ZGKSB7CisgICAgICAgIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQgPSB2YWw7CisgICAgfQorfQorCisvLyBJREIgc3VwcG9ydAoraW50ICAgX19kYmdfaXNfYXR0YWNoZWQgPSAwOworaW50ICAgX19kYmdfdGFyZ2V0X2lkID0gLTE7CitwaWRfdCBfX2RiZ190YXJnZXRfc29fcGlkID0gLTE7CitjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXSA9IHswfTsKK2NvbnN0IGludCBfX2RiZ19hcGlfbWFqb3JfdmVyc2lvbiA9IDE7Citjb25zdCBpbnQgX19kYmdfYXBpX21pbm9yX3ZlcnNpb24gPSAwOworCit2b2lkIF9fZGJnX3RhcmdldF9zb19sb2FkZWQoKQoreworfQordm9pZCBfX2RiZ190YXJnZXRfc29fdW5sb2FkZWQoKQoreworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5oIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfaG9zdC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVhMjM5OTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9ob3N0LmgKQEAgLTAsMCArMSwzNDMgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyohIFxmaWxlCisgICAgXGJyaWVmIFRoZSBwYXJ0cyBvZiB0aGUgcnVudGltZSBsaWJyYXJ5IHVzZWQgb25seSBvbiB0aGUgaG9zdAorKi8KKworI2lmbmRlZiBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX0hPU1RfSF9JTkNMVURFRAorCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgIm9mZmxvYWRfY29tbW9uLmgiCisjaW5jbHVkZSAib2ZmbG9hZF91dGlsLmgiCisjaW5jbHVkZSAib2ZmbG9hZF9lbmdpbmUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2Vudi5oIgorI2luY2x1ZGUgIm9mZmxvYWRfb3JzbC5oIgorI2luY2x1ZGUgImNvaS9jb2lfY2xpZW50LmgiCisKKy8vIE1JQyBlbmdpbmVzLgorZXh0ZXJuIEVuZ2luZSogIG1pY19lbmdpbmVzOworZXh0ZXJuIHVpbnQzMl90IG1pY19lbmdpbmVzX3RvdGFsOworCisvLyEgVGhlIHRhcmdldCBpbWFnZSBpcyBwYWNrZWQgYXMgZm9sbG93cy4KKy8qISAgICAgIDEuIDggYnl0ZXMgY29udGFpbmluZyB0aGUgc2l6ZSBvZiB0aGUgdGFyZ2V0IGJpbmFyeSAgICAgICAgICAqLworLyohICAgICAgMi4gYSBudWxsLXRlcm1pbmF0ZWQgc3RyaW5nIHdoaWNoIGlzIHRoZSBiaW5hcnkgbmFtZSAgICAgICAgICovCisvKiEgICAgICAzLiA8c2l6ZT4gbnVtYmVyIG9mIGJ5dGVzIHRoYXQgYXJlIHRoZSBjb250ZW50cyBvZiB0aGUgaW1hZ2UgKi8KKy8qISAgICAgIFRoZSBhZGRyZXNzIG9mIHN5bWJvbCBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlCisgICAgICAgICAgICAgaXMgdGhlIGFkZHJlc3Mgb2YgdGhpcyBzdHJ1Y3R1cmUuICAgICAgICAgICAgICAgICAgICAgICAgKi8KK3N0cnVjdCBJbWFnZSB7CisgICAgIGludDY0X3Qgc2l6ZTsgLy8hPCBTaXplIGluIGJ5dGVzIG9mIHRoZSB0YXJnZXQgYmluYXJ5IG5hbWUgYW5kIGNvbnRlbnRzCisgICAgIGNoYXIgZGF0YVtdOyAgLy8hPCBUaGUgbmFtZSBhbmQgY29udGVudHMgb2YgdGhlIHRhcmdldCBpbWFnZQorfTsKKworLy8gVGhlIG9mZmxvYWQgZGVzY3JpcHRvci4KK2NsYXNzIE9mZmxvYWREZXNjcmlwdG9yCit7CitwdWJsaWM6CisgICAgT2ZmbG9hZERlc2NyaXB0b3IoCisgICAgICAgIGludCBpbmRleCwKKyAgICAgICAgX09mZmxvYWRfc3RhdHVzICpzdGF0dXMsCisgICAgICAgIGJvb2wgaXNfbWFuZGF0b3J5LAorICAgICAgICBib29sIGlzX29wZW5tcCwKKyAgICAgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhCisgICAgKSA6CisgICAgICAgIG1fZGV2aWNlKG1pY19lbmdpbmVzW2luZGV4ICUgbWljX2VuZ2luZXNfdG90YWxdKSwKKyAgICAgICAgbV9pc19tYW5kYXRvcnkoaXNfbWFuZGF0b3J5KSwKKyAgICAgICAgbV9pc19vcGVubXAoaXNfb3Blbm1wKSwKKyAgICAgICAgbV9pbm91dF9idWYoMCksCisgICAgICAgIG1fZnVuY19kZXNjKDApLAorICAgICAgICBtX2Z1bmNfZGVzY19zaXplKDApLAorICAgICAgICBtX2luX2RlcHMoMCksCisgICAgICAgIG1faW5fZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV9vdXRfZGVwcygwKSwKKyAgICAgICAgbV9vdXRfZGVwc190b3RhbCgwKSwKKyAgICAgICAgbV92YXJzKDApLAorICAgICAgICBtX3ZhcnNfZXh0cmEoMCksCisgICAgICAgIG1fc3RhdHVzKHN0YXR1cyksCisgICAgICAgIG1fdGltZXJfZGF0YSh0aW1lcl9kYXRhKQorICAgIHt9CisKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKQorICAgIHsKKyAgICAgICAgaWYgKG1faW5fZGVwcyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1faW5fZGVwcyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fb3V0X2RlcHMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX291dF9kZXBzKTsKKyAgICAgICAgfQorICAgICAgICBpZiAobV9mdW5jX2Rlc2MgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX2Z1bmNfZGVzYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1fdmFycyAhPSAwKSB7CisgICAgICAgICAgICBmcmVlKG1fdmFycyk7CisgICAgICAgICAgICBmcmVlKG1fdmFyc19leHRyYSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBib29sIG9mZmxvYWQoY29uc3QgY2hhciAqbmFtZSwgYm9vbCBpc19lbXB0eSwKKyAgICAgICAgICAgICAgICAgVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgY29uc3Qgdm9pZCAqKndhaXRzLCBpbnQgbnVtX3dhaXRzLCBjb25zdCB2b2lkICoqc2lnbmFsLAorICAgICAgICAgICAgICAgICBpbnQgZW50cnlfaWQsIGNvbnN0IHZvaWQgKnN0YWNrX2FkZHIpOworICAgIGJvb2wgb2ZmbG9hZF9maW5pc2goKTsKKworICAgIGJvb2wgaXNfc2lnbmFsZWQoKTsKKworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiBnZXRfdGltZXJfZGF0YSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fdGltZXJfZGF0YTsKKyAgICB9CisKK3ByaXZhdGU6CisgICAgYm9vbCB3YWl0X2RlcGVuZGVuY2llcyhjb25zdCB2b2lkICoqd2FpdHMsIGludCBudW1fd2FpdHMpOworICAgIGJvb2wgc2V0dXBfZGVzY3JpcHRvcnMoVmFyRGVzYyAqdmFycywgVmFyRGVzYzIgKnZhcnMyLCBpbnQgdmFyc190b3RhbCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBlbnRyeV9pZCwgY29uc3Qgdm9pZCAqc3RhY2tfYWRkcik7CisgICAgYm9vbCBzZXR1cF9taXNjX2RhdGEoY29uc3QgY2hhciAqbmFtZSk7CisgICAgYm9vbCBzZW5kX3BvaW50ZXJfZGF0YShib29sIGlzX2FzeW5jKTsKKyAgICBib29sIHNlbmRfbm9uY29udGlndW91c19wb2ludGVyX2RhdGEoCisgICAgICAgIGludCBpLAorICAgICAgICBQdHJEYXRhKiBzcmNfYnVmLAorICAgICAgICBQdHJEYXRhKiBkc3RfYnVmLAorICAgICAgICBDT0lFVkVOVCAqZXZlbnQpOworICAgIGJvb2wgcmVjZWl2ZV9ub25jb250aWd1b3VzX3BvaW50ZXJfZGF0YSgKKyAgICAgICAgaW50IGksCisgICAgICAgIGNoYXIqIHNyY19kYXRhLAorICAgICAgICBDT0lCVUZGRVIgZHN0X2J1ZiwKKyAgICAgICAgQ09JRVZFTlQgKmV2ZW50KTsKKworICAgIGJvb2wgZ2F0aGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICBib29sIGNvbXB1dGUoKTsKKworICAgIGJvb2wgcmVjZWl2ZV9wb2ludGVyX2RhdGEoYm9vbCBpc19hc3luYyk7CisgICAgYm9vbCBzY2F0dGVyX2NvcHlvdXRfZGF0YSgpOworCisgICAgdm9pZCBjbGVhbnVwKCk7CisKKyAgICBib29sIGZpbmRfcHRyX2RhdGEoUHRyRGF0YSogJnB0cl9kYXRhLCB2b2lkICpiYXNlLCBpbnQ2NF90IGRpc3AsCisgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBib29sIGVycm9yX2RvZXNfbm90X2V4aXN0ID0gdHJ1ZSk7CisgICAgYm9vbCBhbGxvY19wdHJfZGF0YShQdHJEYXRhKiAmcHRyX2RhdGEsIHZvaWQgKmJhc2UsIGludDY0X3QgZGlzcCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludDY0X3QgbGVuZ3RoLCBpbnQ2NF90IGFsbG9jX2Rpc3AsIGludCBhbGlnbik7CisgICAgYm9vbCBpbml0X3N0YXRpY19wdHJfZGF0YShQdHJEYXRhICpwdHJfZGF0YSk7CisgICAgYm9vbCBpbml0X21pY19hZGRyZXNzKFB0ckRhdGEgKnB0cl9kYXRhKTsKKyAgICBib29sIG9mZmxvYWRfc3RhY2tfbWVtb3J5X21hbmFnZXIoY29uc3Qgdm9pZCAqIHN0YWNrX2JlZ2luLCBpbnQgcm91dGluZV9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGJ1Zl9zaXplLCBpbnQgYWxpZ24sIGJvb2wgKmlzX25ldyk7CisgICAgYm9vbCBudWxsaWZ5X3RhcmdldF9zdGFjayhDT0lCVUZGRVIgdGFyZ19idWYsIHVpbnQ2NF90IHNpemUpOworCisgICAgYm9vbCBnZW5fdmFyX2Rlc2NzX2Zvcl9wb2ludGVyX2FycmF5KGludCBpKTsKKworICAgIHZvaWQgcmVwb3J0X2NvaV9lcnJvcihlcnJvcl90eXBlcyBtc2csIENPSVJFU1VMVCByZXMpOworICAgIF9PZmZsb2FkX3Jlc3VsdCB0cmFuc2xhdGVfY29pX2Vycm9yKENPSVJFU1VMVCByZXMpIGNvbnN0OworCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PENPSUJVRkZFUj4gQnVmZmVyTGlzdDsKKworICAgIC8vIGV4dHJhIGRhdGEgYXNzb2NpYXRlZCB3aXRoIGVhY2ggdmFyaWFibGUgZGVzY3JpcHRvcgorICAgIHN0cnVjdCBWYXJFeHRyYSB7CisgICAgICAgIFB0ckRhdGEqIHNyY19kYXRhOworICAgICAgICBQdHJEYXRhKiBkc3RfZGF0YTsKKyAgICAgICAgQXV0b0RhdGEqIGF1dG9fZGF0YTsKKyAgICAgICAgaW50NjRfdCBjcHVfZGlzcDsKKyAgICAgICAgaW50NjRfdCBjcHVfb2Zmc2V0OworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfc3JjOworICAgICAgICBDZWFuUmVhZFJhbmdlcyAqcmVhZF9ybmdfZHN0OworICAgICAgICBpbnQ2NF90IHB0cl9hcnJfb2Zmc2V0OworICAgICAgICBib29sIGlzX2Fycl9wdHJfZWw7CisgICAgfTsKKworICAgIHRlbXBsYXRlPHR5cGVuYW1lIFQ+IGNsYXNzIFJlYWRBcnJFbGVtZW50cyB7CisgICAgcHVibGljOgorICAgICAgICBSZWFkQXJyRWxlbWVudHMoKToKKyAgICAgICAgICAgIHJhbmdlcyhOVUxMKSwKKyAgICAgICAgICAgIGVsX3NpemUoc2l6ZW9mKFQpKSwKKyAgICAgICAgICAgIG9mZnNldCgwKSwKKyAgICAgICAgICAgIGNvdW50KDApLAorICAgICAgICAgICAgaXNfZW1wdHkodHJ1ZSksCisgICAgICAgICAgICBiYXNlKE5VTEwpCisgICAgICAgIHt9CisKKyAgICAgICAgYm9vbCByZWFkX25leHQoYm9vbCBmbGFnKQorICAgICAgICB7CisgICAgICAgICAgICBpZiAoZmxhZyAhPSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKGlzX2VtcHR5KSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChyYW5nZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghZ2V0X25leHRfcmFuZ2UocmFuZ2VzLCAmb2Zmc2V0KSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJhbmdlcyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBhbGwgY29udGlndW91cyBlbGVtZW50cyBhcmUgb3ZlcgorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChjb3VudCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBsZW5ndGhfY3VyID0gc2l6ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIG9mZnNldCArPSBlbF9zaXplOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB2YWwgPSAoVClnZXRfZWxfdmFsdWUoYmFzZSwgb2Zmc2V0LCBlbF9zaXplKTsKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyIC09IGVsX3NpemU7CisgICAgICAgICAgICAgICAgY291bnQrKzsKKyAgICAgICAgICAgICAgICBpc19lbXB0eSA9IGxlbmd0aF9jdXIgPT0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICB9CisgICAgcHVibGljOgorICAgICAgICBDZWFuUmVhZFJhbmdlcyAqIHJhbmdlczsKKyAgICAgICAgVCAgICAgICB2YWw7CisgICAgICAgIGludCAgICAgZWxfc2l6ZTsKKyAgICAgICAgaW50NjRfdCBzaXplLAorICAgICAgICAgICAgICAgIG9mZnNldCwKKyAgICAgICAgICAgICAgICBsZW5ndGhfY3VyOworICAgICAgICBib29sICAgIGlzX2VtcHR5OworICAgICAgICBpbnQgICAgIGNvdW50OworICAgICAgICBjaGFyICAgKmJhc2U7CisgICAgfTsKKworICAgIC8vIHB0cl9kYXRhIGZvciBwZXJzaXN0ZW50IGF1dG8gb2JqZWN0cworICAgIFB0ckRhdGEqICAgIG1fc3RhY2tfcHRyX2RhdGE7CisgICAgUHRyRGF0YUxpc3QgbV9kZXN0cm95X3N0YWNrOworCisgICAgLy8gRW5naW5lCisgICAgRW5naW5lJiBtX2RldmljZTsKKworICAgIC8vIGlmIHRydWUgb2ZmbG9hZCBpcyBtYW5kYXRvcnkKKyAgICBib29sIG1faXNfbWFuZGF0b3J5OworCisgICAgLy8gaWYgdHJ1ZSBvZmZsb2FkIGhhcyBvcGVubXAgb3JpZ2luCisgICAgY29uc3QgYm9vbCBtX2lzX29wZW5tcDsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgaW5wdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9pbjsKKworICAgIC8vIFRoZSBNYXJzaGFsbGVyIGZvciB0aGUgb3V0cHV0cyBvZiB0aGUgb2ZmbG9hZGVkIHJlZ2lvbi4KKyAgICBNYXJzaGFsbGVyIG1fb3V0OworCisgICAgLy8gTGlzdCBvZiBidWZmZXJzIHRoYXQgYXJlIHBhc3NlZCB0byBkaXNwYXRjaCBjYWxsCisgICAgQnVmZmVyTGlzdCBtX2NvbXB1dGVfYnVmZmVyczsKKworICAgIC8vIExpc3Qgb2YgYnVmZmVycyB0aGF0IG5lZWQgdG8gYmUgZGVzdHJveWVkIGF0IHRoZSBlbmQgb2Ygb2ZmbG9hZAorICAgIEJ1ZmZlckxpc3QgbV9kZXN0cm95X2J1ZmZlcnM7CisKKyAgICAvLyBWYXJpYWJsZSBkZXNjcmlwdG9ycworICAgIFZhckRlc2MqICBtX3ZhcnM7CisgICAgVmFyRXh0cmEqIG1fdmFyc19leHRyYTsKKyAgICBpbnQgICAgICAgbV92YXJzX3RvdGFsOworCisgICAgLy8gUG9pbnRlciB0byBhIHVzZXItc3BlY2lmaWVkIHN0YXR1cyB2YXJpYWJsZQorICAgIF9PZmZsb2FkX3N0YXR1cyAqbV9zdGF0dXM7CisKKyAgICAvLyBGdW5jdGlvbiBkZXNjcmlwdG9yCisgICAgRnVuY3Rpb25EZXNjcmlwdG9yKiBtX2Z1bmNfZGVzYzsKKyAgICB1aW50MzJfdCAgICAgICAgICAgIG1fZnVuY19kZXNjX3NpemU7CisKKyAgICAvLyBCdWZmZXIgZm9yIHRyYW5zZmVycmluZyBjb3B5aW4vY29weW91dCBkYXRhCisgICAgQ09JQlVGRkVSIG1faW5vdXRfYnVmOworCisgICAgLy8gRGVwZW5kZW5jaWVzCisgICAgQ09JRVZFTlQgKm1faW5fZGVwczsKKyAgICB1aW50MzJfdCAgbV9pbl9kZXBzX3RvdGFsOworICAgIENPSUVWRU5UICptX291dF9kZXBzOworICAgIHVpbnQzMl90ICBtX291dF9kZXBzX3RvdGFsOworCisgICAgLy8gVGltZXIgZGF0YQorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICptX3RpbWVyX2RhdGE7CisKKyAgICAvLyBjb3B5aW4vY29weW91dCBkYXRhIGxlbmd0aAorICAgIHVpbnQ2NF90IG1faW5fZGF0YWxlbjsKKyAgICB1aW50NjRfdCBtX291dF9kYXRhbGVuOworCisgICAgLy8gYSBib29sZWFuIHZhbHVlIGNhbGN1bGF0ZWQgaW4gc2V0dXBfZGVzY3JpcHRvcnMuIElmIHRydWUgd2UgbmVlZCB0byBkbworICAgIC8vIGEgcnVuIGZ1bmN0aW9uIG9uIHRoZSB0YXJnZXQuIE90aGVyd2lzZSBpdCBtYXkgYmUgb3B0aW1pemVkIGF3YXkuCisgICAgYm9vbCBtX25lZWRfcnVuZnVuY3Rpb247Cit9OworCisvLyBJbml0aWFsaXphdGlvbiB0eXBlcyBmb3IgTUlDCitlbnVtIE9mZmxvYWRJbml0VHlwZSB7CisgICAgY19pbml0X29uX3N0YXJ0LCAgICAgICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBlbnRlcmluZyBtYWluCisgICAgY19pbml0X29uX29mZmxvYWQsICAgICAgIC8vIHNpbmdsZSBkZXZpY2UgYmVmb3JlIHN0YXJ0aW5nIHRoZSBmaXJzdCBvZmZsb2FkCisgICAgY19pbml0X29uX29mZmxvYWRfYWxsICAgIC8vIGFsbCBkZXZpY2VzIGJlZm9yZSBzdGFydGluZyB0aGUgZmlyc3Qgb2ZmbG9hZAorfTsKKworLy8gSW5pdGlhbGl6ZXMgbGlicmFyeSBhbmQgcmVnaXN0ZXJzIHNwZWNpZmllZCBvZmZsb2FkIGltYWdlLgorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl9pbWFnZShjb25zdCB2b2lkKiBpbWFnZSk7CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoY29uc3Qgdm9pZCogaW1hZ2UpOworCisvLyBJbml0aWFsaXplcyBvZmZsb2FkIHJ1bnRpbWUgbGlicmFyeS4KK2V4dGVybiBpbnQgX19vZmZsb2FkX2luaXRfbGlicmFyeSh2b2lkKTsKKworLy8gdGhyZWFkIGRhdGEgZm9yIGFzc29jaWF0aW5nIHBpcGVsaW5lcyB3aXRoIHRocmVhZHMKK2V4dGVybiBwdGhyZWFkX2tleV90IG1pY190aHJlYWRfa2V5OworCisvLyBFbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIGRldmljZXMKK2V4dGVybiBNaWNFbnZWYXIgbWljX2Vudl92YXJzOworCisvLyBDUFUgZnJlcXVlbmN5CitleHRlcm4gdWludDY0X3QgY3B1X2ZyZXF1ZW5jeTsKKworLy8gTERfTElCUkFSWV9QQVRIIGZvciBNSUMgbGlicmFyaWVzCitleHRlcm4gY2hhciogbWljX2xpYnJhcnlfcGF0aDsKKworLy8gc3RhY2sgc2l6ZSBmb3IgdGFyZ2V0CitleHRlcm4gdWludDMyX3QgbWljX3N0YWNrX3NpemU7CisKKy8vIFByZWFsbG9jYXRlZCBtZW1vcnkgc2l6ZSBmb3IgYnVmZmVycyBvbiBNSUMKK2V4dGVybiB1aW50NjRfdCBtaWNfYnVmZmVyX3NpemU7CisKKy8vIFNldHRpbmcgY29udHJvbGxpbmcgaW5vdXQgcHJveHkKK2V4dGVybiBib29sICBtaWNfcHJveHlfaW87CitleHRlcm4gY2hhciogbWljX3Byb3h5X2ZzX3Jvb3Q7CisKKy8vIFRocmVzaG9sZCBmb3IgY3JlYXRpbmcgYnVmZmVycyB3aXRoIGxhcmdlIHBhZ2VzCitleHRlcm4gdWludDY0X3QgX19vZmZsb2FkX3VzZV8ybWJfYnVmZmVyczsKKworLy8gb2ZmbG9hZCBpbml0aWFsaXphdGlvbiB0eXBlCitleHRlcm4gT2ZmbG9hZEluaXRUeXBlIF9fb2ZmbG9hZF9pbml0X3R5cGU7CisKKy8vIERldmljZSBudW1iZXIgdG8gb2ZmbG9hZCB0byB3aGVuIGRldmljZSBpcyBub3QgZXhwbGljaXRseSBzcGVjaWZpZWQuCitleHRlcm4gaW50IF9fb21wX2RldmljZV9udW07CisKKy8vIHRhcmdldCBleGVjdXRhYmxlCitleHRlcm4gVGFyZ2V0SW1hZ2UqIF9fdGFyZ2V0X2V4ZTsKKworLy8gSURCIHN1cHBvcnQKKworLy8gQ2FsbGVkIGJ5IHRoZSBvZmZsb2FkIHJ1bnRpbWUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gb2Ygb2ZmbG9hZCBpbmZyYXN0cnVjdHVyZQorLy8gaGFzIGJlZW4gY29tcGxldGVkLgorZXh0ZXJuICJDIiB2b2lkICBfX2RiZ190YXJnZXRfc29fbG9hZGVkKCk7CisKKy8vIENhbGxlZCBieSB0aGUgb2ZmbG9hZCBydW50aW1lIHdoZW4gdGhlIG9mZmxvYWQgaW5mcmFzdHJ1Y3R1cmUgaXMgYWJvdXQgdG8gYmUKKy8vIHNodXQgZG93biwgY3VycmVudGx5IGF0IGFwcGxpY2F0aW9uIGV4aXQuCitleHRlcm4gIkMiIHZvaWQgIF9fZGJnX3RhcmdldF9zb191bmxvYWRlZCgpOworCisvLyBOdWxsLXRlcm1pbmF0ZWQgc3RyaW5nIGNvbnRhaW5pbmcgcGF0aCB0byB0aGUgcHJvY2VzcyBpbWFnZSBvZiB0aGUgaG9zdGluZworLy8gYXBwbGljYXRpb24gKG9mZmxvYWRfbWFpbikKKyNkZWZpbmUgTUFYX1RBUkdFVF9OQU1FIDUxMgorZXh0ZXJuICJDIiBjaGFyICBfX2RiZ190YXJnZXRfZXhlX25hbWVbTUFYX1RBUkdFVF9OQU1FXTsKKworLy8gSW50ZWdlciBzcGVjaWZ5aW5nIHRoZSBwcm9jZXNzIGlkCitleHRlcm4gIkMiIHBpZF90IF9fZGJnX3RhcmdldF9zb19waWQ7CisKKy8vIEludGVnZXIgc3BlY2lmeWluZyB0aGUgMC1iYXNlZCBkZXZpY2UgbnVtYmVyCitleHRlcm4gIkMiIGludCAgIF9fZGJnX3RhcmdldF9pZDsKKworLy8gU2V0IHRvIG5vbi16ZXJvIGJ5IHRoZSBob3N0LXNpZGUgZGVidWdnZXIgdG8gZW5hYmxlIG9mZmxvYWQgZGVidWdnaW5nCisvLyBzdXBwb3J0CitleHRlcm4gIkMiIGludCAgIF9fZGJnX2lzX2F0dGFjaGVkOworCisvLyBNYWpvciB2ZXJzaW9uIG9mIHRoZSBkZWJ1Z2dlciBzdXBwb3J0IEFQSQorZXh0ZXJuICJDIiBjb25zdCBpbnQgX19kYmdfYXBpX21ham9yX3ZlcnNpb247CisKKy8vIE1pbm9yIHZlcnNpb24gb2YgdGhlIGRlYnVnZ2VyIHN1cHBvcnQgQVBJCitleHRlcm4gIkMiIGNvbnN0IGludCBfX2RiZ19hcGlfbWlub3JfdmVyc2lvbjsKKworI2VuZGlmIC8vIE9GRkxPQURfSE9TVF9IX0lOQ0xVREVECmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmUxYzE4NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX215b19ob3N0LmNwcApAQCAtMCwwICsxLDgwNSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF9teW9faG9zdC5oIgorI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8bWFsbG9jLmg+CisjaW5jbHVkZSAib2ZmbG9hZF9ob3N0LmgiCisKKyNpZiBkZWZpbmVkKExJTlVYKSB8fCBkZWZpbmVkKEZSRUVCU0QpCisjaW5jbHVkZSA8bW1fbWFsbG9jLmg+CisjZW5kaWYKKworI2RlZmluZSBNWU9fVkVSU0lPTjEgICAgIk1ZT18xLjAiCisKK2V4dGVybiAiQyIgdm9pZCBfX2NpbGtydHNfY2lsa19mb3JfMzIodm9pZCosIHZvaWQqLCB1aW50MzJfdCwgaW50MzJfdCk7CitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzY0KHZvaWQqLCB2b2lkKiwgdWludDY0X3QsIGludDMyX3QpOworCisjaWZuZGVmIFRBUkdFVF9XSU5OVAorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE1ZT19UQUJMRV9FTkRfTUFSS0VSKCkgcmVpbnRlcnByZXRfY2FzdDxjb25zdCBjaGFyKj4oLTEpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgTVlPX1RBQkxFX0VORF9NQVJLRVIoKSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigwKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitjbGFzcyBNeW9XcmFwcGVyIHsKK3B1YmxpYzoKKyAgICBNeW9XcmFwcGVyKCkgOiBtX2xpYl9oYW5kbGUoMCksIG1faXNfYXZhaWxhYmxlKGZhbHNlKQorICAgIHt9CisKKyAgICBib29sIGlzX2F2YWlsYWJsZSgpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1faXNfYXZhaWxhYmxlOworICAgIH0KKworICAgIGJvb2wgTG9hZExpYnJhcnkodm9pZCk7CisKKyAgICAvLyB1bmxvYWRzIHRoZSBsaWJyYXJ5CisgICAgdm9pZCBVbmxvYWRMaWJyYXJ5KHZvaWQpIHsKKy8vICAgICAgICBpZiAobV9saWJfaGFuZGxlICE9IDApIHsKKy8vICAgICAgICAgICAgRExfY2xvc2UobV9saWJfaGFuZGxlKTsKKy8vICAgICAgICAgICAgbV9saWJfaGFuZGxlID0gMDsKKy8vICAgICAgICB9CisgICAgfQorCisgICAgLy8gV3JhcHBlcnMgZm9yIE1ZTyBjbGllbnQgZnVuY3Rpb25zCisgICAgdm9pZCBMaWJJbml0KHZvaWQgKmFyZywgdm9pZCAqZnVuYykgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b2luaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXAsICVwKVxuIiwgX19mdW5jX18sIGFyZywgZnVuYyk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2xpYl9pbml0KGFyZywgZnVuYykpOworICAgIH0KKworICAgIHZvaWQgTGliRmluaSh2b2lkKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvZmluaSwgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgbV9saWJfZmluaSgpOworICAgIH0KKworICAgIHZvaWQqIFNoYXJlZE1hbGxvYyhzaXplX3Qgc2l6ZSkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3NoYXJlZG1hbGxvYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglbGxkKVxuIiwgX19mdW5jX18sIHNpemUpOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfbWFsbG9jKHNpemUpOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkRnJlZSh2b2lkICpwdHIpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgICAgIG1fc2hhcmVkX2ZyZWUocHRyKTsKKyAgICB9CisKKyAgICB2b2lkKiBTaGFyZWRBbGlnbmVkTWFsbG9jKHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ24pIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgICAgICByZXR1cm4gbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ24pOworICAgIH0KKworICAgIHZvaWQgU2hhcmVkQWxpZ25lZEZyZWUodm9pZCAqcHRyKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0VfMSg0LCAwLCBjX29mZmxvYWRfbXlvc2hhcmVkYWxpZ25lZGZyZWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKyAgICAgICAgbV9zaGFyZWRfYWxpZ25lZF9mcmVlKHB0cik7CisgICAgfQorCisgICAgdm9pZCBBY3F1aXJlKHZvaWQpIGNvbnN0IHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9teW9hY3F1aXJlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fYWNxdWlyZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIFJlbGVhc2Uodm9pZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlbGVhc2UsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiVzKClcbiIsIF9fZnVuY19fKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVsZWFzZSgpKTsKKyAgICB9CisKKyAgICB2b2lkIEhvc3RWYXJUYWJsZVByb3BhZ2F0ZSh2b2lkICp0YWJsZSwgaW50IG51bV9lbnRyaWVzKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlZClcbiIsIF9fZnVuY19fLCB0YWJsZSwgbnVtX2VudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdChfX2Z1bmNfXywgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUodGFibGUsIG51bV9lbnRyaWVzKSk7CisgICAgfQorCisgICAgdm9pZCBIb3N0RnB0clRhYmxlUmVnaXN0ZXIodm9pZCAqdGFibGUsIGludCBudW1fZW50cmllcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3JkZXJlZCkgY29uc3QgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoNCwgMCwgY19vZmZsb2FkX215b3JlZ2lzdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICIlcyglcCwgJWQsICVkKVxuIiwgX19mdW5jX18sIHRhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG51bV9lbnRyaWVzLCBvcmRlcmVkKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sCisgICAgICAgICAgICAgICAgICAgIG1faG9zdF9mcHRyX3RhYmxlX3JlZ2lzdGVyKHRhYmxlLCBudW1fZW50cmllcywgb3JkZXJlZCkpOworICAgIH0KKworICAgIHZvaWQgUmVtb3RlVGh1bmtDYWxsKHZvaWQgKnRodW5rLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZ3MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGV2aWNlKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoX19mdW5jX18sIG1fcmVtb3RlX3RodW5rX2NhbGwodGh1bmssIGFyZ3MsIGRldmljZSkpOworICAgIH0KKworICAgIE15b2lSRnVuY0NhbGxIYW5kbGUgUmVtb3RlQ2FsbChjaGFyICpmdW5jLCB2b2lkICphcmdzLCBpbnQgZGV2aWNlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVzLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgZnVuYywgYXJncywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZXZpY2UpOworICAgICAgICByZXR1cm4gbV9yZW1vdGVfY2FsbChmdW5jLCBhcmdzLCBkZXZpY2UpOworICAgIH0KKworICAgIHZvaWQgR2V0UmVzdWx0KE15b2lSRnVuY0NhbGxIYW5kbGUgaGFuZGxlKSBjb25zdCB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgIiVzKCVwKVxuIiwgX19mdW5jX18sIGhhbmRsZSk7CisgICAgICAgIENoZWNrUmVzdWx0KF9fZnVuY19fLCBtX2dldF9yZXN1bHQoaGFuZGxlKSk7CisgICAgfQorCitwcml2YXRlOgorICAgIHZvaWQgQ2hlY2tSZXN1bHQoY29uc3QgY2hhciAqZnVuYywgTXlvRXJyb3IgZXJyb3IpIGNvbnN0IHsKKyAgICAgICAgaWYgKGVycm9yICE9IE1ZT19TVUNDRVNTKSB7CisgICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX215b3dyYXBwZXJfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisKK3ByaXZhdGU6CisgICAgdm9pZCogbV9saWJfaGFuZGxlOworICAgIGJvb2wgIG1faXNfYXZhaWxhYmxlOworCisgICAgLy8gcG9pbnRlcnMgdG8gZnVuY3Rpb25zIGZyb20gbXlvIGxpYnJhcnkKKyAgICBNeW9FcnJvciAoKm1fbGliX2luaXQpKHZvaWQqLCB2b2lkKik7CisgICAgdm9pZCAgICAgKCptX2xpYl9maW5pKSh2b2lkKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX21hbGxvYykoc2l6ZV90KTsKKyAgICB2b2lkICAgICAoKm1fc2hhcmVkX2ZyZWUpKHZvaWQqKTsKKyAgICB2b2lkKiAgICAoKm1fc2hhcmVkX2FsaWduZWRfbWFsbG9jKShzaXplX3QsIHNpemVfdCk7CisgICAgdm9pZCAgICAgKCptX3NoYXJlZF9hbGlnbmVkX2ZyZWUpKHZvaWQqKTsKKyAgICBNeW9FcnJvciAoKm1fYWNxdWlyZSkodm9pZCk7CisgICAgTXlvRXJyb3IgKCptX3JlbGVhc2UpKHZvaWQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUpKHZvaWQqLCBpbnQpOworICAgIE15b0Vycm9yICgqbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIpKHZvaWQqLCBpbnQsIGludCk7CisgICAgTXlvRXJyb3IgKCptX3JlbW90ZV90aHVua19jYWxsKSh2b2lkKiwgdm9pZCosIGludCk7CisgICAgTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKm1fcmVtb3RlX2NhbGwpKGNoYXIqLCB2b2lkKiwgaW50KTsKKyAgICBNeW9FcnJvciAoKm1fZ2V0X3Jlc3VsdCkoTXlvaVJGdW5jQ2FsbEhhbmRsZSk7Cit9OworCitib29sIE15b1dyYXBwZXI6OkxvYWRMaWJyYXJ5KHZvaWQpCit7CisjaWZuZGVmIFRBUkdFVF9XSU5OVAorICAgIGNvbnN0IGNoYXIgKmxpYl9uYW1lID0gImxpYm15by1jbGllbnQuc28iOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgY29uc3QgY2hhciAqbGliX25hbWUgPSAibXlvLWNsaWVudC5kbGwiOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiTG9hZGluZyBNWU8gbGlicmFyeSAlcyAuLi5cbiIsIGxpYl9uYW1lKTsKKworICAgIG1fbGliX2hhbmRsZSA9IERMX29wZW4obGliX25hbWUpOworICAgIGlmIChtX2xpYl9oYW5kbGUgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gbG9hZCB0aGUgbGlicmFyeS4gZXJybm8gPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJubyk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2xpYl9pbml0ID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCopKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUxpYkluaXQiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX2xpYl9pbml0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lMaWJJbml0Iik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fbGliX2ZpbmkgPSAodm9pZCAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pTGliRmluaSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fbGliX2ZpbmkgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUxpYkZpbmkiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfbWFsbG9jID0gKHZvaWQqICgqKShzaXplX3QpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvU2hhcmVkTWFsbG9jIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9zaGFyZWRfbWFsbG9jID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZE1hbGxvYyIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3NoYXJlZF9mcmVlID0gKHZvaWQgKCopKHZvaWQqKSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEZyZWUiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9mcmVlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1NoYXJlZEZyZWUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9zaGFyZWRfYWxpZ25lZF9tYWxsb2MgPSAodm9pZCogKCopKHNpemVfdCwgc2l6ZV90KSkKKyAgICAgICAgRExfc3ltKG1fbGliX2hhbmRsZSwgIm15b1NoYXJlZEFsaWduZWRNYWxsb2MiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3NoYXJlZF9hbGlnbmVkX21hbGxvYyA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkTWFsbG9jIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9ICh2b2lkICgqKSh2b2lkKikpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9TaGFyZWRBbGlnbmVkRnJlZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fc2hhcmVkX2FsaWduZWRfZnJlZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9TaGFyZWRBbGlnbmVkRnJlZSIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX2FjcXVpcmUgPSAoTXlvRXJyb3IgKCopKHZvaWQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvQWNxdWlyZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1fYWNxdWlyZSA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9BY3F1aXJlIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVsZWFzZSA9IChNeW9FcnJvciAoKikodm9pZCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9SZWxlYXNlIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZWxlYXNlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b1JlbGVhc2UiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X3Zhcl90YWJsZV9wcm9wYWdhdGUgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaUhvc3RWYXJUYWJsZVByb3BhZ2F0ZSIsIE1ZT19WRVJTSU9OMSk7CisgICAgaWYgKG1faG9zdF92YXJfdGFibGVfcHJvcGFnYXRlID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lIb3N0VmFyVGFibGVQcm9wYWdhdGUiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgbV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPSAoTXlvRXJyb3IgKCopKHZvaWQqLCBpbnQsIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pSG9zdEZwdHJUYWJsZVJlZ2lzdGVyIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9ob3N0X2ZwdHJfdGFibGVfcmVnaXN0ZXIgPT0gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGYWlsZWQgdG8gZmluZCAlcyBpbiBNWU8gbGlicmFyeVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvaUhvc3RGcHRyVGFibGVSZWdpc3RlciIpOworICAgICAgICBVbmxvYWRMaWJyYXJ5KCk7CisgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICB9CisKKyAgICBtX3JlbW90ZV90aHVua19jYWxsID0gKE15b0Vycm9yICgqKSh2b2lkKiwgdm9pZCosIGludCkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pUmVtb3RlVGh1bmtDYWxsIiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9yZW1vdGVfdGh1bmtfY2FsbCA9PSAwKSB7CisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkZhaWxlZCB0byBmaW5kICVzIGluIE1ZTyBsaWJyYXJ5XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW9pUmVtb3RlVGh1bmtDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fcmVtb3RlX2NhbGwgPSAoTXlvaVJGdW5jQ2FsbEhhbmRsZSAoKikoY2hhciosIHZvaWQqLCBpbnQpKQorICAgICAgICBETF9zeW0obV9saWJfaGFuZGxlLCAibXlvaVJlbW90ZUNhbGwiLCBNWU9fVkVSU0lPTjEpOworICAgIGlmIChtX3JlbW90ZV9jYWxsID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lSZW1vdGVDYWxsIik7CisgICAgICAgIFVubG9hZExpYnJhcnkoKTsKKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKworICAgIG1fZ2V0X3Jlc3VsdCA9IChNeW9FcnJvciAoKikoTXlvaVJGdW5jQ2FsbEhhbmRsZSkpCisgICAgICAgIERMX3N5bShtX2xpYl9oYW5kbGUsICJteW9pR2V0UmVzdWx0IiwgTVlPX1ZFUlNJT04xKTsKKyAgICBpZiAobV9nZXRfcmVzdWx0ID09IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiRmFpbGVkIHRvIGZpbmQgJXMgaW4gTVlPIGxpYnJhcnlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm15b2lHZXRSZXN1bHQiKTsKKyAgICAgICAgVW5sb2FkTGlicmFyeSgpOworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiVGhlIGxpYnJhcnkgd2FzIHN1Y2Nlc3NmdWxseSBsb2FkZWRcbiIpOworCisgICAgbV9pc19hdmFpbGFibGUgPSB0cnVlOworCisgICAgcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyBib29sIG15b19pc19hdmFpbGFibGU7CitzdGF0aWMgTXlvV3JhcHBlciBteW9fd3JhcHBlcjsKKworc3RydWN0IE15b1RhYmxlCit7CisgICAgTXlvVGFibGUoU2hhcmVkVGFibGVFbnRyeSAqdGFiLCBpbnQgbGVuKSA6IHZhcl90YWIodGFiKSwgdmFyX3RhYl9sZW4obGVuKQorICAgIHt9CisKKyAgICBTaGFyZWRUYWJsZUVudHJ5KiAgIHZhcl90YWI7CisgICAgaW50ICAgICAgICAgICAgICAgICB2YXJfdGFiX2xlbjsKK307CisKK3R5cGVkZWYgc3RkOjpsaXN0PE15b1RhYmxlPiBNeW9UYWJsZUxpc3Q7CitzdGF0aWMgTXlvVGFibGVMaXN0IF9fbXlvX3RhYmxlX2xpc3Q7CitzdGF0aWMgbXV0ZXhfdCAgICAgIF9fbXlvX3RhYmxlX2xvY2s7CitzdGF0aWMgYm9vbCAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3JlZ2lzdGVyKEluaXRUYWJsZUVudHJ5KiBlbnRyeSk7CitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoRnB0clRhYmxlRW50cnkgKmVudHJ5KTsKKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2Uodm9pZCkKK3sKKyAgICBpZiAoX19vZmZsb2FkX2luaXRfbGlicmFyeSgpKSB7CisgICAgICAgIG15b193cmFwcGVyLkxvYWRMaWJyYXJ5KCk7CisgICAgfQorfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkodm9pZCkKK3sKKyAgICBzdGF0aWMgT2ZmbG9hZE9uY2VDb250cm9sIGN0cmwgPSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUOworICAgIF9fb2ZmbG9hZF9ydW5fb25jZSgmY3RybCwgX19vZmZsb2FkX215b0xvYWRMaWJyYXJ5X29uY2UpOworCisgICAgcmV0dXJuIG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpOworfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKHZvaWQpCit7CisgICAgaWYgKCFfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8gaW5pdGlhbGl6ZSBhbGwgZGV2aWNlcworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgbWljX2VuZ2luZXNfdG90YWw7IGkrKykgeworICAgICAgICBtaWNfZW5naW5lc1tpXS5pbml0KCk7CisgICAgfQorCisgICAgLy8gbG9hZCBhbmQgaW5pdGlhbGl6ZSBNWU8gbGlicmFyeQorICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIkluaXRpYWxpemluZyBNWU8gbGlicmFyeSAuLi5cbiIpOworCisgICAgQ09JRVZFTlQgZXZlbnRzW01JQ19FTkdJTkVTX01BWF07CisgICAgTXlvaVVzZXJQYXJhbXMgcGFyYW1zW01JQ19FTkdJTkVTX01BWCsxXTsKKworICAgIC8vIGxvYWQgdGFyZ2V0IGxpYnJhcnkgdG8gYWxsIGRldmljZXMKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgbWljX2VuZ2luZXNbaV0uaW5pdF9teW8oJmV2ZW50c1tpXSk7CisKKyAgICAgICAgcGFyYW1zW2ldLnR5cGUgPSBNWU9JX1VTRVJQQVJBTVNfREVWSUQ7CisgICAgICAgIHBhcmFtc1tpXS5ub2RlaWQgPSBtaWNfZW5naW5lc1tpXS5nZXRfcGh5c2ljYWxfaW5kZXgoKSArIDE7CisgICAgfQorCisgICAgcGFyYW1zW21pY19lbmdpbmVzX3RvdGFsXS50eXBlID0gTVlPSV9VU0VSUEFSQU1TX0xBU1RfTVNHOworCisgICAgLy8gaW5pdGlhbGl6ZSBteW8gcnVudGltZSBvbiBob3N0CisgICAgbXlvX3dyYXBwZXIuTGliSW5pdChwYXJhbXMsIDApOworCisgICAgLy8gd2FpdCBmb3IgdGhlIHRhcmdldCBpbml0IGNhbGxzIHRvIGZpbmlzaAorICAgIENPSVJFU1VMVCByZXM7CisgICAgcmVzID0gQ09JOjpFdmVudFdhaXQobWljX2VuZ2luZXNfdG90YWwsIGV2ZW50cywgLTEsIDEsIDAsIDApOworICAgIGlmIChyZXMgIT0gQ09JX1NVQ0NFU1MpIHsKKyAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgbXlvX2lzX2F2YWlsYWJsZSA9IHRydWU7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJJbml0aWFsaXppbmcgTVlPIGxpYnJhcnkgLi4uIGRvbmVcbiIpOworfQorCitzdGF0aWMgYm9vbCBfX29mZmxvYWRfbXlvSW5pdCh2b2lkKQoreworICAgIHN0YXRpYyBPZmZsb2FkT25jZUNvbnRyb2wgY3RybCA9IE9GRkxPQURfT05DRV9DT05UUk9MX0lOSVQ7CisgICAgX19vZmZsb2FkX3J1bl9vbmNlKCZjdHJsLCBfX29mZmxvYWRfbXlvSW5pdF9vbmNlKTsKKworICAgIC8vIHJlZ2lzdGVyIHBlbmRpbmcgc2hhcmVkIHZhciB0YWJsZXMKKyAgICBpZiAobXlvX2lzX2F2YWlsYWJsZSAmJiBfX215b190YWJsZXMpIHsKKyAgICAgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKF9fbXlvX3RhYmxlX2xvY2spOworCisgICAgICAgIGlmIChfX215b190YWJsZXMpIHsKKyAgICAgICAgICAgIC8vICBSZWdpc3RlciB0YWJsZXMgd2l0aCBNWU8gc28gaXQgY2FuIHByb3BhZ2F0ZSB0byB0YXJnZXQuCisgICAgICAgICAgICBmb3IoTXlvVGFibGVMaXN0Ojpjb25zdF9pdGVyYXRvciBpdCA9IF9fbXlvX3RhYmxlX2xpc3QuYmVnaW4oKTsKKyAgICAgICAgICAgICAgICBpdCAhPSBfX215b190YWJsZV9saXN0LmVuZCgpOyArK2l0KSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgICAgICAgICAgZm9yIChTaGFyZWRUYWJsZUVudHJ5ICplbnRyeSA9IGl0LT52YXJfdGFiOworICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAoZW50cnktPnZhck5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbXlvX3dyYXBwZXIuSG9zdFZhclRhYmxlUHJvcGFnYXRlKGVudHJ5LCAxKTsKKyAgICAgICAgICAgICAgICB9CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyAgICAgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0VmFyVGFibGVQcm9wYWdhdGUoaXQtPnZhcl90YWIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0LT52YXJfdGFiX2xlbik7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlX2xpc3QuY2xlYXIoKTsKKyAgICAgICAgICAgIF9fbXlvX3RhYmxlcyA9IGZhbHNlOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIG15b19pc19hdmFpbGFibGU7Cit9CisKK3N0YXRpYyBib29sIHNoYXJlZF90YWJsZV9lbnRyaWVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT52YXJOYW1lICE9IE1ZT19UQUJMRV9FTkRfTUFSS0VSKCk7IGVudHJ5KyspIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKGVudHJ5LT52YXJOYW1lID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitzdGF0aWMgYm9vbCBmcHRyX3RhYmxlX2VudHJpZXMoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisKKyAgICByZXR1cm4gZmFsc2U7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisgICAgSW5pdFRhYmxlRW50cnkqIGluaXRfdGFibGUsCisgICAgU2hhcmVkVGFibGVFbnRyeSAqc2hhcmVkX3RhYmxlLAorICAgIEZwdHJUYWJsZUVudHJ5ICpmcHRyX3RhYmxlCispCit7CisgICAgLy8gY2hlY2sgd2hldGhlciB3ZSBuZWVkIHRvIGluaXRpYWxpemUgTVlPIGxpYnJhcnkuIEl0IGlzCisgICAgLy8gaW5pdGlhbGl6ZWQgb25seSBpZiBhdCBsZWFzdCBvbmUgbXlvIHRhYmxlIGlzIG5vdCBlbXB0eQorICAgIGlmIChzaGFyZWRfdGFibGVfZW50cmllcyhzaGFyZWRfdGFibGUpIHx8IGZwdHJfdGFibGVfZW50cmllcyhmcHRyX3RhYmxlKSkgeworICAgICAgICAvLyBtYWtlIHN1cmUgbXlvIGxpYnJhcnkgaXMgbG9hZGVkCisgICAgICAgIF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpOworCisgICAgICAgIC8vIHJlZ2lzdGVyIHRhYmxlcworICAgICAgICBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcihzaGFyZWRfdGFibGUpOworICAgICAgICBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoZnB0cl90YWJsZSk7CisgICAgICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoaW5pdF90YWJsZSk7CisgICAgfQorfQorCit2b2lkIF9fb2ZmbG9hZF9teW9GaW5pKHZvaWQpCit7CisgICAgaWYgKG15b19pc19hdmFpbGFibGUpIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKworICAgICAgICBDT0lFVkVOVCBldmVudHNbTUlDX0VOR0lORVNfTUFYXTsKKworICAgICAgICAvLyBraWNrIG9mZiBteW9pTGliRmluaSBjYWxscyBvbiBhbGwgZGV2aWNlcworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IG1pY19lbmdpbmVzX3RvdGFsOyBpKyspIHsKKyAgICAgICAgICAgIG1pY19lbmdpbmVzW2ldLmZpbmlfbXlvKCZldmVudHNbaV0pOworICAgICAgICB9CisKKyAgICAgICAgLy8gY2xlYW51cCBteW8gcnVudGltZSBvbiBob3N0CisgICAgICAgIG15b193cmFwcGVyLkxpYkZpbmkoKTsKKworICAgICAgICAvLyB3YWl0IGZvciB0aGUgdGFyZ2V0IGZpbmkgY2FsbHMgdG8gZmluaXNoCisgICAgICAgIENPSVJFU1VMVCByZXM7CisgICAgICAgIHJlcyA9IENPSTo6RXZlbnRXYWl0KG1pY19lbmdpbmVzX3RvdGFsLCBldmVudHMsIC0xLCAxLCAwLCAwKTsKKyAgICAgICAgaWYgKHJlcyAhPSBDT0lfU1VDQ0VTUykgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2V2ZW50X3dhaXQsIHJlcyk7CisgICAgICAgICAgICBleGl0KDEpOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX3NoYXJlZF90YWJsZV9yZWdpc3RlcigKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICplbnRyeQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworICAgIFNoYXJlZFRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgLy8gYWxsb2NhdGUgc2hhcmVkIG1lbW9yeSBmb3IgdmFycworICAgIGZvciAoOyBlbnRyeS0+dmFyTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+dmFyTmFtZSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDQsICJza2lwIHJlZ2lzdGVyaW5nIGEgTlVMTCBNeW9TaGFyZWRUYWJsZSBlbnRyeVxuIik7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInJlZ2lzdGVyaW5nIE15b1NoYXJlZFRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPnZhck5hbWUsIGVudHJ5KTsKKworICAgICAgICAvLyBJbnZva2UgdGhlIGZ1bmN0aW9uIHRvIGNyZWF0ZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8dm9pZCgqKSh2b2lkKT4oZW50cnktPnNoYXJlZEFkZHIpKCk7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICAvLyBhbmQgdGFibGUgdG8gdGhlIGxpc3QgaWYgaXQgaXMgbm90IGVtcHR5CisgICAgaWYgKGVudHJpZXMgPiAwKSB7CisgICAgICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihfX215b190YWJsZV9sb2NrKTsKKyAgICAgICAgX19teW9fdGFibGVfbGlzdC5wdXNoX2JhY2soTXlvVGFibGUoc3RhcnQsIGVudHJpZXMpKTsKKyAgICAgICAgX19teW9fdGFibGVzID0gdHJ1ZTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfcmVnaXN0ZXIoSW5pdFRhYmxlRW50cnkqIGVudHJ5KQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIGVudHJ5KTsKKworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIGZvciAoOyBlbnRyeS0+ZnVuY05hbWUgIT0gTVlPX1RBQkxFX0VORF9NQVJLRVIoKTsgZW50cnkrKykgeworICAgICAgICBpZiAoZW50cnktPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoNCwgInNraXAgcmVnaXN0ZXJpbmcgYSBOVUxMIE15b1NoYXJlZEluaXQgZW50cnlcbiIpOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLyAgSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgZm9yICg7IGVudHJ5LT5mdW5jICE9IDA7IGVudHJ5KyspIHsKKyAgICAgICAgLy8gSW52b2tlIHRoZSBmdW5jdGlvbiB0byBpbml0IHRoZSBzaGFyZWQgbWVtb3J5CisgICAgICAgIGVudHJ5LT5mdW5jKCk7CisgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorfQorCitzdGF0aWMgdm9pZCBfX29mZmxvYWRfbXlvX2ZwdHJfdGFibGVfcmVnaXN0ZXIoCisgICAgRnB0clRhYmxlRW50cnkgKmVudHJ5CispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgRnB0clRhYmxlRW50cnkgKnN0YXJ0ID0gZW50cnk7CisgICAgaW50IGVudHJpZXMgPSAwOworCisgICAgZm9yICg7IGVudHJ5LT5mdW5jTmFtZSAhPSBNWU9fVEFCTEVfRU5EX01BUktFUigpOyBlbnRyeSsrKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIGlmIChlbnRyeS0+ZnVuY05hbWUgPT0gMCkgeworICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAic2tpcCByZWdpc3RlcmluZyBhIE5VTEwgTXlvRnB0clRhYmxlIGVudHJ5XG4iKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyAgICAgICAgaWYgKCFteW9fd3JhcHBlci5pc19hdmFpbGFibGUoKSkgeworICAgICAgICAgICAgKihzdGF0aWNfY2FzdDx2b2lkKio+KGVudHJ5LT5sb2NhbFRodW5rQWRkcikpID0gZW50cnktPmZ1bmNBZGRyOworICAgICAgICB9CisKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSg0LCAicmVnaXN0ZXJpbmcgTXlvRnB0clRhYmxlIGVudHJ5IGZvciAlcyBAJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnktPmZ1bmNOYW1lLCBlbnRyeSk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpKSB7CisgICAgICAgICAgICBteW9fd3JhcHBlci5Ib3N0RnB0clRhYmxlUmVnaXN0ZXIoZW50cnksIDEsIGZhbHNlKTsKKyAgICAgICAgfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisgICAgaWYgKG15b193cmFwcGVyLmlzX2F2YWlsYWJsZSgpICYmIGVudHJpZXMgPiAwKSB7CisgICAgICAgIG15b193cmFwcGVyLkhvc3RGcHRyVGFibGVSZWdpc3RlcihzdGFydCwgZW50cmllcywgZmFsc2UpOworICAgIH0KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK30KKworZXh0ZXJuICJDIiBpbnQgX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKGludCB0YXJnZXRfbnVtYmVyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVkKVxuIiwgX19mdW5jX18sIHRhcmdldF9udW1iZXIpOworCisgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gLTIpIHsKKyAgICAgICAgYm9vbCBpc19kZWZhdWx0X251bWJlciA9ICh0YXJnZXRfbnVtYmVyID09IC0yKTsKKworICAgICAgICBpZiAoX19vZmZsb2FkX215b0luaXQoKSkgeworICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIC8vIFVzZXIgcHJvdmlkZWQgdGhlIGRldmljZSBudW1iZXIKKyAgICAgICAgICAgICAgICBpbnQgbnVtID0gdGFyZ2V0X251bWJlciAlIG1pY19lbmdpbmVzX3RvdGFsOworCisgICAgICAgICAgICAgICAgLy8gcmVzZXJ2ZSBkZXZpY2UgaW4gT1JTTAorICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIgPSBPUlNMOjpyZXNlcnZlKG51bSkgPyBudW0gOiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIC8vIHRyeSB0byB1c2UgZGV2aWNlIDAKKyAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyID0gT1JTTDo6cmVzZXJ2ZSgwKSA/IDAgOiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gbWFrZSBzdXJlIGRldmljZSBpcyBpbml0aWFsaXplZAorICAgICAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPj0gMCkgeworICAgICAgICAgICAgICAgIG1pY19lbmdpbmVzW3RhcmdldF9udW1iZXJdLmluaXQoKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIGZhbGxiYWNrIHRvIENQVQorICAgICAgICAgICAgdGFyZ2V0X251bWJlciA9IC0xOworICAgICAgICB9CisKKyAgICAgICAgaWYgKHRhcmdldF9udW1iZXIgPCAwICYmICFpc19kZWZhdWx0X251bWJlcikgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2RldmljZV9pc19ub3RfYXZhaWxhYmxlKTsKKyAgICAgICAgICAgIGV4aXQoMSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19pbnZhbGlkX2RldmljZV9udW1iZXIpOworICAgICAgICBleGl0KDEpOworICAgIH0KKworICAgIHJldHVybiB0YXJnZXRfbnVtYmVyOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b2lSZW1vdGVJVGh1bmtDYWxsKAorICAgIHZvaWQgKnRodW5rLAorICAgIHZvaWQgKmFyZywKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwLCAlcCwgJWQpXG4iLCBfX2Z1bmNfXywgdGh1bmssIGFyZywKKyAgICAgICAgICAgICAgICAgICAgICAgIHRhcmdldF9udW1iZXIpOworCisgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgIG15b193cmFwcGVyLlJlbW90ZVRodW5rQ2FsbCh0aHVuaywgYXJnLCB0YXJnZXRfbnVtYmVyKTsKKyAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICByZXR1cm4gbXlvX3dyYXBwZXIuU2hhcmVkTWFsbG9jKHNpemUpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgcmV0dXJuIG1hbGxvYyhzaXplKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfT2ZmbG9hZF9zaGFyZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRGcmVlKHB0cik7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBmcmVlKHB0cik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworCisgICAgaWYgKF9fb2ZmbG9hZF9teW9Mb2FkTGlicmFyeSgpKSB7CisgICAgICAgIHJldHVybiBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChhbGlnbiA8IHNpemVvZih2b2lkKikpIHsKKyAgICAgICAgICAgIGFsaWduID0gc2l6ZW9mKHZvaWQqKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX21tX21hbGxvYyhzaXplLCBhbGlnbik7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2FsaWduZWRfZnJlZSh2b2lkICpwdHIpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgcHRyKTsKKworICAgIGlmIChfX29mZmxvYWRfbXlvTG9hZExpYnJhcnkoKSkgeworICAgICAgICBteW9fd3JhcHBlci5TaGFyZWRBbGlnbmVkRnJlZShwdHIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX21tX2ZyZWUocHRyKTsKKyAgICB9Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQoCisgICAgaW50IHNpemUsCisgICAgdm9pZCAoKmNvcHlfY29uc3RydWN0b3IpKHZvaWQqLCB2b2lkKiksCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgdm9pZCAqcmFkZHIsCisgICAgdm9pZCAqY2xvc3VyZV9vYmplY3QsCisgICAgdW5zaWduZWQgaW50IGl0ZXJzLAorICAgIHVuc2lnbmVkIGludCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTI7CisgICAgICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgICAgICBjaGFyIGNsb3N1cmVbXTsKKyAgICAgICAgfSAqYXJnczsKKworICAgICAgICBhcmdzID0gKHN0cnVjdCBTKikgX09mZmxvYWRfc2hhcmVkX21hbGxvYyhzaXplb2Yoc3RydWN0IFMpICsgc2l6ZSk7CisgICAgICAgIGFyZ3MtPk0xID0gcmFkZHI7CisgICAgICAgIGFyZ3MtPk0yID0gaXRlcnM7CisgICAgICAgIGFyZ3MtPk0zID0gZ3JhaW5fc2l6ZTsKKworICAgICAgICBpZiAoY29weV9jb25zdHJ1Y3RvciA9PSAwKSB7CisgICAgICAgICAgICBtZW1jcHkoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QsIHNpemUpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY29weV9jb25zdHJ1Y3RvcihhcmdzLT5jbG9zdXJlLCBjbG9zdXJlX29iamVjdCk7CisgICAgICAgIH0KKworICAgICAgICBteW9fd3JhcHBlci5SZWxlYXNlKCk7CisgICAgICAgIG15b193cmFwcGVyLkdldFJlc3VsdCgKKyAgICAgICAgICAgIG15b193cmFwcGVyLlJlbW90ZUNhbGwoIl9faW50ZWxfY2lsa19mb3JfMzJfb2ZmbG9hZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MsIHRhcmdldF9udW1iZXIpCisgICAgICAgICk7CisgICAgICAgIG15b193cmFwcGVyLkFjcXVpcmUoKTsKKworICAgICAgICBfT2ZmbG9hZF9zaGFyZWRfZnJlZShhcmdzKTsKKworICAgICAgICBPUlNMOjpyZWxlYXNlKHRhcmdldF9udW1iZXIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHJhZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2xvc3VyZV9vYmplY3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpdGVycywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdyYWluX3NpemUpOworICAgIH0KK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZCgKKyAgICBpbnQgc2l6ZSwKKyAgICB2b2lkICgqY29weV9jb25zdHJ1Y3Rvcikodm9pZCosIHZvaWQqKSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICB2b2lkICpyYWRkciwKKyAgICB2b2lkICpjbG9zdXJlX29iamVjdCwKKyAgICB1aW50NjRfdCBpdGVycywKKyAgICB1aW50NjRfdCBncmFpbl9zaXplKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICB0YXJnZXRfbnVtYmVyID0gX19vZmZsb2FkX215b0lzQXZhaWxhYmxlKHRhcmdldF9udW1iZXIpOworICAgIGlmICh0YXJnZXRfbnVtYmVyID49IDApIHsKKyAgICAgICAgc3RydWN0IFMgeworICAgICAgICAgICAgdm9pZCAqTTE7CisgICAgICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgICAgIHVpbnQ2NF90IE0zOworICAgICAgICAgICAgY2hhciBjbG9zdXJlW107CisgICAgICAgIH0gKmFyZ3M7CisKKyAgICAgICAgYXJncyA9IChzdHJ1Y3QgUyopIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZW9mKHN0cnVjdCBTKSArIHNpemUpOworICAgICAgICBhcmdzLT5NMSA9IHJhZGRyOworICAgICAgICBhcmdzLT5NMiA9IGl0ZXJzOworICAgICAgICBhcmdzLT5NMyA9IGdyYWluX3NpemU7CisKKyAgICAgICAgaWYgKGNvcHlfY29uc3RydWN0b3IgPT0gMCkgeworICAgICAgICAgICAgbWVtY3B5KGFyZ3MtPmNsb3N1cmUsIGNsb3N1cmVfb2JqZWN0LCBzaXplKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNvcHlfY29uc3RydWN0b3IoYXJncy0+Y2xvc3VyZSwgY2xvc3VyZV9vYmplY3QpOworICAgICAgICB9CisKKyAgICAgICAgbXlvX3dyYXBwZXIuUmVsZWFzZSgpOworICAgICAgICBteW9fd3JhcHBlci5HZXRSZXN1bHQoCisgICAgICAgICAgICBteW9fd3JhcHBlci5SZW1vdGVDYWxsKCJfX2ludGVsX2NpbGtfZm9yXzY0X29mZmxvYWQiLCBhcmdzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXJnZXRfbnVtYmVyKQorICAgICAgICApOworICAgICAgICBteW9fd3JhcHBlci5BY3F1aXJlKCk7CisKKyAgICAgICAgX09mZmxvYWRfc2hhcmVkX2ZyZWUoYXJncyk7CisKKyAgICAgICAgT1JTTDo6cmVsZWFzZSh0YXJnZXRfbnVtYmVyKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChyYWRkciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3N1cmVfb2JqZWN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaXRlcnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBncmFpbl9zaXplKTsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9teW9faG9zdC5oIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MmE2MWY0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX2hvc3QuaApAQCAtMCwwICsxLDgwIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9NWU9fSE9TVF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfTVlPX0hPU1RfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgIFNoYXJlZFRhYmxlRW50cnk7CisvL3R5cGVkZWYgTXlvaUhvc3RTaGFyZWRGcHRyRW50cnkgRnB0clRhYmxlRW50cnk7Cit0eXBlZGVmIHN0cnVjdCB7CisgICAgLy8hIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyAgICAvLyEgRnVuY3Rpb24gQWRkcmVzcworICAgIHZvaWQgKmZ1bmNBZGRyOworICAgIC8vISBMb2NhbCBUaHVuayBBZGRyZXNzCisgICAgdm9pZCAqbG9jYWxUaHVua0FkZHI7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgLy8gRHVtbXkgdG8gcGFkIHVwIHRvIDMyIGJ5dGVzCisgICAgdm9pZCAqZHVtbXk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9IEZwdHJUYWJsZUVudHJ5OworCitzdHJ1Y3QgSW5pdFRhYmxlRW50cnkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIC8vIER1bW15IHRvIHBhZCB1cCB0byAxNiBieXRlcworICAgIC8vIEZ1bmN0aW9uIE5hbWUKKyAgICBjb25zdCBjaGFyICpmdW5jTmFtZTsKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKyAgICB2b2lkICgqZnVuYykodm9pZCk7Cit9OworCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9JTklUX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuTXlvU2hhcmVkSW5pdFRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgIi5NeW9TaGFyZWRJbml0VGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX1NUQVJULCByZWFkLCB3cml0ZSkKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19TSEFSRURfSU5JVF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIEluaXRUYWJsZUVudHJ5ICppbml0X3RhYmxlLAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuIHZvaWQgX19vZmZsb2FkX215b0Zpbmkodm9pZCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19IT1NUX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWViMWM0ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuY3BwCkBAIC0wLDAgKzEsMTg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorCitleHRlcm4gIkMiIHZvaWQgX19jaWxrcnRzX2NpbGtfZm9yXzMyKHZvaWQqLCB2b2lkKiwgdWludDMyX3QsIGludDMyX3QpOworZXh0ZXJuICJDIiB2b2lkIF9fY2lsa3J0c19jaWxrX2Zvcl82NCh2b2lkKiwgdm9pZCosIHVpbnQ2NF90LCBpbnQzMl90KTsKKworI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl8zMgorI3ByYWdtYSB3ZWFrIF9fY2lsa3J0c19jaWxrX2Zvcl82NAorCitzdGF0aWMgdm9pZCBDaGVja1Jlc3VsdChjb25zdCBjaGFyICpmdW5jLCBNeW9FcnJvciBlcnJvcikgeworICAgIGlmIChlcnJvciAhPSBNWU9fU1VDQ0VTUykgeworICAgICAgIExJQk9GRkxPQURfRVJST1IoY19teW90YXJnZXRfY2hlY2tyZXN1bHQsIGZ1bmMsIGVycm9yKTsKKyAgICAgICAgZXhpdCgxKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKFNoYXJlZFRhYmxlRW50cnkgKmVudHJ5KQoreworICAgIGludCBlbnRyaWVzID0gMDsKKyAgICBTaGFyZWRUYWJsZUVudHJ5ICp0X3N0YXJ0OworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJXApXG4iLCBfX2Z1bmNfXywgZW50cnkpOworCisgICAgdF9zdGFydCA9IGVudHJ5OworICAgIHdoaWxlICh0X3N0YXJ0LT52YXJOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX3NoYXJlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJteW8gc2hhcmVkIGVudHJ5IG5hbWUgPSBcIiVzXCIgYWRkciA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdF9zdGFydC0+dmFyTmFtZSwgdF9zdGFydC0+c2hhcmVkQWRkcik7CisgICAgICAgIHRfc3RhcnQrKzsKKyAgICAgICAgZW50cmllcysrOworICAgIH0KKworICAgIGlmIChlbnRyaWVzID4gMCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICJteW9pTWljVmFyVGFibGVSZWdpc3RlciglcCwgJWQpXG4iLCBlbnRyeSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbnRyaWVzKTsKKyAgICAgICAgQ2hlY2tSZXN1bHQoIm15b2lNaWNWYXJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaU1pY1ZhclRhYmxlUmVnaXN0ZXIoZW50cnksIGVudHJpZXMpKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkIF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9yZWdpc3RlcigKKyAgICBGcHRyVGFibGVFbnRyeSAqZW50cnkKKykKK3sKKyAgICBpbnQgZW50cmllcyA9IDA7CisgICAgRnB0clRhYmxlRW50cnkgKnRfc3RhcnQ7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcyglcClcbiIsIF9fZnVuY19fLCBlbnRyeSk7CisKKyAgICB0X3N0YXJ0ID0gZW50cnk7CisgICAgd2hpbGUgKHRfc3RhcnQtPmZ1bmNOYW1lICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDQsIDAsIGNfb2ZmbG9hZF9taWNfbXlvX2ZwdHIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAibXlvIGZwdHIgZW50cnkgbmFtZSA9IFwiJXNcIiBhZGRyID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0X3N0YXJ0LT5mdW5jTmFtZSwgdF9zdGFydC0+ZnVuY0FkZHIpOworICAgICAgICB0X3N0YXJ0Kys7CisgICAgICAgIGVudHJpZXMrKzsKKyAgICB9CisKKyAgICBpZiAoZW50cmllcyA+IDApIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKCVwLCAlZCwgMClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZW50cnksIGVudHJpZXMpOworICAgICAgICBDaGVja1Jlc3VsdCgibXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyIiwKKyAgICAgICAgICAgICAgICAgICAgbXlvaVRhcmdldEZwdHJUYWJsZVJlZ2lzdGVyKGVudHJ5LCBlbnRyaWVzLCAwKSk7CisgICAgfQorfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b0FjcXVpcmUodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9BY3F1aXJlIiwgbXlvQWNxdWlyZSgpKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXNcbiIsIF9fZnVuY19fKTsKKyAgICBDaGVja1Jlc3VsdCgibXlvUmVsZWFzZSIsIG15b1JlbGVhc2UoKSk7Cit9CisKK2V4dGVybiAiQyIgdm9pZCBfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWRfd3JhcHBlcih2b2lkICphcmdzXykKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlc1xuIiwgX19mdW5jX18pOworCisgICAgc3RydWN0IFMgeworICAgICAgICB2b2lkICpNMTsKKyAgICAgICAgdW5zaWduZWQgaW50IE0yOworICAgICAgICB1bnNpZ25lZCBpbnQgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl8zMihhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyKHZvaWQgKmFyZ3NfKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICBzdHJ1Y3QgUyB7CisgICAgICAgIHZvaWQgKk0xOworICAgICAgICB1aW50NjRfdCBNMjsKKyAgICAgICAgdWludDY0X3QgTTM7CisgICAgICAgIGNoYXIgY2xvc3VyZVtdOworICAgIH0gKmFyZ3MgPSAoc3RydWN0IFMqKSBhcmdzXzsKKworICAgIF9fY2lsa3J0c19jaWxrX2Zvcl82NChhcmdzLT5NMSwgYXJncy0+Y2xvc3VyZSwgYXJncy0+TTIsIGFyZ3MtPk0zKTsKK30KKworc3RhdGljIHZvaWQgX19vZmZsb2FkX215b19vbmNlX2luaXQodm9pZCkKK3sKKyAgICBDaGVja1Jlc3VsdCgibXlvaVJlbW90ZUZ1bmNSZWdpc3RlciIsCisgICAgICAgICAgICAgICAgbXlvaVJlbW90ZUZ1bmNSZWdpc3RlcigKKyAgICAgICAgICAgICAgICAgICAgKE15b2lSZW1vdGVGdW5jVHlwZSkgX19pbnRlbF9jaWxrX2Zvcl8zMl9vZmZsb2FkX3dyYXBwZXIsCisgICAgICAgICAgICAgICAgICAgICJfX2ludGVsX2NpbGtfZm9yXzMyX29mZmxvYWQiKSk7CisgICAgQ2hlY2tSZXN1bHQoIm15b2lSZW1vdGVGdW5jUmVnaXN0ZXIiLAorICAgICAgICAgICAgICAgIG15b2lSZW1vdGVGdW5jUmVnaXN0ZXIoCisgICAgICAgICAgICAgICAgICAgIChNeW9pUmVtb3RlRnVuY1R5cGUpIF9faW50ZWxfY2lsa19mb3JfNjRfb2ZmbG9hZF93cmFwcGVyLAorICAgICAgICAgICAgICAgICAgICAiX19pbnRlbF9jaWxrX2Zvcl82NF9vZmZsb2FkIikpOworfQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzXG4iLCBfX2Z1bmNfXyk7CisKKyAgICAvLyBvbmUgdGltZSByZWdpc3RyYXRpb24gb2YgSW50ZWwoUikgQ2lsayhUTSkgbGFuZ3VhZ2UgZW50cmllcworICAgIHN0YXRpYyBwdGhyZWFkX29uY2VfdCBvbmNlX2NvbnRyb2wgPSBQVEhSRUFEX09OQ0VfSU5JVDsKKyAgICBwdGhyZWFkX29uY2UoJm9uY2VfY29udHJvbCwgX19vZmZsb2FkX215b19vbmNlX2luaXQpOworCisgICAgLy8gcmVnaXN0ZXIgbW9kdWxlJ3MgdGFibGVzCisgICAgaWYgKHNoYXJlZF90YWJsZS0+dmFyTmFtZSA9PSAwICYmIGZwdHJfdGFibGUtPmZ1bmNOYW1lID09IDApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3JlZ2lzdGVyKHNoYXJlZF90YWJsZSk7CisgICAgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3JlZ2lzdGVyKGZwdHJfdGFibGUpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9tYWxsb2Moc2l6ZV90IHNpemUpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoJWxsZClcbiIsIF9fZnVuY19fLCBzaXplKTsKKyAgICByZXR1cm4gbXlvU2hhcmVkTWFsbG9jKHNpemUpOworfQorCitleHRlcm4gIkMiIHZvaWQgX09mZmxvYWRfc2hhcmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkRnJlZShwdHIpOworfQorCitleHRlcm4gIkMiIHZvaWQqIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX21hbGxvYyhzaXplX3Qgc2l6ZSwgc2l6ZV90IGFsaWduKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVsbGQsICVsbGQpXG4iLCBfX2Z1bmNfXywgc2l6ZSwgYWxpZ24pOworICAgIHJldHVybiBteW9TaGFyZWRBbGlnbmVkTWFsbG9jKHNpemUsIGFsaWduKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9PZmZsb2FkX3NoYXJlZF9hbGlnbmVkX2ZyZWUodm9pZCAqcHRyKQoreworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMywgIiVzKCVwKVxuIiwgX19mdW5jX18sIHB0cik7CisgICAgbXlvU2hhcmVkQWxpZ25lZEZyZWUocHRyKTsKK30KKworLy8gdGVtcG9yYXJ5IHdvcmthcm91bmQgZm9yIGJsb2NraW5nIGJlaGF2aW9yIG9mIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgzLCAiJXMoKVxuIiwgX19mdW5jX18pOworICAgIENoZWNrUmVzdWx0KCJteW9pTGliSW5pdCIsIG15b2lMaWJJbml0KDAsIDApKTsKK30KKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDMsICIlcygpXG4iLCBfX2Z1bmNfXyk7CisgICAgbXlvaUxpYkZpbmkoKTsKK30KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuaCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX215b190YXJnZXQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjdmNzg5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfbXlvX3RhcmdldC5oCkBAIC0wLDAgKzEsNTQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorI2RlZmluZSBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSA8bXlvdHlwZXMuaD4KKyNpbmNsdWRlIDxteW9pbXBsLmg+CisjaW5jbHVkZSA8bXlvLmg+CisjaW5jbHVkZSAib2ZmbG9hZC5oIgorCit0eXBlZGVmIE15b2lTaGFyZWRWYXJFbnRyeSAgICAgICAgICBTaGFyZWRUYWJsZUVudHJ5OwordHlwZWRlZiBNeW9pVGFyZ2V0U2hhcmVkRnB0ckVudHJ5ICAgRnB0clRhYmxlRW50cnk7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9FTkQgICAgICAgICAgICAiLk15b1NoYXJlZFRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkYSIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUkeiIKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICAgICAgIi5NeW9TaGFyZWRUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICIuTXlvU2hhcmVkVGFibGUuIgorCisjZGVmaW5lIE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCAgICAgICAgICAgICIuTXlvRnB0clRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9NWU9fRlBUUl9UQUJMRV9TRUNUSU9OX0VORCAgICAgICAgICAgICAgIi5NeW9GcHRyVGFibGUuIgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX1NIQVJFRF9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX01ZT19GUFRSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQsIHJlYWQsIHdyaXRlKQorCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX215b1JlZ2lzdGVyVGFibGVzKAorICAgIFNoYXJlZFRhYmxlRW50cnkgKnNoYXJlZF90YWJsZSwKKyAgICBGcHRyVGFibGVFbnRyeSAqZnB0cl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9BY3F1aXJlKHZvaWQpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9SZWxlYXNlKHZvaWQpOworCisvLyB0ZW1wb3Jhcnkgd29ya2Fyb3VuZCBmb3IgYmxvY2tpbmcgYmVoYXZpb3IgZm9yIG15b2lMaWJJbml0L0ZpbmkgY2FsbHMKK2V4dGVybiAiQyIgdm9pZCBfX29mZmxvYWRfbXlvTGliSW5pdCgpOworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9teW9MaWJGaW5pKCk7CisKKyNlbmRpZiAvLyBPRkZMT0FEX01ZT19UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX2hvc3QuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX2hvc3QuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVkZDQ0NDUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfaG9zdC5jcHAKQEAgLTAsMCArMSw4NTEgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgIm9mZmxvYWQuaCIKKyNpbmNsdWRlICJjb21waWxlcl9pZl9ob3N0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7CisgICAgaWYgKG51bSA+PSAwKSB7CisgICAgICAgIF9fb21wX2RldmljZV9udW0gPSBudW07CisgICAgfQorfQorCitpbnQgb21wX2dldF9kZWZhdWx0X2RldmljZSh2b2lkKQoreworICAgIHJldHVybiBfX29tcF9kZXZpY2VfbnVtOworfQorCitpbnQgb21wX2dldF9udW1fZGV2aWNlcygpCit7CisgICAgX19vZmZsb2FkX2luaXRfbGlicmFyeSgpOworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHNldHRpbmcsCisgICAgY29uc3QgY2hhciogZl9uYW1lCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZfbmFtZSwgMCk7CisgICAgaWYgKG9mbGQpIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCBmX25hbWUsIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworc3RhdGljIGludCBvbXBfZ2V0X2ludF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY29uc3QgY2hhciAqIGZfbmFtZQorKQoreworICAgIGludCBzZXR0aW5nID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmX25hbWUsIDApOworICAgIGlmIChvZmxkKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnNldHRpbmc7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsIGZfbmFtZSwgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiBzZXR0aW5nOworfQorCit2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBudW1fdGhyZWFkcworKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbnVtX3RocmVhZHMsCisgICAgICAgICAgICAgICAgICAgICAgICJvbXBfc2V0X251bV90aHJlYWRzX3RhcmdldCIpOworfQorCitpbnQgb21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbWF4X3RocmVhZHNfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X251bV9wcm9jc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbnVtX3Byb2NzX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7CisgICAgb21wX3NldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCBudW1fdGhyZWFkcywKKyAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9zZXRfZHluYW1pY190YXJnZXQiKTsKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfZHluYW1pY190YXJnZXQiKTsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG5lc3RlZAorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgbmVzdGVkLAorICAgICAgICAgICAgICAgICAgICAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0Iik7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90IGtpbmQsCisgICAgaW50IG1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfc2NoZWRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCAqa2luZCwKKyAgICBpbnQgKm1vZGlmaWVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX3NjaGVkX3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBraW5kOworCisgICAgICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMV0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtb2RpZmllcjsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKworLy8gbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfc2V0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDEsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBvbXBfdW5zZXRfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF91bnNldF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIGludCByZXN1bHQgPSAwOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLy8gbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucworCit2b2lkIG9tcF9pbml0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzBdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1swXS5wdHIgPSBsb2NrOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAib21wX2luaXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9kZXN0cm95X25lc3RfbG9ja190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihvbXBfbmVzdF9sb2NrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbG9jazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgIm9tcF9zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQgb21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdW5zZXRfbmVzdF9sb2NrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMDsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2Yob21wX25lc3RfbG9ja190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IGxvY2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvLyBrbXAgQVBJIGZ1bmN0aW9ucworCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIpOworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBzaXplX3Qgc2l6ZQorKQoreworICAgIG9tcF9zZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgImttcF9zZXRfc3RhY2tzaXplX3NfdGFyZ2V0Iik7Cit9CisKK3NpemVfdCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9zdGFja3NpemVfc190YXJnZXQiKTsKK30KKwordm9pZCBrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHRpbWUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIHRpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2Jsb2NrdGltZV90YXJnZXQiKTsKK30KKworaW50IGttcF9nZXRfYmxvY2t0aW1lX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiBvbXBfZ2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAia21wX2dldF9ibG9ja3RpbWVfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAwLCAwLCAwLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDAsIDAsIDAsIDAsIDAsIDApOworICAgIH0KK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF90YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMCwgMCwgMCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKKyAgICBvbXBfc2V0X2ludF90YXJnZXQodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIG1vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICJrbXBfc2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIG9tcF9nZXRfaW50X3RhcmdldCh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJrbXBfZ2V0X2xpYnJhcnlfdGFyZ2V0Iik7Cit9CisKK3ZvaWQga21wX3NldF9kZWZhdWx0c190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgY2hhciBjb25zdCAqZGVmYXVsdHMKKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzFdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICAgICAgdmFyc1swXS5hbGxvY19pZiA9IDE7CisgICAgICAgIHZhcnNbMF0uZnJlZV9pZiA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9kZWZhdWx0c190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCisvLyBhZmZpbml0eSBBUEkgZnVuY3Rpb25zCisKK3ZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMSwgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorfQorCit2b2lkIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAxLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIGludCByZXN1bHQgPSAxOworCisgICAgT0ZGTE9BRCBvZmxkID0gT0ZGTE9BRF9UQVJHRVRfQUNRVUlSRSh0YXJnZXRfdHlwZSwgdGFyZ2V0X251bWJlciwgMCwgTlVMTCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fZnVuY19fLCAwKTsKKyAgICBpZiAob2ZsZCAhPSAwKSB7CisgICAgICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKworICAgICAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgICAgIHZhcnNbMF0uc2l6ZSA9IHNpemVvZihrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCk7CisgICAgICAgIHZhcnNbMF0uY291bnQgPSAxOworICAgICAgICB2YXJzWzBdLnB0ciA9IG1hc2s7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICAgICAgdmFyc1sxXS5zaXplID0gc2l6ZW9mKGludCk7CisgICAgICAgIHZhcnNbMV0uY291bnQgPSAxOworICAgICAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICAgICAgT0ZGTE9BRF9PRkZMT0FEKG9mbGQsICJrbXBfc2V0X2FmZmluaXR5X3RhcmdldCIsCisgICAgICAgICAgICAgICAgICAgICAgICAwLCAyLCB2YXJzLCBOVUxMLCAwLCAwLCAwKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgaW50IHJlc3VsdCA9IDE7CisKKyAgICBPRkZMT0FEIG9mbGQgPSBPRkZMT0FEX1RBUkdFVF9BQ1FVSVJFKHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLCAwLCBOVUxMLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19mdW5jX18sIDApOworICAgIGlmIChvZmxkICE9IDApIHsKKyAgICAgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworCisgICAgICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICAgICAgdmFyc1swXS5zaXplID0gc2l6ZW9mKGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gbWFzazsKKworICAgICAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgICAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1sxXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgICAgICBPRkZMT0FEX09GRkxPQUQob2ZsZCwgImttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDIsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gb21wX2dldF9pbnRfdGFyZ2V0KHRhcmdldF90eXBlLCB0YXJnZXRfbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfdGFyZ2V0Iik7Cit9CisKK2ludCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQorCitpbnQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQiLAorICAgICAgICAgICAgICAgICAgICAgICAgMCwgMywgdmFycywgTlVMTCwgMCwgMCwgMCk7CisgICAgfQorICAgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IHByb2MsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICBpbnQgcmVzdWx0ID0gMTsKKworICAgIE9GRkxPQUQgb2ZsZCA9IE9GRkxPQURfVEFSR0VUX0FDUVVJUkUodGFyZ2V0X3R5cGUsIHRhcmdldF9udW1iZXIsIDAsIE5VTEwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2Z1bmNfXywgMCk7CisgICAgaWYgKG9mbGQgIT0gMCkgeworICAgICAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisKKyAgICAgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzBdLnNpemUgPSBzaXplb2YoaW50KTsKKyAgICAgICAgdmFyc1swXS5jb3VudCA9IDE7CisgICAgICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICAgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICAgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgICAgICB2YXJzWzFdLnNpemUgPSBzaXplb2Yoa21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QpOworICAgICAgICB2YXJzWzFdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1sxXS5wdHIgPSBtYXNrOworCisgICAgICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgICAgIHZhcnNbMl0uc2l6ZSA9IHNpemVvZihpbnQpOworICAgICAgICB2YXJzWzJdLmNvdW50ID0gMTsKKyAgICAgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgICAgIE9GRkxPQURfT0ZGTE9BRChvZmxkLCAia21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0IiwKKyAgICAgICAgICAgICAgICAgICAgICAgIDAsIDMsIHZhcnMsIE5VTEwsIDAsIDAsIDApOworICAgIH0KKyAgICByZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vbXBfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjIwNTJhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfb21wX3RhcmdldC5jcHAKQEAgLTAsMCArMSwxMDIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvZmZsb2FkLmgiCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisKKy8vIE9wZW5NUCBBUEkKKwordm9pZCBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGludCBudW0pCit7Cit9CisKK2ludCBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IG9tcF9nZXRfbnVtX2RldmljZXMoKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworLy8gT3Blbk1QIEFQSSB3cmFwcGVycworCitzdGF0aWMgdm9pZCBvbXBfc2VuZF9pbnRfdG9faG9zdCgKKyAgICB2b2lkICpvZmxkXywKKyAgICBpbnQgc2V0dGluZworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZzZXR0aW5nOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3N0YXRpYyBpbnQgb21wX2dldF9pbnRfZnJvbV9ob3N0KAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBpbnQgc2V0dGluZzsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmc2V0dGluZzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworCisgICAgcmV0dXJuIHNldHRpbmc7Cit9CisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBudW1fdGhyZWFkczsKKworICAgIG51bV90aHJlYWRzID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpOworfQorCit2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3RocmVhZHM7CisKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fdGhyZWFkcyk7Cit9CisKK3ZvaWQgb21wX2dldF9udW1fcHJvY3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbnVtX3Byb2NzOworCisgICAgbnVtX3Byb2NzID0gb21wX2dldF9udW1fcHJvY3MoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBudW1fcHJvY3MpOworfQorCit2b2lkIG9tcF9zZXRfZHluYW1pY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBkeW5hbWljOworCisgICAgZHluYW1pYyA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBvbXBfc2V0X2R5bmFtaWMoZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX2dldF9keW5hbWljX2xyYigKKyAgICB2b2lkICpvZmxkCispCit7CisgICAgaW50IGR5bmFtaWM7CisKKyAgICBkeW5hbWljID0gb21wX2dldF9keW5hbWljKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgZHluYW1pYyk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9pbnRfZnJvbV9ob3N0KG9mbGQpOworICAgIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCk7Cit9CisKK3ZvaWQgb21wX2dldF9uZXN0ZWRfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbmVzdGVkOworCisgICAgbmVzdGVkID0gb21wX2dldF9uZXN0ZWQoKTsKKyAgICBvbXBfc2VuZF9pbnRfdG9faG9zdChvZmxkLCBuZXN0ZWQpOworfQorCit2b2lkIG9tcF9zZXRfc2NoZWR1bGVfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfc2NoZWRfdCBraW5kOworICAgIGludCBtb2RpZmllcjsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAma2luZDsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMl0gPSB7MH07CisgICAgb21wX3NjaGVkX3Qga2luZDsKKyAgICBpbnQgbW9kaWZpZXI7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZraW5kOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbW9kaWZpZXI7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZ2V0X3NjaGVkdWxlKCZraW5kLCAmbW9kaWZpZXIpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBsb2NrIEFQSSBmdW5jdGlvbnMKKwordm9pZCBvbXBfaW5pdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfaW5pdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfc2V0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3NldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX2xvY2tfdGFyZ2V0X3QgbG9jazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF91bnNldF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbG9ja190YXJnZXRfdCBsb2NrOworICAgIGludCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzFdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAyLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBvbXBfdGVzdF9sb2NrKCZsb2NrLmxvY2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCisvLyBuZXN0ZWQgbG9jayBBUEkgZnVuY3Rpb25zCisKK3ZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIG9tcF9pbml0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2soJmxvY2subG9jayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQgb21wX3NldF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMF0ucHRyID0gJmxvY2s7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAxLCB2YXJzLCBOVUxMKTsKKyAgICBvbXBfc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCBsb2NrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbm91dDsKKyAgICB2YXJzWzBdLnB0ciA9ICZsb2NrOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAgb21wX3Vuc2V0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1syXSA9IHswfTsKKyAgICBvbXBfbmVzdF9sb2NrX3RhcmdldF90IGxvY2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbG9jazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IG9tcF90ZXN0X25lc3RfbG9jaygmbG9jay5sb2NrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKworLy8ga21wIEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKTsKK30KKwordm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IGttcF9nZXRfc3RhY2tzaXplKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBzaXplOworCisgICAgc2l6ZSA9IG9tcF9nZXRfaW50X2Zyb21faG9zdChvZmxkKTsKKyAgICBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpOworfQorCit2b2lkIGttcF9nZXRfc3RhY2tzaXplX3NfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgc2l6ZTsKKworICAgIHNpemUgPSBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCk7CisgICAgb21wX3NlbmRfaW50X3RvX2hvc3Qob2ZsZCwgc2l6ZSk7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9ibG9ja3RpbWUodGltZSk7Cit9CisKK3ZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgdGltZTsKKworICAgIHRpbWUgPSBrbXBfZ2V0X2Jsb2NrdGltZSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIHRpbWUpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDAsIDAsIDApOworICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMCwgMCwgMCk7CisgICAga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfbHJiKAorICAgIHZvaWQgKm9mbGQKKykKK3sKKyAgICBpbnQgbW9kZTsKKworICAgIG1vZGUgPSBvbXBfZ2V0X2ludF9mcm9tX2hvc3Qob2ZsZCk7CisgICAga21wX3NldF9saWJyYXJ5KG1vZGUpOworfQorCit2b2lkIGttcF9nZXRfbGlicmFyeV9scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtb2RlOworCisgICAgbW9kZSA9IGttcF9nZXRfbGlicmFyeSgpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1vZGUpOworfQorCit2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBjaGFyICpkZWZhdWx0cyA9IDA7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19zdHJpbmdfcHRyOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX3N0cmluZ19wdHI7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJmRlZmF1bHRzOworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMSwgdmFycywgTlVMTCk7CisgICAga21wX3NldF9kZWZhdWx0cyhkZWZhdWx0cyk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIGFmZmluaXR5IEFQSSBmdW5jdGlvbnMKKwordm9pZCBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1sxXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaygmbWFzay5tYXNrKTsKKyAgICBPRkZMT0FEX1RBUkdFVF9MRUFWRShvZmxkKTsKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbMV0gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDEsIHZhcnMsIE5VTEwpOworICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2soJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX3NldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzJdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1swXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMV0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDIsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9nZXRfYWZmaW5pdHkoJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKK3ZvaWQga21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZAorKQoreworICAgIGludCBtYXhfcHJvYzsKKworICAgIG1heF9wcm9jID0ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpOworICAgIG9tcF9zZW5kX2ludF90b19ob3N0KG9mbGQsIG1heF9wcm9jKTsKK30KKwordm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIoCisgICAgdm9pZCAqb2ZsZF8KKykKK3sKKyAgICBPRkZMT0FEIG9mbGQgPSAoT0ZGTE9BRCkgb2ZsZF87CisgICAgVmFyRGVzYyB2YXJzWzNdID0gezB9OworICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90IG1hc2s7CisgICAgaW50IHByb2MsIHJlc3VsdDsKKworICAgIHZhcnNbMF0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1swXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW47CisgICAgdmFyc1swXS5wdHIgPSAmcHJvYzsKKworICAgIHZhcnNbMV0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1sxXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfaW5vdXQ7CisgICAgdmFyc1sxXS5wdHIgPSAmbWFzazsKKworICAgIHZhcnNbMl0udHlwZS5zcmMgPSBjX2RhdGE7CisgICAgdmFyc1syXS50eXBlLmRzdCA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLmRpcmVjdGlvbi5iaXRzID0gY19wYXJhbWV0ZXJfb3V0OworICAgIHZhcnNbMl0ucHRyID0gJnJlc3VsdDsKKworICAgIE9GRkxPQURfVEFSR0VUX0VOVEVSKG9mbGQsIDMsIHZhcnMsIE5VTEwpOworICAgIHJlc3VsdCA9IGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKAorICAgIHZvaWQgKm9mbGRfCispCit7CisgICAgT0ZGTE9BRCBvZmxkID0gKE9GRkxPQUQpIG9mbGRfOworICAgIFZhckRlc2MgdmFyc1szXSA9IHswfTsKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCBtYXNrOworICAgIGludCBwcm9jLCByZXN1bHQ7CisKKyAgICB2YXJzWzBdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMF0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1swXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2luOworICAgIHZhcnNbMF0ucHRyID0gJnByb2M7CisKKyAgICB2YXJzWzFdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMV0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1sxXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX2lub3V0OworICAgIHZhcnNbMV0ucHRyID0gJm1hc2s7CisKKyAgICB2YXJzWzJdLnR5cGUuc3JjID0gY19kYXRhOworICAgIHZhcnNbMl0udHlwZS5kc3QgPSBjX2RhdGE7CisgICAgdmFyc1syXS5kaXJlY3Rpb24uYml0cyA9IGNfcGFyYW1ldGVyX291dDsKKyAgICB2YXJzWzJdLnB0ciA9ICZyZXN1bHQ7CisKKyAgICBPRkZMT0FEX1RBUkdFVF9FTlRFUihvZmxkLCAzLCB2YXJzLCBOVUxMKTsKKyAgICByZXN1bHQgPSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsICZtYXNrLm1hc2spOworICAgIE9GRkxPQURfVEFSR0VUX0xFQVZFKG9mbGQpOworfQorCit2b2lkIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX2xyYigKKyAgICB2b2lkICpvZmxkXworKQoreworICAgIE9GRkxPQUQgb2ZsZCA9IChPRkZMT0FEKSBvZmxkXzsKKyAgICBWYXJEZXNjIHZhcnNbM10gPSB7MH07CisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgbWFzazsKKyAgICBpbnQgcHJvYywgcmVzdWx0OworCisgICAgdmFyc1swXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzBdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMF0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzBdLnB0ciA9ICZwcm9jOworCisgICAgdmFyc1sxXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzFdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMV0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9pbjsKKyAgICB2YXJzWzFdLnB0ciA9ICZtYXNrOworCisgICAgdmFyc1syXS50eXBlLnNyYyA9IGNfZGF0YTsKKyAgICB2YXJzWzJdLnR5cGUuZHN0ID0gY19kYXRhOworICAgIHZhcnNbMl0uZGlyZWN0aW9uLmJpdHMgPSBjX3BhcmFtZXRlcl9vdXQ7CisgICAgdmFyc1syXS5wdHIgPSAmcmVzdWx0OworCisgICAgT0ZGTE9BRF9UQVJHRVRfRU5URVIob2ZsZCwgMywgdmFycywgTlVMTCk7CisgICAgcmVzdWx0ID0ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgJm1hc2subWFzayk7CisgICAgT0ZGTE9BRF9UQVJHRVRfTEVBVkUob2ZsZCk7Cit9CisKKy8vIFRhcmdldC1zaWRlIHN0dWJzIGZvciB0aGUgaG9zdCBmdW5jdGlvbnMgKHRvIGF2b2lkIHVucmVzb2x2ZWRzKQorLy8gVGhlc2UgYXJlIG5lZWRlZCBmb3IgdGhlIG9mZmxvYWRtIHRhYmxlCisKK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X21heF90aHJlYWRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQgb21wX2dldF9udW1fcHJvY3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgb21wX3NldF9keW5hbWljX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgbnVtX3RocmVhZHMKKykKK3sKK30KKworaW50IG9tcF9nZXRfZHluYW1pY190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG51bV90aHJlYWRzCispCit7Cit9CisKK2ludCBvbXBfZ2V0X25lc3RlZF90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfc2NoZWRfdCBraW5kLAorICAgIGludCBtb2RpZmllcgorKQoreworfQorCit2b2lkIG9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9zY2hlZF90ICpraW5kLAorICAgIGludCAqbW9kaWZpZXIKKykKK3sKK30KKwordm9pZCBvbXBfaW5pdF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9sb2NrX3RhcmdldF90ICpsb2NrCispCit7Cit9CisKK3ZvaWQgb21wX3NldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9sb2NrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBvbXBfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCitpbnQgb21wX3Rlc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKwordm9pZCBvbXBfc2V0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworfQorCit2b2lkIG9tcF91bnNldF9uZXN0X2xvY2tfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIG9tcF9uZXN0X2xvY2tfdGFyZ2V0X3QgKmxvY2sKKykKK3sKK30KKworaW50IG9tcF90ZXN0X25lc3RfbG9ja190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgb21wX25lc3RfbG9ja190YXJnZXRfdCAqbG9jaworKQoreworICAgIHJldHVybiAwOworfQorCit2b2lkIGttcF9zZXRfc3RhY2tzaXplX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgc2l6ZQorKQoreworfQorCitpbnQga21wX2dldF9zdGFja3NpemVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9zdGFja3NpemVfc190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgc2l6ZV90IHNpemUKKykKK3sKK30KKworc2l6ZV90IGttcF9nZXRfc3RhY2tzaXplX3NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQga21wX3NldF9ibG9ja3RpbWVfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCB0aW1lCispCit7Cit9CisKK2ludCBrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0X3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworfQorCit2b2lkIGttcF9zZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAgaW50IG1vZGUKKykKK3sKK30KKworaW50IGttcF9nZXRfbGlicmFyeV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc2V0X2RlZmF1bHRzX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBjaGFyIGNvbnN0ICpkZWZhdWx0cworKQoreworfQorCit2b2lkIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFza190YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKK30KKwordm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworfQorCitpbnQga21wX3NldF9hZmZpbml0eV90YXJnZXQoCisgICAgVEFSR0VUX1RZUEUgdGFyZ2V0X3R5cGUsCisgICAgaW50IHRhcmdldF9udW1iZXIsCisgICAga21wX2FmZmluaXR5X21hc2tfdGFyZ2V0X3QgKm1hc2sKKykKK3sKKyAgICByZXR1cm4gMDsKK30KKworaW50IGttcF9nZXRfYWZmaW5pdHlfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlcgorKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCgKKyAgICBUQVJHRVRfVFlQRSB0YXJnZXRfdHlwZSwKKyAgICBpbnQgdGFyZ2V0X251bWJlciwKKyAgICBpbnQgcHJvYywKKyAgICBrbXBfYWZmaW5pdHlfbWFza190YXJnZXRfdCAqbWFzaworKQoreworICAgIHJldHVybiAwOworfQorCitpbnQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfdGFyZ2V0KAorICAgIFRBUkdFVF9UWVBFIHRhcmdldF90eXBlLAorICAgIGludCB0YXJnZXRfbnVtYmVyLAorICAgIGludCBwcm9jLAorICAgIGttcF9hZmZpbml0eV9tYXNrX3RhcmdldF90ICptYXNrCispCit7CisgICAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYxNjJmOGEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmNwcApAQCAtMCwwICsxLDg0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX29yc2wuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvZmZsb2FkX2hvc3QuaCIKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworbmFtZXNwYWNlIE9SU0wgeworCitzdGF0aWMgYm9vbCAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBmYWxzZTsKK3N0YXRpYyBjb25zdCBPUlNMVGFnICAgbXlfdGFnID0gIk9mZmxvYWQiOworCit2b2lkIGluaXQoKQoreworICAgIGNvbnN0IGNoYXIgKmVudl92YXIgPSBnZXRlbnYoIk9GRkxPQURfRU5BQkxFX09SU0wiKTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgaW50NjRfdCBuZXdfdmFsOworICAgICAgICBpZiAoX19vZmZsb2FkX3BhcnNlX2ludF9zdHJpbmcoZW52X3ZhciwgbmV3X3ZhbCkpIHsKKyAgICAgICAgICAgIGlzX2VuYWJsZWQgPSBuZXdfdmFsOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTElCT0ZGTE9BRF9FUlJPUihjX2ludmFsaWRfZW52X3Zhcl9pbnRfdmFsdWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPRkZMT0FEX0VOQUJMRV9PUlNMIik7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPUlNMIGlzIGVuYWJsZWRcbiIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1JTTCBpcyBkaXNhYmxlZFxuIik7CisgICAgfQorfQorCitib29sIHJlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK2Jvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSkKK3sKKyAgICBpZiAoaXNfZW5hYmxlZCkgeworICAgICAgICBpbnQgcG51bSA9IG1pY19lbmdpbmVzW2RldmljZV0uZ2V0X3BoeXNpY2FsX2luZGV4KCk7CisgICAgICAgIE9SU0xCdXN5U2V0IGJzZXQ7CisKKyAgICAgICAgYnNldC50eXBlID0gQlVTWV9TRVRfRlVMTDsKKyAgICAgICAgaWYgKE9SU0xUcnlSZXNlcnZlKDEsICZwbnVtLCAmYnNldCwgbXlfdGFnKSAhPSAwKSB7CisgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHRydWU7Cit9CisKK3ZvaWQgcmVsZWFzZShpbnQgZGV2aWNlKQoreworICAgIGlmIChpc19lbmFibGVkKSB7CisgICAgICAgIGludCBwbnVtID0gbWljX2VuZ2luZXNbZGV2aWNlXS5nZXRfcGh5c2ljYWxfaW5kZXgoKTsKKyAgICAgICAgT1JTTEJ1c3lTZXQgYnNldDsKKworICAgICAgICBic2V0LnR5cGUgPSBCVVNZX1NFVF9GVUxMOworICAgICAgICBpZiAoT1JTTFJlbGVhc2UoMSwgJnBudW0sICZic2V0LCBteV90YWcpICE9IDApIHsKKyAgICAgICAgICAgIC8vIHNob3VsZCBuZXZlciBnZXQgaGVyZQorICAgICAgICB9CisgICAgfQorfQorCit9IC8vIG5hbWVzcGFjZSBPUlNMCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmggYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF9vcnNsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiODZmOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX29yc2wuaApAQCAtMCwwICsxLDI1IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9PUlNMX0hfSU5DTFVERUQKKworLy8gT1JTTCBpbnRlcmZhY2UKK25hbWVzcGFjZSBPUlNMIHsKKworZXh0ZXJuIHZvaWQgaW5pdCgpOworCitleHRlcm4gYm9vbCByZXNlcnZlKGludCBkZXZpY2UpOworZXh0ZXJuIGJvb2wgdHJ5X3Jlc2VydmUoaW50IGRldmljZSk7CitleHRlcm4gdm9pZCByZWxlYXNlKGludCBkZXZpY2UpOworCit9IC8vIG5hbWVzcGFjZSBPUlNMCisKKyNlbmRpZiAvLyBPRkZMT0FEX09SU0xfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGFibGUuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmMTY1ZGYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5jcHAKQEAgLTAsMCArMSwzNzUgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgIm9mZmxvYWRfdGFibGUuaCIKKyNpbmNsdWRlICJvZmZsb2FkX2NvbW1vbi5oIgorCisjaWYgIUhPU1RfTElCUkFSWQorLy8gUHJlZGVmaW5lZCBvZmZsb2FkIGVudHJpZXMKK2V4dGVybiB2b2lkIG9tcF9zZXRfbnVtX3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbWF4X3RocmVhZHNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbnVtX3Byb2NzX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X2R5bmFtaWNfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfZHluYW1pY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3NldF9uZXN0ZWRfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9nZXRfbmVzdGVkX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfc2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZ2V0X3NjaGVkdWxlX2xyYih2b2lkKik7CisKK2V4dGVybiB2b2lkIG9tcF9pbml0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9kZXN0cm95X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbG9ja19scmIodm9pZCopOworZXh0ZXJuIHZvaWQgb21wX3Vuc2V0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF90ZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQgb21wX2luaXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIG9tcF9zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdW5zZXRfbmVzdF9sb2NrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBvbXBfdGVzdF9uZXN0X2xvY2tfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX3NldF9zdGFja3NpemVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9nZXRfc3RhY2tzaXplX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X3N0YWNrc2l6ZV9zX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2Jsb2NrdGltZV9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9ibG9ja3RpbWVfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3NldF9saWJyYXJ5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2xpYnJhcnlfbHJiKHZvaWQqKTsKK2V4dGVybiB2b2lkIGttcF9zZXRfZGVmYXVsdHNfbHJiKHZvaWQqKTsKKworZXh0ZXJuIHZvaWQga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX2xyYih2b2lkKik7CitleHRlcm4gdm9pZCBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIodm9pZCopOworZXh0ZXJuIHZvaWQga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiKHZvaWQqKTsKKworLy8gUHJlZGVmaW5lZCBlbnRyaWVzIG9uIHRoZSB0YXJnZXQgc2lkZQorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgcHJlZGVmaW5lZF9lbnRyaWVzW10gPSB7CisgICAgIm9tcF9zZXRfbnVtX3RocmVhZHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X251bV90aHJlYWRzX2xyYiwKKyAgICAib21wX2dldF9tYXhfdGhyZWFkc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbWF4X3RocmVhZHNfbHJiLAorICAgICJvbXBfZ2V0X251bV9wcm9jc190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9nZXRfbnVtX3Byb2NzX2xyYiwKKyAgICAib21wX3NldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9keW5hbWljX2xyYiwKKyAgICAib21wX2dldF9keW5hbWljX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9keW5hbWljX2xyYiwKKyAgICAib21wX3NldF9uZXN0ZWRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfc2V0X25lc3RlZF9scmIsCisgICAgIm9tcF9nZXRfbmVzdGVkX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2dldF9uZXN0ZWRfbHJiLAorICAgICJvbXBfc2V0X3NjaGVkdWxlX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9zY2hlZHVsZV9scmIsCisgICAgIm9tcF9nZXRfc2NoZWR1bGVfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZ2V0X3NjaGVkdWxlX2xyYiwKKworICAgICJvbXBfaW5pdF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX2luaXRfbG9ja19scmIsCisgICAgIm9tcF9kZXN0cm95X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9sb2NrX2xyYiwKKyAgICAib21wX3NldF9sb2NrX3RhcmdldCIsCisgICAgKHZvaWQqKSAmb21wX3NldF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdW5zZXRfbG9ja19scmIsCisgICAgIm9tcF90ZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9sb2NrX2xyYiwKKworICAgICJvbXBfaW5pdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfaW5pdF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfZGVzdHJveV9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfZGVzdHJveV9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF9zZXRfbmVzdF9sb2NrX2xyYiwKKyAgICAib21wX3Vuc2V0X25lc3RfbG9ja190YXJnZXQiLAorICAgICh2b2lkKikgJm9tcF91bnNldF9uZXN0X2xvY2tfbHJiLAorICAgICJvbXBfdGVzdF9uZXN0X2xvY2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZvbXBfdGVzdF9uZXN0X2xvY2tfbHJiLAorCisgICAgImttcF9zZXRfc3RhY2tzaXplX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9zdGFja3NpemVfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfc3RhY2tzaXplX2xyYiwKKyAgICAia21wX3NldF9zdGFja3NpemVfc190YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfc3RhY2tzaXplX3NfbHJiLAorICAgICJrbXBfZ2V0X3N0YWNrc2l6ZV9zX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9zdGFja3NpemVfc19scmIsCisgICAgImttcF9zZXRfYmxvY2t0aW1lX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9ibG9ja3RpbWVfbHJiLAorICAgICJrbXBfZ2V0X2Jsb2NrdGltZV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYmxvY2t0aW1lX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3NlcmlhbF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9zZXJpYWxfbHJiLAorICAgICJrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kX2xyYiwKKyAgICAia21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF9scmIsCisgICAgImttcF9zZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9zZXRfbGlicmFyeV9scmIsCisgICAgImttcF9nZXRfbGlicmFyeV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfbGlicmFyeV9scmIsCisgICAgImttcF9zZXRfZGVmYXVsdHNfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2RlZmF1bHRzX2xyYiwKKworICAgICJrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfbHJiLAorICAgICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfdGFyZ2V0IiwKKyAgICAodm9pZCopICZrbXBfc2V0X2FmZmluaXR5X2xyYiwKKyAgICAia21wX2dldF9hZmZpbml0eV90YXJnZXQiLAorICAgICh2b2lkKikgJmttcF9nZXRfYWZmaW5pdHlfbHJiLAorICAgICJrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXhfcHJvY19scmIsCisgICAgImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorICAgICJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY19scmIsCisgICAgImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jX3RhcmdldCIsCisgICAgKHZvaWQqKSAma21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfbHJiLAorCisgICAgKGNvbnN0IGNoYXIqKSAtMSwKKyAgICAodm9pZCopIC0xCit9OworCitzdGF0aWMgRnVuY0xpc3Q6Ok5vZGUgcHJlZGVmaW5lZF90YWJsZSA9IHsKKyAgICB7IHByZWRlZmluZWRfZW50cmllcywgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBFbnRyeSB0YWJsZQorRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXMoJnByZWRlZmluZWRfdGFibGUpOworI2Vsc2UKK0Z1bmNMaXN0IF9fb2ZmbG9hZF9lbnRyaWVzOworI2VuZGlmIC8vICFIT1NUX0xJQlJBUlkKKworLy8gRnVuY3Rpb24gdGFibGUuIE5vIHByZWRlZmluZWQgZW50cmllcy4KK0Z1bmNMaXN0IF9fb2ZmbG9hZF9mdW5jczsKKworLy8gVmFyIHRhYmxlCitWYXJMaXN0ICBfX29mZmxvYWRfdmFyczsKKworLy8gR2l2ZW4gdGhlIGZ1bmN0aW9uIG5hbWUgcmV0dXJucyB0aGUgYXNzb2NpdGF0ZWQgZnVuY3Rpb24gcG9pbnRlcgorY29uc3Qgdm9pZCogRnVuY0xpc3Q6OmZpbmRfYWRkcihjb25zdCBjaGFyICpuYW1lKQoreworICAgIGNvbnN0IHZvaWQqIGZ1bmMgPSAwOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDAgJiYgc3RyY21wKGUtPm5hbWUsIG5hbWUpID09IDApIHsKKyAgICAgICAgICAgICAgICBmdW5jID0gZS0+ZnVuYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIG1fbG9jay51bmxvY2soKTsKKworICAgIHJldHVybiBmdW5jOworfQorCisvLyBHaXZlbiB0aGUgZnVuY3Rpb24gcG9pbnRlciByZXR1cm5zIHRoZSBhc3NvY2l0YXRlZCBmdW5jdGlvbiBuYW1lCitjb25zdCBjaGFyKiBGdW5jTGlzdDo6ZmluZF9uYW1lKGNvbnN0IHZvaWQgKmZ1bmMpCit7CisgICAgY29uc3QgY2hhciogbmFtZSA9IDA7CisKKyAgICBtX2xvY2subG9jaygpOworCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPmZ1bmMgPT0gZnVuYykgeworICAgICAgICAgICAgICAgIG5hbWUgPSBlLT5uYW1lOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworCisgICAgcmV0dXJuIG5hbWU7Cit9CisKKy8vIFJldHVybnMgbWF4IG5hbWUgbGVuZ3RoIGZyb20gYWxsIHRhYmxlcworaW50NjRfdCBGdW5jTGlzdDo6bWF4X25hbWVfbGVuZ3RoKHZvaWQpCit7CisgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICBtX2xvY2subG9jaygpOworCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gMDsKKyAgICAgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgMCkgeworICAgICAgICAgICAgICAgIG4tPnRhYmxlLm1heF9uYW1lX2xlbiA9IDA7CisKKyAgICAgICAgICAgICAgICAvLyBjYWxjdWxhdGUgbWF4IG5hbWUgbGVuZ3RoIGluIGEgc2luZ2xlIHRhYmxlCisgICAgICAgICAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAobi0+dGFibGUubWF4X25hbWVfbGVuIDwgbGVuKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbi0+dGFibGUubWF4X25hbWVfbGVuID0gbGVuOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLyBzZWxlY3QgbWF4IGZyb20gYWxsIHRhYmxlcworICAgICAgICAgICAgaWYgKG1fbWF4X25hbWVfbGVuIDwgbi0+dGFibGUubWF4X25hbWVfbGVuKSB7CisgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4gPSBuLT50YWJsZS5tYXhfbmFtZV9sZW47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBtX2xvY2sudW5sb2NrKCk7CisgICAgfQorICAgIHJldHVybiBtX21heF9uYW1lX2xlbjsKK30KKworLy8gRGVidWdnaW5nIGR1bXAKK3ZvaWQgRnVuY0xpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJGdW5jdGlvbiB0YWJsZTpcbiIpOworCisgICAgbV9sb2NrLmxvY2soKTsKKworICAgIGZvciAoTm9kZSAqbiA9IG1faGVhZDsgbiAhPSAwOyBuID0gbi0+bmV4dCkgeworICAgICAgICBmb3IgKGNvbnN0IFRhYmxlOjpFbnRyeSAqZSA9IG4tPnRhYmxlLmVudHJpZXM7CisgICAgICAgICAgICAgZS0+bmFtZSAhPSAoY29uc3QgY2hhciopIC0xOyBlKyspIHsKKyAgICAgICAgICAgIGlmIChlLT5uYW1lICE9IDApIHsKKyAgICAgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICIlcCAlc1xuIiwgZS0+ZnVuYywgZS0+bmFtZSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBtX2xvY2sudW5sb2NrKCk7Cit9CisKKy8vIERlYnVnZ2luZyBkdW1wCit2b2lkIFZhckxpc3Q6OmR1bXAodm9pZCkKK3sKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWYXIgdGFibGU6XG4iKTsKKworICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXAgJWxkXG4iLCBlLT5uYW1lLCBlLT5hZGRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZS0+c2l6ZSk7CisjZWxzZSAgLy8gSE9TVF9MSUJSQVJZCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiJXMgJXBcbiIsIGUtPm5hbWUsIGUtPmFkZHIpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgbV9sb2NrLnVubG9jaygpOworfQorCisvLworaW50NjRfdCBWYXJMaXN0Ojp0YWJsZV9zaXplKGludDY0X3QgJm5lbGVtcykKK3sKKyAgICBpbnQ2NF90IGxlbmd0aCA9IDA7CisKKyAgICBuZWxlbXMgPSAwOworCisgICAgLy8gY2FsY3VsYXRlIHN0cmluZyB0YWJsZSBzaXplIGFuZCBudW1iZXIgb2YgZWxlbWVudHMKKyAgICBmb3IgKE5vZGUgKm4gPSBtX2hlYWQ7IG4gIT0gMDsgbiA9IG4tPm5leHQpIHsKKyAgICAgICAgZm9yIChjb25zdCBUYWJsZTo6RW50cnkgKmUgPSBuLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgIGUtPm5hbWUgIT0gKGNvbnN0IGNoYXIqKSAtMTsgZSsrKSB7CisgICAgICAgICAgICBpZiAoZS0+bmFtZSAhPSAwKSB7CisgICAgICAgICAgICAgICAgbGVuZ3RoICs9IHN0cmxlbihlLT5uYW1lKSArIDE7CisgICAgICAgICAgICAgICAgbmVsZW1zKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gbmVsZW1zICogc2l6ZW9mKEJ1ZkVudHJ5KSArIGxlbmd0aDsKK30KKworLy8gY29weSB0YWJsZSB0byB0aGUgZ3ZlbiBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfY29weSh2b2lkICpidWYsIGludDY0X3QgbmVsZW1zKQoreworICAgIEJ1ZkVudHJ5KiBlbGVtcyA9IHN0YXRpY19jYXN0PEJ1ZkVudHJ5Kj4oYnVmKTsKKyAgICBjaGFyKiAgICAgbmFtZXMgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihlbGVtcyArIG5lbGVtcyk7CisKKyAgICAvLyBjb3B5IGVudHJpZXMgdG8gYnVmZmVyCisgICAgZm9yIChOb2RlICpuID0gbV9oZWFkOyBuICE9IDA7IG4gPSBuLT5uZXh0KSB7CisgICAgICAgIGZvciAoY29uc3QgVGFibGU6OkVudHJ5ICplID0gbi0+dGFibGUuZW50cmllczsKKyAgICAgICAgICAgICBlLT5uYW1lICE9IChjb25zdCBjaGFyKikgLTE7IGUrKykgeworICAgICAgICAgICAgaWYgKGUtPm5hbWUgIT0gMCkgeworICAgICAgICAgICAgICAgIC8vIG5hbWUgZmllbGQgY29udGFpbnMgb2Zmc2V0IHRvIHRoZSBuYW1lIGZyb20gdGhlIGJlZ2lubmluZworICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBidWZmZXIKKyAgICAgICAgICAgICAgICBlbGVtcy0+bmFtZSA9IG5hbWVzIC0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1Zik7CisgICAgICAgICAgICAgICAgZWxlbXMtPmFkZHIgPSByZWludGVycHJldF9jYXN0PGludHB0cl90PihlLT5hZGRyKTsKKworICAgICAgICAgICAgICAgIC8vIGNvcHkgbmFtZSB0byBzdHJpbmcgdGFibGUKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpuYW1lID0gZS0+bmFtZTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoKCpuYW1lcysrID0gKm5hbWUrKykgIT0gJ1wwJyk7CisKKyAgICAgICAgICAgICAgICBlbGVtcysrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorfQorCisvLyBwYXRjaCBuYW1lIG9mZnNldHMgaW4gYSBidWZmZXIKK3ZvaWQgVmFyTGlzdDo6dGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcykKK3sKKyAgICBCdWZFbnRyeSogZWxlbXMgPSBzdGF0aWNfY2FzdDxCdWZFbnRyeSo+KGJ1Zik7CisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBuZWxlbXM7IGkrKykgeworICAgICAgICBlbGVtc1tpXS5uYW1lICs9IHJlaW50ZXJwcmV0X2Nhc3Q8aW50cHRyX3Q+KGJ1Zik7CisgICAgfQorfQorCisvLyBBZGRzIGdpdmVuIGxpc3QgZWxlbWVudCB0byB0aGUgZ2xvYmFsIGxvb2t1cCB0YWJsZSBsaXN0CitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3JlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgb2ZmbG9hZCBmdW5jdGlvbiBlbnRyeSB0YWJsZSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVudHJ5X3RhYmxlKTsKKyAgICBfX29mZmxvYWRfZW50cmllcy5hZGRfdGFibGUoZW50cnlfdGFibGUpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiUmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5hZGRfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJSZWdpc3RlcmluZyB2YXIgdGFibGUgJXBcbiIsIHZhcl90YWJsZSk7CisgICAgX19vZmZsb2FkX3ZhcnMuYWRkX3RhYmxlKHZhcl90YWJsZSk7Cit9CisKKy8vIFJlbW92ZXMgZ2l2ZW4gbGlzdCBlbGVtZW50IGZyb20gdGhlIGdsb2JhbCBsb29rdXAgdGFibGUgbGlzdAorZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispCit7CisgICAgX19vZmZsb2FkX2VudHJpZXMucmVtb3ZlX3RhYmxlKGVudHJ5X3RhYmxlKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIlVucmVnaXN0ZXJpbmcgZnVuY3Rpb24gdGFibGUgJXBcbiIsIGZ1bmNfdGFibGUpOworICAgIF9fb2ZmbG9hZF9mdW5jcy5yZW1vdmVfdGFibGUoZnVuY190YWJsZSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJVbnJlZ2lzdGVyaW5nIHZhciB0YWJsZSAlcFxuIiwgdmFyX3RhYmxlKTsKKyAgICBfX29mZmxvYWRfdmFycy5yZW1vdmVfdGFibGUodmFyX3RhYmxlKTsKK30KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhYmxlLmggYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmY2VkM2UKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YWJsZS5oCkBAIC0wLDAgKzEsMzAxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qISBcZmlsZQorICAgIFxicmllZiBGdW5jdGlvbiBhbmQgVmFyaWFibGUgdGFibGVzIHVzZWQgYnkgdGhlIHJ1bnRpbWUgbGlicmFyeQorKi8KKworI2lmbmRlZiBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQUJMRV9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxpdGVyYXRvcj4KKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKworLy8gVGVtcGxhdGUgcmVwcmVzZW50aW5nIGRvdWJsZSBsaW5rZWQgbGlzdCBvZiB0YWJsZXMKK3RlbXBsYXRlIDx0eXBlbmFtZSBUPiBjbGFzcyBUYWJsZUxpc3QgeworcHVibGljOgorICAgIC8vIHRhYmxlIHR5cGUKKyAgICB0eXBlZGVmIFQgVGFibGU7CisKKyAgICAvLyBMaXN0IG5vZGUKKyAgICBzdHJ1Y3QgTm9kZSB7CisgICAgICAgIFRhYmxlICAgdGFibGU7CisgICAgICAgIE5vZGUqICAgcHJldjsKKyAgICAgICAgTm9kZSogICBuZXh0OworICAgIH07CisKK3B1YmxpYzoKKyAgICBleHBsaWNpdCBUYWJsZUxpc3QoTm9kZSAqbm9kZSA9IDApIDogbV9oZWFkKG5vZGUpIHt9CisKKyAgICB2b2lkIGFkZF90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG1faGVhZCAhPSAwKSB7CisgICAgICAgICAgICBub2RlLT5uZXh0ID0gbV9oZWFkOworICAgICAgICAgICAgbV9oZWFkLT5wcmV2ID0gbm9kZTsKKyAgICAgICAgfQorICAgICAgICBtX2hlYWQgPSBub2RlOworCisgICAgICAgIG1fbG9jay51bmxvY2soKTsKKyAgICB9CisKKyAgICB2b2lkIHJlbW92ZV90YWJsZShOb2RlICpub2RlKSB7CisgICAgICAgIG1fbG9jay5sb2NrKCk7CisKKyAgICAgICAgaWYgKG5vZGUtPm5leHQgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+bmV4dC0+cHJldiA9IG5vZGUtPnByZXY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5vZGUtPnByZXYgIT0gMCkgeworICAgICAgICAgICAgbm9kZS0+cHJldi0+bmV4dCA9IG5vZGUtPm5leHQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG1faGVhZCA9PSBub2RlKSB7CisgICAgICAgICAgICBtX2hlYWQgPSBub2RlLT5uZXh0OworICAgICAgICB9CisKKyAgICAgICAgbV9sb2NrLnVubG9jaygpOworICAgIH0KKworcHJvdGVjdGVkOgorICAgIE5vZGUqICAgICAgICAgICBtX2hlYWQ7CisgICAgbXV0ZXhfdCAgICAgICAgIG1fbG9jazsKK307CisKKy8vIEZ1bmN0aW9uIGxvb2t1cCB0YWJsZS4KK3N0cnVjdCBGdW5jVGFibGUgeworICAgIC8vISBGdW5jdGlvbiB0YWJsZSBlbnRyeQorICAgIC8qISBUaGlzIHRhYmxlIGNvbnRhaW5zIGZ1bmN0aW9ucyBjcmVhdGVkIGZyb20gb2ZmbG9hZCByZWdpb25zLiAgICovCisgICAgLyohIEVhY2ggZW50cnkgY29uc2lzdHMgb2YgYSBwb2ludGVyIHRvIHRoZSBmdW5jdGlvbidzICJrZXkiCisgICAgICAgIGFuZCB0aGUgZnVuY3Rpb24gYWRkcmVzcy4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAvKiEgRWFjaCBzaGFyZWQgbGlicmFyeSBvciBleGVjdXRhYmxlIG1heSBjb250YWluIG9uZSBzdWNoIHRhYmxlLiAqLworICAgIC8qISBUaGUgZW5kIG9mIHRoZSB0YWJsZSBpcyBtYXJrZWQgd2l0aCBhbiBlbnRyeSB3aG9zZSBuYW1lIGZpZWxkCisgICAgICAgIGhhcyB2YWx1ZSAtMS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBzdHJ1Y3QgRW50cnkgeworICAgICAgICBjb25zdCBjaGFyKiBuYW1lOyAvLyE8IE5hbWUgb2YgdGhlIGZ1bmN0aW9uCisgICAgICAgIHZvaWQqICAgICAgIGZ1bmM7IC8vITwgQWRkcmVzcyBvZiB0aGUgZnVuY3Rpb24KKyAgICB9OworCisgICAgLy8gZW50cmllcworICAgIGNvbnN0IEVudHJ5ICplbnRyaWVzOworCisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoCisgICAgaW50NjRfdCBtYXhfbmFtZV9sZW47Cit9OworCisvLyBGdW5jdGlvbiB0YWJsZQorY2xhc3MgRnVuY0xpc3QgOiBwdWJsaWMgVGFibGVMaXN0PEZ1bmNUYWJsZT4geworcHVibGljOgorICAgIGV4cGxpY2l0IEZ1bmNMaXN0KE5vZGUgKm5vZGUgPSAwKSA6IFRhYmxlTGlzdDxUYWJsZT4obm9kZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9tYXhfbmFtZV9sZW4oLTEpCisgICAge30KKworICAgIC8vIGFkZCB0YWJsZSB0byB0aGUgbGlzdAorICAgIHZvaWQgYWRkX3RhYmxlKE5vZGUgKm5vZGUpIHsKKyAgICAgICAgLy8gcmVjYWxjdWxhdGUgbWF4IGZ1bmN0aW9uIG5hbWUgbGVuZ3RoCisgICAgICAgIG1fbWF4X25hbWVfbGVuID0gLTE7CisKKyAgICAgICAgLy8gYWRkIHRhYmxlCisgICAgICAgIFRhYmxlTGlzdDxUYWJsZT46OmFkZF90YWJsZShub2RlKTsKKyAgICB9CisKKyAgICAvLyBmaW5kIGZ1bmN0aW9uIGFkZHJlc3MgZm9yIHRoZSBnaXZlbiBuYW1lCisgICAgY29uc3Qgdm9pZCogZmluZF9hZGRyKGNvbnN0IGNoYXIgKm5hbWUpOworCisgICAgLy8gZmluZCBmdW5jdGlvbiBuYW1lIGZvciB0aGUgZ2l2ZW4gYWRkcmVzcworICAgIGNvbnN0IGNoYXIqIGZpbmRfbmFtZShjb25zdCB2b2lkICphZGRyKTsKKworICAgIC8vIG1heCBuYW1lIGxlbmd0aCBmcm9tIGFsbCB0YWJsZXMgaW4gdGhlIGxpc3QKKyAgICBpbnQ2NF90IG1heF9uYW1lX2xlbmd0aCh2b2lkKTsKKworICAgIC8vIGRlYnVnIGR1bXAKKyAgICB2b2lkIGR1bXAodm9pZCk7CisKK3ByaXZhdGU6CisgICAgLy8gbWF4IG5hbWUgbGVuZ3RoIHdpdGhpbiBmcm9tIGFsbCB0YWJsZXMKKyAgICBpbnQ2NF90IG1fbWF4X25hbWVfbGVuOworfTsKKworLy8gVGFibGUgZW50cnkgZm9yIHN0YXRpYyB2YXJpYWJsZXMKK3N0cnVjdCBWYXJUYWJsZSB7CisgICAgLy8hIFZhcmlhYmxlIHRhYmxlIGVudHJ5CisgICAgLyohIFRoaXMgdGFibGUgY29udGFpbnMgc3RhdGljYWxseSBhbGxvY2F0ZWQgdmFyaWFibGVzIG1hcmtlZCB3aXRoCisgICAgICAgIF9fZGVjbHNwZWModGFyZ2V0KG1pYykgb3IgI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQuICAgICAgICAgICAqLworICAgIC8qISBFYWNoIGVudHJ5IGNvbnNpc3RzIG9mIGEgcG9pbnRlciB0byB0aGUgdmFyaWFibGUncyAia2V5IiwKKyAgICAgICAgdGhlIHZhcmlhYmxlIGFkZHJlc3MgYW5kIGl0cyBzaXplIGluIGJ5dGVzLiAgICAgICAgICAgICAgICAgICAgICovCisgICAgLyohIEJlY2F1c2UgbWVtb3J5IGFsbG9jYXRpb24gaXMgZG9uZSBmcm9tIHRoZSBob3N0LAorICAgICAgICB0aGUgTUlDIHRhYmxlIGRvZXMgbm90IG5lZWQgdGhlIHNpemUgb2YgdGhlIHZhcmlhYmxlLiAgICAgICAgICAgKi8KKyAgICAvKiEgUGFkZGluZyB0byBtYWtlIHRoZSB0YWJsZSBlbnRyeSBzaXplIGEgcG93ZXIgb2YgMiBpcyBuZWNlc3NhcnkKKyAgICAgICAgdG8gYXZvaWQgImhvbGVzIiBiZXR3ZWVuIHRhYmxlIGNvbnRyaWJ1dGlvbnMgZnJvbSBkaWZmZXJlbnQgb2JqZWN0CisgICAgICAgIGZpbGVzIG9uIFdpbmRvd3Mgd2hlbiBkZWJ1ZyBpbmZvcm1hdGlvbiBpcyBzcGVjaWZpZWQgd2l0aCAvWmkuICAqLworICAgIHN0cnVjdCBFbnRyeSB7CisgICAgICAgIGNvbnN0IGNoYXIqIG5hbWU7IC8vITwgTmFtZSBvZiB0aGUgdmFyaWFibGUKKyAgICAgICAgdm9pZCogICAgICAgYWRkcjsgLy8hPCBBZGRyZXNzIG9mIHRoZSB2YXJpYWJsZQorCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgIHVpbnQ2NF90ICAgIHNpemU7CisKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKwkJLy8gcGFkZGluZyB0byBtYWtlIGVudHJ5IHNpemUgYSBwb3dlciBvZiAyCisgICAgICAgIHVpbnQ2NF90ICAgIHBhZGRpbmc7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYKKyAgICB9OworCisgICAgLy8gVGFibGUgdGVybWluYXRlZCBieSBhbiBlbnRyeSB3aXRoIG5hbWUgPT0gLTEKKyAgICBjb25zdCBFbnRyeSAqZW50cmllczsKK307CisKKy8vIExpc3Qgb2YgdmFyIHRhYmxlcworY2xhc3MgVmFyTGlzdCA6IHB1YmxpYyBUYWJsZUxpc3Q8VmFyVGFibGU+IHsKK3B1YmxpYzoKKyAgICBWYXJMaXN0KCkgOiBUYWJsZUxpc3Q8VGFibGU+KCkKKyAgICB7fQorCisgICAgLy8gZGVidWcgZHVtcAorICAgIHZvaWQgZHVtcCgpOworCitwdWJsaWM6CisgICAgLy8gdmFyIHRhYmxlIGxpc3QgaXRlcmF0b3IKKyAgICBjbGFzcyBJdGVyYXRvciA6IHB1YmxpYyBzdGQ6Oml0ZXJhdG9yPHN0ZDo6aW5wdXRfaXRlcmF0b3JfdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGFibGU6OkVudHJ5PiB7CisgICAgcHVibGljOgorICAgICAgICBJdGVyYXRvcigpIDogbV9ub2RlKDApLCBtX2VudHJ5KDApIHt9CisKKyAgICAgICAgZXhwbGljaXQgSXRlcmF0b3IoTm9kZSAqbm9kZSkgeworICAgICAgICAgICAgbmV3X25vZGUobm9kZSk7CisgICAgICAgIH0KKworICAgICAgICBJdGVyYXRvciYgb3BlcmF0b3IrKygpIHsKKyAgICAgICAgICAgIGlmIChtX2VudHJ5ICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgd2hpbGUgKG1fZW50cnktPm5hbWUgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBtX2VudHJ5Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmIChtX2VudHJ5LT5uYW1lID09IHJlaW50ZXJwcmV0X2Nhc3Q8Y29uc3QgY2hhcio+KC0xKSkgeworICAgICAgICAgICAgICAgICAgICBuZXdfbm9kZShtX25vZGUtPm5leHQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiAqdGhpczsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBJdGVyYXRvciAmb3RoZXIpIGNvbnN0IHsKKyAgICAgICAgICAgIHJldHVybiBtX2VudHJ5ID09IG90aGVyLm1fZW50cnk7CisgICAgICAgIH0KKworICAgICAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgSXRlcmF0b3IgJm90aGVyKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeSAhPSBvdGhlci5tX2VudHJ5OworICAgICAgICB9CisKKyAgICAgICAgY29uc3QgVGFibGU6OkVudHJ5KiBvcGVyYXRvciooKSBjb25zdCB7CisgICAgICAgICAgICByZXR1cm4gbV9lbnRyeTsKKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgdm9pZCBuZXdfbm9kZShOb2RlICpub2RlKSB7CisgICAgICAgICAgICBtX25vZGUgPSBub2RlOworICAgICAgICAgICAgbV9lbnRyeSA9IDA7CisgICAgICAgICAgICB3aGlsZSAobV9ub2RlICE9IDApIHsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gbV9ub2RlLT50YWJsZS5lbnRyaWVzOworICAgICAgICAgICAgICAgIHdoaWxlIChtX2VudHJ5LT5uYW1lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgbV9lbnRyeSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAobV9lbnRyeS0+bmFtZSAhPSByZWludGVycHJldF9jYXN0PGNvbnN0IGNoYXIqPigtMSkpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1fbm9kZSA9IG1fbm9kZS0+bmV4dDsKKyAgICAgICAgICAgICAgICBtX2VudHJ5ID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgcHJpdmF0ZToKKyAgICAgICAgTm9kZSAgICAgICAgICAgICAgICAqbV9ub2RlOworICAgICAgICBjb25zdCBUYWJsZTo6RW50cnkgICptX2VudHJ5OworICAgIH07CisKKyAgICBJdGVyYXRvciBiZWdpbigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIEl0ZXJhdG9yKG1faGVhZCk7CisgICAgfQorCisgICAgSXRlcmF0b3IgZW5kKCkgY29uc3QgeworICAgICAgICByZXR1cm4gSXRlcmF0b3IoKTsKKyAgICB9CisKK3B1YmxpYzoKKyAgICAvLyBFbnRyeSByZXByZXNlbnRhdGlvbiBpbiBhIGNvcHkgYnVmZmVyCisgICAgc3RydWN0IEJ1ZkVudHJ5IHsKKyAgICAgICAgaW50cHRyX3QgbmFtZTsKKyAgICAgICAgaW50cHRyX3QgYWRkcjsKKyAgICB9OworCisgICAgLy8gQ2FsY3VsYXRlIHRoZSBudW1iZXIgb2YgZWxlbWVudHMgaW4gdGhlIHRhYmxlIGFuZAorICAgIC8vIHJldHVybnMgdGhlIHNpemUgb2YgYnVmZmVyIGZvciB0aGUgdGFibGUKKyAgICBpbnQ2NF90IHRhYmxlX3NpemUoaW50NjRfdCAmbmVsZW1zKTsKKworICAgIC8vIENvcHkgdGFibGUgY29udGVudHMgdG8gZ2l2ZW4gYnVmZmVyLiBJdCBpcyBzdXBwb3NlZCB0byBiZSBsYXJnZQorICAgIC8vIGVub3VnaCB0byBob2xkIGFsbCBlbGVtZW50cyBhcyBzdHJpbmcgdGFibGUuCisgICAgdm9pZCB0YWJsZV9jb3B5KHZvaWQgKmJ1ZiwgaW50NjRfdCBuZWxlbXMpOworCisgICAgLy8gUGF0Y2ggbmFtZSBvZmZzZXRzIGluIGEgdGFibGUgYWZ0ZXIgaXQncyBiZWVuIGNvcGllZCB0byBvdGhlciBzaWRlCisgICAgc3RhdGljIHZvaWQgdGFibGVfcGF0Y2hfbmFtZXModm9pZCAqYnVmLCBpbnQ2NF90IG5lbGVtcyk7Cit9OworCitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2VudHJpZXM7CitleHRlcm4gRnVuY0xpc3QgX19vZmZsb2FkX2Z1bmNzOworZXh0ZXJuIFZhckxpc3QgIF9fb2ZmbG9hZF92YXJzOworCisvLyBTZWN0aW9uIG5hbWVzIHdoZXJlIHRoZSBsb29rdXAgdGFibGVzIGFyZSBzdG9yZWQKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX1NUQVJUICAgIi5PZmZsb2FkRW50cnlUYWJsZSRhIgorI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fRU5EICAgICAiLk9mZmxvYWRFbnRyeVRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX0VORCAgICAgICIuT2ZmbG9hZEZ1bmNUYWJsZSR6IgorCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgICIuT2ZmbG9hZFZhclRhYmxlJGEiCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlJHoiCisKKyNkZWZpbmUgT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQgICAgICAgIi5DUlQkWENUIgorCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQsIHJlYWQpCisKKyNlbHNlICAvLyBUQVJHRVRfV0lOTlQKKworI2RlZmluZSBPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAiLk9mZmxvYWRFbnRyeVRhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCAgICAgIi5PZmZsb2FkRW50cnlUYWJsZS4iCisKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fU1RBUlQgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKyNkZWZpbmUgT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgIi5PZmZsb2FkRnVuY1RhYmxlLiIKKworI2RlZmluZSBPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUICAgICAiLk9mZmxvYWRWYXJUYWJsZS4iCisjZGVmaW5lIE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5EICAgICAgICIuT2ZmbG9hZFZhclRhYmxlLiIKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9FTlRSWV9UQUJMRV9TRUNUSU9OX0VORCwgcmVhZCwgd3JpdGUpCisKKyNwcmFnbWEgc2VjdGlvbihPRkZMT0FEX0ZVTkNfVEFCTEVfU0VDVElPTl9TVEFSVCwgcmVhZCwgd3JpdGUpCisjcHJhZ21hIHNlY3Rpb24oT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fU1RBUlQsIHJlYWQsIHdyaXRlKQorI3ByYWdtYSBzZWN0aW9uKE9GRkxPQURfVkFSX1RBQkxFX1NFQ1RJT05fRU5ELCByZWFkLCB3cml0ZSkKKworCisvLyByZWdpc3Rlci91bnJlZ2lzdGVyIGdpdmVuIHRhYmxlcworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF9yZWdpc3Rlcl90YWJsZXMoCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmVudHJ5X3RhYmxlLAorICAgIEZ1bmNMaXN0OjpOb2RlICpmdW5jX3RhYmxlLAorICAgIFZhckxpc3Q6Ok5vZGUgKnZhcl90YWJsZQorKTsKKworZXh0ZXJuICJDIiB2b2lkIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygKKyAgICBGdW5jTGlzdDo6Tm9kZSAqZW50cnlfdGFibGUsCisgICAgRnVuY0xpc3Q6Ok5vZGUgKmZ1bmNfdGFibGUsCisgICAgVmFyTGlzdDo6Tm9kZSAqdmFyX3RhYmxlCispOworI2VuZGlmICAvLyBPRkZMT0FEX1RBQkxFX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmYzFiMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuY3BwCkBAIC0wLDAgKzEsNzU0IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RhcmdldC5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2lmZGVmIFNFUF9TVVBQT1JUCisjaW5jbHVkZSA8ZmNudGwuaD4KKyNpbmNsdWRlIDxzeXMvaW9jdGwuaD4KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorI2luY2x1ZGUgPG9tcC5oPgorI2luY2x1ZGUgPG1hcD4KKworLy8gdHlwZWRlZiBvZmZsb2FkX2Z1bmNfd2l0aF9wYXJtcy4KKy8vIFBvaW50ZXIgdG8gZnVuY3Rpb24gdGhhdCByZXByZXNlbnRzIGFuIG9mZmxvYWRlZCBlbnRyeSBwb2ludC4KKy8vIFRoZSBwYXJhbWV0ZXJzIGFyZSBhIHRlbXBvcmFyeSBmaXggZm9yIHBhcmFtZXRlcnMgb24gdGhlIHN0YWNrLgordHlwZWRlZiB2b2lkICgqb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpKHZvaWQgKik7CisKKy8vIFRhcmdldCBjb25zb2xlIGFuZCBmaWxlIGxvZ2dpbmcKK2NvbnN0IGNoYXIgKnByZWZpeDsKK2ludCBjb25zb2xlX2VuYWJsZWQgPSAwOworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKKworLy8gVHJhY2UgaW5mb3JtYXRpb24KK3N0YXRpYyBjb25zdCBjaGFyKiB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbXSA9IHsKKyAgICAiTk9DT1BZIiwKKyAgICAiSU4iLAorICAgICJPVVQiLAorICAgICJJTk9VVCIKK307CitzdGF0aWMgY29uc3QgY2hhciogdmFyZGVzY190eXBlX2FzX3N0cmluZ1tdID0geworICAgICJ1bmtub3duIiwKKyAgICAiZGF0YSIsCisgICAgImRhdGFfcHRyIiwKKyAgICAiZnVuY19wdHIiLAorICAgICJ2b2lkX3B0ciIsCisgICAgInN0cmluZ19wdHIiLAorICAgICJkdiIsCisgICAgImR2X2RhdGEiLAorICAgICJkdl9kYXRhX3NsaWNlIiwKKyAgICAiZHZfcHRyIiwKKyAgICAiZHZfcHRyX2RhdGEiLAorICAgICJkdl9wdHJfZGF0YV9zbGljZSIsCisgICAgImNlYW5fdmFyIiwKKyAgICAiY2Vhbl92YXJfcHRyIiwKKyAgICAiY19kYXRhX3B0cl9hcnJheSIKK307CisKK2ludCBtaWNfaW5kZXggPSAtMTsKK2ludCBtaWNfZW5naW5lc190b3RhbCA9IC0xOwordWludDY0X3QgbWljX2ZyZXF1ZW5jeSA9IDA7CitpbnQgb2ZmbG9hZF9udW1iZXIgPSAwOworc3RhdGljIHN0ZDo6bWFwPHZvaWQqLCBSZWZJbmZvKj4gcmVmX2RhdGE7CitzdGF0aWMgbXV0ZXhfdCBhZGRfcmVmX2xvY2s7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfbW9uaXRvcl9lbnYgPSAiU0VQX01PTklUT1IiOworc3RhdGljIGJvb2wgICAgICAgICBzZXBfbW9uaXRvciA9IGZhbHNlOworc3RhdGljIGNvbnN0IGNoYXIqICBzZXBfZGV2aWNlX2VudiA9ICJTRVBfREVWSUNFIjsKK3N0YXRpYyBjb25zdCBjaGFyKiAgc2VwX2RldmljZSA9ICAiL2Rldi9zZXAzLjgvYyI7CitzdGF0aWMgaW50ICAgICAgICAgIHNlcF9jb3VudGVyID0gMDsKKworI2RlZmluZSBTRVBfQVBJX0lPQ19NQUdJQyAgIDk5CisjZGVmaW5lIFNFUF9JT0NUTF9QQVVTRSAgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzEpCisjZGVmaW5lIFNFUF9JT0NUTF9SRVNVTUUgICAgX0lPIChTRVBfQVBJX0lPQ19NQUdJQywgMzIpCisKK3N0YXRpYyB2b2lkIGFkZF9yZWZfY291bnQodm9pZCAqIGJ1ZiwgYm9vbCBjcmVhdGVkKQoreworICAgIG11dGV4X2xvY2tlcl90IGxvY2tlcihhZGRfcmVmX2xvY2spOworICAgIFJlZkluZm8gKiBpbmZvID0gcmVmX2RhdGFbYnVmXTsKKworICAgIGlmIChpbmZvKSB7CisgICAgICAgIGluZm8tPmNvdW50Kys7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpbmZvID0gbmV3IFJlZkluZm8oKGludCljcmVhdGVkLChsb25nKTEpOworICAgIH0KKyAgICBpbmZvLT5pc19hZGRlZCB8PSBjcmVhdGVkOworICAgIHJlZl9kYXRhW2J1Zl0gPSBpbmZvOworfQorCitzdGF0aWMgdm9pZCBCdWZSZWxlYXNlUmVmKHZvaWQgKiBidWYpCit7CisgICAgbXV0ZXhfbG9ja2VyX3QgbG9ja2VyKGFkZF9yZWZfbG9jayk7CisgICAgUmVmSW5mbyAqIGluZm8gPSByZWZfZGF0YVtidWZdOworCisgICAgaWYgKGluZm8pIHsKKyAgICAgICAgLS1pbmZvLT5jb3VudDsKKyAgICAgICAgaWYgKGluZm8tPmNvdW50ID09IDAgJiYgaW5mby0+aXNfYWRkZWQpIHsKKyAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgIGluZm8tPmlzX2FkZGVkID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworc3RhdGljIGludCBWVFBhdXNlU2FtcGxpbmcodm9pZCkKK3sKKyAgICBpbnQgcmV0ID0gLTE7CisgICAgaW50IGhhbmRsZSA9IG9wZW4oc2VwX2RldmljZSwgT19SRFdSKTsKKyAgICBpZiAoaGFuZGxlID4gMCkgeworICAgICAgICByZXQgPSBpb2N0bChoYW5kbGUsIFNFUF9JT0NUTF9QQVVTRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisKK3N0YXRpYyBpbnQgVlRSZXN1bWVTYW1wbGluZyh2b2lkKQoreworICAgIGludCByZXQgPSAtMTsKKyAgICBpbnQgaGFuZGxlID0gb3BlbihzZXBfZGV2aWNlLCBPX1JEV1IpOworICAgIGlmIChoYW5kbGUgPiAwKSB7CisgICAgICAgIHJldCA9IGlvY3RsKGhhbmRsZSwgU0VQX0lPQ1RMX1JFU1VNRSk7CisgICAgICAgIGNsb3NlKGhhbmRsZSk7CisgICAgfQorICAgIHJldHVybiByZXQ7Cit9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6b2ZmbG9hZCgKKyAgICB1aW50MzJfdCAgYnVmZmVyX2NvdW50LAorICAgIHZvaWQqKiAgICBidWZmZXJzLAorICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgdWludDE2X3QgIG1pc2NfZGF0YV9sZW4sCisgICAgdm9pZCogICAgIHJldHVybl9kYXRhLAorICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKykKK3sKKyAgICBGdW5jdGlvbkRlc2NyaXB0b3IgKmZ1bmMgPSAoRnVuY3Rpb25EZXNjcmlwdG9yKikgbWlzY19kYXRhOworICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBmdW5jLT5kYXRhOworICAgIE9mZmxvYWREZXNjcmlwdG9yIG9mbGQ7CisgICAgY2hhciAqaW5fZGF0YSA9IDA7CisgICAgY2hhciAqb3V0X2RhdGEgPSAwOworICAgIGNoYXIgKnRpbWVyX2RhdGEgPSAwOworCisgICAgY29uc29sZV9lbmFibGVkID0gZnVuYy0+Y29uc29sZV9lbmFibGVkOworICAgIHRpbWVyX2VuYWJsZWQgPSBmdW5jLT50aW1lcl9lbmFibGVkOworICAgIG9mZmxvYWRfcmVwb3J0X2xldmVsID0gZnVuYy0+b2ZmbG9hZF9yZXBvcnRfbGV2ZWw7CisgICAgb2ZmbG9hZF9udW1iZXIgPSBmdW5jLT5vZmZsb2FkX251bWJlcjsKKyAgICBvZmxkLnNldF9vZmZsb2FkX251bWJlcihmdW5jLT5vZmZsb2FkX251bWJlcik7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX2ZldGNoX2FuZF9hZGQoJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFJlc3VtZVNhbXBsaW5nXG4iKTsKKyAgICAgICAgICAgIFZUUmVzdW1lU2FtcGxpbmcoKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBTRVBfU1VQUE9SVAorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDIsIG9mbGQuZ2V0X29mZmxvYWRfbnVtYmVyKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF9zdGFydF90YXJnZXRfZnVuYywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIk9mZmxvYWQgXCIlc1wiIHN0YXJ0ZWRcbiIsIG5hbWUpOworCisgICAgLy8gaW5pdGlhbGl6ZSB0aW1lciBkYXRhCisgICAgT0ZGTE9BRF9USU1FUl9JTklUKCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCk7CisKKyAgICAvLyBnZXQgaW5wdXQvb3V0cHV0IGJ1ZmZlciBhZGRyZXNzZXMKKyAgICBpZiAoZnVuYy0+aW5fZGF0YWxlbiA+IDAgfHwgZnVuYy0+b3V0X2RhdGFsZW4gPiAwKSB7CisgICAgICAgIGlmIChmdW5jLT5kYXRhX29mZnNldCAhPSAwKSB7CisgICAgICAgICAgICBpbl9kYXRhID0gKGNoYXIqKSBtaXNjX2RhdGEgKyBmdW5jLT5kYXRhX29mZnNldDsKKyAgICAgICAgICAgIG91dF9kYXRhID0gKGNoYXIqKSByZXR1cm5fZGF0YTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgKmlub3V0X2J1ZiA9IChjaGFyKikgYnVmZmVyc1stLWJ1ZmZlcl9jb3VudF07CisgICAgICAgICAgICBpbl9kYXRhID0gaW5vdXRfYnVmOworICAgICAgICAgICAgb3V0X2RhdGEgPSBpbm91dF9idWY7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLyBhc3NpZ24gdmFyaWFibGUgZGVzY3JpcHRvcnMKKyAgICBvZmxkLm1fdmFyc190b3RhbCA9IGZ1bmMtPnZhcnNfbnVtOworICAgIGlmIChvZmxkLm1fdmFyc190b3RhbCA+IDApIHsKKyAgICAgICAgdWludDY0X3QgdmFyX2RhdGFfbGVuID0gb2ZsZC5tX3ZhcnNfdG90YWwgKiBzaXplb2YoVmFyRGVzYyk7CisKKyAgICAgICAgb2ZsZC5tX3ZhcnMgPSAoVmFyRGVzYyopIG1hbGxvYyh2YXJfZGF0YV9sZW4pOworICAgICAgICBtZW1jcHkob2ZsZC5tX3ZhcnMsIGluX2RhdGEsIHZhcl9kYXRhX2xlbik7CisKKyAgICAgICAgaW5fZGF0YSArPSB2YXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPmluX2RhdGFsZW4gLT0gdmFyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIHRpbWVyIGRhdGEKKyAgICBpZiAoZnVuYy0+dGltZXJfZW5hYmxlZCkgeworICAgICAgICB1aW50NjRfdCB0aW1lcl9kYXRhX2xlbiA9IE9GRkxPQURfVElNRVJfREFUQUxFTigpOworCisgICAgICAgIHRpbWVyX2RhdGEgPSBvdXRfZGF0YTsKKyAgICAgICAgb3V0X2RhdGEgKz0gdGltZXJfZGF0YV9sZW47CisgICAgICAgIGZ1bmMtPm91dF9kYXRhbGVuIC09IHRpbWVyX2RhdGFfbGVuOworICAgIH0KKworICAgIC8vIGluaXQgTWFyc2hhbGxlcnMKKyAgICBvZmxkLm1faW4uaW5pdF9idWZmZXIoaW5fZGF0YSwgZnVuYy0+aW5fZGF0YWxlbik7CisgICAgb2ZsZC5tX291dC5pbml0X2J1ZmZlcihvdXRfZGF0YSwgZnVuYy0+b3V0X2RhdGFsZW4pOworCisgICAgLy8gY29weSBidWZmZXJzIHRvIG9mZmxvYWQgZGVzY3JpcHRvcgorICAgIHN0ZDo6Y29weShidWZmZXJzLCBidWZmZXJzICsgYnVmZmVyX2NvdW50LAorICAgICAgICAgICAgICBzdGQ6OmJhY2tfaW5zZXJ0ZXIob2ZsZC5tX2J1ZmZlcnMpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2Rlc2NyaXB0b3Jfc2V0dXApOworCisgICAgLy8gZmluZCBvZmZsb2FkIGVudHJ5IGFkZHJlc3MKKyAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgb2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMgZW50cnkgPSAob2ZmbG9hZF9mdW5jX3dpdGhfcGFybXMpCisgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmZpbmRfYWRkcihuYW1lKTsKKworICAgIGlmIChlbnRyeSA9PSBOVUxMKSB7CisjaWYgT0ZGTE9BRF9ERUJVRyA+IDAKKyAgICAgICAgaWYgKGNvbnNvbGVfZW5hYmxlZCA+IDIpIHsKKyAgICAgICAgICAgIF9fb2ZmbG9hZF9lbnRyaWVzLmR1bXAoKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIExJQk9GRkxPQURfRVJST1IoY19vZmZsb2FkX2Rlc2NyaXB0b3Jfb2ZmbG9hZCwgbmFtZSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXApOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2Z1bmNfdGltZSk7CisKKyAgICAvLyBleGVjdXRlIG9mZmxvYWQgZW50cnkKKyAgICBlbnRyeSgmb2ZsZCk7CisKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9mdW5jX3RpbWUpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSk7CisKKyAgICAvLyBjb3B5IHRpbWVyIGRhdGEgdG8gdGhlIGJ1ZmZlcgorICAgIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSk7CisKKyAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJPZmZsb2FkIFwiJXNcIiBmaW5pc2hlZFxuIiwgbmFtZSk7CisKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGlmIChzZXBfbW9uaXRvcikgeworICAgICAgICBpZiAoX19zeW5jX3N1Yl9hbmRfZmV0Y2goJnNlcF9jb3VudGVyLCAxKSA9PSAwKSB7CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFKDIsICJWVFBhdXNlU2FtcGxpbmdcbiIpOworICAgICAgICAgICAgVlRQYXVzZVNhbXBsaW5nKCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gU0VQX1NVUFBPUlQKK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6bWVyZ2VfdmFyX2Rlc2NzKAorICAgIFZhckRlc2MgKnZhcnMsCisgICAgVmFyRGVzYzIgKnZhcnMyLAorICAgIGludCB2YXJzX3RvdGFsCispCit7CisgICAgLy8gbnVtYmVyIG9mIHZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdCBhbmQgZ2VuZXJhdGVkCisgICAgLy8gbG9jYWxseSBzaG91bGQgbWF0Y2gKKyAgICBpZiAobV92YXJzX3RvdGFsIDwgdmFyc190b3RhbCkgeworICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMSk7CisgICAgICAgIGV4aXQoMSk7CisgICAgfQorCisgICAgZm9yIChpbnQgaSA9IDA7IGkgPCBtX3ZhcnNfdG90YWw7IGkrKykgeworICAgICAgICBpZiAoaSA8IHZhcnNfdG90YWwpIHsKKyAgICAgICAgICAgIC8vIHZhcmlhYmxlIHR5cGUgbXVzdCBtYXRjaAorICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmJpdHMgIT0gdmFyc1tpXS50eXBlLmJpdHMpIHsKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfbWVyZ2VfdmFyX2Rlc2NzMik7CisgICAgICAgICAgICAgICAgZXhpdCgxKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbV92YXJzW2ldLnB0ciA9IHZhcnNbaV0ucHRyOworICAgICAgICAgICAgbV92YXJzW2ldLmludG8gPSB2YXJzW2ldLmludG87CisKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnZhcl9zbmFtZSA9ICIiOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAodmFyczJbaV0uc25hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICB2YXJfc25hbWUgPSB2YXJzMltpXS5zbmFtZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0RFQlVHX1RSQUNFXzEoMiwgZ2V0X29mZmxvYWRfbnVtYmVyKCksIGNfb2ZmbG9hZF92YXIsCisgICAgICAgICAgICAgICAgIiAgIFZhckRlc2MgJWQsIHZhcj0lcywgJXMsICVzXG4iLAorICAgICAgICAgICAgICAgIGksIHZhcl9zbmFtZSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX2RpcmVjdGlvbl9hc19zdHJpbmdbbV92YXJzW2ldLmRpcmVjdGlvbi5iaXRzXSwKKyAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLnNyY10pOworICAgICAgICAgICAgaWYgKHZhcnMyICE9IE5VTEwgJiYgdmFyczJbaV0uZG5hbWUgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwgIiAgICAgICAgICAgICAgaW50bz0lcywgJXNcbiIsIHZhcnMyW2ldLmRuYW1lLAorICAgICAgICAgICAgICAgICAgICB2YXJkZXNjX3R5cGVfYXNfc3RyaW5nW21fdmFyc1tpXS50eXBlLmRzdF0pOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIE9GRkxPQURfVFJBQ0UoMiwKKyAgICAgICAgICAgICIgICAgICAgICAgICAgIHR5cGVfc3JjPSVkLCB0eXBlX2RzdG49JWQsIGRpcmVjdGlvbj0lZCwgIgorICAgICAgICAgICAgImFsbG9jX2lmPSVkLCBmcmVlX2lmPSVkLCBhbGlnbj0lZCwgbWljX29mZnNldD0lZCwgZmxhZ3M9MHgleCwgIgorICAgICAgICAgICAgIm9mZnNldD0lbGxkLCBzaXplPSVsbGQsIGNvdW50L2Rpc3A9JWxsZCwgcHRyPSVwIGludG89JXBcbiIsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5zcmMsCisgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0uYWxsb2NfaWYsCisgICAgICAgICAgICBtX3ZhcnNbaV0uZnJlZV9pZiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGlnbiwKKyAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLmZsYWdzLmJpdHMsCisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0LAorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUsCisgICAgICAgICAgICBtX3ZhcnNbaV0uY291bnQsCisgICAgICAgICAgICBtX3ZhcnNbaV0ucHRyLAorICAgICAgICAgICAgbV92YXJzW2ldLmludG8pOworICAgIH0KK30KKwordm9pZCBPZmZsb2FkRGVzY3JpcHRvcjo6c2NhdHRlcl9jb3B5aW5fZGF0YSgpCit7CisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3NjYXR0ZXJfaW5wdXRzKTsKKworICAgIE9GRkxPQURfREVCVUdfVFJBQ0UoMiwgIklOICBidWZmZXIgQCAlcCBzaXplICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X2J1ZmZlcl9zaXplKCkpOworICAgIE9GRkxPQURfREVCVUdfRFVNUF9CWVRFUygyLCBtX2luLmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5nZXRfYnVmZmVyX3NpemUoKSk7CisKKyAgICAvLyByZWNlaXZlIGRhdGEKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKyAgICAgICAgdm9pZCoqIHB0cl9hZGRyID0gc3JjX2lzX2Zvcl9taWMgPworICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDx2b2lkKio+KG1fdmFyc1tpXS5wdHIpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8dm9pZCoqPihtX3ZhcnNbaV0uaW50byk7CisgICAgICAgIGludCB0eXBlID0gc3JjX2lzX2Zvcl9taWMgPyBtX3ZhcnNbaV0udHlwZS5zcmMgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnR5cGUuZHN0OworICAgICAgICBib29sIGlzX3N0YXRpYyA9IHNyY19pc19mb3JfbWljID8KKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG47CisgICAgICAgIHZvaWQgKnB0ciA9IE5VTEw7CisKKyAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5hbGxvY19kaXNwKSB7CisgICAgICAgICAgICBpbnQ2NF90IG9mZnNldCA9IDA7CisgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmb2Zmc2V0LCBzaXplb2Yob2Zmc2V0KSk7CisgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0ID0gLW9mZnNldDsKKyAgICAgICAgfQorICAgICAgICBpZiAoVkFSX1RZUEVfSVNfRFZfREFUQV9TTElDRSh0eXBlKSB8fAorICAgICAgICAgICAgVkFSX1RZUEVfSVNfRFZfREFUQSh0eXBlKSkgeworICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKHR5cGUgPT0gY19kdl9kYXRhX3NsaWNlIHx8IHR5cGUgPT0gY19kdl9kYXRhKT8KKyAgICAgICAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8QXJyRGVzYyo+KHB0cl9hZGRyKSA6CisgICAgICAgICAgICAgICAgICAqcmVpbnRlcnByZXRfY2FzdDxBcnJEZXNjKio+KHB0cl9hZGRyKTsKKyAgICAgICAgICAgIHB0cl9hZGRyID0gcmVpbnRlcnByZXRfY2FzdDx2b2lkKio+KCZkdnAtPkJhc2UpOworICAgICAgICB9CisKKyAgICAgICAgLy8gU2V0IHBvaW50ZXIgdmFsdWVzCisgICAgICAgIHN3aXRjaCAodHlwZSkgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGogPSBtX3ZhcnNbaV0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIGludCBtYXhfZWwgPSBqICsgbV92YXJzW2ldLmNvdW50OworICAgICAgICAgICAgICAgICAgICBjaGFyICpkc3RfYXJyX3B0ciA9IChzcmNfaXNfZm9yX21pYyk/CisgICAgICAgICAgICAgICAgICAgICAgICAqKHJlaW50ZXJwcmV0X2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSkgOgorICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pOworCisgICAgICAgICAgICAgICAgICAgIGZvciAoOyBqIDwgbWF4X2VsOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChzcmNfaXNfZm9yX21pYykgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5wdHIgPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkc3RfYXJyX3B0ciArIG1fdmFyc1tqXS5wdHJfYXJyX29mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tqXS5pbnRvID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZHN0X2Fycl9wdHIgKyBtX3ZhcnNbal0ucHRyX2Fycl9vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmFsbG9jX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9IG1fYnVmZmVycy5mcm9udCgpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9idWZmZXJzLnBvcF9mcm9udCgpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICghaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCdWZmZXJBZGRSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkX3JlZl9jb3VudChidWYsIDAgPT0gbV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcik7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhY2tfYnVmID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCA6IG1fdmFyc1tpXS5vZmZzZXQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICpwdHJfYWRkciA9IHB0cjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWY7CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKCZidWYsIHNpemVvZihidWYpKTsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqcHRyID0gc3RhdGljX2Nhc3Q8Y2hhcio+KGJ1ZikgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAgOiBtX3ZhcnNbaV0ub2Zmc2V0KTsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhX3NsaWNlOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uYWxsb2NfaWYpIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmZsYWdzLnNpbmtfYWRkcikgeworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYnVmID0gbV9idWZmZXJzLmZyb250KCk7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2J1ZmZlcnMucG9wX2Zyb250KCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGJ1ZikgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCFpc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIW1fdmFyc1tpXS5mbGFncy5zaW5rX2FkZHIpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2FkZF9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZmZlckFkZFJlZihidWYpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9hZGRfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhZGRfcmVmX2NvdW50KGJ1ZiwgMCA9PSBtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHB0ciA9IHN0YXRpY19jYXN0PGNoYXIqPihidWYpICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCArIG1fdmFyc1tpXS5vZmZzZXQ7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChtX3ZhcnNbaV0uZmxhZ3Muc2lua19hZGRyKSB7CisgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoJmJ1Ziwgc2l6ZW9mKGJ1ZikpOworICAgICAgICAgICAgICAgICAgICBwdHIgPSBzdGF0aWNfY2FzdDxjaGFyKj4oYnVmKSArCisgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5taWNfb2Zmc2V0ICsgbV92YXJzW2ldLm9mZnNldDsKKyAgICAgICAgICAgICAgICAgICAgKnB0cl9hZGRyID0gcHRyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfdW5rbm93bl92YXJfdHlwZSwgdHlwZSk7CisgICAgICAgICAgICAgICAgYWJvcnQoKTsKKyAgICAgICAgfQorICAgICAgICAvLyBSZWxlYXNlIG9ic29sZXRlIGJ1ZmZlcnMgZm9yIHN0YWNrIG9mIHBlcnNpc3RlbnQgb2JqZWN0cworICAgICAgICBpZiAodHlwZSA9IGNfZGF0YV9wdHIgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5mbGFncy5pc19zdGFja19idWYgJiYKKyAgICAgICAgICAgICFtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgJiYKKyAgICAgICAgICAgIG1fdmFyc1tpXS5hbGxvY19pZiAmJgorICAgICAgICAgICAgbV92YXJzW2ldLnNpemUgIT0gMCkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGo9MDsgaiA8IG1fdmFyc1tpXS5zaXplOyBqKyspIHsKKyAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgmYnVmLCBzaXplb2YoYnVmKSk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZmZlclJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgcmVmX2RhdGEuZXJhc2UoYnVmKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG8gY29weWluCisgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHJfYXJyYXk6CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgIGNhc2UgY192b2lkX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3ZhcjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpY19kc3RuKSB7CisgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBkaXNwOworICAgICAgICAgICAgICAgICAgICBjaGFyKiBwdHIgPSBtX3ZhcnNbaV0uaW50byA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0aWNfY2FzdDxjaGFyKj4obV92YXJzW2ldLmludG8pIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS50eXBlLmRzdCA9PSBjX2NlYW5fdmFyKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YSgoJnNpemUpLCBzaXplb2YoaW50NjRfdCkpOworICAgICAgICAgICAgICAgICAgICAgICAgbV9pbi5yZWNlaXZlX2RhdGEoKCZkaXNwKSwgc2l6ZW9mKGludDY0X3QpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgPSBtX3ZhcnNbaV0uc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRpc3AgPSAwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1faW4ucmVjZWl2ZV9kYXRhKHB0ciArIGRpc3AsIHNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLmJpdHMgfHwKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmFsbG9jX2lmIHx8CisgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS5mcmVlX2lmKSB7CisgICAgICAgICAgICAgICAgICAgIGNoYXIqIHB0ciA9IG1fdmFyc1tpXS5pbnRvID8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0uaW50bykgOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8Y2hhcio+KG1fdmFyc1tpXS5wdHIpOworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZGF0YShwdHIgKyBzaXplb2YodWludDY0X3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uc2l6ZSAtIHNpemVvZih1aW50NjRfdCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX3N0cmluZ19wdHI6CisgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXJfcHRyOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X3B0cl9kYXRhOgorICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGFfc2xpY2U6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgY19mdW5jX3B0cjoKKyAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbikgeworICAgICAgICAgICAgICAgICAgICBtX2luLnJlY2VpdmVfZnVuY19wdHIoKGNvbnN0IHZvaWQqKikgbV92YXJzW2ldLnB0cik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBPRkZMT0FEX1RSQUNFKDEsICJUb3RhbCBjb3B5aW4gZGF0YSByZWNlaXZlZCBmcm9tIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1faW4uZ2V0X3Rmcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMpOworCisgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X2NvbXB1dGUpOworfQorCit2b2lkIE9mZmxvYWREZXNjcmlwdG9yOjpnYXRoZXJfY29weW91dF9kYXRhKCkKK3sKKyAgICBPRkZMT0FEX1RJTUVSX1NUT1AoY19vZmZsb2FkX3RhcmdldF9jb21wdXRlKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RBUlQoY19vZmZsb2FkX3RhcmdldF9nYXRoZXJfb3V0cHV0cyk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IG1fdmFyc190b3RhbDsgaSsrKSB7CisgICAgICAgIGJvb2wgc3JjX2lzX2Zvcl9taWMgPSAobV92YXJzW2ldLmRpcmVjdGlvbi5vdXQgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0uaW50byA9PSBOVUxMKTsKKworICAgICAgICBzd2l0Y2ggKG1fdmFyc1tpXS50eXBlLnNyYykgeworICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBjX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICBjYXNlIGNfY2Vhbl92YXI6CisgICAgICAgICAgICAgICAgaWYgKG1fdmFyc1tpXS5kaXJlY3Rpb24ub3V0ICYmCisgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljKSB7CisgICAgICAgICAgICAgICAgICAgIG1fb3V0LnNlbmRfZGF0YSgKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PGNoYXIqPihtX3ZhcnNbaV0ucHRyKSArIG1fdmFyc1tpXS5kaXNwLAorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLnNpemUpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2OgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19kYXRhX3B0cjoKKyAgICAgICAgICAgIGNhc2UgY19jZWFuX3Zhcl9wdHI6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICBzcmNfaXNfZm9yX21pYyAmJgorICAgICAgICAgICAgICAgICAgICAhbV92YXJzW2ldLmZsYWdzLmlzX3N0YXRpYykgeworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSAqc3RhdGljX2Nhc3Q8Y2hhcioqPihtX3ZhcnNbaV0ucHRyKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVEFSVChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZGlyZWN0aW9uLm91dCkgeworICAgICAgICAgICAgICAgICAgICBtX291dC5zZW5kX2Z1bmNfcHRyKCooKHZvaWQqKikgbV92YXJzW2ldLnB0cikpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSBjX2R2X2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGE6CisgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBpZiAoc3JjX2lzX2Zvcl9taWMgJiYKKyAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWMpIHsKKyAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0gKG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGEgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fdmFyc1tpXS50eXBlLnNyYyA9PSBjX2R2X2RhdGFfc2xpY2UpID8KKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRpY19jYXN0PEFyckRlc2MqPihtX3ZhcnNbaV0ucHRyKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAqc3RhdGljX2Nhc3Q8QXJyRGVzYyoqPihtX3ZhcnNbaV0ucHRyKTsKKworICAgICAgICAgICAgICAgICAgICB2b2lkICpidWYgPSByZWludGVycHJldF9jYXN0PGNoYXIqPihkdnAtPkJhc2UpIC0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLm1pY19vZmZzZXQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLyBkZWNyZW1lbnQgYnVmZmVyIHJlZmVyZW5jZSBjb3VudAorICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgT0ZGTE9BRF9USU1FUl9TVE9QKGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgIGFib3J0KCk7CisgICAgICAgIH0KKworICAgICAgICBpZiAobV92YXJzW2ldLmludG8pIHsKKyAgICAgICAgICAgIHN3aXRjaCAobV92YXJzW2ldLnR5cGUuZHN0KSB7CisgICAgICAgICAgICAgICAgY2FzZSBjX2RhdGFfcHRyX2FycmF5OgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfdm9pZF9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdjoKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIGNfc3RyaW5nX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZGF0YV9wdHI6CisgICAgICAgICAgICAgICAgY2FzZSBjX2NlYW5fdmFyX3B0cjoKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyOgorICAgICAgICAgICAgICAgICAgICBpZiAobV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmZyZWVfaWYgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICFtX3ZhcnNbaV0uZmxhZ3MuaXNfc3RhdGljX2RzdG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZiA9ICpzdGF0aWNfY2FzdDxjaGFyKio+KG1fdmFyc1tpXS5pbnRvKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLmZsYWdzLmlzX3N0YWNrX2J1Zj8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIDogbV92YXJzW2ldLm9mZnNldCk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChidWYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gZGVjcmVtZW50IGJ1ZmZlciByZWZlcmVuY2UgY291bnQKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEJ1ZlJlbGVhc2VSZWYoYnVmKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjX29mZmxvYWRfdGFyZ2V0X3JlbGVhc2VfYnVmZmVyX3JlZnMpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBjX2Z1bmNfcHRyOgorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGNhc2UgY19kdl9kYXRhOgorICAgICAgICAgICAgICAgIGNhc2UgY19kdl9wdHJfZGF0YToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfZGF0YV9zbGljZToKKyAgICAgICAgICAgICAgICBjYXNlIGNfZHZfcHRyX2RhdGFfc2xpY2U6CisgICAgICAgICAgICAgICAgICAgIGlmIChtX3ZhcnNbaV0uZnJlZV9pZiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgbV92YXJzW2ldLmRpcmVjdGlvbi5pbiAmJgorICAgICAgICAgICAgICAgICAgICAgICAgIW1fdmFyc1tpXS5mbGFncy5pc19zdGF0aWNfZHN0bikgeworICAgICAgICAgICAgICAgICAgICAgICAgQXJyRGVzYyAqZHZwID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAobV92YXJzW2ldLnR5cGUuZHN0ID09IGNfZHZfZGF0YV9zbGljZSB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0udHlwZS5kc3QgPT0gY19kdl9kYXRhKSA/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdGljX2Nhc3Q8QXJyRGVzYyo+KG1fdmFyc1tpXS5pbnRvKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnN0YXRpY19jYXN0PEFyckRlc2MqKj4obV92YXJzW2ldLmludG8pOworICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqYnVmID0gcmVpbnRlcnByZXRfY2FzdDxjaGFyKj4oZHZwLT5CYXNlKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ubWljX29mZnNldCAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtX3ZhcnNbaV0ub2Zmc2V0OworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoYnVmID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGRlY3JlbWVudCBidWZmZXIgcmVmZXJlbmNlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUQVJUKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyk7CisgICAgICAgICAgICAgICAgICAgICAgICBCdWZSZWxlYXNlUmVmKGJ1Zik7CisgICAgICAgICAgICAgICAgICAgICAgICBPRkZMT0FEX1RJTUVSX1NUT1AoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY19vZmZsb2FkX3RhcmdldF9yZWxlYXNlX2J1ZmZlcl9yZWZzKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICAgICAgICAgIExJQk9GRkxPQURfRVJST1IoY191bmtub3duX3Zhcl90eXBlLCBtX3ZhcnNbaV0udHlwZS5kc3QpOworICAgICAgICAgICAgICAgICAgICBhYm9ydCgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRSgyLCAiT1VUIGJ1ZmZlciBAIHAgJXAgc2l6ZSAlbGxkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zdGFydCgpLAorICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19EVU1QX0JZVEVTKDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF9idWZmZXJfc3RhcnQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbV9vdXQuZ2V0X2J1ZmZlcl9zaXplKCkpOworCisgICAgT0ZGTE9BRF9ERUJVR19UUkFDRV8xKDEsIGdldF9vZmZsb2FkX251bWJlcigpLCBjX29mZmxvYWRfY29weW91dF9kYXRhLAorICAgICAgICAgICAgICAgICAgIlRvdGFsIGNvcHlvdXQgZGF0YSBzZW50IHRvIGhvc3Q6IFslbGxkXSBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgIG1fb3V0LmdldF90ZnJfc2l6ZSgpKTsKKworICAgIE9GRkxPQURfVElNRVJfU1RPUChjX29mZmxvYWRfdGFyZ2V0X2dhdGhlcl9vdXRwdXRzKTsKK30KKwordm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCkKK3sKKyNpZmRlZiBTRVBfU1VQUE9SVAorICAgIGNvbnN0IGNoYXIqIGVudl92YXIgPSBnZXRlbnYoc2VwX21vbml0b3JfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX21vbml0b3IgPSBhdG9pKGVudl92YXIpOworICAgIH0KKyAgICBlbnZfdmFyID0gZ2V0ZW52KHNlcF9kZXZpY2VfZW52KTsKKyAgICBpZiAoZW52X3ZhciAhPSAwICYmICplbnZfdmFyICE9ICdcMCcpIHsKKyAgICAgICAgc2VwX2RldmljZSA9IGVudl92YXI7CisgICAgfQorI2VuZGlmIC8vIFNFUF9TVVBQT1JUCisKKyAgICBwcmVmaXggPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisKKyAgICAvLyBpbml0IGZyZXF1ZW5jeQorICAgIG1pY19mcmVxdWVuY3kgPSBDT0lQZXJmR2V0Q3ljbGVGcmVxdWVuY3koKTsKK30KKworLy8gVXNlci12aXNpYmxlIG9mZmxvYWQgQVBJCisKK2ludCBfT2ZmbG9hZF9udW1iZXJfb2ZfZGV2aWNlcyh2b2lkKQoreworICAgIHJldHVybiBtaWNfZW5naW5lc190b3RhbDsKK30KKworaW50IF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgcmV0dXJuIG1pY19pbmRleDsKK30KKworaW50IF9PZmZsb2FkX2dldF9waHlzaWNhbF9kZXZpY2VfbnVtYmVyKHZvaWQpCit7CisgICAgdWludDMyX3QgaW5kZXg7CisgICAgRW5naW5lR2V0SW5kZXgoJmluZGV4KTsKKyAgICByZXR1cm4gaW5kZXg7Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RhcmdldC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdkYjMxNDcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXQuaApAQCAtMCwwICsxLDEwMCBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyBUaGUgcGFydHMgb2YgdGhlIG9mZmxvYWQgbGlicmFyeSB1c2VkIG9ubHkgb24gdGhlIHRhcmdldAorCisjaWZuZGVmIE9GRkxPQURfVEFSR0VUX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRAorCisjaW5jbHVkZSAib2ZmbG9hZF9jb21tb24uaCIKKyNpbmNsdWRlICJjb2kvY29pX3NlcnZlci5oIgorCisvLyBUaGUgb2ZmbG9hZCBkZXNjcmlwdG9yLgorY2xhc3MgT2ZmbG9hZERlc2NyaXB0b3IKK3sKK3B1YmxpYzoKKyAgICB+T2ZmbG9hZERlc2NyaXB0b3IoKSB7CisgICAgICAgIGlmIChtX3ZhcnMgIT0gMCkgeworICAgICAgICAgICAgZnJlZShtX3ZhcnMpOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gRW50cnkgcG9pbnQgZm9yIENPSS4gU3luY2hyb25vdXNseSBleGVjdXRlIG9mZmxvYWRlZCByZWdpb24gZ2l2ZW4KKyAgICAvLyB0aGUgcHJvdmlkZWQgYnVmZmVycywgbWlzYyBhbmQgcmV0dXJuIGRhdGEuCisgICAgc3RhdGljIHZvaWQgb2ZmbG9hZCgKKyAgICAgICAgdWludDMyX3QgIGJ1ZmZlcl9jb3VudCwKKyAgICAgICAgdm9pZCoqICAgIGJ1ZmZlcnMsCisgICAgICAgIHZvaWQqICAgICBtaXNjX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICBtaXNjX2RhdGFfbGVuLAorICAgICAgICB2b2lkKiAgICAgcmV0dXJuX2RhdGEsCisgICAgICAgIHVpbnQxNl90ICByZXR1cm5fZGF0YV9sZW4KKyAgICApOworCisgICAgLy8gc2NhdHRlcnMgaW5wdXQgZGF0YSBmcm9tIGluIGJ1ZmZlciB0byB0YXJnZXQgdmFyaWFibGVzCisgICAgdm9pZCBzY2F0dGVyX2NvcHlpbl9kYXRhKCk7CisKKyAgICAvLyBnYXRoZXJzIG91dHB1dCBkYXRhIHRvIHRoZSBidWZmZXIKKyAgICB2b2lkIGdhdGhlcl9jb3B5b3V0X2RhdGEoKTsKKworICAgIC8vIG1lcmdlcyBsb2NhbCB2YXJpYWJsZSBkZXNjcmlwdG9ycyB3aXRoIHRoZSBkZXNjcmlwdG9ycyByZWNlaXZlZCBmcm9tCisgICAgLy8gaG9zdAorICAgIHZvaWQgbWVyZ2VfdmFyX2Rlc2NzKFZhckRlc2MgKnZhcnMsIFZhckRlc2MyICp2YXJzMiwgaW50IHZhcnNfdG90YWwpOworCisgICAgaW50IGdldF9vZmZsb2FkX251bWJlcigpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuIG1fb2ZmbG9hZF9udW1iZXI7CisgICAgfQorCisgICAgdm9pZCBzZXRfb2ZmbG9hZF9udW1iZXIoaW50IG51bWJlcikgeworICAgICAgICBtX29mZmxvYWRfbnVtYmVyID0gbnVtYmVyOworICAgIH0KKworcHJpdmF0ZToKKyAgICAvLyBDb25zdHJ1Y3RvcgorICAgIE9mZmxvYWREZXNjcmlwdG9yKCkgOiBtX3ZhcnMoMCkKKyAgICB7fQorCitwcml2YXRlOgorICAgIHR5cGVkZWYgc3RkOjpsaXN0PHZvaWQqPiBCdWZmZXJMaXN0OworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBpbnB1dHMgb2YgdGhlIG9mZmxvYWRlZCByZWdpb24uCisgICAgTWFyc2hhbGxlciBtX2luOworCisgICAgLy8gVGhlIE1hcnNoYWxsZXIgZm9yIHRoZSBvdXRwdXRzIG9mIHRoZSBvZmZsb2FkZWQgcmVnaW9uLgorICAgIE1hcnNoYWxsZXIgbV9vdXQ7CisKKyAgICAvLyBMaXN0IG9mIGJ1ZmZlcnMgdGhhdCBhcmUgcGFzc2VkIHRvIGRpc3BhdGNoIGNhbGwKKyAgICBCdWZmZXJMaXN0IG1fYnVmZmVyczsKKworICAgIC8vIFZhcmlhYmxlIGRlc2NyaXB0b3JzIHJlY2VpdmVkIGZyb20gaG9zdAorICAgIFZhckRlc2MqIG1fdmFyczsKKyAgICBpbnQgICAgICBtX3ZhcnNfdG90YWw7CisgICAgaW50ICAgICAgbV9vZmZsb2FkX251bWJlcjsKK307CisKKy8vIG9uZSB0aW1lIHRhcmdldCBpbml0aWFsaXphdGlvbiBpbiBtYWluCitleHRlcm4gdm9pZCBfX29mZmxvYWRfdGFyZ2V0X2luaXQodm9pZCk7CisKKy8vIGxvZ2ljYWwgZGV2aWNlIGluZGV4CitleHRlcm4gaW50IG1pY19pbmRleDsKKworLy8gdG90YWwgbnVtYmVyIG9mIGF2YWlsYWJsZSBsb2dpY2FsIGRldmljZXMKK2V4dGVybiBpbnQgbWljX2VuZ2luZXNfdG90YWw7CisKKy8vIGRldmljZSBmcmVxdWVuY3kgKGZyb20gQ09JKQorZXh0ZXJuIHVpbnQ2NF90IG1pY19mcmVxdWVuY3k7CisKK3N0cnVjdCBSZWZJbmZvIHsKKyAgICBSZWZJbmZvKGJvb2wgaXNfYWRkLCBsb25nIGFtb3VudCk6aXNfYWRkZWQoaXNfYWRkKSxjb3VudChhbW91bnQpCisgICAge30KKyAgICBib29sIGlzX2FkZGVkOworICAgIGxvbmcgY291bnQ7Cit9OworCisjZW5kaWYgLy8gT0ZGTE9BRF9UQVJHRVRfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0X21haW4uY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGFyZ2V0X21haW4uY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE0OTIxZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90YXJnZXRfbWFpbi5jcHAKQEAgLTAsMCArMSwxNyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCitleHRlcm4gIkMiIHZvaWQgX19vZmZsb2FkX3RhcmdldF9tYWluKHZvaWQpOworCitpbnQgbWFpbihpbnQgYXJnYywgY2hhciAqKiBhcmd2KQoreworICAgIF9fb2ZmbG9hZF90YXJnZXRfbWFpbigpOworICAgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXIuaCBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTQwMWE5ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyLmgKQEAgLTAsMCArMSwxNzIgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworZXh0ZXJuIGludCB0aW1lcl9lbmFibGVkOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworc3RydWN0IE9mZmxvYWRUYXJnZXRUaW1lckRhdGEgeworICAgIHVpbnQ2NF90IGZyZXF1ZW5jeTsKKyAgICBzdHJ1Y3QgeworICAgICAgICB1aW50NjRfdCBzdGFydDsKKyAgICAgICAgdWludDY0X3QgdG90YWw7CisgICAgfSBwaGFzZXNbY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2VdOworfTsKKworc3RydWN0IE9mZmxvYWRIb3N0VGltZXJEYXRhIHsKKyAgICAvLyBzb3VyY2UgZmlsZSBuYW1lIGFuZCBsaW5lIG51bWJlcgorICAgIGNvbnN0IGNoYXIqIGZpbGU7CisgICAgaW50ICAgICAgICAgbGluZTsKKworICAgIC8vIGhvc3QgdGltZXIgZGF0YQorICAgIHN0cnVjdCB7CisgICAgICAgIHVpbnQ2NF90IHN0YXJ0OworICAgICAgICB1aW50NjRfdCB0b3RhbDsKKyAgICB9IHBoYXNlc1tjX29mZmxvYWRfaG9zdF9tYXhfcGhhc2VdOworCisgICAgdWludDY0X3Qgc2VudF9ieXRlczsKKyAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlczsKKyAgICBpbnQgY2FyZF9udW1iZXI7CisgICAgaW50IG9mZmxvYWRfbnVtYmVyOworCisgICAgLy8gdGFyZ2V0IHRpbWVyIGRhdGEKKyAgICBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRhcmdldDsKKworICAgIC8vIG5leHQgZWxlbWVudAorICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhICpuZXh0OworfTsKKworI2lmIEhPU1RfTElCUkFSWQorCitleHRlcm4gaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsOworZXh0ZXJuIGludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkOworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF8xIDEKKyNkZWZpbmUgT0ZGTE9BRF9SRVBPUlRfMiAyCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUXzMgMworI2RlZmluZSBPRkZMT0FEX1JFUE9SVF9PTiAxCisjZGVmaW5lIE9GRkxPQURfUkVQT1JUX09GRiAwCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCB8fCAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpID8gXAorICAgICAoKDEgKyBjX29mZmxvYWRfdGFyZ2V0X21heF9waGFzZSkgKiBzaXplb2YodWludDY0X3QpKSA6IDApCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVEFSVCh0aW1lcl9kYXRhLCBwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9zdGFydCh0aW1lcl9kYXRhLCBwbm9kZSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9TVE9QKHRpbWVyX2RhdGEsIHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwgXAorICAgICAgICAob2ZmbG9hZF9yZXBvcnRfbGV2ZWwgJiYgb2ZmbG9hZF9yZXBvcnRfZW5hYmxlZCkpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX3N0b3AodGltZXJfZGF0YSwgcG5vZGUpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVChmaWxlLCBsaW5lKSBcCisgICAgb2ZmbG9hZF90aW1lcl9pbml0KGZpbGUsIGxpbmUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfVEFSR0VUX0RBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkIHx8IFwKKyAgICAgICAgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKHRpbWVyX2RhdGEsIGRhdGEpOyBcCisgICAgfQorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSE9TVF9TREFUQSh0aW1lcl9kYXRhLCBkYXRhKSBcCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsICYmIG9mZmxvYWRfcmVwb3J0X2VuYWJsZWQpIHsgXAorICAgICAgICBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX0hPU1RfUkRBVEEodGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEodGltZXJfZGF0YSwgZGF0YSk7IFwKKyAgICB9CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9IT1NUX01JQ19OVU0odGltZXJfZGF0YSwgZGF0YSkgXAorICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSB7IFwKKyAgICAgICAgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bSh0aW1lcl9kYXRhLCBkYXRhKTsgXAorICAgIH0KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX3N0b3AoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHRfbm9kZSk7CitleHRlcm4gT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiBvZmZsb2FkX3RpbWVyX2luaXQoY29uc3QgY2hhciAqZmlsZSwgaW50IGxpbmUpOworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqZGF0YSk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9zZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9yZGF0YShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWludDY0X3Qgc2VudF9ieXRlcyk7CitleHRlcm4gdm9pZCBvZmZsb2FkX3RpbWVyX2ZpbGxfaG9zdF9taWNfbnVtKE9mZmxvYWRIb3N0VGltZXJEYXRhICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBjYXJkX251bWJlcik7CisKKy8vIFV0aWxpdHkgc3RydWN0dXJlIGZvciBzdGFydGluZy9zdG9wcGluZyB0aW1lcgorc3RydWN0IE9mZmxvYWRUaW1lciB7CisgICAgT2ZmbG9hZFRpbWVyKE9mZmxvYWRIb3N0VGltZXJEYXRhICpkYXRhLCBPZmZsb2FkSG9zdFBoYXNlIHBoYXNlKSA6CisgICAgICAgIG1fZGF0YShkYXRhKSwKKyAgICAgICAgbV9waGFzZShwaGFzZSkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RBUlQobV9kYXRhLCBtX3BoYXNlKTsKKyAgICB9CisKKyAgICB+T2ZmbG9hZFRpbWVyKCkKKyAgICB7CisgICAgICAgIE9GRkxPQURfVElNRVJfU1RPUChtX2RhdGEsIG1fcGhhc2UpOworICAgIH0KKworcHJpdmF0ZToKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSogICBtX2RhdGE7CisgICAgT2ZmbG9hZEhvc3RQaGFzZSAgICAgICAgbV9waGFzZTsKK307CisKKyNlbHNlCisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKCkgXAorICAgICgodGltZXJfZW5hYmxlZCkgPyBcCisgICAgICgoMSArIGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlKSAqIHNpemVvZih1aW50NjRfdCkpIDogMCkKKworI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUQVJUKHBub2RlKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfc3RhcnQocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RPUChwbm9kZSkgXAorICAgIGlmICh0aW1lcl9lbmFibGVkKSBvZmZsb2FkX3RpbWVyX3N0b3AocG5vZGUpOworCisjZGVmaW5lIE9GRkxPQURfVElNRVJfSU5JVCgpIFwKKyAgICBpZiAodGltZXJfZW5hYmxlZCkgb2ZmbG9hZF90aW1lcl9pbml0KCk7CisKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9UQVJHRVRfREFUQShkYXRhKSBcCisgICAgaWYgKHRpbWVyX2VuYWJsZWQpIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YShkYXRhKTsKKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkVGFyZ2V0UGhhc2UgdF9ub2RlKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCh2b2lkKTsKK2V4dGVybiB2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSh2b2lkICpkYXRhKTsKKworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjZWxzZSAvLyBUSU1JTkdfU1VQUE9SVAorCisjZGVmaW5lIE9GRkxPQURfVElNRVJfU1RBUlQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1NUT1AoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX0lOSVQoLi4uKQorI2RlZmluZSBPRkZMT0FEX1RJTUVSX1RBUkdFVF9EQVRBKC4uLikKKyNkZWZpbmUgT0ZGTE9BRF9USU1FUl9EQVRBTEVOKC4uLikgICAgICAoMCkKKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCisKKyNlbmRpZiAvLyBPRkZMT0FEX1RJTUVSX0hfSU5DTFVERUQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfaG9zdC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmIyN2RiMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RpbWVyX2hvc3QuY3BwCkBAIC0wLDAgKzEsMzU5IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8aWEzMmludHJpbi5oPgorI2Vsc2UgLy8gX19JTlRFTF9DT01QSUxFUgorI2luY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmIC8vIF9fSU5URUxfQ09NUElMRVIKKworI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgPHNzdHJlYW0+CisjaW5jbHVkZSA8aW9zdHJlYW0+CisjaW5jbHVkZSA8aW9tYW5pcD4KKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworaW50IG9mZmxvYWRfcmVwb3J0X2xldmVsID0gMDsKK2ludCBvZmZsb2FkX3JlcG9ydF9lbmFibGVkID0gMTsKKworc3RhdGljIGNvbnN0IGludCBob3N0X3RpbWVyX3ByZWZpeF9zcGFjZXNbXSA9IHsKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX2J1ZmZlcnMqLyAgICAgICAgIDAsCisgICAgLypjX29mZmxvYWRfaG9zdF9pbml0aWFsaXplKi8gICAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfdGFyZ2V0X2FjcXVpcmUqLyAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfZGVwcyovICAgICAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9zZXR1cF9idWZmZXJzKi8gICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3RfYWxsb2NfYnVmZmVycyovICAgICAgICAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NldHVwX21pc2NfZGF0YSovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9hbGxvY19kYXRhX2J1ZmZlciovICAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc2VuZF9wb2ludGVycyovICAgICAgICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X2dhdGhlcl9pbnB1dHMqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfaW5fZGF0YV9idWZmZXIqLyAgICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfaW5fZGF0YV9idWZmZXIqLyAgNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3N0YXJ0X2NvbXB1dGUqLyAgICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF93YWl0X2NvbXB1dGUqLyAgICAgICAgICAyLAorICAgIC8qY19vZmZsb2FkX2hvc3Rfc3RhcnRfYnVmZmVyc19yZWFkcyovICAgMiwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3NjYXR0ZXJfb3V0cHV0cyovICAgICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9tYXBfb3V0X2RhdGFfYnVmZmVyKi8gICA0LAorICAgIC8qY19vZmZsb2FkX2hvc3RfdW5tYXBfb3V0X2RhdGFfYnVmZmVyKi8gNCwKKyAgICAvKmNfb2ZmbG9hZF9ob3N0X3dhaXRfYnVmZmVyc19yZWFkcyovICAgIDIsCisgICAgLypjX29mZmxvYWRfaG9zdF9kZXN0cm95X2J1ZmZlcnMqLyAgICAgICAyCit9OworCitjb25zdCBzdGF0aWMgaW50IHRhcmdldF90aW1lcl9wcmVmaXhfc3BhY2VzW10gPSB7CisvKmNfb2ZmbG9hZF90YXJnZXRfdG90YWxfdGltZSovICAgICAgICAgIDAsCisvKmNfb2ZmbG9hZF90YXJnZXRfZGVzY3JpcHRvcl9zZXR1cCovICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY19sb29rdXAqLyAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfZnVuY190aW1lKi8gICAgICAgICAgIDIsCisvKmNfb2ZmbG9hZF90YXJnZXRfc2NhdHRlcl9pbnB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfYWRkX2J1ZmZlcl9yZWZzKi8gICAgIDYsCisvKmNfb2ZmbG9hZF90YXJnZXRfY29tcHV0ZSovICAgICAgICAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfZ2F0aGVyX291dHB1dHMqLyAgICAgIDQsCisvKmNfb2ZmbG9hZF90YXJnZXRfcmVsZWFzZV9idWZmZXJfcmVmcyovIDYKK307CisKK3N0YXRpYyBPZmZsb2FkSG9zdFRpbWVyRGF0YSogdGltZXJfZGF0YV9oZWFkOworc3RhdGljIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhX3RhaWw7CitzdGF0aWMgbXV0ZXhfdCAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfbXV0ZXg7CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaG9zdF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CitzdGF0aWMgdm9pZCBvZmZsb2FkX3RhcmdldF9waGFzZV9uYW1lKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywgaW50IHBfbm9kZSk7CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfVGltZXJfUHJpbnQodm9pZCkKK3sKKyAgICBzdGQ6OnN0cmluZyAgICAgICBidWY7CisgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgY29uc3QgY2hhciAqc3RhcnMgPQorICAgICAgICAiKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioiOworCisgICAgc3MgPDwgIlxuXG4iIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgc3MgPDwgIiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RpdGxlKSA8PCAiXG4iOworICAgIHNzIDw8IHN0YXJzIDw8ICJcbiI7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgc3MgPDwgIiAgICAgICI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZnJvbV9maWxlKSA8PCAiICI8PCBwbm9kZS0+ZmlsZTsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKSA8PCAiICIgPDwgcG5vZGUtPmxpbmU7CisgICAgICAgIHNzIDw8ICJcbiI7CisgICAgICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX2hvc3RfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBzcyA8PCAiICAgICAgICAgICI7CisgICAgICAgICAgICBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgKGRvdWJsZSlwbm9kZS0+cGhhc2VzW2ldLnRvdGFsIC8gZnJlcXVlbmN5IDw8ICJcbiI7CisgICAgICAgIH0KKworICAgICAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlIDsgaSsrKSB7CisgICAgICAgICAgICBkb3VibGUgdGltZSA9IDA7CisgICAgICAgICAgICBpZiAocG5vZGUtPnRhcmdldC5mcmVxdWVuY3kgIT0gMCkgeworICAgICAgICAgICAgICAgIHRpbWUgPSAoZG91YmxlKSBwbm9kZS0+dGFyZ2V0LnBoYXNlc1tpXS50b3RhbCAvCisgICAgICAgICAgICAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgICAgICAgICAgfQorICAgICAgICAgICAgc3MgPDwgIiAgICAgICAgICAiOworICAgICAgICAgICAgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzcywgaSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDUpOworICAgICAgICAgICAgc3MgPDwgdGltZSA8PCAiXG4iOworICAgICAgICB9CisgICAgfQorCisgICAgYnVmID0gc3Muc3RyKCk7CisgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgIGZmbHVzaChzdGRvdXQpOworfQorCitleHRlcm4gdm9pZCBPZmZsb2FkX1JlcG9ydF9Qcm9sb2coT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlKQoreworICAgIGRvdWJsZSBmcmVxdWVuY3kgPSBjcHVfZnJlcXVlbmN5OworICAgIHN0ZDo6c3RyaW5nICAgICAgIGJ1ZjsKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBzczsKKworICAgIGlmIChwbm9kZSkgeworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbRmlsZV0gICAgICAgICAgZmlsZS5jCisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgICAgICBzcyA8PCBwbm9kZS0+Y2FyZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfZmlsZSk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAiIDw8IHBub2RlLT5maWxlIDw8ICJcbiI7CisKKyAgICAgICAgLy8gW09mZmxvYWRdIFtNaWMgMF0gW0xpbmVdICAgICAgICAgIDEyMzQKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKSA8PCAiICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9saW5lKTsKKyAgICAgICAgc3MgPDwgIl0gICAgICAgICAgICAgICAgICAgICIgPDwgcG5vZGUtPmxpbmUgPDwgIlxuIjsKKworICAgICAgICAvLyBbT2ZmbG9hZF0gW01pYyAwXSBbVGFnXSAgICAgICAgICBUYWcgMQorICAgICAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWMpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPmNhcmRfbnVtYmVyIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICJdICAgICAgICAgICAgICAgICAgICAgIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIlxuIjsKKworICAgICAgICBidWYgPSBzcy5zdHIoKTsKKyAgICAgICAgZnByaW50ZihzdGRvdXQsIGJ1Zi5kYXRhKCkpOworICAgICAgICBmZmx1c2goc3Rkb3V0KTsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkIE9mZmxvYWRfUmVwb3J0X0VwaWxvZyhPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEpCit7CisgICAgZG91YmxlIGZyZXF1ZW5jeSA9IGNwdV9mcmVxdWVuY3k7CisgICAgc3RkOjpzdHJpbmcgICAgICAgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworCisgICAgT2ZmbG9hZEhvc3RUaW1lckRhdGEgKnBub2RlID0gdGltZXJfZGF0YTsKKworICAgIGlmICghcG5vZGUpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2hvc3QpIDw8ICJdICBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3RhZykgPDwgICIgIjsKKyAgICBzcyA8PCBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jcHVfdGltZSkgPDwgIl0gICAgICAgICI7CisgICAgc3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbig2KTsKKyAgICBzcyA8PCAoZG91YmxlKSBwbm9kZS0+cGhhc2VzWzBdLnRvdGFsIC8gZnJlcXVlbmN5OworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2Vjb25kcykgPDwgIlxuIjsKKworICAgIGlmIChvZmZsb2FkX3JlcG9ydF9sZXZlbCA+PSBPRkZMT0FEX1JFUE9SVF8yKSB7CisgICAgICAgIHNzIDw8ICJbIiA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X29mZmxvYWQpIDw8ICJdIFsiOworICAgICAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYyk7CisgICAgICAgIHNzIDw8ICIgIiA8PCBwbm9kZS0+Y2FyZF9udW1iZXI7CisgICAgICAgIHNzIDw8ICJdIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAiICI7CisgICAgICAgIHNzIDw8ICBwbm9kZS0+b2ZmbG9hZF9udW1iZXIgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3B1X3RvX21pY19kYXRhKSA8PCAiXSAgICI7CisgICAgICAgIHNzIDw8IHBub2RlLT5zZW50X2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisKKyAgICBkb3VibGUgdGltZSA9IDA7CisgICAgaWYgKHBub2RlLT50YXJnZXQuZnJlcXVlbmN5ICE9IDApIHsKKyAgICAgICAgdGltZSA9IChkb3VibGUpIHBub2RlLT50YXJnZXQucGhhc2VzWzBdLnRvdGFsIC8KKyAgICAgICAgICAgIChkb3VibGUpIHBub2RlLT50YXJnZXQuZnJlcXVlbmN5OworICAgIH0KKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pYykgPDwgIiAiOworICAgIHNzIDw8IHBub2RlLT5jYXJkX251bWJlcjw8ICJdIFsiOworICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKSA8PCAgIiAiOworICAgIHNzIDw8IHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICBzcyA8PCByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X21pY190aW1lKSA8PCAiXSAgICAgICAgIjsKKyAgICBzcyA8PCBzdGQ6OmZpeGVkIDw8IHN0ZDo6c2V0cHJlY2lzaW9uKDYpIDw8IHRpbWU7CisgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZWNvbmRzKSA8PCAiXG4iOworCisgICAgaWYgKG9mZmxvYWRfcmVwb3J0X2xldmVsID49IE9GRkxPQURfUkVQT1JUXzIpIHsKKyAgICAgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0gWyI7CisgICAgICAgIHNzIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IHBub2RlLT5jYXJkX251bWJlcjsKKyAgICAgICAgc3MgPDwgIl0gWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgIHBub2RlLT5vZmZsb2FkX251bWJlciA8PCAiXSBbIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfdG9fY3B1X2RhdGEpIDw8ICJdICAgIjsKKyAgICAgICAgc3MgPDwgcG5vZGUtPnJlY2VpdmVkX2J5dGVzIDw8ICIgIjsKKyAgICAgICAgc3MgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9ieXRlcykgPDwgIlxuIjsKKyAgICB9CisgICAgc3MgPDwgIlxuIjsKKworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIG9mZmxvYWRfcmVwb3J0X2ZyZWVfZGF0YSh0aW1lcl9kYXRhKTsKK30KKworZXh0ZXJuIHZvaWQgb2ZmbG9hZF9yZXBvcnRfZnJlZV9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSkKK3sKKyAgICBPZmZsb2FkSG9zdFRpbWVyRGF0YSAqcG5vZGVfbGFzdCA9IE5VTEw7CisKKyAgICBmb3IgKE9mZmxvYWRIb3N0VGltZXJEYXRhICpwbm9kZSA9IHRpbWVyX2RhdGFfaGVhZDsKKyAgICAgICAgIHBub2RlICE9IDA7IHBub2RlID0gcG5vZGUtPm5leHQpIHsKKyAgICAgICAgaWYgKHRpbWVyX2RhdGEgPT0gcG5vZGUpIHsKKyAgICAgICAgICAgIGlmIChwbm9kZV9sYXN0KSB7CisgICAgICAgICAgICAgICAgcG5vZGVfbGFzdC0+bmV4dCA9IHBub2RlLT5uZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdGltZXJfZGF0YV9oZWFkID0gcG5vZGUtPm5leHQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBPRkZMT0FEX0ZSRUUocG5vZGUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgcG5vZGVfbGFzdCA9IHBub2RlOworICAgIH0KK30KKworc3RhdGljIHZvaWQgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLCBpbnQgbnVtKQoreworICAgIGZvciAoOyBudW0gPiAwOyBudW0tLSkgeworICAgICAgICBzcyA8PCAiICI7CisgICAgfQorfQorCitzdGF0aWMgdm9pZCBvZmZsb2FkX2hvc3RfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNvbnN0IGludCBtZXNzYWdlX2xlbmd0aCA9IDQwOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfaG9zdF9zdGFnZV9zdHIocF9ub2RlKTsKKyAgICBwcmVmaXhfc3BhY2VzID0gaG9zdF90aW1lcl9wcmVmaXhfc3BhY2VzW3Bfbm9kZV07CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHByZWZpeF9zcGFjZXMpOworICAgIHN0cl9sZW5ndGggPSBzdHJsZW4oc3RyKTsKKyAgICBzcyA8PCBzdHI7CisgICAgdGFpbF9sZW5ndGggPSBtZXNzYWdlX2xlbmd0aCAtIHByZWZpeF9zcGFjZXMgLSBzdHJfbGVuZ3RoOworICAgIHRhaWxfbGVuZ3RoID0gdGFpbF9sZW5ndGggPiAwPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKworc3RhdGljIHZvaWQgb2ZmbG9hZF90YXJnZXRfcGhhc2VfbmFtZShzdGQ6OnN0cmluZ3N0cmVhbSAmc3MsIGludCBwX25vZGUpCit7CisgICAgaW50IHByZWZpeF9zcGFjZXM7CisgICAgaW50IHN0cl9sZW5ndGg7CisgICAgY29uc3QgaW50IG1lc3NhZ2VfbGVuZ3RoID0gNDA7CisgICAgaW50IHRhaWxfbGVuZ3RoOworICAgIGNoYXIgY29uc3QgKnN0cjsKKworICAgIHN0ciA9IHJlcG9ydF9nZXRfdGFyZ2V0X3N0YWdlX3N0cihwX25vZGUpOworICAgIHByZWZpeF9zcGFjZXMgPSB0YXJnZXRfdGltZXJfcHJlZml4X3NwYWNlc1twX25vZGVdOworICAgIGZpbGxfYnVmX3dpdGhfc3BhY2VzKHNzLCBwcmVmaXhfc3BhY2VzKTsKKyAgICBzdHJfbGVuZ3RoID0gc3RybGVuKHN0cik7CisgICAgc3MgPDwgc3RyOworICAgIHRhaWxfbGVuZ3RoID0gbWVzc2FnZV9sZW5ndGggLSBwcmVmaXhfc3BhY2VzIC0gc3RyX2xlbmd0aDsKKyAgICB0YWlsX2xlbmd0aCA9ICh0YWlsX2xlbmd0aCA+IDApPyB0YWlsX2xlbmd0aCA6IDE7CisgICAgZmlsbF9idWZfd2l0aF9zcGFjZXMoc3MsIHRhaWxfbGVuZ3RoKTsKK30KKwordm9pZCBvZmZsb2FkX3RpbWVyX3N0YXJ0KE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcChPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICBPZmZsb2FkSG9zdFBoYXNlIHBfdHlwZSkKK3sKKyAgICB0aW1lcl9kYXRhLT5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGltZXJfZGF0YS0+cGhhc2VzW3BfdHlwZV0uc3RhcnQ7Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX3RhcmdldF9kYXRhKE9mZmxvYWRIb3N0VGltZXJEYXRhICogdGltZXJfZGF0YSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKmJ1ZikKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEtPnRhcmdldC5mcmVxdWVuY3kgPSAqZGF0YSsrOworICAgIGZvciAoaW50IGkgPSAwOyBpIDwgY19vZmZsb2FkX3RhcmdldF9tYXhfcGhhc2U7IGkrKykgeworICAgICAgICB0aW1lcl9kYXRhLT50YXJnZXQucGhhc2VzW2ldLnRvdGFsID0gKmRhdGErKzsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3Rfc2RhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCBzZW50X2J5dGVzKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPnNlbnRfYnl0ZXMgKz0gc2VudF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfcmRhdGEoT2ZmbG9hZEhvc3RUaW1lckRhdGEgKiB0aW1lcl9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB1aW50NjRfdCByZWNlaXZlZF9ieXRlcykKK3sKKyAgICBpZiAodGltZXJfZGF0YSkgeworICAgICAgICB0aW1lcl9kYXRhLT5yZWNlaXZlZF9ieXRlcyArPSByZWNlaXZlZF9ieXRlczsKKyAgICB9Cit9CisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9maWxsX2hvc3RfbWljX251bShPZmZsb2FkSG9zdFRpbWVyRGF0YSAqIHRpbWVyX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNhcmRfbnVtYmVyKQoreworICAgIGlmICh0aW1lcl9kYXRhKSB7CisgICAgICAgIHRpbWVyX2RhdGEtPmNhcmRfbnVtYmVyID0gY2FyZF9udW1iZXI7CisgICAgfQorfQorCitPZmZsb2FkSG9zdFRpbWVyRGF0YSogb2ZmbG9hZF90aW1lcl9pbml0KGNvbnN0IGNoYXIgKmZpbGUsIGludCBsaW5lKQoreworICAgIHN0YXRpYyBib29sIGZpcnN0X3RpbWUgPSB0cnVlOworICAgIE9mZmxvYWRIb3N0VGltZXJEYXRhKiB0aW1lcl9kYXRhID0gTlVMTDsKKworICAgIHRpbWVyX2RhdGFfbXV0ZXgubG9jaygpOworICAgIHsKKyAgICAgICAgaWYgKHRpbWVyX2VuYWJsZWQgfHwKKyAgICAgICAgICAgIChvZmZsb2FkX3JlcG9ydF9sZXZlbCAmJiBvZmZsb2FkX3JlcG9ydF9lbmFibGVkKSkgeworICAgICAgICAgICAgdGltZXJfZGF0YSA9IChPZmZsb2FkSG9zdFRpbWVyRGF0YSopCisgICAgICAgICAgICAgICAgT0ZGTE9BRF9NQUxMT0Moc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSwgMCk7CisgICAgICAgICAgICBtZW1zZXQodGltZXJfZGF0YSwgMCwgc2l6ZW9mKE9mZmxvYWRIb3N0VGltZXJEYXRhKSk7CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPm9mZmxvYWRfbnVtYmVyID0gT0ZGTE9BRF9ERUJVR19JTkNSX09GTERfTlVNKCkgLSAxOworCisgICAgICAgICAgICBpZiAodGltZXJfZGF0YV9oZWFkID09IDApIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX2hlYWQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICB0aW1lcl9kYXRhX3RhaWwtPm5leHQgPSB0aW1lcl9kYXRhOworICAgICAgICAgICAgICAgIHRpbWVyX2RhdGFfdGFpbCA9IHRpbWVyX2RhdGE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRpbWVyX2RhdGEtPmZpbGUgPSBmaWxlOworICAgICAgICAgICAgdGltZXJfZGF0YS0+bGluZSA9IGxpbmU7CisgICAgICAgIH0KKyAgICB9CisgICAgdGltZXJfZGF0YV9tdXRleC51bmxvY2soKTsKKyAgICByZXR1cm4gdGltZXJfZGF0YTsKK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90aW1lcl90YXJnZXQuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zMGE0YzkxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdGltZXJfdGFyZ2V0LmNwcApAQCAtMCwwICsxLDY3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3RpbWVyLmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKworI2lmZGVmIF9fSU5URUxfQ09NUElMRVIKKyNpbmNsdWRlIDxpYTMyaW50cmluLmg+CisjZWxzZSAvLyBfX0lOVEVMX0NPTVBJTEVSCisjaW5jbHVkZSA8eDg2aW50cmluLmg+CisjZW5kaWYgLy8gX19JTlRFTF9DT01QSUxFUgorCisKKworaW50IHRpbWVyX2VuYWJsZWQgPSAwOworCisjaWZkZWYgVElNSU5HX1NVUFBPUlQKKworI2lmIGRlZmluZWQoTElOVVgpIHx8IGRlZmluZWQoRlJFRUJTRCkKK3N0YXRpYyBfX3RocmVhZCBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZWxzZSAvLyBXSU5OVAorc3RhdGljIF9fZGVjbHNwZWModGhyZWFkKSBPZmZsb2FkVGFyZ2V0VGltZXJEYXRhIHRpbWVyX2RhdGE7CisjZW5kaWYgLy8gZGVmaW5lZChMSU5VWCkgfHwgZGVmaW5lZChGUkVFQlNEKQorCisKK3ZvaWQgb2ZmbG9hZF90aW1lcl9zdGFydCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS5zdGFydCA9IF9yZHRzYygpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfc3RvcCgKKyAgICBPZmZsb2FkVGFyZ2V0UGhhc2UgcF90eXBlCispCit7CisgICAgdGltZXJfZGF0YS5waGFzZXNbcF90eXBlXS50b3RhbCArPSBfcmR0c2MoKSAtCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aW1lcl9kYXRhLnBoYXNlc1twX3R5cGVdLnN0YXJ0OworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfaW5pdCgpCit7CisgICAgbWVtc2V0KCZ0aW1lcl9kYXRhLCAwLCBzaXplb2YoT2ZmbG9hZFRhcmdldFRpbWVyRGF0YSkpOworfQorCit2b2lkIG9mZmxvYWRfdGltZXJfZmlsbF90YXJnZXRfZGF0YSgKKyAgICB2b2lkICpidWYKKykKK3sKKyAgICB1aW50NjRfdCAqZGF0YSA9ICh1aW50NjRfdCopIGJ1ZjsKKworICAgIHRpbWVyX2RhdGEuZnJlcXVlbmN5ID0gbWljX2ZyZXF1ZW5jeTsKKyAgICBtZW1jcHkoZGF0YSsrLCAmKHRpbWVyX2RhdGEuZnJlcXVlbmN5KSwgc2l6ZW9mKHVpbnQ2NF90KSk7CisKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IGNfb2ZmbG9hZF90YXJnZXRfbWF4X3BoYXNlOyBpKyspIHsKKyAgICAgICAgbWVtY3B5KGRhdGErKywgJih0aW1lcl9kYXRhLnBoYXNlc1tpXS50b3RhbCksIHNpemVvZih1aW50NjRfdCkpOworICAgIH0KK30KKworI2VuZGlmIC8vIFRJTUlOR19TVVBQT1JUCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGEwNjIwNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3RyYWNlLmNwcApAQCAtMCwwICsxLDMwOSBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib2ZmbG9hZF90cmFjZS5oIgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlICJsaWJvZmZsb2FkX2Vycm9yX2NvZGVzLmgiCisKK2V4dGVybiBjb25zdCBjaGFyICpwcmVmaXg7CisKKyNpZiAhSE9TVF9MSUJSQVJZCitleHRlcm4gaW50IG1pY19pbmRleDsKKyNlbmRpZgorCisvLyBUaGUgZGVidWcgcm91dGluZXMKKworc3RhdGljIGNvbnN0IGNoYXIgKiBvZmZsb2FkX3N0YWdlKHN0ZDo6c3RyaW5nc3RyZWFtICZzcywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb2ZmbG9hZF9udW1iZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGFnLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRleHQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYm9vbCBwcmludF90YWcpCit7CisgICAgc3MgPDwgIlsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfb2ZmbG9hZCkgPDwgIl0iOworI2lmIEhPU1RfTElCUkFSWQorICAgIHNzIDw8ICIgWyIgPDwgcHJlZml4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICAgICAgc3MgPDwgIiAiIDw8IG9mZmxvYWRfbnVtYmVyIDw8ICJdIjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHNzIDw8ICIgICAgICAgICAiOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2Vsc2UKKyAgICBzcyA8PCAiIFsiIDw8IHByZWZpeCA8PCAiICIgPDwgbWljX2luZGV4IDw8ICJdIjsKKyAgICBpZiAocHJpbnRfdGFnKSB7CisgICAgICAgIHNzIDw8ICIgWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF90YWcpOworICAgICAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIH0KKyAgICBzcyA8PCAiIFsiIDw8IHRhZyA8PCAiXSI7CisgICAgc3MgPDwgIiAgICAgICAgICAgIiA8PCB0ZXh0OworI2VuZGlmCisgICAgcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBjb25zdCBjaGFyICogb2ZmbG9hZF9zaWduYWwoc3RkOjpzdHJpbmdzdHJlYW0gJnNzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvZmZsb2FkX251bWJlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICp0YWcsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqdGV4dCkKK3sKKyAgICBzcyA8PCAiWyIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9vZmZsb2FkKSA8PCAiXSI7CisgICAgc3MgPDwgIiBbIiA8PCBwcmVmaXggPDwgIl0iOworICAgIHNzIDw8ICIgIFsiIDw8IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdGFnKTsKKyAgICBzcyA8PCAiICIgPDwgb2ZmbG9hZF9udW1iZXIgPDwgIl0iOworICAgIHNzIDw8ICIgWyIgPDwgdGFnIDw8ICJdIjsKKyAgICBzcyA8PCAiICAgICAgICAgICIgPDwgdGV4dDsKKyAgICByZXR1cm4gMDsKK30KKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pCit7CisgICAgc3RkOjpzdHJpbmcgYnVmOworICAgIHN0ZDo6c3RyaW5nc3RyZWFtIHNzOworICAgIGNoYXIgY29uc3QgKnN0cjE7CisgICAgY2hhciBjb25zdCAqc3RyMjsKKyAgICB2YV9saXN0IHZhX2FyZ3M7CisgICAgdmFfc3RhcnQodmFfYXJncywgb2ZmbG9hZF9udW1iZXIpOworICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisKKyAgICBzd2l0Y2ggKHN0YWdlKSB7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3N0YXJ0OgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhcnQpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9sb2dpY2FsX2NhcmQpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgIiA9ICIgPDwgcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9waHlzaWNhbF9jYXJkKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWdpc3RlcjoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9pbml0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9pbml0X2Z1bmMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogIiA8PCB2YV9hcmcodmFfYXJncywgY2hhciopOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfaG9zdDoKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NyZWF0ZV9idWZfaG9zdCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiBiYXNlPTB4IiA8PCBzdGQ6OmhleCA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgc3MgPDwgIiBsZW5ndGg9IiA8PCBzdGQ6OmRlYyA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY3JlYXRlX2J1Zl9taWMpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIjogc2l6ZT0iIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBzcyA8PCAiIG9mZnNldD0iIDw8IHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgaWYgKHZhX2FyZyh2YV9hcmdzLGludCkpCisgICAgICAgICAgICAgICBzcyA8PCAiICgyTSBwYWdlKSI7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VuZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW5kX3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zZW50X3BvaW50ZXJfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHVpbnQ2NF90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9nYXRoZXJfY29weWluX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9nYXRoZXJfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfY29weWluX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCkgPDwgIiAiOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvbXB1dGU6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9jb21wdXRlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlX3BvaW50ZXJfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3JlY2VpdmVfcG9pbnRlcl9kYXRhKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCB0cnVlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGE6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9yZWNlaXZlZF9wb2ludGVyX2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfc3RhcnRfdGFyZ2V0X2Z1bmM6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGFydF90YXJnZXRfZnVuYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiOiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfdmFyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfdmFyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCAiICAiLCB0cnVlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBpbnQpOworICAgICAgICAgICAgc3MgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9zY2F0dGVyX2NvcHlpbl9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5aW5fZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZ2F0aGVyX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2dhdGhlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc2NhdHRlcl9jb3B5b3V0X2RhdGEpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX2NvcHlvdXRfZGF0YToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2NvcHlvdXRfZGF0YSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgdHJ1ZSk7CisgICAgICAgICAgICBzcyA8PCAiICAgIiA8PCB2YV9hcmcodmFfYXJncywgdWludDY0X3QpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3NpZ25hbDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB1aW50NjRfdCAgKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3NpZ25hbCk7CisgICAgICAgICAgICAgICAgb2ZmbG9hZF9zaWduYWwoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyKTsKKwkgICAgICAgIHNpZ25hbCA9IHZhX2FyZyh2YV9hcmdzLCB1aW50NjRfdCopOworCSAgICAgICAgaWYgKHNpZ25hbCkKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIDB4IiA8PCBzdGQ6OmhleCA8PCAqc2lnbmFsOworICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3dhaXQ6CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50IGNvdW50OworICAgICAgICAgICAgICAgIHVpbnQ2NF90ICAqKnNpZ25hbDsKKyAgICAgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZV9zaWduYWwpOworICAgICAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3dhaXQpOworICAgICAgICAgICAgICAgIG9mZmxvYWRfc2lnbmFsKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMik7CisgICAgICAgICAgICAgICAgY291bnQgPSB2YV9hcmcodmFfYXJncywgaW50KTsKKyAgICAgICAgICAgICAgICBzaWduYWwgPSB2YV9hcmcodmFfYXJncywgdWludDY0X3QqKik7CisgICAgICAgICAgICAgICAgaWYgKGNvdW50KSB7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChjb3VudCkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHN0ZDo6aGV4IDw8IHNpZ25hbFtjb3VudC0xXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvdW50LS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgICAgICBzcyA8PCAiIG5vbmUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX3VucmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF91bnJlZ2lzdGVyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfZGVzdHJveToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X2Rlc3Ryb3kpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIHRydWUpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2luaXQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9pbml0KTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvcmVnaXN0ZXI6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9yZWdpc3Rlcik7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY19vZmZsb2FkX215b2Zpbmk6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9maW5pKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19zaGFyZWQ6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9taWNfbXlvX3NoYXJlZCk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgc3MgPDwgIiAiIDw8IHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbWljX215b19mcHRyOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbWljX215b19mcHRyKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRtYWxsb2M6CisgICAgICAgICAgICBzdHIxID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9zdGF0ZSk7CisgICAgICAgICAgICBzdHIyID0gcmVwb3J0X2dldF9tZXNzYWdlX3N0cihjX3JlcG9ydF9teW9zaGFyZWRtYWxsb2MpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIHZhX2FyZyh2YV9hcmdzLCBjaGFyKik7CisgICAgICAgICAgICBzcyA8PCAiICIgPDwgdmFfYXJnKHZhX2FyZ3MsIHNpemVfdCk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvc2hhcmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGZyZWUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvc2hhcmVkYWxpZ25lZG1hbGxvYyk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgdmFfYXJnKHZhX2FyZ3MsIGNoYXIqKTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIHNzIDw8ICIgIiA8PCB2YV9hcmcodmFfYXJncywgc2l6ZV90KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b3NoYXJlZGFsaWduZWRmcmVlKTsKKyAgICAgICAgICAgIG9mZmxvYWRfc3RhZ2Uoc3MsIG9mZmxvYWRfbnVtYmVyLCBzdHIxLCBzdHIyLCBmYWxzZSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjX29mZmxvYWRfbXlvYWNxdWlyZToKKyAgICAgICAgICAgIHN0cjEgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X3N0YXRlKTsKKyAgICAgICAgICAgIHN0cjIgPSByZXBvcnRfZ2V0X21lc3NhZ2Vfc3RyKGNfcmVwb3J0X215b2FjcXVpcmUpOworICAgICAgICAgICAgb2ZmbG9hZF9zdGFnZShzcywgb2ZmbG9hZF9udW1iZXIsIHN0cjEsIHN0cjIsIGZhbHNlKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNfb2ZmbG9hZF9teW9yZWxlYXNlOgorICAgICAgICAgICAgc3RyMSA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfc3RhdGUpOworICAgICAgICAgICAgc3RyMiA9IHJlcG9ydF9nZXRfbWVzc2FnZV9zdHIoY19yZXBvcnRfbXlvcmVsZWFzZSk7CisgICAgICAgICAgICBvZmZsb2FkX3N0YWdlKHNzLCBvZmZsb2FkX251bWJlciwgc3RyMSwgc3RyMiwgZmFsc2UpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBMSUJPRkZMT0FEX0VSUk9SKGNfcmVwb3J0X3Vua25vd25fdHJhY2Vfbm9kZSk7CisgICAgICAgICAgICBhYm9ydCgpOworICAgIH0KKyAgICBzcyA8PCAiXG4iOworICAgIGJ1ZiA9IHNzLnN0cigpOworICAgIGZwcmludGYoc3Rkb3V0LCBidWYuZGF0YSgpKTsKKyAgICBmZmx1c2goc3Rkb3V0KTsKKworICAgIHZhX2VuZCh2YV9hcmdzKTsKKyAgICByZXR1cm47Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF90cmFjZS5oIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWMyOGE0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdHJhY2UuaApAQCAtMCwwICsxLDUyIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8vIFRoZSBwYXJ0cyBvZiB0aGUgb2ZmbG9hZCBsaWJyYXJ5IGNvbW1vbiB0byBob3N0IGFuZCB0YXJnZXQKKwordm9pZCBvZmZsb2FkX3N0YWdlX3ByaW50KGludCBzdGFnZSwgaW50IG9mZmxvYWRfbnVtYmVyLCAuLi4pOworCitlbnVtIE9mZmxvYWRUcmFjZVN0YWdlIHsKKyAgICAvLyBUb3RhbCB0aW1lIHNwZW50IG9uIHRoZSB0YXJnZXQKKyAgICBjX29mZmxvYWRfc3RhcnQgPSAwLAorICAgIGNfb2ZmbG9hZF9pbml0LAorICAgIGNfb2ZmbG9hZF9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfaW5pdF9mdW5jLAorICAgIGNfb2ZmbG9hZF9jcmVhdGVfYnVmX2hvc3QsCisgICAgY19vZmZsb2FkX2NyZWF0ZV9idWZfbWljLAorICAgIGNfb2ZmbG9hZF9zZW5kX3BvaW50ZXJfZGF0YSwKKyAgICBjX29mZmxvYWRfc2VudF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5aW5fZGF0YSwKKyAgICBjX29mZmxvYWRfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2NvbXB1dGUsCisgICAgY19vZmZsb2FkX3JlY2VpdmVfcG9pbnRlcl9kYXRhLAorICAgIGNfb2ZmbG9hZF9yZWNlaXZlZF9wb2ludGVyX2RhdGEsCisgICAgY19vZmZsb2FkX3N0YXJ0X3RhcmdldF9mdW5jLAorICAgIGNfb2ZmbG9hZF92YXIsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weWluX2RhdGEsCisgICAgY19vZmZsb2FkX2dhdGhlcl9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NjYXR0ZXJfY29weW91dF9kYXRhLAorICAgIGNfb2ZmbG9hZF9jb3B5b3V0X2RhdGEsCisgICAgY19vZmZsb2FkX3NpZ25hbCwKKyAgICBjX29mZmxvYWRfd2FpdCwKKyAgICBjX29mZmxvYWRfdW5yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfZGVzdHJveSwKKyAgICBjX29mZmxvYWRfZmluaXNoLAorICAgIGNfb2ZmbG9hZF9teW9pbml0LAorICAgIGNfb2ZmbG9hZF9teW9yZWdpc3RlciwKKyAgICBjX29mZmxvYWRfbWljX215b19zaGFyZWQsCisgICAgY19vZmZsb2FkX21pY19teW9fZnB0ciwKKyAgICBjX29mZmxvYWRfbXlvc2hhcmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRmcmVlLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkbWFsbG9jLAorICAgIGNfb2ZmbG9hZF9teW9zaGFyZWRhbGlnbmVkZnJlZSwKKyAgICBjX29mZmxvYWRfbXlvYWNxdWlyZSwKKyAgICBjX29mZmxvYWRfbXlvcmVsZWFzZSwKKyAgICBjX29mZmxvYWRfbXlvZmluaQorfTsKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwIGIvcmMzL29mZmxvYWQvc3JjL29mZmxvYWRfdXRpbC5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjg0NjJjOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuY3BwCkBAIC0wLDAgKzEsMjA2IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJvZmZsb2FkX3V0aWwuaCIKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgImxpYm9mZmxvYWRfZXJyb3JfY29kZXMuaCIKKworI2lmZGVmIFRBUkdFVF9XSU5OVAordm9pZCAqdGhyZWFkX2dldHNwZWNpZmljKHB0aHJlYWRfa2V5X3Qga2V5KQoreworICAgIGlmIChrZXkgPT0gMCkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBUbHNHZXRWYWx1ZShrZXkpOworICAgIH0KK30KKworaW50IHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpCit7CisgICAgcmV0dXJuIChUbHNTZXRWYWx1ZShrZXksIChMUFZPSUQpdmFsdWUpKSA/IDAgOiBHZXRMYXN0RXJyb3IoKTsKK30KKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworYm9vbCBfX29mZmxvYWRfcGFyc2Vfc2l6ZV9zdHJpbmcoY29uc3QgY2hhciAqc3RyLCB1aW50NjRfdCAmbmV3X3NpemUpCit7CisgICAgdWludDY0X3QgdmFsOworICAgIGNoYXIgKnN1ZmZpeDsKKworICAgIGVycm5vID0gMDsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICB2YWwgPSBzdHJ0b3VsKHN0ciwgJnN1ZmZpeCwgMTApOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgdmFsID0gc3RydG91bGwoc3RyLCAmc3VmZml4LCAxMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKGVycm5vICE9IDAgfHwgc3VmZml4ID09IHN0cikgeworICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgfQorCisgICAgaWYgKHN1ZmZpeFswXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIGRlZmF1bHQgaXMgS2lsb2J5dGVzCisgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIGVsc2UgaWYgKHN1ZmZpeFsxXSA9PSAnXDAnKSB7CisgICAgICAgIC8vIE9wdGlvbmFsIHN1ZmZpeGVzOiBCIChieXRlcyksIEsgKEtpbG9ieXRlcyksIE0gKE1lZ2FieXRlcyksCisgICAgICAgIC8vIEcgKEdpZ2FieXRlcyksIG9yIFQgKFRlcmFieXRlcykgc3BlY2lmeSB0aGUgdW5pdHMuCisgICAgICAgIHN3aXRjaCAoc3VmZml4WzBdKSB7CisgICAgICAgICAgICBjYXNlICdiJzoKKyAgICAgICAgICAgIGNhc2UgJ0InOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdrJzoKKyAgICAgICAgICAgIGNhc2UgJ0snOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgY2FzZSAnbSc6CisgICAgICAgICAgICBjYXNlICdNJzoKKyAgICAgICAgICAgICAgICBuZXdfc2l6ZSA9IHZhbCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICdnJzoKKyAgICAgICAgICAgIGNhc2UgJ0cnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0OworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlICd0JzoKKyAgICAgICAgICAgIGNhc2UgJ1QnOgorICAgICAgICAgICAgICAgIG5ld19zaXplID0gdmFsICogMTAyNCAqIDEwMjQgKiAxMDI0ICogMTAyNDsKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICByZXR1cm4gZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorCisgICAgcmV0dXJuIGZhbHNlOworfQorCitib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpCit7CisgICAgaW50NjRfdCB2YWw7CisgICAgY2hhciAqc3VmZml4OworCisgICAgZXJybm8gPSAwOworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgIHZhbCA9IHN0cnRvbChzdHIsICZzdWZmaXgsIDApOworI2Vsc2UKKyAgICB2YWwgPSBzdHJ0b2xsKHN0ciwgJnN1ZmZpeCwgMCk7CisjZW5kaWYKKyAgICBpZiAoZXJybm8gPT0gMCAmJiBzdWZmaXggIT0gc3RyICYmICpzdWZmaXggPT0gJ1wwJykgeworICAgICAgICB2YWx1ZSA9IHZhbDsKKyAgICAgICAgcmV0dXJuIHRydWU7CisgICAgfQorICAgIHJldHVybiBmYWxzZTsKK30KKworI2lmZGVmIFRBUkdFVF9XSU5OVAorZXh0ZXJuIHZvaWQqIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCkKK3sKKyAgICB2b2lkICpoYW5kbGU7CisgICAgaW50IGVycm9yX21vZGU7CisKKyAgICAvKgorICAgICAqIGRvIG5vdCBkaXNwbGF5IG1lc3NhZ2UgYm94IHdpdGggZXJyb3IgaWYgaXQgdGhlIGNhbGwgYmVsb3cgZmFpbHMgdG8KKyAgICAgKiBsb2FkIGR5bmFtaWMgbGlicmFyeS4KKyAgICAgKi8KKyAgICBlcnJvcl9tb2RlID0gU2V0RXJyb3JNb2RlKFNFTV9GQUlMQ1JJVElDQUxFUlJPUlMgfCBTRU1fTk9PUEVORklMRUVSUk9SQk9YKTsKKworICAgIC8qIGxvYWQgZHluYW1pYyBsaWJyYXJ5ICovCisgICAgaGFuZGxlID0gKHZvaWQqKSBMb2FkTGlicmFyeShwYXRoKTsKKworICAgIC8qIHJlc3RvcmUgZXJyb3IgbW9kZSAqLworICAgIFNldEVycm9yTW9kZShlcnJvcl9tb2RlKTsKKworICAgIHJldHVybiBoYW5kbGU7Cit9CisKK2V4dGVybiBpbnQgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICpkbF9pbmZvKQoreworICAgIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBtZW1faW5mbzsKKyAgICBjaGFyIG1vZF9uYW1lW01BWF9QQVRIXTsKKyAgICBITU9EVUxFIG1vZF9oYW5kbGU7CisKKyAgICAvKiBGaWxsIE1FTU9SWV9CQVNJQ19JTkZPUk1BVElPTiBzdHJ1Y3QgKi8KKyAgICBpZiAoIVZpcnR1YWxRdWVyeShhZGRyLCAmbWVtX2luZm8sIHNpemVvZihtZW1faW5mbykpKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBtb2RfaGFuZGxlID0gKEhNT0RVTEUpbWVtX2luZm8uQWxsb2NhdGlvbkJhc2U7CisKKyAgICAvKiBBTlNJIGZpbGUgbmFtZSBmb3IgbW9kdWxlICovCisgICAgaWYgKCFHZXRNb2R1bGVGaWxlTmFtZUEobW9kX2hhbmRsZSwgKGNoYXIqKSBtb2RfbmFtZSwgc2l6ZW9mKG1vZF9uYW1lKSkpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIHN0cmNweShkbF9pbmZvLT5kbGlfZm5hbWUsIG1vZF9uYW1lKTsKKyAgICBkbF9pbmZvLT5kbGlfZmJhc2UgPSBtZW1faW5mby5CYXNlQWRkcmVzczsKKyAgICBkbF9pbmZvLT5kbGlfc2FkZHIgPSBhZGRyOworICAgIHN0cmNweShkbF9pbmZvLT5kbGlfc25hbWUsIG1vZF9uYW1lKTsKKyAgICByZXR1cm4gMTsKK30KKworLy8gUnVuIG9uY2UKK3N0YXRpYyBCT09MIENBTExCQUNLIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyKAorICAgIFBJTklUX09OQ0UgaW5pdE9uY2UsCisgICAgUFZPSUQgcGFyYW1ldGVyLAorICAgIFBWT0lEICpjb250ZXh0CispCit7CisgICAgdm9pZCAoKmluaXRfcm91dGluZSkodm9pZCkgPSAodm9pZCgqKSh2b2lkKSkgcGFyYW1ldGVyOworICAgIGluaXRfcm91dGluZSgpOworICAgIHJldHVybiB0cnVlOworfQorCit2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSkKK3sKKyAgICBJbml0T25jZUV4ZWN1dGVPbmNlKGN0cmwsIF9fb2ZmbG9hZF9ydW5fb25jZV93cmFwcGVyLCAodm9pZCopIGZ1bmMsIDApOworfQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisvKiBBUkdTVVNFRCAqLyAvLyB2ZXJzaW9uIGlzIG5vdCB1c2VkIG9uIHdpbmRvd3MKK3ZvaWQqIERMX3N5bSh2b2lkICpoYW5kbGUsIGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKnZlcnNpb24pCit7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgcmV0dXJuIEdldFByb2NBZGRyZXNzKChITU9EVUxFKSBoYW5kbGUsIG5hbWUpOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgaWYgKHZlcnNpb24gPT0gMCkgeworICAgICAgICByZXR1cm4gZGxzeW0oaGFuZGxlLCBuYW1lKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIHJldHVybiBkbHZzeW0oaGFuZGxlLCBuYW1lLCB2ZXJzaW9uKTsKKyAgICB9CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCit9CisKK2ludDY0X3QgZ2V0X2VsX3ZhbHVlKAorICAgICAgICAgICAgICAgICAgICAgY2hhciAqYmFzZSwKKyAgICAgICAgICAgICAgICAgICAgIGludDY0X3Qgb2Zmc2V0LAorICAgICAgICAgICAgICAgICAgICAgaW50NjRfdCBzaXplKQoreworICAgIGludDY0X3QgdmFsID0gMDsKKyAgICBzd2l0Y2ggKHNpemUpIHsKKyAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoY2hhciAqKShiYXNlICsgb2Zmc2V0KSkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgMjoKKyAgICAgICAgICAgIHZhbCA9IHN0YXRpY19jYXN0PGludDY0X3Q+KCooKHNob3J0ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSA0OgorICAgICAgICAgICAgdmFsID0gc3RhdGljX2Nhc3Q8aW50NjRfdD4oKigoaW50ICopKGJhc2UgKyBvZmZzZXQpKSk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHZhbCA9ICooKGludDY0X3QgKikoYmFzZSArIG9mZnNldCkpOworICAgICAgICAgICAgYnJlYWs7CisgICAgfQorICAgIHJldHVybiB2YWw7Cit9CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmggYi9yYzMvb2ZmbG9hZC9zcmMvb2ZmbG9hZF91dGlsLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUwZDc3ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy9vZmZsb2FkX3V0aWwuaApAQCAtMCwwICsxLDE1MyBAQAorLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisjZGVmaW5lIE9GRkxPQURfVVRJTF9IX0lOQ0xVREVECisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGludC5oPgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8d2luZG93cy5oPgorI2luY2x1ZGUgPHByb2Nlc3MuaD4KKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8cHRocmVhZC5oPgorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjaWZkZWYgVEFSR0VUX1dJTk5UCit0eXBlZGVmIHVuc2lnbmVkIHB0aHJlYWRfa2V5X3Q7Cit0eXBlZGVmIGludCBwaWRfdDsKKworI2RlZmluZSBfX2Z1bmNfXyBfX0ZVTkNUSU9OX18KKyNkZWZpbmUgc3RydG9rX3IocyxkLHApIHN0cnRva19zKHMsZCxwKQorI2RlZmluZSBzdHJjYXNlY21wKGEsYikgc3RyaWNtcChhLGIpCisKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgKCgoKmtleSA9IFRsc0FsbG9jKCkpID4gMCkgPyAwIDogR2V0TGFzdEVycm9yKCkpCisjZGVmaW5lIHRocmVhZF9rZXlfZGVsZXRlKGtleSkgVGxzRnJlZShrZXkpCisKKyNpZm5kZWYgU19JU1JFRworI2RlZmluZSBTX0lTUkVHKG1vZGUpICAoKChtb2RlKSAmIFNfSUZNVCkgPT0gU19JRlJFRykKKyNlbmRpZgorCit2b2lkKiAgIHRocmVhZF9nZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSk7CitpbnQgICAgIHRocmVhZF9zZXRzcGVjaWZpYyhwdGhyZWFkX2tleV90IGtleSwgY29uc3Qgdm9pZCAqdmFsdWUpOworI2Vsc2UKKyNkZWZpbmUgdGhyZWFkX2tleV9jcmVhdGUoa2V5LCBkZXN0cnVjdG9yKSBcCisgICAgICAgICAgICBwdGhyZWFkX2tleV9jcmVhdGUoKGtleSksIChkZXN0cnVjdG9yKSkKKyNkZWZpbmUgdGhyZWFkX2tleV9kZWxldGUoa2V5KSAgcHRocmVhZF9rZXlfZGVsZXRlKGtleSkKKyNkZWZpbmUgdGhyZWFkX2dldHNwZWNpZmljKGtleSkgcHRocmVhZF9nZXRzcGVjaWZpYyhrZXkpCisjZGVmaW5lIHRocmVhZF9zZXRzcGVjaWZpYyhrZXksIHZhbHVlKSBwdGhyZWFkX3NldHNwZWNpZmljKGtleSwgdmFsdWUpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIE11dGV4IGltcGxlbWVudGF0aW9uCitzdHJ1Y3QgbXV0ZXhfdCB7CisgICAgbXV0ZXhfdCgpIHsKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICAgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2luaXQoJm1fbG9jaywgMCk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgfm11dGV4X3QoKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2Rlc3Ryb3koJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCBsb2NrKCkgeworI2lmZGVmIFRBUkdFVF9XSU5OVAorICAgICAgICBFbnRlckNyaXRpY2FsU2VjdGlvbigmbV9sb2NrKTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorICAgICAgICBwdGhyZWFkX211dGV4X2xvY2soJm1fbG9jayk7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisgICAgfQorCisgICAgdm9pZCB1bmxvY2soKSB7CisjaWZkZWYgVEFSR0VUX1dJTk5UCisgICAgICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCZtX2xvY2spOworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisgICAgICAgIHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCZtX2xvY2spOworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorICAgIH0KKworcHJpdmF0ZToKKyNpZmRlZiBUQVJHRVRfV0lOTlQKKyAgICBDUklUSUNBTF9TRUNUSU9OICAgIG1fbG9jazsKKyNlbHNlCisgICAgcHRocmVhZF9tdXRleF90ICAgICBtX2xvY2s7CisjZW5kaWYKK307CisKK3N0cnVjdCBtdXRleF9sb2NrZXJfdCB7CisgICAgbXV0ZXhfbG9ja2VyX3QobXV0ZXhfdCAmbXV0ZXgpIDogbV9tdXRleChtdXRleCkgeworICAgICAgICBtX211dGV4LmxvY2soKTsKKyAgICB9CisKKyAgICB+bXV0ZXhfbG9ja2VyX3QoKSB7CisgICAgICAgIG1fbXV0ZXgudW5sb2NrKCk7CisgICAgfQorCitwcml2YXRlOgorICAgIG11dGV4X3QgJm1fbXV0ZXg7Cit9OworCisvLyBEeW5hbWljIGxvYWRlciBpbnRlcmZhY2UKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK3N0cnVjdCBEbF9pbmZvCit7CisgICAgY2hhciAgICAgICAgZGxpX2ZuYW1lW01BWF9QQVRIXTsKKyAgICB2b2lkICAgICAgICpkbGlfZmJhc2U7CisgICAgY2hhciAgICAgICAgZGxpX3NuYW1lW01BWF9QQVRIXTsKKyAgICBjb25zdCB2b2lkICpkbGlfc2FkZHI7Cit9OworCit2b2lkKiAgIERMX29wZW4oY29uc3QgY2hhciAqcGF0aCk7CisjZGVmaW5lIERMX2Nsb3NlKGhhbmRsZSkgICAgICAgIEZyZWVMaWJyYXJ5KChITU9EVUxFKSAoaGFuZGxlKSkKK2ludCAgICAgRExfYWRkcihjb25zdCB2b2lkICphZGRyLCBEbF9pbmZvICppbmZvKTsKKyNlbHNlCisjZGVmaW5lIERMX29wZW4ocGF0aCkgICAgICAgICAgIGRsb3BlbigocGF0aCksIFJUTERfTk9XKQorI2RlZmluZSBETF9jbG9zZShoYW5kbGUpICAgICAgICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgRExfYWRkcihhZGRyLCBpbmZvKSAgICAgZGxhZGRyKChhZGRyKSwgKGluZm8pKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCitleHRlcm4gdm9pZCogRExfc3ltKHZvaWQgKmhhbmRsZSwgY29uc3QgY2hhciAqbmFtZSwgY29uc3QgY2hhciAqdmVyc2lvbik7CisKKy8vIE9uZS10aW1lIGluaXRpYWxpemF0aW9uIEFQSQorI2lmZGVmIFRBUkdFVF9XSU5OVAordHlwZWRlZiBJTklUX09OQ0UgICAgICAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgSU5JVF9PTkNFX1NUQVRJQ19JTklUCisKK2V4dGVybiB2b2lkIF9fb2ZmbG9hZF9ydW5fb25jZShPZmZsb2FkT25jZUNvbnRyb2wgKmN0cmwsIHZvaWQgKCpmdW5jKSh2b2lkKSk7CisjZWxzZQordHlwZWRlZiBwdGhyZWFkX29uY2VfdCAgICAgICAgICAgICAgT2ZmbG9hZE9uY2VDb250cm9sOworI2RlZmluZSBPRkZMT0FEX09OQ0VfQ09OVFJPTF9JTklUICAgUFRIUkVBRF9PTkNFX0lOSVQKKworI2RlZmluZSBfX29mZmxvYWRfcnVuX29uY2UoY3RybCwgZnVuYykgcHRocmVhZF9vbmNlKGN0cmwsIGZ1bmMpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIFBhcnNlcyBzaXplIHNwZWNpZmljYXRpb24gc3RyaW5nLgorZXh0ZXJuIGJvb2wgX19vZmZsb2FkX3BhcnNlX3NpemVfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgdWludDY0X3QgJm5ld19zaXplKTsKKworLy8gUGFyc2VzIHN0cmluZyB3aXRoIGludGVnZXIgdmFsdWUKK2V4dGVybiBib29sIF9fb2ZmbG9hZF9wYXJzZV9pbnRfc3RyaW5nKGNvbnN0IGNoYXIgKnN0ciwgaW50NjRfdCAmdmFsdWUpOworCisvLyBnZXQgdmFsdWUgYnkgaXRzIGJhc2UsIG9mZnNldCBhbmQgc2l6ZQoraW50NjRfdCBnZXRfZWxfdmFsdWUoCisgICAgY2hhciAgICpiYXNlLAorICAgIGludDY0X3Qgb2Zmc2V0LAorICAgIGludDY0X3Qgc2l6ZQorKTsKKyNlbmRpZiAvLyBPRkZMT0FEX1VUSUxfSF9JTkNMVURFRApkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAgYi9yYzMvb2ZmbG9hZC9zcmMvb2ZsZGJlZ2luLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NDVmOTgyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mbGRiZWdpbi5jcHAKQEAgLTAsMCArMSwxNjQgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAiY29tcGlsZXJfaWZfdGFyZ2V0LmgiCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZGVmaW5lIERMTF9MT0NBTAorI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fYXR0cmlidXRlX18oKHNlY3Rpb24obmFtZSkpKQorI2RlZmluZSBETExfTE9DQUwgIF9fYXR0cmlidXRlX18oKHZpc2liaWxpdHkoImhpZGRlbiIpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKKworI2lmIEhPU1RfTElCUkFSWQorLy8gdGhlIGhvc3QgcHJvZ3JhbS9zaGFyZWQgbGlicmFyeSBzaG91bGQgYWx3YXlzIGhhdmUgX19vZmZsb2FkX3RhcmdldF9pbWFnZQorLy8gc3ltYm9sIGRlZmluZWQuIFRoaXMgc3ltYm9sIHNwZWNpZmllcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSB0YXJnZXQgcHJvZ3JhbQorLy8gaW1hZ2UuCitleHRlcm4gIkMiIERMTF9MT0NBTCBjb25zdCB2b2lkKiBfX29mZmxvYWRfdGFyZ2V0X2ltYWdlOworI2Vsc2UgLy8gSE9TVF9MSUJSQVJZCisvLyBEZWZpbmUgYSB3ZWFrIG1haW4gd2hpY2ggd291bGQgYmUgdXNlZCBvbiB0YXJnZXQgc2lkZSBpbiBjYXNlIHVzZXJlJ3MKKy8vIHNvdXJjZSBmaWxlIGNvbnRhaW5pbmcgbWFpbiBkb2VzIG5vdCBoYXZlIG9mZmxvYWQgY29kZS4KKyNwcmFnbWEgd2VhayBtYWluCitpbnQgbWFpbih2b2lkKQoreworICAgIE9GRkxPQURfVEFSR0VUX01BSU4oKTsKKyAgICByZXR1cm4gMDsKK30KKworI3ByYWdtYSB3ZWFrIE1BSU5fXworZXh0ZXJuICJDIiBpbnQgTUFJTl9fKHZvaWQpCit7CisgICAgT0ZGTE9BRF9UQVJHRVRfTUFJTigpOworICAgIHJldHVybiAwOworfQorI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisvLyBvZmZsb2FkIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX0VOVFJZX1RBQkxFX1NFQ1RJT05fU1RBUlQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZW50cnlfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfZW50cnlfdGFibGVfc3RhcnQgKyAxLCAtMSB9LAorICAgIDAsIDAKK307CisKKy8vIG9mZmxvYWQgZnAgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfRlVOQ19UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBGdW5jTGlzdDo6Tm9kZSBfX29mZmxvYWRfZnVuY19ub2RlID0geworICAgIHsgJl9fb2ZmbG9hZF9mdW5jX3RhYmxlX3N0YXJ0ICsgMSwgLTEgfSwKKyAgICAwLCAwCit9OworCisvLyBvZmZsb2FkIGZwIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX1ZBUl9UQUJMRV9TRUNUSU9OX1NUQVJUKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoVmFyVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgVmFyVGFibGU6OkVudHJ5IF9fb2ZmbG9hZF92YXJfdGFibGVfc3RhcnQgPSB7IDAgfTsKKworLy8gbGlzdCBlbGVtZW50IGZvciB0aGUgY3VycmVudCBtb2R1bGUKK3N0YXRpYyBWYXJMaXN0OjpOb2RlIF9fb2ZmbG9hZF92YXJfbm9kZSA9IHsKKyAgICB7ICZfX29mZmxvYWRfdmFyX3RhYmxlX3N0YXJ0ICsgMSB9LAorICAgIDAsIDAKK307CisKKyNpZmRlZiBNWU9fU1VQUE9SVAorCisvLyBvZmZsb2FkIG15byBzaGFyZWQgdmFyIHNlY3Rpb24gcHJvbG9nCitBTExPQ0FURShPRkZMT0FEX01ZT19TSEFSRURfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKFNoYXJlZFRhYmxlRW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBTaGFyZWRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIHByb2xvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEluaXRUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgSW5pdFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfaW5pdF90YWJsZV9zdGFydCA9IHsgMCB9OworI2VuZGlmCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBwcm9sb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9TVEFSVCkKKyNpZmRlZiBUQVJHRVRfV0lOTlQKK19fZGVjbHNwZWMoYWxpZ24oc2l6ZW9mKEZwdHJUYWJsZUVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX3N0YXJ0ID0geyAwIH07CisKKyNlbmRpZiAvLyBNWU9fU1VQUE9SVAorCisvLyBpbml0L2ZpbmkgY29kZSB3aGljaCBhZGRzL3JlbW92ZXMgbG9jYWwgbG9va3VwIGRhdGEgdG8vZnJvbSB0aGUgZ2xvYmFsIGxpc3QKKworc3RhdGljIHZvaWQgb2ZmbG9hZF9maW5pKCk7CisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCitzdGF0aWMgdm9pZCBvZmZsb2FkX2luaXQoKSBfX2F0dHJpYnV0ZV9fKChjb25zdHJ1Y3RvcigxMDEpKSk7CisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpOworCisvLyBQbGFjZSBvZmZsb2FkIGluaXRpYWxpemF0aW9uIGJlZm9yZSB1c2VyIGNvbnN0cnVjdG9ycworQUxMT0NBVEUoT0ZGTE9BRF9DUlRJTklUX1NFQ1RJT05fU1RBUlQpCitzdGF0aWMgdm9pZCAoKmFkZHJlc3NvZl9vZmZsb2FkX2luaXQpKCkgPSBvZmZsb2FkX2luaXQ7CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfaW5pdCgpCit7CisgICAgLy8gcmVnaXN0ZXIgb2ZmbG9hZCB0YWJsZXMKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfdGFibGVzKCZfX29mZmxvYWRfZW50cnlfbm9kZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJl9fb2ZmbG9hZF92YXJfbm9kZSk7CisKKyNpZiBIT1NUX0xJQlJBUlkKKyAgICBfX29mZmxvYWRfcmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworICAgIGF0ZXhpdChvZmZsb2FkX2ZpbmkpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisjaWZkZWYgTVlPX1NVUFBPUlQKKyAgICBfX29mZmxvYWRfbXlvUmVnaXN0ZXJUYWJsZXMoCisjaWYgSE9TVF9MSUJSQVJZCisgICAgICAgICZfX29mZmxvYWRfbXlvX3NoYXJlZF9pbml0X3RhYmxlX3N0YXJ0ICsgMSwKKyNlbmRpZiAvLyBIT1NUX0xJQlJBUlkKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fc2hhcmVkX3RhYmxlX3N0YXJ0ICsgMSwKKyAgICAgICAgJl9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9zdGFydCArIDEKKyAgICApOworI2VuZGlmIC8vIE1ZT19TVVBQT1JUCit9CisKK3N0YXRpYyB2b2lkIG9mZmxvYWRfZmluaSgpCit7CisjaWYgSE9TVF9MSUJSQVJZCisgICAgX19vZmZsb2FkX3VucmVnaXN0ZXJfaW1hZ2UoJl9fb2ZmbG9hZF90YXJnZXRfaW1hZ2UpOworI2VuZGlmIC8vIEhPU1RfTElCUkFSWQorCisgICAgLy8gdW5yZWdpc3RlciBvZmZsb2FkIHRhYmxlcworICAgIF9fb2ZmbG9hZF91bnJlZ2lzdGVyX3RhYmxlcygmX19vZmZsb2FkX2VudHJ5X25vZGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZfX29mZmxvYWRfZnVuY19ub2RlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmX19vZmZsb2FkX3Zhcl9ub2RlKTsKK30KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vZmxkZW5kLmNwcCBiL3JjMy9vZmZsb2FkL3NyYy9vZmxkZW5kLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNjFmZTU5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29mbGRlbmQuY3BwCkBAIC0wLDAgKzEsNzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmIEhPU1RfTElCUkFSWQorI2luY2x1ZGUgIm9mZmxvYWRfaG9zdC5oIgorI2luY2x1ZGUgIm9mZmxvYWRfbXlvX2hvc3QuaCIKKyNlbHNlCisjaW5jbHVkZSAib2ZmbG9hZF90YXJnZXQuaCIKKyNpbmNsdWRlICJvZmZsb2FkX215b190YXJnZXQuaCIKKyNlbmRpZgorCisjaWZkZWYgVEFSR0VUX1dJTk5UCisjZGVmaW5lIEFMTE9DQVRFKG5hbWUpIF9fZGVjbHNwZWMoYWxsb2NhdGUobmFtZSkpCisjZWxzZSAvLyBUQVJHRVRfV0lOTlQKKyNkZWZpbmUgQUxMT0NBVEUobmFtZSkgX19hdHRyaWJ1dGVfXygoc2VjdGlvbihuYW1lKSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKy8vIG9mZmxvYWQgZW50cnkgdGFibGUKK0FMTE9DQVRFKE9GRkxPQURfRU5UUllfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGdW5jVGFibGU6OkVudHJ5KSkpCisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnVuY1RhYmxlOjpFbnRyeSBfX29mZmxvYWRfZW50cnlfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gb2ZmbG9hZCBmdW5jdGlvbiB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9GVU5DX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoRnVuY1RhYmxlOjpFbnRyeSkpKQorI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEZ1bmNUYWJsZTo6RW50cnkgX19vZmZsb2FkX2Z1bmNfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEgfTsKKworLy8gZGF0YSB0YWJsZQorQUxMT0NBVEUoT0ZGTE9BRF9WQVJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihWYXJUYWJsZTo6RW50cnkpKSkKKyNlbmRpZiAvLyBUQVJHRVRfV0lOTlQKK3N0YXRpYyBWYXJUYWJsZTo6RW50cnkgX19vZmZsb2FkX3Zhcl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSB9OworCisjaWZkZWYgTVlPX1NVUFBPUlQKKworLy8gb2ZmbG9hZCBteW8gc2hhcmVkIHZhciBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX1RBQkxFX1NFQ1RJT05fRU5EKQorI2lmZGVmIFRBUkdFVF9XSU5OVAorX19kZWNsc3BlYyhhbGlnbihzaXplb2YoU2hhcmVkVGFibGVFbnRyeSkpKQorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIFNoYXJlZFRhYmxlRW50cnkgX19vZmZsb2FkX215b19zaGFyZWRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisKKyNpZiBIT1NUX0xJQlJBUlkKKy8vIG9mZmxvYWQgbXlvIHNoYXJlZCB2YXIgaW5pdCBzZWN0aW9uIGVwaWxvZworQUxMT0NBVEUoT0ZGTE9BRF9NWU9fU0hBUkVEX0lOSVRfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihJbml0VGFibGVFbnRyeSkpKQorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAoY29uc3QgY2hhciopLTEsIDAgfTsKKyNlbHNlIC8vIFRBUkdFVF9XSU5OVAorc3RhdGljIEluaXRUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fc2hhcmVkX2luaXRfdGFibGVfZW5kID0geyAwIH07CisjZW5kaWYgLy8gVEFSR0VUX1dJTk5UCisjZW5kaWYgLy8gSE9TVF9MSUJSQVJZCisKKy8vIG9mZmxvYWQgbXlvIGZwdHIgc2VjdGlvbiBlcGlsb2cKK0FMTE9DQVRFKE9GRkxPQURfTVlPX0ZQVFJfVEFCTEVfU0VDVElPTl9FTkQpCisjaWZkZWYgVEFSR0VUX1dJTk5UCitfX2RlY2xzcGVjKGFsaWduKHNpemVvZihGcHRyVGFibGVFbnRyeSkpKQorc3RhdGljIEZwdHJUYWJsZUVudHJ5IF9fb2ZmbG9hZF9teW9fZnB0cl90YWJsZV9lbmQgPSB7IChjb25zdCBjaGFyKiktMSwgMCwgMCB9OworI2Vsc2UgLy8gVEFSR0VUX1dJTk5UCitzdGF0aWMgRnB0clRhYmxlRW50cnkgX19vZmZsb2FkX215b19mcHRyX3RhYmxlX2VuZCA9IHsgMCB9OworI2VuZGlmIC8vIFRBUkdFVF9XSU5OVAorCisjZW5kaWYgLy8gTVlPX1NVUFBPUlQKZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCBiL3JjMy9vZmZsb2FkL3NyYy9vcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMjZhMzM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9pbmNsdWRlL29yc2wtbGl0ZS5oCkBAIC0wLDAgKzEsMjIxIEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX09SU0xfTElURV9IXworI2RlZmluZSBfT1JTTF9MSVRFX0hfCisKKyNpZm5kZWYgVEFSR0VUX1dJTk5UCisjaW5jbHVkZSA8c2NoZWQuaD4KKyNlbHNlCisjZGVmaW5lIGNwdV9zZXRfdCBpbnQKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qKiBUeXBlIG9mIGEgT1JTTEJ1c3lTZXQgKi8KK3R5cGVkZWYgZW51bSBPUlNMQnVzeVNldFR5cGUgeworICAgIEJVU1lfU0VUX0VNUFRZID0gMCwgICAgIC8qKjwgRW1wdHkgc2V0ICovCisgICAgQlVTWV9TRVRfUEFSVElBTCA9IDEsICAgLyoqPCBOb24tZW1wdHkgc2V0IHRoYXQgb21pdHMgc29tZSB0aHJlYWRzICovCisgICAgQlVTWV9TRVRfRlVMTCA9IDIgICAgICAgLyoqPCBBIHNldCB0aGF0IGluY2x1ZGVzIGFsbCB0aHJlYWRzIG9uIHRoZSBjYXJkICovCit9IEJ1c3lTZXRUeXBlOworCisvKiogT1JTTEJ1c3lTZXQgZW5jYXBzdWxhdGlvbiAqLwordHlwZWRlZiBzdHJ1Y3QgT1JTTEJ1c3lTZXQgeworICAgIEJ1c3lTZXRUeXBlIHR5cGU7ICAgLyoqPCBTZXQgdHlwZSAqLworI2lmZGVmIF9fbGludXhfXworICAgIGNwdV9zZXRfdCBjcHVfc2V0OyAgLyoqPCBDUFUgbWFzayAodW51c2VkIGZvciBCVVNZX1NFVF9FTVBUWSBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJVU1lfU0VUX1BBUlRJQUwgc2V0cykgcmVwcmVzZW50ZWQgYnkgdGhlIHN0YW5kYXJkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBMaW51eCBDUFUgc2V0IHR5cGUgLS0gY3B1X3NldF90LiBUaHJlYWRzIGFyZSBudW1iZXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnRpbmcgZnJvbSAwLiBUaGUgbWF4aW1hbCBwb3NzaWJsZSB0aHJlYWQgbnVtYmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpcyBzeXN0ZW0tc3BlY2lmaWMuIFNlZSBDUFVfU0VUKDMpIGZhbWlseSBvZiBtYWNyb3MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGZvciBtb3JlIGRldGFpbHMuIFVudXNlZCBpbiBPUlNMIExpdGUuICovCisjZW5kaWYKK30gT1JTTEJ1c3lTZXQ7CisKKy8qKiBDbGllbnQgdGFnICovCit0eXBlZGVmIGNoYXIqIE9SU0xUYWc7CisKKy8qKiBNYXhpbWFsIGxlbmd0aCBvZiB0YWcgaW4gY2hhcmFjdGVycyAqLworI2RlZmluZSBPUlNMX01BWF9UQUdfTEVOIDEyOAorCisvKiogTWF4aW1hbCBudW1iZXIgb2YgY2FyZHMgdGhhdCBjYW4gYmUgbWFuYWdlZCBieSBPUlNMICovCisjZGVmaW5lIE9SU0xfTUFYX0NBUkRTIDMyCisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gQmxvY2tzLgorICoKKyAqIElmIGFueSBvZiB0aGUgcmVzb3VyY2VzIGNhbm5vdCBiZSByZXNlcnZlZCwgdGhpcyBmdW5jdGlvbiB3aWxsIGJsb2NrIHVudGlsCisgKiB0aGV5IGJlY29tZSBhdmFpbGFibGUuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZQorICogc2FtZSB0YWcuIEEgcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIKKyAqIG9mIHRpbWVzIGl0IHdhcyByZXNlcnZlZC4KKyAqCisgKiBAc2VlIE9SU0xUcnlSZXNlcnZlCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGVlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiB0aGUgcmVzb3VyY2VzIHdlcmUgc3VjY2Vzc2Z1bGx5IHJlc2VydmVkCisgKgorICogQHJldHVybnMgICAgRUlOVkFMIGlmIGFueSBvZiB0aGUgYXJndW1lbnRzIGlzIGludmFsaWQKKyAqCisgKiBAcmV0dXJucyAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgKG5vdCBpbiBPUlNMIExpdGUpCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBSZXNlcnZlcyBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4gRG9lcyBub3QgYmxvY2suCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgcmV0dXJuCisgKiBpbW1lZGlhdGVseS4gUmVzZXJ2YXRpb24gY2FuIGJlIHJlY3Vyc2l2ZSBpZiBwZXJmb3JtZWQgYnkgdGhlIHNhbWUgdGFnLgorICogQSByZWN1cnNpdmVseSByZXNlcnZlZCByZXNvdXJjZSBtdXN0IGJlIHJlbGVhc2VkIHRoZSBzYW1lIG51bWJlciBvZiB0aW1lcworICogaXQgd2FzIHJlc2VydmVkLgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgICBJbmRpY2VzIG9mIHRoZSBjYXJkczogYW4gaW50ZWdlciBhcnJheSB3aXRoIG4gZWxlbWVudHMuCisgKiAgICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5vdXRdIGJzZXRzICBSZXF1ZXN0ZWQgcmVzb3VyY2VzIG9uIGVhY2ggb2YgdGhlIGNhcmQuIENhbm5vdCBiZQorICogICAgICAgICAgICAgICAgICAgICAgTlVMTCBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICAgIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgICAgbXVzdCBub3QgZXhjZWVkIE9SU0xfTUFYX1RBR19MRU4uCisgKgorICogQHJldHVybnMgICAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgICAgRUJVU1kgIGlmIHNvbWUgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgICBFQUdBSU4gbGltaXQgb2YgcmVjdXJzaXZlIHJlc2VydmF0aW9ucyByZWFjaGVkCisgKiAgICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICAgIEVOT1NZUyAoaW4gT1JTTCBMaXRlKSBpZiB0eXBlIG9mIGFueSBvZiB0aGUgYnVzeSBzZXRzIGlzCisgKiAgICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMVHJ5UmVzZXJ2ZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKy8qKiBHcmFudWxhcmlmeSBvZiBwYXJ0aWFsIHJlc2VydmF0aW9uICovCit0eXBlZGVmIGVudW0gT1JTTFBhcnRpYWxHcmFudWxhcml0eSB7CisgICAgR1JBTl9DQVJEID0gMCwgLyoqPCBDYXJkIGdyYW51bGFyaXR5ICovCisgICAgR1JBTl9USFJFQUQgPSAxIC8qKjwgVGhyZWFkIGdyYW51bGFyaXR5ICovCit9IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHk7CisKKy8qKiBSZXF1ZXN0cyByZXNlcnZhdGlvbiBvZiBzb21lIG9mIGNvbXB1dGF0aW9uYWwgcmVzb3VyY2VzIG9uIGEgc2V0IG9mIGNhcmRzLgorICogRG9lcyBub3QgYmxvY2suIFVwZGF0ZXMgdXNlci1wcm92aWRlZCBic2V0cyB0byBpbmRpY2F0ZSB3aGljaCByZXNvdXJjZXMKKyAqIHdlcmUgcmVzZXJ2ZWQuCisgKgorICogSWYgYW55IG9mIHRoZSByZXNvdXJjZXMgY2Fubm90IGJlIHJlc2VydmVkLCB0aGlzIGZ1bmN0aW9uIHdpbGwgdXBkYXRlIGJ1c3kKKyAqIHNldHMgcHJvdmlkZWQgYnkgdGhlIGNhbGxlciB0byByZWZsZWN0IHdoYXQgcmVzb3VyY2VzIHdlcmUgYWN0dWFsbHkKKyAqIHJlc2VydmVkLiBUaGlzIGZ1bmN0aW9uIHN1cHBvcnRzIHR3byBncmFudWxhcml0eSBtb2RlczogJ2NhcmQnIGFuZAorICogJ3RocmVhZCcuICBXaGVuIGdyYW51bGFyaXR5IGlzIHNldCB0byAnY2FyZCcsIGEgZmFpbHVyZSB0byByZXNlcnZlIGEgdGhyZWFkCisgKiBvbiB0aGUgY2FyZCB3aWxsIGltcGx5IHRoYXQgcmVzZXJ2YXRpb24gaGFzIGZhaWxlZCBmb3IgdGhlIHdob2xlIGNhcmQuIFdoZW4KKyAqIGdyYW51bGFyaXR5IGlzIHNldCB0byAndGhyZWFkJywgcmVzZXJ2YXRpb24gb24gYSBjYXJkIHdpbGwgYmUgY29uc2lkZXJlZAorICogc3VjY2Vzc2Z1bCBhcyBsb25nIGFzIGF0IGxlYXN0IG9uZSB0aHJlYWQgb24gdGhlIGNhcmQgd2FzIHN1Y2Nlc3NmdWxseQorICogcmVzZXJ2ZWQuIFJlc2VydmF0aW9uIGNhbiBiZSByZWN1cnNpdmUgaWYgcGVyZm9ybWVkIGJ5IHRoZSBzYW1lIHRhZy4gQQorICogcmVjdXJzaXZlbHkgcmVzZXJ2ZWQgcmVzb3VyY2UgbXVzdCBiZSByZWxlYXNlZCB0aGUgc2FtZSBudW1iZXIgb2YgdGltZXMgaXQKKyAqIHdhcyByZXNlcnZlZC4KKyAqCisgKiBAcGFyYW1baW5dICBncmFuICAgUmVzZXJ2YXRpb24gZ3JhbnVsYXJpdHkKKyAqCisgKiBAcGFyYW1baW5dICBuICAgICAgTnVtYmVyIG9mIGNhcmRzIHRvIHJlc2VydmUgcmVzb3VyY2VzIG9uLiBDYW5ub3QgYmUgPCAwCisgKiAgICAgICAgICAgICAgICAgICAgb3IgPiBPUlNMX01BWF9DQVJEUy4KKyAqCisgKiBAcGFyYW1baW5dICBpbmRzICAgSW5kaWNlcyBvZiB0aGUgY2FyZHM6IGFuIGludGVnZXIgYXJyYXkgd2l0aCBuIGVsZW1lbnRzLgorICogICAgICAgICAgICAgICAgICAgIENhbm5vdCBiZSBOVUxMIGlmIG4gPiAwLiBWYWxpZCBjYXJkIGluZGljZXMgYXJlIGZyb20gMAorICogICAgICAgICAgICAgICAgICAgIHRvIE9SU0xfTUFYX0NBUkRTLTEuIENhbm5vdCBjb250YWluIGR1cGxpY2F0ZSBlbGVtZW50cy4KKyAqCisgKiBAcGFyYW1baW5dICBic2V0cyAgUmVxdWVzdGVkIHJlc291cmNlcyBvbiBlYWNoIG9mIHRoZSBjYXJkLiBDYW5ub3QgYmUgTlVMTAorICogICAgICAgICAgICAgICAgICAgIGlmIG4gPiAwLgorICoKKyAqIEBwYXJhbVtpbl0gIHRhZyAgICBPUlNMVGFnIG9mIHRoZSBjYWxsaW5nIGNsaWVudC4gQ2Fubm90IGJlIE5VTEwuIExlbmd0aAorICogICAgICAgICAgICAgICAgICAgIG11c3Qgbm90IGV4Y2VlZCBPUlNMX01BWF9UQUdfTEVOLgorICoKKyAqIEByZXR1cm5zICAgIDAgICAgICBpZiBhdCBsZWFzdCBzb21lIG9mIHRoZSByZXNvdXJjZXMgd2VyZSBzdWNjZXNzZnVsbHkKKyAqICAgICAgICAgICAgICAgICAgICByZXNlcnZlZAorICoKKyAqIEByZXR1cm5zICAgIEVCVVNZICBpZiBhbGwgb2YgdGhlIHJlcXVlc3RlZCByZXNvdXJjZXMgYXJlIGJ1c3kKKyAqCisgKiBAcmV0dXJucyAgICBFSU5WQUwgaWYgYW55IG9mIHRoZSBhcmd1bWVudHMgaXMgaW52YWxpZAorICoKKyAqIEByZXR1cm5zICAgIEVBR0FJTiBsaW1pdCBvZiByZWN1cnNpdmUgcmVzZXJ2YXRpb25zIHJlYWNoZWQKKyAqICAgICAgICAgICAgICAgICAgICAobm90IGluIE9SU0wgTGl0ZSkKKyAqCisgKiBAcmV0dXJucyAgICBFTk9TWVMgKGluIE9SU0wgTGl0ZSkgaWYgdHlwZSBvZiBhbnkgb2YgdGhlIGJ1c3kgc2V0cyBpcworICogICAgICAgICAgICAgICAgICAgIGVxdWFsIHRvIEJVU1lfU0VUX1BBUlRJQUwKKyAqLworaW50IE9SU0xSZXNlcnZlUGFydGlhbChjb25zdCBPUlNMUGFydGlhbEdyYW51bGFyaXR5IGdyYW4sIGNvbnN0IGludCBuLAorICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICAgICAgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpOworCisvKiogUmVsZWFzZXMgcHJldmlvdXNseSByZXNlcnZlZCBjb21wdXRhdGlvbmFsIHJlc291cmNlcyBvbiBhIHNldCBvZiBjYXJkcy4KKyAqCisgKiBUaGlzIGZ1bmN0aW9uIHdpbGwgZmFpbCBpZiBhbnkgb2YgdGhlIHJlc291cmNlcyB0byBiZSByZWxlYXNlZCB3ZXJlIG5vdAorICogcmVzZXJ2ZWQgYnkgdGhlIGNhbGxpbmcgY2xpZW50LgorICoKKyAqIEBzZWUgT1JTTFJlc2VydmUKKyAqIEBzZWUgT1JTTFRyeVJlc2VydmUKKyAqIEBzZWUgT1JTTFJlc2VydmVQYXJ0aWFsCisgKgorICogQHBhcmFtW2luXSAgbiAgICAgIE51bWJlciBvZiBjYXJkcyB0byByZXNlcnZlIHJlc291cmNlcyBvbi4gQ2Fubm90IGJlIDwgMAorICogICAgICAgICAgICAgICAgICAgIG9yID4gT1JTTF9NQVhfQ0FSRFMuCisgKgorICogQHBhcmFtW2luXSAgaW5kcyAgIEluZGljZXMgb2YgdGhlIGNhcmRzOiBhbiBpbnRlZ2VyIGFycmF5IHdpdGggbiBlbGVtZW50cy4KKyAqICAgICAgICAgICAgICAgICAgICBDYW5ub3QgYmUgTlVMTCBpZiBuID4gMC4gVmFsaWQgY2FyZCBpbmRpY2VzIGFyZSBmcm9tIDAKKyAqICAgICAgICAgICAgICAgICAgICB0byBPUlNMX01BWF9DQVJEUy0xLiBDYW5ub3QgY29udGFpbiBkdXBsaWNhdGUgZWxlbWVudHMuCisgKgorICogQHBhcmFtW2luXSAgYnNldHMgIFJlcXVlc3RlZCByZXNvdXJjZXMgb24gZWFjaCBvZiB0aGUgY2FyZC4gQ2Fubm90IGJlIE5VTEwKKyAqICAgICAgICAgICAgICAgICAgICBpZiBuID4gMC4KKyAqCisgKiBAcGFyYW1baW5dICB0YWcgICAgT1JTTFRhZyBvZiB0aGUgY2FsbGluZyBjbGllbnQuIENhbm5vdCBiZSBOVUxMLiBMZW5ndGgKKyAqICAgICAgICAgICAgICAgICAgICBtdXN0IG5vdCBleGNlZWQgT1JTTF9NQVhfVEFHX0xFTi4KKyAqCisgKiBAcmV0dXJucyAgICAwICAgICAgaWYgdGhlIHJlc291cmNlcyB3ZXJlIHN1Y2Nlc3NmdWxseSByZWxlYXNlZAorICoKKyAqIEByZXR1cm5zICAgIEVJTlZBTCBpZiBhbnkgb2YgdGhlIGFyZ3VtZW50cyBpcyBpbnZhbGlkCisgKgorICogQHJldHVybnMgICAgRVBFUk0gIHRoZSBjYWxsaW5nIGNsaWVudCBkaWQgbm90IHJlc2VydmUgc29tZSBvZiB0aGUKKyAqICAgICAgICAgICAgICAgICAgICByZXNvdXJjZXMgaXQgaXMgdHJ5aW5nIHRvIHJlbGVhc2UuCisgKgorICogQHJldHVybnMgICAgRU5PU1lTIChpbiBPUlNMIExpdGUpIGlmIHR5cGUgb2YgYW55IG9mIHRoZSBidXN5IHNldHMgaXMKKyAqICAgICAgICAgICAgICAgICAgICBlcXVhbCB0byBCVVNZX1NFVF9QQVJUSUFMCisgKi8KK2ludCBPUlNMUmVsZWFzZShjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZyk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMgYi9yYzMvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL2xpYi9vcnNsLWxpdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMjFjZGE3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29yc2wtbGl0ZS9saWIvb3JzbC1saXRlLmMKQEAgLTAsMCArMSwzMzcgQEAKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlICJvcnNsLWxpdGUvaW5jbHVkZS9vcnNsLWxpdGUuaCIKKworI2RlZmluZSBESVNBQkxFX1NZTUJPTF9WRVJTSU9OSU5HCisKKyNpZiBkZWZpbmVkKF9fbGludXhfXykgJiYgIWRlZmluZWQoRElTQUJMRV9TWU1CT0xfVkVSU0lPTklORykKKyNkZWZpbmUgc3ltdmVyKHNyYywgdGd0LCB2ZXJzdHIpIF9fYXNtX18oIi5zeW12ZXIgIiAjc3JjICIsIiAjdGd0IHZlcnN0cikKK3N5bXZlcihPUlNMUmVzZXJ2ZTAsIE9SU0xSZXNlcnZlLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xUcnlSZXNlcnZlMCwgT1JTTFRyeVJlc2VydmUsICJAQE9SU0xfMC4wIik7CitzeW12ZXIoT1JTTFJlc2VydmVQYXJ0aWFsMCwgT1JTTFJlc2VydmVQYXJ0aWFsLCAiQEBPUlNMXzAuMCIpOworc3ltdmVyKE9SU0xSZWxlYXNlMCwgT1JTTFJlbGVhc2UsICJAQE9SU0xfMC4wIik7CisjZWxzZQorI2RlZmluZSBPUlNMUmVzZXJ2ZTAgT1JTTFJlc2VydmUKKyNkZWZpbmUgT1JTTFRyeVJlc2VydmUwIE9SU0xUcnlSZXNlcnZlCisjZGVmaW5lIE9SU0xSZXNlcnZlUGFydGlhbDAgT1JTTFJlc2VydmVQYXJ0aWFsCisjZGVmaW5lIE9SU0xSZWxlYXNlMCBPUlNMUmVsZWFzZQorI2VuZGlmCisKKyNpZmRlZiBfX2xpbnV4X18KKyNpbmNsdWRlIDxwdGhyZWFkLmg+CitzdGF0aWMgcHRocmVhZF9tdXRleF90IGdsb2JhbF9tdXRleCA9IFBUSFJFQURfTVVURVhfSU5JVElBTElaRVI7CitzdGF0aWMgcHRocmVhZF9jb25kX3QgcmVsZWFzZV9jb25kID0gUFRIUkVBRF9DT05EX0lOSVRJQUxJWkVSOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisjcHJhZ21hIGludHJpbnNpYyhfUmVhZFdyaXRlQmFycmllcikKK3N0YXRpYyBTUldMT0NLIGdsb2JhbF9tdXRleCA9IFNSV0xPQ0tfSU5JVDsKK3N0YXRpYyB2b2xhdGlsZSBpbnQgcmVsZWFzZV9jb25kX2luaXRpYWxpemVkID0gMDsKK3N0YXRpYyBDT05ESVRJT05fVkFSSUFCTEUgcmVsZWFzZV9jb25kOworCitzdGF0aWMgdm9pZCBzdGF0ZV9sYXp5X2luaXRfc3luYygpCit7CisgICAgaWYgKCFyZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQpIHsKKyAgICAgICAgQWNxdWlyZVNSV0xvY2tFeGNsdXNpdmUoJmdsb2JhbF9tdXRleCk7CisgICAgICAgIF9SZWFkV3JpdGVCYXJyaWVyKCk7CisgICAgICAgIGlmICghcmVsZWFzZV9jb25kX2luaXRpYWxpemVkKSB7CisgICAgICAgICAgICBJbml0aWFsaXplQ29uZGl0aW9uVmFyaWFibGUoJnJlbGVhc2VfY29uZCk7CisgICAgICAgICAgICByZWxlYXNlX2NvbmRfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICB9CisgICAgICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIH0KK30KKyNlbmRpZgorCitzdGF0aWMgaW50IHN0YXRlX2xvY2soKQoreworI2lmZGVmIF9fbGludXhfXworICAgIHJldHVybiBwdGhyZWFkX211dGV4X2xvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIEFjcXVpcmVTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfdW5sb2NrKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9tdXRleF91bmxvY2soJmdsb2JhbF9tdXRleCk7CisjZW5kaWYKKworI2lmZGVmIF9XSU4zMgorICAgIFJlbGVhc2VTUldMb2NrRXhjbHVzaXZlKCZnbG9iYWxfbXV0ZXgpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBpbnQgc3RhdGVfd2FpdF9mb3JfcmVsZWFzZSgpCit7CisjaWZkZWYgX19saW51eF9fCisgICAgcmV0dXJuIHB0aHJlYWRfY29uZF93YWl0KCZyZWxlYXNlX2NvbmQsICZnbG9iYWxfbXV0ZXgpOworI2VuZGlmCisKKyNpZmRlZiBfV0lOMzIKKyAgICByZXR1cm4gU2xlZXBDb25kaXRpb25WYXJpYWJsZVNSVygmcmVsZWFzZV9jb25kLAorICAgICAgICAgICAgJmdsb2JhbF9tdXRleCwgSU5GSU5JVEUsIDApID09IDAgPyAxIDogMDsKKyNlbmRpZgorfQorCitzdGF0aWMgaW50IHN0YXRlX3NpZ25hbF9yZWxlYXNlKCkKK3sKKyNpZmRlZiBfX2xpbnV4X18KKyAgICByZXR1cm4gcHRocmVhZF9jb25kX3NpZ25hbCgmcmVsZWFzZV9jb25kKTsKKyNlbmRpZgorCisjaWZkZWYgX1dJTjMyCisgICAgV2FrZUNvbmRpdGlvblZhcmlhYmxlKCZyZWxlYXNlX2NvbmQpOworICAgIHJldHVybiAwOworI2VuZGlmCit9CisKK3N0YXRpYyBzdHJ1Y3QgeworICAgIGNoYXIgb3duZXJbT1JTTF9NQVhfVEFHX0xFTiArIDFdOworICAgIHVuc2lnbmVkIGxvbmcgcnNydl9jbnQ7Cit9IHJzcnZfZGF0YVtPUlNMX01BWF9DQVJEU107CisKK3N0YXRpYyBpbnQgY2hlY2tfYXJncyhjb25zdCBpbnQgbiwgY29uc3QgaW50ICpfX3Jlc3RyaWN0IGluZHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTEJ1c3lTZXQgKl9fcmVzdHJpY3QgYnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgY2FyZF9zcGVjaWZpZWRbT1JTTF9NQVhfQ0FSRFNdOworICAgIGlmICh0YWcgPT0gTlVMTCkgcmV0dXJuIC0xOworICAgIGlmIChzdHJsZW4oKGNoYXIgKil0YWcpID4gT1JTTF9NQVhfVEFHX0xFTikgcmV0dXJuIC0xOworICAgIGlmIChuIDwgMCB8fCBuID49IE9SU0xfTUFYX0NBUkRTKSByZXR1cm4gLTE7CisgICAgaWYgKG4gIT0gMCAmJiAoaW5kcyA9PSBOVUxMIHx8IGJzZXRzID09IE5VTEwpKSByZXR1cm4gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IE9SU0xfTUFYX0NBUkRTOyBpKyspCisgICAgICAgIGNhcmRfc3BlY2lmaWVkW2ldID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKSB7CisgICAgICAgIGludCBpbmQgPSBpbmRzW2ldOworICAgICAgICBpZiAoaW5kIDwgMCB8fCBpbmQgPj0gT1JTTF9NQVhfQ0FSRFMpIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGNhcmRfc3BlY2lmaWVkW2luZF0pIHJldHVybiAtMTsKKyAgICAgICAgY2FyZF9zcGVjaWZpZWRbaW5kXSA9IDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNoZWNrX2JzZXRzKGNvbnN0IGludCBuLCBjb25zdCBPUlNMQnVzeVNldCAqYnNldHMpCit7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGJzZXRzW2ldLnR5cGUgPT0gQlVTWV9TRVRfUEFSVElBTCkgcmV0dXJuIC0xOworICAgIHJldHVybiAwOworfQorCitzdGF0aWMgaW50IGNhbl9yZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICByZXR1cm4gKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkgfHwKKyAgICAgICAgICAgICgocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDAgfHwKKyAgICAgICAgICAgIHN0cm5jbXAoKGNoYXIgKil0YWcsCisgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSAmJgorICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250IDwgVUxPTkdfTUFYKSkgPyAwIDogLSAxOworfQorCitzdGF0aWMgdm9pZCByZXNlcnZlX2NhcmQoaW50IGNhcmQsIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBhc3NlcnQodGFnICE9IE5VTEwpOworICAgIGFzc2VydChic2V0ICE9IE5VTEwpOworICAgIGFzc2VydChzdHJsZW4oKGNoYXIgKil0YWcpIDwgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgYXNzZXJ0KGJzZXQtPnR5cGUgIT0gQlVTWV9TRVRfUEFSVElBTCk7CisKKyAgICBpZiAoYnNldC0+dHlwZSA9PSBCVVNZX1NFVF9FTVBUWSkKKyAgICAgICAgcmV0dXJuOworCisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA9PSAwIHx8CisgICAgICAgICAgICBzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA8IFVMT05HX01BWCk7CisKKyAgICBpZiAocnNydl9kYXRhW2NhcmRdLnJzcnZfY250ID09IDApCisgICAgICAgIHN0cm5jcHkocnNydl9kYXRhW2NhcmRdLm93bmVyLCAoY2hhciAqKXRhZywgT1JTTF9NQVhfVEFHX0xFTik7CisgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyW09SU0xfTUFYX1RBR19MRU5dID0gJ1wwJzsKKyAgICByc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQrKzsKK30KKworc3RhdGljIGludCBjYW5fcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgcmV0dXJuIChic2V0LT50eXBlID09IEJVU1lfU0VUX0VNUFRZIHx8IChyc3J2X2RhdGFbY2FyZF0ucnNydl9jbnQgPiAwICYmCisgICAgICAgICAgICAgICAgc3RybmNtcCgoY2hhciAqKXRhZywKKyAgICAgICAgICAgICAgICAgICAgcnNydl9kYXRhW2NhcmRdLm93bmVyLCBPUlNMX01BWF9UQUdfTEVOKSA9PSAwKSkgPyAwIDogMTsKK30KKworc3RhdGljIHZvaWQgcmVsZWFzZV9jYXJkKGludCBjYXJkLCBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0LAorICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgYXNzZXJ0KHRhZyAhPSBOVUxMKTsKKyAgICBhc3NlcnQoYnNldCAhPSBOVUxMKTsKKyAgICBhc3NlcnQoc3RybGVuKChjaGFyICopdGFnKSA8IE9SU0xfTUFYX1RBR19MRU4pOworICAgIGFzc2VydChic2V0LT50eXBlICE9IEJVU1lfU0VUX1BBUlRJQUwpOworCisgICAgaWYgKGJzZXQtPnR5cGUgPT0gQlVTWV9TRVRfRU1QVFkpCisgICAgICAgIHJldHVybjsKKworICAgIGFzc2VydChzdHJuY21wKChjaGFyICopdGFnLAorICAgICAgICAgICAgICAgIHJzcnZfZGF0YVtjYXJkXS5vd25lciwgT1JTTF9NQVhfVEFHX0xFTikgPT0gMCk7CisgICAgYXNzZXJ0KHJzcnZfZGF0YVtjYXJkXS5yc3J2X2NudCA+IDApOworCisgICAgcnNydl9kYXRhW2NhcmRdLnJzcnZfY250LS07Cit9CisKK2ludCBPUlNMUmVzZXJ2ZTAoY29uc3QgaW50IG4sIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xCdXN5U2V0ICpfX3Jlc3RyaWN0IGJzZXRzLAorICAgICAgICAgICAgICAgIGNvbnN0IE9SU0xUYWcgX19yZXN0cmljdCB0YWcpCit7CisgICAgaW50IGksIG9rOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBMb29wIHVudGlsIHdlIGZpbmQgdGhhdCBhbGwgdGhlIHJlc291cmNlcyB3ZSB3YW50IGFyZSBhdmFpbGFibGUgKi8KKyAgICBkbyB7CisgICAgICAgIG9rID0gMTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKSB7CisgICAgICAgICAgICAgICAgb2sgPSAwOworICAgICAgICAgICAgICAgIC8qIFdhaXQgZm9yIHNvbWVvbmUgdG8gcmVsZWFzZSBzb21lIHJlc291cmNlcyAqLworICAgICAgICAgICAgICAgIHN0YXRlX3dhaXRfZm9yX3JlbGVhc2UoKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICB9IHdoaWxlICghb2spOworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZXNlcnZlX2NhcmQgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHN0YXRlX3VubG9jaygpOworICAgIHJldHVybiAwOworfQorCitpbnQgT1JTTFRyeVJlc2VydmUwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVCVVNZOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayByZXNvdXJjZSBhdmFpbGFiaWxpdHkgb25jZSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIGlmIChjYW5fcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKSAhPSAwKQorICAgICAgICAgICAgZ290byBiYWlsX291dDsKKworICAgIC8qIEF0IHRoaXMgcG9pbnQgd2UgYXJlIGdvb2QgdG8gcmVzZXJ2ZSB0aGUgcmVzb3VyY2VzIHdlIHdhbnQgKi8KKyAgICBmb3IgKGkgPSAwOyBpIDwgbjsgaSsrKQorICAgICAgICByZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKK2ludCBPUlNMUmVzZXJ2ZVBhcnRpYWwwKGNvbnN0IE9SU0xQYXJ0aWFsR3JhbnVsYXJpdHkgZ3JhbiwgY29uc3QgaW50IG4sCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGludCAqX19yZXN0cmljdCBpbmRzLCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgT1JTTFRhZyBfX3Jlc3RyaWN0IHRhZykKK3sKKyAgICBpbnQgcmMgPSBFQlVTWTsKKyAgICBpbnQgaSwgbnVtX2F2YWlsID0gbjsKKworICAgIGlmIChuID09IDApIHJldHVybiAwOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCAmJiBncmFuICE9IEdSQU5fVEhSRUFEKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChncmFuICE9IEdSQU5fQ0FSRCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYXJncyhuLCBpbmRzLCBic2V0cywgdGFnKSAhPSAwKSByZXR1cm4gRUlOVkFMOworICAgIGlmIChjaGVja19ic2V0cyhuLCBic2V0cykgIT0gMCkgcmV0dXJuIEVOT1NZUzsKKworICAgIHN0YXRlX2xvY2soKTsKKworICAgIC8qIENoZWNrIHJlc291cmNlIGF2YWlsYWJpbGl0eSBvbmNlOyByZW1vdmUgdW5hdmFpbGFibGUgcmVzb3VyY2VzIGZyb20gdGhlCisgICAgICogdXNlci1wcm92aWRlZCBsaXN0ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZXNlcnZlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApIHsKKyAgICAgICAgICAgIG51bV9hdmFpbC0tOworICAgICAgICAgICAgYnNldHNbaV0udHlwZSA9IEJVU1lfU0VUX0VNUFRZOworICAgICAgICB9CisKKyAgICBpZiAobnVtX2F2YWlsID09IDApCisgICAgICAgIGdvdG8gYmFpbF9vdXQ7CisKKyAgICAvKiBBdCB0aGlzIHBvaW50IHdlIGFyZSBnb29kIHRvIHJlc2VydmUgdGhlIHJlc291cmNlcyB3ZSB3YW50ICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgcmVzZXJ2ZV9jYXJkKGluZHNbaV0sICZic2V0c1tpXSwgdGFnKTsKKworICAgIHJjID0gMDsKKworYmFpbF9vdXQ6CisgICAgc3RhdGVfdW5sb2NrKCk7CisgICAgcmV0dXJuIHJjOworfQorCitpbnQgT1JTTFJlbGVhc2UwKGNvbnN0IGludCBuLCBjb25zdCBpbnQgKl9fcmVzdHJpY3QgaW5kcywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMQnVzeVNldCAqX19yZXN0cmljdCBic2V0cywKKyAgICAgICAgICAgICAgICBjb25zdCBPUlNMVGFnIF9fcmVzdHJpY3QgdGFnKQoreworICAgIGludCBpLCByYyA9IEVQRVJNOworCisgICAgaWYgKG4gPT0gMCkgcmV0dXJuIDA7CisgICAgaWYgKGNoZWNrX2FyZ3MobiwgaW5kcywgYnNldHMsIHRhZykgIT0gMCkgcmV0dXJuIEVJTlZBTDsKKyAgICBpZiAoY2hlY2tfYnNldHMobiwgYnNldHMpICE9IDApIHJldHVybiBFTk9TWVM7CisKKyAgICBzdGF0ZV9sb2NrKCk7CisKKyAgICAvKiBDaGVjayB0aGF0IHdlIGNhbiByZWxlYXNlIGFsbCB0aGUgcmVzb3VyY2VzICovCisgICAgZm9yIChpID0gMDsgaSA8IG47IGkrKykKKyAgICAgICAgaWYgKGNhbl9yZWxlYXNlX2NhcmQoaW5kc1tpXSwgJmJzZXRzW2ldLCB0YWcpICE9IDApCisgICAgICAgICAgICBnb3RvIGJhaWxfb3V0OworCisgICAgLyogQXQgdGhpcyBwb2ludCB3ZSBhcmUgZ29vZCB0byByZWxlYXNlIHRoZSByZXNvdXJjZXMgd2Ugd2FudCAqLworICAgIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspCisgICAgICAgIHJlbGVhc2VfY2FyZChpbmRzW2ldLCAmYnNldHNbaV0sIHRhZyk7CisKKyAgICBzdGF0ZV9zaWduYWxfcmVsZWFzZSgpOworCisgICAgcmMgPSAwOworCitiYWlsX291dDoKKyAgICBzdGF0ZV91bmxvY2soKTsKKyAgICByZXR1cm4gcmM7Cit9CisKKy8qIHZpbTpzZXQgZXQ6ICovCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvb3JzbC1saXRlL3ZlcnNpb24udHh0IGIvcmMzL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYjVmNTk5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL29mZmxvYWQvc3JjL29yc2wtbGl0ZS92ZXJzaW9uLnR4dApAQCAtMCwwICsxIEBACitPUlNMLWxpdGUgMC43CmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvcmR0c2MuaCBiL3JjMy9vZmZsb2FkL3NyYy9yZHRzYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRhOTFkNzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvcmR0c2MuaApAQCAtMCwwICsxLDE3IEBACisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSA8c3RkaW50Lmg+CisKK3VpbnQ2NF90IF9yZHRzYygpCit7CisgIHVpbnQzMl90IGVheCwgZWR4OworICBhc20gdm9sYXRpbGUgKCJyZHRzYyIgOiAiPWEiIChlYXgpLCAiPWQiIChlZHgpKTsKKyAgcmV0dXJuICgodWludDY0X3QpZWR4IDw8IDMyKSB8IGVheDsKK30KZGlmZiAtLWdpdCBhL3JjMy9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0IGIvcmMzL29mZmxvYWQvc3JjL3VzZV9tcHNzMi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTQ4ZjQ4MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9vZmZsb2FkL3NyYy91c2VfbXBzczIudHh0CkBAIC0wLDAgKzEgQEAKKzIuMS42NzIwLTEzCmRpZmYgLS1naXQgYS9yYzMvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dCBiL3JjMy9vZmZsb2FkL3NyYy91c2VfbXBzc193aW4udHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk0OGY0ODMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvb2ZmbG9hZC9zcmMvdXNlX21wc3Nfd2luLnR4dApAQCAtMCwwICsxIEBACisyLjEuNjcyMC0xMwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQgYi9yYzMvcnVudGltZS9CdWlsZF9XaXRoX0NNYWtlLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZjExNGFjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvQnVpbGRfV2l0aF9DTWFrZS50eHQKQEAgLTAsMCArMSwyMjkgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeSB1c2luZyBDTWFrZQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9PT09IFZlcnNpb24gb2YgQ01ha2UgcmVxdWlyZWQ6IHYyLjguMCBvciBhYm92ZSA9PT09CisKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitIb3cgdG8gY2FsbCBjbWFrZSBpbml0aWFsbHksIHRoZW4gcmVwZWF0ZWRseQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKy0gV2hlbiBjYWxsaW5nIGNtYWtlIGZvciB0aGUgZmlyc3QgdGltZSwgYWxsIG5lZWRlZCBjb21waWxlciBvcHRpb25zCisgIG11c3QgYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUuICBBZnRlciB0aGlzIGluaXRpYWwgY2FsbCB0bworICBjbWFrZSwgdGhlIGNvbXBpbGVyIGRlZmluaXRpb25zIG11c3Qgbm90IGJlIGluY2x1ZGVkIGZvciBmdXJ0aGVyIGNhbGxzCisgIHRvIGNtYWtlLiAgT3RoZXIgb3B0aW9ucyBjYW4gYmUgc3BlY2lmaWVkIG9uIHRoZSBjb21tYW5kIGxpbmUgbXVsdGlwbGUKKyAgdGltZXMgaW5jbHVkaW5nIGFsbCBkZWZpbml0aW9ucyBpbiB0aGUgQnVpbGQgb3B0aW9ucyBzZWN0aW9uIGJlbG93LgorLSBFeGFtcGxlIG9mIGNvbmZpZ3VyaW5nLCBidWlsZGluZywgcmVjb25maWd1cmluZywgcmVidWlsZGluZzoKKyAgJCBta2RpciBidWlsZAorICAkIGNkIGJ1aWxkCisgICQgY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfQVJDSD1pMzg2IC4uICAjIEluaXRpYWwgY29uZmlndXJhdGlvbgorICAkIG1ha2UKKyAgLi4uCisgICQgbWFrZSBjbGVhbgorICAkIGNtYWtlIC1ETElCT01QX0FSQ0g9eDg2XzY0IC1EQ01BS0VfQlVJTERfVFlQRT1EZWJ1ZyAuLiAgICAgICAgICAgICAgICAgICAgICAgIyBTZWNvbmQgY29uZmlndXJhdGlvbgorICAkIG1ha2UKKyAgLi4uCisgICQgcm0gLXJmICoKKyAgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Z2NjIC1EQ01BS0VfQ1hYX0NPTVBJTEVSPWcrKyAtRExJQk9NUF9BUkNIPXg4Nl82NCAuLiAjIFRoaXJkIGNvbmZpZ3VyYXRpb24KKyAgJCBtYWtlCistIE5vdGljZSBpbiB0aGUgZXhhbXBsZSBob3cgdGhlIGNvbXBpbGVyIGRlZmluaXRpb25zIGFyZSBvbmx5IHNwZWNpZmllZAorICBmb3IgYW4gZW1wdHkgYnVpbGQgZGlyZWN0b3J5LCBidXQgb3RoZXIgQnVpbGQgb3B0aW9ucyBhcmUgdXNlZCBhdCBhbnkgdGltZS4KKy0gVGhlIGZpbGUgQ01ha2VDYWNoZS50eHQgd2hpY2ggaXMgY3JlYXRlZCBhZnRlciB0aGUgZmlyc3QgY2FsbCB0byBjbWFrZQorICBpcyBhIGNvbmZpZ3VyYXRpb24gZmlsZSB3aGljaCBob2xkcyBhbGwgdGhlIHZhbHVlcyBmb3IgdGhlIEJ1aWxkIG9wdGlvbnMuCisgIFRoZXNlIGNvbmZpZ3VyYXRpb24gdmFsdWVzIGNhbiBiZSBjaGFuZ2VkIHVzaW5nIGEgdGV4dCBlZGl0b3IgdG8gbW9kaWZ5CisgIENNYWtlQ2FjaGUudHh0IGFzIG9wcG9zZWQgdG8gdXNpbmcgZGVmaW5pdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZS4KKy0gVG8gaGF2ZSBjbWFrZSBjcmVhdGUgYSBwYXJ0aWN1bGFyIHR5cGUgb2YgYnVpbGQgZ2VuZXJhdG9yIGZpbGUgc2ltcGx5CisgIGlubHVkZSB0aGUgLUcgPEdlbmVyYXRvciBuYW1lPiBvcHRpb246CisgICQgY21ha2UgLUcgIlVuaXggTWFrZWZpbGVzIiAuLi4KKyAgWW91IGNhbiBzZWUgYSBsaXN0IG9mIGdlbmVyYXRvcnMgY21ha2Ugc3VwcG9ydHMgYnkgZXhlY3V0aW5nIGNtYWtlIHdpdGgKKyAgbm8gYXJndW1lbnRzIGFuZCBhIGxpc3Qgd2lsbCBiZSBwcmludGVkLgorCis9PT09PT09PT09PT09PT09PT09PT0KK0luc3RydWN0aW9ucyB0byBCdWlsZAorPT09PT09PT09PT09PT09PT09PT09CisgJCBjZCBsaWJvbXBfdG9wX2xldmVsLyBbIGRpcmVjdG9yeSB3aXRoIHNyYy8gLCBleHBvcnRzLyAsIHRvb2xzLyAsIGV0Yy4gXQorICQgbWtkaXIgYnVpbGQKKyAkIGNkIGJ1aWxkCisKKyBbIFVuaXgqIExpYnJhcmllcyBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC4uCisKKyBbIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIExpYnJhcnkgKEludGVsKFIpIE1JQyBMaWJyYXJ5KSBdCisgJCBjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9PEMgQ29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgQ29tcGlsZXI+IC1ETElCT01QX0FSQ0g9bWljIC4uCisKKyBbIFdpbmRvd3MgTGlicmFyaWVzIF0KKyAkIGNtYWtlIC1HIDxHZW5lcmF0b3IgVHlwZT4gLURDTUFLRV9DX0NPTVBJTEVSPTxDIENvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIENvbXBpbGVyPiAtRENNQUtFX0FTTV9NQVNNX0NPTVBJTEVSPVttbCB8IG1sNjRdIC1EQ01BS0VfQlVJTERfVFlQRT1SZWxlYXNlIC4uCisKKyAkIG1ha2UKKyAkIG1ha2UgaW5zdGFsbAorCis9PT09PT09PT09PT09PT09PT0KK01hYyogRmF0IExpYnJhcmllcworPT09PT09PT09PT09PT09PT09CitPbiBPUyBYKiBtYWNoaW5lcywgaXQgaXMgcG9zc2libGUgdG8gYnVpbGQgdW5pdmVyc2FsIChvciBmYXQpIGxpYnJhcmllcyB3aGljaAoraW5jbHVkZSBib3RoIGkzODYgYW5kIHg4Nl82NCBhcmNoaXRlY3R1cmUgb2JqZWN0cyBpbiBhCitzaW5nbGUgYXJjaGl2ZS4KKyAkIGNtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC1EQ01BS0VfT1NYX0FSQ0hJVEVDVFVSRVM9J2kzODY7eDg2XzY0JyAuLgorICQgbWFrZQorVGhlcmUgaXMgYWxzbyBhbiBvcHRpb24gLURMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgd2hpY2ggY2FuIGJlIHNldCBpbiBjYXNlCit0aGlzIGlzIGFuIExMVk0gc291cmNlIHRyZWUgYnVpbGQgd2hpY2ggd2lsbCBvbmx5IHNldCB0aGUgbGlib21wIGxpYnJhcnkKK3RvIGEgdW5pdmVyc2FsIGZhdCBsaWJyYXJ5IGFuZCBwcmV2ZW50IGhhdmluZyB0aGUgZW50aXJlIGxsdm0vY2xhbmcgYnVpbGQKK3Byb2R1Y2UgdW5pdmVyc2FsIGJpbmFyaWVzLgorCis9PT09PT09PT09PQorTWljcm8gdGVzdHMKKz09PT09PT09PT09CitBZnRlciB0aGUgbGlicmFyeSBoYXMgYmVlbiBidWlsdCwgdGhlcmUgYXJlIGZpdmUgb3B0aW9uYWwgbWljcm90ZXN0cyB0aGF0CitjYW4gYmUgcGVyZm9ybWVkLiAgU29tZSB3aWxsIGJlIHNraXBwZWQgYmFzZWQgdXBvbiB0aGUgcGxhdGZvcm0uCitUbyBydW4gdGhlIHRlc3RzLAorJCBtYWtlIGxpYm9tcC1taWNyby10ZXN0cworCis9PT09PT09PT09PT09CitDTWFrZSBvcHRpb25zCis9PT09PT09PT09PT09CistRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXIgbmFtZT4KK1NwZWNpZnkgdGhlIEMgY29tcGlsZXIKKworLURDTUFLRV9DWFhfQ09NUElMRVI9PEMrKyBjb21waWxlciBuYW1lPgorU3BlY2lmeSB0aGUgQysrIGNvbXBpbGVyCisKKy1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj08Rm9ydHJhbiBjb21waWxlciBuYW1lPgorVGhpcyBvcHRpb24gaXMgb25seSBuZWVkZWQgd2hlbiAtRExJQk9NUF9GT1JUUkFOX01PRFVMRVMgaXMgb24uCitTbyB0eXBpY2FsbHksIGEgRm9ydHJhbiBjb21waWxlciBpcyBub3QgbmVlZGVkIGR1cmluZyB0aGUgYnVpbGQuCitTcGVjaWZ5IHRoZSBGb3J0cmFuIGNvbXBpbGVyCisKKy1EQ01BS0VfQVNNX01BU01fQ09NUElMRVI9W21sIHwgbWw2NCBdCitUaGlzIG9wdGlvbiBpcyBXaW5kb3dzKiBPbmx5CisKKy1ETElCT01QX0FSQ0g9aTM4Nnx4ODZfNjR8YXJtfHBwYzY0fHBwYzY0bGV8YWFyY2g2NHxtaWMKK1RoZSBkZWZhdWx0IGZvciB0aGUgb3B0aW9uIGlzIGNob3NlbiBiYXNlZCBvbiB0aGUgcHJvYmluZyB0aGUgY29tcGlsZXIgZm9yCithcmNoaXRlY3R1cmUgbWFjcm9zIChlLmcuLCBpcyBfX3g4Nl82NF9fIHByZWRlZmluZWQgYnkgY29tcGlsZXI/KS4KKworPT09PSBGaXJzdCB2YWx1ZXMgbGlzdGVkIGFyZSB0aGUgZGVmYXVsdCB2YWx1ZSA9PT09CistRExJQk9NUF9MSUJfVFlQRT1ub3JtYWx8cHJvZmlsZXxzdHVicworTGlicmFyeSB0eXBlIGNhbiBiZSBub3JtYWwsIHByb2ZpbGUsIG9yIHN0dWJzLgorCistRENNQUtFX0JVSUxEX1RZUEU9UmVsZWFzZXxEZWJ1Z3xSZWxXaXRoRGViSW5mbworQnVpbGQgdHlwZSBjYW4gYmUgUmVsZWFzZSwgRGVidWcsIG9yIFJlbFdpdGhEZWJJbmZvLgorCistRExJQk9NUF9PTVBfVkVSU0lPTj00NXw0MHwzMAorT3Blbk1QIHZlcnNpb24gY2FuIGJlIGVpdGhlciA0NSwgNDAgb3IgMzAuCisKKy1ETElCT01QX01JQ19BUkNIPWtuY3xrbmYKK1RoaXMgdmFsdWUgaXMgaWdub3JlZCBpZiBMSUJPTVBfQVJDSCAhPSBtaWMKK0ludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUsIGNhbiBiZSBrbmYgb3Iga25jLgorCistRExJQk9NUF9GT1JUUkFOX01PRFVMRVM9b2ZmfG9uCitTaG91bGQgdGhlIEZvcnRyYW4gbW9kdWxlcyBiZSBjcmVhdGVkIChyZXF1aXJlcyBGb3J0cmFuIGNvbXBpbGVyKQorCistRExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1M9b258b2ZmCitTaG91bGQgYWRhcHRpdmUgKFRTWC1iYXNlZCkgbG9ja3MgYmUgaW5jbHVkZWQ/CitUaGVzZSBhcmUgeDg2IHNwZWNpZmljLiAgVGhpcyBmZWF0dXJlIGlzIHR1cm5lZCBvbiBieSBkZWZhdWx0Citmb3IgaTM4NiBhbmQgeDg2XzY0LiAgT3RoZXJ3aXNlLCBpdCBpcyB0dXJuZWQgb2ZmLgorCistRExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVD1vZmZ8b24KK1Nob3VsZCA0MDk2LWJ5dGUgYWxpZ25tZW50IGJlIHVzZWQgZm9yIGNlcnRhaW4gZGF0YSBzdHJ1Y3R1cmVzPworVGhpcyBvcHRpb24gaXMgdXNlZnVsIG9uIG11bHRpbm9kZSBzeXN0ZW1zIHdoZXJlIGEgc21hbGwgQ0FDSEVfTElORQorc2V0dGluZyBsZWFkcyB0byBmYWxzZSBzaGFyaW5nLiAgVGhpcyBvcHRpb24gaXMgb2ZmIGJ5IGRlZmF1bHQuCisKKy1ETElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFM9b258b2ZmCitTaG91bGQgdmVyc2lvbmVkIHN5bWJvbHMgYmUgdXNlZCBmb3IgYnVpbGRpbmcgdGhlIGxpYnJhcnk/CitUaGlzIG9wdGlvbiBvbmx5IG1ha2VzIHNlbnNlIGZvciBFTEYgYmFzZWQgbGlicmFyaWVzIHdoZXJlIHZlcnNpb24KK3N5bWJvbHMgYXJlIHN1cHBvcnRlZCAoTGludXgsIHNvbWUgQlNEKiB2YXJpYW50cykuICBJdCBpcyBvZmYKK2J5IGRlZmF1bHQgZm9yIFdpbmRvd3MgYW5kIE1hYywgYnV0IG9uIGZvciBvdGhlciBVbml4IGJhc2VkIG9wZXJhdGluZworc3lzdGVtcy4KKworLURMSUJPTVBfRU5BQkxFX1NIQVJFRD1vbnxvZmYKK1NoYXJlZCBsaWJyYXJ5IGluc3RlYWQgb2Ygc3RhdGljIGxpYnJhcnk/IChOb3RlOiBzdGF0aWMgbGlicmFyaWVzIGFyZSBub3QKK3N1cHBvcnRlZCBvbiBXaW5kb3dzKS4gSWYgTElCT01QX0VOQUJMRV9TSEFSRUQgaXMgb2ZmLCB0aGVuIHN0YXRpYyBPcGVuTVAKK2xpYnJhcmllcyB3aWxsIGJlIGJ1aWx0IGluc3RlYWQgb2YgZHluYW1pYyBvbmVzLgorCistRExJQk9NUF9PTVBUX1NVUFBPUlQ9b2ZmfG9uCitTaG91bGQgT01QVCBzdXBwb3J0IGJlIGluY2x1ZGVkIGluIHRoZSBidWlsZD8gKE5vdCBzdXBwb3J0ZWQgb24gV2luZG93cykKK0lmIExJQk9NUF9PTVBUX1NVUFBPUlQgaXMgb2ZmLCB0aGVuIGJvdGggb21wdF9ibGFtZSBhbmQgb21wdF90cmFjZSBhcmUgaWdub3JlZC4KKworLURMSUJPTVBfT01QVF9CTEFNRT1vbnxvZmYKK1Nob3VsZCBPTVBUIGJsYW1lIGZ1bmN0aW9uYWxpdHkgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkPworCistRExJQk9NUF9PTVBUX1RSQUNFPW9ufG9mZgorU2hvdWxkIE9NUFQgdHJhY2UgZnVuY3Rpb25hbGl0eSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX1NUQVRTPW9mZnxvbgorU2hvdWxkIGluY2x1ZGUgc3RhdHMtZ2F0aGVyaW5nIGNvZGUgYmUgaW5jbHVkZWQgaW4gdGhlIGJ1aWxkPworCistRExJQk9NUF9VU0VfREVCVUdHRVI9b2ZmfG9uCitTaG91bGQgdGhlIGZyaWVuZGx5IGRlYnVnZ2VyIGludGVyZmFjZSBiZSBpbmNsdWRlZCBpbiB0aGUgYnVpbGQ/CisKKy1ETElCT01QX1VTRV9IV0xPQz1vZmZ8b24KK1Nob3VsZCB0aGUgSHdsb2MgbGlicmFyeSBiZSB1c2VkIGZvciBhZmZpbml0eT8KK1RoaXMgb3B0aW9uIGlzIG5vdCBzdXBwb3J0ZWQgb24gV2luZG93cy4KK2h0dHA6Ly93d3cub3Blbi1tcGkub3JnL3Byb2plY3RzL2h3bG9jCisKKy1ETElCT01QX0hXTE9DX0lOU1RBTExfRElSPS9wYXRoL3RvL2h3bG9jL2luc3RhbGwvZGlyCitEZWZhdWx0OiAvdXNyL2xvY2FsCitUaGlzIG9wdGlvbiBpcyBvbmx5IHVzZWQgaWYgTElCT01QX1VTRV9IV0xPQyBpcyBvbi4KK1NwZWNpZmllcyBpbnN0YWxsIGxvY2F0aW9uIG9mIEh3bG9jLiBUaGUgY29uZmlndXJhdGlvbiBzeXN0ZW0gd2lsbCBsb29rIGZvcgoraHdsb2MuaCBpbiAke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vaW5jbHVkZSBhbmQgdGhlIGxpYnJhcnkgaW4KKyR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9saWIuCisKKy1ETElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEU9L3BhdGgvdG8vbGx2bS1saXQKK0RlZmF1bHQ6IHNlYXJjaCBpbiBQQVRICitTcGVjaWZpeSBmdWxsIHBhdGggdG8gbGx2bS1saXQgZXhlY3V0YWJsZSBmb3IgcnVubmluZyB0ZXN0cy4KKworLURPUEVOTVBfTExWTV9UT09MU19ESVI9L3BhdGgvdG8vYnVpbHQvbGx2bS90b29scworRGVmYXVsdDogc2VhcmNoIGZvciB0b29scyBpbiBwYXRoCitBZGRpdGlvbmFsIHBhdGggdG8gc2VhcmNoIGZvciBMTFZNIHRvb2xzIG5lZWRlZCBieSB0ZXN0cy4KKworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KK0hvdyB0byBhcHBlbmQgZmxhZ3MgdG8gdGhlIGJ1aWxkCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLSBUaGVzZSBmbGFncyBhcmUgKmFwcGVuZGVkKi4gIFRoZXkgZG8gbm90CisgIG92ZXJ3cml0ZSBhbnkgb2YgdGhlIHByZXNldCBmbGFncy4KKy1ETElCT01QX0NQUEZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgQyBwcmVwcm9jZXNzb3IgZmxhZ3MKKy1ETElCT01QX0NGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAgIC0tIEFkZGl0aW9uYWwgQyBjb21waWxlciBmbGFncworLURMSUJPTVBfQ1hYRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gLS0gQWRkaXRpb25hbCBDKysgY29tcGlsZXIgZmxhZ3MKKy1ETElCT01QX0FTTUZMQUdTPTxzcGFjZS1zZXBhcmF0ZWQgZmxhZ3M+IC0tIEFkZGl0aW9uYWwgYXNzZW1ibHkgZmxhZ3MKKy1ETElCT01QX0xERkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gIC0tIEFkZGl0aW9uYWwgbGlua2VyIGZsYWdzCistRExJQk9NUF9MSUJGTEFHUz08c3BhY2Utc2VwYXJhdGVkIGZsYWdzPiAtLSBBZGRpdGlvbmFsIGxpYnJhcmllcyB0byBsaW5rCistRExJQk9NUF9GRkxBR1M9PHNwYWNlLXNlcGFyYXRlZCBmbGFncz4gICAtLSBBZGRpdGlvbmFsIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MKKworPT09PT09PT09PT09PT09PT09PT09PT0KK0V4YW1wbGUgdXNhZ2VzIG9mIENNYWtlCis9PT09PT09PT09PT09PT09PT09PT09PQorLS0tLSBUeXBpY2FsIHVzYWdlIC0tLS0KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1pY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9aWNwYyAuLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLi4KK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1jbGFuZyAtRENNQUtFX0NYWF9DT01QSUxFUj1jbGFuZysrIC4uCisKKy0tLS0gV2l0aCBWYXJpb3VzIE9wdGlvbnMgLS0tLQorLSBCdWlsZCB0aGUgaTM4NiBMaW51eCBsaWJyYXJ5IHVzaW5nIEdDQyoKK2NtYWtlIC1EQ01BS0VfQ19DT01QSUxFUj1nY2MgLURDTUFLRV9DWFhfQ09NUElMRVI9ZysrIC1ETElCT01QX0FSQ0g9aTM4NiAuLgorCistIEJ1aWxkIHRoZSB4ODZfNjQgZGVidWcgTWFjIGxpYnJhcnkgdXNpbmcgQ2xhbmcqCitjbWFrZSAtRENNQUtFX0NfQ09NUElMRVI9Y2xhbmcgLURDTUFLRV9DWFhfQ09NUElMRVI9Y2xhbmcrKyAtRExJQk9NUF9BUkNIPXg4Nl82NCAtRENNQUtFX0JVSUxEX1RZUEU9RGVidWcgLi4KKworLSBCdWlsZCB0aGUgbGlicmFyeSAoYXJjaGl0ZWN0dXJlIGRldGVybWluZWQgYnkgcHJvYmluZyBjb21waWxlcikgdXNpbmcgdGhlCisgIEludGVsKFIpIEMgQ29tcGlsZXIgYW5kIHRoZSBJbnRlbChSKSBDKysgQ29tcGlsZXIuIEFsc28sIGNyZWF0ZSB0aGUgZm9ydHJhbiBtb2R1bGVzIHVzaW5nCisgIHRoZSBJbnRlbChSKSBGb3J0cmFuIENvbXBpbGVyLgorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWljYyAtRENNQUtFX0NYWF9DT01QSUxFUj1pY3BjIC1EQ01BS0VfRm9ydHJhbl9DT01QSUxFUj1pZm9ydCAtRExJQk9NUF9GT1JUUkFOX01PRFVMRVM9b24gLi4KKworLSBIYXZlIENNYWtlIEZpbmQgdGhlIEMvQysrIGNvbXBpbGVyLCBhbmQgc3BlY2lmeSBhZGRpdGlvbmFsIGZsYWdzIGZvciB0aGUgQyBjb21waWxlciwgcHJlcHJvY2Vzc29yLCBhbmQgQysrIGNvbXBpbGVyLgorY21ha2UgLURMSUJPTVBfQ0ZMQUdTPSctc3BlY2lmaWMtZmxhZycgLURMSUJPTVBfQ1BQRkxBR1M9Jy1ETkVXX0ZFQVRVUkU9MSAtRE9MRF9GRUFUVVJFPTAnIC1ETElCT01QX0NYWEZMQUdTPSctLW9uZS1zcGVjaWZpYy1mbGFnIC0tdHdvLXNwZWNpZmljLWZsYWcnIC4uCisKKy0tLS0gQnVpbGQgdGhlIHN0dWJzIGxpYnJhcnkgLS0tLQorY21ha2UgLURDTUFLRV9DX0NPTVBJTEVSPWdjYyAtRENNQUtFX0NYWF9DT01QSUxFUj1nKysgLURMSUJPTVBfTElCX1RZUEU9c3R1YnMgLi4KKworPT09PT09PT09CitGb290bm90ZXMKKz09PT09PT09PQorWypdIE90aGVyIG5hbWVzIGFuZCBicmFuZHMgbWF5IGJlIGNsYWltZWQgYXMgdGhlIHByb3BlcnR5IG9mIG90aGVycy4KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL0NNYWtlTGlzdHMudHh0IGIvcmMzL3J1bnRpbWUvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc1OTlmNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL0NNYWtlTGlzdHMudHh0CkBAIC0wLDAgKzEsMzc1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ01BS0UgbGlib21wCitjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44IEZBVEFMX0VSUk9SKQorCisjIEFkZCBjbWFrZSBkaXJlY3RvcnkgdG8gc2VhcmNoIGZvciBjdXN0b20gY21ha2UgZnVuY3Rpb25zCitzZXQoQ01BS0VfTU9EVUxFX1BBVEggJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9L2NtYWtlICR7Q01BS0VfTU9EVUxFX1BBVEh9KQorCisjIFN0YW5kYWxvbmUgYnVpbGQgb3IgcGFydCBvZiBMTFZNPworc2V0KExJQk9NUF9TVEFOREFMT05FX0JVSUxEIEZBTFNFKQoraWYoIiR7Q01BS0VfU09VUkNFX0RJUn0iIFNUUkVRVUFMICIke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0iIE9SCisgICAiJHtDTUFLRV9TT1VSQ0VfRElSfS9ydW50aW1lIiBTVFJFUVVBTCAiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IikKKyAgcHJvamVjdChsaWJvbXAgQyBDWFgpCisgIHNldChMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRCBUUlVFKQorZW5kaWYoKQorCisjIFNldCBsaWJvbXAgdmVyc2lvbgorc2V0KExJQk9NUF9WRVJTSU9OX01BSk9SIDUpCitzZXQoTElCT01QX1ZFUlNJT05fTUlOT1IgMCkKKworIyBUaGVzZSBpbmNsdWRlIGZpbGVzIGFyZSBpbiB0aGUgY21ha2UvIHN1YmRpcmVjdG9yeQoraW5jbHVkZShMaWJvbXBVdGlscykKK2luY2x1ZGUoTGlib21wR2V0QXJjaGl0ZWN0dXJlKQoraW5jbHVkZShMaWJvbXBIYW5kbGVGbGFncykKK2luY2x1ZGUoTGlib21wRGVmaW5pdGlvbnMpCisKKyMgRGV0ZXJtaW5lIHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgIyBJZiBhZGRpbmcgYSBuZXcgYXJjaGl0ZWN0dXJlLCB0YWtlIGEgbG9vayBhdCBjbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UKKyAgbGlib21wX2dldF9hcmNoaXRlY3R1cmUoTElCT01QX0RFVEVDVEVEX0FSQ0gpCisgIHNldChMSUJPTVBfQVJDSCAke0xJQk9NUF9ERVRFQ1RFRF9BUkNIfSBDQUNIRSBTVFJJTkcKKyAgICAiVGhlIGFyY2hpdGVjdHVyZSB0byBidWlsZCBmb3IgKHg4Nl82NC9pMzg2L2FybS9wcGM2NC9wcGM2NGxlL2FhcmNoNjQvbWljKS4iKQorICAjIEFsbG93IHVzZXIgdG8gY2hvb3NlIGEgc3VmZml4IGZvciB0aGUgaW5zdGFsbGF0aW9uIGRpcmVjdG9yeS4KKyAgc2V0KExJQk9NUF9MSUJESVJfU1VGRklYICIiIENBQ0hFIFNUUklORworICAgICJzdWZmaXggb2YgbGliIGluc3RhbGxhdGlvbiBkaXJlY3RvcnkgZS5nLiwgNjQgPT4gbGliNjQiKQorICAjIFNob3VsZCBhc3NlcnRpb25zIGJlIGVuYWJsZWQ/ICBUaGV5IGFyZSBvbiBieSBkZWZhdWx0LgorICBzZXQoTElCT01QX0VOQUJMRV9BU1NFUlRJT05TIFRSVUUgQ0FDSEUgQk9PTAorICAgICJlbmFibGUgYXNzZXJ0aW9ucz8iKQorICBzZXQoTElCT01QX0VOQUJMRV9XRVJST1IgRkFMU0UgQ0FDSEUgQk9PTAorICAgICJFbmFibGUgLVdlcnJvciBmbGFncyB0byB0dXJuIHdhcm5pbmdzIGludG8gZXJyb3JzIGZvciBzdXBwb3J0aW5nIGNvbXBpbGVycy4iKQorICAjIENNQUtFX0JVSUxEX1RZUEUgd2FzIG5vdCBkZWZpbmVkLCBzZXQgZGVmYXVsdCB0byBSZWxlYXNlCisgIGlmKE5PVCBDTUFLRV9CVUlMRF9UWVBFKQorICAgIHNldChDTUFLRV9CVUlMRF9UWVBFIFJlbGVhc2UpCisgIGVuZGlmKCkKK2Vsc2UoKSAjIFBhcnQgb2YgTExWTSBidWlsZAorICAjIERldGVybWluZSB0aGUgbmF0aXZlIGFyY2hpdGVjdHVyZSBmcm9tIExMVk0uCisgIHN0cmluZyhUT0xPV0VSICIke0xMVk1fVEFSR0VUX0FSQ0h9IiBMSUJPTVBfTkFUSVZFX0FSQ0gpCisgIGlmKCBMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgImhvc3QiICkKKyAgICBzdHJpbmcoUkVHRVggTUFUQ0ggIl5bXi1dKiIgTElCT01QX05BVElWRV9BUkNIICR7TExWTV9IT1NUX1RSSVBMRX0pCisgIGVuZGlmICgpCisgIGlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJpWzItNl04NiIpCisgICAgc2V0KExJQk9NUF9BUkNIIGkzODYpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgIng4NiIpCisgICAgc2V0KExJQk9NUF9BUkNIIGkzODYpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggU1RSRVFVQUwgImFtZDY0IikKKyAgICBzZXQoTElCT01QX0FSQ0ggeDg2XzY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIFNUUkVRVUFMICJ4ODZfNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCB4ODZfNjQpCisgIGVsc2VpZihMSUJPTVBfTkFUSVZFX0FSQ0ggTUFUQ0hFUyAicG93ZXJwYyIpCisgICAgc2V0KExJQk9NUF9BUkNIIHBwYzY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImFhcmNoNjQiKQorICAgIHNldChMSUJPTVBfQVJDSCBhYXJjaDY0KQorICBlbHNlaWYoTElCT01QX05BVElWRV9BUkNIIE1BVENIRVMgImFybTY0IikKKyAgICBzZXQoTElCT01QX0FSQ0ggYWFyY2g2NCkKKyAgZWxzZWlmKExJQk9NUF9OQVRJVkVfQVJDSCBNQVRDSEVTICJhcm0iKQorICAgIHNldChMSUJPTVBfQVJDSCBhcm0pCisgIGVsc2UoKQorICAgICMgbGFzdCBkaXRjaCBlZmZvcnQKKyAgICBsaWJvbXBfZ2V0X2FyY2hpdGVjdHVyZShMSUJPTVBfQVJDSCkKKyAgZW5kaWYgKCkKKyAgc2V0KExJQk9NUF9MSUJESVJfU1VGRklYICR7TExWTV9MSUJESVJfU1VGRklYfSkKKyAgc2V0KExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUyAke0xMVk1fRU5BQkxFX0FTU0VSVElPTlN9KQorICBzZXQoTElCT01QX0VOQUJMRV9XRVJST1IgJHtMTFZNX0VOQUJMRV9XRVJST1J9KQorZW5kaWYoKQorbGlib21wX2NoZWNrX3ZhcmlhYmxlKExJQk9NUF9BUkNIIDMyZSB4ODZfNjQgMzIgaTM4NiBhcm0gcHBjNjQgcHBjNjRsZSBhYXJjaDY0IG1pYykKKworc2V0KExJQk9NUF9MSUJfVFlQRSBub3JtYWwgQ0FDSEUgU1RSSU5HCisgICJQZXJmb3JtYW5jZSxQcm9maWxpbmcsU3R1YnMgbGlicmFyeSAobm9ybWFsL3Byb2ZpbGUvc3R1YnMpIikKK2xpYm9tcF9jaGVja192YXJpYWJsZShMSUJPTVBfTElCX1RZUEUgbm9ybWFsIHByb2ZpbGUgc3R1YnMpCitzZXQoTElCT01QX09NUF9WRVJTSU9OIDQ1IENBQ0hFIFNUUklORworICAiVGhlIE9wZW5NUCB2ZXJzaW9uICg0NS80MC8zMCkiKQoraWYoTElCT01QX09NUF9WRVJTSU9OIEVRVUFMIDQxKQorICBsaWJvbXBfd2FybmluZ19zYXkoIkxJQk9NUF9PTVBfVkVSU0lPTj00MSBpcyBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBsYXRlciB2ZXJzaW9uLiBQbGVhc2UgdXNlIDQ1LiIpCisgIHNldChMSUJPTVBfT01QX1ZFUlNJT04gNDUpCitlbmRpZigpCitsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX09NUF9WRVJTSU9OIDQ1IDQwIDMwKQorIyBTZXQgdGhlIE9wZW5NUCBZZWFyIGFuZCBNb250aCBhc3Npb2NpYXRlZCB3aXRoIHZlcnNpb24KK2lmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDQwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCA0MCkKKyAgc2V0KExJQk9NUF9PTVBfWUVBUl9NT05USCAyMDEzMDcpCitlbHNlaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgMzAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDMwKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMTEwNykKK2Vsc2UoKQorICBzZXQoTElCT01QX09NUF9ZRUFSX01PTlRIIDIwMDUwNSkKK2VuZGlmKCkKK3NldChMSUJPTVBfTUlDX0FSQ0gga25jIENBQ0hFIFNUUklORworICAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIChJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlKSAoa25mL2tuYykuICBJZ25vcmVkIGlmIG5vdCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkLiIpCitpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJtaWMiKQorICBsaWJvbXBfY2hlY2tfdmFyaWFibGUoTElCT01QX01JQ19BUkNIIGtuZiBrbmMpCitlbmRpZigpCitzZXQoTElCT01QX0ZPUlRSQU5fTU9EVUxFUyBGQUxTRSBDQUNIRSBCT09MCisgICJDcmVhdGUgRm9ydHJhbiBtb2R1bGUgZmlsZXM/IChyZXF1aXJlcyBmb3J0cmFuIGNvbXBpbGVyKSIpCisKKyMgLSBTdXBwb3J0IGZvciB1bml2ZXJzYWwgZmF0IGJpbmFyeSBidWlsZHMgb24gTWFjCisjIC0gSGF2aW5nIHRoaXMgZXh0cmEgdmFyaWFibGUgYWxsb3dzIHBlb3BsZSB0byBidWlsZCB0aGlzIGxpYnJhcnkgYXMgYSB1bml2ZXJzYWwgbGlicmFyeQorIyAgIHdpdGhvdXQgZm9yY2luZyBhIHVuaXZlcnNhbCBidWlsZCBvZiB0aGUgbGx2bS9jbGFuZyBjb21waWxlci4KK3NldChMSUJPTVBfT1NYX0FSQ0hJVEVDVFVSRVMgIiR7Q01BS0VfT1NYX0FSQ0hJVEVDVFVSRVN9IiBDQUNIRSBTVFJJTkcKKyAgIkZvciBNYWMgYnVpbGRzLCBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3Qgb2YgYXJjaGl0ZWN0dXJlcyB0byBidWlsZCBmb3IgdW5pdmVyc2FsIGZhdCBiaW5hcnkuIikKK3NldChDTUFLRV9PU1hfQVJDSElURUNUVVJFUyAke0xJQk9NUF9PU1hfQVJDSElURUNUVVJFU30pCisKKyMgU2hvdWxkIEBycGF0aCBiZSB1c2VkIGZvciBkeW5hbWljIGxpYnJhcmllcyBvbiBNYWM/CisjIFRoZSBpZihOT1QgREVGSU5FRCkgaXMgdGhlcmUgdG8gZ3VhcmQgYSBjYWNoZWQgdmFsdWUgb2YgdGhlIHZhcmlhYmxlIGlmIG9uZQorIyBleGlzdHMgc28gdGhlcmUgaXMgbm8gaW50ZXJmZXJlbmNlIHdpdGggd2hhdCB0aGUgdXNlciB3YW50cy4gIEFsc28sIG5vIGNhY2hlIGVudHJ5CisjIGlzIGNyZWF0ZWQgc28gdGhlcmUgYXJlIG5vIGluYWR2ZXJ0YW50IGVmZmVjdHMgb24gb3RoZXIgcGFydHMgb2YgTExWTS4KK2lmKE5PVCBERUZJTkVEIENNQUtFX01BQ09TWF9SUEFUSCkKKyAgc2V0KENNQUtFX01BQ09TWF9SUEFUSCBUUlVFKQorZW5kaWYoKQorCisjIFVzZXIgc3BlY2lmaWVkIGZsYWdzLiAgVGhlc2UgYXJlIGFwcGVuZGVkIHRvIHRoZSBjb25maWd1cmVkIGZsYWdzLgorc2V0KExJQk9NUF9DRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBDIGNvbXBpbGVyIGZsYWdzLiIpCitzZXQoTElCT01QX0NYWEZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQysrIGNvbXBpbGVyIGZsYWdzLiIpCitzZXQoTElCT01QX0NQUEZMQUdTICIiIENBQ0hFIFNUUklORworICAiQXBwZW5kZWQgdXNlciBzcGVjaWZpZWQgQyBwcmVwcm9jZXNzb3IgZmxhZ3MuIikKK3NldChMSUJPTVBfQVNNRkxBR1MgIiIgQ0FDSEUgU1RSSU5HCisgICJBcHBlbmRlZCB1c2VyIHNwZWNpZmllZCBhc3NlbWJsZXIgZmxhZ3MuIikKK3NldChMSUJPTVBfTERGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGxpbmtlciBmbGFncy4iKQorc2V0KExJQk9NUF9MSUJGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIGxpbmtlZCBsaWJzIGZsYWdzLiAoZS5nLiwgLWxtKSIpCitzZXQoTElCT01QX0ZGTEFHUyAiIiBDQUNIRSBTVFJJTkcKKyAgIkFwcGVuZGVkIHVzZXIgc3BlY2lmaWVkIEZvcnRyYW4gY29tcGlsZXIgZmxhZ3MuICBUaGVzZSBhcmUgb25seSB1c2VkIGlmIExJQk9NUF9GT1JUUkFOX01PRFVMRVM9PVRSVUUuIikKKworIyBTaG91bGQgdGhlIGxpYm9tcCBsaWJyYXJ5IGFuZCBnZW5lcmF0ZWQgaGVhZGVycyBiZSBjb3BpZWQgaW50byB0aGUgb3JpZ2luYWwgc291cmNlIGV4cG9ydHMvIGRpcmVjdG9yeQorIyBUdXJuaW5nIHRoaXMgdG8gRkFMU0UgYWlkcyBwYXJhbGxlbCBidWlsZHMgdG8gbm90IGludGVyZmVyZSB3aXRoIGVhY2ggb3RoZXIuCisjIEN1cnJlbnRseSwgdGhlIHRlc3RzdWl0ZSBtb2R1bGUgZXhwZWN0cyB0aGUganVzdCBidWlsdCBPcGVuTVAgbGlicmFyeSB0byBiZSBsb2NhdGVkIGluc2lkZSB0aGUgZXhwb3J0cy8KKyMgZGlyZWN0b3J5LiAgVE9ETzogaGF2ZSB0ZXN0c3VpdGUgcnVuIHVuZGVyIGxsdm0tbGl0IGRpcmVjdGx5LiAgV2UgY2FuIHRoZW4gZ2V0IHJpZCBvZiBjb3B5aW5nIHRvIGV4cG9ydHMvCitzZXQoTElCT01QX0NPUFlfRVhQT1JUUyBUUlVFIENBQ0hFIFNUUklORworICAiU2hvdWxkIGV4cG9ydHMgYmUgY29waWVkIGludG8gc291cmNlIGV4cG9ydHMvIGRpcmVjdG9yeT8iKQorCisjIEhXTE9DLXN1cHBvcnQKK3NldChMSUJPTVBfVVNFX0hXTE9DIEZBTFNFIENBQ0hFIEJPT0wKKyAgIlVzZSBId2xvYyAoaHR0cDovL3d3dy5vcGVuLW1waS5vcmcvcHJvamVjdHMvaHdsb2MvKSBsaWJyYXJ5IGZvciBhZmZpbml0eT8iKQorc2V0KExJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUiAvdXNyL2xvY2FsIENBQ0hFIFBBVEgKKyAgIkluc3RhbGwgcGF0aCBmb3IgaHdsb2MgbGlicmFyeSIpCisKKyMgR2V0IHRoZSBidWlsZCBudW1iZXIgZnJvbSBrbXBfdmVyc2lvbi5jCitsaWJvbXBfZ2V0X2J1aWxkX251bWJlcigiJHtDTUFLRV9DVVJSRU5UX1NPVVJDRV9ESVJ9IiBMSUJPTVBfVkVSU0lPTl9CVUlMRCkKK21hdGgoRVhQUiBMSUJPTVBfVkVSU0lPTl9CVUlMRF9ZRUFSICIke0xJQk9NUF9WRVJTSU9OX0JVSUxEfS8xMDAwMCIpCittYXRoKEVYUFIgTElCT01QX1ZFUlNJT05fQlVJTERfTU9OVEhfREFZICIke0xJQk9NUF9WRVJTSU9OX0JVSUxEfSUxMDAwMCIpCisKKyMgQ3VycmVudGx5IGRvbid0IHJlY29yZCBhbnkgdGltZXN0YW1wcworc2V0KExJQk9NUF9CVUlMRF9EQVRFICJOb19UaW1lc3RhbXAiKQorCisjIEFyY2hpdGVjdHVyZQorc2V0KElBMzIgRkFMU0UpCitzZXQoSU5URUw2NCBGQUxTRSkKK3NldChBUk0gRkFMU0UpCitzZXQoQUFSQ0g2NCBGQUxTRSkKK3NldChQUEM2NEJFIEZBTFNFKQorc2V0KFBQQzY0TEUgRkFMU0UpCitzZXQoUFBDNjQgRkFMU0UpCitzZXQoTUlDIEZBTFNFKQoraWYoIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiaTM4NiIgT1IgIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiMzIiKSAgICAjIElBLTMyIGFyY2hpdGVjdHVyZQorICBzZXQoSUEzMiBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgIng4Nl82NCIgT1IgIiR7TElCT01QX0FSQ0h9IiBTVFJFUVVBTCAiMzJlIikgIyBJbnRlbChSKSA2NCBhcmNoaXRlY3R1cmUKKyAgc2V0KElOVEVMNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJhcm0iKSAjIEFSTSBhcmNoaXRlY3R1cmUKKyAgc2V0KEFSTSBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgInBwYzY0IikgIyBQUEM2NEJFIGFyY2hpdGVjdHVyZQorICBzZXQoUFBDNjRCRSBUUlVFKQorICBzZXQoUFBDNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJwcGM2NGxlIikgIyBQUEM2NExFIGFyY2hpdGVjdHVyZQorICBzZXQoUFBDNjRMRSBUUlVFKQorICBzZXQoUFBDNjQgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfQVJDSH0iIFNUUkVRVUFMICJhYXJjaDY0IikgIyBBQVJDSDY0IGFyY2hpdGVjdHVyZQorICBzZXQoQUFSQ0g2NCBUUlVFKQorZWxzZWlmKCIke0xJQk9NUF9BUkNIfSIgU1RSRVFVQUwgIm1pYyIpICMgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisgIHNldChNSUMgVFJVRSkKK2VuZGlmKCkKKworIyBTZXQgc29tZSBmbGFncyBiYXNlZCBvbiBidWlsZF90eXBlCitzZXQoUkVMRUFTRV9CVUlMRCBGQUxTRSkKK3NldChERUJVR19CVUlMRCBGQUxTRSkKK3NldChSRUxXSVRIREVCSU5GT19CVUlMRCBGQUxTRSkKK3NldChNSU5TSVpFUkVMX0JVSUxEIEZBTFNFKQorc3RyaW5nKFRPTE9XRVIgIiR7Q01BS0VfQlVJTERfVFlQRX0iIGxpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZSkKK2lmKCIke2xpYm9tcF9idWlsZF90eXBlX2xvd2VyY2FzZX0iIFNUUkVRVUFMICJyZWxlYXNlIikKKyAgc2V0KFJFTEVBU0VfQlVJTEQgVFJVRSkKK2Vsc2VpZigiJHtsaWJvbXBfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAiZGVidWciKQorICBzZXQoREVCVUdfQlVJTEQgVFJVRSkKK2Vsc2VpZigiJHtsaWJvbXBfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAicmVsd2l0aGRlYmluZm8iKQorICBzZXQoUkVMV0lUSERFQklORk9fQlVJTEQgVFJVRSkKK2Vsc2VpZigiJHtsaWJvbXBfYnVpbGRfdHlwZV9sb3dlcmNhc2V9IiBTVFJFUVVBTCAibWluc2l6ZXJlbCIpCisgIHNldChNSU5TSVpFUkVMX0JVSUxEIFRSVUUpCitlbmRpZigpCisKKyMgSW5jbHVkZSBpdHQgbm90aWZ5IGludGVyZmFjZT8KK3NldChMSUJPTVBfVVNFX0lUVF9OT1RJRlkgVFJVRSBDQUNIRSBCT09MCisgICJFbmFibGUgSVRUIG5vdGlmeT8iKQorCisjIG5vcm1hbCwgcHJvZmlsZSwgc3R1YnMgbGlicmFyeS4KK3NldChOT1JNQUxfTElCUkFSWSBGQUxTRSkKK3NldChTVFVCU19MSUJSQVJZIEZBTFNFKQorc2V0KFBST0ZJTEVfTElCUkFSWSBGQUxTRSkKK2lmKCIke0xJQk9NUF9MSUJfVFlQRX0iIFNUUkVRVUFMICJub3JtYWwiKQorICBzZXQoTk9STUFMX0xJQlJBUlkgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfTElCX1RZUEV9IiBTVFJFUVVBTCAicHJvZmlsZSIpCisgIHNldChQUk9GSUxFX0xJQlJBUlkgVFJVRSkKK2Vsc2VpZigiJHtMSUJPTVBfTElCX1RZUEV9IiBTVFJFUVVBTCAic3R1YnMiKQorICBzZXQoU1RVQlNfTElCUkFSWSBUUlVFKQorZW5kaWYoKQorCisjIFNldHRpbmcgZGlyZWN0b3J5IG5hbWVzCitzZXQoTElCT01QX0JBU0VfRElSICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfSkKK3NldChMSUJPTVBfU1JDX0RJUiAke0xJQk9NUF9CQVNFX0RJUn0vc3JjKQorc2V0KExJQk9NUF9UT09MU19ESVIgJHtMSUJPTVBfQkFTRV9ESVJ9L3Rvb2xzKQorc2V0KExJQk9NUF9JTkNfRElSICR7TElCT01QX1NSQ19ESVJ9L2luY2x1ZGUvJHtMSUJPTVBfT01QX1ZFUlNJT059KQorc2V0KExJQk9NUF9CSU5BUllfRElSICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKworIyBFbmFibGluZyBGb3J0cmFuIGlmIGl0IGlzIG5lZWRlZAoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgZW5hYmxlX2xhbmd1YWdlKEZvcnRyYW4pCitlbmRpZigpCisjIEVuYWJsZSBNQVNNIENvbXBpbGVyIGlmIGl0IGlzIG5lZWRlZCAoV2luZG93cyBvbmx5KQoraWYoV0lOMzIpCisgIGVuYWJsZV9sYW5ndWFnZShBU01fTUFTTSkKK2VuZGlmKCkKKworIyBHZXR0aW5nIGxlZ2FsIHR5cGUvYXJjaAorbGlib21wX2dldF9sZWdhbF90eXBlKExJQk9NUF9MRUdBTF9UWVBFKQorbGlib21wX2dldF9sZWdhbF9hcmNoKExJQk9NUF9MRUdBTF9BUkNIKQorCisjIENvbXBpbGVyIGZsYWcgY2hlY2tzLCBsaWJyYXJ5IGNoZWNrcywgdGhyZWFkaW5nIGNoZWNrLCBldGMuCitpbmNsdWRlKGNvbmZpZy1peCkKKworIyBJcyB0aGVyZSBhIHF1YWQgcHJlY2lzaW9uIGRhdGEgdHlwZSBhdmFpbGFibGU/CisjIFRPRE86IE1ha2UgdGhpcyBhIHJlYWwgZmVhdHVyZSBjaGVjaworc2V0KExJQk9NUF9VU0VfUVVBRF9QUkVDSVNJT04gIiR7TElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT059IiBDQUNIRSBCT09MCisgICJTaG91bGQgMTI4LWJpdCBwcmVjaXNpb24gZW50cnkgcG9pbnRzIGJlIGJ1aWx0PyIpCitpZihMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OIEFORCAoTk9UIExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OKSkKKyAgbGlib21wX2Vycm9yX3NheSgiMTI4LWJpdCBxdWFkIHByZWNpc2lvbiBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgbGliZ29tcCBkcm9wLWluIGNvbXBhdGliaWxpdHkgcmVxdWlyZXMgdmVyc2lvbmVkIHN5bWJvbHMKK3NldChMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUyAiJHtMSUJPTVBfSEFWRV9WRVJTSU9OX1NZTUJPTFN9IiBDQUNIRSBCT09MCisgICJTaG91bGQgdmVyc2lvbiBzeW1ib2xzIGJlIHVzZWQ/IFRoZXNlIHByb3ZpZGUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBsaWJnb21wLiIpCitpZihMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9WRVJTSU9OX1NZTUJPTFMpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJWZXJzaW9uIHN5bWJvbHMgZnVuY3Rpb25hbGl0eSByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUiKQorZW5kaWYoKQorCisjIE9uIG11bHRpbm9kZSBzeXN0ZW1zLCBsYXJnZXIgYWxpZ25tZW50IGlzIGRlc2lyZWQgdG8gYXZvaWQgZmFsc2Ugc2hhcmluZworc2V0KExJQk9NUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVCBGQUxTRSBDQUNIRSBCT09MCisgICJTaG91bGQgbGFyZ2VyIGFsaWdubWVudCAoNDA5NiBieXRlcykgYmUgdXNlZCBmb3Igc29tZSBsb2NrcyBhbmQgZGF0YSBzdHJ1Y3R1cmVzPyIpCisKKyMgQnVpbGQgY29kZSB0aGF0IGFsbG93cyB0aGUgT3Blbk1QIGxpYnJhcnkgdG8gY29udmVuaWVudGx5IGludGVyZmFjZSB3aXRoIGRlYnVnZ2Vycworc2V0KExJQk9NUF9VU0VfREVCVUdHRVIgRkFMU0UgQ0FDSEUgQk9PTAorICAiRW5hYmxlIGRlYnVnZ2VyIGludGVyZmFjZSBjb2RlPyIpCisKKyMgU2hvdWxkIHdlIGxpbmsgdG8gQysrIGxpYnJhcnk/CitzZXQoTElCT01QX1VTRV9TVERDUFBMSUIgRkFMU0UgQ0FDSEUgQk9PTAorICAiU2hvdWxkIHdlIGxpbmsgdG8gQysrIGxpYnJhcnk/IikKKworIyBUU1ggKHg4NikgYmFzZWQgbG9ja3MgaGF2ZSBfX2FzbSBjb2RlIHdoaWNoIGNhbiBiZSB0cm91Ymxlc29tZSBmb3Igc29tZSBjb21waWxlcnMuCisjIFRPRE86IE1ha2UgdGhpcyBhIHJlYWwgZmVhdHVyZSBjaGVjaworc2V0KExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MgIiR7TElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1N9IiBDQUNIRSBCT09MCisgICJTaG91bGQgVFNYLWJhc2VkIGxvY2sgYmUgY29tcGlsZWQgKGFkYXB0aXZlIGxvY2sgaW4ga21wX2xvY2suY3BwKS4gIFRoZXNlIGFyZSB4ODYgc3BlY2lmaWMuIikKK2lmKExJQk9NUF9VU0VfQURBUFRJVkVfTE9DS1MgQU5EIChOT1QgTElCT01QX0hBVkVfQURBUFRJVkVfTE9DS1MpKQorICBsaWJvbXBfZXJyb3Jfc2F5KCJBZGFwdGl2ZSBsb2NrcyAoVFNYKSBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisKKyMgLSBzdGF0cy1nYXRoZXJpbmcgZW5hYmxlcyBPcGVuTVAgc3RhdHMgd2hlcmUgdGhpbmdzIGxpa2UgdGhlIG51bWJlciBvZgorIyBwYXJhbGxlbCByZWdpb25zLCBjbG9jayB0aWNrcyBzcGVudCBpbiBwYXJ0aWN1bGFyIG9wZW5tcCByZWdpb25zIGFyZSByZWNvcmRlZC4KK3NldChMSUJPTVBfU1RBVFMgRkFMU0UgQ0FDSEUgQk9PTAorICAiU3RhdHMtR2F0aGVyaW5nIGZ1bmN0aW9uYWxpdHk/IikKK2lmKExJQk9NUF9TVEFUUyBBTkQgKE5PVCBMSUJPTVBfSEFWRV9TVEFUUykpCisgIGxpYm9tcF9lcnJvcl9zYXkoIlN0YXRzLWdhdGhlcmluZyBmdW5jdGlvbmFsaXR5IHJlcXVlc3RlZCBidXQgbm90IGF2YWlsYWJsZSIpCitlbmRpZigpCisjIFRoZSBzdGF0cyBmdW5jdGlvbmFsaXR5IHJlcXVpcmVzIHRoZSBzdGQgYysrIGxpYnJhcnkKK2lmKExJQk9NUF9TVEFUUykKKyAgc2V0KExJQk9NUF9VU0VfU1REQ1BQTElCIFRSVUUpCitlbmRpZigpCisKKyMgU2hhcmVkIGxpYnJhcnkgY2FuIGJlIHN3aXRjaGVkIHRvIGEgc3RhdGljIGxpYnJhcnkKK3NldChMSUJPTVBfRU5BQkxFX1NIQVJFRCBUUlVFIENBQ0hFIEJPT0wKKyAgIlNoYXJlZCBsaWJyYXJ5IGluc3RlYWQgb2Ygc3RhdGljIGxpYnJhcnk/IikKKworaWYoV0lOMzIgQU5EIE5PVCBMSUJPTVBfRU5BQkxFX1NIQVJFRCkKKyAgbGlib21wX2Vycm9yX3NheSgiU3RhdGljIGxpYnJhcmllcyByZXF1ZXN0ZWQgYnV0IG5vdCBhdmFpbGFibGUgb24gV2luZG93cyIpCitlbmRpZigpCisKKyMgT01QVC1zdXBwb3J0CitzZXQoTElCT01QX09NUFRfREVCVUcgRkFMU0UgQ0FDSEUgQk9PTAorICAiVHJhY2UgT01QVCBpbml0aWFsaXphdGlvbj8iKQorc2V0KExJQk9NUF9PTVBUX1NVUFBPUlQgRkFMU0UgQ0FDSEUgQk9PTAorICAiT01QVC1zdXBwb3J0PyIpCitzZXQoTElCT01QX09NUFRfQkxBTUUgVFJVRSBDQUNIRSBCT09MCisgICJPTVBULWJsYW1lPyIpCitzZXQoTElCT01QX09NUFRfVFJBQ0UgVFJVRSBDQUNIRSBCT09MCisgICJPTVBULXRyYWNlPyIpCitpZihMSUJPTVBfT01QVF9TVVBQT1JUIEFORCAoTk9UIExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCkpCisgIGxpYm9tcF9lcnJvcl9zYXkoIk9wZW5NUCBUb29scyBJbnRlcmZhY2UgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBFcnJvciBjaGVjayBod2xvYyBzdXBwb3J0IGFmdGVyIGNvbmZpZy1peCBoYXMgcnVuCitpZihMSUJPTVBfVVNFX0hXTE9DIEFORCAoTk9UIExJQk9NUF9IQVZFX0hXTE9DKSkKKyAgbGlib21wX2Vycm9yX3NheSgiSHdsb2MgcmVxdWVzdGVkIGJ1dCBub3QgYXZhaWxhYmxlIikKK2VuZGlmKCkKKworIyBTZXR0aW5nIGZpbmFsIGxpYnJhcnkgbmFtZQorc2V0KExJQk9NUF9ERUZBVUxUX0xJQl9OQU1FIGxpYm9tcCkKK2lmKCR7UFJPRklMRV9MSUJSQVJZfSkKKyAgc2V0KExJQk9NUF9ERUZBVUxUX0xJQl9OQU1FICR7TElCT01QX0RFRkFVTFRfTElCX05BTUV9cHJvZikKK2VuZGlmKCkKK2lmKCR7U1RVQlNfTElCUkFSWX0pCisgIHNldChMSUJPTVBfREVGQVVMVF9MSUJfTkFNRSAke0xJQk9NUF9ERUZBVUxUX0xJQl9OQU1FfXN0dWJzKQorZW5kaWYoKQorc2V0KExJQk9NUF9MSUJfTkFNRSAke0xJQk9NUF9ERUZBVUxUX0xJQl9OQU1FfSBDQUNIRSBTVFJJTkcgIkJhc2UgT01QIGxpYnJhcnkgbmFtZSIpCisKK2lmKCR7TElCT01QX0VOQUJMRV9TSEFSRUR9KQorICBzZXQoTElCT01QX0xJQlJBUllfU1VGRklYICR7Q01BS0VfU0hBUkVEX0xJQlJBUllfU1VGRklYfSkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0tJTkQgU0hBUkVEKQorICBzZXQoTElCT01QX0lOU1RBTExfS0lORCBMSUJSQVJZKQorZWxzZSgpCisgIHNldChMSUJPTVBfTElCUkFSWV9TVUZGSVggJHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQorICBzZXQoTElCT01QX0xJQlJBUllfS0lORCBTVEFUSUMpCisgIHNldChMSUJPTVBfSU5TVEFMTF9LSU5EIEFSQ0hJVkUpCitlbmRpZigpCisKK3NldChMSUJPTVBfTElCX0ZJTEUgJHtMSUJPTVBfTElCX05BTUV9JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9KQorCisjIFByaW50IGNvbmZpZ3VyYXRpb24gYWZ0ZXIgYWxsIHZhcmlhYmxlcyBhcmUgc2V0LgoraWYoJHtMSUJPTVBfU1RBTkRBTE9ORV9CVUlMRH0pCisgIGxpYm9tcF9zYXkoIk9wZXJhdGluZyBTeXN0ZW0gICAgIC0tICR7Q01BS0VfU1lTVEVNX05BTUV9IikKKyAgbGlib21wX3NheSgiVGFyZ2V0IEFyY2hpdGVjdHVyZSAgLS0gJHtMSUJPTVBfQVJDSH0iKQorICBpZigke01JQ30pCisgICAgbGlib21wX3NheSgiSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSAgICAtLSAke0xJQk9NUF9NSUNfQVJDSH0iKQorICBlbmRpZigpCisgIGxpYm9tcF9zYXkoIkJ1aWxkIFR5cGUgICAgICAgICAgIC0tICR7Q01BS0VfQlVJTERfVFlQRX0iKQorICBsaWJvbXBfc2F5KCJPcGVuTVAgVmVyc2lvbiAgICAgICAtLSAke0xJQk9NUF9PTVBfVkVSU0lPTn0iKQorICBsaWJvbXBfc2F5KCJMaWJyYXJ5IEtpbmQgICAgICAgICAtLSAke0xJQk9NUF9MSUJSQVJZX0tJTkR9IikKKyAgbGlib21wX3NheSgiTGlicmFyeSBUeXBlICAgICAgICAgLS0gJHtMSUJPTVBfTElCX1RZUEV9IikKKyAgbGlib21wX3NheSgiRm9ydHJhbiBNb2R1bGVzICAgICAgLS0gJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSIpCisgICMgd2lsbCBzYXkgZGV2ZWxvcG1lbnQgaWYgYWxsIHplcm9zCisgIGlmKCR7TElCT01QX1ZFUlNJT05fQlVJTER9IFNUUkVRVUFMIDAwMDAwMDAwKQorICAgIHNldChMSUJPTVBfQlVJTEQgRGV2ZWxvcG1lbnQpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfQlVJTEQgJHtMSUJPTVBfVkVSU0lPTl9CVUlMRH0pCisgIGVuZGlmKCkKKyAgbGlib21wX3NheSgiQnVpbGQgICAgICAgICAgICAgICAgLS0gJHtMSUJPTVBfQlVJTER9IikKKyAgbGlib21wX3NheSgiVXNlIFN0YXRzLWdhdGhlcmluZyAgLS0gJHtMSUJPTVBfU1RBVFN9IikKKyAgbGlib21wX3NheSgiVXNlIERlYnVnZ2VyLXN1cHBvcnQgLS0gJHtMSUJPTVBfVVNFX0RFQlVHR0VSfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBJVFQgbm90aWZ5ICAgICAgIC0tICR7TElCT01QX1VTRV9JVFRfTk9USUZZfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBPTVBULXN1cHBvcnQgICAgIC0tICR7TElCT01QX09NUFRfU1VQUE9SVH0iKQorICBpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICAgIGxpYm9tcF9zYXkoIlVzZSBPTVBULWJsYW1lICAgICAgIC0tICR7TElCT01QX09NUFRfQkxBTUV9IikKKyAgICBsaWJvbXBfc2F5KCJVc2UgT01QVC10cmFjZSAgICAgICAtLSAke0xJQk9NUF9PTVBUX1RSQUNFfSIpCisgIGVuZGlmKCkKKyAgbGlib21wX3NheSgiVXNlIEFkYXB0aXZlIGxvY2tzICAgLS0gJHtMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTfSIpCisgIGxpYm9tcF9zYXkoIlVzZSBxdWFkIHByZWNpc2lvbiAgIC0tICR7TElCT01QX1VTRV9RVUFEX1BSRUNJU0lPTn0iKQorICBsaWJvbXBfc2F5KCJVc2UgSHdsb2MgbGlicmFyeSAgICAtLSAke0xJQk9NUF9VU0VfSFdMT0N9IikKK2VuZGlmKCkKKworYWRkX3N1YmRpcmVjdG9yeShzcmMpCithZGRfc3ViZGlyZWN0b3J5KHRlc3QpCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL1JFQURNRS50eHQgYi9yYzMvcnVudGltZS9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmQzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9SRUFETUUudHh0CkBAIC0wLDAgKzEsMTE1IEBACisKKyAgICAgICAgICAgICAgIFJFQURNRSBmb3IgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5CisgICAgICAgICAgICAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitIb3cgdG8gQnVpbGQgRG9jdW1lbnRhdGlvbgorPT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIG1haW4gZG9jdW1lbnRhdGlvbiBpcyBpbiBEb3h5Z2VuKiBmb3JtYXQsIGFuZCB0aGlzIGRpc3RyaWJ1dGlvbgorc2hvdWxkIGNvbWUgd2l0aCBwcmUtYnVpbHQgUERGIGRvY3VtZW50YXRpb24gaW4gZG9jL1JlZmVyZW5jZS5wZGYuCitIb3dldmVyLCBhbiBIVE1MIHZlcnNpb24gY2FuIGJlIGJ1aWx0IGJ5IGV4ZWN1dGluZzoKKworJSBkb3h5Z2VuIGRvYy9kb3h5Z2VuL2NvbmZpZworCitpbiB0aGUgcnVudGltZSBkaXJlY3RvcnkuCisKK1RoYXQgd2lsbCBwcm9kdWNlIEhUTUwgZG9jdW1lbnRhdGlvbiBpbiB0aGUgZG9jL2RveHlnZW4vZ2VuZXJhdGVkCitkaXJlY3RvcnksIHdoaWNoIGNhbiBiZSBhY2Nlc3NlZCBieSBwb2ludGluZyBhIHdlYiBicm93c2VyIGF0IHRoZQoraW5kZXguaHRtbCBmaWxlIHRoZXJlLgorCitJZiB5b3UgZG9uJ3QgaGF2ZSBEb3h5Z2VuIGluc3RhbGxlZCwgeW91IGNhbiBkb3dubG9hZCBpdCBmcm9tCit3d3cuZG94eWdlbi5vcmcuCisKKworSG93IHRvIEJ1aWxkIHRoZSBMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeQorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorSW4tdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cworJCBjZCB3aGVyZS15b3Utd2FudC10by1idWlsZAorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlIG9tcAorCitPdXQtb2YtdHJlZSBidWlsZDoKKworJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlCitDaGVjayBvdXQgb3Blbm1wCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUvb3Blbm1wL3J1bnRpbWUKKyQgbWtkaXIgYnVpbGQgJiYgY2QgYnVpbGQKKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPgorJCBtYWtlCisKK0ZvciBkZXRhaWxzIGFib3V0IGJ1aWxkaW5nLCBwbGVhc2UgbG9vayBhdCBCdWlsZF9XaXRoX0NNYWtlLnR4dAorCitBcmNoaXRlY3R1cmVzIFN1cHBvcnRlZAorPT09PT09PT09PT09PT09PT09PT09PT0KKyogSUEtMzIgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZQorKiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKyogQVJNKiBhcmNoaXRlY3R1cmUKKyogQWFyY2g2NCAoNjQtYml0IEFSTSkgYXJjaGl0ZWN0dXJlCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGJpZyBlbmRpYW4pCisqIElCTShSKSBQb3dlciBhcmNoaXRlY3R1cmUgKGxpdHRsZSBlbmRpYW4pCisKK1N1cHBvcnRlZCBSVEwgQnVpbGQgQ29uZmlndXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElBLTMyIGFyY2hpdGVjdHVyZSwgSW50ZWwoUikgNjQsIGFuZAorSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlCisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgICAgICAgICAgICB8ICAgaWNjL2ljbCAgICAgfCAgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgIFllcygxLDUpICAgIHwgIFllcygyLDQpICAgfCBZZXMoNCw2LDcpICAgfAorfCBGcmVlQlNEKiAgICB8ICAgTm8gICAgICAgICAgfCAgTm8gICAgICAgICB8IFllcyg0LDYsNyw4KSB8Cit8IE9TIFgqICAgICAgIHwgICBZZXMoMSwzLDQpICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3KSAgIHwKK3wgV2luZG93cyogT1MgfCAgIFllcygxLDQpICAgIHwgIE5vICAgICAgICAgfCBObyAgICAgICAgICAgfAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggYXJlCisgICAgc3VwcG9ydGVkICgxMi4xIGlzIHJlY29tbWVuZGVkKS4KKygyKSBHQ0MqIHZlcnNpb24gNC43IGlzIHN1cHBvcnRlZC4KKygzKSBGb3IgaWNjIG9uIE9TIFgqLCBPUyBYKiB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuCisoNCkgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIG5vdCBzdXBwb3J0ZWQuCisoNSkgT24gSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLCBpY2MvaWNsIHZlcnNpb25zIDEzLjAKKyAgICBvciBsYXRlciBhcmUgcmVxdWlyZWQuCisoNikgQ2xhbmcqIHZlcnNpb24gMy4zIGlzIHN1cHBvcnRlZC4KKyg3KSBDbGFuZyogY3VycmVudGx5IGRvZXMgbm90IG9mZmVyIGEgc29mdHdhcmUtaW1wbGVtZW50ZWQgMTI4IGJpdCBleHRlbmRlZAorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZAorICAgIGZyb20gdGhlIGxpYnJhcnkgYW5kIGNhbm5vdCBiZSBjYWxsZWQgaW4gdGhlIHVzZXIgcHJvZ3JhbS4gIFRoZSBmb2xsb3dpbmcKKyAgICBmdW5jdGlvbnMgYXJlIG5vdCBhdmFpbGFibGU6CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2XyoKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKgorICAgIF9fa21wY19hdG9taWNfKl9mcAorKDgpIENvbW11bml0eSBjb250cmlidXRpb24gcHJvdmlkZWQgQVMgSVMsIG5vdCB0ZXN0ZWQgYnkgSW50ZWwuCisKK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOAorCisgICAgICAgICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBnY2MgICAgICB8ICAgY2xhbmcgICAgICB8CistLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS18LS0tLS0tLS0tLS0tLS18Cit8IExpbnV4KiBPUyAgIHwgIFllcygxLDIpICB8IFllcygzLDQpICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKygxKSBPbiBQb3dlciA3LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMikgT24gUG93ZXIgOCwgZ2NjIHZlcnNpb24gNC44LjIgaXMgc3VwcG9ydGVkLgorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKyg0KSBPbiBQb3dlciA4LCBjbGFuZyB2ZXJzaW9uIDMuNyBpcyBzdXBwb3J0ZWQuCisKKworRnJvbnQtZW5kIENvbXBpbGVycyB0aGF0IHdvcmsgd2l0aCB0aGlzIFJUTAorPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yCit0aGlzIFJUTDogY2xhbmcgKGZyb20gdGhlIE9wZW5NUCBkZXZlbG9wbWVudCBicmFuY2ggYXQKK2h0dHA6Ly9jbGFuZy1vbXAuZ2l0aHViLmlvLyApLCBJbnRlbCBjb21waWxlcnMsIEdDQy4gIFNlZSB0aGUgZG9jdW1lbnRhdGlvbgorZm9yIG1vcmUgZGV0YWlscy4KKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTm90aWNlcworPT09PT09PQorCisqT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wQ2hlY2tGb3J0cmFuRmxhZy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrRm9ydHJhbkZsYWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzM3YjNhZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrRm9ydHJhbkZsYWcuY21ha2UKQEAgLTAsMCArMSw3MyBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENoZWNraW5nIGEgZm9ydHJhbiBjb21waWxlciBmbGFnCisjIFRoZXJlIGlzIG5vIHJlYWwgdHJpdmlhbCB3YXkgdG8gZG8gdGhpcyBpbiBDTWFrZSwgc28gd2UgaW1wbGVtZW50IGl0IGhlcmUKKyMgdGhpcyB3aWxsIGhhdmUgJHtib29sZWFufSA9IFRSVUUgaWYgdGhlIGZsYWcgc3VjY2VlZHMsIG90aGVyd2lzZSBmYWxzZS4KK2Z1bmN0aW9uKGxpYm9tcF9jaGVja19mb3J0cmFuX2ZsYWcgZmxhZyBib29sZWFuKQorICBpZihOT1QgREVGSU5FRCAiJHtib29sZWFufSIpCisgICAgc2V0KHJldHZhbCBUUlVFKQorICAgIHNldChmb3J0cmFuX3NvdXJjZQorIiAgICAgIHByb2dyYW0gaGVsbG8KKyAgICAgICAgICAgcHJpbnQgKiwgXCJIZWxsbyBXb3JsZCFcIgorICAgICAgZW5kIHByb2dyYW0gaGVsbG8iKQorCisgIHNldChmYWlsZWRfcmVnZXhlcyAiW0VlXXJyb3I7W1V1XW5rbm93bjtbU3Nda2lwcGluZyIpCisgIGlmKENNQUtFX1ZFUlNJT04gVkVSU0lPTl9HUkVBVEVSIDMuMSBPUiBDTUFLRV9WRVJTSU9OIFZFUlNJT05fRVFVQUwgMy4xKQorICAgIGluY2x1ZGUoQ2hlY2tGb3J0cmFuU291cmNlQ29tcGlsZXMpCisgICAgY2hlY2tfZm9ydHJhbl9zb3VyY2VfY29tcGlsZXMoIiR7Zm9ydHJhbl9zb3VyY2V9IiAke2Jvb2xlYW59IEZBSUxfUkVHRVggIiR7ZmFpbGVkX3JlZ2V4ZXN9IikKKyAgICBzZXQoJHtib29sZWFufSAkeyR7Ym9vbGVhbn19IFBBUkVOVF9TQ09QRSkKKyAgICByZXR1cm4oKQorICBlbHNlKCkKKyAgICAjIE91ciBtYW51YWwgY2hlY2sgZm9yIGNtYWtlIHZlcnNpb25zIHRoYXQgZG9uJ3QgaGF2ZSBDaGVja0ZvcnRyYW5Tb3VyY2VDb21waWxlcworICAgIHNldChiYXNlX2RpciAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2ZvcnRyYW5fZmxhZ19jaGVjaykKKyAgICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9KQorICAgIGZpbGUoV1JJVEUgJHtiYXNlX2Rpcn0vZm9ydHJhbl9zb3VyY2UuZiAiJHtmb3J0cmFuX3NvdXJjZX0iKQorCisgICAgbWVzc2FnZShTVEFUVVMgIlBlcmZvcm1pbmcgVGVzdCAke2Jvb2xlYW59IikKKyAgICBleGVjdXRlX3Byb2Nlc3MoCisgICAgICBDT01NQU5EICR7Q01BS0VfRm9ydHJhbl9DT01QSUxFUn0gIiR7ZmxhZ30iICR7YmFzZV9kaXJ9L2ZvcnRyYW5fc291cmNlLmYKKyAgICAgIFdPUktJTkdfRElSRUNUT1JZICR7YmFzZV9kaXJ9CisgICAgICBSRVNVTFRfVkFSSUFCTEUgZXhpdF9jb2RlCisgICAgICBPVVRQVVRfVkFSSUFCTEUgT1VUUFVUCisgICAgICBFUlJPUl9WQVJJQUJMRSBPVVRQVVQKKyAgICApCisKKyAgICBpZigke2V4aXRfY29kZX0gRVFVQUwgMCkKKyAgICAgIGZvcmVhY2gocmVnZXggSU4gTElTVFMgZmFpbGVkX3JlZ2V4ZXMpCisgICAgICAgIGlmKCIke09VVFBVVH0iIE1BVENIRVMgJHtyZWdleH0pCisgICAgICAgICAgc2V0KHJldHZhbCBGQUxTRSkKKyAgICAgICAgZW5kaWYoKQorICAgICAgZW5kZm9yZWFjaCgpCisgICAgZWxzZSgpCisgICAgICBzZXQocmV0dmFsIEZBTFNFKQorICAgIGVuZGlmKCkKKworICAgIGlmKCR7cmV0dmFsfSkKKyAgICAgIHNldCgke2Jvb2xlYW59IDEgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBTdWNjZXNzIikKKyAgICAgIGZpbGUoQVBQRU5EICR7Q01BS0VfQklOQVJZX0RJUn0ke0NNQUtFX0ZJTEVTX0RJUkVDVE9SWX0vQ01ha2VPdXRwdXQubG9nCisgICAgICAgICJQZXJmb3JtaW5nIEZvcnRyYW4gQ29tcGlsZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gc3VjY2VlZGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAgICIke09VVFBVVH1cbiIKKyAgICAgICAgIlNvdXJjZSBmaWxlIHdhczpcbiR7Zm9ydHJhbl9zb3VyY2V9XG4iKQorICAgIGVsc2UoKQorICAgICAgc2V0KCR7Ym9vbGVhbn0gIiIgQ0FDSEUgSU5URVJOQUwgIlRlc3QgJHtib29sZWFufSIpCisgICAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBGYWlsZWQiKQorICAgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZworICAgICAgICAiUGVyZm9ybWluZyBGb3J0cmFuIENvbXBpbGVyIEZsYWcgdGVzdCAke2Jvb2xlYW59IGZhaWxlZCB3aXRoIHRoZSBmb2xsb3dpbmcgb3V0cHV0OlxuIgorICAgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAgICJTb3VyY2UgZmlsZSB3YXM6XG4ke2ZvcnRyYW5fc291cmNlfVxuIikKKyAgICBlbmRpZigpCisgIGVuZGlmKCkKKworICBzZXQoJHtib29sZWFufSAke3JldHZhbH0gUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBDaGVja0xpbmtlckZsYWcuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzVhMzhlMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcENoZWNrTGlua2VyRmxhZy5jbWFrZQpAQCAtMCwwICsxLDY4IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgQ2hlY2tpbmcgYSBsaW5rZXIgZmxhZyB0byBidWlsZCBhIHNoYXJlZCBsaWJyYXJ5CisjIFRoZXJlIGlzIG5vIHJlYWwgdHJpdmlhbCB3YXkgdG8gZG8gdGhpcyBpbiBDTWFrZSwgc28gd2UgaW1wbGVtZW50IGl0IGhlcmUKKyMgdGhpcyB3aWxsIGhhdmUgJHtib29sZWFufSA9IFRSVUUgaWYgdGhlIGZsYWcgc3VjY2VlZHMsIG90aGVyd2lzZSBGQUxTRS4KK2Z1bmN0aW9uKGxpYm9tcF9jaGVja19saW5rZXJfZmxhZyBmbGFnIGJvb2xlYW4pCisgIGlmKE5PVCBERUZJTkVEICIke2Jvb2xlYW59IikKKyAgc2V0KHJldHZhbCBUUlVFKQorICBzZXQobGlicmFyeV9zb3VyY2UKKyAgICAiaW50IGZvbyhpbnQgYSkgeyByZXR1cm4gYSphOyB9IikKKyAgc2V0KGNtYWtlX3NvdXJjZQorICAgICJjbWFrZV9taW5pbXVtX3JlcXVpcmVkKFZFUlNJT04gMi44KQorICAgICBwcm9qZWN0KGZvbyBDKQorICAgICBzZXQoQ01BS0VfU0hBUkVEX0xJTktFUl9GTEFHUyBcIiR7ZmxhZ31cIikKKyAgICAgYWRkX2xpYnJhcnkoZm9vIFNIQVJFRCBzcmNfdG9fbGluay5jKSIpCisgIHNldChmYWlsZWRfcmVnZXhlcyAiW0VlXXJyb3I7W1V1XW5rbm93bjtbU3Nda2lwcGluZztMSU5LIDogd2FybmluZyIpCisgIHNldChiYXNlX2RpciAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlVG1wL2xpbmtfZmxhZ19jaGVja18ke2Jvb2xlYW59KQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9KQorICBmaWxlKE1BS0VfRElSRUNUT1JZICR7YmFzZV9kaXJ9L2J1aWxkKQorICBmaWxlKFdSSVRFICR7YmFzZV9kaXJ9L3NyY190b19saW5rLmMgIiR7bGlicmFyeV9zb3VyY2V9IikKKyAgZmlsZShXUklURSAke2Jhc2VfZGlyfS9DTWFrZUxpc3RzLnR4dCAiJHtjbWFrZV9zb3VyY2V9IikKKworICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0iKQorICB0cnlfY29tcGlsZSgKKyAgICB0cnlfY29tcGlsZV9yZXN1bHQKKyAgICAke2Jhc2VfZGlyfS9idWlsZAorICAgICR7YmFzZV9kaXJ9CisgICAgZm9vCisgICAgT1VUUFVUX1ZBUklBQkxFIE9VVFBVVCkKKworICBpZih0cnlfY29tcGlsZV9yZXN1bHQpCisgICAgZm9yZWFjaChyZWdleCBJTiBMSVNUUyBmYWlsZWRfcmVnZXhlcykKKyAgICAgIGlmKCIke09VVFBVVH0iIE1BVENIRVMgJHtyZWdleH0pCisgICAgICAgIHNldChyZXR2YWwgRkFMU0UpCisgICAgICBlbmRpZigpCisgICAgZW5kZm9yZWFjaCgpCisgIGVsc2UoKQorICAgIHNldChyZXR2YWwgRkFMU0UpCisgIGVuZGlmKCkKKworICBpZigke3JldHZhbH0pCisgICAgc2V0KCR7Ym9vbGVhbn0gMSBDQUNIRSBJTlRFUk5BTCAiVGVzdCAke2Jvb2xlYW59IikKKyAgICBtZXNzYWdlKFNUQVRVUyAiUGVyZm9ybWluZyBUZXN0ICR7Ym9vbGVhbn0gLSBTdWNjZXNzIikKKyAgICBmaWxlKEFQUEVORCAke0NNQUtFX0JJTkFSWV9ESVJ9JHtDTUFLRV9GSUxFU19ESVJFQ1RPUll9L0NNYWtlT3V0cHV0LmxvZworICAgICAgIlBlcmZvcm1pbmcgQyBMaW5rZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gc3VjY2VlZGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtsaWJyYXJ5X3NvdXJjZX1cbiIpCisgIGVsc2UoKQorICAgIHNldCgke2Jvb2xlYW59ICIiIENBQ0hFIElOVEVSTkFMICJUZXN0ICR7Ym9vbGVhbn0iKQorICAgIG1lc3NhZ2UoU1RBVFVTICJQZXJmb3JtaW5nIFRlc3QgJHtib29sZWFufSAtIEZhaWxlZCIpCisgICAgZmlsZShBUFBFTkQgJHtDTUFLRV9CSU5BUllfRElSfSR7Q01BS0VfRklMRVNfRElSRUNUT1JZfS9DTWFrZUVycm9yLmxvZworICAgICAgIlBlcmZvcm1pbmcgQyBMaW5rZXIgRmxhZyB0ZXN0ICR7Ym9vbGVhbn0gZmFpbGVkIHdpdGggdGhlIGZvbGxvd2luZyBvdXRwdXQ6XG4iCisgICAgICAiJHtPVVRQVVR9XG4iCisgICAgICAiU291cmNlIGZpbGUgd2FzOlxuJHtsaWJyYXJ5X3NvdXJjZX1cbiIpCisgIGVuZGlmKCkKKworICBzZXQoJHtib29sZWFufSAke3JldHZhbH0gUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcERlZmluaXRpb25zLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM0Y2ZiYjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBEZWZpbml0aW9ucy5jbWFrZQpAQCAtMCwwICsxLDMyIEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfZGVmaW5pdGlvbnNfZmxhZ3MgY3BwZmxhZ3MpCisgIHNldChjcHBmbGFnc19sb2NhbCkKKworICBpZihXSU4zMikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfQ1JUX1NFQ1VSRV9OT19XQVJOSU5HUyIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX0NSVF9TRUNVUkVfTk9fREVQUkVDQVRFIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfV0lORE9XUyIpCisgICAgbGlib21wX2FwcGVuZChjcHBmbGFnc19sb2NhbCAiLUQgX1dJTk5UIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfV0lOMzJfV0lOTlQ9MHgwNTAxIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfVVNSRExMIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfSVRFUkFUT1JfREVCVUdfTEVWRUw9MCIgSUZfVFJVRSBERUJVR19CVUlMRCkKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfREVCVUciIElGX1RSVUUgREVCVUdfQlVJTEQpCisgIGVsc2UoKQorICAgIGxpYm9tcF9hcHBlbmQoY3BwZmxhZ3NfbG9jYWwgIi1EIF9HTlVfU09VUkNFIikKKyAgICBsaWJvbXBfYXBwZW5kKGNwcGZsYWdzX2xvY2FsICItRCBfUkVFTlRSQU5UIikKKyAgZW5kaWYoKQorCisgICMgQ01ha2UgZG9lc24ndCBpbmNsdWRlIENQUEZMQUdTIGZyb20gZW52aXJvbm1lbnQsIGJ1dCB3ZSB3aWxsLgorICBzZXQoJHtjcHBmbGFnc30gJHtjcHBmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ1BQRkxBR1N9ICRFTlZ7Q1BQRkxBR1N9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wRXhwb3J0cy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEV4cG9ydHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmQwMzk3ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEV4cG9ydHMuY21ha2UKQEAgLTAsMCArMSw5OCBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIExpYm9tcEV4cG9ydHMuY21ha2UKKyMgICBDb3B5IGxpYnJhcnkgYW5kIGhlYWRlciBmaWxlcyBpbnRvIHRoZSBleHBvcnRzLyBzdWJkaXJlY3RvcnkgYWZ0ZXIgbGlicmFyeSBidWlsZAorCisjIENyZWF0ZSB0aGUgc3VmZml4IGZvciB0aGUgZXhwb3J0IGRpcmVjdG9yeQorIyAtIE9ubHkgYWRkIHRvIHN1ZmZpeCB3aGVuIG5vdCBhIGRlZmF1bHQgdmFsdWUKKyMgLSBFeGFtcGxlIHN1ZmZpeDogLmRlYi4zMC5zMQorIyAgIGZpbmFsIGV4cG9ydCBkaXJlY3Rvcnk6IGV4cG9ydHMvbGluXzMyZS5kZWIuMzAuczEvbGliCisjIC0gVGhlc2Ugc3VmZml4ZXMgaW1wbHkgdGhlIGJ1aWxkIGlzIGEgRGVidWcsIE9wZW5NUCAzLjAsIFN0YXRzLUdhdGhlcmluZyB2ZXJzaW9uIG9mIHRoZSBsaWJyYXJ5CitzZXQobGlib21wX3N1ZmZpeCkKK2xpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuZGViIERFQlVHX0JVSUxEKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5kaWEgUkVMV0lUSERFQklORk9fQlVJTEQpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm1pbiBNSU5TSVpFUkVMX0JVSUxEKQoraWYoTk9UICIke0xJQk9NUF9PTVBfVkVSU0lPTn0iIFNUUkVRVUFMICI0NSIpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAuJHtMSUJPTVBfT01QX1ZFUlNJT059KQorZW5kaWYoKQorbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5zMSBMSUJPTVBfU1RBVFMpCitsaWJvbXBfYXBwZW5kKGxpYm9tcF9zdWZmaXggLm9tcHQgTElCT01QX09NUFRfU1VQUE9SVCkKK2lmKCR7TElCT01QX09NUFRfU1VQUE9SVH0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3N1ZmZpeCAubm8tb21wdC1ibGFtZSBJRl9GQUxTRSBMSUJPTVBfT01QVF9CTEFNRSkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfc3VmZml4IC5uby1vbXB0LXRyYWNlIElGX0ZBTFNFIExJQk9NUF9PTVBUX1RSQUNFKQorZW5kaWYoKQorc3RyaW5nKFJFUExBQ0UgIjsiICIiIGxpYm9tcF9zdWZmaXggIiR7bGlib21wX3N1ZmZpeH0iKQorCisjIFNldCBleHBvcnRzIGxvY2F0aW9ucworaWYoJHtNSUN9KQorICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fJHtMSUJPTVBfTUlDX0FSQ0h9IikgIyBlLmcuLCBsaW5fa25mLCBsaW5fa25jCitlbHNlKCkKKyAgaWYoJHtJQTMyfSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzIiKQorICBlbHNlaWYoJHtJTlRFTDY0fSkKKyAgICBzZXQobGlib21wX3BsYXRmb3JtICIke0xJQk9NUF9QRVJMX1NDUklQVF9PU31fMzJlIikKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9wbGF0Zm9ybSAiJHtMSUJPTVBfUEVSTF9TQ1JJUFRfT1N9XyR7TElCT01QX0FSQ0h9IikgIyBlLmcuLCBsaW5fYXJtLCBsaW5fcHBjNjQKKyAgZW5kaWYoKQorZW5kaWYoKQorc2V0KExJQk9NUF9FWFBPUlRTX0RJUiAiJHtMSUJPTVBfQkFTRV9ESVJ9L2V4cG9ydHMiKQorc2V0KExJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUiAiJHtMSUJPTVBfRVhQT1JUU19ESVJ9LyR7bGlib21wX3BsYXRmb3JtfSR7bGlib21wX3N1ZmZpeH0iKQorc2V0KExJQk9NUF9FWFBPUlRTX0NNTl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS9jb21tb24ke2xpYm9tcF9zdWZmaXh9L2luY2x1ZGUiKQorc2V0KExJQk9NUF9FWFBPUlRTX0lOQ19ESVIgIiR7TElCT01QX0VYUE9SVFNfUExBVEZPUk1fRElSfS9pbmNsdWRlIikKK3NldChMSUJPTVBfRVhQT1JUU19NT0RfRElSICIke0xJQk9NUF9FWFBPUlRTX1BMQVRGT1JNX0RJUn0vaW5jbHVkZV9jb21wYXQiKQorc2V0KExJQk9NUF9FWFBPUlRTX0xJQl9ESVIgIiR7TElCT01QX0VYUE9SVFNfRElSfS8ke2xpYm9tcF9wbGF0Zm9ybX0ke2xpYm9tcF9zdWZmaXh9L2xpYiIpCisKKyMgUHV0IGhlYWRlcnMgaW4gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2FkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfQ01OX0RJUn0KKyAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNvcHkgb21wLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcHQuaCAke0xJQk9NUF9FWFBPUlRTX0NNTl9ESVJ9CisgICkKK2VuZGlmKCkKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgbGlib21wLW1vZCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliLmggJHtMSUJPTVBfRVhQT1JUU19DTU5fRElSfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBjb3B5IG9tcF9saWIubW9kICR7TElCT01QX0VYUE9SVFNfTU9EX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSBvbXBfbGliX2tpbmRzLm1vZCAke0xJQk9NUF9FWFBPUlRTX01PRF9ESVJ9CisgICkKK2VuZGlmKCkKKworIyBDb3B5IE9wZW5NUCBsaWJyYXJ5IGludG8gZXhwb3J0cy8gZGlyZWN0b3J5IHBvc3QgYnVpbGQKK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCitlbHNlKCkKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZW5kaWYoKQoraWYoTk9UIExJQk9NUF9PVVRQVVRfRElSRUNUT1JZKQorICBzZXQoTElCT01QX09VVFBVVF9ESVJFQ1RPUlkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9KQorZW5kaWYoKQorYWRkX2N1c3RvbV9jb21tYW5kKFRBUkdFVCBvbXAgUE9TVF9CVUlMRAorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0gJHtMSUJPTVBfRVhQT1JUU19MSUJfRElSfQorKQorCisjIENvcHkgV2luZG93cyBpbXBvcnQgbGlicmFyeSBpbnRvIGV4cG9ydHMvIGRpcmVjdG9yeSBwb3N0IGJ1aWxkCitpZihXSU4zMikKKyAgZ2V0X3RhcmdldF9wcm9wZXJ0eShMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSBvbXBpbXAgQVJDSElWRV9PVVRQVVRfRElSRUNUT1JZKQorICBpZihOT1QgTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkpCisgICAgc2V0KExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoVEFSR0VUIG9tcGltcCBQT1NUX0JVSUxECisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY29weSAke0xJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9JTVBfTElCX0ZJTEV9ICR7TElCT01QX0VYUE9SVFNfTElCX0RJUn0KKyAgKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBHZXRBcmNoaXRlY3R1cmUuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGYzYzRjNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEdldEFyY2hpdGVjdHVyZS5jbWFrZQpAQCAtMCwwICsxLDY2IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgRGV0ZXJtaW5lIHRoZSBhcmNoaXRlY3R1cmUgZnJvbSBwcmVkZWZpbmVkIGNvbXBpbGVyIG1hY3JvcworIyBUaGUgYXJjaGl0ZWN0dXJlIG5hbWUgY2FuIG9ubHkgY29udGFpbiBhbHBoYW51bWVyaWMgY2hhcmFjdGVycyBhbmQgdW5kZXJzY29yZXMgKGkuZS4sIEMgaWRlbnRpZmllcikKKworIyB2b2lkIGdldF9hcmNoaXRlY3R1cmUoc3RyaW5nKiByZXR1cm5fYXJjaCkKKyMgLSBSZXR1cm5zIHRoZSBhcmNoaXRlY3R1cmUgaW4gcmV0dXJuX2FyY2gKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfYXJjaGl0ZWN0dXJlIHJldHVybl9hcmNoKQorICBzZXQoZGV0ZWN0X2FyY2hfc3JjX3R4dCAiCisgICAgI2lmIGRlZmluZWQoX19LTkNfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9bWljCisgICAgI2VsaWYgZGVmaW5lZChfX2FtZDY0X18pIHx8IGRlZmluZWQoX19hbWQ2NCkgfHwgZGVmaW5lZChfX3g4Nl82NF9fKSB8fCBkZWZpbmVkKF9feDg2XzY0KSB8fCBkZWZpbmVkKF9NX1g2NCkgfHwgZGVmaW5lZChfTV9BTUQ2NCkKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9eDg2XzY0CisgICAgI2VsaWYgZGVmaW5lZChfX2kzODYpIHx8IGRlZmluZWQoX19pMzg2X18pIHx8IGRlZmluZWQoX19JQTMyX18pIHx8IGRlZmluZWQoX01fSTg2KSB8fCBkZWZpbmVkKF9NX0lYODYpIHx8IGRlZmluZWQoX19YODZfXykgfHwgZGVmaW5lZChfWDg2XykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9aTM4NgorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF83X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSB8fCAgZGVmaW5lZChfX0FSTV9BUkNIXzdBX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF83TV9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzdTX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF82X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNktfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82Wl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZUMl9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF81X18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VF9fKSB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNUVfXykgIHx8IGRlZmluZWQoX19BUk1fQVJDSF81VEVfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVURUpfXykKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9YXJtCisgICAgI2VsaWYgZGVmaW5lZChfX0FSTV9BUkNIXzRfXykgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzRUX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19BUk1fQVJDSF8zX18pIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zTV9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfMl9fKQorICAgICAgI2Vycm9yIEFSQ0hJVEVDVFVSRT1hcm0KKyAgICAjZWxpZiBkZWZpbmVkKF9fYXJtX18pIHx8IGRlZmluZWQoX01fQVJNKSB8fCBkZWZpbmVkKF9BUk0pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFybQorICAgICNlbGlmIGRlZmluZWQoX19hYXJjaDY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPWFhcmNoNjQKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pICYmIGRlZmluZWQoX19MSVRUTEVfRU5ESUFOX18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0bGUKKyAgICAjZWxpZiBkZWZpbmVkKF9fcG93ZXJwYzY0X18pCisgICAgICAjZXJyb3IgQVJDSElURUNUVVJFPXBwYzY0CisgICAgI2Vsc2UKKyAgICAgICNlcnJvciBBUkNISVRFQ1RVUkU9VW5rbm93bkFyY2hpdGVjdHVyZQorICAgICNlbmRpZgorICAiKQorICAjIFdyaXRlIG91dCAke2RldGVjdF9hcmNoX3NyY190eHR9IHRvIGEgZmlsZSB3aXRoaW4gdGhlIGNtYWtlLyBzdWJkaXJlY3RvcnkKKyAgZmlsZShXUklURSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIiAke2RldGVjdF9hcmNoX3NyY190eHR9KQorCisgICMgVHJ5IHRvIGNvbXBpbGUgdXNpbmcgdGhlIEMgQ29tcGlsZXIuICBJdCB3aWxsIGFsd2F5cyBlcnJvciBvdXQgd2l0aCBhbiAjZXJyb3IgZGlyZWN0aXZlLCBzbyBzdG9yZSBlcnJvciBvdXRwdXQgdG8gJHtsb2NhbF9hcmNoaXRlY3R1cmV9CisgIHRyeV9ydW4ocnVuX2R1bW15IGNvbXBpbGVfZHVtbXkgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSIgIiR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9saWJvbXBfZGV0ZWN0X2FyY2guYyIgQ09NUElMRV9PVVRQVVRfVkFSSUFCTEUgbG9jYWxfYXJjaGl0ZWN0dXJlKQorCisgICMgTWF0Y2ggdGhlIGltcG9ydGFudCBhcmNoaXRlY3R1cmUgbGluZSBhbmQgc3RvcmUgb25seSB0aGF0IG1hdGNoaW5nIHN0cmluZyBpbiAke2xvY2FsX2FyY2hpdGVjdHVyZX0KKyAgc3RyaW5nKFJFR0VYIE1BVENIICJBUkNISVRFQ1RVUkU9KFthLXpBLVowLTlfXSspIiBsb2NhbF9hcmNoaXRlY3R1cmUgIiR7bG9jYWxfYXJjaGl0ZWN0dXJlfSIpCisKKyAgIyBHZXQgcmlkIG9mIHRoZSBBUkNISVRFQ1RVUkU9IHBhcnQgb2YgdGhlIHN0cmluZworICBzdHJpbmcoUkVQTEFDRSAiQVJDSElURUNUVVJFPSIgIiIgbG9jYWxfYXJjaGl0ZWN0dXJlICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iKQorCisgICMgc2V0IHRoZSByZXR1cm4gdmFsdWUgdG8gdGhlIGFyY2hpdGVjdHVyZSBkZXRlY3RlZCAoZS5nLiwgMzJlLCAzMiwgYXJtLCBwcGM2NCwgZXRjLikKKyAgc2V0KCR7cmV0dXJuX2FyY2h9ICIke2xvY2FsX2FyY2hpdGVjdHVyZX0iIFBBUkVOVF9TQ09QRSkKKworICAjIFJlbW92ZSAke2RldGVjdF9hcmNoX3NyY190eHR9IGZyb20gY21ha2UvIHN1YmRpcmVjdG9yeQorICBmaWxlKFJFTU9WRSAiJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L2xpYm9tcF9kZXRlY3RfYXJjaC5jIikKK2VuZGZ1bmN0aW9uKCkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wSGFuZGxlRmxhZ3MuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWE3Mzg2MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcEhhbmRsZUZsYWdzLmNtYWtlCkBAIC0wLDAgKzEsMjA3IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU2V0dXAgdGhlIGZsYWdzIGNvcnJlY3RseSBmb3IgY21ha2UgKGNvdmVydCB0byBzdHJpbmcpCisjIFByZXR0eSB0aGVtIHVwIChTVFJJUCBhbnkgYmVnaW5uaW5nIGFuZCB0cmFpbGluZyB3aGl0ZXNwYWNlLAorIyByZW1vdmUgZHVwbGljYXRlcywgcmVtb3ZlIGVtcHR5IGVudHJpZXMpCittYWNybyhsaWJvbXBfc2V0dXBfZmxhZ3MgZmxhZ3MpCisgIGlmKE5PVCAiJHske2ZsYWdzfX0iIFNUUkVRVUFMICIiKSAjIGlmIGZsYWdzIGFyZSBlbXB0eSwgZG9uJ3QgZG8gYW55dGhpbmcKKyAgICBzZXQoZmxhZ3NfbG9jYWwpCisgICAgbGlzdChSRU1PVkVfRFVQTElDQVRFUyAke2ZsYWdzfSkgIyByZW1vdmUgZHVwbGljYXRlcworICAgIGxpc3QoUkVNT1ZFX0lURU0gJHtmbGFnc30gIiIpICMgcmVtb3ZlIGVtcHR5IGl0ZW1zCisgICAgbGlib21wX2xpc3RfdG9fc3RyaW5nKCIkeyR7ZmxhZ3N9fSIgZmxhZ3NfbG9jYWwpCisgICAgc3RyaW5nKFNUUklQICIke2ZsYWdzX2xvY2FsfSIgZmxhZ3NfbG9jYWwpCisgICAgc2V0KCR7ZmxhZ3N9ICIke2ZsYWdzX2xvY2FsfSIpCisgIGVuZGlmKCkKK2VuZG1hY3JvKCkKKworIyBHZXRzIGZsYWdzIGNvbW1vbiB0byBib3RoIHRoZSBDIGFuZCBDKysgY29tcGlsZXIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uIGZsYWdzKQorICBzZXQoZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLXN0ZD1jKysxMSBMSUJPTVBfSEFWRV9TVERfQ1BQMTFfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKKyAgaWYoJHtMSUJPTVBfRU5BQkxFX1dFUlJPUn0pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV2Vycm9yIExJQk9NUF9IQVZFX1dFUlJPUl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zaWduLWNvbXBhcmUgTElCT01QX0hBVkVfV05PX1NJR05fQ09NUEFSRV9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLWZ1bmN0aW9uIExJQk9NUF9IQVZFX1dOT19VTlVTRURfRlVOQ1RJT05fRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC1sb2NhbC10eXBlZGVmIExJQk9NUF9IQVZFX1dOT19VTlVTRURfTE9DQUxfVFlQRURFRl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdW51c2VkLXZhbHVlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFMVUVfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXVudXNlZC12YXJpYWJsZSBMSUJPTVBfSEFWRV9XTk9fVU5VU0VEX1ZBUklBQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1zd2l0Y2ggTElCT01QX0hBVkVfV05PX1NXSVRDSF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tY292ZXJlZC1zd2l0Y2gtZGVmYXVsdCBMSUJPTVBfSEFWRV9XTk9fQ09WRVJFRF9TV0lUQ0hfREVGQVVMVF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZGVwcmVjYXRlZC1yZWdpc3RlciBMSUJPTVBfSEFWRV9XTk9fREVQUkVDQVRFRF9SRUdJU1RFUl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZ251LWFub255bW91cy1zdHJ1Y3QgTElCT01QX0hBVkVfV05PX0dOVV9BTk9OWU1PVVNfU1RSVUNUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby11bmtub3duLXByYWdtYXMgTElCT01QX0hBVkVfV05PX1VOS05PV05fUFJBR01BU19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVduby1taXNzaW5nLWJyYWNlcyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19CUkFDRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLWNvbW1lbnQgTElCT01QX0hBVkVfV05PX0NPTU1FTlRfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtV25vLXNlbGYtYXNzaWduIExJQk9NUF9IQVZFX1dOT19TRUxGX0FTU0lHTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tdmxhLWV4dGVuc2lvbiBMSUJPTVBfSEFWRV9XTk9fVkxBX0VYVEVOU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1Xbm8tZm9ybWF0LXBlZGFudGljIExJQk9NUF9IQVZFX1dOT19GT1JNQVRfUEVEQU5USUNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvR1MgTElCT01QX0hBVkVfR1NfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvRUhzYyBMSUJPTVBfSEFWRV9FSFNDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL095LSBMSUJPTVBfSEFWRV9PWV9fRkxBRykKKyAgIyBJbnRlbChSKSBDIENvbXBpbGVyIGZsYWdzCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgL1FzYWZlc2VoIExJQk9NUF9IQVZFX1FTQUZFU0VIX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFvcHRpb24sY3BwLC0tZXh0ZW5kZWRfZmxvYXRfdHlwZXMgTElCT01QX0hBVkVfRVhURU5ERURfRkxPQVRfVFlQRVNfRkxBRykKKyAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtUWxvbmdfZG91YmxlIExJQk9NUF9IQVZFX0xPTkdfRE9VQkxFX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLVFkaWFnLWRpc2FibGU6MTc3IExJQk9NUF9IQVZFX0RJQUdfRElTQUJMRV8xNzdfRkxBRykKKyAgaWYoJHtSRUxFQVNFX0JVSUxEfSBPUiAke1JFTFdJVEhERUJJTkZPX0JVSUxEfSkKKyAgICBsaWJvbXBfYXBwZW5kKGZsYWdzX2xvY2FsIC1RaW5saW5lLW1pbi1zaXplPTEgTElCT01QX0hBVkVfSU5MSU5FX01JTl9TSVpFX0ZMQUcpCisgIGVuZGlmKCkKKyAgIyBBcmNoaXRlY3R1cmFsIEMgYW5kIEMrKyBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAvYXJjaDpTU0UyIExJQk9NUF9IQVZFX0FSQ0hfU1NFMl9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgLW1zc2UyIExJQk9NUF9IQVZFX01TU0UyX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUgTElCT01QX0hBVkVfRkFMSUdOX1NUQUNLX0ZMQUcpCisgIGVsc2VpZigke01JQ30pCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChmbGFnc19sb2NhbCAtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMgTElCT01QX0hBVkVfRlRMU19NT0RFTF9GTEFHKQorICAgIGxpYm9tcF9hcHBlbmQoZmxhZ3NfbG9jYWwgIi1vcHQtc3RyZWFtaW5nLXN0b3JlcyBuZXZlciIgTElCT01QX0hBVkVfT1BUX1NUUkVBTUlOR19TVE9SRVNfRkxBRykKKyAgZW5kaWYoKQorICBzZXQoJHtmbGFnc30gJHtmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIEMgY29tcGlsZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfY2ZsYWdzIGNmbGFncykKKyAgc2V0KGNmbGFnc19sb2NhbCkKKyAgbGlib21wX2dldF9jX2FuZF9jeHhmbGFnc19jb21tb24oY2ZsYWdzX2xvY2FsKQorICAjIGZsYWdzIG9ubHkgZm9yIHRoZSBDIENvbXBpbGVyCisgIGxpYm9tcF9hcHBlbmQoY2ZsYWdzX2xvY2FsIC9UUCBMSUJPTVBfSEFWRV9UUF9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGNmbGFnc19sb2NhbCAiLXggYysrIiBMSUJPTVBfSEFWRV9YX0NQUF9GTEFHKQorICBzZXQoY2ZsYWdzX2xvY2FsICR7Y2ZsYWdzX2xvY2FsfSAke0xJQk9NUF9DRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY2ZsYWdzX2xvY2FsKQorICBzZXQoJHtjZmxhZ3N9ICR7Y2ZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQysrIGNvbXBpbGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2N4eGZsYWdzIGN4eGZsYWdzKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9nZXRfY19hbmRfY3h4ZmxhZ3NfY29tbW9uKGN4eGZsYWdzX2xvY2FsKQorICBzZXQoY3h4ZmxhZ3NfbG9jYWwgJHtjeHhmbGFnc19sb2NhbH0gJHtMSUJPTVBfQ1hYRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoY3h4ZmxhZ3NfbG9jYWwpCisgIHNldCgke2N4eGZsYWdzfSAke2N4eGZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQXNzZW1ibGVyIGZsYWdzCitmdW5jdGlvbihsaWJvbXBfZ2V0X2FzbWZsYWdzIGFzbWZsYWdzKQorICBzZXQoYXNtZmxhZ3NfbG9jYWwpCisgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgIi14IGFzc2VtYmxlci13aXRoLWNwcCIgTElCT01QX0hBVkVfWF9BU1NFTUJMRVJfV0lUSF9DUFBfRkxBRykKKyAgIyBBcmNoaXRlY3R1cmFsIGFzc2VtYmxlciBmbGFncworICBpZigke0lBMzJ9KQorICAgIGlmKENNQUtFX1NJWkVPRl9WT0lEX1AgRVFVQUwgOCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChhc21mbGFnc19sb2NhbCAvc2FmZXNlaCBMSUJPTVBfSEFWRV9TQUZFU0VIX01BU01fRkxBRykKKyAgICBsaWJvbXBfYXBwZW5kKGFzbWZsYWdzX2xvY2FsIC9jb2ZmIExJQk9NUF9IQVZFX0NPRkZfTUFTTV9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQoYXNtZmxhZ3NfbG9jYWwgLW1taWMgTElCT01QX0hBVkVfTU1JQ19GTEFHKQorICBlbmRpZigpCisgIHNldChhc21mbGFnc19sb2NhbCAke2FzbWZsYWdzX2xvY2FsfSAke0xJQk9NUF9BU01GTEFHU30pCisgIGxpYm9tcF9zZXR1cF9mbGFncyhhc21mbGFnc19sb2NhbCkKKyAgc2V0KCR7YXNtZmxhZ3N9ICR7YXNtZmxhZ3NfbG9jYWx9IFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKworIyBMaW5rZXIgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGRmbGFncyBsZGZsYWdzKQorICBzZXQobGRmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0xJTktfREVGX0ZJTEVfRkxBR30ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vJHtMSUJPTVBfTElCX05BTUV9LmRlZiIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0xJTktfREVGX0ZJTEVfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsICIke0NNQUtFX0NfT1NYX0NVUlJFTlRfVkVSU0lPTl9GTEFHfSR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9IgorICAgIElGX0RFRklORUQgQ01BS0VfQ19PU1hfQ1VSUkVOVF9WRVJTSU9OX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiJHtDTUFLRV9DX09TWF9DT01QQVRJQklMSVRZX1ZFUlNJT05fRkxBR30ke0xJQk9NUF9WRVJTSU9OX01BSk9SfS4ke0xJQk9NUF9WRVJTSU9OX01JTk9SfSIKKyAgICBJRl9ERUZJTkVEIENNQUtFX0NfT1NYX0NPTVBBVElCSUxJVFlfVkVSU0lPTl9GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC0td2Fybi1zaGFyZWQtdGV4dHJlbCBMSUJPTVBfSEFWRV9XQVJOX1NIQVJFRF9URVhUUkVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLS1hcy1uZWVkZWQgTElCT01QX0hBVkVfQVNfTkVFREVEX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAiLVdsLC0tdmVyc2lvbi1zY3JpcHQ9JHtMSUJPTVBfU1JDX0RJUn0vZXhwb3J0c19zby50eHQiIExJQk9NUF9IQVZFX1ZFUlNJT05fU0NSSVBUX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtc3RhdGljLWxpYmdjYyBMSUJPTVBfSEFWRV9TVEFUSUNfTElCR0NDX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtV2wsLXosbm9leGVjc3RhY2sgTElCT01QX0hBVkVfWl9OT0VYRUNTVEFDS19GTEFHKQorICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLVdsLC1maW5pPV9fa21wX2ludGVybmFsX2VuZF9maW5pIExJQk9NUF9IQVZFX0ZJTklfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1uby1pbnRlbC1leHRlbnNpb25zIExJQk9NUF9IQVZFX05PX0lOVEVMX0VYVEVOU0lPTlNfRkxBRykKKyAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1zdGF0aWMtaW50ZWwgTElCT01QX0hBVkVfU1RBVElDX0lOVEVMX0ZMQUcpCisgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAvU0FGRVNFSCBMSUJPTVBfSEFWRV9TQUZFU0VIX0ZMQUcpCisgICMgQXJjaGl0ZWN0dXJhbCBsaW5rZXIgZmxhZ3MKKyAgaWYoJHtJQTMyfSkKKyAgICBpZihDTUFLRV9TSVpFT0ZfVk9JRF9QIEVRVUFMIDgpCisgICAgICBsaWJvbXBfYXBwZW5kKGxkZmxhZ3NfbG9jYWwgLW0zMiBMSUJPTVBfSEFWRV9NMzJfRkxBRykKKyAgICBlbmRpZigpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1tc3NlMiBMSUJPTVBfSEFWRV9NU1NFMl9GTEFHKQorICBlbHNlaWYoJHtNSUN9KQorICAgIGxpYm9tcF9hcHBlbmQobGRmbGFnc19sb2NhbCAtbW1pYyBMSUJPTVBfSEFWRV9NTUlDX0ZMQUcpCisgICAgbGlib21wX2FwcGVuZChsZGZsYWdzX2xvY2FsIC1XbCwteCBMSUJPTVBfSEFWRV9YX0ZMQUcpCisgIGVuZGlmKCkKKyAgc2V0KGxkZmxhZ3NfbG9jYWwgJHtsZGZsYWdzX2xvY2FsfSAke0xJQk9NUF9MREZMQUdTfSkKKyAgbGlib21wX3NldHVwX2ZsYWdzKGxkZmxhZ3NfbG9jYWwpCisgIHNldCgke2xkZmxhZ3N9ICR7bGRmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQorCisjIExpYnJhcnkgZmxhZ3MKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGliZmxhZ3MgbGliZmxhZ3MpCisgIHNldChsaWJmbGFnc19sb2NhbCkKKyAgbGlib21wX2FwcGVuZChsaWJmbGFnc19sb2NhbCAiJHtDTUFLRV9USFJFQURfTElCU19JTklUfSIpCisgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgIiR7TElCT01QX0hXTE9DX0xJQlJBUll9IiBMSUJPTVBfVVNFX0hXTE9DKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxpcmNfcGljIExJQk9NUF9IQVZFX0lSQ19QSUNfTElCUkFSWSkKKyAgZW5kaWYoKQorICBJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICAgIGxpYm9tcF9hcHBlbmQobGliZmxhZ3NfbG9jYWwgLWxtKQorICBFTkRJRigke0NNQUtFX1NZU1RFTV9OQU1FfSBNQVRDSEVTICJOZXRCU0QiKQorICBzZXQobGliZmxhZ3NfbG9jYWwgJHtsaWJmbGFnc19sb2NhbH0gJHtMSUJPTVBfTElCRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MobGliZmxhZ3NfbG9jYWwpCisgIHNldCgke2xpYmZsYWdzfSAke2xpYmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgRm9ydHJhbiBmbGFncworZnVuY3Rpb24obGlib21wX2dldF9mZmxhZ3MgZmZsYWdzKQorICBzZXQoZmZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIGxpYm9tcF9hcHBlbmQoZmZsYWdzX2xvY2FsIC1tMzIgTElCT01QX0hBVkVfTTMyX0ZPUlRSQU5fRkxBRykKKyAgZW5kaWYoKQorICBzZXQoZmZsYWdzX2xvY2FsICR7ZmZsYWdzX2xvY2FsfSAke0xJQk9NUF9GRkxBR1N9KQorICBsaWJvbXBfc2V0dXBfZmxhZ3MoZmZsYWdzX2xvY2FsKQorICBzZXQoJHtmZmxhZ3N9ICR7ZmZsYWdzX2xvY2FsfSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgUGVybCBnZW5lcmF0ZS1kZWZzLnBsIGZsYWdzIChGb3IgV2luZG93cyBvbmx5KQorZnVuY3Rpb24obGlib21wX2dldF9nZGZsYWdzIGdkZmxhZ3MpCisgIHNldChnZGZsYWdzX2xvY2FsKQorICBpZigke0lBMzJ9KQorICAgIHNldChsaWJvbXBfZ2RmbGFnX2FyY2ggYXJjaF8zMikKKyAgZWxzZWlmKCR7SU5URUw2NH0pCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXzMyZSkKKyAgZWxzZSgpCisgICAgc2V0KGxpYm9tcF9nZGZsYWdfYXJjaCBhcmNoXyR7TElCT01QX0FSQ0h9KQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgJHtsaWJvbXBfZ2RmbGFnX2FyY2h9IikKKyAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBtc3ZjX2NvbXBhdCIpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgbm9ybSIgTk9STUFMX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgcHJvZiIgUFJPRklMRV9MSUJSQVJZKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIHN0dWIiIFNUVUJTX0xJQlJBUlkpCisgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgSEFWRV9RVUFEIiBMSUJPTVBfVVNFX1FVQURfUFJFQ0lTSU9OKQorICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIFVTRV9ERUJVR0dFUiIgTElCT01QX1VTRV9ERUJVR0dFUikKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDUgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQ1KQorICAgIGxpYm9tcF9hcHBlbmQoZ2RmbGFnc19sb2NhbCAiLUQgT01QXzQ1IikKKyAgZW5kaWYoKQorICBpZigke0xJQk9NUF9PTVBfVkVSU0lPTn0gR1JFQVRFUiA0MCBPUiAke0xJQk9NUF9PTVBfVkVSU0lPTn0gRVFVQUwgNDApCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBPTVBfNDAiKQorICBlbmRpZigpCisgIGlmKCR7TElCT01QX09NUF9WRVJTSU9OfSBHUkVBVEVSIDMwIE9SICR7TElCT01QX09NUF9WRVJTSU9OfSBFUVVBTCAzMCkKKyAgICBsaWJvbXBfYXBwZW5kKGdkZmxhZ3NfbG9jYWwgIi1EIE9NUF8zMCIpCisgIGVuZGlmKCkKKyAgaWYoJHtERUJVR19CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgbGlib21wX2FwcGVuZChnZGZsYWdzX2xvY2FsICItRCBLTVBfREVCVUciKQorICBlbmRpZigpCisgIHNldCgke2dkZmxhZ3N9ICR7Z2RmbGFnc19sb2NhbH0gUEFSRU5UX1NDT1BFKQorZW5kZnVuY3Rpb24oKQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZiYzU1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcE1pY3JvVGVzdHMuY21ha2UKQEAgLTAsMCArMSwyMjUgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBUaGUgZm9sbG93aW5nIG1pY3JvLXRlc3RzIGFyZSBzbWFsbCB0ZXN0cyB0byBwZXJmb3JtIG9uIHRoZSBsaWJyYXJ5IGp1c3QgY3JlYXRlZC4KKyMgVGhlcmUgYXJlIGN1cnJlbnRseSBmaXZlIG1pY3JvLXRlc3RzOgorIyAoMSkgdGVzdC10b3VjaAorIyAgLSBDb21waWxlIGFuZCBydW4gYSBzbWFsbCBwcm9ncmFtIHVzaW5nIG5ld2x5IGNyZWF0ZWQgbGlib21wIGxpYnJhcnkKKyMgIC0gRmFpbHMgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IGNvbXBpbGUgb3IgaWYgdGVzdC10b3VjaC5jIGRvZXMgbm90IHJ1biBhZnRlciBjb21waWxhdGlvbgorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogZ2NjIG9yIGcrKywgZ3JlcCwgYm91cm5lIHNoZWxsCisjICAtIEF2YWlsYWJsZSBmb3IgYWxsIFVuaXgsTWFjLFdpbmRvd3MgYnVpbGRzLiAgTm90IGF2YWlsYWJsZSBvbiBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlIGJ1aWxkcy4KKyMgKDIpIHRlc3QtcmVsbworIyAgLSBUZXN0cyBkeW5hbWljIGxpYnJhcmllcyBmb3IgcG9zaXRpb24tZGVwZW5kZW50IGNvZGUgKGNhbiBub3QgaGF2ZSBhbnkgcG9zaXRpb24gZGVwZW5kZW50IGNvZGUpCisjICAtIEZhaWxzIGlmIFRFWFRSRUwgaXMgaW4gb3V0cHV0IG9mIHJlYWRlbGYgLWQgbGlib21wLnNvIGNvbW1hbmQKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHJlYWRlbGYsIGdyZXAsIGJvdXJuZSBzaGVsbAorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBsaWJyYXJ5IGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisjICgzKSB0ZXN0LWV4ZWNzdGFjaworIyAgLSBUZXN0cyBpZiBzdGFjayBpcyBleGVjdXRhYmxlCisjICAtIEZhaWxzIGlmIHN0YWNrIGlzIGV4ZWN1dGFibGUuIFNob3VsZCBvbmx5IGJlIHJlYWRhYmxlIGFuZCB3cml0YWJsZS4gTm90IGV4ZWN0dWFibGUuCisjICAtIFByb2dyYW0gZGVwZW5kZW5jaWVzOiBwZXJsLCByZWFkZWxmCisjICAtIEF2YWlsYWJsZSBmb3IgVW5peCBkeW5hbWljIGxpYnJhcnkgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDQpIHRlc3QtaW5zdHIgKEludGVsKFIpIE1JQyBBcmNoaXRlY3V0cmUgb25seSkKKyMgIC0gVGVzdHMgSW50ZWwoUikgTUlDIEFyY2hpdGVjdHVyZSBsaWJyYXJpZXMgZm9yIHZhbGlkIGluc3RydWN0aW9uIHNldAorIyAgLSBGYWlscyBpZiBmaW5kcyBpbnZhbGlkIGluc3RydWN0aW9uIGZvciBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlICh3YXNuJ3QgY29tcGlsZWQgd2l0aCBjb3JyZWN0IGZsYWdzKQorIyAgLSBQcm9ncmFtIGRlcGVuZGVuY2llczogcGVybCwgb2JqZHVtcAorIyAgLSBBdmFpbGFibGUgZm9yIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgYW5kIGkzODYgYnVpbGRzLiBOb3QgYXZhaWxhYmxlIG90aGVyd2lzZS4KKyMgKDUpIHRlc3QtZGVwcworIyAgLSBUZXN0cyBuZXdseSBjcmVhdGVkIGxpYm9tcCBmb3IgbGlicmFyeSBkZXBlbmRlbmNpZXMKKyMgIC0gRmFpbHMgaWYgc2VlcyBhIGRlcGVuZGVuY2Ugbm90IGxpc3RlZCBpbiB0ZF9leHAgdmFyaWFibGUgYmVsb3cKKyMgIC0gUHJvZ3JhbSBkZXBlbmRlbmNpZXM6IHBlcmwsICh1bml4KXJlYWRlbGYsIChtYWMpb3Rvb2xbNjRdLCAod2luZG93cylsaW5rLmV4ZQorIyAgLSBBdmFpbGFibGUgZm9yIFVuaXgsTWFjLFdpbmRvd3MsIEludGVsKFIpIE1JQyBBcmNoaXRlY3R1cmUgZHluYW1pYyBidWlsZHMgYW5kIFdpbmRvd3MKKyMgICAgc3RhdGljIGJ1aWxkcy4gTm90IGF2YWlsYWJsZSBvdGhlcndpc2UuCisKKyMgZ2V0IGxpYnJhcnkgbG9jYXRpb24KK2lmKFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUlkgb21waW1wIEFSQ0hJVkVfT1VUUFVUX0RJUkVDVE9SWSkKKyAgaWYoTk9UIExJQk9NUElNUF9PVVRQVVRfRElSRUNUT1JZKQorICAgIHNldChMSUJPTVBJTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCisgIGVuZGlmKCkKK2Vsc2UoKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9PVVRQVVRfRElSRUNUT1JZIG9tcCBMSUJSQVJZX09VVFBVVF9ESVJFQ1RPUlkpCitlbmRpZigpCitpZihOT1QgTElCT01QX09VVFBVVF9ESVJFQ1RPUlkpCisgIHNldChMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0pCitlbmRpZigpCisKKyMgdGVzdC10b3VjaAorZmluZF9wcm9ncmFtKExJQk9NUF9TSEVMTCBzaCkKK2lmKFdJTjMyKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1tZC8uc3VjY2VzcyB0ZXN0LXRvdWNoLW10Ly5zdWNjZXNzKQorICBlbmRpZigpCisgICMgcGljayB0ZXN0LXRvdWNoIGNvbXBpbGVyCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlciAke0NNQUtFX0NfQ09NUElMRVJ9KQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL25vbG9nbykKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICR7TElCT01QSU1QX09VVFBVVF9ESVJFQ1RPUll9LyR7TElCT01QX0lNUF9MSUJfRklMRX0pCisgIGlmKCR7SUEzMn0pCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzIC9zYWZlc2VoKQorICBlbmRpZigpCitlbHNlKCkgIyAoVW5peCBiYXNlZCBzeXN0ZW1zLCBJbnRlbChSKSBNSUMgQXJjaGl0ZWN0dXJlLCBhbmQgTWFjKQorICBpZihMSUJPTVBfU0hFTEwpCisgICAgc2V0KGxpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHMgdGVzdC10b3VjaC1ydC8uc3VjY2VzcykKKyAgZW5kaWYoKQorICAjIHBpY2sgdGVzdC10b3VjaCBjb21waWxlcgorICBpZigke0xJQk9NUF9VU0VfU1REQ1BQTElCfSkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DWFhfQ09NUElMRVJ9KQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfY29tcGlsZXIgJHtDTUFLRV9DX0NPTVBJTEVSfSkKKyAgZW5kaWYoKQorICAjIHRlc3QtdG91Y2ggY29tcGlsYXRpb24gZmxhZ3MKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9saWJzICIke0NNQUtFX1RIUkVBRF9MSUJTX0lOSVR9IikKKyAgaWYoJHtJQTMyfSkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQorICBlbmRpZigpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAke0xJQk9NUF9PVVRQVVRfRElSRUNUT1JZfS8ke0xJQk9NUF9MSUJfRklMRX0pCisgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGlicyAiJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGlmKEFQUExFKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkRZTERfTElCUkFSWV9QQVRIPS46JHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX06JEVOVntEWUxEX0xJQlJBUllfUEFUSH0iKQorICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfbGRmbGFncyAiLVdsLC1ycGF0aCwke0xJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUn0iIExJQk9NUF9VU0VfSFdMT0MpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIkxEX0xJQlJBUllfUEFUSD0uOiR7TElCT01QX09VVFBVVF9ESVJFQ1RPUll9OiRFTlZ7TERfTElCUkFSWV9QQVRIfSIpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9sZGZsYWdzICItV2wsLXJwYXRoPSR7TElCT01QX0hXTE9DX0xJQlJBUllfRElSfSIgTElCT01QX1VTRV9IV0xPQykKKyAgZW5kaWYoKQorZW5kaWYoKQorbWFjcm8obGlib21wX3Rlc3RfdG91Y2hfcmVjaXBlIHRlc3RfdG91Y2hfZGlyKQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfZGVwZW5kZW5jaWVzICR7TElCT01QX1NSQ19ESVJ9L3Rlc3QtdG91Y2guYyBvbXApCisgIHNldChsaWJvbXBfdGVzdF90b3VjaF9leGUgJHt0ZXN0X3RvdWNoX2Rpcn0vdGVzdC10b3VjaCR7Q01BS0VfRVhFQ1VUQUJMRV9TVUZGSVh9KQorICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb2JqICR7dGVzdF90b3VjaF9kaXJ9L3Rlc3QtdG91Y2gke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCisgIGlmKFdJTjMyKQorICAgIGlmKCR7UkVMRUFTRV9CVUlMRH0gT1IgJHtSRUxXSVRIREVCSU5GT19CVUlMRH0pCisgICAgICBpZigke3Rlc3RfdG91Y2hfZGlyfSBNQVRDSEVTICJ0ZXN0LXRvdWNoLW10IikKKyAgICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9jZmxhZ3MgL01UKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRCkKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIGlmKCR7dGVzdF90b3VjaF9kaXJ9IE1BVENIRVMgInRlc3QtdG91Y2gtbXQiKQorICAgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF90ZXN0X3RvdWNoX2NmbGFncyAvTVRkKQorICAgICAgZWxzZSgpCisgICAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzIC9NRGQpCisgICAgICBlbmRpZigpCisgICAgZW5kaWYoKQorICAgIHNldChsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3MgLUZlJHtsaWJvbXBfdGVzdF90b3VjaF9leGV9IC1GbyR7bGlib21wX3Rlc3RfdG91Y2hfb2JqfSkKKyAgICBsaXN0KEFQUEVORCBsaWJvbXBfdGVzdF90b3VjaF9kZXBlbmRlbmNpZXMgb21waW1wKQorICBlbHNlKCkKKyAgICBzZXQobGlib21wX3Rlc3RfdG91Y2hfb3V0X2ZsYWdzIC1vICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfSkKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUICAke3Rlc3RfdG91Y2hfZGlyfS8uc3VjY2VzcyAke2xpYm9tcF90ZXN0X3RvdWNoX2V4ZX0gJHtsaWJvbXBfdGVzdF90b3VjaF9vYmp9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIG1ha2VfZGlyZWN0b3J5ICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS8ke3Rlc3RfdG91Y2hfZGlyfQorICAgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSByZW1vdmUgLWYgJHt0ZXN0X3RvdWNoX2Rpcn0vKgorICAgIENPTU1BTkQgJHtsaWJvbXBfdGVzdF90b3VjaF9jb21waWxlcn0gJHtsaWJvbXBfdGVzdF90b3VjaF9vdXRfZmxhZ3N9ICR7bGlib21wX3Rlc3RfdG91Y2hfY2ZsYWdzfQorICAgICAgJHtMSUJPTVBfU1JDX0RJUn0vdGVzdC10b3VjaC5jICR7bGlib21wX3Rlc3RfdG91Y2hfbGRmbGFnc30gJHtsaWJvbXBfdGVzdF90b3VjaF9saWJzfQorICAgIENPTU1BTkQgJHtMSUJPTVBfU0hFTEx9IC1jIFwiJHtsaWJvbXBfdGVzdF90b3VjaF9lbnZ9ICR7bGlib21wX3Rlc3RfdG91Y2hfZXhlfVwiCisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIHRvdWNoICR7dGVzdF90b3VjaF9kaXJ9Ly5zdWNjZXNzCisgICAgREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX2RlcGVuZGVuY2llc30KKyAgKQorZW5kbWFjcm8oKQorbGlib21wX2FwcGVuZChsaWJvbXBfdGVzdF90b3VjaF9lbnYgIktNUF9WRVJTSU9OPTEiKQorYWRkX2N1c3RvbV90YXJnZXQobGlib21wLXRlc3QtdG91Y2ggREVQRU5EUyAke2xpYm9tcF90ZXN0X3RvdWNoX3RhcmdldHN9KQoraWYoV0lOMzIpCisgIGxpYm9tcF90ZXN0X3RvdWNoX3JlY2lwZSh0ZXN0LXRvdWNoLW10KQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1tZCkKK2Vsc2UoKQorICBsaWJvbXBfdGVzdF90b3VjaF9yZWNpcGUodGVzdC10b3VjaC1ydCkKK2VuZGlmKCkKKworIyB0ZXN0LXJlbG8KK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LXJlbG8gREVQRU5EUyB0ZXN0LXJlbG8vLnN1Y2Nlc3MpCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAgdGVzdC1yZWxvLy5zdWNjZXNzIHRlc3QtcmVsby9yZWFkZWxmLmxvZworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtcmVsbworICBDT01NQU5EIHJlYWRlbGYgLWQgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9ID4gdGVzdC1yZWxvL3JlYWRlbGYubG9nCisgIENPTU1BTkQgZ3JlcCAtZSBURVhUUkVMIHRlc3QtcmVsby9yZWFkZWxmLmxvZyBcOyB0ZXN0ICQkPyAtZXEgMQorICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgdG91Y2ggdGVzdC1yZWxvLy5zdWNjZXNzCisgIERFUEVORFMgb21wCispCisKKyMgdGVzdC1leGVjc3RhY2sKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWV4ZWNzdGFjayBERVBFTkRTIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtZXhlY3N0YWNrLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1leGVjc3RhY2sKKyAgQ09NTUFORCAke1BFUkxfRVhFQ1VUQUJMRX0gJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1leGVjc3RhY2sucGwKKyAgICAtLWFyY2g9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWV4ZWNzdGFjay8uc3VjY2VzcworICBERVBFTkRTIG9tcAorKQorCisjIHRlc3QtaW5zdHIKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC10ZXN0LWluc3RyIERFUEVORFMgdGVzdC1pbnN0ci8uc3VjY2VzcykKK2FkZF9jdXN0b21fY29tbWFuZCgKKyAgT1VUUFVUICB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSBtYWtlX2RpcmVjdG9yeSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vdGVzdC1pbnN0cgorICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWluc3RydWN0aW9uLXNldC5wbCAtLW9zPSR7TElCT01QX1BFUkxfU0NSSVBUX09TfQorICAgIC0tYXJjaD0ke0xJQk9NUF9QRVJMX1NDUklQVF9BUkNIfSAtLXNob3cgLS1taWMtYXJjaD0ke0xJQk9NUF9NSUNfQVJDSH0gJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWluc3RyLy5zdWNjZXNzCisgIERFUEVORFMgb21wICR7TElCT01QX1RPT0xTX0RJUn0vY2hlY2staW5zdHJ1Y3Rpb24tc2V0LnBsCispCisKKyMgdGVzdC1kZXBzCithZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtdGVzdC1kZXBzIERFUEVORFMgdGVzdC1kZXBzLy5zdWNjZXNzKQorc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMpCitpZihDTUFLRV9TWVNURU1fTkFNRSBNQVRDSEVTICJGcmVlQlNEIikKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliYy5zby43IGxpYnRoci5zby4zKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGliaHdsb2Muc28uNSBMSUJPTVBfVVNFX0hXTE9DKQorZWxzZWlmKENNQUtFX1NZU1RFTV9OQU1FIE1BVENIRVMgIk5ldEJTRCIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uMTIgbGlicHRocmVhZC5zby4xIGxpYm0uc28uMCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKK2Vsc2VpZihBUFBMRSkKKyAgc2V0KGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIpCitlbHNlaWYoV0lOMzIpCisgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGtlcm5lbDMyLmRsbCkKKyAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIHBzYXBpLmRsbCBMSUJPTVBfT01QVF9TVVBQT1JUKQorZWxzZSgpCisgIGlmKCR7TUlDfSkKKyAgICBzZXQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYgbGlicHRocmVhZC5zby4wIGxpYmRsLnNvLjIpCisgICAgaWYoIiR7TElCT01QX01JQ19BUkNIfSIgU1RSRVFVQUwgImtuZiIpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQtbGludXgtbDFvbS5zby4yKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmdjY19zLnNvLjEpCisgICAgZWxzZWlmKCIke0xJQk9NUF9NSUNfQVJDSH0iIFNUUkVRVUFMICJrbmMiKQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxkLWxpbnV4LWsxb20uc28uMikKKyAgICBlbmRpZigpCisgIGVsc2UoKQorICAgIHNldChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmRsLnNvLjIgbGliZ2NjX3Muc28uMSkKKyAgICBpZigke0lBMzJ9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC5zby4yKQorICAgIGVsc2VpZigke0lOVEVMNjR9KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC14ODYtNjQuc28uMikKKyAgICBlbHNlaWYoJHtBUk19KQorICAgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmMuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNikKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJmZmkuc28uNSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsZC1saW51eC1hcm1oZi5zby4zKQorICAgIGVsc2VpZigke1BQQzY0fSkKKyAgICAgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJjLnNvLjYpCisgICAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGQ2NC5zby4xKQorICAgIGVuZGlmKCkKKyAgICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlicHRocmVhZC5zby4wIElGX0ZBTFNFIFNUVUJTX0xJQlJBUlkpCisgICAgbGlib21wX2FwcGVuZChsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzIGxpYmh3bG9jLnNvLjUgTElCT01QX1VTRV9IV0xPQykKKyAgZW5kaWYoKQorICBsaWJvbXBfYXBwZW5kKGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgbGlic3RkYysrLnNvLjYgTElCT01QX1VTRV9TVERDUFBMSUIpCisgIGxpYm9tcF9hcHBlbmQobGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwcyBsaWJtLnNvLjYgTElCT01QX1NUQVRTKQorZW5kaWYoKQorIyBQZXJsIHNjcmlwdCBleHBlY3RzIGNvbW1hIHNlcGFyYXRlZCBsaXN0CitzdHJpbmcoUkVQTEFDRSAiOyIgIiwiIGxpYm9tcF9leHBlY3RlZF9saWJyYXJ5X2RlcHMgIiR7bGlib21wX2V4cGVjdGVkX2xpYnJhcnlfZGVwc30iKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIHRlc3QtZGVwcy8uc3VjY2VzcworICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgbWFrZV9kaXJlY3RvcnkgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9L3Rlc3QtZGVwcworICBDT01NQU5EICR7UEVSTF9FWEVDVVRBQkxFfSAke0xJQk9NUF9UT09MU19ESVJ9L2NoZWNrLWRlcGVuZHMucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLWFyY2g9JHtMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSH0gLS1leHBlY3RlZD0iJHtsaWJvbXBfZXhwZWN0ZWRfbGlicmFyeV9kZXBzfSIgJHtMSUJPTVBfT1VUUFVUX0RJUkVDVE9SWX0vJHtMSUJPTVBfTElCX0ZJTEV9CisgIENPTU1BTkQgJHtDTUFLRV9DT01NQU5EfSAtRSB0b3VjaCB0ZXN0LWRlcHMvLnN1Y2Nlc3MKKyAgREVQRU5EUyBvbXAgJHtMSUJPTVBfVE9PTFNfRElSfS9jaGVjay1kZXBlbmRzLnBsCispCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZSBiL3JjMy9ydW50aW1lL2NtYWtlL0xpYm9tcFV0aWxzLmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhODFhNmMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9jbWFrZS9MaWJvbXBVdGlscy5jbWFrZQpAQCAtMCwwICsxLDE5MSBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIHZvaWQgbGlib21wX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlcgorbWFjcm8obGlib21wX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoU1RBVFVTICJMSUJPTVA6ICR7bWVzc2FnZV90b191c2VyfSIpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXBfd2FybmluZ19zYXkoc3RyaW5nIG1lc3NhZ2VfdG9fdXNlcik7CisjIC0gcHJpbnRzIG91dCBtZXNzYWdlX3RvX3VzZXIgd2l0aCBhIHdhcm5pbmcKK21hY3JvKGxpYm9tcF93YXJuaW5nX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoV0FSTklORyAiTElCT01QOiAke21lc3NhZ2VfdG9fdXNlcn0iKQorZW5kbWFjcm8oKQorCisjIHZvaWQgbGlib21wX2Vycm9yX3NheShzdHJpbmcgbWVzc2FnZV90b191c2VyKTsKKyMgLSBwcmludHMgb3V0IG1lc3NhZ2VfdG9fdXNlciB3aXRoIGFuIGVycm9yIGFuZCBleGl0cyBjbWFrZQorbWFjcm8obGlib21wX2Vycm9yX3NheSBtZXNzYWdlX3RvX3VzZXIpCisgIG1lc3NhZ2UoRkFUQUxfRVJST1IgIkxJQk9NUDogJHttZXNzYWdlX3RvX3VzZXJ9IikKK2VuZG1hY3JvKCkKKworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gWyhJRl9UUlVFIHwgSUZfRkFMU0UgfCBJRl9UUlVFXzFfMCApIEJPT0xFQU5dKQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4pCisjICAgLSB1bmNvbmRpdGlvbmFsbHkgYXBwZW5kcyA8ZmxhZz4gdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIEJPT0xFQU4gaXMgdHJ1ZQorIworIyBsaWJvbXBfYXBwZW5kKDxmbGFnPiA8ZmxhZ3NfbGlzdD4gSUZfVFJVRSA8Qk9PTEVBTj4pCisjICAgLSBhcHBlbmRzIDxmbGFnPiB0byB0aGUgbGlzdCBvZiBkZWZpbml0aW9ucyBpZiBCT09MRUFOIGlzIHRydWUKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX0ZBTFNFIDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIEJPT0xFQU4gaXMgZmFsc2UKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX0RFRklORUQgPFZBUklBQkxFPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+IHRvIHRoZSBsaXN0IG9mIGRlZmluaXRpb25zIGlmIFZBUklBQkxFIGlzIGRlZmluZWQKKyMKKyMgbGlib21wX2FwcGVuZCg8ZmxhZz4gPGZsYWdzX2xpc3Q+IElGX1RSVUVfMV8wIDxCT09MRUFOPikKKyMgICAtIGFwcGVuZHMgPGZsYWc+PTEgdG8gdGhlIGxpc3Qgb2YgZGVmaW5pdGlvbnMgaWYgPEJPT0xFQU4+IGlzIHRydWUsIDxmbGFnPj0wIG90aGVyd2lzZQorIyBlLmcuLCBsaWJvbXBfYXBwZW5kKCItRCBVU0VfRkVBVFVSRSIgSUZfVFJVRV8xXzAgSEFWRV9GRUFUVVJFKQorIyAgICAgYXBwZW5kcyAiLUQgVVNFX0ZFQVRVUkU9MSIgaWYgSEFWRV9GRUFUVVJFIGlzIHRydWUKKyMgICAgIG9yICItRCBVU0VfRkVBVFVSRT0wIiBpZiBIQVZFX0ZFQVRVUkUgaXMgZmFsc2UKK21hY3JvKGxpYm9tcF9hcHBlbmQgZmxhZ3MgZmxhZykKKyAgaWYoTk9UICgke0FSR0N9IEVRVUFMIDIgT1IgJHtBUkdDfSBFUVVBTCAzIE9SICR7QVJHQ30gRVFVQUwgNCkpCisgICAgbGlib21wX2Vycm9yX3NheSgibGlib21wX2FwcGVuZDogdGFrZXMgMiwgMywgb3IgNCBhcmd1bWVudHMiKQorICBlbmRpZigpCisgIGlmKCR7QVJHQ30gRVFVQUwgMikKKyAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgIGVsc2VpZigke0FSR0N9IEVRVUFMIDMpCisgICAgaWYoJHtBUkdWMn0pCisgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgZW5kaWYoKQorICBlbHNlKCkKKyAgICBpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfVFJVRSIpCisgICAgICBpZigke0FSR1YzfSkKKyAgICAgICAgbGlzdChBUFBFTkQgJHtmbGFnc30gIiR7ZmxhZ30iKQorICAgICAgZW5kaWYoKQorICAgIGVsc2VpZigke0FSR1YyfSBTVFJFUVVBTCAiSUZfRkFMU0UiKQorICAgICAgaWYoTk9UICR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfSIpCisgICAgICBlbmRpZigpCisgICAgZWxzZWlmKCR7QVJHVjJ9IFNUUkVRVUFMICJJRl9ERUZJTkVEIikKKyAgICAgIGlmKERFRklORUQgJHtBUkdWM30pCisgICAgICAgIGxpc3QoQVBQRU5EICR7ZmxhZ3N9ICIke2ZsYWd9IikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlaWYoJHtBUkdWMn0gU1RSRVFVQUwgIklGX1RSVUVfMV8wIikKKyAgICAgIGlmKCR7QVJHVjN9KQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfT0xIikKKyAgICAgIGVsc2UoKQorICAgICAgICBsaXN0KEFQUEVORCAke2ZsYWdzfSAiJHtmbGFnfT0wIikKKyAgICAgIGVuZGlmKCkKKyAgICBlbHNlKCkKKyAgICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9hcHBlbmQ6IHRoaXJkIGFyZ3VtZW50IG11c3QgYmUgb25lIG9mIElGX1RSVUUsIElGX0ZBTFNFLCBJRl9ERUZJTkVELCBJRl9UUlVFXzFfMCIpCisgICAgZW5kaWYoKQorICBlbmRpZigpCitlbmRtYWNybygpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goc3RyaW5nKiByZXR1cm5fYXJjaF9zdHJpbmcpOworIyAtIHJldHVybnMgKHRocm91Z2ggcmV0dXJuX2FyY2hfc3RyaW5nKSB0aGUgZm9ybWFsIGFyY2hpdGVjdHVyZQorIyAgIHN0cmluZyBvciB3YXJucyB1c2VyIG9mIHVua25vd24gYXJjaGl0ZWN0dXJlCitmdW5jdGlvbihsaWJvbXBfZ2V0X2xlZ2FsX2FyY2ggcmV0dXJuX2FyY2hfc3RyaW5nKQorICBpZigke0lBMzJ9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIklBLTMyIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke0lOVEVMNjR9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIkludGVsKFIpIDY0IiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke01JQ30pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke0FSTX0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiQVJNIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1BQQzY0QkV9KQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIlBQQzY0QkUiIFBBUkVOVF9TQ09QRSkKKyAgZWxzZWlmKCR7UFBDNjRMRX0pCisgICAgc2V0KCR7cmV0dXJuX2FyY2hfc3RyaW5nfSAiUFBDNjRMRSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtBQVJDSDY0fSkKKyAgICBzZXQoJHtyZXR1cm5fYXJjaF9zdHJpbmd9ICJBQVJDSDY0IiBQQVJFTlRfU0NPUEUpCisgIGVsc2UoKQorICAgIHNldCgke3JldHVybl9hcmNoX3N0cmluZ30gIiR7TElCT01QX0FSQ0h9IiBQQVJFTlRfU0NPUEUpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJsaWJvbXBfZ2V0X2xlZ2FsX2FyY2goKTogV2FybmluZzogVW5rbm93biBhcmNoaXRlY3R1cmU6IFVzaW5nICR7TElCT01QX0FSQ0h9IikKKyAgZW5kaWYoKQorZW5kZnVuY3Rpb24oKQorCisjIHZvaWQgbGlib21wX2NoZWNrX3ZhcmlhYmxlKHN0cmluZyB2YXIsIC4uLik7CisjIC0gcnVucyB0aHJvdWdoIGFsbCB2YWx1ZXMgY2hlY2tpbmcgaWYgJHt2YXJ9ID09IHZhbHVlCisjIC0gdXBwZXJjYXNlIGFuZCBsb3dlcmNhc2UgZG8gbm90IG1hdHRlcgorIyAtIGlmIHRoZSB2YXIgaXMgZm91bmQsIHRoZW4ganVzdCBwcmludCBpdCBvdXQKKyMgLSBpZiB0aGUgdmFyIGlzIG5vdCBmb3VuZCwgdGhlbiBlcnJvciBvdXQKK2Z1bmN0aW9uKGxpYm9tcF9jaGVja192YXJpYWJsZSB2YXIpCisgIHNldCh2YWxpZF9mbGFnIDApCisgIHN0cmluZyhUT0xPV0VSICIkeyR7dmFyfX0iIHZhcl9sb3dlcikKKyAgZm9yZWFjaCh2YWx1ZSBJTiBMSVNUUyBBUkdOKQorICAgIHN0cmluZyhUT0xPV0VSICIke3ZhbHVlfSIgdmFsdWVfbG93ZXIpCisgICAgaWYoIiR7dmFyX2xvd2VyfSIgU1RSRVFVQUwgIiR7dmFsdWVfbG93ZXJ9IikKKyAgICAgIHNldCh2YWxpZF9mbGFnIDEpCisgICAgICBzZXQodGhlX3ZhbHVlICIke3ZhbHVlfSIpCisgICAgZW5kaWYoKQorICBlbmRmb3JlYWNoKCkKKyAgaWYoJHt2YWxpZF9mbGFnfSBFUVVBTCAwKQorICAgIGxpYm9tcF9lcnJvcl9zYXkoImxpYm9tcF9jaGVja192YXJpYWJsZSgpOiAke3Zhcn0gPSAkeyR7dmFyfX0gaXMgdW5rbm93biIpCisgIGVuZGlmKCkKK2VuZGZ1bmN0aW9uKCkKKworIyB2b2lkIGxpYm9tcF9nZXRfYnVpbGRfbnVtYmVyKHN0cmluZyBzcmNfZGlyLCBzdHJpbmcqIHJldHVybl9idWlsZF9udW1iZXIpOworIyAtIGdyYWIgdGhlIGVpZ2h0IGRpZ2l0IGJ1aWxkIG51bWJlciAob3IgMDAwMDAwMDApIGZyb20ga21wX3ZlcnNpb24uYworZnVuY3Rpb24obGlib21wX2dldF9idWlsZF9udW1iZXIgc3JjX2RpciByZXR1cm5fYnVpbGRfbnVtYmVyKQorICAjIHNldHMgZmlsZV9saW5lc19saXN0IHRvIGEgbGlzdCBvZiBhbGwgbGluZXMgaW4ga21wX3ZlcnNpb24uYworICBmaWxlKFNUUklOR1MgIiR7c3JjX2Rpcn0vc3JjL2ttcF92ZXJzaW9uLmMiIGZpbGVfbGluZXNfbGlzdCkKKworICAjIHJ1bnMgdGhyb3VnaCBlYWNoIGxpbmUgaW4ga21wX3ZlcnNpb24uYworICBmb3JlYWNoKGxpbmUgSU4gTElTVFMgZmlsZV9saW5lc19saXN0KQorICAgICMgaWYgdGhlIGxpbmUgYmVnaW5zIHdpdGggIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiIHRoZW4gd2UgdGFrZSBub3Qgb2YgdGhlIGJ1aWxkIG51bWJlcgorICAgIHN0cmluZyhSRUdFWCBNQVRDSCAiXlsgXHRdKiNkZWZpbmVbIFx0XStLTVBfVkVSU0lPTl9CVUlMRCIgdmFsaWQgIiR7bGluZX0iKQorICAgIGlmKE5PVCAiJHt2YWxpZH0iIFNUUkVRVUFMICIiKSAjIGlmIHdlIG1hdGNoZWQgIiNkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQiLCB0aGVuIGdyYWIgdGhlIGJ1aWxkIG51bWJlcgorICAgICAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIl5bIFx0XSojZGVmaW5lWyBcdF0rS01QX1ZFUlNJT05fQlVJTERbIFx0XSsoWzAtOV0rKSIgIlxcMSIKKyAgICAgICAgICAgYnVpbGRfbnVtYmVyICIke2xpbmV9IgorICAgICAgKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke3JldHVybl9idWlsZF9udW1iZXJ9ICIke2J1aWxkX251bWJlcn0iIFBBUkVOVF9TQ09QRSkgIyByZXR1cm4gYnVpbGQgbnVtYmVyCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfZ2V0X2xlZ2FsX3R5cGUoc3RyaW5nKiByZXR1cm5fbGVnYWxfdHlwZSk7CisjIC0gc2V0IHRoZSBsZWdhbCB0eXBlIG5hbWUgUGVyZm9ybWFuY2UvUHJvZmlsaW5nL1N0dWIKK2Z1bmN0aW9uKGxpYm9tcF9nZXRfbGVnYWxfdHlwZSByZXR1cm5fbGVnYWxfdHlwZSkKKyAgaWYoJHtOT1JNQUxfTElCUkFSWX0pCisgICAgc2V0KCR7cmV0dXJuX2xlZ2FsX3R5cGV9ICJQZXJmb3JtYW5jZSIgUEFSRU5UX1NDT1BFKQorICBlbHNlaWYoJHtQUk9GSUxFX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiUHJvZmlsaW5nIiBQQVJFTlRfU0NPUEUpCisgIGVsc2VpZigke1NUVUJTX0xJQlJBUll9KQorICAgIHNldCgke3JldHVybl9sZWdhbF90eXBlfSAiU3R1YiIgUEFSRU5UX1NDT1BFKQorICBlbmRpZigpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfYWRkX3N1ZmZpeChzdHJpbmcgc3VmZml4LCBsaXN0PHN0cmluZz4qIGxpc3Rfb2ZfaXRlbXMpOworIyAtIHJldHVybnMgbGlzdF9vZl9pdGVtcyB3aXRoIHN1ZmZpeCBhcHBlbmRlZCB0byBhbGwgaXRlbXMKKyMgLSBvcmlnaW5hbCBsaXN0IGlzIG1vZGlmaWVkCitmdW5jdGlvbihsaWJvbXBfYWRkX3N1ZmZpeCBzdWZmaXggbGlzdF9vZl9pdGVtcykKKyAgc2V0KGxvY2FsX2xpc3QgIiIpCisgIGZvcmVhY2goaXRlbSBJTiBMSVNUUyAiJHtsaXN0X29mX2l0ZW1zfSIpCisgICAgaWYoTk9UICIke2l0ZW19IiBTVFJFUVVBTCAiIikKKyAgICAgIGxpc3QoQVBQRU5EIGxvY2FsX2xpc3QgIiR7aXRlbX0ke3N1ZmZpeH0iKQorICAgIGVuZGlmKCkKKyAgZW5kZm9yZWFjaCgpCisgIHNldCgke2xpc3Rfb2ZfaXRlbXN9ICIke2xvY2FsX2xpc3R9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfbGlzdF90b19zdHJpbmcobGlzdDxzdHJpbmc+IGxpc3Rfb2ZfdGhpbmdzLCBzdHJpbmcqIHJldHVybl9zdHJpbmcpOworIyAtIGNvbnZlcnRzIGEgbGlzdCB0byBhIHNwYWNlIHNlcGFyYXRlZCBzdHJpbmcKK2Z1bmN0aW9uKGxpYm9tcF9saXN0X3RvX3N0cmluZyBsaXN0X29mX3RoaW5ncyByZXR1cm5fc3RyaW5nKQorICBzdHJpbmcoUkVQTEFDRSAiOyIgIiAiIG91dHB1dF92YXJpYWJsZSAiJHtsaXN0X29mX3RoaW5nc30iKQorICBzZXQoJHtyZXR1cm5fc3RyaW5nfSAiJHtvdXRwdXRfdmFyaWFibGV9IiBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgdm9pZCBsaWJvbXBfc3RyaW5nX3RvX2xpc3Qoc3RyaW5nIHN0ciwgbGlzdDxzdHJpbmc+KiByZXR1cm5fbGlzdCk7CisjIC0gY29udmVydHMgYSBzdHJpbmcgdG8gYSBzZW1pY29sb24gc2VwYXJhdGVkIGxpc3QKKyMgLSB3aGF0IGl0IHJlYWxseSBkb2VzIGlzIGp1c3Qgc3RyaW5nX3JlcGxhY2UgYWxsIHJ1bm5pbmcgd2hpdGVzcGFjZSB0byBhIHNlbWljb2xvbgorIyAtIGluIGNtYWtlLCBhIGxpc3QgaXMgc3RyaW5ncyBzZXBhcmF0ZWQgYnkgc2VtaWNvbG9uczogaS5lLiwgbGlzdCBvZiBmb3VyIGl0ZW1zLCBsaXN0ID0gIml0ZW0xO2l0ZW0yO2l0ZW0zO2l0ZW00IgorZnVuY3Rpb24obGlib21wX3N0cmluZ190b19saXN0IHN0ciByZXR1cm5fbGlzdCkKKyAgc2V0KG91dHN0cikKKyAgc3RyaW5nKFJFR0VYIFJFUExBQ0UgIlsgXHRdKyIgIjsiIG91dHN0ciAiJHtzdHJ9IikKKyAgc2V0KCR7cmV0dXJuX2xpc3R9ICIke291dHN0cn0iIFBBUkVOVF9TQ09QRSkKK2VuZGZ1bmN0aW9uKCkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvY21ha2UvY29uZmlnLWl4LmNtYWtlIGIvcmMzL3J1bnRpbWUvY21ha2UvY29uZmlnLWl4LmNtYWtlCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIwNmU2ODkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9jbWFrZS9jb25maWctaXguY21ha2UKQEAgLTAsMCArMSwyNjcgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworaW5jbHVkZShDaGVja0NDb21waWxlckZsYWcpCitpbmNsdWRlKENoZWNrQ1NvdXJjZUNvbXBpbGVzKQoraW5jbHVkZShDaGVja0NYWENvbXBpbGVyRmxhZykKK2luY2x1ZGUoQ2hlY2tJbmNsdWRlRmlsZSkKK2luY2x1ZGUoQ2hlY2tMaWJyYXJ5RXhpc3RzKQoraW5jbHVkZShDaGVja0luY2x1ZGVGaWxlcykKK2luY2x1ZGUoTGlib21wQ2hlY2tMaW5rZXJGbGFnKQoraW5jbHVkZShMaWJvbXBDaGVja0ZvcnRyYW5GbGFnKQorCisjIENoZWNrIGZvciB2ZXJzaW9uZWQgc3ltYm9scworZnVuY3Rpb24obGlib21wX2NoZWNrX3ZlcnNpb25fc3ltYm9scyByZXR2YWwpCisgIHNldChzb3VyY2VfY29kZQorICAgICIjaW5jbHVkZSA8c3RkaW8uaD4KKyAgICB2b2lkIGZ1bmMxKCkgeyBwcmludGYoXCJIZWxsb1wiKTsgfQorICAgIHZvaWQgZnVuYzIoKSB7IHByaW50ZihcIldvcmxkXCIpOyB9CisgICAgX19hc21fXyhcIi5zeW12ZXIgZnVuYzEsIGZ1bmNAVkVSMVwiKTsKKyAgICBfX2FzbV9fKFwiLnN5bXZlciBmdW5jMiwgZnVuY0BWRVIyXCIpOworICAgIGludCBtYWluKCkgeworICAgICAgZnVuYzEoKTsKKyAgICAgIGZ1bmMyKCk7CisgICAgICByZXR1cm4gMDsKKyAgICB9IikKKyAgc2V0KHZlcnNpb25fc2NyaXB0X3NvdXJjZSAiVkVSMSB7IH07IFZFUjIgeyB9IFZFUjE7IikKKyAgZmlsZShXUklURSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQgIiR7dmVyc2lvbl9zY3JpcHRfc291cmNlfSIpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAtV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vX192ZXJzaW9uX3NjcmlwdC50eHQpCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKCIke3NvdXJjZV9jb2RlfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCisgIGZpbGUoUkVNT1ZFICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9fX3ZlcnNpb25fc2NyaXB0LnR4dCkKK2VuZGZ1bmN0aW9uKCkKKworIyBJbmNsdWRlcyB0aGUgYXJjaGl0ZWN0dXJlIGZsYWcgaW4gYm90aCBjb21waWxlIGFuZCBsaW5rIHBoYXNlCitmdW5jdGlvbihsaWJvbXBfY2hlY2tfYXJjaGl0ZWN0dXJlX2ZsYWcgZmxhZyByZXR2YWwpCisgIHNldChDTUFLRV9SRVFVSVJFRF9GTEFHUyAiJHtmbGFnfSIpCisgIGNoZWNrX2NfY29tcGlsZXJfZmxhZygiJHtmbGFnfSIgJHtyZXR2YWx9KQorICBzZXQoJHtyZXR2YWx9ICR7JHtyZXR2YWx9fSBQQVJFTlRfU0NPUEUpCitlbmRmdW5jdGlvbigpCisKKyMgQ2hlY2tpbmcgQywgQ1hYLCBMaW5rZXIgRmxhZ3MKK2NoZWNrX2N4eF9jb21waWxlcl9mbGFnKC1zdGQ9YysrMTEgTElCT01QX0hBVkVfU1REX0NQUDExX0ZMQUcpCitjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZm5vLWV4Y2VwdGlvbnMgTElCT01QX0hBVkVfRk5PX0VYQ0VQVElPTlNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygiLXggYysrIiBMSUJPTVBfSEFWRV9YX0NQUF9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZXJyb3IgTElCT01QX0hBVkVfV0VSUk9SX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtZnVuY3Rpb24gTElCT01QX0hBVkVfV05PX1VOVVNFRF9GVU5DVElPTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLWxvY2FsLXR5cGVkZWYgTElCT01QX0hBVkVfV05PX1VOVVNFRF9MT0NBTF9UWVBFREVGX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bnVzZWQtdmFsdWUgTElCT01QX0hBVkVfV05PX1VOVVNFRF9WQUxVRV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdW51c2VkLXZhcmlhYmxlIExJQk9NUF9IQVZFX1dOT19VTlVTRURfVkFSSUFCTEVfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3N3aXRjaCBMSUJPTVBfSEFWRV9XTk9fU1dJVENIX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdjb3ZlcmVkLXN3aXRjaC1kZWZhdWx0IExJQk9NUF9IQVZFX1dOT19DT1ZFUkVEX1NXSVRDSF9ERUZBVUxUX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdkZXByZWNhdGVkLXJlZ2lzdGVyIExJQk9NUF9IQVZFX1dOT19ERVBSRUNBVEVEX1JFR0lTVEVSX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdzaWduLWNvbXBhcmUgTElCT01QX0hBVkVfV05PX1NJR05fQ09NUEFSRV9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZ251LWFub255bW91cy1zdHJ1Y3QgTElCT01QX0hBVkVfV05PX0dOVV9BTk9OWU1PVVNfU1RSVUNUX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVd1bmtub3duLXByYWdtYXMgTElCT01QX0hBVkVfV05PX1VOS05PV05fUFJBR01BU19GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XbWlzc2luZy1maWVsZC1pbml0aWFsaXplcnMgTElCT01QX0hBVkVfV05PX01JU1NJTkdfRklFTERfSU5JVElBTElaRVJTX0ZMQUcpCitjaGVja19jX2NvbXBpbGVyX2ZsYWcoLVdtaXNzaW5nLWJyYWNlcyBMSUJPTVBfSEFWRV9XTk9fTUlTU0lOR19CUkFDRVNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV2NvbW1lbnQgTElCT01QX0hBVkVfV05PX0NPTU1FTlRfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtV3NlbGYtYXNzaWduIExJQk9NUF9IQVZFX1dOT19TRUxGX0FTU0lHTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XdmxhLWV4dGVuc2lvbiBMSUJPTVBfSEFWRV9XTk9fVkxBX0VYVEVOU0lPTl9GTEFHKQorY2hlY2tfY19jb21waWxlcl9mbGFnKC1XZm9ybWF0LXBlZGFudGljIExJQk9NUF9IQVZFX1dOT19GT1JNQVRfUEVEQU5USUNfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtbXNzZTIgTElCT01QX0hBVkVfTVNTRTJfRkxBRykKK2NoZWNrX2NfY29tcGlsZXJfZmxhZygtZnRscy1tb2RlbD1pbml0aWFsLWV4ZWMgTElCT01QX0hBVkVfRlRMU19NT0RFTF9GTEFHKQorbGlib21wX2NoZWNrX2FyY2hpdGVjdHVyZV9mbGFnKC1tbWljIExJQk9NUF9IQVZFX01NSUNfRkxBRykKK2xpYm9tcF9jaGVja19hcmNoaXRlY3R1cmVfZmxhZygtbTMyIExJQk9NUF9IQVZFX00zMl9GTEFHKQoraWYoV0lOMzIpCisgICMgQ2hlY2sgV2luZG93cyBNU1ZDIHN0eWxlIGZsYWdzLgorICBjaGVja19jX2NvbXBpbGVyX2ZsYWcoL1RQIExJQk9NUF9IQVZFX1RQX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9FSHNjIExJQk9NUF9IQVZFX0VIU0NfRkxBRykKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL0dTIExJQk9NUF9IQVZFX0dTX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9PeS0gTElCT01QX0hBVkVfT3lfX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9hcmNoOlNTRTIgTElCT01QX0hBVkVfQVJDSF9TU0UyX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKC9Rc2FmZXNlaCBMSUJPTVBfSEFWRV9RU0FGRVNFSF9GTEFHKQorICAjIEl0IGlzIGRpZmZpY3VsdCB0byBjcmVhdGUgYSBkdW1teSBtYXNtIGFzc2VtYmx5IGZpbGUKKyAgIyBhbmQgdGhlbiBjaGVjayB0aGUgTUFTTSBhc3NlbWJsZXIgdG8gc2VlIGlmIHRoZXNlIGZsYWdzIGV4aXN0IGFuZCB3b3JrLAorICAjIHNvIHdlIGFzc3VtZSB0aGV5IGRvIGZvciBXaW5kb3dzLgorICBzZXQoTElCT01QX0hBVkVfU0FGRVNFSF9NQVNNX0ZMQUcgVFJVRSkKKyAgc2V0KExJQk9NUF9IQVZFX0NPRkZfTUFTTV9GTEFHIFRSVUUpCisgICMgQ2hhbmdlIFdpbmRvd3MgZmxhZ3MgL01EeCB0byAvTVR4CisgIGZvcmVhY2gobGlib21wX2xhbmcgSU4gSVRFTVMgQyBDWFgpCisgICAgZm9yZWFjaChsaWJvbXBfYnR5cGUgSU4gSVRFTVMgREVCVUcgUkVMV0lUSERFQklORk8gUkVMRUFTRSBNSU5TSVpFUkVMKQorICAgICAgc3RyaW5nKFJFUExBQ0UgIi9NRCIgIi9NVCIKKyAgICAgICAgQ01BS0VfJHtsaWJvbXBfbGFuZ31fRkxBR1NfJHtsaWJvbXBfYnR5cGV9CisgICAgICAgICIke0NNQUtFXyR7bGlib21wX2xhbmd9X0ZMQUdTXyR7bGlib21wX2J0eXBlfX0iCisgICAgICApCisgICAgZW5kZm9yZWFjaCgpCisgIGVuZGZvcmVhY2goKQorZWxzZSgpCisgICMgSXQgaXMgZGlmZmljdWx0IHRvIGNyZWF0ZSBhIGR1bW15IGFzc2VtYmx5IGZpbGUgdGhhdCBjb21waWxlcyBpbnRvIGFuCisgICMgZXhlY3R1YWJsZSBmb3IgZXZlcnkgYXJjaGl0ZWN0dXJlIGFuZCB0aGVuIGNoZWNrIHRoZSBDIGNvbXBpbGVyIHRvCisgICMgc2VlIGlmIC14IGFzc2VtYmxlci13aXRoLWNwcCBleGlzdHMgYW5kIHdvcmtzLCBzbyB3ZSBhc3N1bWUgaXQgZG9lcyBmb3Igbm9uLVdpbmRvd3MuCisgIHNldChMSUJPTVBfSEFWRV9YX0FTU0VNQkxFUl9XSVRIX0NQUF9GTEFHIFRSVUUpCitlbmRpZigpCitpZigke0xJQk9NUF9GT1JUUkFOX01PRFVMRVN9KQorICBsaWJvbXBfY2hlY2tfZm9ydHJhbl9mbGFnKC1tMzIgTElCT01QX0hBVkVfTTMyX0ZPUlRSQU5fRkxBRykKK2VuZGlmKCkKKworIyBDaGVjayBsaW5rZXIgZmxhZ3MKK2lmKFdJTjMyKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoL1NBRkVTRUggTElCT01QX0hBVkVfU0FGRVNFSF9GTEFHKQorZWxzZWlmKE5PVCBBUFBMRSkKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwteCBMSUJPTVBfSEFWRV9YX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLS13YXJuLXNoYXJlZC10ZXh0cmVsIExJQk9NUF9IQVZFX1dBUk5fU0hBUkVEX1RFWFRSRUxfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwtLWFzLW5lZWRlZCBMSUJPTVBfSEFWRV9BU19ORUVERURfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKCItV2wsLS12ZXJzaW9uLXNjcmlwdD0ke0xJQk9NUF9TUkNfRElSfS9leHBvcnRzX3NvLnR4dCIgTElCT01QX0hBVkVfVkVSU0lPTl9TQ1JJUFRfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1zdGF0aWMtbGliZ2NjIExJQk9NUF9IQVZFX1NUQVRJQ19MSUJHQ0NfRkxBRykKKyAgbGlib21wX2NoZWNrX2xpbmtlcl9mbGFnKC1XbCwteixub2V4ZWNzdGFjayBMSUJPTVBfSEFWRV9aX05PRVhFQ1NUQUNLX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtV2wsLWZpbmk9X19rbXBfaW50ZXJuYWxfZW5kX2ZpbmkgTElCT01QX0hBVkVfRklOSV9GTEFHKQorZW5kaWYoKQorCisjIENoZWNrIEludGVsKFIpIEMgQ29tcGlsZXIgc3BlY2lmaWMgZmxhZ3MKK2lmKENNQUtFX0NfQ09NUElMRVJfSUQgU1RSRVFVQUwgIkludGVsIikKKyAgY2hlY2tfY3h4X2NvbXBpbGVyX2ZsYWcoL1Fsb25nX2RvdWJsZSBMSUJPTVBfSEFWRV9MT05HX0RPVUJMRV9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUWRpYWctZGlzYWJsZToxNzcgTElCT01QX0hBVkVfRElBR19ESVNBQkxFXzE3N19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygvUWlubGluZS1taW4tc2l6ZT0xIExJQk9NUF9IQVZFX0lOTElORV9NSU5fU0laRV9GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygtUW9wdGlvbixjcHAsLS1leHRlbmRlZF9mbG9hdF90eXBlcyBMSUJPTVBfSEFWRV9FWFRFTkRFRF9GTE9BVF9UWVBFU19GTEFHKQorICBjaGVja19jeHhfY29tcGlsZXJfZmxhZygtZmFsaWduLXN0YWNrPW1haW50YWluLTE2LWJ5dGUgTElCT01QX0hBVkVfRkFMSUdOX1NUQUNLX0ZMQUcpCisgIGNoZWNrX2N4eF9jb21waWxlcl9mbGFnKCItb3B0LXN0cmVhbWluZy1zdG9yZXMgbmV2ZXIiIExJQk9NUF9IQVZFX09QVF9TVFJFQU1JTkdfU1RPUkVTX0ZMQUcpCisgIGxpYm9tcF9jaGVja19saW5rZXJfZmxhZygtc3RhdGljLWludGVsIExJQk9NUF9IQVZFX1NUQVRJQ19JTlRFTF9GTEFHKQorICBsaWJvbXBfY2hlY2tfbGlua2VyX2ZsYWcoLW5vLWludGVsLWV4dGVuc2lvbnMgTElCT01QX0hBVkVfTk9fSU5URUxfRVhURU5TSU9OU19GTEFHKQorICBjaGVja19saWJyYXJ5X2V4aXN0cyhpcmNfcGljIF9pbnRlbF9mYXN0X21lbWNweSAiIiBMSUJPTVBfSEFWRV9JUkNfUElDX0xJQlJBUlkpCitlbmRpZigpCisKKyMgQ2hlY2tpbmcgVGhyZWFkaW5nIHJlcXVpcmVtZW50cworZmluZF9wYWNrYWdlKFRocmVhZHMgUkVRVUlSRUQpCitpZihXSU4zMikKKyAgaWYoTk9UIENNQUtFX1VTRV9XSU4zMl9USFJFQURTX0lOSVQpCisgICAgbGlib21wX2Vycm9yX3NheSgiTmVlZCBXaW4zMiB0aHJlYWQgaW50ZXJmYWNlIG9uIFdpbmRvd3MuIikKKyAgZW5kaWYoKQorZWxzZSgpCisgIGlmKE5PVCBDTUFLRV9VU0VfUFRIUkVBRFNfSU5JVCkKKyAgICBsaWJvbXBfZXJyb3Jfc2F5KCJOZWVkIHB0aHJlYWQgaW50ZXJmYWNlIG9uIFVuaXgtbGlrZSBzeXN0ZW1zLiIpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBGaW5kIHBlcmwgZXhlY3V0YWJsZQorIyBQZXJsIGlzIHVzZWQgdG8gY3JlYXRlIG9tcC5oIChhbmQgb3RoZXIgaGVhZGVycykgYWxvbmcgd2l0aCBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCitmaW5kX3BhY2thZ2UoUGVybCBSRVFVSVJFRCkKKyMgVGhlIHBlcmwgc2NyaXB0cyB0YWtlIHRoZSAtLW9zPS8tLWFyY2g9IGZsYWdzIHdoaWNoIGV4cGVjdCBhIGNlcnRhaW4gZm9ybWF0IGZvciBvcGVyYXRpbmcgc3lzdGVtcyBhbmQgYXJjaCdzLgorIyBVbnRpbCB0aGUgcGVybCBzY3JpcHRzIGFyZSByZW1vdmVkLCB0aGUgbW9zdCBwb3J0YWJsZSB3YXkgdG8gaGFuZGxlIHRoaXMgaXMgdG8gaGF2ZSBhbGwgb3BlcmF0aW5nIHN5c3RlbXMgdGhhdAorIyBhcmUgbmVpdGhlciBXaW5kb3dzIG5vciBNYWMgKE1vc3QgVW5peCBmbGF2b3JzKSBiZSBjb25zaWRlcmVkIGxpbiB0byB0aGUgcGVybCBzY3JpcHRzLiAgVGhpcyBpcyByb290ZWQKKyMgaW4gdGhhdCBhbGwgdGhlIFBlcmwgc2NyaXB0cyBjaGVjayB0aGUgb3BlcmF0aW5nIHN5c3RlbSBhbmQgd2lsbCBmYWlsIGlmIGl0IGlzbid0ICJ2YWxpZCIuICBUaGlzCisjIHRlbXBvcmFyeSBzb2x1dGlvbiBsZXRzIHVzIGF2b2lkIHRyeWluZyB0byBlbnVtZXJhdGUgYWxsIHRoZSBwb3NzaWJsZSBPUyB2YWx1ZXMgaW5zaWRlIHRoZSBQZXJsIG1vZHVsZXMuCitpZihXSU4zMikKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9PUyB3aW4pCitlbHNlaWYoQVBQTEUpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1MgbWFjKQorZWxzZSgpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfT1MgbGluKQorZW5kaWYoKQoraWYoSUEzMikKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9BUkNIIDMyKQorZWxzZWlmKE1JQykKKyAgc2V0KExJQk9NUF9QRVJMX1NDUklQVF9BUkNIIG1pYykKK2Vsc2VpZihJTlRFTDY0KQorICBzZXQoTElCT01QX1BFUkxfU0NSSVBUX0FSQ0ggMzJlKQorZWxzZSgpCisgIHNldChMSUJPTVBfUEVSTF9TQ1JJUFRfQVJDSCAke0xJQk9NUF9BUkNIfSkKK2VuZGlmKCkKKworIyBDaGVja2luZyBmZWF0dXJlcworIyBDaGVjayBpZiB2ZXJzaW9uIHN5bWJvbCBhc3NlbWJsZXIgZGlyZWN0aXZlcyBhcmUgc3VwcG9ydGVkCitsaWJvbXBfY2hlY2tfdmVyc2lvbl9zeW1ib2xzKExJQk9NUF9IQVZFX1ZFUlNJT05fU1lNQk9MUykKKworIyBDaGVjayBpZiBxdWFkIHByZWNpc2lvbiB0eXBlcyBhcmUgYXZhaWxhYmxlCitpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJHTlUiKQorICBzZXQoTElCT01QX0hBVkVfUVVBRF9QUkVDSVNJT04gVFJVRSkKK2Vsc2VpZihDTUFLRV9DX0NPTVBJTEVSX0lEIFNUUkVRVUFMICJJbnRlbCIpCisgIGlmKExJQk9NUF9IQVZFX0VYVEVOREVEX0ZMT0FUX1RZUEVTX0ZMQUcpCisgICAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9RVUFEX1BSRUNJU0lPTiBUUlVFKQorICBlbmRpZigpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9IQVZFX1FVQURfUFJFQ0lTSU9OIEZBTFNFKQorZW5kaWYoKQorCisjIENoZWNrIGlmIGFkYXB0aXZlIGxvY2tzIGFyZSBhdmFpbGFibGUKK2lmKCgke0lBMzJ9IE9SICR7SU5URUw2NH0pIEFORCBOT1QgTVNWQykKKyAgc2V0KExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTIFRSVUUpCitlbHNlKCkKKyAgc2V0KExJQk9NUF9IQVZFX0FEQVBUSVZFX0xPQ0tTIEZBTFNFKQorZW5kaWYoKQorCisjIENoZWNrIGlmIHN0YXRzLWdhdGhlcmluZyBpcyBhdmFpbGFibGUKK2lmKCR7TElCT01QX1NUQVRTfSkKKyAgY2hlY2tfY19zb3VyY2VfY29tcGlsZXMoCisgICAgICJfX3RocmVhZCBpbnQgeDsKKyAgICAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQorICAgICB7IHggPSBhcmdjOyByZXR1cm4geDsgfSIKKyAgICAgTElCT01QX0hBVkVfX19USFJFQUQpCisgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKAorICAgICAiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQorICAgICB7IHVuc2lnbmVkIGxvbmcgbG9uZyB0ID0gX19idWlsdGluX3JlYWRjeWNsZWNvdW50ZXIoKTsgcmV0dXJuIDA7IH0iCisgICAgIExJQk9NUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSKQorICBpZihOT1QgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIpCisgICAgaWYoJHtJQTMyfSBPUiAke0lOVEVMNjR9IE9SICR7TUlDfSkKKyAgICAgIGNoZWNrX2luY2x1ZGVfZmlsZSh4ODZpbnRyaW4uaCBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCkKKyAgICAgIGxpYm9tcF9hcHBlbmQoQ01BS0VfUkVRVUlSRURfREVGSU5JVElPTlMgLURMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSCkKKyAgICAgIGNoZWNrX2Nfc291cmNlX2NvbXBpbGVzKAorICAgICAgICAiI2lmZGVmIExJQk9NUF9IQVZFX1g4NklOVFJJTl9ICisgICAgICAgICAjIGluY2x1ZGUgPHg4NmludHJpbi5oPgorICAgICAgICAgI2VuZGlmCisgICAgICAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpIHsgdW5zaWduZWQgbG9uZyBsb25nIHQgPSBfX3JkdHNjKCk7IHJldHVybiAwOyB9IiBMSUJPTVBfSEFWRV9fX1JEVFNDKQorICAgICAgc2V0KENNQUtFX1JFUVVJUkVEX0RFRklOSVRJT05TKQorICAgIGVuZGlmKCkKKyAgZW5kaWYoKQorICBpZihMSUJPTVBfSEFWRV9fX1RIUkVBRCBBTkQgKExJQk9NUF9IQVZFX19fUkRUU0MgT1IgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIpKQorICAgIHNldChMSUJPTVBfSEFWRV9TVEFUUyBUUlVFKQorICBlbHNlKCkKKyAgICBzZXQoTElCT01QX0hBVkVfU1RBVFMgRkFMU0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBPTVBUIHN1cHBvcnQgaXMgYXZhaWxhYmxlCisjIEN1cnJlbnRseSwgX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoKSBpcyByZXF1aXJlZCBmb3IgT01QVAorIyBXZWFrIGF0dHJpYnV0ZSBpcyByZXF1aXJlZCBmb3IgVW5pY2VzLCBMSUJQU0FQSSBpcyB1c2VkIGZvciBXaW5kb3dzCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHZvaWQqIHAgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgcmV0dXJuIDA7fSIgTElCT01QX0hBVkVfX19CVUlMVElOX0ZSQU1FX0FERFJFU1MpCitjaGVja19jX3NvdXJjZV9jb21waWxlcygiX19hdHRyaWJ1dGVfXyAoKHdlYWspKSBpbnQgZm9vKGludCBhKSB7IHJldHVybiBhKmE7IH0KKyAgaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KSB7CisgIHJldHVybiBmb28oYXJnYyk7fSIgTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUpCitjaGVja19pbmNsdWRlX2ZpbGVzKCJ3aW5kb3dzLmg7cHNhcGkuaCIgTElCT01QX0hBVkVfUFNBUElfSCkKK2NoZWNrX2xpYnJhcnlfZXhpc3RzKHBzYXBpIEVudW1Qcm9jZXNzTW9kdWxlcyAiIiBMSUJPTVBfSEFWRV9MSUJQU0FQSSkKK2lmKExJQk9NUF9IQVZFX1BTQVBJX0ggQU5EIExJQk9NUF9IQVZFX0xJQlBTQVBJKQorICBzZXQoTElCT01QX0hBVkVfUFNBUEkgVFJVRSkKK2VuZGlmKCkKK2lmKE5PVCBMSUJPTVBfSEFWRV9fX0JVSUxUSU5fRlJBTUVfQUREUkVTUykKKyAgc2V0KExJQk9NUF9IQVZFX09NUFRfU1VQUE9SVCBGQUxTRSkKK2Vsc2UoKQorICBpZihMSUJPTVBfSEFWRV9XRUFLX0FUVFJJQlVURSBPUiBMSUJPTVBfSEFWRV9QU0FQSSkKKyAgICBzZXQoTElCT01QX0hBVkVfT01QVF9TVVBQT1JUIFRSVUUpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfSEFWRV9PTVBUX1NVUFBPUlQgRkFMU0UpCisgIGVuZGlmKCkKK2VuZGlmKCkKKworIyBDaGVjayBpZiBIV0xPQyBzdXBwb3J0IGlzIGF2YWlsYWJsZQoraWYoJHtMSUJPTVBfVVNFX0hXTE9DfSkKKyAgc2V0KENNQUtFX1JFUVVJUkVEX0lOQ0xVREVTICR7TElCT01QX0hXTE9DX0lOU1RBTExfRElSfS9pbmNsdWRlKQorICBjaGVja19pbmNsdWRlX2ZpbGUoaHdsb2MuaCBMSUJPTVBfSEFWRV9IV0xPQ19IKQorICBzZXQoQ01BS0VfUkVRVUlSRURfSU5DTFVERVMpCisgIGZpbmRfbGlicmFyeShMSUJPTVBfSFdMT0NfTElCUkFSWQorICAgIE5BTUVTIGh3bG9jIGxpYmh3bG9jCisgICAgSElOVFMgJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2xpYikKKyAgaWYoTElCT01QX0hXTE9DX0xJQlJBUlkpCisgICAgY2hlY2tfbGlicmFyeV9leGlzdHMoJHtMSUJPTVBfSFdMT0NfTElCUkFSWX0gaHdsb2NfdG9wb2xvZ3lfaW5pdAorICAgICAgJHtMSUJPTVBfSFdMT0NfSU5TVEFMTF9ESVJ9L2xpYiBMSUJPTVBfSEFWRV9MSUJIV0xPQykKKyAgICBnZXRfZmlsZW5hbWVfY29tcG9uZW50KExJQk9NUF9IV0xPQ19MSUJSQVJZX0RJUiAke0xJQk9NUF9IV0xPQ19MSUJSQVJZfSBQQVRIKQorICBlbmRpZigpCisgIGlmKExJQk9NUF9IQVZFX0hXTE9DX0ggQU5EIExJQk9NUF9IQVZFX0xJQkhXTE9DIEFORCBMSUJPTVBfSFdMT0NfTElCUkFSWSkKKyAgICBzZXQoTElCT01QX0hBVkVfSFdMT0MgVFJVRSkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9IQVZFX0hXTE9DIEZBTFNFKQorICAgIGxpYm9tcF9zYXkoIkNvdWxkIG5vdCBmaW5kIGh3bG9jIikKKyAgZW5kaWYoKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZiBiL3JjMy9ydW50aW1lL2RvYy9SZWZlcmVuY2UucGRmCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU5N2M0MGMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9kb2MvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9jb25maWcgYi9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9jb25maWcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTAyZmRiZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2NvbmZpZwpAQCAtMCwwICsxLDE4MjIgQEAKKyMgRG94eWZpbGUgMS5vOC4yDQorDQorIyBUaGlzIGZpbGUgZGVzY3JpYmVzIHRoZSBzZXR0aW5ncyB0byBiZSB1c2VkIGJ5IHRoZSBkb2N1bWVudGF0aW9uIHN5c3RlbQ0KKyMgZG94eWdlbiAod3d3LmRveHlnZW4ub3JnKSBmb3IgYSBwcm9qZWN0Lg0KKyMNCisjIEFsbCB0ZXh0IGFmdGVyIGEgaGFzaCAoIykgaXMgY29uc2lkZXJlZCBhIGNvbW1lbnQgYW5kIHdpbGwgYmUgaWdub3JlZC4NCisjIFRoZSBmb3JtYXQgaXM6DQorIyAgICAgICBUQUcgPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIEZvciBsaXN0cyBpdGVtcyBjYW4gYWxzbyBiZSBhcHBlbmRlZCB1c2luZzoNCisjICAgICAgIFRBRyArPSB2YWx1ZSBbdmFsdWUsIC4uLl0NCisjIFZhbHVlcyB0aGF0IGNvbnRhaW4gc3BhY2VzIHNob3VsZCBiZSBwbGFjZWQgYmV0d2VlbiBxdW90ZXMgKCIgIikuDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgUHJvamVjdCByZWxhdGVkIGNvbmZpZ3VyYXRpb24gb3B0aW9ucw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIFRoaXMgdGFnIHNwZWNpZmllcyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsIGNoYXJhY3RlcnMgaW4gdGhlIGNvbmZpZyBmaWxlDQorIyB0aGF0IGZvbGxvdy4gVGhlIGRlZmF1bHQgaXMgVVRGLTggd2hpY2ggaXMgYWxzbyB0aGUgZW5jb2RpbmcgdXNlZCBmb3IgYWxsDQorIyB0ZXh0IGJlZm9yZSB0aGUgZmlyc3Qgb2NjdXJyZW5jZSBvZiB0aGlzIHRhZy4gRG94eWdlbiB1c2VzIGxpYmljb252IChvciB0aGUNCisjIGljb252IGJ1aWx0IGludG8gbGliYykgZm9yIHRoZSB0cmFuc2NvZGluZy4gU2VlDQorIyBodHRwOi8vd3d3LmdudS5vcmcvc29mdHdhcmUvbGliaWNvbnYgZm9yIHRoZSBsaXN0IG9mIHBvc3NpYmxlIGVuY29kaW5ncy4NCisNCitET1hZRklMRV9FTkNPRElORyAgICAgID0gVVRGLTgNCisNCisjIFRoZSBQUk9KRUNUX05BTUUgdGFnIGlzIGEgc2luZ2xlIHdvcmQgKG9yIHNlcXVlbmNlIG9mIHdvcmRzKSB0aGF0IHNob3VsZA0KKyMgaWRlbnRpZnkgdGhlIHByb2plY3QuIE5vdGUgdGhhdCBpZiB5b3UgZG8gbm90IHVzZSBEb3h5d2l6YXJkIHlvdSBuZWVkDQorIyB0byBwdXQgcXVvdGVzIGFyb3VuZCB0aGUgcHJvamVjdCBuYW1lIGlmIGl0IGNvbnRhaW5zIHNwYWNlcy4NCisNCitQUk9KRUNUX05BTUUgICAgICAgICAgID0gIkxMVk0gT3Blbk1QKiBSdW50aW1lIExpYnJhcnkiDQorDQorIyBUaGUgUFJPSkVDVF9OVU1CRVIgdGFnIGNhbiBiZSB1c2VkIHRvIGVudGVyIGEgcHJvamVjdCBvciByZXZpc2lvbiBudW1iZXIuDQorIyBUaGlzIGNvdWxkIGJlIGhhbmR5IGZvciBhcmNoaXZpbmcgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIG9yDQorIyBpZiBzb21lIHZlcnNpb24gY29udHJvbCBzeXN0ZW0gaXMgdXNlZC4NCisNCitQUk9KRUNUX05VTUJFUiAgICAgICAgID0NCisNCisjIFVzaW5nIHRoZSBQUk9KRUNUX0JSSUVGIHRhZyBvbmUgY2FuIHByb3ZpZGUgYW4gb3B0aW9uYWwgb25lIGxpbmUgZGVzY3JpcHRpb24NCisjIGZvciBhIHByb2plY3QgdGhhdCBhcHBlYXJzIGF0IHRoZSB0b3Agb2YgZWFjaCBwYWdlIGFuZCBzaG91bGQgZ2l2ZSB2aWV3ZXINCisjIGEgcXVpY2sgaWRlYSBhYm91dCB0aGUgcHVycG9zZSBvZiB0aGUgcHJvamVjdC4gS2VlcCB0aGUgZGVzY3JpcHRpb24gc2hvcnQuDQorDQorUFJPSkVDVF9CUklFRiAgICAgICAgICA9DQorDQorIyBXaXRoIHRoZSBQUk9KRUNUX0xPR08gdGFnIG9uZSBjYW4gc3BlY2lmeSBhbiBsb2dvIG9yIGljb24gdGhhdCBpcw0KKyMgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uIFRoZSBtYXhpbXVtIGhlaWdodCBvZiB0aGUgbG9nbyBzaG91bGQgbm90DQorIyBleGNlZWQgNTUgcGl4ZWxzIGFuZCB0aGUgbWF4aW11bSB3aWR0aCBzaG91bGQgbm90IGV4Y2VlZCAyMDAgcGl4ZWxzLg0KKyMgRG94eWdlbiB3aWxsIGNvcHkgdGhlIGxvZ28gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorUFJPSkVDVF9MT0dPICAgICAgICAgICA9DQorDQorIyBUaGUgT1VUUFVUX0RJUkVDVE9SWSB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHRoZSAocmVsYXRpdmUgb3IgYWJzb2x1dGUpDQorIyBiYXNlIHBhdGggd2hlcmUgdGhlIGdlbmVyYXRlZCBkb2N1bWVudGF0aW9uIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQsIGl0IHdpbGwgYmUgcmVsYXRpdmUgdG8gdGhlIGxvY2F0aW9uDQorIyB3aGVyZSBkb3h5Z2VuIHdhcyBzdGFydGVkLiBJZiBsZWZ0IGJsYW5rIHRoZSBjdXJyZW50IGRpcmVjdG9yeSB3aWxsIGJlIHVzZWQuDQorDQorT1VUUFVUX0RJUkVDVE9SWSAgICAgICA9IGRvYy9kb3h5Z2VuL2dlbmVyYXRlZA0KKw0KKyMgSWYgdGhlIENSRUFURV9TVUJESVJTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBjcmVhdGUNCisjIDQwOTYgc3ViLWRpcmVjdG9yaWVzIChpbiAyIGxldmVscykgdW5kZXIgdGhlIG91dHB1dCBkaXJlY3Rvcnkgb2YgZWFjaCBvdXRwdXQNCisjIGZvcm1hdCBhbmQgd2lsbCBkaXN0cmlidXRlIHRoZSBnZW5lcmF0ZWQgZmlsZXMgb3ZlciB0aGVzZSBkaXJlY3Rvcmllcy4NCisjIEVuYWJsaW5nIHRoaXMgb3B0aW9uIGNhbiBiZSB1c2VmdWwgd2hlbiBmZWVkaW5nIGRveHlnZW4gYSBodWdlIGFtb3VudCBvZg0KKyMgc291cmNlIGZpbGVzLCB3aGVyZSBwdXR0aW5nIGFsbCBnZW5lcmF0ZWQgZmlsZXMgaW4gdGhlIHNhbWUgZGlyZWN0b3J5IHdvdWxkDQorIyBvdGhlcndpc2UgY2F1c2UgcGVyZm9ybWFuY2UgcHJvYmxlbXMgZm9yIHRoZSBmaWxlIHN5c3RlbS4NCisNCitDUkVBVEVfU1VCRElSUyAgICAgICAgID0gTk8NCisNCisjIFRoZSBPVVRQVVRfTEFOR1VBR0UgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB0aGUgbGFuZ3VhZ2UgaW4gd2hpY2ggYWxsDQorIyBkb2N1bWVudGF0aW9uIGdlbmVyYXRlZCBieSBkb3h5Z2VuIGlzIHdyaXR0ZW4uIERveHlnZW4gd2lsbCB1c2UgdGhpcw0KKyMgaW5mb3JtYXRpb24gdG8gZ2VuZXJhdGUgYWxsIGNvbnN0YW50IG91dHB1dCBpbiB0aGUgcHJvcGVyIGxhbmd1YWdlLg0KKyMgVGhlIGRlZmF1bHQgbGFuZ3VhZ2UgaXMgRW5nbGlzaCwgb3RoZXIgc3VwcG9ydGVkIGxhbmd1YWdlcyBhcmU6DQorIyBBZnJpa2FhbnMsIEFyYWJpYywgQnJhemlsaWFuLCBDYXRhbGFuLCBDaGluZXNlLCBDaGluZXNlLVRyYWRpdGlvbmFsLA0KKyMgQ3JvYXRpYW4sIEN6ZWNoLCBEYW5pc2gsIER1dGNoLCBFc3BlcmFudG8sIEZhcnNpLCBGaW5uaXNoLCBGcmVuY2gsIEdlcm1hbiwNCisjIEdyZWVrLCBIdW5nYXJpYW4sIEl0YWxpYW4sIEphcGFuZXNlLCBKYXBhbmVzZS1lbiAoSmFwYW5lc2Ugd2l0aCBFbmdsaXNoDQorIyBtZXNzYWdlcyksIEtvcmVhbiwgS29yZWFuLWVuLCBMaXRodWFuaWFuLCBOb3J3ZWdpYW4sIE1hY2Vkb25pYW4sIFBlcnNpYW4sDQorIyBQb2xpc2gsIFBvcnR1Z3Vlc2UsIFJvbWFuaWFuLCBSdXNzaWFuLCBTZXJiaWFuLCBTZXJiaWFuLUN5cmlsbGljLCBTbG92YWssDQorIyBTbG92ZW5lLCBTcGFuaXNoLCBTd2VkaXNoLCBVa3JhaW5pYW4sIGFuZCBWaWV0bmFtZXNlLg0KKw0KK09VVFBVVF9MQU5HVUFHRSAgICAgICAgPSBFbmdsaXNoDQorDQorIyBJZiB0aGUgQlJJRUZfTUVNQkVSX0RFU0MgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIGluY2x1ZGUgYnJpZWYgbWVtYmVyIGRlc2NyaXB0aW9ucyBhZnRlciB0aGUgbWVtYmVycyB0aGF0IGFyZSBsaXN0ZWQgaW4NCisjIHRoZSBmaWxlIGFuZCBjbGFzcyBkb2N1bWVudGF0aW9uIChzaW1pbGFyIHRvIEphdmFEb2MpLg0KKyMgU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4NCisNCitCUklFRl9NRU1CRVJfREVTQyAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgUkVQRUFUX0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsIHByZXBlbmQNCisjIHRoZSBicmllZiBkZXNjcmlwdGlvbiBvZiBhIG1lbWJlciBvciBmdW5jdGlvbiBiZWZvcmUgdGhlIGRldGFpbGVkIGRlc2NyaXB0aW9uLg0KKyMgTm90ZTogaWYgYm90aCBISURFX1VORE9DX01FTUJFUlMgYW5kIEJSSUVGX01FTUJFUl9ERVNDIGFyZSBzZXQgdG8gTk8sIHRoZQ0KKyMgYnJpZWYgZGVzY3JpcHRpb25zIHdpbGwgYmUgY29tcGxldGVseSBzdXBwcmVzc2VkLg0KKw0KK1JFUEVBVF9CUklFRiAgICAgICAgICAgPSBZRVMNCisNCisjIFRoaXMgdGFnIGltcGxlbWVudHMgYSBxdWFzaS1pbnRlbGxpZ2VudCBicmllZiBkZXNjcmlwdGlvbiBhYmJyZXZpYXRvcg0KKyMgdGhhdCBpcyB1c2VkIHRvIGZvcm0gdGhlIHRleHQgaW4gdmFyaW91cyBsaXN0aW5ncy4gRWFjaCBzdHJpbmcNCisjIGluIHRoaXMgbGlzdCwgaWYgZm91bmQgYXMgdGhlIGxlYWRpbmcgdGV4dCBvZiB0aGUgYnJpZWYgZGVzY3JpcHRpb24sIHdpbGwgYmUNCisjIHN0cmlwcGVkIGZyb20gdGhlIHRleHQgYW5kIHRoZSByZXN1bHQgYWZ0ZXIgcHJvY2Vzc2luZyB0aGUgd2hvbGUgbGlzdCwgaXMNCisjIHVzZWQgYXMgdGhlIGFubm90YXRlZCB0ZXh0LiBPdGhlcndpc2UsIHRoZSBicmllZiBkZXNjcmlwdGlvbiBpcyB1c2VkIGFzLWlzLg0KKyMgSWYgbGVmdCBibGFuaywgdGhlIGZvbGxvd2luZyB2YWx1ZXMgYXJlIHVzZWQgKCIkbmFtZSIgaXMgYXV0b21hdGljYWxseQ0KKyMgcmVwbGFjZWQgd2l0aCB0aGUgbmFtZSBvZiB0aGUgZW50aXR5KTogIlRoZSAkbmFtZSBjbGFzcyIgIlRoZSAkbmFtZSB3aWRnZXQiDQorIyAiVGhlICRuYW1lIGZpbGUiICJpcyIgInByb3ZpZGVzIiAic3BlY2lmaWVzIiAiY29udGFpbnMiDQorIyAicmVwcmVzZW50cyIgImEiICJhbiIgInRoZSINCisNCitBQkJSRVZJQVRFX0JSSUVGICAgICAgID0NCisNCisjIElmIHRoZSBBTFdBWVNfREVUQUlMRURfU0VDIGFuZCBSRVBFQVRfQlJJRUYgdGFncyBhcmUgYm90aCBzZXQgdG8gWUVTIHRoZW4NCisjIERveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGRldGFpbGVkIHNlY3Rpb24gZXZlbiBpZiB0aGVyZSBpcyBvbmx5IGEgYnJpZWYNCisjIGRlc2NyaXB0aW9uLg0KKw0KK0FMV0FZU19ERVRBSUxFRF9TRUMgICAgPSBOTw0KKw0KKyMgSWYgdGhlIElOTElORV9JTkhFUklURURfTUVNQiB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIHNob3cgYWxsDQorIyBpbmhlcml0ZWQgbWVtYmVycyBvZiBhIGNsYXNzIGluIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoYXQgY2xhc3MgYXMgaWYgdGhvc2UNCisjIG1lbWJlcnMgd2VyZSBvcmRpbmFyeSBjbGFzcyBtZW1iZXJzLiBDb25zdHJ1Y3RvcnMsIGRlc3RydWN0b3JzIGFuZCBhc3NpZ25tZW50DQorIyBvcGVyYXRvcnMgb2YgdGhlIGJhc2UgY2xhc3NlcyB3aWxsIG5vdCBiZSBzaG93bi4NCisNCitJTkxJTkVfSU5IRVJJVEVEX01FTUIgID0gTk8NCisNCisjIElmIHRoZSBGVUxMX1BBVEhfTkFNRVMgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBEb3h5Z2VuIHdpbGwgcHJlcGVuZCB0aGUgZnVsbA0KKyMgcGF0aCBiZWZvcmUgZmlsZXMgbmFtZSBpbiB0aGUgZmlsZSBsaXN0IGFuZCBpbiB0aGUgaGVhZGVyIGZpbGVzLiBJZiBzZXQNCisjIHRvIE5PIHRoZSBzaG9ydGVzdCBwYXRoIHRoYXQgbWFrZXMgdGhlIGZpbGUgbmFtZSB1bmlxdWUgd2lsbCBiZSB1c2VkLg0KKw0KK0ZVTExfUEFUSF9OQU1FUyAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEZVTExfUEFUSF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBTVFJJUF9GUk9NX1BBVEggdGFnDQorIyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mIHRoZSBwYXRoLiBTdHJpcHBpbmcgaXMNCisjIG9ubHkgZG9uZSBpZiBvbmUgb2YgdGhlIHNwZWNpZmllZCBzdHJpbmdzIG1hdGNoZXMgdGhlIGxlZnQtaGFuZCBwYXJ0IG9mDQorIyB0aGUgcGF0aC4gVGhlIHRhZyBjYW4gYmUgdXNlZCB0byBzaG93IHJlbGF0aXZlIHBhdGhzIGluIHRoZSBmaWxlIGxpc3QuDQorIyBJZiBsZWZ0IGJsYW5rIHRoZSBkaXJlY3RvcnkgZnJvbSB3aGljaCBkb3h5Z2VuIGlzIHJ1biBpcyB1c2VkIGFzIHRoZQ0KKyMgcGF0aCB0byBzdHJpcC4gTm90ZSB0aGF0IHlvdSBzcGVjaWZ5IGFic29sdXRlIHBhdGhzIGhlcmUsIGJ1dCBhbHNvDQorIyByZWxhdGl2ZSBwYXRocywgd2hpY2ggd2lsbCBiZSByZWxhdGl2ZSBmcm9tIHRoZSBkaXJlY3Rvcnkgd2hlcmUgZG94eWdlbiBpcw0KKyMgc3RhcnRlZC4NCisNCitTVFJJUF9GUk9NX1BBVEggICAgICAgID0NCisNCisjIFRoZSBTVFJJUF9GUk9NX0lOQ19QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzdHJpcCBhIHVzZXItZGVmaW5lZCBwYXJ0IG9mDQorIyB0aGUgcGF0aCBtZW50aW9uZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gb2YgYSBjbGFzcywgd2hpY2ggdGVsbHMNCisjIHRoZSByZWFkZXIgd2hpY2ggaGVhZGVyIGZpbGUgdG8gaW5jbHVkZSBpbiBvcmRlciB0byB1c2UgYSBjbGFzcy4NCisjIElmIGxlZnQgYmxhbmsgb25seSB0aGUgbmFtZSBvZiB0aGUgaGVhZGVyIGZpbGUgY29udGFpbmluZyB0aGUgY2xhc3MNCisjIGRlZmluaXRpb24gaXMgdXNlZC4gT3RoZXJ3aXNlIG9uZSBzaG91bGQgc3BlY2lmeSB0aGUgaW5jbHVkZSBwYXRocyB0aGF0DQorIyBhcmUgbm9ybWFsbHkgcGFzc2VkIHRvIHRoZSBjb21waWxlciB1c2luZyB0aGUgLUkgZmxhZy4NCisNCitTVFJJUF9GUk9NX0lOQ19QQVRIICAgID0NCisNCisjIElmIHRoZSBTSE9SVF9OQU1FUyB0YWcgaXMgc2V0IHRvIFlFUywgZG94eWdlbiB3aWxsIGdlbmVyYXRlIG11Y2ggc2hvcnRlcg0KKyMgKGJ1dCBsZXNzIHJlYWRhYmxlKSBmaWxlIG5hbWVzLiBUaGlzIGNhbiBiZSB1c2VmdWwgaWYgeW91ciBmaWxlIHN5c3RlbQ0KKyMgZG9lc24ndCBzdXBwb3J0IGxvbmcgbmFtZXMgbGlrZSBvbiBET1MsIE1hYywgb3IgQ0QtUk9NLg0KKw0KK1NIT1JUX05BTUVTICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEpBVkFET0NfQVVUT0JSSUVGIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBpbnRlcnByZXQgdGhlIGZpcnN0IGxpbmUgKHVudGlsIHRoZSBmaXJzdCBkb3QpIG9mIGEgSmF2YURvYy1zdHlsZQ0KKyMgY29tbWVudCBhcyB0aGUgYnJpZWYgZGVzY3JpcHRpb24uIElmIHNldCB0byBOTywgdGhlIEphdmFEb2MNCisjIGNvbW1lbnRzIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzDQorIyAodGh1cyByZXF1aXJpbmcgYW4gZXhwbGljaXQgQGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQ0KKw0KK0pBVkFET0NfQVVUT0JSSUVGICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFFUX0FVVE9CUklFRiB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4gd2lsbA0KKyMgaW50ZXJwcmV0IHRoZSBmaXJzdCBsaW5lICh1bnRpbCB0aGUgZmlyc3QgZG90KSBvZiBhIFF0LXN0eWxlDQorIyBjb21tZW50IGFzIHRoZSBicmllZiBkZXNjcmlwdGlvbi4gSWYgc2V0IHRvIE5PLCB0aGUgY29tbWVudHMNCisjIHdpbGwgYmVoYXZlIGp1c3QgbGlrZSByZWd1bGFyIFF0LXN0eWxlIGNvbW1lbnRzICh0aHVzIHJlcXVpcmluZw0KKyMgYW4gZXhwbGljaXQgXGJyaWVmIGNvbW1hbmQgZm9yIGEgYnJpZWYgZGVzY3JpcHRpb24uKQ0KKw0KK1FUX0FVVE9CUklFRiAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIE1VTFRJTElORV9DUFBfSVNfQlJJRUYgdGFnIGNhbiBiZSBzZXQgdG8gWUVTIHRvIG1ha2UgRG94eWdlbg0KKyMgdHJlYXQgYSBtdWx0aS1saW5lIEMrKyBzcGVjaWFsIGNvbW1lbnQgYmxvY2sgKGkuZS4gYSBibG9jayBvZiAvLyEgb3IgLy8vDQorIyBjb21tZW50cykgYXMgYSBicmllZiBkZXNjcmlwdGlvbi4gVGhpcyB1c2VkIHRvIGJlIHRoZSBkZWZhdWx0IGJlaGF2aW91ci4NCisjIFRoZSBuZXcgZGVmYXVsdCBpcyB0byB0cmVhdCBhIG11bHRpLWxpbmUgQysrIGNvbW1lbnQgYmxvY2sgYXMgYSBkZXRhaWxlZA0KKyMgZGVzY3JpcHRpb24uIFNldCB0aGlzIHRhZyB0byBZRVMgaWYgeW91IHByZWZlciB0aGUgb2xkIGJlaGF2aW91ciBpbnN0ZWFkLg0KKw0KK01VTFRJTElORV9DUFBfSVNfQlJJRUYgPSBOTw0KKw0KKyMgSWYgdGhlIElOSEVSSVRfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYW4gdW5kb2N1bWVudGVkDQorIyBtZW1iZXIgaW5oZXJpdHMgdGhlIGRvY3VtZW50YXRpb24gZnJvbSBhbnkgZG9jdW1lbnRlZCBtZW1iZXIgdGhhdCBpdA0KKyMgcmUtaW1wbGVtZW50cy4NCisNCitJTkhFUklUX0RPQ1MgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU0VQQVJBVEVfTUVNQkVSX1BBR0VTIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIGRveHlnZW4gd2lsbCBwcm9kdWNlDQorIyBhIG5ldyBwYWdlIGZvciBlYWNoIG1lbWJlci4gSWYgc2V0IHRvIE5PLCB0aGUgZG9jdW1lbnRhdGlvbiBvZiBhIG1lbWJlciB3aWxsDQorIyBiZSBwYXJ0IG9mIHRoZSBmaWxlL2NsYXNzL25hbWVzcGFjZSB0aGF0IGNvbnRhaW5zIGl0Lg0KKw0KK1NFUEFSQVRFX01FTUJFUl9QQUdFUyAgPSBOTw0KKw0KKyMgVGhlIFRBQl9TSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIG51bWJlciBvZiBzcGFjZXMgaW4gYSB0YWIuDQorIyBEb3h5Z2VuIHVzZXMgdGhpcyB2YWx1ZSB0byByZXBsYWNlIHRhYnMgYnkgc3BhY2VzIGluIGNvZGUgZnJhZ21lbnRzLg0KKw0KK1RBQl9TSVpFICAgICAgICAgICAgICAgPSA4DQorDQorIyBUaGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbnVtYmVyIG9mIGFsaWFzZXMgdGhhdCBhY3RzDQorIyBhcyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4gQW4gYWxpYXMgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4NCisjIEZvciBleGFtcGxlIGFkZGluZyAic2lkZWVmZmVjdD1ccGFyIFNpZGUgRWZmZWN0czpcbiIgd2lsbCBhbGxvdyB5b3UgdG8NCisjIHB1dCB0aGUgY29tbWFuZCBcc2lkZWVmZmVjdCAob3IgQHNpZGVlZmZlY3QpIGluIHRoZSBkb2N1bWVudGF0aW9uLCB3aGljaA0KKyMgd2lsbCByZXN1bHQgaW4gYSB1c2VyLWRlZmluZWQgcGFyYWdyYXBoIHdpdGggaGVhZGluZyAiU2lkZSBFZmZlY3RzOiIuDQorIyBZb3UgY2FuIHB1dCBcbidzIGluIHRoZSB2YWx1ZSBwYXJ0IG9mIGFuIGFsaWFzIHRvIGluc2VydCBuZXdsaW5lcy4NCisNCitBTElBU0VTICAgICAgICAgICAgICAgID0gIm90aGVyPTxzdXA+Kjwvc3VwPiINCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBudW1iZXIgb2Ygd29yZC1rZXl3b3JkIG1hcHBpbmdzIChUQ0wgb25seSkuDQorIyBBIG1hcHBpbmcgaGFzIHRoZSBmb3JtICJuYW1lPXZhbHVlIi4gRm9yIGV4YW1wbGUgYWRkaW5nDQorIyAiY2xhc3M9aXRjbDo6Y2xhc3MiIHdpbGwgYWxsb3cgeW91IHRvIHVzZSB0aGUgY29tbWFuZCBjbGFzcyBpbiB0aGUNCisjIGl0Y2w6OmNsYXNzIG1lYW5pbmcuDQorDQorVENMX1NVQlNUICAgICAgICAgICAgICA9DQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9GT1JfQyB0YWcgdG8gWUVTIGlmIHlvdXIgcHJvamVjdCBjb25zaXN0cyBvZiBDDQorIyBzb3VyY2VzIG9ubHkuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIG1vcmUgdGFpbG9yZWQgZm9yIEMuDQorIyBGb3IgaW5zdGFuY2UsIHNvbWUgb2YgdGhlIG5hbWVzIHRoYXQgYXJlIHVzZWQgd2lsbCBiZSBkaWZmZXJlbnQuIFRoZSBsaXN0DQorIyBvZiBhbGwgbWVtYmVycyB3aWxsIGJlIG9taXR0ZWQsIGV0Yy4NCisNCitPUFRJTUlaRV9PVVRQVVRfRk9SX0MgID0gTk8NCisNCisjIFNldCB0aGUgT1BUSU1JWkVfT1VUUFVUX0pBVkEgdGFnIHRvIFlFUyBpZiB5b3VyIHByb2plY3QgY29uc2lzdHMgb2YgSmF2YQ0KKyMgc291cmNlcyBvbmx5LiBEb3h5Z2VuIHdpbGwgdGhlbiBnZW5lcmF0ZSBvdXRwdXQgdGhhdCBpcyBtb3JlIHRhaWxvcmVkIGZvcg0KKyMgSmF2YS4gRm9yIGluc3RhbmNlLCBuYW1lc3BhY2VzIHdpbGwgYmUgcHJlc2VudGVkIGFzIHBhY2thZ2VzLCBxdWFsaWZpZWQNCisjIHNjb3BlcyB3aWxsIGxvb2sgZGlmZmVyZW50LCBldGMuDQorDQorT1BUSU1JWkVfT1VUUFVUX0pBVkEgICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX0ZPUl9GT1JUUkFOIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIEZvcnRyYW4NCisjIHNvdXJjZXMgb25seS4gRG94eWdlbiB3aWxsIHRoZW4gZ2VuZXJhdGUgb3V0cHV0IHRoYXQgaXMgbW9yZSB0YWlsb3JlZCBmb3INCisjIEZvcnRyYW4uDQorDQorT1BUSU1JWkVfRk9SX0ZPUlRSQU4gICA9IE5PDQorDQorIyBTZXQgdGhlIE9QVElNSVpFX09VVFBVVF9WSERMIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIFZIREwNCisjIHNvdXJjZXMuIERveHlnZW4gd2lsbCB0aGVuIGdlbmVyYXRlIG91dHB1dCB0aGF0IGlzIHRhaWxvcmVkIGZvcg0KKyMgVkhETC4NCisNCitPUFRJTUlaRV9PVVRQVVRfVkhETCAgID0gTk8NCisNCisjIERveHlnZW4gc2VsZWN0cyB0aGUgcGFyc2VyIHRvIHVzZSBkZXBlbmRpbmcgb24gdGhlIGV4dGVuc2lvbiBvZiB0aGUgZmlsZXMgaXQNCisjIHBhcnNlcy4gV2l0aCB0aGlzIHRhZyB5b3UgY2FuIGFzc2lnbiB3aGljaCBwYXJzZXIgdG8gdXNlIGZvciBhIGdpdmVuDQorIyBleHRlbnNpb24uIERveHlnZW4gaGFzIGEgYnVpbHQtaW4gbWFwcGluZywgYnV0IHlvdSBjYW4gb3ZlcnJpZGUgb3IgZXh0ZW5kIGl0DQorIyB1c2luZyB0aGlzIHRhZy4gVGhlIGZvcm1hdCBpcyBleHQ9bGFuZ3VhZ2UsIHdoZXJlIGV4dCBpcyBhIGZpbGUgZXh0ZW5zaW9uLA0KKyMgYW5kIGxhbmd1YWdlIGlzIG9uZSBvZiB0aGUgcGFyc2VycyBzdXBwb3J0ZWQgYnkgZG94eWdlbjogSURMLCBKYXZhLA0KKyMgSmF2YXNjcmlwdCwgQ1NoYXJwLCBDLCBDKyssIEQsIFBIUCwgT2JqZWN0aXZlLUMsIFB5dGhvbiwgRm9ydHJhbiwgVkhETCwgQywNCisjIEMrKy4gRm9yIGluc3RhbmNlIHRvIG1ha2UgZG94eWdlbiB0cmVhdCAuaW5jIGZpbGVzIGFzIEZvcnRyYW4gZmlsZXMgKGRlZmF1bHQNCisjIGlzIFBIUCksIGFuZCAuZiBmaWxlcyBhcyBDIChkZWZhdWx0IGlzIEZvcnRyYW4pLCB1c2U6IGluYz1Gb3J0cmFuIGY9Qy4gTm90ZQ0KKyMgdGhhdCBmb3IgY3VzdG9tIGV4dGVuc2lvbnMgeW91IGFsc28gbmVlZCB0byBzZXQgRklMRV9QQVRURVJOUyBvdGhlcndpc2UgdGhlDQorIyBmaWxlcyBhcmUgbm90IHJlYWQgYnkgZG94eWdlbi4NCisNCitFWFRFTlNJT05fTUFQUElORyAgICAgID0NCisNCisjIElmIE1BUktET1dOX1NVUFBPUlQgaXMgZW5hYmxlZCAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbiBwcmUtcHJvY2Vzc2VzIGFsbA0KKyMgY29tbWVudHMgYWNjb3JkaW5nIHRvIHRoZSBNYXJrZG93biBmb3JtYXQsIHdoaWNoIGFsbG93cyBmb3IgbW9yZSByZWFkYWJsZQ0KKyMgZG9jdW1lbnRhdGlvbi4gU2VlIGh0dHA6Ly9kYXJpbmdmaXJlYmFsbC5uZXQvcHJvamVjdHMvbWFya2Rvd24vIGZvciBkZXRhaWxzLg0KKyMgVGhlIG91dHB1dCBvZiBtYXJrZG93biBwcm9jZXNzaW5nIGlzIGZ1cnRoZXIgcHJvY2Vzc2VkIGJ5IGRveHlnZW4sIHNvIHlvdQ0KKyMgY2FuIG1peCBkb3h5Z2VuLCBIVE1MLCBhbmQgWE1MIGNvbW1hbmRzIHdpdGggTWFya2Rvd24gZm9ybWF0dGluZy4NCisjIERpc2FibGUgb25seSBpbiBjYXNlIG9mIGJhY2t3YXJkIGNvbXBhdGliaWxpdGllcyBpc3N1ZXMuDQorDQorTUFSS0RPV05fU1VQUE9SVCAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiBlbmFibGVkIGRveHlnZW4gdHJpZXMgdG8gbGluayB3b3JkcyB0aGF0IGNvcnJlc3BvbmQgdG8gZG9jdW1lbnRlZCBjbGFzc2VzLA0KKyMgb3IgbmFtZXNwYWNlcyB0byB0aGVpciBjb3JyZXNwb25kaW5nIGRvY3VtZW50YXRpb24uIFN1Y2ggYSBsaW5rIGNhbiBiZQ0KKyMgcHJldmVudGVkIGluIGluZGl2aWR1YWwgY2FzZXMgYnkgYnkgcHV0dGluZyBhICUgc2lnbiBpbiBmcm9udCBvZiB0aGUgd29yZCBvcg0KKyMgZ2xvYmFsbHkgYnkgc2V0dGluZyBBVVRPTElOS19TVVBQT1JUIHRvIE5PLg0KKw0KK0FVVE9MSU5LX1NVUFBPUlQgICAgICAgPSBZRVMNCisNCisjIElmIHlvdSB1c2UgU1RMIGNsYXNzZXMgKGkuZS4gc3RkOjpzdHJpbmcsIHN0ZDo6dmVjdG9yLCBldGMuKSBidXQgZG8gbm90IHdhbnQNCisjIHRvIGluY2x1ZGUgKGEgdGFnIGZpbGUgZm9yKSB0aGUgU1RMIHNvdXJjZXMgYXMgaW5wdXQsIHRoZW4geW91IHNob3VsZA0KKyMgc2V0IHRoaXMgdGFnIHRvIFlFUyBpbiBvcmRlciB0byBsZXQgZG94eWdlbiBtYXRjaCBmdW5jdGlvbnMgZGVjbGFyYXRpb25zIGFuZA0KKyMgZGVmaW5pdGlvbnMgd2hvc2UgYXJndW1lbnRzIGNvbnRhaW4gU1RMIGNsYXNzZXMgKGUuZy4gZnVuYyhzdGQ6OnN0cmluZyk7IHYucy4NCisjIGZ1bmMoc3RkOjpzdHJpbmcpIHt9KS4gVGhpcyBhbHNvIG1ha2VzIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbg0KKyMgZGlhZ3JhbXMgdGhhdCBpbnZvbHZlIFNUTCBjbGFzc2VzIG1vcmUgY29tcGxldGUgYW5kIGFjY3VyYXRlLg0KKw0KK0JVSUxUSU5fU1RMX1NVUFBPUlQgICAgPSBOTw0KKw0KKyMgSWYgeW91IHVzZSBNaWNyb3NvZnQncyBDKysvQ0xJIGxhbmd1YWdlLCB5b3Ugc2hvdWxkIHNldCB0aGlzIG9wdGlvbiB0byBZRVMgdG8NCisjIGVuYWJsZSBwYXJzaW5nIHN1cHBvcnQuDQorDQorQ1BQX0NMSV9TVVBQT1JUICAgICAgICA9IE5PDQorDQorIyBTZXQgdGhlIFNJUF9TVVBQT1JUIHRhZyB0byBZRVMgaWYgeW91ciBwcm9qZWN0IGNvbnNpc3RzIG9mIHNpcCBzb3VyY2VzIG9ubHkuDQorIyBEb3h5Z2VuIHdpbGwgcGFyc2UgdGhlbSBsaWtlIG5vcm1hbCBDKysgYnV0IHdpbGwgYXNzdW1lIGFsbCBjbGFzc2VzIHVzZSBwdWJsaWMNCisjIGluc3RlYWQgb2YgcHJpdmF0ZSBpbmhlcml0YW5jZSB3aGVuIG5vIGV4cGxpY2l0IHByb3RlY3Rpb24ga2V5d29yZCBpcyBwcmVzZW50Lg0KKw0KK1NJUF9TVVBQT1JUICAgICAgICAgICAgPSBOTw0KKw0KKyMgRm9yIE1pY3Jvc29mdCdzIElETCB0aGVyZSBhcmUgcHJvcGdldCBhbmQgcHJvcHB1dCBhdHRyaWJ1dGVzIHRvDQorIyBpbmRpY2F0ZSBnZXR0ZXIgYW5kIHNldHRlciBtZXRob2RzIGZvciBhIHByb3BlcnR5LiBTZXR0aW5nIHRoaXMNCisjIG9wdGlvbiB0byBZRVMgKHRoZSBkZWZhdWx0KSB3aWxsIG1ha2UgZG94eWdlbiByZXBsYWNlIHRoZSBnZXQgYW5kDQorIyBzZXQgbWV0aG9kcyBieSBhIHByb3BlcnR5IGluIHRoZSBkb2N1bWVudGF0aW9uLiBUaGlzIHdpbGwgb25seSB3b3JrDQorIyBpZiB0aGUgbWV0aG9kcyBhcmUgaW5kZWVkIGdldHRpbmcgb3Igc2V0dGluZyBhIHNpbXBsZSB0eXBlLiBJZiB0aGlzDQorIyBpcyBub3QgdGhlIGNhc2UsIG9yIHlvdSB3YW50IHRvIHNob3cgdGhlIG1ldGhvZHMgYW55d2F5LCB5b3Ugc2hvdWxkDQorIyBzZXQgdGhpcyBvcHRpb24gdG8gTk8uDQorDQorSURMX1BST1BFUlRZX1NVUFBPUlQgICA9IFlFUw0KKw0KKyMgSWYgbWVtYmVyIGdyb3VwaW5nIGlzIHVzZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gYW5kIHRoZSBESVNUUklCVVRFX0dST1VQX0RPQw0KKyMgdGFnIGlzIHNldCB0byBZRVMsIHRoZW4gZG94eWdlbiB3aWxsIHJldXNlIHRoZSBkb2N1bWVudGF0aW9uIG9mIHRoZSBmaXJzdA0KKyMgbWVtYmVyIGluIHRoZSBncm91cCAoaWYgYW55KSBmb3IgdGhlIG90aGVyIG1lbWJlcnMgb2YgdGhlIGdyb3VwLiBCeSBkZWZhdWx0DQorIyBhbGwgbWVtYmVycyBvZiBhIGdyb3VwIG11c3QgYmUgZG9jdW1lbnRlZCBleHBsaWNpdGx5Lg0KKw0KK0RJU1RSSUJVVEVfR1JPVVBfRE9DICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBTVUJHUk9VUElORyB0YWcgdG8gWUVTICh0aGUgZGVmYXVsdCkgdG8gYWxsb3cgY2xhc3MgbWVtYmVyIGdyb3VwcyBvZg0KKyMgdGhlIHNhbWUgdHlwZSAoZm9yIGluc3RhbmNlIGEgZ3JvdXAgb2YgcHVibGljIGZ1bmN0aW9ucykgdG8gYmUgcHV0IGFzIGENCisjIHN1Ymdyb3VwIG9mIHRoYXQgdHlwZSAoZS5nLiB1bmRlciB0aGUgUHVibGljIEZ1bmN0aW9ucyBzZWN0aW9uKS4gU2V0IGl0IHRvDQorIyBOTyB0byBwcmV2ZW50IHN1Ymdyb3VwaW5nLiBBbHRlcm5hdGl2ZWx5LCB0aGlzIGNhbiBiZSBkb25lIHBlciBjbGFzcyB1c2luZw0KKyMgdGhlIFxub3N1Ymdyb3VwaW5nIGNvbW1hbmQuDQorDQorU1VCR1JPVVBJTkcgICAgICAgICAgICA9IFlFUw0KKw0KKyMgV2hlbiB0aGUgSU5MSU5FX0dST1VQRURfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUywgY2xhc3Nlcywgc3RydWN0cyBhbmQNCisjIHVuaW9ucyBhcmUgc2hvd24gaW5zaWRlIHRoZSBncm91cCBpbiB3aGljaCB0aGV5IGFyZSBpbmNsdWRlZCAoZS5nLiB1c2luZw0KKyMgQGluZ3JvdXApIGluc3RlYWQgb2Ygb24gYSBzZXBhcmF0ZSBwYWdlIChmb3IgSFRNTCBhbmQgTWFuIHBhZ2VzKSBvcg0KKyMgc2VjdGlvbiAoZm9yIExhVGVYIGFuZCBSVEYpLg0KKw0KK0lOTElORV9HUk9VUEVEX0NMQVNTRVMgPSBOTw0KKw0KKyMgV2hlbiB0aGUgSU5MSU5FX1NJTVBMRV9TVFJVQ1RTIHRhZyBpcyBzZXQgdG8gWUVTLCBzdHJ1Y3RzLCBjbGFzc2VzLCBhbmQNCisjIHVuaW9ucyB3aXRoIG9ubHkgcHVibGljIGRhdGEgZmllbGRzIHdpbGwgYmUgc2hvd24gaW5saW5lIGluIHRoZSBkb2N1bWVudGF0aW9uDQorIyBvZiB0aGUgc2NvcGUgaW4gd2hpY2ggdGhleSBhcmUgZGVmaW5lZCAoaS5lLiBmaWxlLCBuYW1lc3BhY2UsIG9yIGdyb3VwDQorIyBkb2N1bWVudGF0aW9uKSwgcHJvdmlkZWQgdGhpcyBzY29wZSBpcyBkb2N1bWVudGVkLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSwNCisjIHN0cnVjdHMsIGNsYXNzZXMsIGFuZCB1bmlvbnMgYXJlIHNob3duIG9uIGEgc2VwYXJhdGUgcGFnZSAoZm9yIEhUTUwgYW5kIE1hbg0KKyMgcGFnZXMpIG9yIHNlY3Rpb24gKGZvciBMYVRlWCBhbmQgUlRGKS4NCisNCitJTkxJTkVfU0lNUExFX1NUUlVDVFMgID0gTk8NCisNCisjIFdoZW4gVFlQRURFRl9ISURFU19TVFJVQ1QgaXMgZW5hYmxlZCwgYSB0eXBlZGVmIG9mIGEgc3RydWN0LCB1bmlvbiwgb3IgZW51bQ0KKyMgaXMgZG9jdW1lbnRlZCBhcyBzdHJ1Y3QsIHVuaW9uLCBvciBlbnVtIHdpdGggdGhlIG5hbWUgb2YgdGhlIHR5cGVkZWYuIFNvDQorIyB0eXBlZGVmIHN0cnVjdCBUeXBlUyB7fSBUeXBlVCwgd2lsbCBhcHBlYXIgaW4gdGhlIGRvY3VtZW50YXRpb24gYXMgYSBzdHJ1Y3QNCisjIHdpdGggbmFtZSBUeXBlVC4gV2hlbiBkaXNhYmxlZCB0aGUgdHlwZWRlZiB3aWxsIGFwcGVhciBhcyBhIG1lbWJlciBvZiBhIGZpbGUsDQorIyBuYW1lc3BhY2UsIG9yIGNsYXNzLiBBbmQgdGhlIHN0cnVjdCB3aWxsIGJlIG5hbWVkIFR5cGVTLiBUaGlzIGNhbiB0eXBpY2FsbHkNCisjIGJlIHVzZWZ1bCBmb3IgQyBjb2RlIGluIGNhc2UgdGhlIGNvZGluZyBjb252ZW50aW9uIGRpY3RhdGVzIHRoYXQgYWxsIGNvbXBvdW5kDQorIyB0eXBlcyBhcmUgdHlwZWRlZidlZCBhbmQgb25seSB0aGUgdHlwZWRlZiBpcyByZWZlcmVuY2VkLCBuZXZlciB0aGUgdGFnIG5hbWUuDQorDQorVFlQRURFRl9ISURFU19TVFJVQ1QgICA9IE5PDQorDQorIyBUaGUgU1lNQk9MX0NBQ0hFX1NJWkUgZGV0ZXJtaW5lcyB0aGUgc2l6ZSBvZiB0aGUgaW50ZXJuYWwgY2FjaGUgdXNlIHRvDQorIyBkZXRlcm1pbmUgd2hpY2ggc3ltYm9scyB0byBrZWVwIGluIG1lbW9yeSBhbmQgd2hpY2ggdG8gZmx1c2ggdG8gZGlzay4NCisjIFdoZW4gdGhlIGNhY2hlIGlzIGZ1bGwsIGxlc3Mgb2Z0ZW4gdXNlZCBzeW1ib2xzIHdpbGwgYmUgd3JpdHRlbiB0byBkaXNrLg0KKyMgRm9yIHNtYWxsIHRvIG1lZGl1bSBzaXplIHByb2plY3RzICg8MTAwMCBpbnB1dCBmaWxlcykgdGhlIGRlZmF1bHQgdmFsdWUgaXMNCisjIHByb2JhYmx5IGdvb2QgZW5vdWdoLiBGb3IgbGFyZ2VyIHByb2plY3RzIGEgdG9vIHNtYWxsIGNhY2hlIHNpemUgY2FuIGNhdXNlDQorIyBkb3h5Z2VuIHRvIGJlIGJ1c3kgc3dhcHBpbmcgc3ltYm9scyB0byBhbmQgZnJvbSBkaXNrIG1vc3Qgb2YgdGhlIHRpbWUNCisjIGNhdXNpbmcgYSBzaWduaWZpY2FudCBwZXJmb3JtYW5jZSBwZW5hbHR5Lg0KKyMgSWYgdGhlIHN5c3RlbSBoYXMgZW5vdWdoIHBoeXNpY2FsIG1lbW9yeSBpbmNyZWFzaW5nIHRoZSBjYWNoZSB3aWxsIGltcHJvdmUgdGhlDQorIyBwZXJmb3JtYW5jZSBieSBrZWVwaW5nIG1vcmUgc3ltYm9scyBpbiBtZW1vcnkuIE5vdGUgdGhhdCB0aGUgdmFsdWUgd29ya3Mgb24NCisjIGEgbG9nYXJpdGhtaWMgc2NhbGUgc28gaW5jcmVhc2luZyB0aGUgc2l6ZSBieSBvbmUgd2lsbCByb3VnaGx5IGRvdWJsZSB0aGUNCisjIG1lbW9yeSB1c2FnZS4gVGhlIGNhY2hlIHNpemUgaXMgZ2l2ZW4gYnkgdGhpcyBmb3JtdWxhOg0KKyMgMl4oMTYrU1lNQk9MX0NBQ0hFX1NJWkUpLiBUaGUgdmFsaWQgcmFuZ2UgaXMgMC4uOSwgdGhlIGRlZmF1bHQgaXMgMCwNCisjIGNvcnJlc3BvbmRpbmcgdG8gYSBjYWNoZSBzaXplIG9mIDJeMTYgPSA2NTUzNiBzeW1ib2xzLg0KKw0KK1NZTUJPTF9DQUNIRV9TSVpFICAgICAgPSAwDQorDQorIyBTaW1pbGFyIHRvIHRoZSBTWU1CT0xfQ0FDSEVfU0laRSB0aGUgc2l6ZSBvZiB0aGUgc3ltYm9sIGxvb2t1cCBjYWNoZSBjYW4gYmUNCisjIHNldCB1c2luZyBMT09LVVBfQ0FDSEVfU0laRS4gVGhpcyBjYWNoZSBpcyB1c2VkIHRvIHJlc29sdmUgc3ltYm9scyBnaXZlbg0KKyMgdGhlaXIgbmFtZSBhbmQgc2NvcGUuIFNpbmNlIHRoaXMgY2FuIGJlIGFuIGV4cGVuc2l2ZSBwcm9jZXNzIGFuZCBvZnRlbiB0aGUNCisjIHNhbWUgc3ltYm9sIGFwcGVhciBtdWx0aXBsZSB0aW1lcyBpbiB0aGUgY29kZSwgZG94eWdlbiBrZWVwcyBhIGNhY2hlIG9mDQorIyBwcmUtcmVzb2x2ZWQgc3ltYm9scy4gSWYgdGhlIGNhY2hlIGlzIHRvbyBzbWFsbCBkb3h5Z2VuIHdpbGwgYmVjb21lIHNsb3dlci4NCisjIElmIHRoZSBjYWNoZSBpcyB0b28gbGFyZ2UsIG1lbW9yeSBpcyB3YXN0ZWQuIFRoZSBjYWNoZSBzaXplIGlzIGdpdmVuIGJ5IHRoaXMNCisjIGZvcm11bGE6IDJeKDE2K0xPT0tVUF9DQUNIRV9TSVpFKS4gVGhlIHZhbGlkIHJhbmdlIGlzIDAuLjksIHRoZSBkZWZhdWx0IGlzIDAsDQorIyBjb3JyZXNwb25kaW5nIHRvIGEgY2FjaGUgc2l6ZSBvZiAyXjE2ID0gNjU1MzYgc3ltYm9scy4NCisNCitMT09LVVBfQ0FDSEVfU0laRSAgICAgID0gMA0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIEJ1aWxkIHJlbGF0ZWQgY29uZmlndXJhdGlvbiBvcHRpb25zDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfQUxMIHRhZyBpcyBzZXQgdG8gWUVTIGRveHlnZW4gd2lsbCBhc3N1bWUgYWxsIGVudGl0aWVzIGluDQorIyBkb2N1bWVudGF0aW9uIGFyZSBkb2N1bWVudGVkLCBldmVuIGlmIG5vIGRvY3VtZW50YXRpb24gd2FzIGF2YWlsYWJsZS4NCisjIFByaXZhdGUgY2xhc3MgbWVtYmVycyBhbmQgc3RhdGljIGZpbGUgbWVtYmVycyB3aWxsIGJlIGhpZGRlbiB1bmxlc3MNCisjIHRoZSBFWFRSQUNUX1BSSVZBVEUgYW5kIEVYVFJBQ1RfU1RBVElDIHRhZ3MgYXJlIHNldCB0byBZRVMNCisNCitFWFRSQUNUX0FMTCAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBFWFRSQUNUX1BSSVZBVEUgdGFnIGlzIHNldCB0byBZRVMgYWxsIHByaXZhdGUgbWVtYmVycyBvZiBhIGNsYXNzDQorIyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfUFJJVkFURSAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFWFRSQUNUX1BBQ0tBR0UgdGFnIGlzIHNldCB0byBZRVMgYWxsIG1lbWJlcnMgd2l0aCBwYWNrYWdlIG9yIGludGVybmFsDQorIyBzY29wZSB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0VYVFJBQ1RfUEFDS0FHRSAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfU1RBVElDIHRhZyBpcyBzZXQgdG8gWUVTIGFsbCBzdGF0aWMgbWVtYmVycyBvZiBhIGZpbGUNCisjIHdpbGwgYmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorRVhUUkFDVF9TVEFUSUMgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYVFJBQ1RfTE9DQUxfQ0xBU1NFUyB0YWcgaXMgc2V0IHRvIFlFUyBjbGFzc2VzIChhbmQgc3RydWN0cykNCisjIGRlZmluZWQgbG9jYWxseSBpbiBzb3VyY2UgZmlsZXMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisjIElmIHNldCB0byBOTyBvbmx5IGNsYXNzZXMgZGVmaW5lZCBpbiBoZWFkZXIgZmlsZXMgYXJlIGluY2x1ZGVkLg0KKw0KK0VYVFJBQ1RfTE9DQUxfQ0xBU1NFUyAgPSBZRVMNCisNCisjIFRoaXMgZmxhZyBpcyBvbmx5IHVzZWZ1bCBmb3IgT2JqZWN0aXZlLUMgY29kZS4gV2hlbiBzZXQgdG8gWUVTIGxvY2FsDQorIyBtZXRob2RzLCB3aGljaCBhcmUgZGVmaW5lZCBpbiB0aGUgaW1wbGVtZW50YXRpb24gc2VjdGlvbiBidXQgbm90IGluDQorIyB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisjIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIG9ubHkgbWV0aG9kcyBpbiB0aGUgaW50ZXJmYWNlIGFyZSBpbmNsdWRlZC4NCisNCitFWFRSQUNUX0xPQ0FMX01FVEhPRFMgID0gTk8NCisNCisjIElmIHRoaXMgZmxhZyBpcyBzZXQgdG8gWUVTLCB0aGUgbWVtYmVycyBvZiBhbm9ueW1vdXMgbmFtZXNwYWNlcyB3aWxsIGJlDQorIyBleHRyYWN0ZWQgYW5kIGFwcGVhciBpbiB0aGUgZG9jdW1lbnRhdGlvbiBhcyBhIG5hbWVzcGFjZSBjYWxsZWQNCisjICdhbm9ueW1vdXNfbmFtZXNwYWNle2ZpbGV9Jywgd2hlcmUgZmlsZSB3aWxsIGJlIHJlcGxhY2VkIHdpdGggdGhlIGJhc2UNCisjIG5hbWUgb2YgdGhlIGZpbGUgdGhhdCBjb250YWlucyB0aGUgYW5vbnltb3VzIG5hbWVzcGFjZS4gQnkgZGVmYXVsdA0KKyMgYW5vbnltb3VzIG5hbWVzcGFjZXMgYXJlIGhpZGRlbi4NCisNCitFWFRSQUNUX0FOT05fTlNQQUNFUyAgID0gTk8NCisNCisjIElmIHRoZSBISURFX1VORE9DX01FTUJFUlMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgdW5kb2N1bWVudGVkIG1lbWJlcnMgb2YgZG9jdW1lbnRlZCBjbGFzc2VzLCBmaWxlcyBvciBuYW1lc3BhY2VzLg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgbWVtYmVycyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZQ0KKyMgdmFyaW91cyBvdmVydmlld3MsIGJ1dCBubyBkb2N1bWVudGF0aW9uIHNlY3Rpb24gaXMgZ2VuZXJhdGVkLg0KKyMgVGhpcyBvcHRpb24gaGFzIG5vIGVmZmVjdCBpZiBFWFRSQUNUX0FMTCBpcyBlbmFibGVkLg0KKw0KK0hJREVfVU5ET0NfTUVNQkVSUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBISURFX1VORE9DX0NMQVNTRVMgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFsbA0KKyMgdW5kb2N1bWVudGVkIGNsYXNzZXMgdGhhdCBhcmUgbm9ybWFsbHkgdmlzaWJsZSBpbiB0aGUgY2xhc3MgaGllcmFyY2h5Lg0KKyMgSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlc2UgY2xhc3NlcyB3aWxsIGJlIGluY2x1ZGVkIGluIHRoZSB2YXJpb3VzDQorIyBvdmVydmlld3MuIFRoaXMgb3B0aW9uIGhhcyBubyBlZmZlY3QgaWYgRVhUUkFDVF9BTEwgaXMgZW5hYmxlZC4NCisNCitISURFX1VORE9DX0NMQVNTRVMgICAgID0gWUVTDQorDQorIyBJZiB0aGUgSElERV9GUklFTkRfQ09NUE9VTkRTIHRhZyBpcyBzZXQgdG8gWUVTLCBEb3h5Z2VuIHdpbGwgaGlkZSBhbGwNCisjIGZyaWVuZCAoY2xhc3N8c3RydWN0fHVuaW9uKSBkZWNsYXJhdGlvbnMuDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBkZWNsYXJhdGlvbnMgd2lsbCBiZSBpbmNsdWRlZCBpbiB0aGUNCisjIGRvY3VtZW50YXRpb24uDQorDQorSElERV9GUklFTkRfQ09NUE9VTkRTICA9IE5PDQorDQorIyBJZiB0aGUgSElERV9JTl9CT0RZX0RPQ1MgdGFnIGlzIHNldCB0byBZRVMsIERveHlnZW4gd2lsbCBoaWRlIGFueQ0KKyMgZG9jdW1lbnRhdGlvbiBibG9ja3MgZm91bmQgaW5zaWRlIHRoZSBib2R5IG9mIGEgZnVuY3Rpb24uDQorIyBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGVzZSBibG9ja3Mgd2lsbCBiZSBhcHBlbmRlZCB0byB0aGUNCisjIGZ1bmN0aW9uJ3MgZGV0YWlsZWQgZG9jdW1lbnRhdGlvbiBibG9jay4NCisNCitISURFX0lOX0JPRFlfRE9DUyAgICAgID0gTk8NCisNCisjIFRoZSBJTlRFUk5BTF9ET0NTIHRhZyBkZXRlcm1pbmVzIGlmIGRvY3VtZW50YXRpb24NCisjIHRoYXQgaXMgdHlwZWQgYWZ0ZXIgYSBcaW50ZXJuYWwgY29tbWFuZCBpcyBpbmNsdWRlZC4gSWYgdGhlIHRhZyBpcyBzZXQNCisjIHRvIE5PICh0aGUgZGVmYXVsdCkgdGhlbiB0aGUgZG9jdW1lbnRhdGlvbiB3aWxsIGJlIGV4Y2x1ZGVkLg0KKyMgU2V0IGl0IHRvIFlFUyB0byBpbmNsdWRlIHRoZSBpbnRlcm5hbCBkb2N1bWVudGF0aW9uLg0KKw0KK0lOVEVSTkFMX0RPQ1MgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIENBU0VfU0VOU0VfTkFNRVMgdGFnIGlzIHNldCB0byBOTyB0aGVuIERveHlnZW4gd2lsbCBvbmx5IGdlbmVyYXRlDQorIyBmaWxlIG5hbWVzIGluIGxvd2VyLWNhc2UgbGV0dGVycy4gSWYgc2V0IHRvIFlFUyB1cHBlci1jYXNlIGxldHRlcnMgYXJlIGFsc28NCisjIGFsbG93ZWQuIFRoaXMgaXMgdXNlZnVsIGlmIHlvdSBoYXZlIGNsYXNzZXMgb3IgZmlsZXMgd2hvc2UgbmFtZXMgb25seSBkaWZmZXINCisjIGluIGNhc2UgYW5kIGlmIHlvdXIgZmlsZSBzeXN0ZW0gc3VwcG9ydHMgY2FzZSBzZW5zaXRpdmUgZmlsZSBuYW1lcy4gV2luZG93cw0KKyMgYW5kIE1hYyB1c2VycyBhcmUgYWR2aXNlZCB0byBzZXQgdGhpcyBvcHRpb24gdG8gTk8uDQorDQorQ0FTRV9TRU5TRV9OQU1FUyAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhJREVfU0NPUEVfTkFNRVMgdGFnIGlzIHNldCB0byBOTyAodGhlIGRlZmF1bHQpIHRoZW4gRG94eWdlbg0KKyMgd2lsbCBzaG93IG1lbWJlcnMgd2l0aCB0aGVpciBmdWxsIGNsYXNzIGFuZCBuYW1lc3BhY2Ugc2NvcGVzIGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4gSWYgc2V0IHRvIFlFUyB0aGUgc2NvcGUgd2lsbCBiZSBoaWRkZW4uDQorDQorSElERV9TQ09QRV9OQU1FUyAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU0hPV19JTkNMVURFX0ZJTEVTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIHB1dCBhIGxpc3Qgb2YgdGhlIGZpbGVzIHRoYXQgYXJlIGluY2x1ZGVkIGJ5IGEgZmlsZSBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgb2YgdGhhdCBmaWxlLg0KKw0KK1NIT1dfSU5DTFVERV9GSUxFUyAgICAgPSBZRVMNCisNCisjIElmIHRoZSBGT1JDRV9MT0NBTF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIERveHlnZW4NCisjIHdpbGwgbGlzdCBpbmNsdWRlIGZpbGVzIHdpdGggZG91YmxlIHF1b3RlcyBpbiB0aGUgZG9jdW1lbnRhdGlvbg0KKyMgcmF0aGVyIHRoYW4gd2l0aCBzaGFycCBicmFja2V0cy4NCisNCitGT1JDRV9MT0NBTF9JTkNMVURFUyAgID0gTk8NCisNCisjIElmIHRoZSBJTkxJTkVfSU5GTyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gYSB0YWcgW2lubGluZV0NCisjIGlzIGluc2VydGVkIGluIHRoZSBkb2N1bWVudGF0aW9uIGZvciBpbmxpbmUgbWVtYmVycy4NCisNCitJTkxJTkVfSU5GTyAgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgU09SVF9NRU1CRVJfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZW4gZG94eWdlbg0KKyMgd2lsbCBzb3J0IHRoZSAoZGV0YWlsZWQpIGRvY3VtZW50YXRpb24gb2YgZmlsZSBhbmQgY2xhc3MgbWVtYmVycw0KKyMgYWxwaGFiZXRpY2FsbHkgYnkgbWVtYmVyIG5hbWUuIElmIHNldCB0byBOTyB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbg0KKyMgZGVjbGFyYXRpb24gb3JkZXIuDQorDQorU09SVF9NRU1CRVJfRE9DUyAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNPUlRfQlJJRUZfRE9DUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBzb3J0IHRoZQ0KKyMgYnJpZWYgZG9jdW1lbnRhdGlvbiBvZiBmaWxlLCBuYW1lc3BhY2UgYW5kIGNsYXNzIG1lbWJlcnMgYWxwaGFiZXRpY2FsbHkNCisjIGJ5IG1lbWJlciBuYW1lLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSB0aGUgbWVtYmVycyB3aWxsIGFwcGVhciBpbg0KKyMgZGVjbGFyYXRpb24gb3JkZXIuDQorDQorU09SVF9CUklFRl9ET0NTICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgU09SVF9NRU1CRVJTX0NUT1JTXzFTVCB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgc29ydCB0aGUgKGJyaWVmIGFuZCBkZXRhaWxlZCkgZG9jdW1lbnRhdGlvbiBvZiBjbGFzcyBtZW1iZXJzIHNvIHRoYXQNCisjIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgYXJlIGxpc3RlZCBmaXJzdC4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisjIHRoZSBjb25zdHJ1Y3RvcnMgd2lsbCBhcHBlYXIgaW4gdGhlIHJlc3BlY3RpdmUgb3JkZXJzIGRlZmluZWQgYnkNCisjIFNPUlRfTUVNQkVSX0RPQ1MgYW5kIFNPUlRfQlJJRUZfRE9DUy4NCisjIFRoaXMgdGFnIHdpbGwgYmUgaWdub3JlZCBmb3IgYnJpZWYgZG9jcyBpZiBTT1JUX0JSSUVGX0RPQ1MgaXMgc2V0IHRvIE5PDQorIyBhbmQgaWdub3JlZCBmb3IgZGV0YWlsZWQgZG9jcyBpZiBTT1JUX01FTUJFUl9ET0NTIGlzIHNldCB0byBOTy4NCisNCitTT1JUX01FTUJFUlNfQ1RPUlNfMVNUID0gTk8NCisNCisjIElmIHRoZSBTT1JUX0dST1VQX05BTUVTIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIHNvcnQgdGhlDQorIyBoaWVyYXJjaHkgb2YgZ3JvdXAgbmFtZXMgaW50byBhbHBoYWJldGljYWwgb3JkZXIuIElmIHNldCB0byBOTyAodGhlIGRlZmF1bHQpDQorIyB0aGUgZ3JvdXAgbmFtZXMgd2lsbCBhcHBlYXIgaW4gdGhlaXIgZGVmaW5lZCBvcmRlci4NCisNCitTT1JUX0dST1VQX05BTUVTICAgICAgID0gTk8NCisNCisjIElmIHRoZSBTT1JUX0JZX1NDT1BFX05BTUUgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUNCisjIHNvcnRlZCBieSBmdWxseS1xdWFsaWZpZWQgbmFtZXMsIGluY2x1ZGluZyBuYW1lc3BhY2VzLiBJZiBzZXQgdG8NCisjIE5PICh0aGUgZGVmYXVsdCksIHRoZSBjbGFzcyBsaXN0IHdpbGwgYmUgc29ydGVkIG9ubHkgYnkgY2xhc3MgbmFtZSwNCisjIG5vdCBpbmNsdWRpbmcgdGhlIG5hbWVzcGFjZSBwYXJ0Lg0KKyMgTm90ZTogVGhpcyBvcHRpb24gaXMgbm90IHZlcnkgdXNlZnVsIGlmIEhJREVfU0NPUEVfTkFNRVMgaXMgc2V0IHRvIFlFUy4NCisjIE5vdGU6IFRoaXMgb3B0aW9uIGFwcGxpZXMgb25seSB0byB0aGUgY2xhc3MgbGlzdCwgbm90IHRvIHRoZQ0KKyMgYWxwaGFiZXRpY2FsIGxpc3QuDQorDQorU09SVF9CWV9TQ09QRV9OQU1FICAgICA9IE5PDQorDQorIyBJZiB0aGUgU1RSSUNUX1BST1RPX01BVENISU5HIG9wdGlvbiBpcyBlbmFibGVkIGFuZCBkb3h5Z2VuIGZhaWxzIHRvDQorIyBkbyBwcm9wZXIgdHlwZSByZXNvbHV0aW9uIG9mIGFsbCBwYXJhbWV0ZXJzIG9mIGEgZnVuY3Rpb24gaXQgd2lsbCByZWplY3QgYQ0KKyMgbWF0Y2ggYmV0d2VlbiB0aGUgcHJvdG90eXBlIGFuZCB0aGUgaW1wbGVtZW50YXRpb24gb2YgYSBtZW1iZXIgZnVuY3Rpb24gZXZlbg0KKyMgaWYgdGhlcmUgaXMgb25seSBvbmUgY2FuZGlkYXRlIG9yIGl0IGlzIG9idmlvdXMgd2hpY2ggY2FuZGlkYXRlIHRvIGNob29zZQ0KKyMgYnkgZG9pbmcgYSBzaW1wbGUgc3RyaW5nIG1hdGNoLiBCeSBkaXNhYmxpbmcgU1RSSUNUX1BST1RPX01BVENISU5HIGRveHlnZW4NCisjIHdpbGwgc3RpbGwgYWNjZXB0IGEgbWF0Y2ggYmV0d2VlbiBwcm90b3R5cGUgYW5kIGltcGxlbWVudGF0aW9uIGluIHN1Y2ggY2FzZXMuDQorDQorU1RSSUNUX1BST1RPX01BVENISU5HICA9IE5PDQorDQorIyBUaGUgR0VORVJBVEVfVE9ET0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSB0b2RvIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcgXHRvZG8NCisjIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1RPRE9MSVNUICAgICAgPSBZRVMNCisNCisjIFRoZSBHRU5FUkFURV9URVNUTElTVCB0YWcgY2FuIGJlIHVzZWQgdG8gZW5hYmxlIChZRVMpIG9yDQorIyBkaXNhYmxlIChOTykgdGhlIHRlc3QgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcdGVzdA0KKyMgY29tbWFuZHMgaW4gdGhlIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfVEVTVExJU1QgICAgICA9IFlFUw0KKw0KKyMgVGhlIEdFTkVSQVRFX0JVR0xJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSBidWcgbGlzdC4gVGhpcyBsaXN0IGlzIGNyZWF0ZWQgYnkgcHV0dGluZyBcYnVnDQorIyBjb21tYW5kcyBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9CVUdMSVNUICAgICAgID0gWUVTDQorDQorIyBUaGUgR0VORVJBVEVfREVQUkVDQVRFRExJU1QgdGFnIGNhbiBiZSB1c2VkIHRvIGVuYWJsZSAoWUVTKSBvcg0KKyMgZGlzYWJsZSAoTk8pIHRoZSBkZXByZWNhdGVkIGxpc3QuIFRoaXMgbGlzdCBpcyBjcmVhdGVkIGJ5IHB1dHRpbmcNCisjIFxkZXByZWNhdGVkIGNvbW1hbmRzIGluIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX0RFUFJFQ0FURURMSVNUPSBZRVMNCisNCisjIFRoZSBFTkFCTEVEX1NFQ1RJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBlbmFibGUgY29uZGl0aW9uYWwNCisjIGRvY3VtZW50YXRpb24gc2VjdGlvbnMsIG1hcmtlZCBieSBcaWYgc2VjdGlvbm5hbWUgLi4uIFxlbmRpZi4NCisNCitFTkFCTEVEX1NFQ1RJT05TICAgICAgID0NCisNCisjIFRoZSBNQVhfSU5JVElBTElaRVJfTElORVMgdGFnIGRldGVybWluZXMgdGhlIG1heGltdW0gbnVtYmVyIG9mIGxpbmVzDQorIyB0aGUgaW5pdGlhbCB2YWx1ZSBvZiBhIHZhcmlhYmxlIG9yIG1hY3JvIGNvbnNpc3RzIG9mIGZvciBpdCB0byBhcHBlYXIgaW4NCisjIHRoZSBkb2N1bWVudGF0aW9uLiBJZiB0aGUgaW5pdGlhbGl6ZXIgY29uc2lzdHMgb2YgbW9yZSBsaW5lcyB0aGFuIHNwZWNpZmllZA0KKyMgaGVyZSBpdCB3aWxsIGJlIGhpZGRlbi4gVXNlIGEgdmFsdWUgb2YgMCB0byBoaWRlIGluaXRpYWxpemVycyBjb21wbGV0ZWx5Lg0KKyMgVGhlIGFwcGVhcmFuY2Ugb2YgdGhlIGluaXRpYWxpemVyIG9mIGluZGl2aWR1YWwgdmFyaWFibGVzIGFuZCBtYWNyb3MgaW4gdGhlDQorIyBkb2N1bWVudGF0aW9uIGNhbiBiZSBjb250cm9sbGVkIHVzaW5nIFxzaG93aW5pdGlhbGl6ZXIgb3IgXGhpZGVpbml0aWFsaXplcg0KKyMgY29tbWFuZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiByZWdhcmRsZXNzIG9mIHRoaXMgc2V0dGluZy4NCisNCitNQVhfSU5JVElBTElaRVJfTElORVMgID0gMzANCisNCisjIFNldCB0aGUgU0hPV19VU0VEX0ZJTEVTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBsaXN0IG9mIGZpbGVzIGdlbmVyYXRlZA0KKyMgYXQgdGhlIGJvdHRvbSBvZiB0aGUgZG9jdW1lbnRhdGlvbiBvZiBjbGFzc2VzIGFuZCBzdHJ1Y3RzLiBJZiBzZXQgdG8gWUVTIHRoZQ0KKyMgbGlzdCB3aWxsIG1lbnRpb24gdGhlIGZpbGVzIHRoYXQgd2VyZSB1c2VkIHRvIGdlbmVyYXRlIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK1NIT1dfVVNFRF9GSUxFUyAgICAgICAgPSBZRVMNCisNCisjIFNldCB0aGUgU0hPV19GSUxFUyB0YWcgdG8gTk8gdG8gZGlzYWJsZSB0aGUgZ2VuZXJhdGlvbiBvZiB0aGUgRmlsZXMgcGFnZS4NCisjIFRoaXMgd2lsbCByZW1vdmUgdGhlIEZpbGVzIGVudHJ5IGZyb20gdGhlIFF1aWNrIEluZGV4IGFuZCBmcm9tIHRoZQ0KKyMgRm9sZGVyIFRyZWUgVmlldyAoaWYgc3BlY2lmaWVkKS4gVGhlIGRlZmF1bHQgaXMgWUVTLg0KKw0KKyMgV2UgcHJvYmFibHkgd2lsbCB3YW50IHRoaXMsIGJ1dCB3ZSBoYXZlIG5vIGZpbGUgZG9jdW1lbnRhdGlvbiB5ZXQgc28gaXQncyBzaW1wbGVyIHRvIHJlbW92ZQ0KKyMgaXQgZm9yIG5vdy4NCitTSE9XX0ZJTEVTICAgICAgICAgICAgID0gTk8NCisNCisjIFNldCB0aGUgU0hPV19OQU1FU1BBQ0VTIHRhZyB0byBOTyB0byBkaXNhYmxlIHRoZSBnZW5lcmF0aW9uIG9mIHRoZQ0KKyMgTmFtZXNwYWNlcyBwYWdlLg0KKyMgVGhpcyB3aWxsIHJlbW92ZSB0aGUgTmFtZXNwYWNlcyBlbnRyeSBmcm9tIHRoZSBRdWljayBJbmRleA0KKyMgYW5kIGZyb20gdGhlIEZvbGRlciBUcmVlIFZpZXcgKGlmIHNwZWNpZmllZCkuIFRoZSBkZWZhdWx0IGlzIFlFUy4NCisNCitTSE9XX05BTUVTUEFDRVMgICAgICAgID0gWUVTDQorDQorIyBUaGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHByb2dyYW0gb3Igc2NyaXB0IHRoYXQNCisjIGRveHlnZW4gc2hvdWxkIGludm9rZSB0byBnZXQgdGhlIGN1cnJlbnQgdmVyc2lvbiBmb3IgZWFjaCBmaWxlICh0eXBpY2FsbHkgZnJvbQ0KKyMgdGhlIHZlcnNpb24gY29udHJvbCBzeXN0ZW0pLiBEb3h5Z2VuIHdpbGwgaW52b2tlIHRoZSBwcm9ncmFtIGJ5IGV4ZWN1dGluZyAodmlhDQorIyBwb3BlbigpKSB0aGUgY29tbWFuZCA8Y29tbWFuZD4gPGlucHV0LWZpbGU+LCB3aGVyZSA8Y29tbWFuZD4gaXMgdGhlIHZhbHVlIG9mDQorIyB0aGUgRklMRV9WRVJTSU9OX0ZJTFRFUiB0YWcsIGFuZCA8aW5wdXQtZmlsZT4gaXMgdGhlIG5hbWUgb2YgYW4gaW5wdXQgZmlsZQ0KKyMgcHJvdmlkZWQgYnkgZG94eWdlbi4gV2hhdGV2ZXIgdGhlIHByb2dyYW0gd3JpdGVzIHRvIHN0YW5kYXJkIG91dHB1dA0KKyMgaXMgdXNlZCBhcyB0aGUgZmlsZSB2ZXJzaW9uLiBTZWUgdGhlIG1hbnVhbCBmb3IgZXhhbXBsZXMuDQorDQorRklMRV9WRVJTSU9OX0ZJTFRFUiAgICA9DQorDQorIyBUaGUgTEFZT1VUX0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBsYXlvdXQgZmlsZSB3aGljaCB3aWxsIGJlIHBhcnNlZA0KKyMgYnkgZG94eWdlbi4gVGhlIGxheW91dCBmaWxlIGNvbnRyb2xzIHRoZSBnbG9iYWwgc3RydWN0dXJlIG9mIHRoZSBnZW5lcmF0ZWQNCisjIG91dHB1dCBmaWxlcyBpbiBhbiBvdXRwdXQgZm9ybWF0IGluZGVwZW5kZW50IHdheS4gVG8gY3JlYXRlIHRoZSBsYXlvdXQgZmlsZQ0KKyMgdGhhdCByZXByZXNlbnRzIGRveHlnZW4ncyBkZWZhdWx0cywgcnVuIGRveHlnZW4gd2l0aCB0aGUgLWwgb3B0aW9uLg0KKyMgWW91IGNhbiBvcHRpb25hbGx5IHNwZWNpZnkgYSBmaWxlIG5hbWUgYWZ0ZXIgdGhlIG9wdGlvbiwgaWYgb21pdHRlZA0KKyMgRG94eWdlbkxheW91dC54bWwgd2lsbCBiZSB1c2VkIGFzIHRoZSBuYW1lIG9mIHRoZSBsYXlvdXQgZmlsZS4NCisNCitMQVlPVVRfRklMRSAgICAgICAgICAgID0NCisNCisjIFRoZSBDSVRFX0JJQl9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBiaWIgZmlsZXMNCisjIGNvbnRhaW5pbmcgdGhlIHJlZmVyZW5jZXMgZGF0YS4gVGhpcyBtdXN0IGJlIGEgbGlzdCBvZiAuYmliIGZpbGVzLiBUaGUNCisjIC5iaWIgZXh0ZW5zaW9uIGlzIGF1dG9tYXRpY2FsbHkgYXBwZW5kZWQgaWYgb21pdHRlZC4gVXNpbmcgdGhpcyBjb21tYW5kDQorIyByZXF1aXJlcyB0aGUgYmlidGV4IHRvb2wgdG8gYmUgaW5zdGFsbGVkLiBTZWUgYWxzbw0KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4gRm9yIExhVGVYIHRoZSBzdHlsZQ0KKyMgb2YgdGhlIGJpYmxpb2dyYXBoeSBjYW4gYmUgY29udHJvbGxlZCB1c2luZyBMQVRFWF9CSUJfU1RZTEUuIFRvIHVzZSB0aGlzDQorIyBmZWF0dXJlIHlvdSBuZWVkIGJpYnRleCBhbmQgcGVybCBhdmFpbGFibGUgaW4gdGhlIHNlYXJjaCBwYXRoLg0KKw0KK0NJVEVfQklCX0ZJTEVTICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHdhcm5pbmcgYW5kIHByb2dyZXNzIG1lc3NhZ2VzDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgVGhlIFFVSUVUIHRhZyBjYW4gYmUgdXNlZCB0byB0dXJuIG9uL29mZiB0aGUgbWVzc2FnZXMgdGhhdCBhcmUgZ2VuZXJhdGVkDQorIyBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCitRVUlFVCAgICAgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBXQVJOSU5HUyB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdCBhcmUNCisjIGdlbmVyYXRlZCBieSBkb3h5Z2VuLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsNCisjIE5PIGlzIHVzZWQuDQorDQorV0FSTklOR1MgICAgICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgV0FSTl9JRl9VTkRPQ1VNRU5URUQgaXMgc2V0IHRvIFlFUywgdGhlbiBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgd2FybmluZ3MNCisjIGZvciB1bmRvY3VtZW50ZWQgbWVtYmVycy4gSWYgRVhUUkFDVF9BTEwgaXMgc2V0IHRvIFlFUyB0aGVuIHRoaXMgZmxhZyB3aWxsDQorIyBhdXRvbWF0aWNhbGx5IGJlIGRpc2FibGVkLg0KKw0KK1dBUk5fSUZfVU5ET0NVTUVOVEVEICAgPSBZRVMNCisNCisjIElmIFdBUk5fSUZfRE9DX0VSUk9SIGlzIHNldCB0byBZRVMsIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSB3YXJuaW5ncyBmb3INCisjIHBvdGVudGlhbCBlcnJvcnMgaW4gdGhlIGRvY3VtZW50YXRpb24sIHN1Y2ggYXMgbm90IGRvY3VtZW50aW5nIHNvbWUNCisjIHBhcmFtZXRlcnMgaW4gYSBkb2N1bWVudGVkIGZ1bmN0aW9uLCBvciBkb2N1bWVudGluZyBwYXJhbWV0ZXJzIHRoYXQNCisjIGRvbid0IGV4aXN0IG9yIHVzaW5nIG1hcmt1cCBjb21tYW5kcyB3cm9uZ2x5Lg0KKw0KK1dBUk5fSUZfRE9DX0VSUk9SICAgICAgPSBZRVMNCisNCisjIFRoZSBXQVJOX05PX1BBUkFNRE9DIG9wdGlvbiBjYW4gYmUgZW5hYmxlZCB0byBnZXQgd2FybmluZ3MgZm9yDQorIyBmdW5jdGlvbnMgdGhhdCBhcmUgZG9jdW1lbnRlZCwgYnV0IGhhdmUgbm8gZG9jdW1lbnRhdGlvbiBmb3IgdGhlaXIgcGFyYW1ldGVycw0KKyMgb3IgcmV0dXJuIHZhbHVlLiBJZiBzZXQgdG8gTk8gKHRoZSBkZWZhdWx0KSBkb3h5Z2VuIHdpbGwgb25seSB3YXJuIGFib3V0DQorIyB3cm9uZyBvciBpbmNvbXBsZXRlIHBhcmFtZXRlciBkb2N1bWVudGF0aW9uLCBidXQgbm90IGFib3V0IHRoZSBhYnNlbmNlIG9mDQorIyBkb2N1bWVudGF0aW9uLg0KKw0KK1dBUk5fTk9fUEFSQU1ET0MgICAgICAgPSBOTw0KKw0KKyMgVGhlIFdBUk5fRk9STUFUIHRhZyBkZXRlcm1pbmVzIHRoZSBmb3JtYXQgb2YgdGhlIHdhcm5pbmcgbWVzc2FnZXMgdGhhdA0KKyMgZG94eWdlbiBjYW4gcHJvZHVjZS4gVGhlIHN0cmluZyBzaG91bGQgY29udGFpbiB0aGUgJGZpbGUsICRsaW5lLCBhbmQgJHRleHQNCisjIHRhZ3MsIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIGZpbGUgYW5kIGxpbmUgbnVtYmVyIGZyb20gd2hpY2ggdGhlDQorIyB3YXJuaW5nIG9yaWdpbmF0ZWQgYW5kIHRoZSB3YXJuaW5nIHRleHQuIE9wdGlvbmFsbHkgdGhlIGZvcm1hdCBtYXkgY29udGFpbg0KKyMgJHZlcnNpb24sIHdoaWNoIHdpbGwgYmUgcmVwbGFjZWQgYnkgdGhlIHZlcnNpb24gb2YgdGhlIGZpbGUgKGlmIGl0IGNvdWxkDQorIyBiZSBvYnRhaW5lZCB2aWEgRklMRV9WRVJTSU9OX0ZJTFRFUikNCisNCitXQVJOX0ZPUk1BVCAgICAgICAgICAgID0NCisNCisjIFRoZSBXQVJOX0xPR0ZJTEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBmaWxlIHRvIHdoaWNoIHdhcm5pbmcNCisjIGFuZCBlcnJvciBtZXNzYWdlcyBzaG91bGQgYmUgd3JpdHRlbi4gSWYgbGVmdCBibGFuayB0aGUgb3V0cHV0IGlzIHdyaXR0ZW4NCisjIHRvIHN0ZGVyci4NCisNCitXQVJOX0xPR0ZJTEUgICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgaW5wdXQgZmlsZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgSU5QVVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGVzIGFuZC9vciBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4NCisjIGRvY3VtZW50ZWQgc291cmNlIGZpbGVzLiBZb3UgbWF5IGVudGVyIGZpbGUgbmFtZXMgbGlrZSAibXlmaWxlLmNwcCIgb3INCisjIGRpcmVjdG9yaWVzIGxpa2UgIi91c3Ivc3JjL215cHJvamVjdCIuIFNlcGFyYXRlIHRoZSBmaWxlcyBvciBkaXJlY3Rvcmllcw0KKyMgd2l0aCBzcGFjZXMuDQorDQorSU5QVVQgICAgICAgICAgICAgICAgICA9IHNyYyAgZG9jL2RveHlnZW4vbGlib21wX2ludGVyZmFjZS5oDQorIyBUaGUgaXR0bm90aWZ5IGNvZGUgYWxzbyBoYXMgZG94eWdlbiBkb2N1bWVudGF0aW9uLCBidXQgaWYgd2UgaW5jbHVkZSBpdCBoZXJlDQorIyBpdCB0YWtlcyBvdmVyIGZyb20gdXMhDQorIyBzcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkNCisNCisjIFRoaXMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGNoYXJhY3RlciBlbmNvZGluZyBvZiB0aGUgc291cmNlIGZpbGVzDQorIyB0aGF0IGRveHlnZW4gcGFyc2VzLiBJbnRlcm5hbGx5IGRveHlnZW4gdXNlcyB0aGUgVVRGLTggZW5jb2RpbmcsIHdoaWNoIGlzDQorIyBhbHNvIHRoZSBkZWZhdWx0IGlucHV0IGVuY29kaW5nLiBEb3h5Z2VuIHVzZXMgbGliaWNvbnYgKG9yIHRoZSBpY29udiBidWlsdA0KKyMgaW50byBsaWJjKSBmb3IgdGhlIHRyYW5zY29kaW5nLiBTZWUgaHR0cDovL3d3dy5nbnUub3JnL3NvZnR3YXJlL2xpYmljb252IGZvcg0KKyMgdGhlIGxpc3Qgb2YgcG9zc2libGUgZW5jb2RpbmdzLg0KKw0KK0lOUFVUX0VOQ09ESU5HICAgICAgICAgPSBVVEYtOA0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJuIChsaWtlICouY3BwDQorIyBhbmQgKi5oKSB0byBmaWx0ZXIgb3V0IHRoZSBzb3VyY2UtZmlsZXMgaW4gdGhlIGRpcmVjdG9yaWVzLiBJZiBsZWZ0DQorIyBibGFuayB0aGUgZm9sbG93aW5nIHBhdHRlcm5zIGFyZSB0ZXN0ZWQ6DQorIyAqLmMgKi5jYyAqLmN4eCAqLmNwcCAqLmMrKyAqLmQgKi5qYXZhICouaWkgKi5peHggKi5pcHAgKi5pKysgKi5pbmwgKi5oICouaGgNCisjICouaHh4ICouaHBwICouaCsrICouaWRsICoub2RsICouY3MgKi5waHAgKi5waHAzICouaW5jICoubSAqLm1tICouZG94ICoucHkNCisjICouZjkwICouZiAqLmZvciAqLnZoZCAqLnZoZGwNCisNCitGSUxFX1BBVFRFUk5TICAgICAgICAgID0gKi5jICouaCAqLmNwcA0KKyMgV2UgbWF5IGFsc28gd2FudCB0byBpbmNsdWRlIHRoZSBhc20gZmlsZXMgd2l0aCBhcHByb3ByaWF0ZSBpZmRlZiB0byBlbnN1cmUNCisjIGRveHlnZW4gZG9lc24ndCBzZWUgdGhlIGNvbnRlbnQsIGp1c3QgdGhlIGRvY3VtZW50YXRpb24uLi4NCisNCisjIFRoZSBSRUNVUlNJVkUgdGFnIGNhbiBiZSB1c2VkIHRvIHR1cm4gc3BlY2lmeSB3aGV0aGVyIG9yIG5vdCBzdWJkaXJlY3Rvcmllcw0KKyMgc2hvdWxkIGJlIHNlYXJjaGVkIGZvciBpbnB1dCBmaWxlcyBhcyB3ZWxsLiBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uDQorIyBJZiBsZWZ0IGJsYW5rIE5PIGlzIHVzZWQuDQorDQorIyBPbmx5IGxvb2sgaW4gdGhlIG9uZSBkaXJlY3RvcnkuDQorUkVDVVJTSVZFICAgICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgRVhDTFVERSB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWxlcyBhbmQvb3IgZGlyZWN0b3JpZXMgdGhhdCBzaG91bGQgYmUNCisjIGV4Y2x1ZGVkIGZyb20gdGhlIElOUFVUIHNvdXJjZSBmaWxlcy4gVGhpcyB3YXkgeW91IGNhbiBlYXNpbHkgZXhjbHVkZSBhDQorIyBzdWJkaXJlY3RvcnkgZnJvbSBhIGRpcmVjdG9yeSB0cmVlIHdob3NlIHJvb3QgaXMgc3BlY2lmaWVkIHdpdGggdGhlIElOUFVUIHRhZy4NCisjIE5vdGUgdGhhdCByZWxhdGl2ZSBwYXRocyBhcmUgcmVsYXRpdmUgdG8gdGhlIGRpcmVjdG9yeSBmcm9tIHdoaWNoIGRveHlnZW4gaXMNCisjIHJ1bi4NCisNCitFWENMVURFICAgICAgICAgICAgICAgID0gc3JjL3Rlc3QtdG91Y2guYw0KKw0KKyMgVGhlIEVYQ0xVREVfU1lNTElOS1MgdGFnIGNhbiBiZSB1c2VkIHRvIHNlbGVjdCB3aGV0aGVyIG9yIG5vdCBmaWxlcyBvcg0KKyMgZGlyZWN0b3JpZXMgdGhhdCBhcmUgc3ltYm9saWMgbGlua3MgKGEgVW5peCBmaWxlIHN5c3RlbSBmZWF0dXJlKSBhcmUgZXhjbHVkZWQNCisjIGZyb20gdGhlIGlucHV0Lg0KKw0KK0VYQ0xVREVfU1lNTElOS1MgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIHZhbHVlIG9mIHRoZSBJTlBVVCB0YWcgY29udGFpbnMgZGlyZWN0b3JpZXMsIHlvdSBjYW4gdXNlIHRoZQ0KKyMgRVhDTFVERV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZCBwYXR0ZXJucyB0byBleGNsdWRlDQorIyBjZXJ0YWluIGZpbGVzIGZyb20gdGhvc2UgZGlyZWN0b3JpZXMuIE5vdGUgdGhhdCB0aGUgd2lsZGNhcmRzIGFyZSBtYXRjaGVkDQorIyBhZ2FpbnN0IHRoZSBmaWxlIHdpdGggYWJzb2x1dGUgcGF0aCwgc28gdG8gZXhjbHVkZSBhbGwgdGVzdCBkaXJlY3Rvcmllcw0KKyMgZm9yIGV4YW1wbGUgdXNlIHRoZSBwYXR0ZXJuICovdGVzdC8qDQorDQorRVhDTFVERV9QQVRURVJOUyAgICAgICA9DQorDQorIyBUaGUgRVhDTFVERV9TWU1CT0xTIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHN5bWJvbCBuYW1lcw0KKyMgKG5hbWVzcGFjZXMsIGNsYXNzZXMsIGZ1bmN0aW9ucywgZXRjLikgdGhhdCBzaG91bGQgYmUgZXhjbHVkZWQgZnJvbSB0aGUNCisjIG91dHB1dC4gVGhlIHN5bWJvbCBuYW1lIGNhbiBiZSBhIGZ1bGx5IHF1YWxpZmllZCBuYW1lLCBhIHdvcmQsIG9yIGlmIHRoZQ0KKyMgd2lsZGNhcmQgKiBpcyB1c2VkLCBhIHN1YnN0cmluZy4gRXhhbXBsZXM6IEFOYW1lc3BhY2UsIEFDbGFzcywNCisjIEFDbGFzczo6QU5hbWVzcGFjZSwgQU5hbWVzcGFjZTo6KlRlc3QNCisNCitFWENMVURFX1NZTUJPTFMgICAgICAgID0NCisNCisjIFRoZSBFWEFNUExFX1BBVEggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZmlsZXMgb3INCisjIGRpcmVjdG9yaWVzIHRoYXQgY29udGFpbiBleGFtcGxlIGNvZGUgZnJhZ21lbnRzIHRoYXQgYXJlIGluY2x1ZGVkIChzZWUNCisjIHRoZSBcaW5jbHVkZSBjb21tYW5kKS4NCisNCitFWEFNUExFX1BBVEggICAgICAgICAgID0NCisNCisjIElmIHRoZSB2YWx1ZSBvZiB0aGUgRVhBTVBMRV9QQVRIIHRhZyBjb250YWlucyBkaXJlY3RvcmllcywgeW91IGNhbiB1c2UgdGhlDQorIyBFWEFNUExFX1BBVFRFUk5TIHRhZyB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIHdpbGRjYXJkIHBhdHRlcm4gKGxpa2UgKi5jcHANCisjIGFuZCAqLmgpIHRvIGZpbHRlciBvdXQgdGhlIHNvdXJjZS1maWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuIElmIGxlZnQNCisjIGJsYW5rIGFsbCBmaWxlcyBhcmUgaW5jbHVkZWQuDQorDQorRVhBTVBMRV9QQVRURVJOUyAgICAgICA9DQorDQorIyBJZiB0aGUgRVhBTVBMRV9SRUNVUlNJVkUgdGFnIGlzIHNldCB0byBZRVMgdGhlbiBzdWJkaXJlY3RvcmllcyB3aWxsIGJlDQorIyBzZWFyY2hlZCBmb3IgaW5wdXQgZmlsZXMgdG8gYmUgdXNlZCB3aXRoIHRoZSBcaW5jbHVkZSBvciBcZG9udGluY2x1ZGUNCisjIGNvbW1hbmRzIGlycmVzcGVjdGl2ZSBvZiB0aGUgdmFsdWUgb2YgdGhlIFJFQ1VSU0lWRSB0YWcuDQorIyBQb3NzaWJsZSB2YWx1ZXMgYXJlIFlFUyBhbmQgTk8uIElmIGxlZnQgYmxhbmsgTk8gaXMgdXNlZC4NCisNCitFWEFNUExFX1JFQ1VSU0lWRSAgICAgID0gTk8NCisNCisjIFRoZSBJTUFHRV9QQVRIIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBtb3JlIGZpbGVzIG9yDQorIyBkaXJlY3RvcmllcyB0aGF0IGNvbnRhaW4gaW1hZ2UgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZQ0KKyMgdGhlIFxpbWFnZSBjb21tYW5kKS4NCisNCitJTUFHRV9QQVRIICAgICAgICAgICAgID0NCisNCisjIFRoZSBJTlBVVF9GSUxURVIgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYSBwcm9ncmFtIHRoYXQgZG94eWdlbiBzaG91bGQNCisjIGludm9rZSB0byBmaWx0ZXIgZm9yIGVhY2ggaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIGludm9rZSB0aGUgZmlsdGVyIHByb2dyYW0NCisjIGJ5IGV4ZWN1dGluZyAodmlhIHBvcGVuKCkpIHRoZSBjb21tYW5kIDxmaWx0ZXI+IDxpbnB1dC1maWxlPiwgd2hlcmUgPGZpbHRlcj4NCisjIGlzIHRoZSB2YWx1ZSBvZiB0aGUgSU5QVVRfRklMVEVSIHRhZywgYW5kIDxpbnB1dC1maWxlPiBpcyB0aGUgbmFtZSBvZiBhbg0KKyMgaW5wdXQgZmlsZS4gRG94eWdlbiB3aWxsIHRoZW4gdXNlIHRoZSBvdXRwdXQgdGhhdCB0aGUgZmlsdGVyIHByb2dyYW0gd3JpdGVzDQorIyB0byBzdGFuZGFyZCBvdXRwdXQuDQorIyBJZiBGSUxURVJfUEFUVEVSTlMgaXMgc3BlY2lmaWVkLCB0aGlzIHRhZyB3aWxsIGJlDQorIyBpZ25vcmVkLg0KKw0KK0lOUFVUX0ZJTFRFUiAgICAgICAgICAgPQ0KKw0KKyMgVGhlIEZJTFRFUl9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBmaWx0ZXJzIG9uIGEgcGVyIGZpbGUgcGF0dGVybg0KKyMgYmFzaXMuDQorIyBEb3h5Z2VuIHdpbGwgY29tcGFyZSB0aGUgZmlsZSBuYW1lIHdpdGggZWFjaCBwYXR0ZXJuIGFuZCBhcHBseSB0aGUNCisjIGZpbHRlciBpZiB0aGVyZSBpcyBhIG1hdGNoLg0KKyMgVGhlIGZpbHRlcnMgYXJlIGEgbGlzdCBvZiB0aGUgZm9ybToNCisjIHBhdHRlcm49ZmlsdGVyIChsaWtlICouY3BwPW15X2NwcF9maWx0ZXIpLiBTZWUgSU5QVVRfRklMVEVSIGZvciBmdXJ0aGVyDQorIyBpbmZvIG9uIGhvdyBmaWx0ZXJzIGFyZSB1c2VkLiBJZiBGSUxURVJfUEFUVEVSTlMgaXMgZW1wdHkgb3IgaWYNCisjIG5vbiBvZiB0aGUgcGF0dGVybnMgbWF0Y2ggdGhlIGZpbGUgbmFtZSwgSU5QVVRfRklMVEVSIGlzIGFwcGxpZWQuDQorDQorRklMVEVSX1BBVFRFUk5TICAgICAgICA9DQorDQorIyBJZiB0aGUgRklMVEVSX1NPVVJDRV9GSUxFUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIGlucHV0IGZpbHRlciAoaWYgc2V0IHVzaW5nDQorIyBJTlBVVF9GSUxURVIpIHdpbGwgYmUgdXNlZCB0byBmaWx0ZXIgdGhlIGlucHV0IGZpbGVzIHdoZW4gcHJvZHVjaW5nIHNvdXJjZQ0KKyMgZmlsZXMgdG8gYnJvd3NlIChpLmUuIHdoZW4gU09VUkNFX0JST1dTRVIgaXMgc2V0IHRvIFlFUykuDQorDQorRklMVEVSX1NPVVJDRV9GSUxFUyAgICA9IE5PDQorDQorIyBUaGUgRklMVEVSX1NPVVJDRV9QQVRURVJOUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBzb3VyY2UgZmlsdGVycyBwZXIgZmlsZQ0KKyMgcGF0dGVybi4gQSBwYXR0ZXJuIHdpbGwgb3ZlcnJpZGUgdGhlIHNldHRpbmcgZm9yIEZJTFRFUl9QQVRURVJOIChpZiBhbnkpDQorIyBhbmQgaXQgaXMgYWxzbyBwb3NzaWJsZSB0byBkaXNhYmxlIHNvdXJjZSBmaWx0ZXJpbmcgZm9yIGEgc3BlY2lmaWMgcGF0dGVybg0KKyMgdXNpbmcgKi5leHQ9IChzbyB3aXRob3V0IG5hbWluZyBhIGZpbHRlcikuIFRoaXMgb3B0aW9uIG9ubHkgaGFzIGVmZmVjdCB3aGVuDQorIyBGSUxURVJfU09VUkNFX0ZJTEVTIGlzIGVuYWJsZWQuDQorDQorRklMVEVSX1NPVVJDRV9QQVRURVJOUyA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gc291cmNlIGJyb3dzaW5nDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTIHRoZW4gYSBsaXN0IG9mIHNvdXJjZSBmaWxlcyB3aWxsDQorIyBiZSBnZW5lcmF0ZWQuIERvY3VtZW50ZWQgZW50aXRpZXMgd2lsbCBiZSBjcm9zcy1yZWZlcmVuY2VkIHdpdGggdGhlc2Ugc291cmNlcy4NCisjIE5vdGU6IFRvIGdldCByaWQgb2YgYWxsIHNvdXJjZSBjb2RlIGluIHRoZSBnZW5lcmF0ZWQgb3V0cHV0LCBtYWtlIHN1cmUgYWxzbw0KKyMgVkVSQkFUSU1fSEVBREVSUyBpcyBzZXQgdG8gTk8uDQorDQorU09VUkNFX0JST1dTRVIgICAgICAgICA9IFlFUw0KKw0KKyMgU2V0dGluZyB0aGUgSU5MSU5FX1NPVVJDRVMgdGFnIHRvIFlFUyB3aWxsIGluY2x1ZGUgdGhlIGJvZHkNCisjIG9mIGZ1bmN0aW9ucyBhbmQgY2xhc3NlcyBkaXJlY3RseSBpbiB0aGUgZG9jdW1lbnRhdGlvbi4NCisNCitJTkxJTkVfU09VUkNFUyAgICAgICAgID0gTk8NCisNCisjIFNldHRpbmcgdGhlIFNUUklQX0NPREVfQ09NTUVOVFMgdGFnIHRvIFlFUyAodGhlIGRlZmF1bHQpIHdpbGwgaW5zdHJ1Y3QNCisjIGRveHlnZW4gdG8gaGlkZSBhbnkgc3BlY2lhbCBjb21tZW50IGJsb2NrcyBmcm9tIGdlbmVyYXRlZCBzb3VyY2UgY29kZQ0KKyMgZnJhZ21lbnRzLiBOb3JtYWwgQywgQysrIGFuZCBGb3J0cmFuIGNvbW1lbnRzIHdpbGwgYWx3YXlzIHJlbWFpbiB2aXNpYmxlLg0KKw0KK1NUUklQX0NPREVfQ09NTUVOVFMgICAgPSBZRVMNCisNCisjIElmIHRoZSBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIHRhZyBpcyBzZXQgdG8gWUVTDQorIyB0aGVuIGZvciBlYWNoIGRvY3VtZW50ZWQgZnVuY3Rpb24gYWxsIGRvY3VtZW50ZWQNCisjIGZ1bmN0aW9ucyByZWZlcmVuY2luZyBpdCB3aWxsIGJlIGxpc3RlZC4NCisNCitSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OID0gWUVTDQorDQorIyBJZiB0aGUgUkVGRVJFTkNFU19SRUxBVElPTiB0YWcgaXMgc2V0IHRvIFlFUw0KKyMgdGhlbiBmb3IgZWFjaCBkb2N1bWVudGVkIGZ1bmN0aW9uIGFsbCBkb2N1bWVudGVkIGVudGl0aWVzDQorIyBjYWxsZWQvdXNlZCBieSB0aGF0IGZ1bmN0aW9uIHdpbGwgYmUgbGlzdGVkLg0KKw0KK1JFRkVSRU5DRVNfUkVMQVRJT04gICAgPSBOTw0KKw0KKyMgSWYgdGhlIFJFRkVSRU5DRVNfTElOS19TT1VSQ0UgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KQ0KKyMgYW5kIFNPVVJDRV9CUk9XU0VSIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGVuIHRoZSBoeXBlcmxpbmtzIGZyb20NCisjIGZ1bmN0aW9ucyBpbiBSRUZFUkVOQ0VTX1JFTEFUSU9OIGFuZCBSRUZFUkVOQ0VEX0JZX1JFTEFUSU9OIGxpc3RzIHdpbGwNCisjIGxpbmsgdG8gdGhlIHNvdXJjZSBjb2RlLg0KKyMgT3RoZXJ3aXNlIHRoZXkgd2lsbCBsaW5rIHRvIHRoZSBkb2N1bWVudGF0aW9uLg0KKw0KK1JFRkVSRU5DRVNfTElOS19TT1VSQ0UgPSBZRVMNCisNCisjIElmIHRoZSBVU0VfSFRBR1MgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgcmVmZXJlbmNlcyB0byBzb3VyY2UgY29kZQ0KKyMgd2lsbCBwb2ludCB0byB0aGUgSFRNTCBnZW5lcmF0ZWQgYnkgdGhlIGh0YWdzKDEpIHRvb2wgaW5zdGVhZCBvZiBkb3h5Z2VuDQorIyBidWlsdC1pbiBzb3VyY2UgYnJvd3Nlci4gVGhlIGh0YWdzIHRvb2wgaXMgcGFydCBvZiBHTlUncyBnbG9iYWwgc291cmNlDQorIyB0YWdnaW5nIHN5c3RlbSAoc2VlIGh0dHA6Ly93d3cuZ251Lm9yZy9zb2Z0d2FyZS9nbG9iYWwvZ2xvYmFsLmh0bWwpLiBZb3UNCisjIHdpbGwgbmVlZCB2ZXJzaW9uIDQuOC42IG9yIGhpZ2hlci4NCisNCitVU0VfSFRBR1MgICAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBWRVJCQVRJTV9IRUFERVJTIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbiBEb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgdmVyYmF0aW0gY29weSBvZiB0aGUgaGVhZGVyIGZpbGUgZm9yIGVhY2ggY2xhc3MgZm9yDQorIyB3aGljaCBhbiBpbmNsdWRlIGlzIHNwZWNpZmllZC4gU2V0IHRvIE5PIHRvIGRpc2FibGUgdGhpcy4NCisNCitWRVJCQVRJTV9IRUFERVJTICAgICAgID0gWUVTDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIGFscGhhYmV0aWNhbCBjbGFzcyBpbmRleA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBBTFBIQUJFVElDQUxfSU5ERVggdGFnIGlzIHNldCB0byBZRVMsIGFuIGFscGhhYmV0aWNhbCBpbmRleA0KKyMgb2YgYWxsIGNvbXBvdW5kcyB3aWxsIGJlIGdlbmVyYXRlZC4gRW5hYmxlIHRoaXMgaWYgdGhlIHByb2plY3QNCisjIGNvbnRhaW5zIGEgbG90IG9mIGNsYXNzZXMsIHN0cnVjdHMsIHVuaW9ucyBvciBpbnRlcmZhY2VzLg0KKw0KK0FMUEhBQkVUSUNBTF9JTkRFWCAgICAgPSBZRVMNCisNCisjIElmIHRoZSBhbHBoYWJldGljYWwgaW5kZXggaXMgZW5hYmxlZCAoc2VlIEFMUEhBQkVUSUNBTF9JTkRFWCkgdGhlbg0KKyMgdGhlIENPTFNfSU5fQUxQSEFfSU5ERVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIG51bWJlciBvZiBjb2x1bW5zDQorIyBpbiB3aGljaCB0aGlzIGxpc3Qgd2lsbCBiZSBzcGxpdCAoY2FuIGJlIGEgbnVtYmVyIGluIHRoZSByYW5nZSBbMS4uMjBdKQ0KKw0KK0NPTFNfSU5fQUxQSEFfSU5ERVggICAgPSA1DQorDQorIyBJbiBjYXNlIGFsbCBjbGFzc2VzIGluIGEgcHJvamVjdCBzdGFydCB3aXRoIGEgY29tbW9uIHByZWZpeCwgYWxsDQorIyBjbGFzc2VzIHdpbGwgYmUgcHV0IHVuZGVyIHRoZSBzYW1lIGhlYWRlciBpbiB0aGUgYWxwaGFiZXRpY2FsIGluZGV4Lg0KKyMgVGhlIElHTk9SRV9QUkVGSVggdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgcHJlZml4ZXMgdGhhdA0KKyMgc2hvdWxkIGJlIGlnbm9yZWQgd2hpbGUgZ2VuZXJhdGluZyB0aGUgaW5kZXggaGVhZGVycy4NCisNCitJR05PUkVfUFJFRklYICAgICAgICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgSFRNTCBvdXRwdXQNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgSFRNTCBvdXRwdXQuDQorDQorR0VORVJBVEVfSFRNTCAgICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIEhUTUxfT1VUUFVUIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hlcmUgdGhlIEhUTUwgZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgaHRtbCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorSFRNTF9PVVRQVVQgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9GSUxFX0VYVEVOU0lPTiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBleHRlbnNpb24gZm9yDQorIyBlYWNoIGdlbmVyYXRlZCBIVE1MIHBhZ2UgKGZvciBleGFtcGxlOiAuaHRtLC5waHAsLmFzcCkuIElmIGl0IGlzIGxlZnQgYmxhbmsNCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBmaWxlcyB3aXRoIC5odG1sIGV4dGVuc2lvbi4NCisNCitIVE1MX0ZJTEVfRVhURU5TSU9OICAgID0gLmh0bWwNCisNCisjIFRoZSBIVE1MX0hFQURFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgaGVhZGVyIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBoZWFkZXIuIE5vdGUgdGhhdCB3aGVuIHVzaW5nIGEgY3VzdG9tIGhlYWRlciB5b3UgYXJlIHJlc3BvbnNpYmxlDQorIyAgZm9yIHRoZSBwcm9wZXIgaW5jbHVzaW9uIG9mIGFueSBzY3JpcHRzIGFuZCBzdHlsZSBzaGVldHMgdGhhdCBkb3h5Z2VuDQorIyBuZWVkcywgd2hpY2ggaXMgZGVwZW5kZW50IG9uIHRoZSBjb25maWd1cmF0aW9uIG9wdGlvbnMgdXNlZC4NCisjIEl0IGlzIGFkdmlzZWQgdG8gZ2VuZXJhdGUgYSBkZWZhdWx0IGhlYWRlciB1c2luZyAiZG94eWdlbiAtdyBodG1sDQorIyBoZWFkZXIuaHRtbCBmb290ZXIuaHRtbCBzdHlsZXNoZWV0LmNzcyBZb3VyQ29uZmlnRmlsZSIgYW5kIHRoZW4gbW9kaWZ5DQorIyB0aGF0IGhlYWRlci4gTm90ZSB0aGF0IHRoZSBoZWFkZXIgaXMgc3ViamVjdCB0byBjaGFuZ2Ugc28geW91IHR5cGljYWxseQ0KKyMgaGF2ZSB0byByZWRvIHRoaXMgd2hlbiB1cGdyYWRpbmcgdG8gYSBuZXdlciB2ZXJzaW9uIG9mIGRveHlnZW4gb3Igd2hlbg0KKyMgY2hhbmdpbmcgdGhlIHZhbHVlIG9mIGNvbmZpZ3VyYXRpb24gc2V0dGluZ3Mgc3VjaCBhcyBHRU5FUkFURV9UUkVFVklFVyENCisNCitIVE1MX0hFQURFUiAgICAgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIEhUTUwgZm9vdGVyIGZvcg0KKyMgZWFjaCBnZW5lcmF0ZWQgSFRNTCBwYWdlLiBJZiBpdCBpcyBsZWZ0IGJsYW5rIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhDQorIyBzdGFuZGFyZCBmb290ZXIuDQorDQorSFRNTF9GT09URVIgICAgICAgICAgICA9DQorDQorIyBUaGUgSFRNTF9TVFlMRVNIRUVUIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgdXNlci1kZWZpbmVkIGNhc2NhZGluZw0KKyMgc3R5bGUgc2hlZXQgdGhhdCBpcyB1c2VkIGJ5IGVhY2ggSFRNTCBwYWdlLiBJdCBjYW4gYmUgdXNlZCB0bw0KKyMgZmluZS10dW5lIHRoZSBsb29rIG9mIHRoZSBIVE1MIG91dHB1dC4gSWYgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGEgZGVmYXVsdCBzdHlsZSBzaGVldC4gTm90ZSB0aGF0IGl0IGlzIHJlY29tbWVuZGVkIHRvIHVzZQ0KKyMgSFRNTF9FWFRSQV9TVFlMRVNIRUVUIGluc3RlYWQgb2YgdGhpcyBvbmUsIGFzIGl0IGlzIG1vcmUgcm9idXN0IGFuZCB0aGlzDQorIyB0YWcgd2lsbCBpbiB0aGUgZnV0dXJlIGJlY29tZSBvYnNvbGV0ZS4NCisNCitIVE1MX1NUWUxFU0hFRVQgICAgICAgID0NCisNCisjIFRoZSBIVE1MX0VYVFJBX1NUWUxFU0hFRVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gYWRkaXRpb25hbA0KKyMgdXNlci1kZWZpbmVkIGNhc2NhZGluZyBzdHlsZSBzaGVldCB0aGF0IGlzIGluY2x1ZGVkIGFmdGVyIHRoZSBzdGFuZGFyZA0KKyMgc3R5bGUgc2hlZXRzIGNyZWF0ZWQgYnkgZG94eWdlbi4gVXNpbmcgdGhpcyBvcHRpb24gb25lIGNhbiBvdmVycnVsZQ0KKyMgY2VydGFpbiBzdHlsZSBhc3BlY3RzLiBUaGlzIGlzIHByZWZlcnJlZCBvdmVyIHVzaW5nIEhUTUxfU1RZTEVTSEVFVA0KKyMgc2luY2UgaXQgZG9lcyBub3QgcmVwbGFjZSB0aGUgc3RhbmRhcmQgc3R5bGUgc2hlZXQgYW5kIGlzIHRoZXJlZm9yIG1vcmUNCisjIHJvYnVzdCBhZ2FpbnN0IGZ1dHVyZSB1cGRhdGVzLiBEb3h5Z2VuIHdpbGwgY29weSB0aGUgc3R5bGUgc2hlZXQgZmlsZSB0bw0KKyMgdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorSFRNTF9FWFRSQV9TVFlMRVNIRUVUICA9DQorDQorIyBUaGUgSFRNTF9FWFRSQV9GSUxFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBleHRyYSBpbWFnZXMgb3INCisjIG90aGVyIHNvdXJjZSBmaWxlcyB3aGljaCBzaG91bGQgYmUgY29waWVkIHRvIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIE5vdGUNCisjIHRoYXQgdGhlc2UgZmlsZXMgd2lsbCBiZSBjb3BpZWQgdG8gdGhlIGJhc2UgSFRNTCBvdXRwdXQgZGlyZWN0b3J5LiBVc2UgdGhlDQorIyAkcmVscGF0aCQgbWFya2VyIGluIHRoZSBIVE1MX0hFQURFUiBhbmQvb3IgSFRNTF9GT09URVIgZmlsZXMgdG8gbG9hZCB0aGVzZQ0KKyMgZmlsZXMuIEluIHRoZSBIVE1MX1NUWUxFU0hFRVQgZmlsZSwgdXNlIHRoZSBmaWxlIG5hbWUgb25seS4gQWxzbyBub3RlIHRoYXQNCisjIHRoZSBmaWxlcyB3aWxsIGJlIGNvcGllZCBhcy1pczsgdGhlcmUgYXJlIG5vIGNvbW1hbmRzIG9yIG1hcmtlcnMgYXZhaWxhYmxlLg0KKw0KK0hUTUxfRVhUUkFfRklMRVMgICAgICAgPQ0KKw0KKyMgVGhlIEhUTUxfQ09MT1JTVFlMRV9IVUUgdGFnIGNvbnRyb2xzIHRoZSBjb2xvciBvZiB0aGUgSFRNTCBvdXRwdXQuDQorIyBEb3h5Z2VuIHdpbGwgYWRqdXN0IHRoZSBjb2xvcnMgaW4gdGhlIHN0eWxlIHNoZWV0IGFuZCBiYWNrZ3JvdW5kIGltYWdlcw0KKyMgYWNjb3JkaW5nIHRvIHRoaXMgY29sb3IuIEh1ZSBpcyBzcGVjaWZpZWQgYXMgYW4gYW5nbGUgb24gYSBjb2xvcndoZWVsLA0KKyMgc2VlIGh0dHA6Ly9lbi53aWtpcGVkaWEub3JnL3dpa2kvSHVlIGZvciBtb3JlIGluZm9ybWF0aW9uLg0KKyMgRm9yIGluc3RhbmNlIHRoZSB2YWx1ZSAwIHJlcHJlc2VudHMgcmVkLCA2MCBpcyB5ZWxsb3csIDEyMCBpcyBncmVlbiwNCisjIDE4MCBpcyBjeWFuLCAyNDAgaXMgYmx1ZSwgMzAwIHB1cnBsZSwgYW5kIDM2MCBpcyByZWQgYWdhaW4uDQorIyBUaGUgYWxsb3dlZCByYW5nZSBpcyAwIHRvIDM1OS4NCisNCitIVE1MX0NPTE9SU1RZTEVfSFVFICAgID0gMjIwDQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX1NBVCB0YWcgY29udHJvbHMgdGhlIHB1cml0eSAob3Igc2F0dXJhdGlvbikgb2YNCisjIHRoZSBjb2xvcnMgaW4gdGhlIEhUTUwgb3V0cHV0LiBGb3IgYSB2YWx1ZSBvZiAwIHRoZSBvdXRwdXQgd2lsbCB1c2UNCisjIGdyYXlzY2FsZXMgb25seS4gQSB2YWx1ZSBvZiAyNTUgd2lsbCBwcm9kdWNlIHRoZSBtb3N0IHZpdmlkIGNvbG9ycy4NCisNCitIVE1MX0NPTE9SU1RZTEVfU0FUICAgID0gMTAwDQorDQorIyBUaGUgSFRNTF9DT0xPUlNUWUxFX0dBTU1BIHRhZyBjb250cm9scyB0aGUgZ2FtbWEgY29ycmVjdGlvbiBhcHBsaWVkIHRvDQorIyB0aGUgbHVtaW5hbmNlIGNvbXBvbmVudCBvZiB0aGUgY29sb3JzIGluIHRoZSBIVE1MIG91dHB1dC4gVmFsdWVzIGJlbG93DQorIyAxMDAgZ3JhZHVhbGx5IG1ha2UgdGhlIG91dHB1dCBsaWdodGVyLCB3aGVyZWFzIHZhbHVlcyBhYm92ZSAxMDAgbWFrZQ0KKyMgdGhlIG91dHB1dCBkYXJrZXIuIFRoZSB2YWx1ZSBkaXZpZGVkIGJ5IDEwMCBpcyB0aGUgYWN0dWFsIGdhbW1hIGFwcGxpZWQsDQorIyBzbyA4MCByZXByZXNlbnRzIGEgZ2FtbWEgb2YgMC44LCBUaGUgdmFsdWUgMjIwIHJlcHJlc2VudHMgYSBnYW1tYSBvZiAyLjIsDQorIyBhbmQgMTAwIGRvZXMgbm90IGNoYW5nZSB0aGUgZ2FtbWEuDQorDQorSFRNTF9DT0xPUlNUWUxFX0dBTU1BICA9IDgwDQorDQorIyBJZiB0aGUgSFRNTF9USU1FU1RBTVAgdGFnIGlzIHNldCB0byBZRVMgdGhlbiB0aGUgZm9vdGVyIG9mIGVhY2ggZ2VuZXJhdGVkIEhUTUwNCisjIHBhZ2Ugd2lsbCBjb250YWluIHRoZSBkYXRlIGFuZCB0aW1lIHdoZW4gdGhlIHBhZ2Ugd2FzIGdlbmVyYXRlZC4gU2V0dGluZw0KKyMgdGhpcyB0byBOTyBjYW4gaGVscCB3aGVuIGNvbXBhcmluZyB0aGUgb3V0cHV0IG9mIG11bHRpcGxlIHJ1bnMuDQorDQorSFRNTF9USU1FU1RBTVAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEhUTUxfRFlOQU1JQ19TRUNUSU9OUyB0YWcgaXMgc2V0IHRvIFlFUyB0aGVuIHRoZSBnZW5lcmF0ZWQgSFRNTA0KKyMgZG9jdW1lbnRhdGlvbiB3aWxsIGNvbnRhaW4gc2VjdGlvbnMgdGhhdCBjYW4gYmUgaGlkZGVuIGFuZCBzaG93biBhZnRlciB0aGUNCisjIHBhZ2UgaGFzIGxvYWRlZC4NCisNCitIVE1MX0RZTkFNSUNfU0VDVElPTlMgID0gTk8NCisNCisjIFdpdGggSFRNTF9JTkRFWF9OVU1fRU5UUklFUyBvbmUgY2FuIGNvbnRyb2wgdGhlIHByZWZlcnJlZCBudW1iZXIgb2YNCisjIGVudHJpZXMgc2hvd24gaW4gdGhlIHZhcmlvdXMgdHJlZSBzdHJ1Y3R1cmVkIGluZGljZXMgaW5pdGlhbGx5OyB0aGUgdXNlcg0KKyMgY2FuIGV4cGFuZCBhbmQgY29sbGFwc2UgZW50cmllcyBkeW5hbWljYWxseSBsYXRlciBvbi4gRG94eWdlbiB3aWxsIGV4cGFuZA0KKyMgdGhlIHRyZWUgdG8gc3VjaCBhIGxldmVsIHRoYXQgYXQgbW9zdCB0aGUgc3BlY2lmaWVkIG51bWJlciBvZiBlbnRyaWVzIGFyZQ0KKyMgdmlzaWJsZSAodW5sZXNzIGEgZnVsbHkgY29sbGFwc2VkIHRyZWUgYWxyZWFkeSBleGNlZWRzIHRoaXMgYW1vdW50KS4NCisjIFNvIHNldHRpbmcgdGhlIG51bWJlciBvZiBlbnRyaWVzIDEgd2lsbCBwcm9kdWNlIGEgZnVsbCBjb2xsYXBzZWQgdHJlZSBieQ0KKyMgZGVmYXVsdC4gMCBpcyBhIHNwZWNpYWwgdmFsdWUgcmVwcmVzZW50aW5nIGFuIGluZmluaXRlIG51bWJlciBvZiBlbnRyaWVzDQorIyBhbmQgd2lsbCByZXN1bHQgaW4gYSBmdWxsIGV4cGFuZGVkIHRyZWUgYnkgZGVmYXVsdC4NCisNCitIVE1MX0lOREVYX05VTV9FTlRSSUVTID0gMTAwDQorDQorIyBJZiB0aGUgR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCBhZGRpdGlvbmFsIGluZGV4IGZpbGVzDQorIyB3aWxsIGJlIGdlbmVyYXRlZCB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBBcHBsZSdzIFhjb2RlIDMNCisjIGludGVncmF0ZWQgZGV2ZWxvcG1lbnQgZW52aXJvbm1lbnQsIGludHJvZHVjZWQgd2l0aCBPU1ggMTAuNSAoTGVvcGFyZCkuDQorIyBUbyBjcmVhdGUgYSBkb2N1bWVudGF0aW9uIHNldCwgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgTWFrZWZpbGUgaW4gdGhlDQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkuIFJ1bm5pbmcgbWFrZSB3aWxsIHByb2R1Y2UgdGhlIGRvY3NldCBpbiB0aGF0DQorIyBkaXJlY3RvcnkgYW5kIHJ1bm5pbmcgIm1ha2UgaW5zdGFsbCIgd2lsbCBpbnN0YWxsIHRoZSBkb2NzZXQgaW4NCisjIH4vTGlicmFyeS9EZXZlbG9wZXIvU2hhcmVkL0RvY3VtZW50YXRpb24vRG9jU2V0cyBzbyB0aGF0IFhjb2RlIHdpbGwgZmluZA0KKyMgaXQgYXQgc3RhcnR1cC4NCisjIFNlZSBodHRwOi8vZGV2ZWxvcGVyLmFwcGxlLmNvbS90b29scy9jcmVhdGluZ2RvY3NldHN3aXRoZG94eWdlbi5odG1sDQorIyBmb3IgbW9yZSBpbmZvcm1hdGlvbi4NCisNCitHRU5FUkFURV9ET0NTRVQgICAgICAgID0gTk8NCisNCisjIFdoZW4gR0VORVJBVEVfRE9DU0VUIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGlzIHRhZyBkZXRlcm1pbmVzIHRoZSBuYW1lIG9mIHRoZQ0KKyMgZmVlZC4gQSBkb2N1bWVudGF0aW9uIGZlZWQgcHJvdmlkZXMgYW4gdW1icmVsbGEgdW5kZXIgd2hpY2ggbXVsdGlwbGUNCisjIGRvY3VtZW50YXRpb24gc2V0cyBmcm9tIGEgc2luZ2xlIHByb3ZpZGVyIChzdWNoIGFzIGEgY29tcGFueSBvciBwcm9kdWN0IHN1aXRlKQ0KKyMgY2FuIGJlIGdyb3VwZWQuDQorDQorRE9DU0VUX0ZFRUROQU1FICAgICAgICA9ICJEb3h5Z2VuIGdlbmVyYXRlZCBkb2NzIg0KKw0KKyMgV2hlbiBHRU5FUkFURV9ET0NTRVQgdGFnIGlzIHNldCB0byBZRVMsIHRoaXMgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0DQorIyBzaG91bGQgdW5pcXVlbHkgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gc2V0IGJ1bmRsZS4gVGhpcyBzaG91bGQgYmUgYQ0KKyMgcmV2ZXJzZSBkb21haW4tbmFtZSBzdHlsZSBzdHJpbmcsIGUuZy4gY29tLm15Y29tcGFueS5NeURvY1NldC4gRG94eWdlbg0KKyMgd2lsbCBhcHBlbmQgLmRvY3NldCB0byB0aGUgbmFtZS4NCisNCitET0NTRVRfQlVORExFX0lEICAgICAgID0gb3JnLmRveHlnZW4uUHJvamVjdA0KKw0KKyMgV2hlbiBHRU5FUkFURV9QVUJMSVNIRVJfSUQgdGFnIHNwZWNpZmllcyBhIHN0cmluZyB0aGF0IHNob3VsZCB1bmlxdWVseQ0KKyMgaWRlbnRpZnkgdGhlIGRvY3VtZW50YXRpb24gcHVibGlzaGVyLiBUaGlzIHNob3VsZCBiZSBhIHJldmVyc2UgZG9tYWluLW5hbWUNCisjIHN0eWxlIHN0cmluZywgZS5nLiBjb20ubXljb21wYW55Lk15RG9jU2V0LmRvY3VtZW50YXRpb24uDQorDQorRE9DU0VUX1BVQkxJU0hFUl9JRCAgICA9IG9yZy5kb3h5Z2VuLlB1Ymxpc2hlcg0KKw0KKyMgVGhlIEdFTkVSQVRFX1BVQkxJU0hFUl9OQU1FIHRhZyBpZGVudGlmaWVzIHRoZSBkb2N1bWVudGF0aW9uIHB1Ymxpc2hlci4NCisNCitET0NTRVRfUFVCTElTSEVSX05BTUUgID0gUHVibGlzaGVyDQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjIHdpbGwgYmUgZ2VuZXJhdGVkIHRoYXQgY2FuIGJlIHVzZWQgYXMgaW5wdXQgZm9yIHRvb2xzIGxpa2UgdGhlDQorIyBNaWNyb3NvZnQgSFRNTCBoZWxwIHdvcmtzaG9wIHRvIGdlbmVyYXRlIGEgY29tcGlsZWQgSFRNTCBoZWxwIGZpbGUgKC5jaG0pDQorIyBvZiB0aGUgZ2VuZXJhdGVkIEhUTUwgZG9jdW1lbnRhdGlvbi4NCisNCitHRU5FUkFURV9IVE1MSEVMUCAgICAgID0gTk8NCisNCisjIElmIHRoZSBHRU5FUkFURV9IVE1MSEVMUCB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIENITV9GSUxFIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgZmlsZSBuYW1lIG9mIHRoZSByZXN1bHRpbmcgLmNobSBmaWxlLiBZb3UNCisjIGNhbiBhZGQgYSBwYXRoIGluIGZyb250IG9mIHRoZSBmaWxlIGlmIHRoZSByZXN1bHQgc2hvdWxkIG5vdCBiZQ0KKyMgd3JpdHRlbiB0byB0aGUgaHRtbCBvdXRwdXQgZGlyZWN0b3J5Lg0KKw0KK0NITV9GSUxFICAgICAgICAgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgSEhDX0xPQ0FUSU9OIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gKGFic29sdXRlIHBhdGggaW5jbHVkaW5nIGZpbGUgbmFtZSkgb2YNCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgKGhoYy5leGUpLiBJZiBub24tZW1wdHkgZG94eWdlbiB3aWxsIHRyeSB0byBydW4NCisjIHRoZSBIVE1MIGhlbHAgY29tcGlsZXIgb24gdGhlIGdlbmVyYXRlZCBpbmRleC5oaHAuDQorDQorSEhDX0xPQ0FUSU9OICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfSFRNTEhFTFAgdGFnIGlzIHNldCB0byBZRVMsIHRoZSBHRU5FUkFURV9DSEkgZmxhZw0KKyMgY29udHJvbHMgaWYgYSBzZXBhcmF0ZSAuY2hpIGluZGV4IGZpbGUgaXMgZ2VuZXJhdGVkIChZRVMpIG9yIHRoYXQNCisjIGl0IHNob3VsZCBiZSBpbmNsdWRlZCBpbiB0aGUgbWFzdGVyIC5jaG0gZmlsZSAoTk8pLg0KKw0KK0dFTkVSQVRFX0NISSAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQ0hNX0lOREVYX0VOQ09ESU5HDQorIyBpcyB1c2VkIHRvIGVuY29kZSBIdG1sSGVscCBpbmRleCAoaGhrKSwgY29udGVudCAoaGhjKSBhbmQgcHJvamVjdCBmaWxlDQorIyBjb250ZW50Lg0KKw0KK0NITV9JTkRFWF9FTkNPRElORyAgICAgPQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0hUTUxIRUxQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgQklOQVJZX1RPQyBmbGFnDQorIyBjb250cm9scyB3aGV0aGVyIGEgYmluYXJ5IHRhYmxlIG9mIGNvbnRlbnRzIGlzIGdlbmVyYXRlZCAoWUVTKSBvciBhDQorIyBub3JtYWwgdGFibGUgb2YgY29udGVudHMgKE5PKSBpbiB0aGUgLmNobSBmaWxlLg0KKw0KK0JJTkFSWV9UT0MgICAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFRPQ19FWFBBTkQgZmxhZyBjYW4gYmUgc2V0IHRvIFlFUyB0byBhZGQgZXh0cmEgaXRlbXMgZm9yIGdyb3VwIG1lbWJlcnMNCisjIHRvIHRoZSBjb250ZW50cyBvZiB0aGUgSFRNTCBoZWxwIGRvY3VtZW50YXRpb24gYW5kIHRvIHRoZSB0cmVlIHZpZXcuDQorDQorVE9DX0VYUEFORCAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTIGFuZCBib3RoIFFIUF9OQU1FU1BBQ0UgYW5kDQorIyBRSFBfVklSVFVBTF9GT0xERVIgYXJlIHNldCwgYW4gYWRkaXRpb25hbCBpbmRleCBmaWxlIHdpbGwgYmUgZ2VuZXJhdGVkDQorIyB0aGF0IGNhbiBiZSB1c2VkIGFzIGlucHV0IGZvciBRdCdzIHFoZWxwZ2VuZXJhdG9yIHRvIGdlbmVyYXRlIGENCisjIFF0IENvbXByZXNzZWQgSGVscCAoLnFjaCkgb2YgdGhlIGdlbmVyYXRlZCBIVE1MIGRvY3VtZW50YXRpb24uDQorDQorR0VORVJBVEVfUUhQICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBpcyBzcGVjaWZpZWQsIHRoZSBRQ0hfRklMRSB0YWcgY2FuDQorIyBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIGZpbGUgbmFtZSBvZiB0aGUgcmVzdWx0aW5nIC5xY2ggZmlsZS4NCisjIFRoZSBwYXRoIHNwZWNpZmllZCBpcyByZWxhdGl2ZSB0byB0aGUgSFRNTCBvdXRwdXQgZm9sZGVyLg0KKw0KK1FDSF9GSUxFICAgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFFIUF9OQU1FU1BBQ0UgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcNCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjbmFtZXNwYWNlDQorDQorUUhQX05BTUVTUEFDRSAgICAgICAgICA9IG9yZy5kb3h5Z2VuLlByb2plY3QNCisNCisjIFRoZSBRSFBfVklSVFVBTF9GT0xERVIgdGFnIHNwZWNpZmllcyB0aGUgbmFtZXNwYWNlIHRvIHVzZSB3aGVuIGdlbmVyYXRpbmcNCisjIFF0IEhlbHAgUHJvamVjdCBvdXRwdXQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjdmlydHVhbC1mb2xkZXJzDQorDQorUUhQX1ZJUlRVQUxfRk9MREVSICAgICA9IGRvYw0KKw0KKyMgSWYgUUhQX0NVU1RfRklMVEVSX05BTUUgaXMgc2V0LCBpdCBzcGVjaWZpZXMgdGhlIG5hbWUgb2YgYSBjdXN0b20gZmlsdGVyIHRvDQorIyBhZGQuIEZvciBtb3JlIGluZm9ybWF0aW9uIHBsZWFzZSBzZWUNCisjIGh0dHA6Ly9kb2MudHJvbGx0ZWNoLmNvbS9xdGhlbHBwcm9qZWN0Lmh0bWwjY3VzdG9tLWZpbHRlcnMNCisNCitRSFBfQ1VTVF9GSUxURVJfTkFNRSAgID0NCisNCisjIFRoZSBRSFBfQ1VTVF9GSUxUX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgb2YgdGhlDQorIyBjdXN0b20gZmlsdGVyIHRvIGFkZC4gRm9yIG1vcmUgaW5mb3JtYXRpb24gcGxlYXNlIHNlZQ0KKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNjdXN0b20tZmlsdGVycyI+DQorIyBRdCBIZWxwIFByb2plY3QgLyBDdXN0b20gRmlsdGVyczwvYT4uDQorDQorUUhQX0NVU1RfRklMVEVSX0FUVFJTICA9DQorDQorIyBUaGUgUUhQX1NFQ1RfRklMVEVSX0FUVFJTIHRhZyBzcGVjaWZpZXMgdGhlIGxpc3Qgb2YgdGhlIGF0dHJpYnV0ZXMgdGhpcw0KKyMgcHJvamVjdCdzDQorIyBmaWx0ZXIgc2VjdGlvbiBtYXRjaGVzLg0KKyMgPGEgaHJlZj0iaHR0cDovL2RvYy50cm9sbHRlY2guY29tL3F0aGVscHByb2plY3QuaHRtbCNmaWx0ZXItYXR0cmlidXRlcyI+DQorIyBRdCBIZWxwIFByb2plY3QgLyBGaWx0ZXIgQXR0cmlidXRlczwvYT4uDQorDQorUUhQX1NFQ1RfRklMVEVSX0FUVFJTICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfUUhQIHRhZyBpcyBzZXQgdG8gWUVTLCB0aGUgUUhHX0xPQ0FUSU9OIHRhZyBjYW4NCisjIGJlIHVzZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gb2YgUXQncyBxaGVscGdlbmVyYXRvci4NCisjIElmIG5vbi1lbXB0eSBkb3h5Z2VuIHdpbGwgdHJ5IHRvIHJ1biBxaGVscGdlbmVyYXRvciBvbiB0aGUgZ2VuZXJhdGVkDQorIyAucWhwIGZpbGUuDQorDQorUUhHX0xPQ0FUSU9OICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgR0VORVJBVEVfRUNMSVBTRUhFTFAgdGFnIGlzIHNldCB0byBZRVMsIGFkZGl0aW9uYWwgaW5kZXggZmlsZXMNCisjICB3aWxsIGJlIGdlbmVyYXRlZCwgd2hpY2ggdG9nZXRoZXIgd2l0aCB0aGUgSFRNTCBmaWxlcywgZm9ybSBhbiBFY2xpcHNlIGhlbHANCisjIHBsdWdpbi4gVG8gaW5zdGFsbCB0aGlzIHBsdWdpbiBhbmQgbWFrZSBpdCBhdmFpbGFibGUgdW5kZXIgdGhlIGhlbHAgY29udGVudHMNCisjIG1lbnUgaW4gRWNsaXBzZSwgdGhlIGNvbnRlbnRzIG9mIHRoZSBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgSFRNTCBhbmQgWE1MDQorIyBmaWxlcyBuZWVkcyB0byBiZSBjb3BpZWQgaW50byB0aGUgcGx1Z2lucyBkaXJlY3Rvcnkgb2YgZWNsaXBzZS4gVGhlIG5hbWUgb2YNCisjIHRoZSBkaXJlY3Rvcnkgd2l0aGluIHRoZSBwbHVnaW5zIGRpcmVjdG9yeSBzaG91bGQgYmUgdGhlIHNhbWUgYXMNCisjIHRoZSBFQ0xJUFNFX0RPQ19JRCB2YWx1ZS4gQWZ0ZXIgY29weWluZyBFY2xpcHNlIG5lZWRzIHRvIGJlIHJlc3RhcnRlZCBiZWZvcmUNCisjIHRoZSBoZWxwIGFwcGVhcnMuDQorDQorR0VORVJBVEVfRUNMSVBTRUhFTFAgICA9IE5PDQorDQorIyBBIHVuaXF1ZSBpZGVudGlmaWVyIGZvciB0aGUgZWNsaXBzZSBoZWxwIHBsdWdpbi4gV2hlbiBpbnN0YWxsaW5nIHRoZSBwbHVnaW4NCisjIHRoZSBkaXJlY3RvcnkgbmFtZSBjb250YWluaW5nIHRoZSBIVE1MIGFuZCBYTUwgZmlsZXMgc2hvdWxkIGFsc28gaGF2ZQ0KKyMgdGhpcyBuYW1lLg0KKw0KK0VDTElQU0VfRE9DX0lEICAgICAgICAgPSBvcmcuZG94eWdlbi5Qcm9qZWN0DQorDQorIyBUaGUgRElTQUJMRV9JTkRFWCB0YWcgY2FuIGJlIHVzZWQgdG8gdHVybiBvbi9vZmYgdGhlIGNvbmRlbnNlZCBpbmRleCAodGFicykNCisjIGF0IHRvcCBvZiBlYWNoIEhUTUwgcGFnZS4gVGhlIHZhbHVlIE5PICh0aGUgZGVmYXVsdCkgZW5hYmxlcyB0aGUgaW5kZXggYW5kDQorIyB0aGUgdmFsdWUgWUVTIGRpc2FibGVzIGl0LiBTaW5jZSB0aGUgdGFicyBoYXZlIHRoZSBzYW1lIGluZm9ybWF0aW9uIGFzIHRoZQ0KKyMgbmF2aWdhdGlvbiB0cmVlIHlvdSBjYW4gc2V0IHRoaXMgb3B0aW9uIHRvIE5PIGlmIHlvdSBhbHJlYWR5IHNldA0KKyMgR0VORVJBVEVfVFJFRVZJRVcgdG8gWUVTLg0KKw0KK0RJU0FCTEVfSU5ERVggICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIEdFTkVSQVRFX1RSRUVWSUVXIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgd2hldGhlciBhIHRyZWUtbGlrZSBpbmRleA0KKyMgc3RydWN0dXJlIHNob3VsZCBiZSBnZW5lcmF0ZWQgdG8gZGlzcGxheSBoaWVyYXJjaGljYWwgaW5mb3JtYXRpb24uDQorIyBJZiB0aGUgdGFnIHZhbHVlIGlzIHNldCB0byBZRVMsIGEgc2lkZSBwYW5lbCB3aWxsIGJlIGdlbmVyYXRlZA0KKyMgY29udGFpbmluZyBhIHRyZWUtbGlrZSBpbmRleCBzdHJ1Y3R1cmUgKGp1c3QgbGlrZSB0aGUgb25lIHRoYXQNCisjIGlzIGdlbmVyYXRlZCBmb3IgSFRNTCBIZWxwKS4gRm9yIHRoaXMgdG8gd29yayBhIGJyb3dzZXIgdGhhdCBzdXBwb3J0cw0KKyMgSmF2YVNjcmlwdCwgREhUTUwsIENTUyBhbmQgZnJhbWVzIGlzIHJlcXVpcmVkIChpLmUuIGFueSBtb2Rlcm4gYnJvd3NlcikuDQorIyBXaW5kb3dzIHVzZXJzIGFyZSBwcm9iYWJseSBiZXR0ZXIgb2ZmIHVzaW5nIHRoZSBIVE1MIGhlbHAgZmVhdHVyZS4NCisjIFNpbmNlIHRoZSB0cmVlIGJhc2ljYWxseSBoYXMgdGhlIHNhbWUgaW5mb3JtYXRpb24gYXMgdGhlIHRhYiBpbmRleCB5b3UNCisjIGNvdWxkIGNvbnNpZGVyIHRvIHNldCBESVNBQkxFX0lOREVYIHRvIE5PIHdoZW4gZW5hYmxpbmcgdGhpcyBvcHRpb24uDQorDQorR0VORVJBVEVfVFJFRVZJRVcgICAgICA9IE5PDQorDQorIyBUaGUgRU5VTV9WQUxVRVNfUEVSX0xJTkUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgbnVtYmVyIG9mIGVudW0gdmFsdWVzDQorIyAocmFuZ2UgWzAsMS4uMjBdKSB0aGF0IGRveHlnZW4gd2lsbCBncm91cCBvbiBvbmUgbGluZSBpbiB0aGUgZ2VuZXJhdGVkIEhUTUwNCisjIGRvY3VtZW50YXRpb24uIE5vdGUgdGhhdCBhIHZhbHVlIG9mIDAgd2lsbCBjb21wbGV0ZWx5IHN1cHByZXNzIHRoZSBlbnVtDQorIyB2YWx1ZXMgZnJvbSBhcHBlYXJpbmcgaW4gdGhlIG92ZXJ2aWV3IHNlY3Rpb24uDQorDQorRU5VTV9WQUxVRVNfUEVSX0xJTkUgICA9IDQNCisNCisjIElmIHRoZSB0cmVldmlldyBpcyBlbmFibGVkIChzZWUgR0VORVJBVEVfVFJFRVZJRVcpIHRoZW4gdGhpcyB0YWcgY2FuIGJlDQorIyB1c2VkIHRvIHNldCB0aGUgaW5pdGlhbCB3aWR0aCAoaW4gcGl4ZWxzKSBvZiB0aGUgZnJhbWUgaW4gd2hpY2ggdGhlIHRyZWUNCisjIGlzIHNob3duLg0KKw0KK1RSRUVWSUVXX1dJRFRIICAgICAgICAgPSAyNTANCisNCisjIFdoZW4gdGhlIEVYVF9MSU5LU19JTl9XSU5ET1cgb3B0aW9uIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIG9wZW4NCisjIGxpbmtzIHRvIGV4dGVybmFsIHN5bWJvbHMgaW1wb3J0ZWQgdmlhIHRhZyBmaWxlcyBpbiBhIHNlcGFyYXRlIHdpbmRvdy4NCisNCitFWFRfTElOS1NfSU5fV0lORE9XICAgID0gTk8NCisNCisjIFVzZSB0aGlzIHRhZyB0byBjaGFuZ2UgdGhlIGZvbnQgc2l6ZSBvZiBMYXRleCBmb3JtdWxhcyBpbmNsdWRlZA0KKyMgYXMgaW1hZ2VzIGluIHRoZSBIVE1MIGRvY3VtZW50YXRpb24uIFRoZSBkZWZhdWx0IGlzIDEwLiBOb3RlIHRoYXQNCisjIHdoZW4geW91IGNoYW5nZSB0aGUgZm9udCBzaXplIGFmdGVyIGEgc3VjY2Vzc2Z1bCBkb3h5Z2VuIHJ1biB5b3UgbmVlZA0KKyMgdG8gbWFudWFsbHkgcmVtb3ZlIGFueSBmb3JtXyoucG5nIGltYWdlcyBmcm9tIHRoZSBIVE1MIG91dHB1dCBkaXJlY3RvcnkNCisjIHRvIGZvcmNlIHRoZW0gdG8gYmUgcmVnZW5lcmF0ZWQuDQorDQorRk9STVVMQV9GT05UU0laRSAgICAgICA9IDEwDQorDQorIyBVc2UgdGhlIEZPUk1VTEFfVFJBTlBBUkVOVCB0YWcgdG8gZGV0ZXJtaW5lIHdoZXRoZXIgb3Igbm90IHRoZSBpbWFnZXMNCisjIGdlbmVyYXRlZCBmb3IgZm9ybXVsYXMgYXJlIHRyYW5zcGFyZW50IFBOR3MuIFRyYW5zcGFyZW50IFBOR3MgYXJlDQorIyBub3Qgc3VwcG9ydGVkIHByb3Blcmx5IGZvciBJRSA2LjAsIGJ1dCBhcmUgc3VwcG9ydGVkIG9uIGFsbCBtb2Rlcm4gYnJvd3NlcnMuDQorIyBOb3RlIHRoYXQgd2hlbiBjaGFuZ2luZyB0aGlzIG9wdGlvbiB5b3UgbmVlZCB0byBkZWxldGUgYW55IGZvcm1fKi5wbmcgZmlsZXMNCisjIGluIHRoZSBIVE1MIG91dHB1dCBiZWZvcmUgdGhlIGNoYW5nZXMgaGF2ZSBlZmZlY3QuDQorDQorRk9STVVMQV9UUkFOU1BBUkVOVCAgICA9IFlFUw0KKw0KKyMgRW5hYmxlIHRoZSBVU0VfTUFUSEpBWCBvcHRpb24gdG8gcmVuZGVyIExhVGVYIGZvcm11bGFzIHVzaW5nIE1hdGhKYXgNCisjIChzZWUgaHR0cDovL3d3dy5tYXRoamF4Lm9yZykgd2hpY2ggdXNlcyBjbGllbnQgc2lkZSBKYXZhc2NyaXB0IGZvciB0aGUNCisjIHJlbmRlcmluZyBpbnN0ZWFkIG9mIHVzaW5nIHByZXJlbmRlcmVkIGJpdG1hcHMuIFVzZSB0aGlzIGlmIHlvdSBkbyBub3QNCisjIGhhdmUgTGFUZVggaW5zdGFsbGVkIG9yIGlmIHlvdSB3YW50IHRvIGZvcm11bGFzIGxvb2sgcHJldHRpZXIgaW4gdGhlIEhUTUwNCisjIG91dHB1dC4gV2hlbiBlbmFibGVkIHlvdSBtYXkgYWxzbyBuZWVkIHRvIGluc3RhbGwgTWF0aEpheCBzZXBhcmF0ZWx5IGFuZA0KKyMgY29uZmlndXJlIHRoZSBwYXRoIHRvIGl0IHVzaW5nIHRoZSBNQVRISkFYX1JFTFBBVEggb3B0aW9uLg0KKw0KK1VTRV9NQVRISkFYICAgICAgICAgICAgPSBOTw0KKw0KKyMgV2hlbiBNYXRoSmF4IGlzIGVuYWJsZWQgeW91IG5lZWQgdG8gc3BlY2lmeSB0aGUgbG9jYXRpb24gcmVsYXRpdmUgdG8gdGhlDQorIyBIVE1MIG91dHB1dCBkaXJlY3RvcnkgdXNpbmcgdGhlIE1BVEhKQVhfUkVMUEFUSCBvcHRpb24uIFRoZSBkZXN0aW5hdGlvbg0KKyMgZGlyZWN0b3J5IHNob3VsZCBjb250YWluIHRoZSBNYXRoSmF4LmpzIHNjcmlwdC4gRm9yIGluc3RhbmNlLCBpZiB0aGUgbWF0aGpheA0KKyMgZGlyZWN0b3J5IGlzIGxvY2F0ZWQgYXQgdGhlIHNhbWUgbGV2ZWwgYXMgdGhlIEhUTUwgb3V0cHV0IGRpcmVjdG9yeSwgdGhlbg0KKyMgTUFUSEpBWF9SRUxQQVRIIHNob3VsZCBiZSAuLi9tYXRoamF4LiBUaGUgZGVmYXVsdCB2YWx1ZSBwb2ludHMgdG8NCisjIHRoZSBNYXRoSmF4IENvbnRlbnQgRGVsaXZlcnkgTmV0d29yayBzbyB5b3UgY2FuIHF1aWNrbHkgc2VlIHRoZSByZXN1bHQgd2l0aG91dA0KKyMgaW5zdGFsbGluZyBNYXRoSmF4Lg0KKyMgSG93ZXZlciwgaXQgaXMgc3Ryb25nbHkgcmVjb21tZW5kZWQgdG8gaW5zdGFsbCBhIGxvY2FsDQorIyBjb3B5IG9mIE1hdGhKYXggZnJvbSBodHRwOi8vd3d3Lm1hdGhqYXgub3JnIGJlZm9yZSBkZXBsb3ltZW50Lg0KKw0KK01BVEhKQVhfUkVMUEFUSCAgICAgICAgPSBodHRwOi8vY2RuLm1hdGhqYXgub3JnL21hdGhqYXgvbGF0ZXN0DQorDQorIyBUaGUgTUFUSEpBWF9FWFRFTlNJT05TIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IG9uZSBvciBNYXRoSmF4IGV4dGVuc2lvbg0KKyMgbmFtZXMgdGhhdCBzaG91bGQgYmUgZW5hYmxlZCBkdXJpbmcgTWF0aEpheCByZW5kZXJpbmcuDQorDQorTUFUSEpBWF9FWFRFTlNJT05TICAgICA9DQorDQorIyBXaGVuIHRoZSBTRUFSQ0hFTkdJTkUgdGFnIGlzIGVuYWJsZWQgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgc2VhcmNoIGJveA0KKyMgZm9yIHRoZSBIVE1MIG91dHB1dC4gVGhlIHVuZGVybHlpbmcgc2VhcmNoIGVuZ2luZSB1c2VzIGphdmFzY3JpcHQNCisjIGFuZCBESFRNTCBhbmQgc2hvdWxkIHdvcmsgb24gYW55IG1vZGVybiBicm93c2VyLiBOb3RlIHRoYXQgd2hlbiB1c2luZw0KKyMgSFRNTCBoZWxwIChHRU5FUkFURV9IVE1MSEVMUCksIFF0IGhlbHAgKEdFTkVSQVRFX1FIUCksIG9yIGRvY3NldHMNCisjIChHRU5FUkFURV9ET0NTRVQpIHRoZXJlIGlzIGFscmVhZHkgYSBzZWFyY2ggZnVuY3Rpb24gc28gdGhpcyBvbmUgc2hvdWxkDQorIyB0eXBpY2FsbHkgYmUgZGlzYWJsZWQuIEZvciBsYXJnZSBwcm9qZWN0cyB0aGUgamF2YXNjcmlwdCBiYXNlZCBzZWFyY2ggZW5naW5lDQorIyBjYW4gYmUgc2xvdywgdGhlbiBlbmFibGluZyBTRVJWRVJfQkFTRURfU0VBUkNIIG1heSBwcm92aWRlIGEgYmV0dGVyIHNvbHV0aW9uLg0KKw0KK1NFQVJDSEVOR0lORSAgICAgICAgICAgPSBZRVMNCisNCisjIFdoZW4gdGhlIFNFUlZFUl9CQVNFRF9TRUFSQ0ggdGFnIGlzIGVuYWJsZWQgdGhlIHNlYXJjaCBlbmdpbmUgd2lsbCBiZQ0KKyMgaW1wbGVtZW50ZWQgdXNpbmcgYSBQSFAgZW5hYmxlZCB3ZWIgc2VydmVyIGluc3RlYWQgb2YgYXQgdGhlIHdlYiBjbGllbnQNCisjIHVzaW5nIEphdmFzY3JpcHQuIERveHlnZW4gd2lsbCBnZW5lcmF0ZSB0aGUgc2VhcmNoIFBIUCBzY3JpcHQgYW5kIGluZGV4DQorIyBmaWxlIHRvIHB1dCBvbiB0aGUgd2ViIHNlcnZlci4gVGhlIGFkdmFudGFnZSBvZiB0aGUgc2VydmVyDQorIyBiYXNlZCBhcHByb2FjaCBpcyB0aGF0IGl0IHNjYWxlcyBiZXR0ZXIgdG8gbGFyZ2UgcHJvamVjdHMgYW5kIGFsbG93cw0KKyMgZnVsbCB0ZXh0IHNlYXJjaC4gVGhlIGRpc2FkdmFudGFnZXMgYXJlIHRoYXQgaXQgaXMgbW9yZSBkaWZmaWN1bHQgdG8gc2V0dXANCisjIGFuZCBkb2VzIG5vdCBoYXZlIGxpdmUgc2VhcmNoaW5nIGNhcGFiaWxpdGllcy4NCisNCitTRVJWRVJfQkFTRURfU0VBUkNIICAgID0gTk8NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgTGFUZVggb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0xBVEVYIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgRG94eWdlbiB3aWxsDQorIyBnZW5lcmF0ZSBMYXRleCBvdXRwdXQuDQorDQorR0VORVJBVEVfTEFURVggICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIExBVEVYX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBMYVRlWCBkb2NzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGBsYXRleCcgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorTEFURVhfT1VUUFVUICAgICAgICAgICA9DQorDQorIyBUaGUgTEFURVhfQ01EX05BTUUgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIExhVGVYIGNvbW1hbmQgbmFtZSB0byBiZQ0KKyMgaW52b2tlZC4gSWYgbGVmdCBibGFuayBgbGF0ZXgnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBjb21tYW5kIG5hbWUuDQorIyBOb3RlIHRoYXQgd2hlbiBlbmFibGluZyBVU0VfUERGTEFURVggdGhpcyBvcHRpb24gaXMgb25seSB1c2VkIGZvcg0KKyMgZ2VuZXJhdGluZyBiaXRtYXBzIGZvciBmb3JtdWxhcyBpbiB0aGUgSFRNTCBvdXRwdXQsIGJ1dCBub3QgaW4gdGhlDQorIyBNYWtlZmlsZSB0aGF0IGlzIHdyaXR0ZW4gdG8gdGhlIG91dHB1dCBkaXJlY3RvcnkuDQorDQorTEFURVhfQ01EX05BTUUgICAgICAgICA9IGxhdGV4DQorDQorIyBUaGUgTUFLRUlOREVYX0NNRF9OQU1FIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBjb21tYW5kIG5hbWUgdG8NCisjIGdlbmVyYXRlIGluZGV4IGZvciBMYVRlWC4gSWYgbGVmdCBibGFuayBgbWFrZWluZGV4JyB3aWxsIGJlIHVzZWQgYXMgdGhlDQorIyBkZWZhdWx0IGNvbW1hbmQgbmFtZS4NCisNCitNQUtFSU5ERVhfQ01EX05BTUUgICAgID0gbWFrZWluZGV4DQorDQorIyBJZiB0aGUgQ09NUEFDVF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QNCisjIExhVGVYIGRvY3VtZW50cy4gVGhpcyBtYXkgYmUgdXNlZnVsIGZvciBzbWFsbCBwcm9qZWN0cyBhbmQgbWF5IGhlbHAgdG8NCisjIHNhdmUgc29tZSB0cmVlcyBpbiBnZW5lcmFsLg0KKw0KK0NPTVBBQ1RfTEFURVggICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFBBUEVSX1RZUEUgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgcGFwZXIgdHlwZSB0aGF0IGlzIHVzZWQNCisjIGJ5IHRoZSBwcmludGVyLiBQb3NzaWJsZSB2YWx1ZXMgYXJlOiBhNCwgbGV0dGVyLCBsZWdhbCBhbmQNCisjIGV4ZWN1dGl2ZS4gSWYgbGVmdCBibGFuayBhNHdpZGUgd2lsbCBiZSB1c2VkLg0KKw0KK1BBUEVSX1RZUEUgICAgICAgICAgICAgPSBhNHdpZGUNCisNCisjIFRoZSBFWFRSQV9QQUNLQUdFUyB0YWcgY2FuIGJlIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgbmFtZXMgb2YgTGFUZVgNCisjIHBhY2thZ2VzIHRoYXQgc2hvdWxkIGJlIGluY2x1ZGVkIGluIHRoZSBMYVRlWCBvdXRwdXQuDQorDQorRVhUUkFfUEFDS0FHRVMgICAgICAgICA9DQorDQorIyBUaGUgTEFURVhfSEVBREVSIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgcGVyc29uYWwgTGFUZVggaGVhZGVyIGZvcg0KKyMgdGhlIGdlbmVyYXRlZCBsYXRleCBkb2N1bWVudC4gVGhlIGhlYWRlciBzaG91bGQgY29udGFpbiBldmVyeXRoaW5nIHVudGlsDQorIyB0aGUgZmlyc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgaGVhZGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyENCisNCitMQVRFWF9IRUFERVIgICAgICAgICAgID0gZG9jL2RveHlnZW4vaGVhZGVyLnRleA0KKw0KKyMgVGhlIExBVEVYX0ZPT1RFUiB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBhIHBlcnNvbmFsIExhVGVYIGZvb3RlciBmb3INCisjIHRoZSBnZW5lcmF0ZWQgbGF0ZXggZG9jdW1lbnQuIFRoZSBmb290ZXIgc2hvdWxkIGNvbnRhaW4gZXZlcnl0aGluZyBhZnRlcg0KKyMgdGhlIGxhc3QgY2hhcHRlci4gSWYgaXQgaXMgbGVmdCBibGFuayBkb3h5Z2VuIHdpbGwgZ2VuZXJhdGUgYQ0KKyMgc3RhbmRhcmQgZm9vdGVyLiBOb3RpY2U6IG9ubHkgdXNlIHRoaXMgdGFnIGlmIHlvdSBrbm93IHdoYXQgeW91IGFyZSBkb2luZyENCisNCitMQVRFWF9GT09URVIgICAgICAgICAgID0NCisNCisjIElmIHRoZSBQREZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIExhVGVYIHRoYXQgaXMgZ2VuZXJhdGVkDQorIyBpcyBwcmVwYXJlZCBmb3IgY29udmVyc2lvbiB0byBwZGYgKHVzaW5nIHBzMnBkZikuIFRoZSBwZGYgZmlsZSB3aWxsDQorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcw0KKyMgVGhpcyBtYWtlcyB0aGUgb3V0cHV0IHN1aXRhYmxlIGZvciBvbmxpbmUgYnJvd3NpbmcgdXNpbmcgYSBwZGYgdmlld2VyLg0KKw0KK1BERl9IWVBFUkxJTktTICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBVU0VfUERGTEFURVggdGFnIGlzIHNldCB0byBZRVMsIHBkZmxhdGV4IHdpbGwgYmUgdXNlZCBpbnN0ZWFkIG9mDQorIyBwbGFpbiBsYXRleCBpbiB0aGUgZ2VuZXJhdGVkIE1ha2VmaWxlLiBTZXQgdGhpcyBvcHRpb24gdG8gWUVTIHRvIGdldCBhDQorIyBoaWdoZXIgcXVhbGl0eSBQREYgZG9jdW1lbnRhdGlvbi4NCisNCitVU0VfUERGTEFURVggICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgTEFURVhfQkFUQ0hNT0RFIHRhZyBpcyBzZXQgdG8gWUVTLCBkb3h5Z2VuIHdpbGwgYWRkIHRoZSBcXGJhdGNobW9kZS4NCisjIGNvbW1hbmQgdG8gdGhlIGdlbmVyYXRlZCBMYVRlWCBmaWxlcy4gVGhpcyB3aWxsIGluc3RydWN0IExhVGVYIHRvIGtlZXANCisjIHJ1bm5pbmcgaWYgZXJyb3JzIG9jY3VyLCBpbnN0ZWFkIG9mIGFza2luZyB0aGUgdXNlciBmb3IgaGVscC4NCisjIFRoaXMgb3B0aW9uIGlzIGFsc28gdXNlZCB3aGVuIGdlbmVyYXRpbmcgZm9ybXVsYXMgaW4gSFRNTC4NCisNCitMQVRFWF9CQVRDSE1PREUgICAgICAgID0gTk8NCisNCisjIElmIExBVEVYX0hJREVfSU5ESUNFUyBpcyBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIG5vdA0KKyMgaW5jbHVkZSB0aGUgaW5kZXggY2hhcHRlcnMgKHN1Y2ggYXMgRmlsZSBJbmRleCwgQ29tcG91bmQgSW5kZXgsIGV0Yy4pDQorIyBpbiB0aGUgb3V0cHV0Lg0KKw0KK0xBVEVYX0hJREVfSU5ESUNFUyAgICAgPSBOTw0KKw0KKyMgSWYgTEFURVhfU09VUkNFX0NPREUgaXMgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBpbmNsdWRlDQorIyBzb3VyY2UgY29kZSB3aXRoIHN5bnRheCBoaWdobGlnaHRpbmcgaW4gdGhlIExhVGVYIG91dHB1dC4NCisjIE5vdGUgdGhhdCB3aGljaCBzb3VyY2VzIGFyZSBzaG93biBhbHNvIGRlcGVuZHMgb24gb3RoZXIgc2V0dGluZ3MNCisjIHN1Y2ggYXMgU09VUkNFX0JST1dTRVIuDQorDQorTEFURVhfU09VUkNFX0NPREUgICAgICA9IE5PDQorDQorIyBUaGUgTEFURVhfQklCX1NUWUxFIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IHRoZSBzdHlsZSB0byB1c2UgZm9yIHRoZQ0KKyMgYmlibGlvZ3JhcGh5LCBlLmcuIHBsYWlubmF0LCBvciBpZWVldHIuIFRoZSBkZWZhdWx0IHN0eWxlIGlzICJwbGFpbiIuIFNlZQ0KKyMgaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9CaWJUZVggZm9yIG1vcmUgaW5mby4NCisNCitMQVRFWF9CSUJfU1RZTEUgICAgICAgID0gcGxhaW4NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgUlRGIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9SVEYgdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGdlbmVyYXRlIFJURiBvdXRwdXQNCisjIFRoZSBSVEYgb3V0cHV0IGlzIG9wdGltaXplZCBmb3IgV29yZCA5NyBhbmQgbWF5IG5vdCBsb29rIHZlcnkgcHJldHR5IHdpdGgNCisjIG90aGVyIFJURiByZWFkZXJzIG9yIGVkaXRvcnMuDQorDQorR0VORVJBVEVfUlRGICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgUlRGX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBSVEYgZG9jcyB3aWxsIGJlIHB1dC4NCisjIElmIGEgcmVsYXRpdmUgcGF0aCBpcyBlbnRlcmVkIHRoZSB2YWx1ZSBvZiBPVVRQVVRfRElSRUNUT1JZIHdpbGwgYmUNCisjIHB1dCBpbiBmcm9udCBvZiBpdC4gSWYgbGVmdCBibGFuayBgcnRmJyB3aWxsIGJlIHVzZWQgYXMgdGhlIGRlZmF1bHQgcGF0aC4NCisNCitSVEZfT1VUUFVUICAgICAgICAgICAgID0NCisNCisjIElmIHRoZSBDT01QQUNUX1JURiB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIGdlbmVyYXRlcyBtb3JlIGNvbXBhY3QNCisjIFJURiBkb2N1bWVudHMuIFRoaXMgbWF5IGJlIHVzZWZ1bCBmb3Igc21hbGwgcHJvamVjdHMgYW5kIG1heSBoZWxwIHRvDQorIyBzYXZlIHNvbWUgdHJlZXMgaW4gZ2VuZXJhbC4NCisNCitDT01QQUNUX1JURiAgICAgICAgICAgID0gTk8NCisNCisjIElmIHRoZSBSVEZfSFlQRVJMSU5LUyB0YWcgaXMgc2V0IHRvIFlFUywgdGhlIFJURiB0aGF0IGlzIGdlbmVyYXRlZA0KKyMgd2lsbCBjb250YWluIGh5cGVybGluayBmaWVsZHMuIFRoZSBSVEYgZmlsZSB3aWxsDQorIyBjb250YWluIGxpbmtzIChqdXN0IGxpa2UgdGhlIEhUTUwgb3V0cHV0KSBpbnN0ZWFkIG9mIHBhZ2UgcmVmZXJlbmNlcy4NCisjIFRoaXMgbWFrZXMgdGhlIG91dHB1dCBzdWl0YWJsZSBmb3Igb25saW5lIGJyb3dzaW5nIHVzaW5nIFdPUkQgb3Igb3RoZXINCisjIHByb2dyYW1zIHdoaWNoIHN1cHBvcnQgdGhvc2UgZmllbGRzLg0KKyMgTm90ZTogd29yZHBhZCAod3JpdGUpIGFuZCBvdGhlcnMgZG8gbm90IHN1cHBvcnQgbGlua3MuDQorDQorUlRGX0hZUEVSTElOS1MgICAgICAgICA9IE5PDQorDQorIyBMb2FkIHN0eWxlIHNoZWV0IGRlZmluaXRpb25zIGZyb20gZmlsZS4gU3ludGF4IGlzIHNpbWlsYXIgdG8gZG94eWdlbidzDQorIyBjb25maWcgZmlsZSwgaS5lLiBhIHNlcmllcyBvZiBhc3NpZ25tZW50cy4gWW91IG9ubHkgaGF2ZSB0byBwcm92aWRlDQorIyByZXBsYWNlbWVudHMsIG1pc3NpbmcgZGVmaW5pdGlvbnMgYXJlIHNldCB0byB0aGVpciBkZWZhdWx0IHZhbHVlLg0KKw0KK1JURl9TVFlMRVNIRUVUX0ZJTEUgICAgPQ0KKw0KKyMgU2V0IG9wdGlvbmFsIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBnZW5lcmF0aW9uIG9mIGFuIHJ0ZiBkb2N1bWVudC4NCisjIFN5bnRheCBpcyBzaW1pbGFyIHRvIGRveHlnZW4ncyBjb25maWcgZmlsZS4NCisNCitSVEZfRVhURU5TSU9OU19GSUxFICAgID0NCisNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorIyBjb25maWd1cmF0aW9uIG9wdGlvbnMgcmVsYXRlZCB0byB0aGUgbWFuIHBhZ2Ugb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX01BTiB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgbWFuIHBhZ2VzDQorDQorR0VORVJBVEVfTUFOICAgICAgICAgICA9IE5PDQorDQorIyBUaGUgTUFOX09VVFBVVCB0YWcgaXMgdXNlZCB0byBzcGVjaWZ5IHdoZXJlIHRoZSBtYW4gcGFnZXMgd2lsbCBiZSBwdXQuDQorIyBJZiBhIHJlbGF0aXZlIHBhdGggaXMgZW50ZXJlZCB0aGUgdmFsdWUgb2YgT1VUUFVUX0RJUkVDVE9SWSB3aWxsIGJlDQorIyBwdXQgaW4gZnJvbnQgb2YgaXQuIElmIGxlZnQgYmxhbmsgYG1hbicgd2lsbCBiZSB1c2VkIGFzIHRoZSBkZWZhdWx0IHBhdGguDQorDQorTUFOX09VVFBVVCAgICAgICAgICAgICA9DQorDQorIyBUaGUgTUFOX0VYVEVOU0lPTiB0YWcgZGV0ZXJtaW5lcyB0aGUgZXh0ZW5zaW9uIHRoYXQgaXMgYWRkZWQgdG8NCisjIHRoZSBnZW5lcmF0ZWQgbWFuIHBhZ2VzIChkZWZhdWx0IGlzIHRoZSBzdWJyb3V0aW5lJ3Mgc2VjdGlvbiAuMykNCisNCitNQU5fRVhURU5TSU9OICAgICAgICAgID0NCisNCisjIElmIHRoZSBNQU5fTElOS1MgdGFnIGlzIHNldCB0byBZRVMgYW5kIERveHlnZW4gZ2VuZXJhdGVzIG1hbiBvdXRwdXQsDQorIyB0aGVuIGl0IHdpbGwgZ2VuZXJhdGUgb25lIGFkZGl0aW9uYWwgbWFuIGZpbGUgZm9yIGVhY2ggZW50aXR5DQorIyBkb2N1bWVudGVkIGluIHRoZSByZWFsIG1hbiBwYWdlKHMpLiBUaGVzZSBhZGRpdGlvbmFsIGZpbGVzDQorIyBvbmx5IHNvdXJjZSB0aGUgcmVhbCBtYW4gcGFnZSwgYnV0IHdpdGhvdXQgdGhlbSB0aGUgbWFuIGNvbW1hbmQNCisjIHdvdWxkIGJlIHVuYWJsZSB0byBmaW5kIHRoZSBjb3JyZWN0IHBhZ2UuIFRoZSBkZWZhdWx0IGlzIE5PLg0KKw0KK01BTl9MSU5LUyAgICAgICAgICAgICAgPSBOTw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBYTUwgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX1hNTCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwNCisjIGdlbmVyYXRlIGFuIFhNTCBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZg0KKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLg0KKw0KK0dFTkVSQVRFX1hNTCAgICAgICAgICAgPSBOTw0KKw0KKyMgVGhlIFhNTF9PVVRQVVQgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSB3aGVyZSB0aGUgWE1MIHBhZ2VzIHdpbGwgYmUgcHV0Lg0KKyMgSWYgYSByZWxhdGl2ZSBwYXRoIGlzIGVudGVyZWQgdGhlIHZhbHVlIG9mIE9VVFBVVF9ESVJFQ1RPUlkgd2lsbCBiZQ0KKyMgcHV0IGluIGZyb250IG9mIGl0LiBJZiBsZWZ0IGJsYW5rIGB4bWwnIHdpbGwgYmUgdXNlZCBhcyB0aGUgZGVmYXVsdCBwYXRoLg0KKw0KK1hNTF9PVVRQVVQgICAgICAgICAgICAgPSB4bWwNCisNCisjIFRoZSBYTUxfU0NIRU1BIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGFuIFhNTCBzY2hlbWEsDQorIyB3aGljaCBjYW4gYmUgdXNlZCBieSBhIHZhbGlkYXRpbmcgWE1MIHBhcnNlciB0byBjaGVjayB0aGUNCisjIHN5bnRheCBvZiB0aGUgWE1MIGZpbGVzLg0KKw0KK1hNTF9TQ0hFTUEgICAgICAgICAgICAgPQ0KKw0KKyMgVGhlIFhNTF9EVEQgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgYW4gWE1MIERURCwNCisjIHdoaWNoIGNhbiBiZSB1c2VkIGJ5IGEgdmFsaWRhdGluZyBYTUwgcGFyc2VyIHRvIGNoZWNrIHRoZQ0KKyMgc3ludGF4IG9mIHRoZSBYTUwgZmlsZXMuDQorDQorWE1MX0RURCAgICAgICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgWE1MX1BST0dSQU1MSVNUSU5HIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZHVtcCB0aGUgcHJvZ3JhbSBsaXN0aW5ncyAoaW5jbHVkaW5nIHN5bnRheCBoaWdobGlnaHRpbmcNCisjIGFuZCBjcm9zcy1yZWZlcmVuY2luZyBpbmZvcm1hdGlvbikgdG8gdGhlIFhNTCBvdXRwdXQuIE5vdGUgdGhhdA0KKyMgZW5hYmxpbmcgdGhpcyB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UgdGhlIHNpemUgb2YgdGhlIFhNTCBvdXRwdXQuDQorDQorWE1MX1BST0dSQU1MSVNUSU5HICAgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIGNvbmZpZ3VyYXRpb24gb3B0aW9ucyBmb3IgdGhlIEF1dG9HZW4gRGVmaW5pdGlvbnMgb3V0cHV0DQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0FVVE9HRU5fREVGIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYW4gQXV0b0dlbiBEZWZpbml0aW9ucyAoc2VlIGF1dG9nZW4uc2YubmV0KSBmaWxlDQorIyB0aGF0IGNhcHR1cmVzIHRoZSBzdHJ1Y3R1cmUgb2YgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbA0KKyMgZG9jdW1lbnRhdGlvbi4gTm90ZSB0aGF0IHRoaXMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwNCisjIGFuZCBpbmNvbXBsZXRlIGF0IHRoZSBtb21lbnQuDQorDQorR0VORVJBVEVfQVVUT0dFTl9ERUYgICA9IE5PDQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgY29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIFBlcmwgbW9kdWxlIG91dHB1dA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBHRU5FUkFURV9QRVJMTU9EIHRhZyBpcyBzZXQgdG8gWUVTIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBQZXJsIG1vZHVsZSBmaWxlIHRoYXQgY2FwdHVyZXMgdGhlIHN0cnVjdHVyZSBvZg0KKyMgdGhlIGNvZGUgaW5jbHVkaW5nIGFsbCBkb2N1bWVudGF0aW9uLiBOb3RlIHRoYXQgdGhpcw0KKyMgZmVhdHVyZSBpcyBzdGlsbCBleHBlcmltZW50YWwgYW5kIGluY29tcGxldGUgYXQgdGhlDQorIyBtb21lbnQuDQorDQorR0VORVJBVEVfUEVSTE1PRCAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgUEVSTE1PRF9MQVRFWCB0YWcgaXMgc2V0IHRvIFlFUyBEb3h5Z2VuIHdpbGwgZ2VuZXJhdGUNCisjIHRoZSBuZWNlc3NhcnkgTWFrZWZpbGUgcnVsZXMsIFBlcmwgc2NyaXB0cyBhbmQgTGFUZVggY29kZSB0byBiZSBhYmxlDQorIyB0byBnZW5lcmF0ZSBQREYgYW5kIERWSSBvdXRwdXQgZnJvbSB0aGUgUGVybCBtb2R1bGUgb3V0cHV0Lg0KKw0KK1BFUkxNT0RfTEFURVggICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFBFUkxNT0RfUFJFVFRZIHRhZyBpcyBzZXQgdG8gWUVTIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZQ0KKyMgbmljZWx5IGZvcm1hdHRlZCBzbyBpdCBjYW4gYmUgcGFyc2VkIGJ5IGEgaHVtYW4gcmVhZGVyLg0KKyMgVGhpcyBpcyB1c2VmdWwNCisjIGlmIHlvdSB3YW50IHRvIHVuZGVyc3RhbmQgd2hhdCBpcyBnb2luZyBvbi4NCisjIE9uIHRoZSBvdGhlciBoYW5kLCBpZiB0aGlzDQorIyB0YWcgaXMgc2V0IHRvIE5PIHRoZSBzaXplIG9mIHRoZSBQZXJsIG1vZHVsZSBvdXRwdXQgd2lsbCBiZSBtdWNoIHNtYWxsZXINCisjIGFuZCBQZXJsIHdpbGwgcGFyc2UgaXQganVzdCB0aGUgc2FtZS4NCisNCitQRVJMTU9EX1BSRVRUWSAgICAgICAgID0gWUVTDQorDQorIyBUaGUgbmFtZXMgb2YgdGhlIG1ha2UgdmFyaWFibGVzIGluIHRoZSBnZW5lcmF0ZWQgZG94eXJ1bGVzLm1ha2UgZmlsZQ0KKyMgYXJlIHByZWZpeGVkIHdpdGggdGhlIHN0cmluZyBjb250YWluZWQgaW4gUEVSTE1PRF9NQUtFVkFSX1BSRUZJWC4NCisjIFRoaXMgaXMgdXNlZnVsIHNvIGRpZmZlcmVudCBkb3h5cnVsZXMubWFrZSBmaWxlcyBpbmNsdWRlZCBieSB0aGUgc2FtZQ0KKyMgTWFrZWZpbGUgZG9uJ3Qgb3ZlcndyaXRlIGVhY2ggb3RoZXIncyB2YXJpYWJsZXMuDQorDQorUEVSTE1PRF9NQUtFVkFSX1BSRUZJWCA9DQorDQorIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KKyMgQ29uZmlndXJhdGlvbiBvcHRpb25zIHJlbGF0ZWQgdG8gdGhlIHByZXByb2Nlc3Nvcg0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZXZhbHVhdGUgYWxsIEMtcHJlcHJvY2Vzc29yIGRpcmVjdGl2ZXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgYW5kIGluY2x1ZGUNCisjIGZpbGVzLg0KKw0KK0VOQUJMRV9QUkVQUk9DRVNTSU5HICAgPSBZRVMNCisNCisjIElmIHRoZSBNQUNST19FWFBBTlNJT04gdGFnIGlzIHNldCB0byBZRVMgRG94eWdlbiB3aWxsIGV4cGFuZCBhbGwgbWFjcm8NCisjIG5hbWVzIGluIHRoZSBzb3VyY2UgY29kZS4gSWYgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkgb25seSBjb25kaXRpb25hbA0KKyMgY29tcGlsYXRpb24gd2lsbCBiZSBwZXJmb3JtZWQuIE1hY3JvIGV4cGFuc2lvbiBjYW4gYmUgZG9uZSBpbiBhIGNvbnRyb2xsZWQNCisjIHdheSBieSBzZXR0aW5nIEVYUEFORF9PTkxZX1BSRURFRiB0byBZRVMuDQorDQorTUFDUk9fRVhQQU5TSU9OICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVYUEFORF9PTkxZX1BSRURFRiBhbmQgTUFDUk9fRVhQQU5TSU9OIHRhZ3MgYXJlIGJvdGggc2V0IHRvIFlFUw0KKyMgdGhlbiB0aGUgbWFjcm8gZXhwYW5zaW9uIGlzIGxpbWl0ZWQgdG8gdGhlIG1hY3JvcyBzcGVjaWZpZWQgd2l0aCB0aGUNCisjIFBSRURFRklORUQgYW5kIEVYUEFORF9BU19ERUZJTkVEIHRhZ3MuDQorDQorRVhQQU5EX09OTFlfUFJFREVGICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIFNFQVJDSF9JTkNMVURFUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIHRoZSBpbmNsdWRlcyBmaWxlcw0KKyMgcG9pbnRlZCB0byBieSBJTkNMVURFX1BBVEggd2lsbCBiZSBzZWFyY2hlZCB3aGVuIGEgI2luY2x1ZGUgaXMgZm91bmQuDQorDQorU0VBUkNIX0lOQ0xVREVTICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIElOQ0xVREVfUEFUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIGluY2x1ZGUgZmlsZXMgdGhhdCBhcmUgbm90IGlucHV0IGZpbGVzIGJ1dCBzaG91bGQgYmUgcHJvY2Vzc2VkIGJ5DQorIyB0aGUgcHJlcHJvY2Vzc29yLg0KKw0KK0lOQ0xVREVfUEFUSCAgICAgICAgICAgPQ0KKw0KKyMgWW91IGNhbiB1c2UgdGhlIElOQ0xVREVfRklMRV9QQVRURVJOUyB0YWcgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSB3aWxkY2FyZA0KKyMgcGF0dGVybnMgKGxpa2UgKi5oIGFuZCAqLmhwcCkgdG8gZmlsdGVyIG91dCB0aGUgaGVhZGVyLWZpbGVzIGluIHRoZQ0KKyMgZGlyZWN0b3JpZXMuIElmIGxlZnQgYmxhbmssIHRoZSBwYXR0ZXJucyBzcGVjaWZpZWQgd2l0aCBGSUxFX1BBVFRFUk5TIHdpbGwNCisjIGJlIHVzZWQuDQorDQorSU5DTFVERV9GSUxFX1BBVFRFUk5TICA9DQorDQorIyBUaGUgUFJFREVGSU5FRCB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBtYWNybyBuYW1lcyB0aGF0DQorIyBhcmUgZGVmaW5lZCBiZWZvcmUgdGhlIHByZXByb2Nlc3NvciBpcyBzdGFydGVkIChzaW1pbGFyIHRvIHRoZSAtRCBvcHRpb24gb2YNCisjIGdjYykuIFRoZSBhcmd1bWVudCBvZiB0aGUgdGFnIGlzIGEgbGlzdCBvZiBtYWNyb3Mgb2YgdGhlIGZvcm06IG5hbWUNCisjIG9yIG5hbWU9ZGVmaW5pdGlvbiAobm8gc3BhY2VzKS4gSWYgdGhlIGRlZmluaXRpb24gYW5kIHRoZSA9IGFyZQ0KKyMgb21pdHRlZCA9MSBpcyBhc3N1bWVkLiBUbyBwcmV2ZW50IGEgbWFjcm8gZGVmaW5pdGlvbiBmcm9tIGJlaW5nDQorIyB1bmRlZmluZWQgdmlhICN1bmRlZiBvciByZWN1cnNpdmVseSBleHBhbmRlZCB1c2UgdGhlIDo9IG9wZXJhdG9yDQorIyBpbnN0ZWFkIG9mIHRoZSA9IG9wZXJhdG9yLg0KKw0KK1BSRURFRklORUQgICAgICAgICAgICAgPSBPTVBfMzBfRU5BQkxFRD0xLCBPTVBfNDBfRU5BQkxFRD0xLCBLTVBfU1RBVFNfRU5BQkxFRD0xDQorDQorIyBJZiB0aGUgTUFDUk9fRVhQQU5TSU9OIGFuZCBFWFBBTkRfT05MWV9QUkVERUYgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuDQorIyB0aGlzIHRhZyBjYW4gYmUgdXNlZCB0byBzcGVjaWZ5IGEgbGlzdCBvZiBtYWNybyBuYW1lcyB0aGF0IHNob3VsZCBiZSBleHBhbmRlZC4NCisjIFRoZSBtYWNybyBkZWZpbml0aW9uIHRoYXQgaXMgZm91bmQgaW4gdGhlIHNvdXJjZXMgd2lsbCBiZSB1c2VkLg0KKyMgVXNlIHRoZSBQUkVERUZJTkVEIHRhZyBpZiB5b3Ugd2FudCB0byB1c2UgYSBkaWZmZXJlbnQgbWFjcm8gZGVmaW5pdGlvbiB0aGF0DQorIyBvdmVycnVsZXMgdGhlIGRlZmluaXRpb24gZm91bmQgaW4gdGhlIHNvdXJjZSBjb2RlLg0KKw0KK0VYUEFORF9BU19ERUZJTkVEICAgICAgPQ0KKw0KKyMgSWYgdGhlIFNLSVBfRlVOQ1RJT05fTUFDUk9TIHRhZyBpcyBzZXQgdG8gWUVTICh0aGUgZGVmYXVsdCkgdGhlbg0KKyMgZG94eWdlbidzIHByZXByb2Nlc3NvciB3aWxsIHJlbW92ZSBhbGwgcmVmZXJlbmNlcyB0byBmdW5jdGlvbi1saWtlIG1hY3Jvcw0KKyMgdGhhdCBhcmUgYWxvbmUgb24gYSBsaW5lLCBoYXZlIGFuIGFsbCB1cHBlcmNhc2UgbmFtZSwgYW5kIGRvIG5vdCBlbmQgd2l0aCBhDQorIyBzZW1pY29sb24sIGJlY2F1c2UgdGhlc2Ugd2lsbCBjb25mdXNlIHRoZSBwYXJzZXIgaWYgbm90IHJlbW92ZWQuDQorDQorU0tJUF9GVU5DVElPTl9NQUNST1MgICA9IFlFUw0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb246OmFkZGl0aW9ucyByZWxhdGVkIHRvIGV4dGVybmFsIHJlZmVyZW5jZXMNCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tDQorDQorIyBUaGUgVEFHRklMRVMgb3B0aW9uIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgdGFnZmlsZXMuIEZvciBlYWNoDQorIyB0YWcgZmlsZSB0aGUgbG9jYXRpb24gb2YgdGhlIGV4dGVybmFsIGRvY3VtZW50YXRpb24gc2hvdWxkIGJlIGFkZGVkLiBUaGUNCisjIGZvcm1hdCBvZiBhIHRhZyBmaWxlIHdpdGhvdXQgdGhpcyBsb2NhdGlvbiBpcyBhcyBmb2xsb3dzOg0KKyMNCisjIFRBR0ZJTEVTID0gZmlsZTEgZmlsZTIgLi4uDQorIyBBZGRpbmcgbG9jYXRpb24gZm9yIHRoZSB0YWcgZmlsZXMgaXMgZG9uZSBhcyBmb2xsb3dzOg0KKyMNCisjIFRBR0ZJTEVTID0gZmlsZTE9bG9jMSAiZmlsZTIgPSBsb2MyIiAuLi4NCisjIHdoZXJlICJsb2MxIiBhbmQgImxvYzIiIGNhbiBiZSByZWxhdGl2ZSBvciBhYnNvbHV0ZSBwYXRocw0KKyMgb3IgVVJMcy4gTm90ZSB0aGF0IGVhY2ggdGFnIGZpbGUgbXVzdCBoYXZlIGEgdW5pcXVlIG5hbWUgKHdoZXJlIHRoZSBuYW1lIGRvZXMNCisjIE5PVCBpbmNsdWRlIHRoZSBwYXRoKS4gSWYgYSB0YWcgZmlsZSBpcyBub3QgbG9jYXRlZCBpbiB0aGUgZGlyZWN0b3J5IGluIHdoaWNoDQorIyBkb3h5Z2VuIGlzIHJ1biwgeW91IG11c3QgYWxzbyBzcGVjaWZ5IHRoZSBwYXRoIHRvIHRoZSB0YWdmaWxlIGhlcmUuDQorDQorVEFHRklMRVMgICAgICAgICAgICAgICA9DQorDQorIyBXaGVuIGEgZmlsZSBuYW1lIGlzIHNwZWNpZmllZCBhZnRlciBHRU5FUkFURV9UQUdGSUxFLCBkb3h5Z2VuIHdpbGwgY3JlYXRlDQorIyBhIHRhZyBmaWxlIHRoYXQgaXMgYmFzZWQgb24gdGhlIGlucHV0IGZpbGVzIGl0IHJlYWRzLg0KKw0KK0dFTkVSQVRFX1RBR0ZJTEUgICAgICAgPQ0KKw0KKyMgSWYgdGhlIEFMTEVYVEVSTkFMUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgY2xhc3NlcyB3aWxsIGJlIGxpc3RlZA0KKyMgaW4gdGhlIGNsYXNzIGluZGV4LiBJZiBzZXQgdG8gTk8gb25seSB0aGUgaW5oZXJpdGVkIGV4dGVybmFsIGNsYXNzZXMNCisjIHdpbGwgYmUgbGlzdGVkLg0KKw0KK0FMTEVYVEVSTkFMUyAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEVYVEVSTkFMX0dST1VQUyB0YWcgaXMgc2V0IHRvIFlFUyBhbGwgZXh0ZXJuYWwgZ3JvdXBzIHdpbGwgYmUgbGlzdGVkDQorIyBpbiB0aGUgbW9kdWxlcyBpbmRleC4gSWYgc2V0IHRvIE5PLCBvbmx5IHRoZSBjdXJyZW50IHByb2plY3QncyBncm91cHMgd2lsbA0KKyMgYmUgbGlzdGVkLg0KKw0KK0VYVEVSTkFMX0dST1VQUyAgICAgICAgPSBZRVMNCisNCisjIFRoZSBQRVJMX1BBVEggc2hvdWxkIGJlIHRoZSBhYnNvbHV0ZSBwYXRoIGFuZCBuYW1lIG9mIHRoZSBwZXJsIHNjcmlwdA0KKyMgaW50ZXJwcmV0ZXIgKGkuZS4gdGhlIHJlc3VsdCBvZiBgd2hpY2ggcGVybCcpLg0KKw0KK1BFUkxfUEFUSCAgICAgICAgICAgICAgPQ0KKw0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisjIENvbmZpZ3VyYXRpb24gb3B0aW9ucyByZWxhdGVkIHRvIHRoZSBkb3QgdG9vbA0KKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0NCisNCisjIElmIHRoZSBDTEFTU19ESUFHUkFNUyB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBpbmhlcml0YW5jZSBkaWFncmFtIChpbiBIVE1MLCBSVEYgYW5kIExhVGVYKSBmb3IgY2xhc3NlcyB3aXRoIGJhc2UNCisjIG9yIHN1cGVyIGNsYXNzZXMuIFNldHRpbmcgdGhlIHRhZyB0byBOTyB0dXJucyB0aGUgZGlhZ3JhbXMgb2ZmLiBOb3RlIHRoYXQNCisjIHRoaXMgb3B0aW9uIGFsc28gd29ya3Mgd2l0aCBIQVZFX0RPVCBkaXNhYmxlZCwgYnV0IGl0IGlzIHJlY29tbWVuZGVkIHRvDQorIyBpbnN0YWxsIGFuZCB1c2UgZG90LCBzaW5jZSBpdCB5aWVsZHMgbW9yZSBwb3dlcmZ1bCBncmFwaHMuDQorDQorQ0xBU1NfRElBR1JBTVMgICAgICAgICA9IFlFUw0KKw0KKyMgWW91IGNhbiBkZWZpbmUgbWVzc2FnZSBzZXF1ZW5jZSBjaGFydHMgd2l0aGluIGRveHlnZW4gY29tbWVudHMgdXNpbmcgdGhlIFxtc2MNCisjIGNvbW1hbmQuIERveHlnZW4gd2lsbCB0aGVuIHJ1biB0aGUgbXNjZ2VuIHRvb2wgKHNlZQ0KKyMgaHR0cDovL3d3dy5tY3Rlcm5hbi5tZS51ay9tc2NnZW4vKSB0byBwcm9kdWNlIHRoZSBjaGFydCBhbmQgaW5zZXJ0IGl0IGluIHRoZQ0KKyMgZG9jdW1lbnRhdGlvbi4gVGhlIE1TQ0dFTl9QQVRIIHRhZyBhbGxvd3MgeW91IHRvIHNwZWNpZnkgdGhlIGRpcmVjdG9yeSB3aGVyZQ0KKyMgdGhlIG1zY2dlbiB0b29sIHJlc2lkZXMuIElmIGxlZnQgZW1wdHkgdGhlIHRvb2wgaXMgYXNzdW1lZCB0byBiZSBmb3VuZCBpbiB0aGUNCisjIGRlZmF1bHQgc2VhcmNoIHBhdGguDQorDQorTVNDR0VOX1BBVEggICAgICAgICAgICA9DQorDQorIyBJZiBzZXQgdG8gWUVTLCB0aGUgaW5oZXJpdGFuY2UgYW5kIGNvbGxhYm9yYXRpb24gZ3JhcGhzIHdpbGwgaGlkZQ0KKyMgaW5oZXJpdGFuY2UgYW5kIHVzYWdlIHJlbGF0aW9ucyBpZiB0aGUgdGFyZ2V0IGlzIHVuZG9jdW1lbnRlZA0KKyMgb3IgaXMgbm90IGEgY2xhc3MuDQorDQorSElERV9VTkRPQ19SRUxBVElPTlMgICA9IFlFUw0KKw0KKyMgSWYgeW91IHNldCB0aGUgSEFWRV9ET1QgdGFnIHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBhc3N1bWUgdGhlIGRvdCB0b29sIGlzDQorIyBhdmFpbGFibGUgZnJvbSB0aGUgcGF0aC4gVGhpcyB0b29sIGlzIHBhcnQgb2YgR3JhcGh2aXosIGEgZ3JhcGggdmlzdWFsaXphdGlvbg0KKyMgdG9vbGtpdCBmcm9tIEFUJlQgYW5kIEx1Y2VudCBCZWxsIExhYnMuIFRoZSBvdGhlciBvcHRpb25zIGluIHRoaXMgc2VjdGlvbg0KKyMgaGF2ZSBubyBlZmZlY3QgaWYgdGhpcyBvcHRpb24gaXMgc2V0IHRvIE5PICh0aGUgZGVmYXVsdCkNCisNCitIQVZFX0RPVCAgICAgICAgICAgICAgID0gTk8NCisNCisjIFRoZSBET1RfTlVNX1RIUkVBRFMgc3BlY2lmaWVzIHRoZSBudW1iZXIgb2YgZG90IGludm9jYXRpb25zIGRveHlnZW4gaXMNCisjIGFsbG93ZWQgdG8gcnVuIGluIHBhcmFsbGVsLiBXaGVuIHNldCB0byAwICh0aGUgZGVmYXVsdCkgZG94eWdlbiB3aWxsDQorIyBiYXNlIHRoaXMgb24gdGhlIG51bWJlciBvZiBwcm9jZXNzb3JzIGF2YWlsYWJsZSBpbiB0aGUgc3lzdGVtLiBZb3UgY2FuIHNldCBpdA0KKyMgZXhwbGljaXRseSB0byBhIHZhbHVlIGxhcmdlciB0aGFuIDAgdG8gZ2V0IGNvbnRyb2wgb3ZlciB0aGUgYmFsYW5jZQ0KKyMgYmV0d2VlbiBDUFUgbG9hZCBhbmQgcHJvY2Vzc2luZyBzcGVlZC4NCisNCitET1RfTlVNX1RIUkVBRFMgICAgICAgID0gMA0KKw0KKyMgQnkgZGVmYXVsdCBkb3h5Z2VuIHdpbGwgdXNlIHRoZSBIZWx2ZXRpY2EgZm9udCBmb3IgYWxsIGRvdCBmaWxlcyB0aGF0DQorIyBkb3h5Z2VuIGdlbmVyYXRlcy4gV2hlbiB5b3Ugd2FudCBhIGRpZmZlcmVudGx5IGxvb2tpbmcgZm9udCB5b3UgY2FuIHNwZWNpZnkNCisjIHRoZSBmb250IG5hbWUgdXNpbmcgRE9UX0ZPTlROQU1FLiBZb3UgbmVlZCB0byBtYWtlIHN1cmUgZG90IGlzIGFibGUgdG8gZmluZA0KKyMgdGhlIGZvbnQsIHdoaWNoIGNhbiBiZSBkb25lIGJ5IHB1dHRpbmcgaXQgaW4gYSBzdGFuZGFyZCBsb2NhdGlvbiBvciBieSBzZXR0aW5nDQorIyB0aGUgRE9URk9OVFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUgb3IgYnkgc2V0dGluZyBET1RfRk9OVFBBVEggdG8gdGhlDQorIyBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgZm9udC4NCisNCitET1RfRk9OVE5BTUUgICAgICAgICAgID0gSGVsdmV0aWNhDQorDQorIyBUaGUgRE9UX0ZPTlRTSVpFIHRhZyBjYW4gYmUgdXNlZCB0byBzZXQgdGhlIHNpemUgb2YgdGhlIGZvbnQgb2YgZG90IGdyYXBocy4NCisjIFRoZSBkZWZhdWx0IHNpemUgaXMgMTBwdC4NCisNCitET1RfRk9OVFNJWkUgICAgICAgICAgID0gMTANCisNCisjIEJ5IGRlZmF1bHQgZG94eWdlbiB3aWxsIHRlbGwgZG90IHRvIHVzZSB0aGUgSGVsdmV0aWNhIGZvbnQuDQorIyBJZiB5b3Ugc3BlY2lmeSBhIGRpZmZlcmVudCBmb250IHVzaW5nIERPVF9GT05UTkFNRSB5b3UgY2FuIHVzZSBET1RfRk9OVFBBVEggdG8NCisjIHNldCB0aGUgcGF0aCB3aGVyZSBkb3QgY2FuIGZpbmQgaXQuDQorDQorRE9UX0ZPTlRQQVRIICAgICAgICAgICA9DQorDQorIyBJZiB0aGUgQ0xBU1NfR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kDQorIyBpbmRpcmVjdCBpbmhlcml0YW5jZSByZWxhdGlvbnMuIFNldHRpbmcgdGhpcyB0YWcgdG8gWUVTIHdpbGwgZm9yY2UgdGhlDQorIyBDTEFTU19ESUFHUkFNUyB0YWcgdG8gTk8uDQorDQorQ0xBU1NfR1JBUEggICAgICAgICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIENPTExBQk9SQVRJT05fR1JBUEggYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2ggZG9jdW1lbnRlZCBjbGFzcyBzaG93aW5nIHRoZSBkaXJlY3QgYW5kDQorIyBpbmRpcmVjdCBpbXBsZW1lbnRhdGlvbiBkZXBlbmRlbmNpZXMgKGluaGVyaXRhbmNlLCBjb250YWlubWVudCwgYW5kDQorIyBjbGFzcyByZWZlcmVuY2VzIHZhcmlhYmxlcykgb2YgdGhlIGNsYXNzIHdpdGggb3RoZXIgZG9jdW1lbnRlZCBjbGFzc2VzLg0KKw0KK0NPTExBQk9SQVRJT05fR1JBUEggICAgPSBZRVMNCisNCisjIElmIHRoZSBHUk9VUF9HUkFQSFMgYW5kIEhBVkVfRE9UIHRhZ3MgYXJlIHNldCB0byBZRVMgdGhlbiBkb3h5Z2VuDQorIyB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGdyb3Vwcywgc2hvd2luZyB0aGUgZGlyZWN0IGdyb3VwcyBkZXBlbmRlbmNpZXMNCisNCitHUk9VUF9HUkFQSFMgICAgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgVU1MX0xPT0sgdGFnIGlzIHNldCB0byBZRVMgZG94eWdlbiB3aWxsIGdlbmVyYXRlIGluaGVyaXRhbmNlIGFuZA0KKyMgY29sbGFib3JhdGlvbiBkaWFncmFtcyBpbiBhIHN0eWxlIHNpbWlsYXIgdG8gdGhlIE9NRydzIFVuaWZpZWQgTW9kZWxpbmcNCisjIExhbmd1YWdlLg0KKw0KK1VNTF9MT09LICAgICAgICAgICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIFVNTF9MT09LIHRhZyBpcyBlbmFibGVkLCB0aGUgZmllbGRzIGFuZCBtZXRob2RzIGFyZSBzaG93biBpbnNpZGUNCisjIHRoZSBjbGFzcyBub2RlLiBJZiB0aGVyZSBhcmUgbWFueSBmaWVsZHMgb3IgbWV0aG9kcyBhbmQgbWFueSBub2RlcyB0aGUNCisjIGdyYXBoIG1heSBiZWNvbWUgdG9vIGJpZyB0byBiZSB1c2VmdWwuIFRoZSBVTUxfTElNSVRfTlVNX0ZJRUxEUw0KKyMgdGhyZXNob2xkIGxpbWl0cyB0aGUgbnVtYmVyIG9mIGl0ZW1zIGZvciBlYWNoIHR5cGUgdG8gbWFrZSB0aGUgc2l6ZSBtb3JlDQorIyBtYW5hZ2VhYmxlLiBTZXQgdGhpcyB0byAwIGZvciBubyBsaW1pdC4gTm90ZSB0aGF0IHRoZSB0aHJlc2hvbGQgbWF5IGJlDQorIyBleGNlZWRlZCBieSA1MCUgYmVmb3JlIHRoZSBsaW1pdCBpcyBlbmZvcmNlZC4NCisNCitVTUxfTElNSVRfTlVNX0ZJRUxEUyAgID0gMTANCisNCisjIElmIHNldCB0byBZRVMsIHRoZSBpbmhlcml0YW5jZSBhbmQgY29sbGFib3JhdGlvbiBncmFwaHMgd2lsbCBzaG93IHRoZQ0KKyMgcmVsYXRpb25zIGJldHdlZW4gdGVtcGxhdGVzIGFuZCB0aGVpciBpbnN0YW5jZXMuDQorDQorVEVNUExBVEVfUkVMQVRJT05TICAgICA9IFlFUw0KKw0KKyMgSWYgdGhlIEVOQUJMRV9QUkVQUk9DRVNTSU5HLCBTRUFSQ0hfSU5DTFVERVMsIElOQ0xVREVfR1JBUEgsIGFuZCBIQVZFX0RPVA0KKyMgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGdyYXBoIGZvciBlYWNoIGRvY3VtZW50ZWQNCisjIGZpbGUgc2hvd2luZyB0aGUgZGlyZWN0IGFuZCBpbmRpcmVjdCBpbmNsdWRlIGRlcGVuZGVuY2llcyBvZiB0aGUgZmlsZSB3aXRoDQorIyBvdGhlciBkb2N1bWVudGVkIGZpbGVzLg0KKw0KK0lOQ0xVREVfR1JBUEggICAgICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBFTkFCTEVfUFJFUFJPQ0VTU0lORywgU0VBUkNIX0lOQ0xVREVTLCBJTkNMVURFRF9CWV9HUkFQSCwgYW5kDQorIyBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4gZG94eWdlbiB3aWxsIGdlbmVyYXRlIGEgZ3JhcGggZm9yIGVhY2gNCisjIGRvY3VtZW50ZWQgaGVhZGVyIGZpbGUgc2hvd2luZyB0aGUgZG9jdW1lbnRlZCBmaWxlcyB0aGF0IGRpcmVjdGx5IG9yDQorIyBpbmRpcmVjdGx5IGluY2x1ZGUgdGhpcyBmaWxlLg0KKw0KK0lOQ0xVREVEX0JZX0dSQVBIICAgICAgPSBZRVMNCisNCisjIElmIHRoZSBDQUxMX0dSQVBIIGFuZCBIQVZFX0RPVCBvcHRpb25zIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGwgZGVwZW5kZW5jeSBncmFwaCBmb3IgZXZlcnkgZ2xvYmFsIGZ1bmN0aW9uDQorIyBvciBjbGFzcyBtZXRob2QuIE5vdGUgdGhhdCBlbmFibGluZyB0aGlzIG9wdGlvbiB3aWxsIHNpZ25pZmljYW50bHkgaW5jcmVhc2UNCisjIHRoZSB0aW1lIG9mIGEgcnVuLiBTbyBpbiBtb3N0IGNhc2VzIGl0IHdpbGwgYmUgYmV0dGVyIHRvIGVuYWJsZSBjYWxsIGdyYXBocw0KKyMgZm9yIHNlbGVjdGVkIGZ1bmN0aW9ucyBvbmx5IHVzaW5nIHRoZSBcY2FsbGdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTF9HUkFQSCAgICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgQ0FMTEVSX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTIHRoZW4NCisjIGRveHlnZW4gd2lsbCBnZW5lcmF0ZSBhIGNhbGxlciBkZXBlbmRlbmN5IGdyYXBoIGZvciBldmVyeSBnbG9iYWwgZnVuY3Rpb24NCisjIG9yIGNsYXNzIG1ldGhvZC4gTm90ZSB0aGF0IGVuYWJsaW5nIHRoaXMgb3B0aW9uIHdpbGwgc2lnbmlmaWNhbnRseSBpbmNyZWFzZQ0KKyMgdGhlIHRpbWUgb2YgYSBydW4uIFNvIGluIG1vc3QgY2FzZXMgaXQgd2lsbCBiZSBiZXR0ZXIgdG8gZW5hYmxlIGNhbGxlcg0KKyMgZ3JhcGhzIGZvciBzZWxlY3RlZCBmdW5jdGlvbnMgb25seSB1c2luZyB0aGUgXGNhbGxlcmdyYXBoIGNvbW1hbmQuDQorDQorQ0FMTEVSX0dSQVBIICAgICAgICAgICA9IE5PDQorDQorIyBJZiB0aGUgR1JBUEhJQ0FMX0hJRVJBUkNIWSBhbmQgSEFWRV9ET1QgdGFncyBhcmUgc2V0IHRvIFlFUyB0aGVuIGRveHlnZW4NCisjIHdpbGwgZ2VuZXJhdGUgYSBncmFwaGljYWwgaGllcmFyY2h5IG9mIGFsbCBjbGFzc2VzIGluc3RlYWQgb2YgYSB0ZXh0dWFsIG9uZS4NCisNCitHUkFQSElDQUxfSElFUkFSQ0hZICAgID0gWUVTDQorDQorIyBJZiB0aGUgRElSRUNUT1JZX0dSQVBIIGFuZCBIQVZFX0RPVCB0YWdzIGFyZSBzZXQgdG8gWUVTDQorIyB0aGVuIGRveHlnZW4gd2lsbCBzaG93IHRoZSBkZXBlbmRlbmNpZXMgYSBkaXJlY3RvcnkgaGFzIG9uIG90aGVyIGRpcmVjdG9yaWVzDQorIyBpbiBhIGdyYXBoaWNhbCB3YXkuIFRoZSBkZXBlbmRlbmN5IHJlbGF0aW9ucyBhcmUgZGV0ZXJtaW5lZCBieSB0aGUgI2luY2x1ZGUNCisjIHJlbGF0aW9ucyBiZXR3ZWVuIHRoZSBmaWxlcyBpbiB0aGUgZGlyZWN0b3JpZXMuDQorDQorRElSRUNUT1JZX0dSQVBIICAgICAgICA9IFlFUw0KKw0KKyMgVGhlIERPVF9JTUFHRV9GT1JNQVQgdGFnIGNhbiBiZSB1c2VkIHRvIHNldCB0aGUgaW1hZ2UgZm9ybWF0IG9mIHRoZSBpbWFnZXMNCisjIGdlbmVyYXRlZCBieSBkb3QuIFBvc3NpYmxlIHZhbHVlcyBhcmUgc3ZnLCBwbmcsIGpwZywgb3IgZ2lmLg0KKyMgSWYgbGVmdCBibGFuayBwbmcgd2lsbCBiZSB1c2VkLiBJZiB5b3UgY2hvb3NlIHN2ZyB5b3UgbmVlZCB0byBzZXQNCisjIEhUTUxfRklMRV9FWFRFTlNJT04gdG8geGh0bWwgaW4gb3JkZXIgdG8gbWFrZSB0aGUgU1ZHIGZpbGVzDQorIyB2aXNpYmxlIGluIElFIDkrIChvdGhlciBicm93c2VycyBkbyBub3QgaGF2ZSB0aGlzIHJlcXVpcmVtZW50KS4NCisNCitET1RfSU1BR0VfRk9STUFUICAgICAgID0gcG5nDQorDQorIyBJZiBET1RfSU1BR0VfRk9STUFUIGlzIHNldCB0byBzdmcsIHRoZW4gdGhpcyBvcHRpb24gY2FuIGJlIHNldCB0byBZRVMgdG8NCisjIGVuYWJsZSBnZW5lcmF0aW9uIG9mIGludGVyYWN0aXZlIFNWRyBpbWFnZXMgdGhhdCBhbGxvdyB6b29taW5nIGFuZCBwYW5uaW5nLg0KKyMgTm90ZSB0aGF0IHRoaXMgcmVxdWlyZXMgYSBtb2Rlcm4gYnJvd3NlciBvdGhlciB0aGFuIEludGVybmV0IEV4cGxvcmVyLg0KKyMgVGVzdGVkIGFuZCB3b3JraW5nIGFyZSBGaXJlZm94LCBDaHJvbWUsIFNhZmFyaSwgYW5kIE9wZXJhLiBGb3IgSUUgOSsgeW91DQorIyBuZWVkIHRvIHNldCBIVE1MX0ZJTEVfRVhURU5TSU9OIHRvIHhodG1sIGluIG9yZGVyIHRvIG1ha2UgdGhlIFNWRyBmaWxlcw0KKyMgdmlzaWJsZS4gT2xkZXIgdmVyc2lvbnMgb2YgSUUgZG8gbm90IGhhdmUgU1ZHIHN1cHBvcnQuDQorDQorSU5URVJBQ1RJVkVfU1ZHICAgICAgICA9IE5PDQorDQorIyBUaGUgdGFnIERPVF9QQVRIIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgdGhlIHBhdGggd2hlcmUgdGhlIGRvdCB0b29sIGNhbiBiZQ0KKyMgZm91bmQuIElmIGxlZnQgYmxhbmssIGl0IGlzIGFzc3VtZWQgdGhlIGRvdCB0b29sIGNhbiBiZSBmb3VuZCBpbiB0aGUgcGF0aC4NCisNCitET1RfUEFUSCAgICAgICAgICAgICAgID0NCisNCisjIFRoZSBET1RGSUxFX0RJUlMgdGFnIGNhbiBiZSB1c2VkIHRvIHNwZWNpZnkgb25lIG9yIG1vcmUgZGlyZWN0b3JpZXMgdGhhdA0KKyMgY29udGFpbiBkb3QgZmlsZXMgdGhhdCBhcmUgaW5jbHVkZWQgaW4gdGhlIGRvY3VtZW50YXRpb24gKHNlZSB0aGUNCisjIFxkb3RmaWxlIGNvbW1hbmQpLg0KKw0KK0RPVEZJTEVfRElSUyAgICAgICAgICAgPQ0KKw0KKyMgVGhlIE1TQ0ZJTEVfRElSUyB0YWcgY2FuIGJlIHVzZWQgdG8gc3BlY2lmeSBvbmUgb3IgbW9yZSBkaXJlY3RvcmllcyB0aGF0DQorIyBjb250YWluIG1zYyBmaWxlcyB0aGF0IGFyZSBpbmNsdWRlZCBpbiB0aGUgZG9jdW1lbnRhdGlvbiAoc2VlIHRoZQ0KKyMgXG1zY2ZpbGUgY29tbWFuZCkuDQorDQorTVNDRklMRV9ESVJTICAgICAgICAgICA9DQorDQorIyBUaGUgRE9UX0dSQVBIX01BWF9OT0RFUyB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIG51bWJlciBvZg0KKyMgbm9kZXMgdGhhdCB3aWxsIGJlIHNob3duIGluIHRoZSBncmFwaC4gSWYgdGhlIG51bWJlciBvZiBub2RlcyBpbiBhIGdyYXBoDQorIyBiZWNvbWVzIGxhcmdlciB0aGFuIHRoaXMgdmFsdWUsIGRveHlnZW4gd2lsbCB0cnVuY2F0ZSB0aGUgZ3JhcGgsIHdoaWNoIGlzDQorIyB2aXN1YWxpemVkIGJ5IHJlcHJlc2VudGluZyBhIG5vZGUgYXMgYSByZWQgYm94LiBOb3RlIHRoYXQgZG94eWdlbiBpZiB0aGUNCisjIG51bWJlciBvZiBkaXJlY3QgY2hpbGRyZW4gb2YgdGhlIHJvb3Qgbm9kZSBpbiBhIGdyYXBoIGlzIGFscmVhZHkgbGFyZ2VyIHRoYW4NCisjIERPVF9HUkFQSF9NQVhfTk9ERVMgdGhlbiB0aGUgZ3JhcGggd2lsbCBub3QgYmUgc2hvd24gYXQgYWxsLiBBbHNvIG5vdGUNCisjIHRoYXQgdGhlIHNpemUgb2YgYSBncmFwaCBjYW4gYmUgZnVydGhlciByZXN0cmljdGVkIGJ5IE1BWF9ET1RfR1JBUEhfREVQVEguDQorDQorRE9UX0dSQVBIX01BWF9OT0RFUyAgICA9IDUwDQorDQorIyBUaGUgTUFYX0RPVF9HUkFQSF9ERVBUSCB0YWcgY2FuIGJlIHVzZWQgdG8gc2V0IHRoZSBtYXhpbXVtIGRlcHRoIG9mIHRoZQ0KKyMgZ3JhcGhzIGdlbmVyYXRlZCBieSBkb3QuIEEgZGVwdGggdmFsdWUgb2YgMyBtZWFucyB0aGF0IG9ubHkgbm9kZXMgcmVhY2hhYmxlDQorIyBmcm9tIHRoZSByb290IGJ5IGZvbGxvd2luZyBhIHBhdGggdmlhIGF0IG1vc3QgMyBlZGdlcyB3aWxsIGJlIHNob3duLiBOb2Rlcw0KKyMgdGhhdCBsYXkgZnVydGhlciBmcm9tIHRoZSByb290IG5vZGUgd2lsbCBiZSBvbWl0dGVkLiBOb3RlIHRoYXQgc2V0dGluZyB0aGlzDQorIyBvcHRpb24gdG8gMSBvciAyIG1heSBncmVhdGx5IHJlZHVjZSB0aGUgY29tcHV0YXRpb24gdGltZSBuZWVkZWQgZm9yIGxhcmdlDQorIyBjb2RlIGJhc2VzLiBBbHNvIG5vdGUgdGhhdCB0aGUgc2l6ZSBvZiBhIGdyYXBoIGNhbiBiZSBmdXJ0aGVyIHJlc3RyaWN0ZWQgYnkNCisjIERPVF9HUkFQSF9NQVhfTk9ERVMuIFVzaW5nIGEgZGVwdGggb2YgMCBtZWFucyBubyBkZXB0aCByZXN0cmljdGlvbi4NCisNCitNQVhfRE9UX0dSQVBIX0RFUFRIICAgID0gMA0KKw0KKyMgU2V0IHRoZSBET1RfVFJBTlNQQVJFTlQgdGFnIHRvIFlFUyB0byBnZW5lcmF0ZSBpbWFnZXMgd2l0aCBhIHRyYW5zcGFyZW50DQorIyBiYWNrZ3JvdW5kLiBUaGlzIGlzIGRpc2FibGVkIGJ5IGRlZmF1bHQsIGJlY2F1c2UgZG90IG9uIFdpbmRvd3MgZG9lcyBub3QNCisjIHNlZW0gdG8gc3VwcG9ydCB0aGlzIG91dCBvZiB0aGUgYm94LiBXYXJuaW5nOiBEZXBlbmRpbmcgb24gdGhlIHBsYXRmb3JtIHVzZWQsDQorIyBlbmFibGluZyB0aGlzIG9wdGlvbiBtYXkgbGVhZCB0byBiYWRseSBhbnRpLWFsaWFzZWQgbGFiZWxzIG9uIHRoZSBlZGdlcyBvZg0KKyMgYSBncmFwaCAoaS5lLiB0aGV5IGJlY29tZSBoYXJkIHRvIHJlYWQpLg0KKw0KK0RPVF9UUkFOU1BBUkVOVCAgICAgICAgPSBOTw0KKw0KKyMgU2V0IHRoZSBET1RfTVVMVElfVEFSR0VUUyB0YWcgdG8gWUVTIGFsbG93IGRvdCB0byBnZW5lcmF0ZSBtdWx0aXBsZSBvdXRwdXQNCisjIGZpbGVzIGluIG9uZSBydW4gKGkuZS4gbXVsdGlwbGUgLW8gYW5kIC1UIG9wdGlvbnMgb24gdGhlIGNvbW1hbmQgbGluZSkuIFRoaXMNCisjIG1ha2VzIGRvdCBydW4gZmFzdGVyLCBidXQgc2luY2Ugb25seSBuZXdlciB2ZXJzaW9ucyBvZiBkb3QgKD4xLjguMTApDQorIyBzdXBwb3J0IHRoaXMsIHRoaXMgZmVhdHVyZSBpcyBkaXNhYmxlZCBieSBkZWZhdWx0Lg0KKw0KK0RPVF9NVUxUSV9UQVJHRVRTICAgICAgPSBOTw0KKw0KKyMgSWYgdGhlIEdFTkVSQVRFX0xFR0VORCB0YWcgaXMgc2V0IHRvIFlFUyAodGhlIGRlZmF1bHQpIERveHlnZW4gd2lsbA0KKyMgZ2VuZXJhdGUgYSBsZWdlbmQgcGFnZSBleHBsYWluaW5nIHRoZSBtZWFuaW5nIG9mIHRoZSB2YXJpb3VzIGJveGVzIGFuZA0KKyMgYXJyb3dzIGluIHRoZSBkb3QgZ2VuZXJhdGVkIGdyYXBocy4NCisNCitHRU5FUkFURV9MRUdFTkQgICAgICAgID0gWUVTDQorDQorIyBJZiB0aGUgRE9UX0NMRUFOVVAgdGFnIGlzIHNldCB0byBZRVMgKHRoZSBkZWZhdWx0KSBEb3h5Z2VuIHdpbGwNCisjIHJlbW92ZSB0aGUgaW50ZXJtZWRpYXRlIGRvdCBmaWxlcyB0aGF0IGFyZSB1c2VkIHRvIGdlbmVyYXRlDQorIyB0aGUgdmFyaW91cyBncmFwaHMuDQorDQorRE9UX0NMRUFOVVAgICAgICAgICAgICA9IFlFUw0KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2hlYWRlci50ZXggYi9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZlOWVhNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9oZWFkZXIudGV4CkBAIC0wLDAgKzEsNzcgQEAKKyUgTGF0ZXggaGVhZGVyIGZvciBkb3h5Z2VuIDEuOC4zLjEKK1xkb2N1bWVudGNsYXNze2Jvb2t9CitcdXNlcGFja2FnZVthNHBhcGVyLHRvcD0yLjVjbSxib3R0b209Mi41Y20sbGVmdD0yLjVjbSxyaWdodD0yLjVjbV17Z2VvbWV0cnl9CitcdXNlcGFja2FnZXttYWtlaWR4fQorXHVzZXBhY2thZ2V7bmF0YmlifQorXHVzZXBhY2thZ2V7Z3JhcGhpY3h9CitcdXNlcGFja2FnZXttdWx0aWNvbH0KK1x1c2VwYWNrYWdle2Zsb2F0fQorXHVzZXBhY2thZ2V7bGlzdGluZ3N9CitcdXNlcGFja2FnZXtjb2xvcn0KK1x1c2VwYWNrYWdle2lmdGhlbn0KK1x1c2VwYWNrYWdlW3RhYmxlXXt4Y29sb3J9CitcdXNlcGFja2FnZXt0ZXh0Y29tcH0KK1x1c2VwYWNrYWdle2FsbHR0fQorXHVzZXBhY2thZ2V7aWZwZGZ9CitcaWZwZGYKK1x1c2VwYWNrYWdlW3BkZnRleCwKKyAgICAgICAgICAgIHBhZ2ViYWNrcmVmPXRydWUsCisgICAgICAgICAgICBjb2xvcmxpbmtzPXRydWUsCisgICAgICAgICAgICBsaW5rY29sb3I9Ymx1ZSwKKyAgICAgICAgICAgIHVuaWNvZGUKKyAgICAgICAgICAgXXtoeXBlcnJlZn0KK1xlbHNlCitcdXNlcGFja2FnZVtwczJwZGYsCisgICAgICAgICAgICBwYWdlYmFja3JlZj10cnVlLAorICAgICAgICAgICAgY29sb3JsaW5rcz10cnVlLAorICAgICAgICAgICAgbGlua2NvbG9yPWJsdWUsCisgICAgICAgICAgICB1bmljb2RlCisgICAgICAgICAgIF17aHlwZXJyZWZ9CitcdXNlcGFja2FnZXtwc3BpY3R1cmV9CitcZmkKK1x1c2VwYWNrYWdlW3V0Zjhde2lucHV0ZW5jfQorXHVzZXBhY2thZ2V7bWF0aHB0bXh9CitcdXNlcGFja2FnZVtzY2FsZWQ9LjkwXXtoZWx2ZXR9CitcdXNlcGFja2FnZXtjb3VyaWVyfQorXHVzZXBhY2thZ2V7c2VjdHN0eX0KK1x1c2VwYWNrYWdle2Ftc3N5bWJ9CitcdXNlcGFja2FnZVt0aXRsZXNde3RvY2xvZnR9CitcdXNlcGFja2FnZXtkb3h5Z2VufQorXGxzdHNldHtsYW5ndWFnZT1DKyssaW5wdXRlbmNvZGluZz11dGY4LGJhc2ljc3R5bGU9XGZvb3Rub3Rlc2l6ZSxicmVha2xpbmVzPXRydWUsYnJlYWthdHdoaXRlc3BhY2U9dHJ1ZSx0YWJzaXplPTQsbnVtYmVycz1sZWZ0IH0KK1xtYWtlaW5kZXgKK1xzZXRjb3VudGVye3RvY2RlcHRofXszfQorXHJlbmV3Y29tbWFuZHtcZm9vdHJ1bGV3aWR0aH17MC40cHR9CitccmVuZXdjb21tYW5ke1xmYW1pbHlkZWZhdWx0fXtcc2ZkZWZhdWx0fQorXGhmdXp6PTE1cHQKK1xzZXRsZW5ndGh7XGVtZXJnZW5jeXN0cmV0Y2h9ezE1cHR9CitcaGJhZG5lc3M9NzUwCitcdG9sZXJhbmNlPTc1MAorXGJlZ2lue2RvY3VtZW50fQorXGh5cGVyc2V0dXB7cGFnZWFuY2hvcj1mYWxzZSxjaXRlY29sb3I9Ymx1ZX0KK1xiZWdpbnt0aXRsZXBhZ2V9CitcdnNwYWNlKns3Y219CitcYmVnaW57Y2VudGVyfQore1xMYXJnZSBMTFZNIE9wZW5NUFx0ZXh0c3VwZXJzY3JpcHR7Kn0gUnVudGltZSBMaWJyYXJ5IH1cXAorXHZzcGFjZSp7MWNtfQore1xsYXJnZSBHZW5lcmF0ZWQgYnkgRG94eWdlbiAkZG94eWdlbnZlcnNpb24gfVxcCitcdnNwYWNlKnswLjVjbX0KK3tcc21hbGwgJGRhdGV0aW1lIH1cXAorXGVuZHtjZW50ZXJ9CitcZW5ke3RpdGxlcGFnZX0KKwore1xiZiBUcmFkZW1hcmtzfQorVGhlIE9wZW5NUCBuYW1lIGFuZCB0aGUgT3Blbk1QIGxvZ28gYXJlIHJlZ2lzdGVyZWQgdHJhZGVtYXJrcyBvZiB0aGUgT3Blbk1QIEFyY2hpdGVjdHVyZSBSZXZpZXcgQm9hcmQuCisKK0ludGVsLCBYZW9uLCBhbmQgSW50ZWwgWGVvbiBQaGkgYXJlIHRyYWRlbWFya3Mgb2YgSW50ZWwgQ29ycG9yYXRpb24gaW4gdGhlIFUuUy4gYW5kL29yIG90aGVyIGNvdW50cmllcy4KKworVGhpcyBkb2N1bWVudCBpcyBDb3B5cmlnaHQgXHRleHRjb3B5cmlnaHR+XHRoZVx5ZWFyIHRoZSBMTFZNIFByb2plY3QuIEl0IGlzCitzdWJqZWN0IHRvIHRoZSBzYW1lIGxpY2Vuc2UgdGVybXMgYXMgdGhlIExMVk0gT3Blbk1QIHJ1bnRpbWUuCisKK1x0ZXh0c3VwZXJzY3JpcHR7Kn0gT3RoZXIgbmFtZXMgYW5kIGJyYW5kcyBtYXkgYmUgY2xhaW1lZCBhcyB0aGUgcHJvcGVydHkgb2Ygb3RoZXJzLgorCitcY2xlYXJlbXB0eWRvdWJsZXBhZ2UKK1xwYWdlbnVtYmVyaW5ne3JvbWFufQorXHRhYmxlb2Zjb250ZW50cworXGNsZWFyZW1wdHlkb3VibGVwYWdlCitccGFnZW51bWJlcmluZ3thcmFiaWN9CitcaHlwZXJzZXR1cHtwYWdlYW5jaG9yPXRydWUsY2l0ZWNvbG9yPWJsdWV9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmggYi9yYzMvcnVudGltZS9kb2MvZG94eWdlbi9saWJvbXBfaW50ZXJmYWNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDUxYWU5NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL2RvYy9kb3h5Z2VuL2xpYm9tcF9pbnRlcmZhY2UuaApAQCAtMCwwICsxLDMzMyBAQAorLy8gVGhpcyBmaWxlIGRvZXMgbm90IGNvbnRhaW4gYW55IGNvZGU7IGl0IGp1c3QgY29udGFpbnMgYWRkaXRpb25hbCB0ZXh0IGFuZCBmb3JtYXR0aW5nDQorLy8gZm9yIGRveHlnZW4uDQorDQorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisNCisvKiEgQG1haW5wYWdlIExMVk0mbmJzcDsgT3Blbk1QKiBSdW50aW1lIExpYnJhcnkgSW50ZXJmYWNlDQorQHNlY3Rpb24gc2VjX2ludHJvIEludHJvZHVjdGlvbg0KKw0KK1RoaXMgZG9jdW1lbnQgZGVzY3JpYmVzIHRoZSBpbnRlcmZhY2UgcHJvdmlkZWQgYnkgdGhlDQorTExWTSAmbmJzcDtPcGVuTVBcb3RoZXIgcnVudGltZSBsaWJyYXJ5IHRvIHRoZSBjb21waWxlci4NCitSb3V0aW5lcyB0aGF0IGFyZSBkaXJlY3RseSBjYWxsZWQgYXMgc2ltcGxlIGZ1bmN0aW9ucyBieSB1c2VyIGNvZGUgYXJlDQorbm90IGN1cnJlbnRseSBkZXNjcmliZWQgaGVyZSwgc2luY2UgdGhlaXIgZGVmaW5pdGlvbiBpcyBpbiB0aGUgT3Blbk1QDQorc3BlY2lmaWNhdGlvbiBhdmFpbGFibGUgZnJvbSBodHRwOi8vb3Blbm1wLm9yZw0KKw0KK1RoZSBhaW0gaGVyZSBpcyB0byBleHBsYWluIHRoZSBpbnRlcmZhY2UgZnJvbSB0aGUgY29tcGlsZXIgdG8gdGhlIHJ1bnRpbWUuDQorDQorVGhlIG92ZXJhbGwgZGVzaWduIGlzIGRlc2NyaWJlZCwgYW5kIGVhY2ggZnVuY3Rpb24gaW4gdGhlIGludGVyZmFjZQ0KK2hhcyBpdHMgb3duIGRlc2NyaXB0aW9uLiAoQXQgbGVhc3QsIHRoYXQncyB0aGUgYW1iaXRpb24sIHdlIG1heSBub3QgYmUgdGhlcmUgeWV0KS4NCisNCitAc2VjdGlvbiBzZWNfYnVpbGRpbmcgUXVpY2tseSBCdWlsZGluZyB0aGUgUnVudGltZQ0KK0ZvciB0aGUgaW1wYXRpZW50LCB3ZSBjb3ZlciBidWlsZGluZyB0aGUgcnVudGltZSBhcyB0aGUgZmlyc3QgdG9waWMgaGVyZS4NCisNCitDTWFrZSBpcyB1c2VkIHRvIGJ1aWxkIHRoZSBPcGVuTVAgcnVudGltZS4gIEZvciBkZXRhaWxzIGFuZCBhIGZ1bGwgbGlzdCBvZiBvcHRpb25zIGZvciB0aGUgQ01ha2UgYnVpbGQgc3lzdGVtLA0KK3NlZSA8dHQ+QnVpbGRfV2l0aF9DTWFrZS50eHQ8L3R0PiBpbnNpZGUgdGhlIDx0dD5ydW50aW1lLzwvdHQ+IHN1YmRpcmVjdG9yeS4gIFRoZXNlDQoraW5zdHJ1Y3Rpb25zIHdpbGwgcHJvdmlkZSB0aGUgbW9zdCB0eXBpY2FsIGJ1aWxkLg0KKw0KK0luLUxMVk0tdHJlZSBidWlsZDouDQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wIGludG8gbGx2bS9wcm9qZWN0cw0KKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQNCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkDQorJCBjbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZSBvbXANCitAZW5kY29kZQ0KK091dC1vZi1MTFZNLXRyZWUgYnVpbGQ6DQorQGNvZGUNCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUNCitDaGVjayBvdXQgb3Blbm1wDQorJCBjZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lDQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZA0KKyQgY21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPTxDIGNvbXBpbGVyPiAtRENNQUtFX0NYWF9DT01QSUxFUj08QysrIGNvbXBpbGVyPg0KKyQgbWFrZQ0KK0BlbmRjb2RlDQorDQorQHNlY3Rpb24gc2VjX3N1cHBvcnRlZCBTdXBwb3J0ZWQgUlRMIEJ1aWxkIENvbmZpZ3VyYXRpb25zDQorDQorVGhlIGFyY2hpdGVjdHVyZXMgc3VwcG9ydGVkIGFyZSBJQS0zMiBhcmNoaXRlY3R1cmUsIEludGVsJnJlZzsmbmJzcDsgNjQsIGFuZA0KK0ludGVsJnJlZzsmbmJzcDsgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLiAgVGhlIGJ1aWxkIGNvbmZpZ3VyYXRpb25zDQorc3VwcG9ydGVkIGFyZSBzaG93biBpbiB0aGUgdGFibGUgYmVsb3cuDQorDQorPHRhYmxlIGJvcmRlcj0xPg0KKzx0cj48dGg+IDx0aD5pY2MvaWNsPHRoPmdjYzx0aD5jbGFuZw0KKzx0cj48dGQ+TGludXhcb3RoZXIgT1M8dGQ+WWVzKDEsNSk8dGQ+WWVzKDIsNCk8dGQ+WWVzKDQsNiw3KQ0KKzx0cj48dGQ+RnJlZUJTRFxvdGhlcjx0ZD5ZZXMoMSw1KTx0ZD5ZZXMoMiw0KTx0ZD5ZZXMoNCw2LDcsOCkNCis8dHI+PHRkPk9TIFhcb3RoZXI8dGQ+WWVzKDEsMyw0KTx0ZD5Obzx0ZD5ZZXMoNCw2LDcpDQorPHRyPjx0ZD5XaW5kb3dzXG90aGVyIE9TPHRkPlllcygxLDQpPHRkPk5vPHRkPk5vDQorPC90YWJsZT4NCisoMSkgT24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbCZyZWc7Jm5ic3A7IDY0LCBpY2MvaWNsIHZlcnNpb25zIDEyLnggDQorICAgIGFyZSBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLjxicj4NCisoMikgZ2NjIHZlcnNpb24gNC43IGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIEZvciBpY2Mgb24gT1MgWFxvdGhlciwgT1MgWFxvdGhlciB2ZXJzaW9uIDEwLjUuOCBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg0KSBJbnRlbCZyZWc7Jm5ic3A7IE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBub3Qgc3VwcG9ydGVkLjxicj4NCisoNSkgT24gSW50ZWwmcmVnOyZuYnNwOyBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMCBvciBsYXRlciBhcmUgcmVxdWlyZWQuPGJyPg0KKyg2KSBDbGFuZ1xvdGhlciB2ZXJzaW9uIDMuMyBpcyBzdXBwb3J0ZWQuPGJyPg0KKyg3KSBDbGFuZ1xvdGhlciBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkDQorICAgIHByZWNpc2lvbiB0eXBlLiAgVGh1cywgYWxsIGVudHJ5IHBvaW50cyByZWxpYW50IG9uIHRoaXMgdHlwZSBhcmUgcmVtb3ZlZA0KKyAgICBmcm9tIHRoZSBsaWJyYXJ5IGFuZCBjYW5ub3QgYmUgY2FsbGVkIGluIHRoZSB1c2VyIHByb2dyYW0uICBUaGUgZm9sbG93aW5nDQorICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToNCitAY29kZQ0KKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfKg0KKyAgICBfX2ttcGNfYXRvbWljXypfZnANCitAZW5kY29kZQ0KKyg4KSBDb21tdW5pdHkgY29udHJpYnV0aW9uIHByb3ZpZGVkIEFTIElTLCBub3QgdGVzdGVkIGJ5IEludGVsLg0KKw0KK1N1cHBvcnRlZCBBcmNoaXRlY3R1cmVzOiBJQk0oUikgUG93ZXIgNyBhbmQgUG93ZXIgOA0KKzx0YWJsZSBib3JkZXI9MT4NCis8dHI+PHRoPiA8dGg+Z2NjPHRoPmNsYW5nDQorPHRyPjx0ZD5MaW51eFxvdGhlciBPUzx0ZD5ZZXMoMSwyKTx0ZD5ZZXMoMyw0KQ0KKzwvdGFibGU+DQorKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDIpIE9uIFBvd2VyIDgsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC48YnI+DQorKDMpIE9uIFBvd2VyIDcsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC48YnI+DQorDQorQHNlY3Rpb24gc2VjX2Zyb250ZW5kIEZyb250LWVuZCBDb21waWxlcnMgdGhhdCB3b3JrIHdpdGggdGhpcyBSVEwNCisNCitUaGUgZm9sbG93aW5nIGNvbXBpbGVycyBhcmUga25vd24gdG8gZG8gY29tcGF0aWJsZSBjb2RlIGdlbmVyYXRpb24gZm9yDQordGhpcyBSVEw6IGljYy9pY2wsIGdjYy4gIENvZGUgZ2VuZXJhdGlvbiBpcyBkaXNjdXNzZWQgaW4gbW9yZSBkZXRhaWwNCitsYXRlciBpbiB0aGlzIGRvY3VtZW50Lg0KKw0KK0BzZWN0aW9uIHNlY19vdXRsaW5pbmcgT3V0bGluaW5nDQorDQorVGhlIHJ1bnRpbWUgaW50ZXJmYWNlIGlzIGJhc2VkIG9uIHRoZSBpZGVhIHRoYXQgdGhlIGNvbXBpbGVyDQorIm91dGxpbmVzIiBzZWN0aW9ucyBvZiBjb2RlIHRoYXQgYXJlIHRvIHJ1biBpbiBwYXJhbGxlbCBpbnRvIHNlcGFyYXRlDQorZnVuY3Rpb25zIHRoYXQgY2FuIHRoZW4gYmUgaW52b2tlZCBpbiBtdWx0aXBsZSB0aHJlYWRzLiAgRm9yIGluc3RhbmNlLA0KK3NpbXBsZSBjb2RlIGxpa2UgdGhpcw0KKw0KK0Bjb2RlDQordm9pZCBmb28oKQ0KK3sNCisjcHJhZ21hIG9tcCBwYXJhbGxlbA0KKyAgICB7DQorICAgICAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KKyAgICB9DQorfQ0KK0BlbmRjb2RlDQoraXMgY29udmVydGVkIGludG8gc29tZXRoaW5nIHRoYXQgbG9va3MgY29uY2VwdHVhbGx5IGxpa2UgdGhpcyAod2hlcmUNCit0aGUgbmFtZXMgdXNlZCBhcmUgbWVyZWx5IGlsbHVzdHJhdGl2ZTsgdGhlIHJlYWwgbGlicmFyeSBmdW5jdGlvbg0KK25hbWVzIHdpbGwgYmUgdXNlZCBsYXRlciBhZnRlciB3ZSd2ZSBkaXNjdXNzZWQgc29tZSBtb3JlIGlzc3Vlcy4uLikNCisNCitAY29kZQ0KK3N0YXRpYyB2b2lkIG91dGxpbmVkRm9vQm9keSgpDQorew0KKyAgICAuLi4gZG8gc29tZXRoaW5nIC4uLg0KK30NCisNCit2b2lkIGZvbygpDQorew0KKyAgICBfX09NUF9ydW50aW1lX2Zvcmsob3V0bGluZWRGb29Cb2R5LCAodm9pZCopMCk7ICAgLy8gTm90IHRoZSByZWFsIGZ1bmN0aW9uIG5hbWUhDQorfQ0KK0BlbmRjb2RlDQorDQorQHN1YnNlY3Rpb24gU0VDX1NIQVJFRFZBUlMgQWRkcmVzc2luZyBzaGFyZWQgdmFyaWFibGVzDQorDQorSW4gcmVhbCB1c2VzIG9mIHRoZSBPcGVuTVBcb3RoZXIgQVBJIHRoZXJlIGFyZSBub3JtYWxseSByZWZlcmVuY2VzIA0KK2Zyb20gdGhlIG91dGxpbmVkIGNvZGUgIHRvIHNoYXJlZCB2YXJpYWJsZXMgdGhhdCBhcmUgaW4gc2NvcGUgaW4gdGhlIGNvbnRhaW5pbmcgZnVuY3Rpb24uIA0KK1RoZXJlZm9yZSB0aGUgY29udGFpbmluZyBmdW5jdGlvbiBtdXN0IGJlIGFibGUgdG8gYWRkcmVzcyANCit0aGVzZSB2YXJpYWJsZXMuIFRoZSBydW50aW1lIHN1cHBvcnRzIHR3byBhbHRlcm5hdGUgd2F5cyBvZiBkb2luZw0KK3RoaXMuDQorDQorQHN1YnN1YnNlY3Rpb24gU0VDX1NFQ19PVCBDdXJyZW50IFRlY2huaXF1ZQ0KK1RoZSB0ZWNobmlxdWUgY3VycmVudGx5IHN1cHBvcnRlZCBieSB0aGUgcnVudGltZSBsaWJyYXJ5IGlzIHRvIHJlY2VpdmUNCithIHNlcGFyYXRlIHBvaW50ZXIgdG8gZWFjaCBzaGFyZWQgdmFyaWFibGUgdGhhdCBjYW4gYmUgYWNjZXNzZWQgZnJvbQ0KK3RoZSBvdXRsaW5lZCBmdW5jdGlvbi4gIFRoaXMgaXMgd2hhdCBpcyBzaG93biBpbiB0aGUgZXhhbXBsZSBiZWxvdy4NCisNCitXZSBob3BlIHNvb24gdG8gcHJvdmlkZSBhbiBhbHRlcm5hdGl2ZSBpbnRlcmZhY2UgdG8gc3VwcG9ydCB0aGUNCithbHRlcm5hdGUgaW1wbGVtZW50YXRpb24gZGVzY3JpYmVkIGluIHRoZSBuZXh0IHNlY3Rpb24uIFRoZQ0KK2FsdGVybmF0aXZlIGltcGxlbWVudGF0aW9uIGhhcyBwZXJmb3JtYW5jZSBhZHZhbnRhZ2VzIGZvciBzbWFsbA0KK3BhcmFsbGVsIHJlZ2lvbnMgdGhhdCBoYXZlIG1hbnkgc2hhcmVkIHZhcmlhYmxlcy4NCisNCitAc3Vic3Vic2VjdGlvbiBTRUNfU0VDX1BUIEZ1dHVyZSBUZWNobmlxdWUNCitUaGUgaWRlYSBpcyB0byB0cmVhdCB0aGUgb3V0bGluZWQgZnVuY3Rpb24gYXMgdGhvdWdoIGl0DQord2VyZSBhIGxleGljYWxseSBuZXN0ZWQgZnVuY3Rpb24sIGFuZCBwYXNzIGl0IGEgc2luZ2xlIGFyZ3VtZW50IHdoaWNoDQoraXMgdGhlIHBvaW50ZXIgdG8gdGhlIHBhcmVudCdzIHN0YWNrIGZyYW1lLiBQcm92aWRlZCB0aGF0IHRoZSBjb21waWxlcg0KK2tub3dzIHRoZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBmcmFtZSB3aGVuIGl0IGlzIGdlbmVyYXRpbmcgdGhlIG91dGxpbmVkDQorZnVuY3Rpb24gaXQgY2FuIHRoZW4gYWNjZXNzIHRoZSB1cC1sZXZlbCB2YXJpYWJsZXMgYXQgYXBwcm9wcmlhdGUNCitvZmZzZXRzIGZyb20gdGhlIHBhcmVudCBmcmFtZS4gIFRoaXMgaXMgYSBjbGFzc2ljYWwgY29tcGlsZXIgdGVjaG5pcXVlDQorZnJvbSB0aGUgMTk2MHMgdG8gc3VwcG9ydCBsYW5ndWFnZXMgbGlrZSBBbGdvbCAoYW5kIGl0cyBkZXNjZW5kYW50cykNCit0aGF0IHN1cHBvcnQgbGV4aWNhbGx5IG5lc3RlZCBmdW5jdGlvbnMuDQorDQorVGhlIG1haW4gYmVuZWZpdCBvZiB0aGlzIHRlY2huaXF1ZSBpcyB0aGF0IHRoZXJlIGlzIG5vIGNvZGUgcmVxdWlyZWQNCithdCB0aGUgZm9yayBwb2ludCB0byBtYXJzaGFsIHRoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uLg0KK1NpbmNlIHRoZSBydW50aW1lIGtub3dzIHN0YXRpY2FsbHkgaG93IG1hbnkgYXJndW1lbnRzIG11c3QgYmUgcGFzc2VkIHRvIHRoZQ0KK291dGxpbmVkIGZ1bmN0aW9uLCBpdCBjYW4gZWFzaWx5IGNvcHkgdGhlbSB0byB0aGUgdGhyZWFkJ3Mgc3RhY2sNCitmcmFtZS4gIFRoZXJlZm9yZSB0aGUgcGVyZm9ybWFuY2Ugb2YgdGhlIGZvcmsgY29kZSBpcyBpbmRlcGVuZGVudCBvZg0KK3RoZSBudW1iZXIgb2Ygc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZSBhY2Nlc3NlZCBieSB0aGUgb3V0bGluZWQNCitmdW5jdGlvbi4NCisNCitJZiBpdCBpcyBoYXJkIHRvIGRldGVybWluZSB0aGUgc3RhY2sgbGF5b3V0IG9mIHRoZSBwYXJlbnQgd2hpbGUgZ2VuZXJhdGluZyB0aGUNCitvdXRsaW5lZCBjb2RlLCBpdCBpcyBzdGlsbCBwb3NzaWJsZSB0byB1c2UgdGhpcyBhcHByb2FjaCBieSBjb2xsZWN0aW5nIGFsbCBvZg0KK3RoZSB2YXJpYWJsZXMgaW4gdGhlIHBhcmVudCB0aGF0IGFyZSBhY2Nlc3NlZCBmcm9tIG91dGxpbmVkIGZ1bmN0aW9ucyBpbnRvDQorYSBzaW5nbGUgYHN0cnVjdGAgd2hpY2ggaXMgcGxhY2VkIG9uIHRoZSBzdGFjaywgYW5kIHdob3NlIGFkZHJlc3MgaXMgcGFzc2VkDQordG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9ucy4gSW4gdGhpcyB3YXkgdGhlIG9mZnNldHMgb2YgdGhlIHNoYXJlZCB2YXJpYWJsZXMNCithcmUga25vd24gKHNpbmNlIHRoZXkgYXJlIGluc2lkZSB0aGUgc3RydWN0KSB3aXRob3V0IG5lZWRpbmcgdG8ga25vdw0KK3RoZSBjb21wbGV0ZSBsYXlvdXQgb2YgdGhlIHBhcmVudCBzdGFjay1mcmFtZS4gRnJvbSB0aGUgcG9pbnQgb2Ygdmlldw0KK29mIHRoZSBydW50aW1lIGVpdGhlciBvZiB0aGVzZSB0ZWNobmlxdWVzIGlzIGVxdWl2YWxlbnQsIHNpbmNlIGluIGVpdGhlcg0KK2Nhc2UgaXQgb25seSBoYXMgdG8gcGFzcyBhIHNpbmdsZSBhcmd1bWVudCB0byB0aGUgb3V0bGluZWQgZnVuY3Rpb24gdG8gYWxsb3cgDQoraXQgdG8gYWNjZXNzIHNoYXJlZCB2YXJpYWJsZXMuDQorDQorQSBzY2hlbWUgbGlrZSB0aGlzIGlzIGhvdyBnY2Ncb3RoZXIgZ2VuZXJhdGVzIG91dGxpbmVkIGZ1bmN0aW9ucy4NCisNCitAc2VjdGlvbiBTRUNfSU5URVJGQUNFUyBMaWJyYXJ5IEludGVyZmFjZXMNCitUaGUgbGlicmFyeSBmdW5jdGlvbnMgdXNlZCBmb3Igc3BlY2lmaWMgcGFydHMgb2YgdGhlIE9wZW5NUFxvdGhlciBsYW5ndWFnZSBpbXBsZW1lbnRhdGlvbg0KK2FyZSBkb2N1bWVudGVkIGluIGRpZmZlcmVudCBtb2R1bGVzLg0KKw0KKyAtIEByZWYgQkFTSUNfVFlQRVMgZnVuZGFtZW50YWwgdHlwZXMgdXNlZCBieSB0aGUgcnVudGltZSBpbiBtYW55IHBsYWNlcw0KKyAtIEByZWYgREVQUkVDQVRFRCAgZnVuY3Rpb25zIHRoYXQgYXJlIGluIHRoZSBsaWJyYXJ5IGJ1dCBhcmUgbm8gbG9uZ2VyIHJlcXVpcmVkDQorIC0gQHJlZiBTVEFSVFVQX1NIVVRET1dOIGZ1bmN0aW9ucyBmb3IgaW5pdGlhbGl6aW5nIGFuZCBmaW5hbGl6aW5nIHRoZSBydW50aW1lDQorIC0gQHJlZiBQQVJBTExFTCBmdW5jdGlvbnMgZm9yIGltcGxlbWVudGluZyBgb21wIHBhcmFsbGVsYA0KKyAtIEByZWYgVEhSRUFEX1NUQVRFUyBmdW5jdGlvbnMgZm9yIHN1cHBvcnRpbmcgdGhyZWFkIHN0YXRlIGlucXVpcmllcw0KKyAtIEByZWYgV09SS19TSEFSSU5HIGZ1bmN0aW9ucyBmb3Igd29yayBzaGFyaW5nIGNvbnN0cnVjdHMgc3VjaCBhcyBgb21wIGZvcmAsIGBvbXAgc2VjdGlvbnNgDQorIC0gQHJlZiBUSFJFQURQUklWQVRFIGZ1bmN0aW9ucyB0byBzdXBwb3J0IHRocmVhZCBwcml2YXRlIGRhdGEsIGNvcHlpbiBldGMNCisgLSBAcmVmIFNZTkNIUk9OSVpBVElPTiBmdW5jdGlvbnMgdG8gc3VwcG9ydCBgb21wIGNyaXRpY2FsYCwgYG9tcCBiYXJyaWVyYCwgYG9tcCBtYXN0ZXJgLCByZWR1Y3Rpb25zIGV0Yw0KKyAtIEByZWYgQVRPTUlDX09QUyBmdW5jdGlvbnMgdG8gc3VwcG9ydCBhdG9taWMgb3BlcmF0aW9ucw0KKyAtIEByZWYgU1RBVFNfR0FUSEVSSU5HIG1hY3JvcyB0byBzdXBwb3J0IGRldmVsb3BlciBwcm9maWxpbmcgb2YgbGlib21wDQorIC0gRG9jdW1lbnRhdGlvbiBvbiB0YXNraW5nIGhhcyBzdGlsbCB0byBiZSB3cml0dGVuLi4uDQorDQorQHNlY3Rpb24gU0VDX0VYQU1QTEVTIEV4YW1wbGVzDQorQHN1YnNlY3Rpb24gU0VDX1dPUktTSEFSSU5HX0VYQU1QTEUgV29yayBTaGFyaW5nIEV4YW1wbGUNCitUaGlzIGV4YW1wbGUgc2hvd3MgdGhlIGNvZGUgZ2VuZXJhdGVkIGZvciBhIHBhcmFsbGVsIGZvciB3aXRoIHJlZHVjdGlvbiBhbmQgZHluYW1pYyBzY2hlZHVsaW5nLg0KKw0KK0Bjb2RlDQorZXh0ZXJuIGZsb2F0IGZvbyggdm9pZCApOw0KKw0KK2ludCBtYWluICgpIHsNCisgICAgaW50IGk7IA0KKyAgICBmbG9hdCByID0gMC4wOyANCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMpIHJlZHVjdGlvbigrOnIpIA0KKyAgICBmb3IgKCBpID0gMDsgaSA8IDEwOyBpICsrICkgew0KKyAgICAgICAgciArPSBmb28oKTsgDQorICAgIH0NCit9DQorQGVuZGNvZGUNCisNCitUaGUgdHJhbnNmb3JtZWQgY29kZSBsb29rcyBsaWtlIHRoaXMuDQorQGNvZGUNCitleHRlcm4gZmxvYXQgZm9vKCB2b2lkICk7IA0KKw0KK2ludCBtYWluICgpIHsNCisgICAgc3RhdGljIGludCB6ZXJvID0gMDsgDQorICAgIGF1dG8gaW50IGd0aWQ7IA0KKyAgICBhdXRvIGZsb2F0IHIgPSAwLjA7IA0KKyAgICBfX2ttcGNfYmVnaW4oICYgbG9jMywgMCApOyANCisgICAgLy8gVGhlIGd0aWQgaXMgbm90IGFjdHVhbGx5IHJlcXVpcmVkIGluIHRoaXMgZXhhbXBsZSBzbyBjb3VsZCBiZSBvbWl0dGVkOw0KKyAgICAvLyBXZSBzaG93IGl0cyBpbml0aWFsaXphdGlvbiBoZXJlIGJlY2F1c2UgaXQgaXMgb2Z0ZW4gcmVxdWlyZWQgZm9yIGNhbGxzIGludG8NCisgICAgLy8gdGhlIHJ1bnRpbWUgYW5kIHNob3VsZCBiZSBsb2NhbGx5IGNhY2hlZCBsaWtlIHRoaXMuDQorICAgIGd0aWQgPSBfX2ttcGNfZ2xvYmFsIHRocmVhZCBudW0oICYgbG9jMyApOyANCisgICAgX19rbXBjX2ZvcmsgY2FsbCggJiBsb2M3LCAxLCBtYWluXzdfcGFyYWxsZWxfMywgJiByICk7IA0KKyAgICBfX2ttcGNfZW5kKCAmIGxvYzAgKTsgDQorICAgIHJldHVybiAwOyANCit9DQorDQorc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSB7IGZsb2F0IHJfMTBfcnByOyB9OyANCisNCitzdGF0aWMga21wX2NyaXRpY2FsX25hbWUgbGNrID0geyAwIH07DQorc3RhdGljIGlkZW50X3QgbG9jMTA7IC8vIGxvYzEwLmZsYWdzIHNob3VsZCBjb250YWluIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFIGJpdCBzZXQgDQorICAgICAgICAgICAgICAgICAgICAgIC8vIGlmIGNvbXBpbGVyIGhhcyBnZW5lcmF0ZWQgYW4gYXRvbWljIHJlZHVjdGlvbi4NCisNCit2b2lkIG1haW5fN19wYXJhbGxlbF8zKCBpbnQgKmd0aWQsIGludCAqYnRpZCwgZmxvYXQgKnJfN19zaHAgKSB7DQorICAgIGF1dG8gaW50IGlfN19wcjsgDQorICAgIGF1dG8gaW50IGxvd2VyLCB1cHBlciwgbGl0ZXIsIGluY3I7IA0KKyAgICBhdXRvIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgcmVkdWNlOyANCisgICAgcmVkdWNlLnJfMTBfcnByID0gMC5GOyANCisgICAgbGl0ZXIgPSAwOyANCisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCggJiBsb2M3LCpndGlkLCAzNSwgMCwgOSwgMSwgMSApOyANCisgICAgd2hpbGUgKCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCAmIGxvYzcsICpndGlkLCAmIGxpdGVyLCAmIGxvd2VyLCAmIHVwcGVyLCAmIGluY3IgKSApIHsNCisgICAgICAgIGZvciggaV83X3ByID0gbG93ZXI7IHVwcGVyID49IGlfN19wcjsgaV83X3ByICsrICkgDQorICAgICAgICAgIHJlZHVjZS5yXzEwX3JwciArPSBmb28oKTsgDQorICAgIH0NCisgICAgc3dpdGNoKCBfX2ttcGNfcmVkdWNlX25vd2FpdCggJiBsb2MxMCwgKmd0aWQsIDEsIDQsICYgcmVkdWNlLCBtYWluXzEwX3JlZHVjZV81LCAmIGxjayApICkgew0KKyAgICAgICAgY2FzZSAxOg0KKyAgICAgICAgICAgKnJfN19zaHAgKz0gcmVkdWNlLnJfMTBfcnByOw0KKyAgICAgICAgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCAmIGxvYzEwLCAqZ3RpZCwgJiBsY2sgKTsNCisgICAgICAgICAgIGJyZWFrOw0KKyAgICAgICAgY2FzZSAyOg0KKyAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkKCAmIGxvYzEwLCAqZ3RpZCwgcl83X3NocCwgcmVkdWNlLnJfMTBfcnByICk7DQorICAgICAgICAgICBicmVhazsNCisgICAgICAgIGRlZmF1bHQ6Ow0KKyAgICB9DQorfSANCisNCit2b2lkIG1haW5fMTBfcmVkdWNlXzUoIHN0cnVjdCBtYWluXzEwX3JlZHVjdGlvbl90XzUgKnJlZHVjZV9saHMsIA0KKyAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IG1haW5fMTBfcmVkdWN0aW9uX3RfNSAqcmVkdWNlX3JocyApIA0KK3sgDQorICAgIHJlZHVjZV9saHMtPnJfMTBfcnByICs9IHJlZHVjZV9yaHMtPnJfMTBfcnByOyANCit9DQorQGVuZGNvZGUNCisNCitAZGVmZ3JvdXAgQkFTSUNfVFlQRVMgQmFzaWMgVHlwZXMNCitUeXBlcyB0aGF0IGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIHJ1bnRpbWUuDQorDQorQGRlZmdyb3VwIERFUFJFQ0FURUQgRGVwcmVjYXRlZCBGdW5jdGlvbnMNCitGdW5jdGlvbnMgaW4gdGhpcyBncm91cCBhcmUgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5IG9ubHksIGFuZA0KK3Nob3VsZCBub3QgYmUgdXNlZCBpbiBuZXcgY29kZS4NCisNCitAZGVmZ3JvdXAgU1RBUlRVUF9TSFVURE9XTiBTdGFydHVwIGFuZCBTaHV0ZG93bg0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgZm9yIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gYW5kIHNodXRkb3duLg0KKw0KK0BkZWZncm91cCBQQVJBTExFTCBQYXJhbGxlbCAoZm9yay9qb2luKQ0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIDx0dD5cI3ByYWdtYSBvbXAgcGFyYWxsZWw8L3R0Pi4NCisNCitAZGVmZ3JvdXAgVEhSRUFEX1NUQVRFUyBUaHJlYWQgSW5mb3JtYXRpb24NCitUaGVzZSBmdW5jdGlvbnMgcmV0dXJuIGluZm9ybWF0aW9uIGFib3V0IHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZC4NCisNCitAZGVmZ3JvdXAgV09SS19TSEFSSU5HIFdvcmsgU2hhcmluZw0KK1RoZXNlIGZ1bmN0aW9ucyBhcmUgdXNlZCBmb3IgaW1wbGVtZW50aW5nIA0KKzx0dD5cI3ByYWdtYSBvbXAgZm9yPC90dD4sIDx0dD5cI3ByYWdtYSBvbXAgc2VjdGlvbnM8L3R0PiwgPHR0PlwjcHJhZ21hIG9tcCBzaW5nbGU8L3R0PiBhbmQgDQorPHR0PlwjcHJhZ21hIG9tcCBtYXN0ZXI8L3R0PiBjb25zdHJ1Y3RzLiANCisNCitXaGVuIGhhbmRsaW5nIGxvb3BzLCB0aGVyZSBhcmUgZGlmZmVyZW50IGZ1bmN0aW9ucyBmb3IgZWFjaCBvZiB0aGUgc2lnbmVkIGFuZCB1bnNpZ25lZCAzMiBhbmQgNjQgYml0IGludGVnZXIgdHlwZXMNCit3aGljaCBoYXZlIHRoZSBuYW1lIHN1ZmZpeGVzIGBfNGAsIGBfNHVgLCBgXzhgIGFuZCBgXzh1YC4gVGhlIHNlbWFudGljcyBvZiBlYWNoIG9mIHRoZSBmdW5jdGlvbnMgaXMgdGhlIHNhbWUsDQorc28gdGhleSBhcmUgb25seSBkZXNjcmliZWQgb25jZS4NCisNCitTdGF0aWMgbG9vcCBzY2hlZHVsaW5nIGlzIGhhbmRsZWQgYnkgIEByZWYgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80IGFuZCBmcmllbmRzLiBPbmx5IGEgc2luZ2xlIGNhbGwgaXMgbmVlZGVkLA0KK3NpbmNlIHRoZSBpdGVyYXRpb25zIHRvIGJlIGV4ZWN1dGVkIGJ5IGFueSBnaXZlIHRocmVhZCBjYW4gYmUgZGV0ZXJtaW5lZCBhcyBzb29uIGFzIHRoZSBsb29wIHBhcmFtZXRlcnMgYXJlIGtub3duLg0KKw0KK0R5bmFtaWMgc2NoZWR1bGluZyBpcyBoYW5kbGVkIGJ5IHRoZSBAcmVmIF9fa21wY19kaXNwYXRjaF9pbml0XzQgYW5kIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNCBmdW5jdGlvbnMuIA0KK1RoZSBpbml0IGZ1bmN0aW9uIGlzIGNhbGxlZCBvbmNlIGluIGVhY2ggdGhyZWFkIG91dHNpZGUgdGhlIGxvb3AsIHdoaWxlIHRoZSBuZXh0IGZ1bmN0aW9uIGlzIGNhbGxlZCBlYWNoDQordGltZSB0aGF0IHRoZSBwcmV2aW91cyBjaHVuayBvZiB3b3JrIGhhcyBiZWVuIGV4aGF1c3RlZC4gDQorDQorQGRlZmdyb3VwIFNZTkNIUk9OSVpBVElPTiBTeW5jaHJvbml6YXRpb24NCitUaGVzZSBmdW5jdGlvbnMgYXJlIHVzZWQgZm9yIGltcGxlbWVudGluZyBiYXJyaWVycy4NCisNCitAZGVmZ3JvdXAgVEhSRUFEUFJJVkFURSBUaHJlYWQgcHJpdmF0ZSBkYXRhIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCBjb3B5aW4vb3V0IGFuZCB0aHJlYWQgcHJpdmF0ZSBkYXRhLg0KKw0KK0BkZWZncm91cCBTVEFUU19HQVRIRVJJTkcgU3RhdGlzdGljcyBHYXRoZXJpbmcgZnJvbSBPTVBUQg0KK1RoZXNlIG1hY3JvcyBzdXBwb3J0IHByb2ZpbGluZyB0aGUgbGlib21wIGxpYnJhcnkuICBVc2UgLS1zdGF0cz1vbiB3aGVuIGJ1aWxkaW5nIHdpdGggYnVpbGQucGwgdG8gZW5hYmxlDQorYW5kIHRoZW4gdXNlIHRoZSBLTVBfKiBtYWNyb3MgdG8gcHJvZmlsZSAodGhyb3VnaCBjb3VudHMgb3IgY2xvY2sgdGlja3MpIGxpYm9tcCBkdXJpbmcgZXhlY3V0aW9uIG9mIGFuIE9wZW5NUCBwcm9ncmFtLg0KKw0KK0BzZWN0aW9uIHNlY19zdGF0c19lbnZfdmFycyBFbnZpcm9ubWVudCBWYXJpYWJsZXMNCisNCitUaGlzIHNlY3Rpb24gZGVzY3JpYmVzIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgcmVsZXZhbnQgdG8gc3RhdHMtZ2F0aGVyaW5nIGluIGxpYm9tcA0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX0ZJTEUNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0IHRvIGFuIG91dHB1dCBmaWxlbmFtZSB0aGF0IHdpbGwgYmUgYXBwZW5kZWQgKk5PVCBPVkVSV1JJVFRFTiogaWYgaXQgZXhpc3RzLiAgSWYgdGhpcyBlbnZpcm9ubWVudCB2YXJpYWJsZSBpcyB1bmRlZmluZWQsIHRoZSBzdGF0aXN0aWNzIHdpbGwgYmUgb3V0cHV0IHRvIHN0ZGVycg0KKw0KK0Bjb2RlDQorS01QX1NUQVRTX1RIUkVBRFMNCitAZW5kY29kZQ0KK1RoaXMgZW52aXJvbm1lbnQgdmFyaWFibGUgaW5kaWNhdGVzIHRvIHByaW50IHRocmVhZC1zcGVjaWZpYyBzdGF0aXN0aWNzIGFzIHdlbGwgYXMgYWdncmVnYXRlIHN0YXRpc3RpY3MuICBFYWNoIHRocmVhZCdzIHN0YXRpc3RpY3Mgd2lsbCBiZSBzaG93biBhcyB3ZWxsIGFzIHRoZSBjb2xsZWN0aXZlIHN1bSBvZiBhbGwgdGhyZWFkcy4gIFRoZSB2YWx1ZXMgInRydWUiLCAib24iLCAiMSIsICJ5ZXMiIHdpbGwgYWxsIGluZGljYXRlIHRvIHByaW50IHBlciB0aHJlYWQgc3RhdGlzdGljcy4NCisNCitAZGVmZ3JvdXAgVEFTS0lORyBUYXNraW5nIHN1cHBvcnQNCitUaGVzZSBmdW5jdGlvbnMgc3VwcG9ydCB0YXNraW5nIGNvbnN0cnVjdHMuDQorDQorQGRlZmdyb3VwIFVTRVIgVXNlciB2aXNpYmxlIGZ1bmN0aW9ucw0KK1RoZXNlIGZ1bmN0aW9ucyBjYW4gYmUgY2FsbGVkIGRpcmVjdGx5IGJ5IHRoZSB1c2VyLCBidXQgYXJlIHJ1bnRpbWUgbGlicmFyeSBzcGVjaWZpYywgcmF0aGVyIHRoYW4gYmVpbmcgT3Blbk1QIGludGVyZmFjZXMuDQorDQorKi8NCisNCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvQ01ha2VMaXN0cy50eHQgYi9yYzMvcnVudGltZS9zcmMvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzc3NDM0ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9DTWFrZUxpc3RzLnR4dApAQCAtMCwwICsxLDMzMiBAQAorIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIENvbmZpZ3VyZSBvbXAuaCwga21wX2NvbmZpZy5oIGFuZCBvbXB0LmggaWYgbmVjZXNzYXJ5Citjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXAuaC52YXIgb21wLmggQE9OTFkpCitjb25maWd1cmVfZmlsZShrbXBfY29uZmlnLmguY21ha2Uga21wX2NvbmZpZy5oIEBPTkxZKQoraWYoJHtMSUJPTVBfT01QVF9TVVBQT1JUfSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wdC5oLnZhciBvbXB0LmggQE9OTFkpCitlbmRpZigpCisKKyMgR2VuZXJhdGUgbWVzc2FnZSBjYXRhbG9nIGZpbGVzOiBrbXBfaTE4bl9pZC5pbmMgYW5kIGttcF9pMThuX2RlZmF1bHQuaW5jCithZGRfY3VzdG9tX2NvbW1hbmQoCisgIE9VVFBVVCAga21wX2kxOG5faWQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLXByZWZpeD1rbXBfaTE4biAtLWVudW09a21wX2kxOG5faWQuaW5jICR7TElCT01QX1NSQ19ESVJ9L2kxOG4vZW5fVVMudHh0CisgIERFUEVORFMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQgJHtMSUJPTVBfVE9PTFNfRElSfS9tZXNzYWdlLWNvbnZlcnRlci5wbAorKQorYWRkX2N1c3RvbV9jb21tYW5kKAorICBPVVRQVVQgIGttcF9pMThuX2RlZmF1bHQuaW5jCisgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1vcz0ke0xJQk9NUF9QRVJMX1NDUklQVF9PU30KKyAgICAtLXByZWZpeD1rbXBfaTE4biAtLWRlZmF1bHQ9a21wX2kxOG5fZGVmYXVsdC5pbmMgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bi9lbl9VUy50eHQKKyAgREVQRU5EUyAke0xJQk9NUF9TUkNfRElSfS9pMThuL2VuX1VTLnR4dCAke0xJQk9NUF9UT09MU19ESVJ9L21lc3NhZ2UtY29udmVydGVyLnBsCispCisKKyMgU2V0IHRoZSAtRCBkZWZpbml0aW9ucyBmb3IgYWxsIHNvdXJjZXMKKyMgVU5JQ09ERSBhbmQgX1VOSUNPREUgYXJlIHNldCBpbiBMTFZNJ3MgQ01ha2Ugc3lzdGVtLiAgVGhleSBhZmZlY3QgdGhlCisjIGl0dG5vdGlmeSBjb2RlIGFuZCBzaG91bGQgb25seSBiZSBzZXQgd2hlbiBjb21waWxpbmcgaXR0bm90aWZ5X3N0YXRpYy5jCisjIG9uIFdpbmRvd3MgKGRvbmUgYmVsb3cpLgorIyBUT0RPOiBGaXggdGhlIFVOSUNPREUgdXNhZ2UgaW4gaXR0bm90aWZ5IGNvZGUgZm9yIFdpbmRvd3MuCityZW1vdmVfZGVmaW5pdGlvbnMoLURVTklDT0RFIC1EX1VOSUNPREUpCitsaWJvbXBfZ2V0X2RlZmluaXRpb25zX2ZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0RFRklOSVRJT05TX0ZMQUdTKQorYWRkX2RlZmluaXRpb25zKCR7TElCT01QX0NPTkZJR1VSRURfREVGSU5JVElPTlNfRkxBR1N9KQorCisjIFNldCB0aGUgLUkgaW5jbHVkZXMgZm9yIGFsbCBzb3VyY2VzCitpbmNsdWRlX2RpcmVjdG9yaWVzKAorICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0KKyAgJHtMSUJPTVBfU1JDX0RJUn0vaTE4bgorICAke0xJQk9NUF9JTkNfRElSfQorICAke0xJQk9NUF9TUkNfRElSfS90aGlyZHBhcnR5L2l0dG5vdGlmeQorKQoraWYoJHtMSUJPTVBfVVNFX0hXTE9DfSkKKyAgaW5jbHVkZV9kaXJlY3Rvcmllcygke0xJQk9NUF9IV0xPQ19JTlNUQUxMX0RJUn0vaW5jbHVkZSkKK2VuZGlmKCkKKworIyBHZXR0aW5nIGNvcnJlY3Qgc291cmNlIGZpbGVzIHRvIGJ1aWxkIGxpYnJhcnkKK3NldChMSUJPTVBfQ0ZJTEVTKQorc2V0KExJQk9NUF9DWFhGSUxFUykKK3NldChMSUJPTVBfQVNNRklMRVMpCitpZigke1NUVUJTX0xJQlJBUll9KQorICBzZXQoTElCT01QX0NGSUxFUyBrbXBfc3R1Yi5jKQorZWxzZSgpCisgICMgR2V0IEMgZmlsZXMKKyAgc2V0KExJQk9NUF9DRklMRVMKKyAgICBrbXBfYWxsb2MuYworICAgIGttcF9hdG9taWMuYworICAgIGttcF9jc3VwcG9ydC5jCisgICAga21wX2RlYnVnLmMKKyAgICBrbXBfaXR0LmMKKyAgICBrbXBfZW52aXJvbm1lbnQuYworICAgIGttcF9lcnJvci5jCisgICAga21wX2dsb2JhbC5jCisgICAga21wX2kxOG4uYworICAgIGttcF9pby5jCisgICAga21wX3J1bnRpbWUuYworICAgIGttcF9zZXR0aW5ncy5jCisgICAga21wX3N0ci5jCisgICAga21wX3Rhc2tpbmcuYworICAgIGttcF90YXNrcS5jCisgICAga21wX3RocmVhZHByaXZhdGUuYworICAgIGttcF91dGlsaXR5LmMKKyAgKQorICBpZihXSU4zMikKKyAgICAjIFdpbmRvd3Mgc3BlY2lmaWMgZmlsZXMKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9XaW5kb3dzX05UX3V0aWwuYykKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9XaW5kb3dzX05ULTU4Nl91dGlsLmMpCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQVNNRklMRVMgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtKSAjIFdpbmRvd3MgYXNzZW1ibHkgZmlsZQorICBlbHNlKCkKKyAgICAjIFVuaXggc3BlY2lmaWMgZmlsZXMKKyAgICBsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMgel9MaW51eF91dGlsLmMpCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIGttcF9nc3VwcG9ydC5jKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0FTTUZJTEVTIHpfTGludXhfYXNtLnMpICMgVW5peCBhc3NlbWJseSBmaWxlCisgIGVuZGlmKCkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIHRoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuYyBMSUJPTVBfVVNFX0lUVF9OT1RJRlkpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZGVidWdnZXIuYyBMSUJPTVBfVVNFX0RFQlVHR0VSKQorICAjIEdldCBDKysgZmlsZXMKKyAgc2V0KExJQk9NUF9DWFhGSUxFUworICAgIGttcF9iYXJyaWVyLmNwcAorICAgIGttcF93YWl0X3JlbGVhc2UuY3BwCisgICAga21wX2FmZmluaXR5LmNwcAorICAgIGttcF9kaXNwYXRjaC5jcHAKKyAgICBrbXBfbG9jay5jcHAKKyAgICBrbXBfc2NoZWQuY3BwCisgICkKKyAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX3N0YXRzLmNwcCBMSUJPTVBfU1RBVFMpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF9zdGF0c190aW1pbmcuY3BwIExJQk9NUF9TVEFUUykKKyAgaWYoJHtMSUJPTVBfT01QX1ZFUlNJT059IEdSRUFURVIgNDAgT1IgJHtMSUJPTVBfT01QX1ZFUlNJT059IEVRVUFMIDQwKQorICAgIGxpYm9tcF9hcHBlbmQoTElCT01QX0NYWEZJTEVTIGttcF90YXNrZGVwcy5jcHApCisgICAgbGlib21wX2FwcGVuZChMSUJPTVBfQ1hYRklMRVMga21wX2NhbmNlbC5jcHApCisgIGVuZGlmKCkKK2VuZGlmKCkKKyMgRmlsZXMgY29tbW9uIHRvIHN0dWJzIGFuZCBub3JtYWwgbGlicmFyeQorbGlib21wX2FwcGVuZChMSUJPTVBfQ0ZJTEVTIGttcF9mdG5fY2RlY2wuYykKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBrbXBfZnRuX2V4dHJhLmMpCitsaWJvbXBfYXBwZW5kKExJQk9NUF9DRklMRVMga21wX3ZlcnNpb24uYykKK2xpYm9tcF9hcHBlbmQoTElCT01QX0NGSUxFUyBvbXB0LWdlbmVyYWwuYyBJRl9UUlVFIExJQk9NUF9PTVBUX1NVUFBPUlQpCisKK3NldChMSUJPTVBfU09VUkNFX0ZJTEVTICR7TElCT01QX0NGSUxFU30gJHtMSUJPTVBfQ1hYRklMRVN9ICR7TElCT01QX0FTTUZJTEVTfSkKKyMgRm9yIFdpbmRvd3MsIHRoZXJlIGlzIGEgcmVzb3VyY2UgZmlsZSAoLnJjIC0+IC5yZXMpIHRoYXQgaXMgYWxzbyBjb21waWxlZAorbGlib21wX2FwcGVuZChMSUJPTVBfU09VUkNFX0ZJTEVTIGxpYm9tcC5yYyBXSU4zMikKKworIyBHZXQgY29tcGlsZXIgYW5kIGFzc2VtYmxlciBmbGFncworbGlib21wX2dldF9jZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQ0ZMQUdTKQorbGlib21wX2dldF9jeHhmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9DWFhGTEFHUykKK2xpYm9tcF9nZXRfYXNtZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfQVNNRkxBR1MpCisjIFNldCB0aGUgY29tcGlsZXIgZmxhZ3MgZm9yIGVhY2ggdHlwZSBvZiBzb3VyY2UKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9DRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9DRkxBR1N9IikKK3NldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcygke0xJQk9NUF9DWFhGSUxFU30gUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NYWEZMQUdTfSIpCitzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfQVNNRklMRVN9IFBST1BFUlRJRVMgQ09NUElMRV9GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9BU01GTEFHU30iKQorIyBMZXQgdGhlIGNvbXBpbGVyIGhhbmRsZSB0aGUgYXNzZW1ibHkgZmlsZXMgb24gVW5peC1saWtlIHN5c3RlbXMKK2lmKE5PVCBXSU4zMikKKyAgc2V0X3NvdXJjZV9maWxlc19wcm9wZXJ0aWVzKCR7TElCT01QX0FTTUZJTEVTfSBQUk9QRVJUSUVTIExBTkdVQUdFIEMpCitlbmRpZigpCisKKyMgUmVtb3ZlIGFueSBjbWFrZS1hdXRvbWF0aWMgbGlua2luZyBvZiB0aGUgc3RhbmRhcmQgQysrIGxpYnJhcnkuCisjIFdlIG5laXRoZXIgbmVlZCAobm9yIHdhbnQpIHRoZSBzdGFuZGFyZCBDKysgbGlicmFyeSBkZXBlbmRlbmN5IGV2ZW4gdGhvdWdoIHdlIGNvbXBpbGUgYysrIGZpbGVzLgoraWYoTk9UICR7TElCT01QX1VTRV9TVERDUFBMSUJ9KQorICBzZXQoTElCT01QX0xJTktFUl9MQU5HVUFHRSBDKQorICBzZXQoQ01BS0VfQ1hYX0lNUExJQ0lUX0xJTktfTElCUkFSSUVTKQorZWxzZSgpCisgIHNldChMSUJPTVBfTElOS0VSX0xBTkdVQUdFIENYWCkKK2VuZGlmKCkKKworIyBBZGQgdGhlIE9wZW5NUCBsaWJyYXJ5CitsaWJvbXBfZ2V0X2xkZmxhZ3MoTElCT01QX0NPTkZJR1VSRURfTERGTEFHUykKKworYWRkX2xpYnJhcnkob21wICR7TElCT01QX0xJQlJBUllfS0lORH0gJHtMSUJPTVBfU09VUkNFX0ZJTEVTfSkKKworc2V0X3RhcmdldF9wcm9wZXJ0aWVzKG9tcCBQUk9QRVJUSUVTCisgIFBSRUZJWCAiIiBTVUZGSVggIiIgT1VUUFVUX05BTUUgIiR7TElCT01QX0xJQl9GSUxFfSIKKyAgTElOS19GTEFHUyAiJHtMSUJPTVBfQ09ORklHVVJFRF9MREZMQUdTfSIKKyAgTElOS0VSX0xBTkdVQUdFICR7TElCT01QX0xJTktFUl9MQU5HVUFHRX0KKykKKworIyBHZXQgdGhlIGxpYnJhcnkncyBsb2NhdGlvbiB3aXRoaW4gdGhlIGJ1aWxkIHRyZWUgZm9yIHRoZSB1bml0IHRlc3RlcgoraWYoTk9UIFdJTjMyKQorICBnZXRfdGFyZ2V0X3Byb3BlcnR5KExJQk9NUF9MSUJSQVJZX0RJUiBvbXAgTElCUkFSWV9PVVRQVVRfRElSRUNUT1JZKQorZWxzZSgpCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0xJQlJBUllfRElSIG9tcCBSVU5USU1FX09VVFBVVF9ESVJFQ1RPUlkpCitlbmRpZigpCitpZihOT1QgTElCT01QX0xJQlJBUllfRElSKQorICBzZXQoTElCT01QX0xJQlJBUllfRElSICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfSkKKyAgc2V0KExJQk9NUF9MSUJSQVJZX0RJUiAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0gUEFSRU5UX1NDT1BFKQorZWxzZSgpCisgIHNldChMSUJPTVBfTElCUkFSWV9ESVIgJHtMSUJPTVBfTElCUkFSWV9ESVJ9IFBBUkVOVF9TQ09QRSkKK2VuZGlmKCkKKworIyBBZGQgc3ltYm9saWMgbGlua3MgdG8gbGlib21wCitpZihOT1QgV0lOMzIpCisgIGFkZF9jdXN0b21fY29tbWFuZChUQVJHRVQgb21wIFBPU1RfQlVJTEQKKyAgICBDT01NQU5EICR7Q01BS0VfQ09NTUFORH0gLUUgY3JlYXRlX3N5bWxpbmsgJHtMSUJPTVBfTElCX0ZJTEV9CisgICAgICBsaWJnb21wJHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9CisgICAgQ09NTUFORCAke0NNQUtFX0NPTU1BTkR9IC1FIGNyZWF0ZV9zeW1saW5rICR7TElCT01QX0xJQl9GSUxFfQorICAgICAgbGliaW9tcDUke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH0KKyAgICBXT1JLSU5HX0RJUkVDVE9SWSAke0xJQk9NUF9MSUJSQVJZX0RJUn0KKyAgKQorZW5kaWYoKQorCisjIExpbmtpbmcgY29tbWFuZCB3aWxsIGluY2x1ZGUgbGlicmFyaWVzIGluIExJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTCitsaWJvbXBfZ2V0X2xpYmZsYWdzKExJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTKQordGFyZ2V0X2xpbmtfbGlicmFyaWVzKG9tcCAke0xJQk9NUF9DT05GSUdVUkVEX0xJQkZMQUdTfSAke0NNQUtFX0RMX0xJQlN9KQorCisjIENyZWF0ZSAqLmluYyBiZWZvcmUgY29tcGlsaW5nIGFueSBzb3VyY2VzCisjIG9iamVjdHMgZGVwZW5kIG9uIDogLmluYyBmaWxlcworYWRkX2N1c3RvbV90YXJnZXQobGlib21wLW5lZWRlZC1oZWFkZXJzIERFUEVORFMga21wX2kxOG5faWQuaW5jIGttcF9pMThuX2RlZmF1bHQuaW5jKQorYWRkX2RlcGVuZGVuY2llcyhvbXAgbGlib21wLW5lZWRlZC1oZWFkZXJzKQorCisjIFdpbmRvd3Mgc3BlY2lmaWMgYnVpbGQgcnVsZXMKK2lmKFdJTjMyKQorICBjb25maWd1cmVfZmlsZShsaWJvbXAucmMudmFyIGxpYm9tcC5yYyBAT05MWSkKKworICAjIENyZWF0ZSAuZGVmIGFuZCAucmMgZmlsZSBiZWZvcmUgY29tcGlsaW5nIGFueSBzb3VyY2VzCisgIGFkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1uZWVkZWQtd2luZG93cy1maWxlcyBERVBFTkRTICR7TElCT01QX0xJQl9OQU1FfS5kZWYpCisgIGFkZF9kZXBlbmRlbmNpZXMob21wIGxpYm9tcC1uZWVkZWQtd2luZG93cy1maWxlcykKKyAgIyB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20gcmVxdWlyZXMgZGVmaW5pdGlvbnMgdG8gYmUgc2VudCB2aWEgY29tbWFuZCBsaW5lCisgICMgSXQgb25seSBuZWVkcyB0aGUgYXJjaGl0ZWN1dHJlIG1hY3JvIGFuZCBPTVBUX1NVUFBPUlQ9MHwxCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX01BU01fREVGSU5JVElPTlMgIi1EX01fSUEzMiIgSUZfVFJVRSBJQTMyKQorICBsaWJvbXBfYXBwZW5kKExJQk9NUF9NQVNNX0RFRklOSVRJT05TICItRF9NX0FNRDY0IiBJRl9UUlVFIElOVEVMNjQpCisgIGxpYm9tcF9hcHBlbmQoTElCT01QX01BU01fREVGSU5JVElPTlMgIi1ET01QVF9TVVBQT1JUIiBJRl9UUlVFXzFfMCBMSUJPTVBfT01QVF9TVVBQT1JUKQorICBsaWJvbXBfbGlzdF90b19zdHJpbmcoIiR7TElCT01QX01BU01fREVGSU5JVElPTlN9IiBMSUJPTVBfTUFTTV9ERUZJTklUSU9OUykKKyAgc2V0X3Byb3BlcnR5KFNPVVJDRSB6X1dpbmRvd3NfTlQtNTg2X2FzbS5hc20gQVBQRU5EX1NUUklORyBQUk9QRVJUWSBDT01QSUxFX0ZMQUdTICIgJHtMSUJPTVBfTUFTTV9ERUZJTklUSU9OU30iKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXModGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jIFBST1BFUlRJRVMgQ09NUElMRV9ERUZJTklUSU9OUyAiVU5JQ09ERSIpCisKKyAgIyBDcmVhdGUgV2luZG93cyBpbXBvcnQgbGlicmFyeQorICAjIHRoZSBpbXBvcnQgbGlicmFyeSBpcyAicmUtbGlua2VkIiB0byBpbmNsdWRlIGttcF9pbXBvcnQuYyB3aGljaCBwcmV2ZW50cworICAjIGxpbmtpbmcgb2YgYm90aCBWaXN1YWwgU3R1ZGlvIE9wZW5NUCBhbmQgbmV3bHkgYnVpbHQgT3Blbk1QCisgIHNldF9zb3VyY2VfZmlsZXNfcHJvcGVydGllcyhrbXBfaW1wb3J0LmMgUFJPUEVSVElFUyBDT01QSUxFX0ZMQUdTICIke0xJQk9NUF9DT05GSUdVUkVEX0NGTEFHU30iKQorICBzZXQoTElCT01QX0lNUF9MSUJfRklMRSAke0xJQk9NUF9MSUJfTkFNRX0ke0NNQUtFX1NUQVRJQ19MSUJSQVJZX1NVRkZJWH0pCisgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUUgJHtMSUJPTVBfTElCX0ZJTEV9JHtDTUFLRV9TVEFUSUNfTElCUkFSWV9TVUZGSVh9KQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21wIFBST1BFUlRJRVMKKyAgICBWRVJTSU9OICR7TElCT01QX1ZFUlNJT05fTUFKT1J9LiR7TElCT01QX1ZFUlNJT05fTUlOT1J9ICMgdXNlcyAvdmVyc2lvbiBmbGFnCisgICAgSU1QT1JUX1BSRUZJWCAiIiBJTVBPUlRfU1VGRklYICIiICMgY29udHJvbCBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgbmFtZSB3aGVuIGJ1aWxkaW5nIG9tcAorICAgIEFSQ0hJVkVfT1VUUFVUX05BTUUgJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJfRklMRU5BTUV9CisgICkKKyAgIyBHZXQgZ2VuZXJhdGVkIGltcG9ydCBsaWJyYXJ5IGZyb20gY3JlYXRpbmcgb21wCisgIGdldF90YXJnZXRfcHJvcGVydHkoTElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZIG9tcCBBUkNISVZFX09VVFBVVF9ESVJFQ1RPUlkpCisgIGlmKExJQk9NUF9JTVBPUlRfTElCX0RJUkVDVE9SWSkKKyAgICBzZXQoTElCT01QX0dFTkVSQVRFRF9JTVBfTElCICR7TElCT01QX0lNUE9SVF9MSUJfRElSRUNUT1JZfS8ke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQl9GSUxFTkFNRX0pCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUIgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0dFTkVSQVRFRF9JTVBfTElCX0ZJTEVOQU1FfSkKKyAgZW5kaWYoKQorICBzZXRfc291cmNlX2ZpbGVzX3Byb3BlcnRpZXMoJHtMSUJPTVBfR0VORVJBVEVEX0lNUF9MSUJ9IFBST1BFUlRJRVMgR0VORVJBVEVEIFRSVUUgRVhURVJOQUxfT0JKRUNUIFRSVUUpCisgICMgQ3JlYXRlIG5ldyBpbXBvcnQgbGlicmFyeSB0aGF0IGlzIGp1c3QgdGhlIHByZXZpb3VzbHkgY3JlYXRlZCBvbmUgKyBrbXBfaW1wb3J0LmMKKyAgYWRkX2xpYnJhcnkob21waW1wIFNUQVRJQyAke0xJQk9NUF9HRU5FUkFURURfSU1QX0xJQn0ga21wX2ltcG9ydC5jKQorICBzZXRfdGFyZ2V0X3Byb3BlcnRpZXMob21waW1wIFBST1BFUlRJRVMKKyAgICBQUkVGSVggIiIgU1VGRklYICIiIE9VVFBVVF9OQU1FICIke0xJQk9NUF9JTVBfTElCX0ZJTEV9IgorICAgIExJTktFUl9MQU5HVUFHRSBDCisgICkKKyAgYWRkX2RlcGVuZGVuY2llcyhvbXBpbXAgb21wKSAjIGVuc3VyZSBnZW5lcmF0ZWQgaW1wb3J0IGxpYnJhcnkgaXMgY3JlYXRlZCBmaXJzdAorCisgICMgQ3JlYXRlIGRlZiBmaWxlIHRvIGRlc2lnbmF0ZSBleHBvcnRlZCBmdW5jdGlvbnMKKyAgbGlib21wX2dldF9nZGZsYWdzKExJQk9NUF9HREZMQUdTKSAjIGdlbmVyYXRlLWRlZi5wbCBmbGFncyAoV2luZG93cyBvbmx5KQorICBsaWJvbXBfc3RyaW5nX3RvX2xpc3QoIiR7TElCT01QX0dERkxBR1N9IiBMSUJPTVBfR0RGTEFHUykKKyAgYWRkX2N1c3RvbV9jb21tYW5kKAorICAgIE9VVFBVVCAgJHtMSUJPTVBfTElCX05BTUV9LmRlZgorICAgIENPTU1BTkQgJHtQRVJMX0VYRUNVVEFCTEV9ICR7TElCT01QX1RPT0xTX0RJUn0vZ2VuZXJhdGUtZGVmLnBsICR7TElCT01QX0dERkxBR1N9CisgICAgICAtbyAke0xJQk9NUF9MSUJfTkFNRX0uZGVmICR7Q01BS0VfQ1VSUkVOVF9TT1VSQ0VfRElSfS9kbGxleHBvcnRzCisgICAgREVQRU5EUyAke0NNQUtFX0NVUlJFTlRfU09VUkNFX0RJUn0vZGxsZXhwb3J0cyAke0xJQk9NUF9UT09MU19ESVJ9L2dlbmVyYXRlLWRlZi5wbAorICApCitlbmRpZigpCisKKyMgQnVpbGRpbmcgdGhlIEZvcnRyYW4gbW9kdWxlIGZpbGVzCisjIE9uZSBjb21waWxhdGlvbiBzdGVwIGNyZWF0ZXMgYm90aCBvbXBfbGliLm1vZCBhbmQgb21wX2xpYl9raW5kcy5tb2QKK2lmKCR7TElCT01QX0ZPUlRSQU5fTU9EVUxFU30pCisgIGNvbmZpZ3VyZV9maWxlKCR7TElCT01QX0lOQ19ESVJ9L29tcF9saWIuaC52YXIgb21wX2xpYi5oIEBPTkxZKQorICBjb25maWd1cmVfZmlsZSgke0xJQk9NUF9JTkNfRElSfS9vbXBfbGliLmYudmFyIG9tcF9saWIuZiBAT05MWSkKKyAgY29uZmlndXJlX2ZpbGUoJHtMSUJPTVBfSU5DX0RJUn0vb21wX2xpYi5mOTAudmFyIG9tcF9saWIuZjkwIEBPTkxZKQorICBhZGRfY3VzdG9tX3RhcmdldChsaWJvbXAtbW9kIEFMTCBERVBFTkRTIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kKQorICBsaWJvbXBfZ2V0X2ZmbGFncyhMSUJPTVBfQ09ORklHVVJFRF9GRkxBR1MpCisgIGlmKENNQUtFX0ZvcnRyYW5fQ09NUElMRVJfU1VQUE9SVFNfRjkwKQorICAgIHNldChMSUJPTVBfRk9SVFJBTl9TT1VSQ0VfRklMRSBvbXBfbGliLmY5MCkKKyAgZWxzZSgpCisgICAgc2V0KExJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFIG9tcF9saWIuZikKKyAgZW5kaWYoKQorICBhZGRfY3VzdG9tX2NvbW1hbmQoCisgICAgT1VUUFVUIG9tcF9saWIubW9kIG9tcF9saWJfa2luZHMubW9kCisgICAgQ09NTUFORCAke0NNQUtFX0ZvcnRyYW5fQ09NUElMRVJ9IC1jICR7TElCT01QX0NPTkZJR1VSRURfRkZMQUdTfSAke0xJQk9NUF9GT1JUUkFOX1NPVVJDRV9GSUxFfQorICAgIERFUEVORFMgJHtDTUFLRV9DVVJSRU5UX0JJTkFSWV9ESVJ9LyR7TElCT01QX0ZPUlRSQU5fU09VUkNFX0ZJTEV9CisgICAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5oCisgICkKKyAgc2V0X2RpcmVjdG9yeV9wcm9wZXJ0aWVzKFBST1BFUlRJRVMgQURESVRJT05BTF9NQUtFX0NMRUFOX0ZJTEVTIG9tcF9saWIke0NNQUtFX0NfT1VUUFVUX0VYVEVOU0lPTn0pCitlbmRpZigpCisKKyMgTW92ZSBmaWxlcyB0byBleHBvcnRzLyBkaXJlY3RvcnkgaWYgcmVxdWVzdGVkCitpZigke0xJQk9NUF9DT1BZX0VYUE9SVFN9KQorICBpbmNsdWRlKExpYm9tcEV4cG9ydHMpCitlbmRpZigpCisKKyMgTWljcm8gdGVzdCBydWxlcyBmb3IgYWZ0ZXIgbGlicmFyeSBoYXMgYmVlbiBidWlsdCAoY21ha2UvTGlib21wTWljcm9UZXN0cy5jbWFrZSkKK2luY2x1ZGUoTGlib21wTWljcm9UZXN0cykKK2FkZF9jdXN0b21fdGFyZ2V0KGxpYm9tcC1taWNyby10ZXN0cykKK2lmKE5PVCAke01JQ30gQU5EIE5PVCBDTUFLRV9DUk9TU0NPTVBJTElORykKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtdG91Y2gpCitlbmRpZigpCitpZihOT1QgV0lOMzIgQU5EIE5PVCBBUFBMRSkKKyAgYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtcmVsbykKK2VuZGlmKCkKK2lmKE5PVCBXSU4zMiBBTkQgTk9UIEFQUExFKQorICBhZGRfZGVwZW5kZW5jaWVzKGxpYm9tcC1taWNyby10ZXN0cyBsaWJvbXAtdGVzdC1leGVjc3RhY2spCitlbmRpZigpCitpZigke01JQ30pCisgIGFkZF9kZXBlbmRlbmNpZXMobGlib21wLW1pY3JvLXRlc3RzIGxpYm9tcC10ZXN0LWluc3RyKQorZW5kaWYoKQorYWRkX2RlcGVuZGVuY2llcyhsaWJvbXAtbWljcm8tdGVzdHMgbGlib21wLXRlc3QtZGVwcykKKworIyBJbnN0YWxsIHJ1bGVzCisjIFdlIHdhbnQgdG8gaW5zdGFsbCBsaWJvbXAgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9saWIKKyMgV2Ugd2FudCB0byBpbnN0YWxsIGhlYWRlcnMgaW4gREVTVERJUi9DTUFLRV9JTlNUQUxMX1BSRUZJWC9pbmNsdWRlCitpZigke0xJQk9NUF9TVEFOREFMT05FX0JVSUxEfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBpbmNsdWRlKQorZWxzZSgpCisgIHN0cmluZyhSRUdFWCBNQVRDSCAiWzAtOV0rXFwuWzAtOV0rKFxcLlswLTldKyk/IiBDTEFOR19WRVJTSU9OICR7UEFDS0FHRV9WRVJTSU9OfSkKKyAgc2V0KExJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSCBsaWIke0xJQk9NUF9MSUJESVJfU1VGRklYfS9jbGFuZy8ke0NMQU5HX1ZFUlNJT059L2luY2x1ZGUpCitlbmRpZigpCitpZihXSU4zMikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcCBSVU5USU1FIERFU1RJTkFUSU9OIGJpbikKKyAgaW5zdGFsbChUQVJHRVRTIG9tcGltcCBBUkNISVZFIERFU1RJTkFUSU9OIGxpYiR7TElCT01QX0xJQkRJUl9TVUZGSVh9KQorICAjIENyZWF0ZSBhbGlhc2VzIChyZWd1bGFyIGNvcGllcykgb2YgdGhlIGxpYnJhcnkgZm9yIGJhY2t3YXJkcyBjb21wYXRpYmlsaXR5CisgIHNldChMSUJPTVBfQUxJQVNFUyAibGliaW9tcDVtZCIpCisgIGZvcmVhY2goYWxpYXMgSU4gTElTVFMgTElCT01QX0FMSUFTRVMpCisgICAgaW5zdGFsbChDT0RFICJleGVjdXRlX3Byb2Nlc3MoQ09NTUFORCBcIlwke0NNQUtFX0NPTU1BTkR9XCIgLUUgY29weSBcIiR7TElCT01QX0xJQl9GSUxFfVwiCisgICAgICBcIiR7YWxpYXN9JHtMSUJPTVBfTElCUkFSWV9TVUZGSVh9XCIgV09SS0lOR19ESVJFQ1RPUlkgXCR7Q01BS0VfSU5TVEFMTF9QUkVGSVh9L2JpbikiKQorICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNvcHkgXCIke0xJQk9NUF9JTVBfTElCX0ZJTEV9XCIKKyAgICAgIFwiJHthbGlhc30ke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH1cIiBXT1JLSU5HX0RJUkVDVE9SWSBcJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pIikKKyAgZW5kZm9yZWFjaCgpCitlbHNlKCkKKworICBpbnN0YWxsKFRBUkdFVFMgb21wICR7TElCT01QX0lOU1RBTExfS0lORH0gREVTVElOQVRJT04gbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pCisKKyAgIyBDcmVhdGUgYWxpYXNlcyAoc3ltbGlua3MpIG9mIHRoZSBsaWJyYXJ5IGZvciBiYWNrd2FyZHMgY29tcGF0aWJpbGl0eQorICBzZXQoTElCT01QX0FMSUFTRVMgImxpYmdvbXA7bGliaW9tcDUiKQorICBmb3JlYWNoKGFsaWFzIElOIExJU1RTIExJQk9NUF9BTElBU0VTKQorICAgIGluc3RhbGwoQ09ERSAiZXhlY3V0ZV9wcm9jZXNzKENPTU1BTkQgXCJcJHtDTUFLRV9DT01NQU5EfVwiIC1FIGNyZWF0ZV9zeW1saW5rIFwiJHtMSUJPTVBfTElCX0ZJTEV9XCIKKyAgICAgIFwiJHthbGlhc30ke0xJQk9NUF9MSUJSQVJZX1NVRkZJWH1cIiBXT1JLSU5HX0RJUkVDVE9SWQorICAgICAgXCRFTlZ7REVTVERJUn1cJHtDTUFLRV9JTlNUQUxMX1BSRUZJWH0vbGliJHtMSUJPTVBfTElCRElSX1NVRkZJWH0pIikKKyAgZW5kZm9yZWFjaCgpCitlbmRpZigpCitpbnN0YWxsKAorICBGSUxFUworICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wLmgKKyAgREVTVElOQVRJT04gJHtMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEh9CispCitpZigke0xJQk9NUF9PTVBUX1NVUFBPUlR9KQorICBpbnN0YWxsKEZJTEVTICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXB0LmggREVTVElOQVRJT04gJHtMSUJPTVBfSEVBREVSU19JTlNUQUxMX1BBVEh9KQorZW5kaWYoKQoraWYoJHtMSUJPTVBfRk9SVFJBTl9NT0RVTEVTfSkKKyAgaW5zdGFsbChGSUxFUworICAgICR7Q01BS0VfQ1VSUkVOVF9CSU5BUllfRElSfS9vbXBfbGliLmgKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYi5tb2QKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0vb21wX2xpYl9raW5kcy5tb2QKKyAgICBERVNUSU5BVElPTiAke0xJQk9NUF9IRUFERVJTX0lOU1RBTExfUEFUSH0KKyAgKQorZW5kaWYoKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvZGxsZXhwb3J0cyBiL3JjMy9ydW50aW1lL3NyYy9kbGxleHBvcnRzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZlMWY1ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvZGxsZXhwb3J0cwpAQCAtMCwwICsxLDEwMTAgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZXByZWNhdGVkIGVudHJ5IHBvaW50cyAobnVtYmVycyBhcmUgcmVzZXJ2ZWQpOgorLSBfX2ttcGNfYmFycmllcl9yZWR1Y2VfbWFzdGVyICAgICAgICAgICAgICAxMDkKKy0gX19rbXBjX2VuZF9iYXJyaWVyX3JlZHVjZV9tYXN0ZXIgICAgICAgICAgMTIyCistIF9fa21wY19mb3JfaW5pdF80ICAgICAgICAgICAgICAgICAgICAgICAgIDEzMQorLSBfX2ttcGNfZm9yX2luaXRfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMzIKKy0gX19rbXBjX2Zvcl9uZXh0XzQgICAgICAgICAgICAgICAgICAgICAgICAgMTMzCistIF9fa21wY19mb3JfbmV4dF84ICAgICAgICAgICAgICAgICAgICAgICAgIDEzNAorLSBfX2ttcGNfZm9ya19jYWxsX2JvdW5kICAgICAgICAgICAgICAgICAgICAxMzkKKy0gX19rbXBjX3JlZHVjZV9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgICAgMTQ5CistIF9fa21wY19vbXBfdGFza19iZWdpbiAgICAgICAgICAgICAgICAgICAgIDE5NAorLSBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUgICAgICAgICAgICAgICAgICAxOTUKKy0ga21wY19zaGFyYWJsZV9jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgMjE4CistIGttcGNfc2hhcmFibGVfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgIDIxOQorLSBrbXBjX3NoYXJhYmxlX21hbGxvYyAgICAgICAgICAgICAgICAgICAgICAyMjAKKy0ga21wY19zaGFyYWJsZV9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgMjIxCistIGttcGNfYWxpZ25lZF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgIDIyMworLSBtcGFpNGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDAKKy0gbXBhaThhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTAxCistIG1wYXI0YSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwMgorLSBtcGFyOGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDMKKy0gbXBheDR4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA0CistIG1wYXg4eCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwNQorLSBtcG9iYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDYKKy0gbXBvZWJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTA3CistIG1wb2ZvcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUwOAorLSBtcG9mcmsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MDkKKy0gbXBvam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEwCistIG1wb3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxMQorLSBtcHBhZGogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTIKKy0gbXBwYWZmICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTEzCistIG1wcGJhciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNAorLSBtcHBiZWcgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTUKKy0gbXBwZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE2CistIG1wcGRueCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUxNworLSBtcHBkbnhkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MTgKKy0gbXBwZG9uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTE5CistIG1wcGR4byAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMAorLSBtcHBlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjEKKy0gbXBwZWNzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTIyCistIG1wcGVtcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyMworLSBtcHBlbmMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjQKKy0gbXBwZW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI1CistIG1wcGVwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyNgorLSBtcHBlc3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MjcKKy0gbXBwZmtkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTI4CistIG1wcGZrdCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUyOQorLSBtcHBmb3JrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzAKKy0gbXBwZnJrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTMxCistIG1wcGlvYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzMgorLSBtcHBpd3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzMKKy0gbXBwam9pbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM0CistIG1wcG50aCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzNQorLSBtcHBwcWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzYKKy0gbXBwcHFjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTM3CistIG1wcHBxcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDUzOAorLSBtcHB0aWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1MzkKKy0gbXBwdHBhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQwCistIG1wcHRwYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0MQorLSBtcHB0cHogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDIKKy0gbXBwdnN5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQzCistIG1wcHhiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NAorLSBtcHB4Y3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDUKKy0gbXBweG1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ2CistIG1wcHhuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU0NworLSBtcHB4cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NDgKKy0gbXBweHByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTQ5CistIG1wcHhzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1MAorLSBtcHB4dGggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTEKKy0gbXBzYmFyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTUyCistIG1wc2NwciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NworLSBtcHNlYnIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTMKKy0gbXBzZXJkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU0CistIG1wc2ZkNCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1NQorLSBtcHNmZDggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTYKKy0gbXBzaWQ0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTU3CistIG1wc2lkOCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU1OAorLSBtcHNuZDQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NTkKKy0gbXBzbmQ4ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYwCistIG1wc29udCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2MQorLSBtcHNyZWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjIKKy0gbXBzdW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTYzCistIG1wc3hiciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NAorLSBtcHN4cmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjUKKy0gbXB0YWRqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY2CistIG1wdGFmZiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU2NworLSBtcHRiYXIgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NjgKKy0gbXB0ZGVvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTY5CistIG1wdGRpbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MAorLSBtcHRkaW5kICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzEKKy0gbXB0ZG54ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTcyCistIG1wdGRueGQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3MworLSBtcHRkb24gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzQKKy0gbXB0ZHhvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc1CistIG1wdGViciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3NgorLSBtcHRlY3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1NzcKKy0gbXB0ZW1zICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTc4CistIG1wdGVuYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU3OQorLSBtcHRlcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODAKKy0gbXB0ZXNwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTgxCistIG1wdGZrZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4MgorLSBtcHRwcGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODMKKy0gbXB0cHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg0CistIG1wdHBwcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4NQorLSBtcHR0cGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODYKKy0gbXB0dHBjICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTg3CistIG1wdHRweiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU4OAorLSBtcHR2c3kgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1ODkKKy0gbXB0eGJyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkwCistIG1wdHhjcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5MQorLSBtcHR4bXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTIKKy0gbXB0eG5jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTkzCistIG1wdHhwYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDU5NAorLSBtcHR4c3AgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA1OTUKKy0gbXBwY3ByICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNTk2CistIGZ0bl9zZXRfbGlicmFyeV9nYW5nICAgICAgICAgICAgICAgICAgICAgIDczNgorLSBrbXBfc2V0X2xpYnJhcnlfZ2FuZworLSBrbXBfc2hhcmFibGVfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICA3NjAKKy0ga21wX3NoYXJhYmxlX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgNzYxCistIGttcF9zaGFyYWJsZV9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgIDc2MgorLSBrbXBfc2hhcmFibGVfcmVhbGxvYyAgICAgICAgICAgICAgICAgICAgICA3NjMKKy0ga21wX2FsaWduZWRfc2hhcmFibGVfbWFsbG9jICAgICAgICAgICAgICAgNzY0CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX2k0ICAgICAgICAgICAgICAgIDc2NQorLSBrbXBfZGVmZXJyZWRfYXRvbWljX2FkZF9pOCAgICAgICAgICAgICAgICA3NjYKKy0ga21wX2RlZmVycmVkX2F0b21pY19hZGRfcjQgICAgICAgICAgICAgICAgNzY3CistIGttcF9kZWZlcnJlZF9hdG9taWNfYWRkX3I4ICAgICAgICAgICAgICAgIDc2OAorLSBrbXBfbG9ja19jb25kX3dhaXQgICAgICAgICAgICAgICAgICAgICAgICA3NzAKKy0ga21wX2xvY2tfY29uZF9zaWduYWwgICAgICAgICAgICAgICAgICAgICAgNzcxCistIGttcF9sb2NrX2NvbmRfYnJvYWRjYXN0ICAgICAgICAgICAgICAgICAgIDc3MgorLSBrbXBfbmVzdF9sb2NrX2NvbmRfd2FpdCAgICAgICAgICAgICAgICAgICA3NzMKKy0ga21wX25lc3RfbG9ja19jb25kX3NpZ25hbCAgICAgICAgICAgICAgICAgNzc0CistIGttcF9uZXN0X2xvY2tfY29uZF9icm9hZGNhc3QgICAgICAgICAgICAgIDc3NQorLSBrbXBfZ2V0X3Byb2Nlc3NfbnVtICAgICAgICAgICAgICAgICAgICAgICA3ODEKKy0ga21wX2dldF9udW1fcHJvY2Vzc2VzICAgICAgICAgICAgICAgICAgICAgNzgyCistIGttcF9nZXRfcHJvY2Vzc190aHJlYWRfbnVtICAgICAgICAgICAgICAgIDc4MworLSBrbXBfcHJpdmF0ZV9tbWFwICAgICAgICAgICAgICAgICAgICAgICAgICA3ODQgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX3NoYXJhYmxlX21tYXAgICAgICAgICAgICAgICAgICAgICAgICAgNzg1ICAgIyBub3QgaW1wbGVtZW50ZWQ/CistIGttcF9wcml2YXRlX211bm1hcCAgICAgICAgICAgICAgICAgICAgICAgIDc4NiAgICMgbm90IGltcGxlbWVudGVkPworLSBrbXBfc2hhcmFibGVfbXVubWFwICAgICAgICAgICAgICAgICAgICAgICA3ODcgICAjIG5vdCBpbXBsZW1lbnRlZD8KKy0ga21wX2lzX3NoYXJhYmxlICAgICAgICAgICAgICAgICAgICAgICAgICAgNzg4ICAgIyBub3QgaW1wbGVtZW50ZWQ/CisKKyVpZm5kZWYgc3R1YgorCisKKyAgICAjCisgICAgIyBUaGUgZm9sbG93aW5nIGVudHJ5IHBvaW50cyBhcmUgYWRkZWQgc28gdGhhdCB0aGUgYmFja3RyYWNlcyBmcm9tCisgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgIyBhcHBlYXIgaW4gYSBiYWNrdHJhY2Ugb2YgYSB0aHJlYWQgd2hpY2ggaXMgYmxvY2tlZCBpbiB0aGUgUlRMLgorICAgICMKKworICAgICMgUmVndWxhciBlbnRyeSBwb2ludHMKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbAorICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisgICAgICAgIF9fa21wX2xhdW5jaF9tb25pdG9yCisgICAgICAgIF9fa21wX2xhdW5jaF93b3JrZXIKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyCisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2sKKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrCisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX2RyZHBhX2xvY2sKKworICAgICVpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgIyBhbGxvd3MgY29uc29sZSBvdXRwdXQgY2FwYWJpbGl0eSBmb3IgYXBwbGljYXRpb25zIHRob3NlIGRvbid0IGhhdmUgaXQKKyAgICAgICAgX19rbXBfcHJpbnRmCisgICAgJWVuZGlmCisKKworICAgICVpZmRlZiBVU0VfREVCVUdHRVIKKyAgICAgICAgX19rbXBfZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgIERBVEEKKyAgICAgICAgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvICAgICAgICAgICAgIERBVEEKKyAgICAlZW5kaWYKKworICAgICMgU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbjoKKyAgICBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ICAgIERBVEEKKyAgICBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgICAgIERBVEEKKyAgICAlaWZkZWYgbXN2Y19jb21wYXQKKyAgICAgICAgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnkgIERBVEEKKyAgICAlZW5kaWYKKworICAgIF9fa21wX3dhaXRfNjQKKyAgICBfX2ttcF9yZWxlYXNlXzY0CisKKworIyAgICBWVF9nZXR0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMQorIyAgICB2dGd0aGlkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMgorCisgICAgX19rbXBjX2F0b21pY180ICAgICAgICAgICAgICAgICAgICAgICAgIDEwMAorICAgIF9fa21wY19hdG9taWNfOCAgICAgICAgICAgICAgICAgICAgICAgICAxMDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQgICAgICAgICAgICAgICAgMTAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkICAgICAgICAgICAgICAgIDEwMworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZCAgICAgICAgICAgICAgICAxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQgICAgICAgICAgICAgICAgMTA1CisgICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAgICAgICAgICAgICAgIDEwNgorICAgIF9fa21wY19iYXJyaWVyX21hc3RlciAgICAgICAgICAgICAgICAgICAxMDcKKyAgICBfX2ttcGNfYmFycmllcl9tYXN0ZXJfbm93YWl0ICAgICAgICAgICAgMTA4CisgICAgX19rbXBjX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgICAgIDExMAorICAgIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAxMTEKKyAgICBfX2ttcGNfYm91bmRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgMTEyCisgICAgX19rbXBjX2NyaXRpY2FsICAgICAgICAgICAgICAgICAgICAgICAgIDExMworICAgIF9fa21wY19kaXNwYXRjaF9maW5pXzQgICAgICAgICAgICAgICAgICAxMTQKKyAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84ICAgICAgICAgICAgICAgICAgMTE1CisgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfNCAgICAgICAgICAgICAgICAgIDExNgorICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzggICAgICAgICAgICAgICAgICAxMTcKKyAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80ICAgICAgICAgICAgICAgICAgMTE4CisgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOCAgICAgICAgICAgICAgICAgIDExOQorICAgIF9fa21wY19lbmQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjAKKyAgICBfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyICAgICAgICAgICAgICAgMTIxCisgICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAgICAgICAgICAgICAgIDEyMworICAgIF9fa21wY19lbmRfbWFzdGVyICAgICAgICAgICAgICAgICAgICAgICAxMjQKKyAgICBfX2ttcGNfZW5kX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgMTI1CisgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsICAgICAgICAgIDEyNgorICAgIF9fa21wY19lbmRfc2luZ2xlICAgICAgICAgICAgICAgICAgICAgICAxMjcKKyAgICBfX2ttcGNfZW5kX3Rhc2txICAgICAgICAgICAgICAgICAgICAgICAgMTI4CisgICAgX19rbXBjX2VuZF90YXNrcV90YXNrICAgICAgICAgICAgICAgICAgIDEyOQorICAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMzAKKyAgICBfX2ttcGNfZm9yX3N0YXRpY19maW5pICAgICAgICAgICAgICAgICAgMTM1CisgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80ICAgICAgICAgICAgICAgIDEzNgorICAgIF9fa21wY19mb3Jfc3RhdGljX2luaXRfOCAgICAgICAgICAgICAgICAxMzcKKyAgICBfX2ttcGNfZm9ya19jYWxsICAgICAgICAgICAgICAgICAgICAgICAgMTM4CisgICAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgIDE0MAorICAgIF9fa21wY19nbG9iYWxfdGhyZWFkX251bSAgICAgICAgICAgICAgICAxNDEKKyAgICBfX2ttcGNfaW5fcGFyYWxsZWwgICAgICAgICAgICAgICAgICAgICAgMTQyCisgICAgX19rbXBjX2ludm9rZV90YXNrX2Z1bmMgICAgICAgICAgICAgICAgIDE0MworICAgIF9fa21wY19tYXN0ZXIgICAgICAgICAgICAgICAgICAgICAgICAgICAxNDQKKyAgICBfX2ttcGNfb2tfdG9fZm9yayAgICAgICAgICAgICAgICAgICAgICAgMTQ1CisgICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAgICAgICAgICAgICAgIDE0NgorICAgIF9fa21wY19wb3BfbnVtX3RocmVhZHMgICAgICAgICAgICAgICAgICAxNDcKKyAgICBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgMTQ4CisgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwgICAgICAgICAgICAgIDE1MAorICAgIF9fa21wY19zaW5nbGUgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTEKKyAgICBfX2ttcGNfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTUyCisgICAgX19rbXBjX3Rhc2tfYnVmZmVyICAgICAgICAgICAgICAgICAgICAgIDE1MworICAgIF9fa21wY190YXNrcSAgICAgICAgICAgICAgICAgICAgICAgICAgICAxNTQKKyAgICBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgICAgICAgICAgICAgICAgMTU1CisgICAgX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICAgICAgIDE1NgorICAgIF9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZCAgICAgICAgICAgICAxNTcKKyAgICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlciAgICAgICAgICAgMTU4CisgICAgX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjICAgICAgIDE1OQorIyAgICBfX2ttcGNfc3NwX2JlZ2luICAgICAgICAgICAgICAgICAgICAgICAgMTYwCisjICAgIF9fa21wY19zc3BfZm9yayAgICAgICAgICAgICAgICAgICAgICAgICAxNjEKKyMgICAgX19rbXBjX3NzcF9lbmQgICAgICAgICAgICAgICAgICAgICAgICAgIDE2MgorIyAgICBfX2ttcGNfc3NwX3Bvc3RfNCAgICAgICAgICAgICAgICAgICAgICAgMTYzCisjICAgIF9fa21wY19zc3BfcG9zdF84ICAgICAgICAgICAgICAgICAgICAgICAxNjQKKyMgICAgX19rbXBjX3NzcF93YWl0XzQgICAgICAgICAgICAgICAgICAgICAgIDE2NQorIyAgICBfX2ttcGNfc3NwX3dhaXRfOCAgICAgICAgICAgICAgICAgICAgICAgMTY2CisjICAgIF9fa21wY19zc3BfZGlzdGFuY2VfNCAgICAgICAgICAgICAgICAgICAxNjcKKyMgICAgX19rbXBjX3NzcF9kaXN0YW5jZV84ICAgICAgICAgICAgICAgICAgIDE2OAorIyAgICBfX2ttcGNfaW5fc3NwICAgICAgICAgICAgICAgICAgICAgICAgICAgMTY5CisjICAgIF9fa21wY19zc3BfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAxNzAKKyMgICAgX19rbXBjX3NzcF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgIDE3MQorICAgIF9fa21wY19jb3B5cHJpdmF0ZSAgICAgICAgICAgICAgICAgICAgICAxNzIKKyMgICAgX19rbXBjX3NzcF9nZXRfbWF4X3RocmVhZHMgICAgICAgICAgICAgIDE3MworIyAgICBfX2ttcGNfc3NwX3NldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgMTc0CisgICAgX19rbXBjX2luaXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgIDE3NQorICAgIF9fa21wY19kZXN0cm95X2xvY2sgICAgICAgICAgICAgICAgICAgICAxNzYKKyAgICBfX2ttcGNfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgMTc3CisgICAgX19rbXBjX3Vuc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgIDE3OAorICAgIF9fa21wY190ZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAxNzkKKyAgICBfX2ttcGNfaW5pdF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgMTgwCisgICAgX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrICAgICAgICAgICAgICAgIDE4MQorICAgIF9fa21wY19zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAxODIKKyAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgMTgzCisgICAgX19rbXBjX3Rlc3RfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgIDE4NAorIyAgICBfX2ttcGNfc3NwX2luaXRfdGhyZWFkICAgICAgICAgICAgICAgICAgMTg1CisjICAgIF9fa21wY19zc3Bfc2V0X2V2ZW50ICAgICAgICAgICAgICAgICAgICAxODYKKyAgICBfX2ttcGNfcmVkdWNlX25vd2FpdCAgICAgICAgICAgICAgICAgICAgMTg3CisgICAgX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0ICAgICAgICAgICAgICAgIDE4OAorICAgIF9fa21wY19yZWR1Y2UgICAgICAgICAgICAgICAgICAgICAgICAgICAxODkKKyAgICBfX2ttcGNfZW5kX3JlZHVjZSAgICAgICAgICAgICAgICAgICAgICAgMTkwCisKKyMgT3Blbk1QIDMuMAorCislaWZkZWYgT01QXzMwCisgICAgX19rbXBjX29tcF90YXNrX2FsbG9jICAgICAgICAgICAgICAgICAgIDE5MQorICAgIF9fa21wY19vbXBfdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAxOTIKKyAgICBfX2ttcGNfb21wX3Rhc2t3YWl0ICAgICAgICAgICAgICAgICAgICAgMTkzCisgICAgX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCAgICAgICAgICAgICAgIDE5NgorICAgIF9fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAgICAgICAgICAgICAxOTcKKyAgICBfX2ttcGNfb21wX3Rhc2tfcGFydHMgICAgICAgICAgICAgICAgICAgMTk4CislZW5kaWYgIyBPTVBfMzAKKworIyAgIF9fb21wX2NvbGxlY3Rvcl9hcGkgICAgICAgICAgICAgICAgICAxOTkKKworICAgICMgVGhlc2UgZnVuY3Rpb25zIGFyZSBmb3IgdGVzdGluZyBwdXJwb3Nlcy4gVGhlcmUgaXMgbm8gbmVlZCBpbiBzdGFibGUgb3JkaW5hbCBudW1iZXI6CisgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QKKworJWVuZGlmICAjIG5vdCBkZWZpbmVkIHN0dWIKKwora21wY19jYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMDAKK2ttcGNfZnJlZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjAxCislaWZuZGVmIHN0dWIKKyAgICAjIFRoZXNlIGZ1bmN0aW9ucyBhcmUgZXhwb3J0ZWQgZnJvbSBsaWJndWlkZSwgYnV0IGRlY2xhcmVkIG5laXRoZXIgaW4gb21wLmggbm90IGluIG9tcF9saWIuaC4KKyMgICAga21wY19nZXRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAgIDIwMgorIyAgICBrbXBjX2dldF9wb29sbW9kZSAgICAgICAgICAgICAgICAgICAgICAgMjAzCisjICAgIGttcGNfZ2V0X3Bvb2xzaXplICAgICAgICAgICAgICAgICAgICAgICAyMDQKKyMgICAga21wY19nZXRfcG9vbHN0YXQgICAgICAgICAgICAgICAgICAgICAgIDIwNQorIyAgICBrbXBjX3Bvb2xwcmludCAgICAgICAgICAgICAgICAgICAgICAgICAgMjA3CisjICAgIGttcGNfcHJpbnRfYmFubmVyICAgICAgICAgICAgICAgICAgICAgICAyMDgKKyMgICAga21wY19zZXRfcG9vbG1vZGUgICAgICAgICAgICAgICAgICAgICAgIDIxNAorIyAgICBrbXBjX3NldF9wb29sc2l6ZSAgICAgICAgICAgICAgICAgICAgICAgMjE1CislZW5kaWYKK2ttcGNfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjA2CitrbXBjX3JlYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDIwOQora21wY19zZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAyMTEKK2ttcGNfc2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgMjEyCisjIGttcGNfc2V0X3BhcmFsbGVsX25hbWUgICAgICAgICAgICAgICAgICAgICAgMjEzCitrbXBjX3NldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgIDIxNgora21wY19zZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAyMjIKKyMga21wY19zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyMTcKK2ttcGNfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgMjI0CisKKyMgT01QIDMuMCBlbnRyeSBwb2ludHMgZm9yIHVuc2lnbmVkIGxvb3AgaXRlcmF0aW9uIHZhcmlhYmxlcworJWlmbmRlZiBzdHViCisgICAgJWlmZGVmIE9NUF8zMAorICAgICAgICBfX2ttcGNfZm9yX3N0YXRpY19pbml0Xzh1ICAgICAgICAgICAyMjUKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2luaXRfOHUgICAgICAgICAgICAgMjI2CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0Xzh1ICAgICAgICAgICAgIDIyNworICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSAgICAgICAgICAgICAyMjgKKyAgICAgICAgX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF80dSAgICAgICAgICAgMjI5CisgICAgICAgIF9fa21wY19kaXNwYXRjaF9pbml0XzR1ICAgICAgICAgICAgIDIzMAorICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80dSAgICAgICAgICAgICAyMzEKKyAgICAgICAgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUgICAgICAgICAgICAgMjMyCisgICAgJWVuZGlmICMgT01QXzMwCislZW5kaWYKKworJWlmbmRlZiBzdHViCisgICAgX19rbXBjX2dldF90YXNraWQgICAgICAgICAgICAgICAgICAgICAgIDIzMworICAgIF9fa21wY19nZXRfcGFyZW50X3Rhc2tpZCAgICAgICAgICAgICAgICAyMzQKKyVlbmRpZgorCisjIE9wZW5NUCAzLjEgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzMwCisgICAgICAgIF9fa21wY19vbXBfdGFza3lpZWxkICAgICAgICAgICAgICAgIDIzNQorICAgICVlbmRpZiAjIE9NUF8zMAorICAgIF9fa21wY19wbGFjZV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAyMzYKKyVlbmRpZgorCisjIE9wZW5NUCA0LjAgZW50cnkgcG9pbnRzCislaWZuZGVmIHN0dWIKKyAgICAlaWZkZWYgT01QXzQwCisgICAgICAgIF9fa21wY19wdXNoX3Byb2NfYmluZCAgICAgICAgICAgICAgIDIzNworICAgICAgICBfX2ttcGNfdGFza2dyb3VwICAgICAgICAgICAgICAgICAgICAyMzgKKyAgICAgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAgICAgICAgICAgICAgICAgMjM5CisgICAgICAgIF9fa21wY19wdXNoX251bV90ZWFtcyAgICAgICAgICAgICAgIDI0MAorICAgICAgICBfX2ttcGNfZm9ya190ZWFtcyAgICAgICAgICAgICAgICAgICAyNDEKKyAgICAgICAgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAgICAgICAgICAgMjQyCisgICAgICAgIF9fa21wY19vbXBfd2FpdF9kZXBzICAgICAgICAgICAgICAgIDI0MworICAgICAgICBfX2ttcGNfY2FuY2VsICAgICAgICAgICAgICAgICAgICAgICAyNDQKKyAgICAgICAgX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50ICAgICAgICAgICAgMjQ1CisgICAgICAgIF9fa21wY19jYW5jZWxfYmFycmllciAgICAgICAgICAgICAgIDI0NgorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfNCAgICAgICAyNDcKKyAgICAgICAgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzR1ICAgICAgMjQ4CisgICAgICAgIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF84ICAgICAgIDI0OQorICAgICAgICBfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXRfOHUgICAgICAyNTAKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80ICAgICAgICAgMjUxCisgICAgICAgIF9fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUgICAgICAgIDI1MgorICAgICAgICBfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0XzggICAgICAgICAyNTMKKyAgICAgICAgX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF84dSAgICAgICAgMjU0CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQgICAgICAgICAgIDI1NQorICAgICAgICBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80dSAgICAgICAgICAyNTYKKyAgICAgICAgX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOCAgICAgICAgICAgMjU3CisgICAgICAgIF9fa21wY190ZWFtX3N0YXRpY19pbml0Xzh1ICAgICAgICAgIDI1OAorICAgICVlbmRpZiAjIE9NUF80MAorJWVuZGlmCisKKyMgT3Blbk1QIDQuNSBlbnRyeSBwb2ludHMKKyVpZm5kZWYgc3R1YgorICAgICVpZmRlZiBPTVBfNDUKKyAgICAgICAgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkICAgICAgICAgMjU5CisgICAgICAgIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZF9vb28gICAgIDI2MAorICAgICAgICBfX2ttcGNfZG9hY3Jvc3NfaW5pdCAgICAgICAgICAgICAgICAyNjEKKyAgICAgICAgX19rbXBjX2RvYWNyb3NzX3dhaXQgICAgICAgICAgICAgICAgMjYyCisgICAgICAgIF9fa21wY19kb2Fjcm9zc19wb3N0ICAgICAgICAgICAgICAgIDI2MworICAgICAgICBfX2ttcGNfZG9hY3Jvc3NfZmluaSAgICAgICAgICAgICAgICAyNjQKKyAgICAgICAgX19rbXBjX3Rhc2tsb29wICAgICAgICAgICAgICAgICAgICAgMjY2CisgICAgJWVuZGlmCislZW5kaWYKK2ttcGNfYWxpZ25lZF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgMjY1CitrbXBjX3NldF9kaXNwX251bV9idWZmZXJzICAgICAgICAgICAgICAgICAgIDI2NworCisjIFVzZXIgQVBJIGVudHJ5IHBvaW50cyB0aGF0IGhhdmUgYm90aCBsb3dlci0gYW5kIHVwcGVyLSBjYXNlIHZlcnNpb25zIGZvciBGb3J0cmFuLgorIyBOdW1iZXIgZm9yIGxvd2VyY2FzZSB2ZXJzaW9uIGlzIGluZGljYXRlZC4gIE51bWJlciBmb3IgdXBwZXJjYXNlIGlzIG9idGFpbmVkIGJ5IGFkZGluZyAxMDAwLgorIyBVc2VyIEFQSSBlbnRyeSBwb2ludHMgYXJlIGVudHJ5IHBvaW50cyB0aGF0IHN0YXJ0IHdpdGggJ2ttcF8nIG9yICdvbXBfJy4KKworb21wX2Rlc3Ryb3lfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDAKK29tcF9kZXN0cm95X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgNzAxCitvbXBfZ2V0X2R5bmFtaWMgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwMgorb21wX2dldF9tYXhfdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDMKK29tcF9nZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzA0CitvbXBfZ2V0X251bV9wcm9jcyAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwNQorb21wX2dldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgICA3MDYKK29tcF9nZXRfdGhyZWFkX251bSAgICAgICAgICAgICAgICAgICAgICAgICAgNzA3CitvbXBfZ2V0X3d0aWNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcwOAorb21wX2dldF93dGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MDkKK29tcF9pbl9wYXJhbGxlbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEwCitvbXBfaW5pdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxMQorb21wX2luaXRfbmVzdF9sb2NrICAgICAgICAgICAgICAgICAgICAgICAgICA3MTIKK29tcF9zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzEzCitvbXBfc2V0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcxNAorb21wX3NldF9uZXN0X2xvY2sgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTUKK29tcF9zZXRfbmVzdGVkICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzE2CitvbXBfc2V0X251bV90aHJlYWRzICAgICAgICAgICAgICAgICAgICAgICAgIDcxNworb21wX3Rlc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MTgKK29tcF90ZXN0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgNzE5CitvbXBfdW5zZXRfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyMAorb21wX3Vuc2V0X25lc3RfbG9jayAgICAgICAgICAgICAgICAgICAgICAgICA3MjEKKworb21wY19zZXRfZHluYW1pYyAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjIKK29tcGNfc2V0X25lc3RlZCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzIzCitvbXBjX3NldF9udW1fdGhyZWFkcyAgICAgICAgICAgICAgICAgICAgICAgIDcyNAorCitrbXBfY2FsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyNQora21wX2ZyZWUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjYKK2ttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICAgICAgICAgICAgICAgICAgNzI3CitrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcyOAora21wX2dldF9zdGFja3NpemUgICAgICAgICAgICAgICAgICAgICAgICAgICA3MjkKK2ttcF9tYWxsb2MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMwCisja21wX3ByaW50X2Jhbm5lciAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzEKK2ttcF9yZWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzMyCitrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgICAgICAgICAgICAgICAgIDczNAora21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3MzUKK2ttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICAgICAgICAgICAgICAgICAgNzM3CitrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAgICAgICAgICAgICAgICAgIDczOAora21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgICAgICAgICAgICAgICAgICA3MzkKKyMga21wX3NldF9wYXJhbGxlbF9uYW1lICAgICAgICAgICAgICAgICAgICAgICA3NDAKK2ttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQxCisjIGttcF9zZXRfc3RhdHMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNzQyCitrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzICAgICAgICAgICAgICAgICAgIDc0Mwora21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICAgICAgICAgICAgICAgICA3NDQKK2ttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICAgICAgICAgICAgICAgICAgNzQ1CitrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc0Ngora21wX2FsaWduZWRfbWFsbG9jICAgICAgICAgICAgICAgICAgICAgICAgICA3NDcKK2ttcF9zZXRfd2FybmluZ3Nfb24gICAgICAgICAgICAgICAgICAgICAgICAgNzc5CitrbXBfc2V0X3dhcm5pbmdzX29mZiAgICAgICAgICAgICAgICAgICAgICAgIDc4MAorCislaWZkZWYgT01QXzMwCisgICAgb21wX2dldF9hY3RpdmVfbGV2ZWwgICAgICAgICAgICAgICAgICAgIDc4OQorICAgIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAgICAgICAgICAgICA3OTAKKyAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gICAgICAgICAgICAgNzkxCisgICAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgICAgICAgICAgICAgIDc5MgorICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0ICAgICAgICAgICAgICAgICAgICA3OTMKKyAgICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgICAgICAgICAgICAgNzk0CisgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICAgICAgICAgICAgIDc5NQorICAgIG9tcF9nZXRfc2NoZWR1bGUgICAgICAgICAgICAgICAgICAgICAgICA3OTYKKyAgICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICAgNzk3CisgICAgb21wY19zZXRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgICAgICAgIDc5OAorICAgIG9tcGNfc2V0X3NjaGVkdWxlICAgICAgICAgICAgICAgICAgICAgICA3OTkKKyAgICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICAgICAgICAgICAgODAwCisgICAgb21wY19nZXRfdGVhbV9zaXplICAgICAgICAgICAgICAgICAgICAgIDgwMQorICAgIGttcF9zZXRfYWZmaW5pdHkgICAgICAgICAgICAgICAgICAgICAgICA4NTAKKyAgICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgICAgICAgICAgICAgODUxCisgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAgICAgICAgICAgIDg1MgorICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgICAgICAgICAgICA4NTMKKyAgICBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICAgICAgICAgICAgICAgODU0CisgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgIDg1NQorICAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgICAgICAgICAgICA4NTYKKyAgICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgODU3CisgICAga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgIDg1OAorICAgIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgICAgICAgICAgICA4NTkKKyAgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICAgICAgICAgICAgODYwCislZW5kaWYgIyBPTVBfMzAKKworIyBPcGVuTVAgMy4xCisKKyVpZmRlZiBPTVBfMzAKKyAgICBvbXBfaW5fZmluYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgODYxCislZW5kaWYgIyBPTVBfMzAKKworIyBPcGVuTVAgNDAKKworJWlmZGVmIE9NUF80MAorICAgIG9tcF9nZXRfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgICA4NjIKKyAgICNvbXBfc2V0X3Byb2NfYmluZCAgICAgICAgICAgICAgICAgICAgICAgODYzCisgICAjb21wX2N1cnJfcHJvY19iaW5kICAgICAgICAgICAgICAgICAgICAgIDg2NAorICAgIG9tcF9nZXRfbnVtX3RlYW1zICAgICAgICAgICAgICAgICAgICAgICA4NjUKKyAgICBvbXBfZ2V0X3RlYW1fbnVtICAgICAgICAgICAgICAgICAgICAgICAgODY2CisgICAgb21wX2dldF9jYW5jZWxsYXRpb24gICAgICAgICAgICAgICAgICAgIDg2NworICAgIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyAgICAgICAgICAgICA4NjgKKyAgICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgICAgICAgICAgICAgICAgICAgODY5CisgICAgJWlmZGVmIHN0dWIKKyAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZSAgICAgICAgICAgICAgODc5CisgICAgICAgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UgICAgICAgICAgICAgIDg4MAorICAgICAgICBvbXBfZ2V0X251bV9kZXZpY2VzICAgICAgICAgICAgICAgICA4ODEKKyAgICAlZW5kaWYKKyVlbmRpZiAjIE9NUF80MAorCisjIE9wZW5NUCA0NQorCislaWZkZWYgT01QXzQ1CisgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnQgICAgICAgICAgICAgICAgIDg3MAorICAgIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgICAgICAgICAgICA4NzEKKyAgICBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5ICAgICAgICAgICAgICAgODcyCisgICAgb21wX2dldF9udW1fcGxhY2VzICAgICAgICAgICAgICAgICAgICAgIDg3MworICAgIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzICAgICAgICAgICAgICAgICA4NzQKKyAgICBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzICAgICAgICAgICAgICAgICAgODc1CisgICAgb21wX2dldF9wbGFjZV9udW0gICAgICAgICAgICAgICAgICAgICAgIDg3NgorICAgIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMgICAgICAgICAgICA4NzcKKyAgICBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zICAgICAgICAgICAgODc4CisgICAgJWlmZGVmIHN0dWIKKyAgICAgICAgb21wX2dldF9pbml0aWFsX2RldmljZSAgICAgICAgICAgICAgODgyCisgICAgICAgIG9tcF90YXJnZXRfYWxsb2MgICAgICAgICAgICAgICAgICAgIDg4MworICAgICAgICBvbXBfdGFyZ2V0X2ZyZWUgICAgICAgICAgICAgICAgICAgICA4ODQKKyAgICAgICAgb21wX3RhcmdldF9pc19wcmVzZW50ICAgICAgICAgICAgICAgODg1CisgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5ICAgICAgICAgICAgICAgICAgIDg4NgorICAgICAgICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0ICAgICAgICAgICAgICA4ODcKKyAgICAgICAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyICAgICAgICAgICAgODg4CisgICAgICAgIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0ciAgICAgICAgIDg4OQorICAgICVlbmRpZgorJWVuZGlmICMgT01QXzQ1CisKK2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycyAgICAgICAgICAgICAgICAgICAgODkwCisKKyVpZm5kZWYgc3R1YgorICAgICMgT3JkaW5hbHMgYmV0d2VlbiA5MDAgYW5kIDk5OSBhcmUgcmVzZXJ2ZWQKKworICAgICMgT3JkaW5hbHMgYmV0d2VlbiAxMDAwIGFuZCAxOTk5IGFyZSByZXNlcnZlZAorICAgICMgZm9yIHVzZXItY2FsbGFibGUgdXBwZXJjYXNlIEZvcnRyYW4gZW50cmllcy4KKworCisgICAgIyBBVE9NSUMgZW50cmllcworCisgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYgICAgICAgICAgICAgIDIwMDAKKyAgICAlZW5kaWYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZCAgICAgICAgICAgICAgIDIwMDEKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiICAgICAgICAgICAgICAyMDAyCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZGl2ICAgICAgICAgICAgICAgMjAwMworICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXYgICAgICAgICAgICAgIDIwMDQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWwgICAgICAgICAgICAgICAyMDA1CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JiICAgICAgICAgICAgICAgMjAwNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobCAgICAgICAgICAgICAgIDIwMDcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHIgICAgICAgICAgICAgICAyMDA4CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3NociAgICAgICAgICAgICAgMjAwOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3N1YiAgICAgICAgICAgICAgIDIwMTAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IgICAgICAgICAgICAgICAyMDExCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQgICAgICAgICAgICAgICAyMDEyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYiAgICAgICAgICAgICAgMjAxMworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2RpdiAgICAgICAgICAgICAgIDIwMTQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2ICAgICAgICAgICAgICAyMDE1CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsICAgICAgICAgICAgICAgMjAxNgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYiAgICAgICAgICAgICAgIDIwMTcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwgICAgICAgICAgICAgICAyMDE4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyICAgICAgICAgICAgICAgMjAxOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIgICAgICAgICAgICAgIDIwMjAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIgICAgICAgICAgICAgICAyMDIxCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfeG9yICAgICAgICAgICAgICAgMjAyMgorCisgICAjX19rbXBjX2F0b21pY19maXhlZDRfYWRkICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWIgICAgICAgICAgICAgICAyMDI0CisgICAjX19rbXBjX2F0b21pY19mbG9hdDRfYWRkICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIgICAgICAgICAgICAgICAyMDI2CisgICAjX19rbXBjX2F0b21pY19maXhlZDhfYWRkICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIgICAgICAgICAgICAgICAyMDI4CisgICAjX19rbXBjX2F0b21pY19mbG9hdDhfYWRkICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIgICAgICAgICAgICAgICAyMDMwCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiICAgICAgICAgICAgICAyMDMxCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2ICAgICAgICAgICAgICAgMjAzMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYgICAgICAgICAgICAgIDIwMzMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwgICAgICAgICAgICAgICAyMDM0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiICAgICAgICAgICAgICAgMjAzNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobCAgICAgICAgICAgICAgIDIwMzYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIgICAgICAgICAgICAgICAyMDM3CisgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3NociAgICAgICAgICAgICAgMjAzOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvciAgICAgICAgICAgICAgIDIwMzkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiICAgICAgICAgICAgICAyMDQwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2ICAgICAgICAgICAgICAgMjA0MQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXYgICAgICAgICAgICAgIDIwNDIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwgICAgICAgICAgICAgICAyMDQzCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiICAgICAgICAgICAgICAgMjA0NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobCAgICAgICAgICAgICAgIDIwNDUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIgICAgICAgICAgICAgICAyMDQ2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3NociAgICAgICAgICAgICAgMjA0NworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvciAgICAgICAgICAgICAgIDIwNDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYgICAgICAgICAgICAgICAyMDQ5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsICAgICAgICAgICAgICAgMjA1MAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2RpdiAgICAgICAgICAgICAgIDIwNTEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwgICAgICAgICAgICAgICAyMDUyCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsICAgICAgICAgICAgICAyMDUzCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsICAgICAgICAgICAgICAgMjA1NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGwgICAgICAgICAgICAgIDIwNTUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwgICAgICAgICAgICAgICAyMDU2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbCAgICAgICAgICAgICAgMjA1NworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybCAgICAgICAgICAgICAgIDIwNTgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsICAgICAgICAgICAgICAyMDU5CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsICAgICAgICAgICAgICAgMjA2MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4ICAgICAgICAgICAgICAgMjA2MQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbiAgICAgICAgICAgICAgIDIwNjIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tYXggICAgICAgICAgICAgICAyMDYzCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluICAgICAgICAgICAgICAgMjA2NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heCAgICAgICAgICAgICAgIDIwNjUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9taW4gICAgICAgICAgICAgICAyMDY2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4ICAgICAgICAgICAgICAgMjA2NworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbiAgICAgICAgICAgICAgIDIwNjgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tYXggICAgICAgICAgICAgICAyMDY5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluICAgICAgICAgICAgICAgMjA3MAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21heCAgICAgICAgICAgICAgIDIwNzEKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9taW4gICAgICAgICAgICAgICAyMDcyCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2ICAgICAgICAgICAgICAyMDczCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdiAgICAgICAgICAgICAgMjA3NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYgICAgICAgICAgICAgIDIwNzUKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2ICAgICAgICAgICAgICAyMDc2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2ICAgICAgICAgICAgICAgMjA3NworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdiAgICAgICAgICAgICAgIDIwNzgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYgICAgICAgICAgICAgICAyMDc5CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2ICAgICAgICAgICAgICAgMjA4MAorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZCAgICAgICAgICAgICAgMjA4MQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIgICAgICAgICAgICAgIDIwODIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsICAgICAgICAgICAgICAyMDgzCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdiAgICAgICAgICAgICAgMjA4NAorCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkICAgICAgICAgICAgICAgMjA4NQorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1YiAgICAgICAgICAgICAgIDIwODYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWwgICAgICAgICAgICAgICAyMDg3CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2ICAgICAgICAgICAgICAgMjA4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2FkZCAgICAgICAgICAgICAgIDIwODkKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIgICAgICAgICAgICAgICAyMDkwCisgICAgX19rbXBjX2F0b21pY19jbXBseDhfbXVsICAgICAgICAgICAgICAgMjA5MQorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2RpdiAgICAgICAgICAgICAgIDIwOTIKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkICAgICAgICAgICAgICAyMDkzCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YiAgICAgICAgICAgICAgMjA5NAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwgICAgICAgICAgICAgIDIwOTUKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2ICAgICAgICAgICAgICAyMDk2CisgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQgICAgICAgICAgICAgIDIwOTcKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViICAgICAgICAgICAgICAyMDk4CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bCAgICAgICAgICAgICAgMjA5OQorICAgI19fa21wY19hdG9taWNfY21wbHgxNl9kaXYgICAgICAgICAgICAgIDIwMDAgIyBtb3ZlZCB1cCBiZWNhdXNlIG9mIG1pc3Rha2UgaW4gbnVtYmVyIChzdXBwb3NlZCB0byBiZSAyMTAwKQorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZCAgICAgICAgICAgICAgMjEwMQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIgICAgICAgICAgICAgIDIxMDIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsICAgICAgICAgICAgICAyMTAzCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2RpdiAgICAgICAgICAgICAgMjEwNAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXggICAgICAgICAgICAgIDIxMDUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluICAgICAgICAgICAgICAyMTA2CisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGRfZnAgICAgICAgICAgICAyMTA3CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2ZwICAgICAgICAgICAgMjEwOAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mcCAgICAgICAgICAgIDIxMDkKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAgICAgICAgICAgICAyMTEwCisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcCAgICAgICAgICAgMjExMQorCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwICAgICAgICAgICAgMjExMgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCAgICAgICAgICAgIDIxMTMKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZnAgICAgICAgICAgICAyMTE0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2ZwICAgICAgICAgICAgMjExNQorICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAgICAgICAgICAgIDIxMTYKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcCAgICAgICAgICAgIDIxMTcKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAgICAgICAgICAgICAyMTE4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwICAgICAgICAgICAgMjExOQorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcCAgICAgICAgICAgIDIxMjAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwICAgICAgICAgICAyMTIxCisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAgICAgICAgICAgICAyMTIyCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2ZwICAgICAgICAgICAgMjEyMworICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mcCAgICAgICAgICAgIDIxMjQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAgICAgICAgICAgICAyMTI1CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcCAgICAgICAgICAgMjEyNgorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2ZwICAgICAgICAgICAgMjEyNworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcCAgICAgICAgICAgIDIxMjgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZnAgICAgICAgICAgICAyMTI5CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2ZwICAgICAgICAgICAgMjEzMAorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfYWRkX2ZwICAgICAgICAgICAgMjEzMQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9mcCAgICAgICAgICAgIDIxMzIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfZnAgICAgICAgICAgICAyMTMzCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2ZwICAgICAgICAgICAgMjEzNAorCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9mcCAgICAgICAgICAgMjEzNQorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAgICAgICAgICAgIDIxMzYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2ZwICAgICAgICAgICAyMTM3CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcCAgICAgICAgICAgMjEzOAorICAgICVlbmRpZgorCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OCAgICAgICAgMjE2OQorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDggICAgICAgIDIxNzAKKworICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDggICAgICAgIDIxNzQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4ICAgICAgICAyMTc1CisKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4ICAgICAgICAyMTc5CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2Zsb2F0OCAgICAgICAgMjE4MAorCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OCAgICAgICAgMjE4NAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDggICAgICAgIDIxODUKKworICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mbG9hdDggICAgICAgIDIxODcKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4ICAgICAgICAyMTg4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OCAgICAgICAgMjE4OQorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDggICAgICAgIDIxOTAKKworICAgIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDggICAgICAgIDIyMzEKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY21wbHg4ICAgICAgICAyMjMyCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OCAgICAgICAgMjIzMworICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDggICAgICAgIDIyMzQKKworICAgIF9fa21wY19hdG9taWNfMSAgICAgICAgICAgICAgICAgICAgICAgIDIyNDcKKyAgICBfX2ttcGNfYXRvbWljXzIgICAgICAgICAgICAgICAgICAgICAgICAyMjQ4CisgICAjX19rbXBjX2F0b21pY180ICAgICAgICAgICAgICAgICAgICAjIGRlY2xhcmVkIGFib3ZlICMxMDAKKyAgICNfX2ttcGNfYXRvbWljXzggICAgICAgICAgICAgICAgICAgICMgZGVjbGFyZWQgYWJvdmUgIzEwMQorICAgIF9fa21wY19hdG9taWNfMTAgICAgICAgICAgICAgICAgICAgICAgIDIyNTEKKyAgICBfX2ttcGNfYXRvbWljXzE2ICAgICAgICAgICAgICAgICAgICAgICAyMjUyCisgICAgX19rbXBjX2F0b21pY18yMCAgICAgICAgICAgICAgICAgICAgICAgMjI1MworICAgIF9fa21wY19hdG9taWNfMzIgICAgICAgICAgICAgICAgICAgICAgIDIyNTQKKworICAgICVpZmRlZiBhcmNoXzMyCisKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNiAgICAgIDIyNTUKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYgICAgICAyMjU2CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2ICAgICAgMjI1NworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNiAgICAgIDIyNTgKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYgICAgICAyMjU5CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2ICAgICAgMjI2MAorCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2ICAgICAgMjI2MQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNiAgICAgIDIyNjIKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYgICAgICAyMjYzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2ICAgICAgMjI2NAorICAgICAgICAlZW5kaWYKKworICAgICVlbmRpZgorCisgICAgJWlmbmRlZiBhcmNoXzY0CisKKyAgICAgICAgIyBBVE9NSUMgZXh0ZW5zaW9ucyBmb3IgT3Blbk1QIDMuMSBzcGVjICh4ODYgYW5kIHg2NCBvbmx5KQorCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkICAgICAgICAgICAgICAgIDIyNjUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfcmQgICAgICAgICAgICAgICAgMjI2NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZCAgICAgICAgICAgICAgICAyMjY3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkICAgICAgICAgICAgICAgIDIyNjgKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfcmQgICAgICAgICAgICAgICAgMjI2OQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9yZCAgICAgICAgICAgICAgICAyMjcwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZCAgICAgICAgICAgICAgIDIyNzEKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfcmQgICAgICAgICAgICAgICAyMjcyCisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCAgICAgICAgICAgICAgICAyMjczCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3JkICAgICAgICAgICAgICAgIDIyNzQKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkICAgICAgICAgICAgICAgMjI3NQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9yZCAgICAgICAgICAgICAgIDIyNzYKKyAgICAgICAgICAgICVpZmRlZiBhcmNoXzMyCisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9yZCAgICAgICAyMjc3CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl9yZCAgICAgICAyMjc4CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3dyICAgICAgICAgICAgICAgIDIyNzkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfd3IgICAgICAgICAgICAgICAgMjI4MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciAgICAgICAgICAgICAgICAyMjgxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3dyICAgICAgICAgICAgICAgIDIyODIKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfd3IgICAgICAgICAgICAgICAgMjI4MworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciAgICAgICAgICAgICAgICAyMjg0CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF93ciAgICAgICAgICAgICAgIDIyODUKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IgICAgICAgICAgICAgICAyMjg2CisgICAgICAgICVlbmRpZgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciAgICAgICAgICAgICAgICAyMjg3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3dyICAgICAgICAgICAgICAgIDIyODgKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3dyICAgICAgICAgICAgICAgMjI4OQorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl93ciAgICAgICAgICAgICAgIDIyOTAKKyAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9hMTZfd3IgICAgICAgMjI5MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2ExNl93ciAgICAgICAyMjkyCisgICAgICAgICVlbmRpZgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCAgICAgICAgICAgMjI5MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdCAgICAgICAgICAyMjk0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQgICAgICAgICAgIDIyOTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQgICAgICAgICAgMjI5NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfY3B0ICAgICAgICAgICAyMjk3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29yYl9jcHQgICAgICAgICAgIDIyOTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCAgICAgICAgICAgMjI5OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0ICAgICAgICAgICAyMzAwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0ICAgICAgICAgIDIzMDEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCAgICAgICAgICAgMjMwMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0ICAgICAgICAgICAyMzAzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQgICAgICAgICAgIDIzMDQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQgICAgICAgICAgMjMwNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfY3B0ICAgICAgICAgICAyMzA2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0ICAgICAgICAgIDIzMDcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCAgICAgICAgICAgMjMwOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmJfY3B0ICAgICAgICAgICAyMzA5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9jcHQgICAgICAgICAgIDIzMTAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCAgICAgICAgICAgMjMxMQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdCAgICAgICAgICAyMzEyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQgICAgICAgICAgIDIzMTMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCAgICAgICAgICAgMjMxNAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfY3B0ICAgICAgICAgICAyMzE1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHQgICAgICAgICAgIDIzMTYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCAgICAgICAgICAgMjMxNworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0ICAgICAgICAgICAyMzE4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQgICAgICAgICAgIDIzMTkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdCAgICAgICAgICAgMjMyMAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0ICAgICAgICAgICAyMzIxCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHQgICAgICAgICAgIDIzMjIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQgICAgICAgICAgMjMyMworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0ICAgICAgICAgICAyMzI0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0ICAgICAgICAgIDIzMjUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCAgICAgICAgICAgMjMyNgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmJfY3B0ICAgICAgICAgICAyMzI3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQgICAgICAgICAgIDIzMjgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCAgICAgICAgICAgMjMyOQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdCAgICAgICAgICAyMzMwCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3hvcl9jcHQgICAgICAgICAgIDIzMzEKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYl9jcHQgICAgICAgICAgMjMzMgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0ICAgICAgICAgICAyMzMzCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0ICAgICAgICAgIDIzMzQKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdCAgICAgICAgICAgMjMzNQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0ICAgICAgICAgICAyMzM2CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQgICAgICAgICAgIDIzMzcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdCAgICAgICAgICAgMjMzOAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdCAgICAgICAgICAyMzM5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQgICAgICAgICAgIDIzNDAKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X2NwdCAgICAgICAgICAgMjM0MQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0ICAgICAgICAgICAyMzQyCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2Rpdl9jcHQgICAgICAgICAgIDIzNDMKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCAgICAgICAgICAgMjM0NAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdCAgICAgICAgICAyMzQ1CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX29ybF9jcHQgICAgICAgICAgIDIzNDYKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQgICAgICAgICAgMjM0NworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0ICAgICAgICAgICAyMzQ4CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0ICAgICAgICAgIDIzNDkKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCAgICAgICAgICAgMjM1MAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdCAgICAgICAgICAyMzUxCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybF9jcHQgICAgICAgICAgIDIzNTIKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdCAgICAgICAgICAgMjM1MworICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0ICAgICAgICAgICAyMzU0CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQgICAgICAgICAgIDIzNTUKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdCAgICAgICAgICAgMjM1NgorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0ICAgICAgICAgICAyMzU3CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQgICAgICAgICAgIDIzNTgKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdCAgICAgICAgICAgMjM1OQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0ICAgICAgICAgICAyMzYwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQgICAgICAgICAgIDIzNjEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCAgICAgICAgICAgMjM2MgorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0ICAgICAgICAgICAyMzYzCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQgICAgICAgICAgIDIzNjQKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdCAgICAgICAgICAyMzY1CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0ICAgICAgICAgIDIzNjYKKyAgICAgICAgJWVuZGlmCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0ICAgICAgICAgIDIzNjcKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJfbmVxdl9jcHQgICAgICAgICAgMjM2OAorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdCAgICAgICAgICAyMzY5CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0ICAgICAgICAgIDIzNzAKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCAgICAgICAgICAgMjM3MQorICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0ICAgICAgICAgICAyMzcyCisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQgICAgICAgICAgIDIzNzMKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCAgICAgICAgICAgMjM3NAorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2NwdCAgICAgICAgICAyMzc1CisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0ICAgICAgICAgIDIzNzYKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHQgICAgICAgICAgMjM3NworICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdCAgICAgICAgICAyMzc4CisgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQgICAgICAgICAgMjM3OQorICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdCAgICAgICAgICAyMzgwCisgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0ICAgICAgICAgIDIzODEKKyAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQgICAgICAgICAgMjM4MgorICAgICAgICAlZW5kaWYKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCAgICAgICAgICAgMjM4MworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0ICAgICAgICAgICAyMzg0CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQgICAgICAgICAgIDIzODUKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCAgICAgICAgICAgMjM4NgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0ICAgICAgICAgICAyMzg3CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQgICAgICAgICAgIDIzODgKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCAgICAgICAgICAgMjM4OQorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0ICAgICAgICAgICAyMzkwCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0ICAgICAgICAgIDIzOTEKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQgICAgICAgICAgMjM5MgorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsX2NwdCAgICAgICAgICAyMzkzCisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0ICAgICAgICAgIDIzOTQKKyAgICAgICAgJWlmZGVmIEhBVkVfUVVBRAorICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdCAgICAgICAgICAyMzk1CisgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0ICAgICAgICAgIDIzOTYKKyAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQgICAgICAgICAgMjM5NworICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdCAgICAgICAgICAyMzk4CisgICAgICAgICVlbmRpZgorICAgICAgICNfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY3B0X3RtcCAgICAgICAgICAgIDI0MDkKKworICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQgIDIzOTkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdCAgMjQwMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9hMTZfY3B0ICAyNDAxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQgIDI0MDIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2X2NwdCAgMjQwMworICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbl9hMTZfY3B0ICAyNDA0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2ExNl9jcHQgIDI0MDUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdCAgMjQwNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0ICAyNDA3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9jcHQgIDI0MDgKKyAgICAgICAgJWVuZGlmCisgICAgICAgICVlbmRpZgorCisgICAgICAgIF9fa21wY19hdG9taWNfc3RhcnQgICAgICAgICAgICAgICAgICAgIDI0MTAKKyAgICAgICAgX19rbXBjX2F0b21pY19lbmQgICAgICAgICAgICAgICAgICAgICAgMjQxMQorCisgICAgICAgICVpZmRlZiBPTVBfNDAKKworICAgICAgICAgICAgIyBBVE9NSUMgZXh0ZW5zaW9ucyBmb3IgT3Blbk1QIDQuMCBzcGVjICh4ODYgYW5kIHg2NCBvbmx5KQorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zd3AgICAgICAgICAgIDI0MTIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCAgICAgICAgICAgMjQxMworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3dwICAgICAgICAgICAyNDE0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AgICAgICAgICAgIDI0MTUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N3cCAgICAgICAgICAgMjQxNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwICAgICAgICAgICAyNDE3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwICAgICAgICAgIDI0MTgKKyAgICAgICAgICAgICVpZmRlZiBIQVZFX1FVQUQKKyAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cCAgICAgICAgMjQxOQorICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AgICAgICAgICAgIDI0MjAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N3cCAgICAgICAgICAgMjQyMQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N3cCAgICAgICAgICAyNDIyCisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwICAgICAgICAgIDI0MjMKKworICAgICAgICAgICAgJWlmZGVmIGFyY2hfMzIKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cCAgMjQyNAorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfc3dwICAyNDI1CisgICAgICAgICAgICAlZW5kaWYKKyAgICAgICAgICAgICVlbmRpZgorCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3JldiAgIDI0MjYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHRfcmV2ICAgMjQyNworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2ICAyNDI4CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldiAgIDI0MjkKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHRfcmV2ICAgMjQzMAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2ICAyNDMxCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldiAgIDI0MzIKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2ICAgMjQzMworICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2ICAyNDM0CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0X3JldiAgIDI0MzUKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2ICAgMjQzNgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2ICAyNDM3CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldiAgIDI0MzgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHRfcmV2ICAgMjQzOQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2ICAyNDQwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldiAgIDI0NDEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2ICAgMjQ0MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2ICAyNDQzCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3JldiAgIDI0NDQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2ICAgMjQ0NQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2ICAyNDQ2CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0X3JldiAgIDI0NDcKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHRfcmV2ICAgMjQ0OAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2ICAyNDQ5CisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldiAgIDI0NTAKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2ICAgMjQ1MQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYgICAyNDUyCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldiAgIDI0NTMKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldiAgMjQ1NAorICAgICAgICAgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2ICAyNDU1CisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYgIDI0NTYKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0X3JldiAgMjQ1NworICAgICAgICAgICAgJWVuZGlmCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0X3JldiAgIDI0NTgKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2ICAgMjQ1OQorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDhfc3ViX2NwdF9yZXYgICAyNDYwCisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0X3JldiAgIDI0NjEKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiAgMjQ2MgorICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2ICAyNDYzCisgICAgICAgICAgICAlaWZkZWYgSEFWRV9RVUFECisgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYgIDI0NjQKKyAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiAgMjQ2NQorCisgICAgICAgICAgICAlaWZkZWYgYXJjaF8zMgorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYgIDI0NjYKKyAgICAgICAgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2ICAyNDY3CisgICAgICAgICAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9hMTZfY3B0X3JldiAgMjQ2OAorICAgICAgICAgICAgICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdF9yZXYgIDI0NjkKKyAgICAgICAgICAgICVlbmRpZgorICAgICAgICAgICAgJWVuZGlmCisKKyAgICAgICAgJWVuZGlmICAgIyBPTVBfNDAKKworCisgICAgJWVuZGlmICAgIyBhcmNoXzY0CisKKyVlbmRpZgorCisjIGVuZCBvZiBmaWxlICMKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dCBiL3JjMy9ydW50aW1lL3NyYy9leHBvcnRzX3NvLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYzEwZDczCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2V4cG9ydHNfc28udHh0CkBAIC0wLDAgKzEsMTI5IEBACisjIGV4cG9ydHNfc28udHh0ICMKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCisjIFRoaXMgaXMgdmVyc2lvbiBzY3JpcHQgZm9yIE9NUCBSVEwgc2hhcmVkIGxpYnJhcnkgKGxpYm9tcCouc28pCisKK1ZFUlNJT04geworCisgICAgZ2xvYmFsOiAjIEV4cG9ydGVkIHN5bWJvbHMuCisKKyAgICAgICAgIworICAgICAgICAjICJOb3JtYWwiIHN5bWJvbHMuCisgICAgICAgICMKKyAgICAgICAgb21wXyo7ICAgICAjIFN0YW5kYXJkIE9wZW5NUCBmdW5jdGlvbnMuCisKKyAgICAgICAgIworICAgICAgICAjIE9NUFQgQVBJCisgICAgICAgICMKKyAgICAgICAgb21wdF90b29sOyAgICAgICAgICAgIyBPTVBUIGluaXRpYWxpemF0aW9uIGludGVyZmFjZQorICAgICAgICBvbXB0X2NvbnRyb2w7ICAgICAgICAjIE9NUFQgY29udHJvbCBpbnRlcmZhY2UKKworICAgICAgICAjCisgICAgICAgICMgT01QVCBzdGF0ZSBwbGFjZWhvbGRlcnMKKyAgICAgICAgIworICAgICAgICBvbXB0X2lkbGU7CisgICAgICAgIG9tcHRfb3ZlcmhlYWQ7CisgICAgICAgIG9tcHRfYmFycmllcl93YWl0OworICAgICAgICBvbXB0X3Rhc2tfd2FpdDsKKyAgICAgICAgb21wdF9tdXRleF93YWl0OworCisgICAgICAgIG9tcGNfKjsgICAgIyBvbXAuaCByZW5hbWVzIHNvbWUgc3RhbmRhcmQgZnVuY3Rpb25zIHRvIG9tcGNfKi4KKyAgICAgICAga21wXyo7ICAgICAjIEludGVsIGV4dGVuc2lvbnMuCisgICAgICAgIGttcGNfKjsgICAgIyBJbnRlbCBleHRlbnNpb25zLgorICAgICAgICBfX2ttcGNfKjsgICMgRnVuY3Rpb25zIGNhbGxlZCBieSBjb21waWxlci1nZW5lcmF0ZWQgY29kZS4KKyAgICAgICAgR09NUF8qOyAgICAjIEdOVSBDIGNvbXBhdGliaWxpdHkgZnVuY3Rpb25zLgorCisgICAgICAgIF9Zb3VfbXVzdF9saW5rX3dpdGhfKjsgICAgICMgTXV0dWFsIGRldGVjdGlvbi9NUyBjb21wYXRpYmlsaXR5IHN5bWJvbHMuCisKKworICAgICAgICAjCisgICAgICAgICMgRGVidWdnZXIgc3VwcG9ydC4KKyAgICAgICAgIworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBfX2ttcF9kZWJ1Z2dpbmc7CisgICAgICAgIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbzsKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KKworICAgICAgICAjCisgICAgICAgICMgSW50ZXJuYWwgZnVuY3Rpb25zIGV4cG9ydGVkIGZvciB0ZXN0aW5nIHB1cnBvc2VzLgorICAgICAgICAjCisgICAgICAgIF9fa21wX2dldF9yZWR1Y2VfbWV0aG9kOworICAgICAgICBfX19rbXBfYWxsb2NhdGU7CisgICAgICAgIF9fX2ttcF9mcmVlOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbDsKKyAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworCisJX19rbXBfcmVzZXRfc3RhdHM7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICMKKyAgICAgICAgIyBJVFQgc3VwcG9ydC4KKyAgICAgICAgIworICAgICAgICAjIFRoZSBmb2xsb3dpbmcgZW50cnkgcG9pbnRzIGFyZSBhZGRlZCBzbyB0aGF0IHRoZSBiYWNrdHJhY2VzIGZyb20KKyAgICAgICAgIyB0aGUgdG9vbHMgY29udGFpbiBtZWFuaW5nZnVsIG5hbWVzIGZvciBhbGwgdGhlIGZ1bmN0aW9ucyB0aGF0IG1pZ2h0CisgICAgICAgICMgYXBwZWFyIGluIGEgYmFja3RyYWNlIG9mIGEgdGhyZWFkIHdoaWNoIGlzIGJsb2NrZWQgaW4gdGhlIFJUTC4KKyAgICAgICAgX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrOworICAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jazsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGFzX2xvY2s7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2s7CisgICAgICAgIF9fa21wX2ZvcmtfY2FsbDsKKyAgICAgICAgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2Q7CisgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2s7CisgICAgICAgIF9fa21wX2l0dF9maW5pX2l0dGxpYjsKKyAgICAgICAgX19rbXBfaXR0X2luaXRfaXR0bGliOworICAgICAgICBfX2ttcF9sYXVuY2hfbW9uaXRvcjsKKyAgICAgICAgX19rbXBfbGF1bmNoX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVhcF9tb25pdG9yOworICAgICAgICBfX2ttcF9yZWFwX3dvcmtlcjsKKyAgICAgICAgX19rbXBfcmVsZWFzZV82NDsKKyAgICAgICAgX19rbXBfd2FpdF82NDsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80OworCisgICAgICAgICMgaXR0bm90aWZ5IHN5bWJvbHMgdG8gYmUgdXNlZCBieSBkZWJ1Z2dlcgorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWI7CisgICAgICAgIF9fa21wX2l0dF9pbml0X2l0dGxpYjsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBsb2NhbDogIyBOb24tZXhwb3J0ZWQgc3ltYm9scy4KKworICAgICAgICAqOyAgICAgICAgICMgQWxsIG90aGVyIHN5bWJvbHMgYXJlIG5vdCBleHBvcnRlZC4KKworfTsgIyBWRVJTSU9OCisKKyMgc2V0cyB1cCBHQ0MgT01QXyB2ZXJzaW9uIGRlcGVuZGVuY3kgY2hhaW4KK09NUF8xLjAgeworfTsKK09NUF8yLjAgeworfSBPTVBfMS4wOworT01QXzMuMCB7Cit9IE9NUF8yLjA7CitPTVBfMy4xIHsKK30gT01QXzMuMDsKK09NUF80LjAgeworfSBPTVBfMy4xOworCisjIHNldHMgdXAgR0NDIEdPTVBfIHZlcnNpb24gZGVwZW5kZW5jeSBjaGFpbgorR09NUF8xLjAgeworfTsKK0dPTVBfMi4wIHsKK30gR09NUF8xLjA7CitHT01QXzMuMCB7Cit9IEdPTVBfMi4wOworR09NUF80LjAgeworfSBHT01QXzMuMDsKKworIyBlbmQgb2YgZmlsZSAjCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9leHRyYWN0RXh0ZXJuYWwuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhNmZkYjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvZXh0cmFjdEV4dGVybmFsLmNwcApAQCAtMCwwICsxLDQ5NyBAQAorLyoKKyAqIGV4dHJhY3RFeHRlcm5hbC5jcHAKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGlvc3RyZWFtPgorI2luY2x1ZGUgPHN0cnN0cmVhbT4KKyNpbmNsdWRlIDxmc3RyZWFtPgorI2luY2x1ZGUgPHN0cmluZz4KKyNpbmNsdWRlIDxzZXQ+CisjaW5jbHVkZSA8bWFwPgorCisvKiBHaXZlbiBhIHNldCBvZiBuIG9iamVjdCBmaWxlcyBoICgnZXh0ZXJuYWwnIG9iamVjdCBmaWxlcykgYW5kIGEgc2V0IG9mIG0KKyAgIG9iamVjdCBmaWxlcyBvICgnaW50ZXJuYWwnIG9iamVjdCBmaWxlcyksCisgICAxLiBEZXRlcm1pbmVzIHIsIHRoZSBzdWJzZXQgb2YgaCB0aGF0IG8gZGVwZW5kcyBvbiwgZGlyZWN0bHkgb3IgaW5kaXJlY3RseQorICAgMi4gUmVtb3ZlcyB0aGUgZmlsZXMgaW4gaCAtIHIgZnJvbSB0aGUgZmlsZSBzeXN0ZW0KKyAgIDMuIEZvciBlYWNoIGV4dGVybmFsIHN5bWJvbCBkZWZpbmVkIGluIHNvbWUgZmlsZSBpbiByLCByZW5hbWUgaXQgaW4gciBVIG8KKyAgICAgIGJ5IHByZWZpeGluZyBpdCB3aXRoICJfX2ttcF9leHRlcm5hbF8iCisgICBVc2FnZToKKyAgIGhpZGUuZXhlIDxuPiA8ZmlsZW5hbWVzIGZvciBoPiA8ZmlsZW5hbWVzIGZvciBvPgorCisgICBUaHVzLCB0aGUgcHJlZml4ZWQgc3ltYm9scyBiZWNvbWUgaGlkZGVuIGluIHRoZSBzZW5zZSB0aGF0IHRoZXkgbm93IGhhdmUgYSBzcGVjaWFsCisgICBwcmVmaXguCisqLworCit1c2luZyBuYW1lc3BhY2Ugc3RkOworCit2b2lkIHN0b3AoY2hhciogZXJyb3JNc2cpIHsKKyAgICBwcmludGYoIiVzXG4iLCBlcnJvck1zZyk7CisgICAgZXhpdCgxKTsKK30KKworLy8gYW4gZW50cnkgaW4gdGhlIHN5bWJvbCB0YWJsZSBvZiBhIC5PQkogZmlsZQorY2xhc3MgU3ltYm9sIHsKK3B1YmxpYzoKKyAgICBfX2ludDY0IG5hbWU7CisgICAgdW5zaWduZWQgdmFsdWU7CisgICAgdW5zaWduZWQgc2hvcnQgc2VjdGlvbk51bSwgdHlwZTsKKyAgICBjaGFyIHN0b3JhZ2VDbGFzcywgbkF1eDsKK307CisKK2NsYXNzIF9yc3RyZWFtIDogcHVibGljIGlzdHJzdHJlYW0geworcHJpdmF0ZToKKyAgICBjb25zdCBjaGFyICpidWY7Citwcm90ZWN0ZWQ6CisgICAgX3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKiwgc3RyZWFtc2l6ZT4gcCk6aXN0cnN0cmVhbShwLmZpcnN0LHAuc2Vjb25kKSxidWYocC5maXJzdCl7fQorICAgIH5fcnN0cmVhbSgpIHsKKwlkZWxldGVbXWJ1ZjsKKyAgICB9Cit9OworCisvKiBBIHN0cmVhbSBlbmNhcHVzbGF0aW5nIHRoZSBjb250ZW50IG9mIGEgZmlsZSBvciB0aGUgY29udGVudCBvZiBhIHN0cmluZywgb3ZlcnJpZGluZyB0aGUKKyAgID4+IG9wZXJhdG9yIHRvIHJlYWQgdmFyaW91cyBpbnRlZ2VyIHR5cGVzIGluIGJpbmFyeSBmb3JtLCBhcyB3ZWxsIGFzIGEgc3ltYm9sIHRhYmxlCisgICBlbnRyeS4KKyovCitjbGFzcyByc3RyZWFtIDogcHVibGljIF9yc3RyZWFtIHsKK3ByaXZhdGU6CisgICAgdGVtcGxhdGU8Y2xhc3MgVD4KKyAgICBpbmxpbmUgcnN0cmVhbSYgZG9SZWFkKFQgJngpIHsKKwlyZWFkKChjaGFyKikmeCwgc2l6ZW9mKFQpKTsKKwlyZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHN0YXRpYyBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPiBnZXRCdWYoY29uc3QgY2hhciAqZmlsZU5hbWUpIHsKKwlpZnN0cmVhbSByYXcoZmlsZU5hbWUsaW9zOjpiaW5hcnkgfCBpb3M6OmluKTsKKwlpZighcmF3LmlzX29wZW4oKSkKKwkgICAgc3RvcCgicnN0cmVhbS5nZXRCdWY6IEVycm9yIG9wZW5pbmcgZmlsZSIpOworCXJhdy5zZWVrZygwLGlvczo6ZW5kKTsKKwlzdHJlYW1wb3MgZmlsZVNpemUgPSByYXcudGVsbGcoKTsKKwlpZihmaWxlU2l6ZSA8IDApCisJICAgIHN0b3AoInJzdHJlYW0uZ2V0QnVmOiBFcnJvciByZWFkaW5nIGZpbGUiKTsKKwljaGFyICpidWYgPSBuZXcgY2hhcltmaWxlU2l6ZV07CisJcmF3LnNlZWtnKDAsaW9zOjpiZWcpOworCXJhdy5yZWFkKGJ1ZiwgZmlsZVNpemUpOworCXJldHVybiBwYWlyPGNvbnN0IGNoYXIqLCBzdHJlYW1zaXplPihidWYsZmlsZVNpemUpOworICAgIH0KK3B1YmxpYzoKKyAgICAvLyBjb25zdHJ1Y3QgZnJvbSBhIHN0cmluZworICAgIHJzdHJlYW0oY29uc3QgY2hhciAqYnVmLHN0cmVhbXNpemUgc2l6ZSk6X3JzdHJlYW0ocGFpcjxjb25zdCBjaGFyKixzdHJlYW1zaXplPihidWYsIHNpemUpKXt9CisgICAgLyogY29uc3RydWN0IGZyb20gYSBmaWxlIHdob2xlIGNvbnRlbnQgaXMgZnVsbHkgcmVhZCBvbmNlIHRvIGluaXRpYWxpemUgdGhlIGNvbnRlbnQgb2YKKyAgICAgICB0aGlzIHN0cmVhbQorICAgICovCisgICAgcnN0cmVhbShjb25zdCBjaGFyICpmaWxlTmFtZSk6X3JzdHJlYW0oZ2V0QnVmKGZpbGVOYW1lKSl7fQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oaW50ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+Pih1bnNpZ25lZCAmeCkgeworCXJldHVybiBkb1JlYWQoeCk7CisgICAgfQorICAgIHJzdHJlYW0mIG9wZXJhdG9yPj4oc2hvcnQgJngpIHsKKwlyZXR1cm4gZG9SZWFkKHgpOworICAgIH0KKyAgICByc3RyZWFtJiBvcGVyYXRvcj4+KHVuc2lnbmVkIHNob3J0ICZ4KSB7CisJcmV0dXJuIGRvUmVhZCh4KTsKKyAgICB9CisgICAgcnN0cmVhbSYgb3BlcmF0b3I+PihTeW1ib2wgJmUpIHsKKwlyZWFkKChjaGFyKikmZSwgMTgpOworCXJldHVybiAqdGhpczsKKyAgICB9Cit9OworCisvLyBzdHJpbmcgdGFibGUgaW4gYSAuT0JKIGZpbGUKK2NsYXNzIFN0cmluZ1RhYmxlIHsKK3ByaXZhdGU6CisgICAgbWFwPHN0cmluZywgdW5zaWduZWQ+IGRpcmVjdG9yeTsKKyAgICBzaXplX3QgbGVuZ3RoOworICAgIGNoYXIgKmRhdGE7CisKKyAgICAvLyBtYWtlIDxkaXJlY3Rvcnk+IGZyb20gPGxlbmd0aD4gYnl0ZXMgaW4gPGRhdGE+CisgICAgdm9pZCBtYWtlRGlyZWN0b3J5KHZvaWQpIHsKKwl1bnNpZ25lZCBpID0gNDsKKwl3aGlsZShpIDwgbGVuZ3RoKSB7CisJICAgIHN0cmluZyBzID0gc3RyaW5nKGRhdGEgKyBpKTsKKwkgICAgZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIocywgaSkpOworCSAgICBpICs9IHMuc2l6ZSgpICsgMTsKKwl9CisgICAgfQorICAgIC8vIGluaXRpYWxpemUgPGxlbmd0aD4gYW5kIDxkYXRhPiB3aXRoIGNvbnRlbnRzIHNwZWNpZmllZCBieSB0aGUgYXJndW1lbnRzCisgICAgdm9pZCBpbml0KGNvbnN0IGNoYXIgKl9kYXRhKSB7CisJdW5zaWduZWQgX2xlbmd0aCA9ICoodW5zaWduZWQqKV9kYXRhOworCisJaWYoX2xlbmd0aCA8IHNpemVvZih1bnNpZ25lZCkgfHwgX2xlbmd0aCAhPSAqKHVuc2lnbmVkKilfZGF0YSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGUuaW5pdDogSW52YWxpZCBzeW1ib2wgdGFibGUiKTsKKwlpZihfZGF0YVtfbGVuZ3RoIC0gMV0pIHsKKwkgICAgLy8gdG8gcHJldmVudCBydW5hd2F5IHN0cmluZ3MsIG1ha2Ugc3VyZSB0aGUgZGF0YSBlbmRzIHdpdGggYSB6ZXJvCisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoICsgMV07CisJICAgIGRhdGFbX2xlbmd0aF0gPSAwOworCX0gZWxzZSB7CisJICAgIGRhdGEgPSBuZXcgY2hhcltsZW5ndGggPSBfbGVuZ3RoXTsKKwl9CisJKih1bnNpZ25lZCopZGF0YSA9IGxlbmd0aDsKKwlLTVBfTUVNQ1BZKGRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBfZGF0YSArIHNpemVvZih1bnNpZ25lZCksCisJICAgICAgICAgICBsZW5ndGggLSBzaXplb2YodW5zaWduZWQpKTsKKwltYWtlRGlyZWN0b3J5KCk7CisgICAgfQorcHVibGljOgorICAgIFN0cmluZ1RhYmxlKHJzdHJlYW0gJmYpIHsKKwkvKiBDb25zdHJ1Y3Qgc3RyaW5nIHRhYmxlIGJ5IHJlYWRpbmcgZnJvbSBmLgorCSAqLworCXN0cmVhbXBvcyBzOworCXVuc2lnbmVkIHN0clNpemU7CisJY2hhciAqc3RyRGF0YTsKKworCXMgPSBmLnRlbGxnKCk7CisJZj4+c3RyU2l6ZTsKKwlpZihzdHJTaXplIDwgc2l6ZW9mKHVuc2lnbmVkKSkKKwkgICAgc3RvcCgiU3RyaW5nVGFibGU6IEludmFsaWQgc3RyaW5nIHRhYmxlIik7CisJc3RyRGF0YSA9IG5ldyBjaGFyW3N0clNpemVdOworCSoodW5zaWduZWQqKXN0ckRhdGEgPSBzdHJTaXplOworCS8vIHJlYWQgdGhlIHJhdyBkYXRhIGludG8gPHN0ckRhdGE+CisJZi5yZWFkKHN0ckRhdGEgKyBzaXplb2YodW5zaWduZWQpLCBzdHJTaXplIC0gc2l6ZW9mKHVuc2lnbmVkKSk7CisJcyA9IGYudGVsbGcoKSAtIHM7CisJaWYocyA8IHN0clNpemUpCisJICAgIHN0b3AoIlN0cmluZ1RhYmxlOiBVbmV4cGVjdGVkIEVPRiIpOworCWluaXQoc3RyRGF0YSk7CisJZGVsZXRlW11zdHJEYXRhOworICAgIH0KKyAgICBTdHJpbmdUYWJsZShjb25zdCBzZXQ8c3RyaW5nPiAmc3RyaW5ncykgeworCS8qIENvbnN0cnVjdCBzdHJpbmcgdGFibGUgZnJvbSBnaXZlbiBzdHJpbmdzLgorCSAqLworCWNoYXIgKnA7CisJc2V0PHN0cmluZz46OmNvbnN0X2l0ZXJhdG9yIGl0OworCXNpemVfdCBzOworCisJLy8gY291bnQgcmVxdWlyZWQgc2l6ZSBmb3IgZGF0YQorCWZvcihsZW5ndGggPSBzaXplb2YodW5zaWduZWQpLCBpdCA9IHN0cmluZ3MuYmVnaW4oKTsgaXQgIT0gc3RyaW5ncy5lbmQoKTsgKytpdCkgeworCSAgICBzaXplX3QgbCA9ICgqaXQpLnNpemUoKTsKKworCSAgICBpZihsID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQlzdG9wKCJTdHJpbmdUYWJsZTogU3RyaW5nIHRvbyBsb25nIik7CisJICAgIGlmKGwgPiA4KSB7CisJCWxlbmd0aCArPSBsICsgMTsKKwkJaWYobGVuZ3RoID4gKHVuc2lnbmVkKSAweEZGRkZGRkZGKQorCQkgICAgc3RvcCgiU3RyaW5nVGFibGU6IFN5bWJvbCB0YWJsZSB0b28gbG9uZyIpOworCSAgICB9CisJfQorCWRhdGEgPSBuZXcgY2hhcltsZW5ndGhdOworCSoodW5zaWduZWQqKWRhdGEgPSBsZW5ndGg7CisJLy8gcG9wdWxhdGUgZGF0YSBhbmQgZGlyZWN0b3J5CisJZm9yKHAgPSBkYXRhICsgc2l6ZW9mKHVuc2lnbmVkKSwgaXQgPSBzdHJpbmdzLmJlZ2luKCk7IGl0ICE9IHN0cmluZ3MuZW5kKCk7ICsraXQpIHsKKwkgICAgY29uc3Qgc3RyaW5nICZzdHIgPSAqaXQ7CisJICAgIHNpemVfdCBsID0gc3RyLnNpemUoKTsKKwkgICAgaWYobCA+IDgpIHsKKwkJZGlyZWN0b3J5Lmluc2VydChtYWtlX3BhaXIoc3RyLCBwIC0gZGF0YSkpOworCQlLTVBfTUVNQ1BZKHAsIHN0ci5jX3N0cigpLCBsKTsKKwkJcFtsXSA9IDA7CisJCXAgKz0gbCArIDE7CisJICAgIH0KKwl9CisgICAgfQorICAgIH5TdHJpbmdUYWJsZSgpIHsKKwlkZWxldGVbXSBkYXRhOworICAgIH0KKyAgICAvKiBSZXR1cm5zIGVuY29kaW5nIGZvciBnaXZlbiBzdHJpbmcgYmFzZWQgb24gdGhpcyBzdHJpbmcgdGFibGUuCisgICAgICAgRXJyb3IgaWYgc3RyaW5nIGxlbmd0aCBpcyBncmVhdGVyIHRoYW4gOCBidXQgc3RyaW5nIGlzIG5vdCBpbgorICAgICAgIHRoZSBzdHJpbmcgdGFibGUtLXJldHVybnMgMC4KKyAgICAqLworICAgIF9faW50NjQgZW5jb2RlKGNvbnN0IHN0cmluZyAmc3RyKSB7CisJX19pbnQ2NCByOworCisJaWYoc3RyLnNpemUoKSA8PSA4KSB7CisJICAgIC8vIGVuY29kZWQgZGlyZWN0bHkKKwkgICAgKChjaGFyKikmcilbN10gPSAwOworCSAgICBLTVBfU1RSTkNQWV9TKChjaGFyKikmciwgc2l6ZW9mKHIpLCBzdHIuY19zdHIoKSwgOCk7CisJICAgIHJldHVybiByOworCX0gZWxzZSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgbWFwPHN0cmluZyx1bnNpZ25lZD46OmNvbnN0X2l0ZXJhdG9yIGl0ID0gZGlyZWN0b3J5LmZpbmQoc3RyKTsKKwkgICAgaWYoaXQgPT0gZGlyZWN0b3J5LmVuZCgpKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZW5jb2RlOiBTdHJpbmcgbm93IGZvdW5kIGluIHN0cmluZyB0YWJsZSIpOworCSAgICAoKHVuc2lnbmVkKikmcilbMF0gPSAwOworCSAgICAoKHVuc2lnbmVkKikmcilbMV0gPSAoKml0KS5zZWNvbmQ7CisJICAgIHJldHVybiByOworCX0KKyAgICB9CisgICAgLyogUmV0dXJucyBzdHJpbmcgcmVwcmVzZW50ZWQgYnkgeCBiYXNlZCBvbiB0aGlzIHN0cmluZyB0YWJsZS4KKyAgICAgICBFcnJvciBpZiB4IHJlZmVyZW5jZXMgYW4gaW52YWxpZCBwb3NpdGlvbiBpbiB0aGUgdGFibGUtLXJldHVybnMKKyAgICAgICB0aGUgZW1wdHkgc3RyaW5nLgorICAgICovCisgICAgc3RyaW5nIGRlY29kZShfX2ludDY0IHgpIGNvbnN0IHsKKwlpZigqKHVuc2lnbmVkKikmeCA9PSAwKSB7CisJICAgIC8vIHJlcHJlc2VudGVkIGFzIGluZGV4IGludG8gdGFibGUKKwkgICAgdW5zaWduZWQgJnAgPSAoKHVuc2lnbmVkKikmeClbMV07CisJICAgIGlmKHAgPj0gbGVuZ3RoKQorCQlzdG9wKCJTdHJpbmdUYWJsZTo6ZGVjb2RlOiBJbnZhbGlkIHN0cmluZyB0YWJsZSBsb29rdXAiKTsKKwkgICAgcmV0dXJuIHN0cmluZyhkYXRhICsgcCk7CisJfSBlbHNlIHsKKwkgICAgLy8gZW5jb2RlZCBkaXJlY3RseQorCSAgICBjaGFyICpwID0gKGNoYXIqKSZ4OworCSAgICBpbnQgaTsKKworCSAgICBmb3IoaSA9IDA7IGkgPCA4ICYmIHBbaV07ICsraSk7CisJICAgIHJldHVybiBzdHJpbmcocCwgaSk7CisJfQorICAgIH0KKyAgICB2b2lkIHdyaXRlKG9zdHJlYW0gJm9zKSB7CisJb3Mud3JpdGUoZGF0YSwgbGVuZ3RoKTsKKyAgICB9Cit9OworCisvKiBmb3IgdGhlIG5hbWVkIG9iamVjdCBmaWxlLCBkZXRlcm1pbmVzIHRoZSBzZXQgb2YgZGVmaW5lZCBzeW1ib2xzIGFuZCB0aGUgc2V0IG9mIHVuZGVmaW5lZCBleHRlcm5hbCBzeW1ib2xzCisgICBhbmQgd3JpdGVzIHRoZW0gdG8gPGRlZmluZWQ+IGFuZCA8dW5kZWZpbmVkPiByZXNwZWN0aXZlbHkKKyovCit2b2lkIGNvbXB1dGVFeHRlcm5hbFN5bWJvbHMoY29uc3QgY2hhciAqZmlsZU5hbWUsIHNldDxzdHJpbmc+ICpkZWZpbmVkLCBzZXQ8c3RyaW5nPiAqdW5kZWZpbmVkKXsKKyAgICBzdHJlYW1wb3MgZmlsZVNpemU7CisgICAgc2l6ZV90IHN0clRhYlN0YXJ0OworICAgIHVuc2lnbmVkIHN5bVRhYlN0YXJ0LCBzeW1ORW50cmllczsKKyAgICByc3RyZWFtIGYoZmlsZU5hbWUpOworCisgICAgZi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGYudGVsbGcoKTsKKworICAgIGYuc2Vla2coOCk7CisgICAgZiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICAvLyBzZWVrIHRvIHRoZSBzdHJpbmcgdGFibGUKKyAgICBmLnNlZWtnKHN0clRhYlN0YXJ0ID0gc3ltVGFiU3RhcnQgKyAxOCAqIChzaXplX3Qpc3ltTkVudHJpZXMpOworICAgIGlmKGYuZW9mKCkpIHsKKwlwcmludGYoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IGZpbGVOYW1lPSclcycsIGZpbGVTaXplID0gJWx1LCBzeW1UYWJTdGFydCA9ICV1LCBzeW1ORW50cmllcyA9ICV1XG4iLAorCSAgICAgICBmaWxlTmFtZSwgKHVuc2lnbmVkIGxvbmcpIGZpbGVTaXplLCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXMpOworCXN0b3AoImNvbXB1dGVFeHRlcm5hbFN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIDEiKTsKKyAgICB9CisgICAgU3RyaW5nVGFibGUgc3RyaW5nVGFibGUoZik7IC8vIHJlYWQgdGhlIHN0cmluZyB0YWJsZQorICAgIGlmKGYudGVsbGcoKSAhPSBmaWxlU2l6ZSkKKwlzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICBmLmNsZWFyKCk7CisgICAgZi5zZWVrZyhzeW1UYWJTdGFydCk7IC8vIHNlZWsgdG8gdGhlIHN5bWJvbCB0YWJsZQorCisgICAgZGVmaW5lZC0+Y2xlYXIoKTsgdW5kZWZpbmVkLT5jbGVhcigpOworICAgIGZvcihpbnQgaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJLy8gcHJvY2VzcyBlYWNoIGVudHJ5CisJU3ltYm9sIGU7CisKKwlpZihmLmVvZigpKQorCSAgICBzdG9wKCJjb21wdXRlRXh0ZXJuYWxTeW1ib2xzOiBVbmV4cGVjdGVkIEVPRiAyIik7CisJZj4+ZTsKKwlpZihmLmZhaWwoKSkKKwkgICAgc3RvcCgiY29tcHV0ZUV4dGVybmFsU3ltYm9sczogRmlsZSByZWFkIGVycm9yIik7CisJaWYoZS5uQXV4KSB7IC8vIGF1eGlsaWFyeSBlbnRyeTogc2tpcAorCSAgICBmLnNlZWtnKGUubkF1eCAqIDE4LCBpb3M6OmN1cik7CisJICAgIGkgKz0gZS5uQXV4OworCX0KKwkvLyBpZiBzeW1ib2wgaXMgZXh0ZXJuIGFuZCBkZWZpbmVkIGluIHRoZSBjdXJyZW50IGZpbGUsIGluc2VydCBpdAorCWlmKGUuc3RvcmFnZUNsYXNzID09IDIpCisJICAgIGlmKGUuc2VjdGlvbk51bSkKKwkJZGVmaW5lZC0+aW5zZXJ0KHN0cmluZ1RhYmxlLmRlY29kZShlLm5hbWUpKTsKKwkgICAgZWxzZQorCQl1bmRlZmluZWQtPmluc2VydChzdHJpbmdUYWJsZS5kZWNvZGUoZS5uYW1lKSk7CisgICAgfQorfQorCisvKiBGb3IgZWFjaCBvY2N1cnJlbmNlIG9mIGFuIGV4dGVybmFsIHN5bWJvbCBpbiB0aGUgb2JqZWN0IGZpbGUgbmFtZWQgYnkKKyAgIGJ5IDxmaWxlTmFtZT4gdGhhdCBpcyBhIG1lbWJlciBvZiA8aGlkZT4sIHJlbmFtZXMgaXQgYnkgcHJlZml4aW5nCisgICB3aXRoICJfX2ttcF9leHRlcm5hbF8iLCB3cml0aW5nIGJhY2sgdGhlIGZpbGUgaW4tcGxhY2UKKyovCit2b2lkIGhpZGVTeW1ib2xzKGNoYXIgKmZpbGVOYW1lLCBjb25zdCBzZXQ8c3RyaW5nPiAmaGlkZSkgeworICAgIHN0YXRpYyBjb25zdCBzdHJpbmcgcHJlZml4KCJfX2ttcF9leHRlcm5hbF8iKTsKKyAgICBzZXQ8c3RyaW5nPiBzdHJpbmdzOyAvLyBzZXQgb2YgYWxsIG9jY3VycmluZyBzeW1ib2xzLCBhcHByb3ByaWF0ZWx5IHByZWZpeGVkCisgICAgc3RyZWFtcG9zIGZpbGVTaXplOworICAgIHNpemVfdCBzdHJUYWJTdGFydDsKKyAgICB1bnNpZ25lZCBzeW1UYWJTdGFydCwgc3ltTkVudHJpZXM7CisgICAgaW50IGk7CisgICAgcnN0cmVhbSBpbihmaWxlTmFtZSk7CisKKyAgICBpbi5zZWVrZygwLGlvczo6ZW5kKTsKKyAgICBmaWxlU2l6ZSA9IGluLnRlbGxnKCk7CisKKyAgICBpbi5zZWVrZyg4KTsKKyAgICBpbiA+PiBzeW1UYWJTdGFydCA+PiBzeW1ORW50cmllczsKKyAgICBpbi5zZWVrZyhzdHJUYWJTdGFydCA9IHN5bVRhYlN0YXJ0ICsgMTggKiAoc2l6ZV90KXN5bU5FbnRyaWVzKTsKKyAgICBpZihpbi5lb2YoKSkKKwlzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU9sZChpbik7IC8vIHJlYWQgb3JpZ2luYWwgc3RyaW5nIHRhYmxlCisKKyAgICBpZihpbi50ZWxsZygpICE9IGZpbGVTaXplKQorCXN0b3AoImhpZGVTeW1ib2xzOiBVbmV4cGVjdGVkIGRhdGEgYWZ0ZXIgc3RyaW5nIHRhYmxlIik7CisKKyAgICAvLyBjb21wdXRlIHNldCBvZiBvY2N1cnJpbmcgc3RyaW5ncyB3aXRoIHByZWZpeCBhZGRlZAorICAgIGZvcihpID0gMDsgaSA8IHN5bU5FbnRyaWVzOyArK2kpIHsKKwlTeW1ib2wgZTsKKworCWluLnNlZWtnKHN5bVRhYlN0YXJ0ICsgaSAqIDE4KTsKKwlpZihpbi5lb2YoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IFVuZXhwZWN0ZWQgRU9GIik7CisJaW4gPj4gZTsKKwlpZihpbi5mYWlsKCkpCisJICAgIHN0b3AoImhpZGVTeW1ib2xzOiBGaWxlIHJlYWQgZXJyb3IiKTsKKwlpZihlLm5BdXgpCisJICAgIGkgKz0gZS5uQXV4OworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCS8vIGlmIHN5bWJvbCBpcyBleHRlcm4gYW5kIGZvdW5kIGluIDxoaWRlPiwgcHJlZml4IGFuZCBpbnNlcnQgaW50byBzdHJpbmdzLAorCS8vIG90aGVyd2lzZSwganVzdCBpbnNlcnQgaW50byBzdHJpbmdzIHdpdGhvdXQgcHJlZml4CisJc3RyaW5ncy5pbnNlcnQoIChlLnN0b3JhZ2VDbGFzcyA9PSAyICYmIGhpZGUuZmluZChzKSAhPSBoaWRlLmVuZCgpKSA/CisJCQlwcmVmaXggKyBzIDogcyk7CisgICAgfQorCisgICAgb2ZzdHJlYW0gb3V0KGZpbGVOYW1lLCBpb3M6OnRydW5jIHwgaW9zOjpvdXQgfCBpb3M6OmJpbmFyeSk7CisgICAgaWYoIW91dC5pc19vcGVuKCkpCisJc3RvcCgiaGlkZVN5bWJvbHM6IEVycm9yIG9wZW5pbmcgb3V0cHV0IGZpbGUiKTsKKworICAgIC8vIG1ha2UgbmV3IHN0cmluZyB0YWJsZSBmcm9tIHN0cmluZyBzZXQKKyAgICBTdHJpbmdUYWJsZSBzdHJpbmdUYWJsZU5ldyA9IFN0cmluZ1RhYmxlKHN0cmluZ3MpOworCisgICAgLy8gY29weSBpbnB1dCBmaWxlIHRvIG91dHB1dCBmaWxlIHVwIHRvIGp1c3QgYmVmb3JlIHRoZSBzeW1ib2wgdGFibGUKKyAgICBpbi5zZWVrZygwKTsKKyAgICBjaGFyICpidWYgPSBuZXcgY2hhcltzeW1UYWJTdGFydF07CisgICAgaW4ucmVhZChidWYsIHN5bVRhYlN0YXJ0KTsKKyAgICBvdXQud3JpdGUoYnVmLCBzeW1UYWJTdGFydCk7CisgICAgZGVsZXRlIFtdYnVmOworCisgICAgLy8gY29weSBpbnB1dCBzeW1ib2wgdGFibGUgdG8gb3V0cHV0IHN5bWJvbCB0YWJsZSB3aXRoIG5hbWUgdHJhbnNsYXRpb24KKyAgICBmb3IoaSA9IDA7IGkgPCBzeW1ORW50cmllczsgKytpKSB7CisJU3ltYm9sIGU7CisKKwlpbi5zZWVrZyhzeW1UYWJTdGFydCArIGkqMTgpOworCWlmKGluLmVvZigpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogVW5leHBlY3RlZCBFT0YiKTsKKwlpbiA+PiBlOworCWlmKGluLmZhaWwoKSkKKwkgICAgc3RvcCgiaGlkZVN5bWJvbHM6IEZpbGUgcmVhZCBlcnJvciIpOworCWNvbnN0IHN0cmluZyAmcyA9IHN0cmluZ1RhYmxlT2xkLmRlY29kZShlLm5hbWUpOworCW91dC5zZWVrcChzeW1UYWJTdGFydCArIGkqMTgpOworCWUubmFtZSA9IHN0cmluZ1RhYmxlTmV3LmVuY29kZSggKGUuc3RvcmFnZUNsYXNzID09IDIgJiYgaGlkZS5maW5kKHMpICE9IGhpZGUuZW5kKCkpID8KKwkJCQkJcHJlZml4ICsgcyA6IHMpOworCW91dC53cml0ZSgoY2hhciopJmUsIDE4KTsKKwlpZihvdXQuZmFpbCgpKQorCSAgICBzdG9wKCJoaWRlU3ltYm9sczogRmlsZSB3cml0ZSBlcnJvciIpOworCWlmKGUubkF1eCkgeworCSAgICAvLyBjb3B5IGF1eGlsaWFyeSBzeW1ib2wgdGFibGUgZW50cmllcworCSAgICBpbnQgbkF1eCA9IGUubkF1eDsKKwkgICAgZm9yKGludCBqID0gMTsgaiA8PSBuQXV4OyArK2opIHsKKwkJaW4gPj4gZTsKKwkJb3V0LnNlZWtwKHN5bVRhYlN0YXJ0ICsgKGkgKyBqKSAqIDE4KTsKKwkJb3V0LndyaXRlKChjaGFyKikmZSwgMTgpOworCSAgICB9CisJICAgIGkgKz0gbkF1eDsKKwl9CisgICAgfQorICAgIC8vIG91dHB1dCBzdHJpbmcgdGFibGUKKyAgICBzdHJpbmdUYWJsZU5ldy53cml0ZShvdXQpOworfQorCisvLyByZXR1cm5zIHRydWUgaWZmIDxhPiBhbmQgPGI+IGhhdmUgbm8gY29tbW9uIGVsZW1lbnQKK3RlbXBsYXRlIDxjbGFzcyBUPgorYm9vbCBpc0Rpc2pvaW50KGNvbnN0IHNldDxUPiAmYSwgY29uc3Qgc2V0PFQ+ICZiKSB7CisgICAgc2V0PFQ+Ojpjb25zdF9pdGVyYXRvciBpdGEsIGl0YjsKKworICAgIGZvcihpdGEgPSBhLmJlZ2luKCksIGl0YiA9IGIuYmVnaW4oKTsgaXRhICE9IGEuZW5kKCkgJiYgaXRiICE9IGIuZW5kKCk7KSB7CisJY29uc3QgVCAmdGEgPSAqaXRhLCAmdGIgPSAqaXRiOworCWlmKHRhIDwgdGIpCisJICAgICsraXRhOworCWVsc2UgaWYgKHRiIDwgdGEpCisJICAgICsraXRiOworCWVsc2UKKwkgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICByZXR1cm4gdHJ1ZTsKK30KKworLyogcHJlY29uZGl0aW9uOiA8ZGVmaW5lZD4gYW5kIDx1bmRlZmluZWQ+IGFyZSBhcnJheXMgd2l0aCA8blRvdGFsPiBlbGVtZW50cyB3aGVyZQorICAgPG5Ub3RhbD4gPj0gPG5FeHRlcm5hbD4uICBUaGUgZmlyc3QgPG5FeHRlcm5hbD4gZWxlbWVudHMgY29ycmVzcG9uZCB0byB0aGUgZXh0ZXJuYWwgb2JqZWN0CisgICBmaWxlcyBhbmQgdGhlIHJlc3QgY29ycmVzcG9uZCB0byB0aGUgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorICAgcG9zdGNvbmRpdGlvbjogZmlsZSB4IGlzIHNhaWQgdG8gZGVwZW5kIG9uIGZpbGUgeSBpZiB1bmRlZmluZWRbeF0gYW5kIGRlZmluZWRbeV0gYXJlIG5vdAorICAgZGlzam9pbnQuICBSZXR1cm5zIHRoZSB0cmFuc2l0aXZlIGNsb3N1cmUgb2YgdGhlIHNldCBvZiBpbnRlcm5hbCBvYmplY3QgZmlsZXMsIGFzIGEgc2V0IG9mCisgICBmaWxlIGluZGV4ZXMsIHVuZGVyIHRoZSAnZGVwZW5kcyBvbicgcmVsYXRpb24sIG1pbnVzIHRoZSBzZXQgb2YgaW50ZXJuYWwgb2JqZWN0IGZpbGVzLgorKi8KK3NldDxpbnQ+ICpmaW5kUmVxdWlyZWRFeHRlcm5hbChpbnQgbkV4dGVybmFsLCBpbnQgblRvdGFsLCBzZXQ8c3RyaW5nPiAqZGVmaW5lZCwgc2V0PHN0cmluZz4gKnVuZGVmaW5lZCkgeworICAgIHNldDxpbnQ+ICpyZXF1aXJlZCA9IG5ldyBzZXQ8aW50PjsKKyAgICBzZXQ8aW50PiBmcmVzaFsyXTsKKyAgICBpbnQgaSwgY3VyID0gMDsKKyAgICBib29sIGNoYW5nZWQ7CisKKyAgICBmb3IoaSA9IG5Ub3RhbCAtIDE7IGkgPj0gbkV4dGVybmFsOyAtLWkpCisJZnJlc2hbY3VyXS5pbnNlcnQoaSk7CisgICAgZG8geworCWNoYW5nZWQgPSBmYWxzZTsKKwlmb3Ioc2V0PGludD46Oml0ZXJhdG9yIGl0ID0gZnJlc2hbY3VyXS5iZWdpbigpOyBpdCAhPSBmcmVzaFtjdXJdLmVuZCgpOyArK2l0KSB7CisJICAgIHNldDxzdHJpbmc+ICZzID0gdW5kZWZpbmVkWyppdF07CisKKwkgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpIHsKKwkJaWYocmVxdWlyZWQtPmZpbmQoaSkgPT0gcmVxdWlyZWQtPmVuZCgpKSB7CisJCSAgICBpZighaXNEaXNqb2ludChkZWZpbmVkW2ldLCBzKSkgeworCQkJLy8gZm91bmQgYSBuZXcgcXVhbGlmeWluZyBlbGVtZW50CisJCQlyZXF1aXJlZC0+aW5zZXJ0KGkpOworCQkJZnJlc2hbMSAtIGN1cl0uaW5zZXJ0KGkpOworCQkJY2hhbmdlZCA9IHRydWU7CisJCSAgICB9CisJCX0KKwkgICAgfQorCX0KKwlmcmVzaFtjdXJdLmNsZWFyKCk7CisJY3VyID0gMSAtIGN1cjsKKyAgICB9IHdoaWxlKGNoYW5nZWQpOworICAgIHJldHVybiByZXF1aXJlZDsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIgKiphcmd2KSB7CisgICAgaW50IG5FeHRlcm5hbCwgbkludGVybmFsLCBpOworICAgIHNldDxzdHJpbmc+ICpkZWZpbmVkLCAqdW5kZWZpbmVkOworICAgIHNldDxpbnQ+OjppdGVyYXRvciBpdDsKKworICAgIGlmKGFyZ2MgPCAzKQorCXN0b3AoIlBsZWFzZSBzcGVjaWZ5IGEgcG9zaXRpdmUgaW50ZWdlciBmb2xsb3dlZCBieSBhIGxpc3Qgb2Ygb2JqZWN0IGZpbGVuYW1lcyIpOworICAgIG5FeHRlcm5hbCA9IGF0b2koYXJndlsxXSk7CisgICAgaWYobkV4dGVybmFsIDw9IDApCisJc3RvcCgiUGxlYXNlIHNwZWNpZnkgYSBwb3NpdGl2ZSBpbnRlZ2VyIGZvbGxvd2VkIGJ5IGEgbGlzdCBvZiBvYmplY3QgZmlsZW5hbWVzIik7CisgICAgaWYobkV4dGVybmFsICsgIDIgPiBhcmdjKQorCXN0b3AoIlRvbyBmZXcgZXh0ZXJuYWwgb2JqZWN0cyIpOworICAgIG5JbnRlcm5hbCA9IGFyZ2MgLSBuRXh0ZXJuYWwgLSAyOworICAgIGRlZmluZWQgPSBuZXcgc2V0PHN0cmluZz5bYXJnYyAtIDJdOworICAgIHVuZGVmaW5lZCA9IG5ldyBzZXQ8c3RyaW5nPlthcmdjIC0gMl07CisKKyAgICAvLyBkZXRlcm1pbmUgdGhlIHNldCBvZiBkZWZpbmVkIGFuZCB1bmRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scworICAgIGZvcihpID0gMjsgaSA8IGFyZ2M7ICsraSkKKwljb21wdXRlRXh0ZXJuYWxTeW1ib2xzKGFyZ3ZbaV0sIGRlZmluZWQgKyBpIC0gMiwgdW5kZWZpbmVkICsgaSAtIDIpOworCisgICAgLy8gZGV0ZXJtaW5lIHRoZSBzZXQgb2YgcmVxdWlyZWQgZXh0ZXJuYWwgZmlsZXMKKyAgICBzZXQ8aW50PiAqcmVxdWlyZWRFeHRlcm5hbCA9IGZpbmRSZXF1aXJlZEV4dGVybmFsKG5FeHRlcm5hbCwgYXJnYyAtIDIsIGRlZmluZWQsIHVuZGVmaW5lZCk7CisgICAgc2V0PHN0cmluZz4gaGlkZTsKKworICAgIC8qIGRldGVybWluZSB0aGUgc2V0IG9mIHN5bWJvbHMgdG8gaGlkZS0tbmFtZWx5IGRlZmluZWQgZXh0ZXJuYWwgc3ltYm9scyBvZiB0aGUKKyAgICAgICByZXF1aXJlZCBleHRlcm5hbCBmaWxlcworICAgICovCisgICAgZm9yKGl0ID0gcmVxdWlyZWRFeHRlcm5hbC0+YmVnaW4oKTsgaXQgIT0gcmVxdWlyZWRFeHRlcm5hbC0+ZW5kKCk7ICsraXQpIHsKKwlpbnQgaWR4ID0gKml0OworCXNldDxzdHJpbmc+OjppdGVyYXRvciBpdDI7CisJLyogV2UgaGF2ZSB0byBpbnNlcnQgb25lIGVsZW1lbnQgYXQgYSB0aW1lIGluc3RlYWQgb2YgaW5zZXJ0aW5nIGEgcmFuZ2UgYmVjYXVzZQorCSAgIHRoZSBpbnNlcnQgbWVtYmVyIGZ1bmN0aW9uIHRha2luZyBhIHJhbmdlIGRvZXNuJ3QgZXhpc3Qgb24gV2luZG93cyogT1MsIGF0IGxlYXN0CisJICAgYXQgdGhlIHRpbWUgb2YgdGhpcyB3cml0aW5nLgorCSovCisJZm9yKGl0MiA9IGRlZmluZWRbaWR4XS5iZWdpbigpOyBpdDIgIT0gZGVmaW5lZFtpZHhdLmVuZCgpOyArK2l0MikKKwkgICAgaGlkZS5pbnNlcnQoKml0Mik7CisgICAgfQorCisgICAgLyogcHJvY2VzcyB0aGUgZXh0ZXJuYWwgZmlsZXMtLXJlbW92aW5nIHRob3NlIHRoYXQgYXJlIG5vdCByZXF1aXJlZCBhbmQgaGlkaW5nCisgICAgICAgdGhlIGFwcHJvcHJpYXRlIHN5bWJvbHMgaW4gdGhlIG90aGVycworICAgICovCisgICAgZm9yKGkgPSAwOyBpIDwgbkV4dGVybmFsOyArK2kpCisJaWYocmVxdWlyZWRFeHRlcm5hbC0+ZmluZChpKSAhPSByZXF1aXJlZEV4dGVybmFsLT5lbmQoKSkKKwkgICAgaGlkZVN5bWJvbHMoYXJndlsyICsgaV0sIGhpZGUpOworCWVsc2UKKwkgICAgcmVtb3ZlKGFyZ3ZbMiArIGldKTsKKyAgICAvLyBoaWRlIHRoZSBhcHByb3ByaWF0ZSBzeW1ib2xzIGluIHRoZSBpbnRlcm5hbCBmaWxlcworICAgIGZvcihpID0gbkV4dGVybmFsICsgMjsgaSA8IGFyZ2M7ICsraSkKKwloaWRlU3ltYm9scyhhcmd2W2ldLCBoaWRlKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dCBiL3JjMy9ydW50aW1lL3NyYy9pMThuL2VuX1VTLnR4dApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZmEyYTZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2kxOG4vZW5fVVMudHh0CkBAIC0wLDAgKzEsNDc3IEBACisjIGVuX1VTLnR4dCAjCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKworIyBEZWZhdWx0IG1lc3NhZ2VzLCBlbWJlZGRlZCBpbnRvIHRoZSBPcGVuTVAgUlRMLCBhbmQgc291cmNlIGZvciBFbmdsaXNoIGNhdGFsb2cuCisKKworIyBDb21wYXRpYmxlIGNoYW5nZXMgKHdoaWNoIGRvZXMgbm90IHJlcXVpcmUgdmVyc2lvbiBidW1waW5nKToKKyMgICAgICogRWRpdGluZyBtZXNzYWdlIChudW1iZXIgYW5kIHR5cGUgb2YgcGxhY2Vob2xkZXJzIG11c3QgcmVtYWluLCByZWxhdGl2ZSBvcmRlciBvZgorIyAgICAgICBwbGFjZWhvbGRlcnMgbWF5IGJlIGNoYW5nZWQsIGUuZy4gIkZpbGUgJTEkcyBsaW5lICUyJGQiIG1heSBiZSBzYWZlbHkgZWRpdGVkIHRvCisjICAgICAgICJMaW5lICUyJGQgZmlsZSAlMSRzIikuCisjICAgICAqIEFkZGluZyBuZXcgbWVzc2FnZSB0byB0aGUgZW5kIG9mIHNlY3Rpb24uCisjIEluY29tcGF0aWJsZSBjaGFuZ2VzICh2ZXJzaW9uIG11c3QgYmUgYnVtYmVkIGJ5IDEpOgorIyAgICAgKiBJbnRyb2R1Y2luZyBuZXcgcGxhY2Vob2xkZXJzIHRvIGV4aXN0aW5nIG1lc3NhZ2VzLgorIyAgICAgKiBDaGFuZ2luZyB0eXBlIG9mIHBsYWNlaG9sZGVycyAoZS5nLiAibGluZSAlMSRkIiAtPiAibGluZSAlMSRzIikuCisjICAgICAqIFJlYXJyYW5naW5nIG9yZGVyIG9mIG1lc3NhZ2VzLgorIyAgICAgKiBEZWxldGluZyBtZXNzYWdlcy4KKyMgVXNlIHNwZWNpYWwgIk9CU09MRVRFIiBwc2V1ZG9pZGVudGlmaWVyIGZvciBvYnNvbGV0ZSBlbnRyaWVzLCB3aGljaCBpcyBrZXB0IG9ubHkgZm9yIGJhY2t3YXJkCisjIGNvbXBhdGliaWxpdHkuIFdoZW4gdmVyc2lvbiBpcyBidW1wZWQsIGRvIG5vdCBmb3JnZXQgdG8gZGVsZXRlIGFsbCBvYnNvbGV0ZSBlbnRyaWVzLgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy0qLSBNRVRBIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIE1ldGEgaW5mb3JtYXRpb24gYWJvdXQgbWVzc2FnZSBjYXRhbG9nLgorCitMYW5ndWFnZSAiRW5nbGlzaCIKK0NvdW50cnkgICJVU0EiCitMYW5nSWQgICAiMTAzMyIKK1ZlcnNpb24gICIyIgorUmV2aXNpb24gIjIwMTYwNDA1IgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIFNUUklOR1MgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgU3RyaW5ncyBhcmUgbm90IGNvbXBsZXRlIG1lc3NhZ2VzLCBqdXN0IGZyYWdtZW50cy4gV2UgbmVlZCB0byB3b3JrIG9uIGl0IGFuZCByZWR1Y2UgbnVtYmVyIG9mCisjIHN0cmluZ3MgKHRvIHplcm8/KS4KKworRXJyb3IgICAgICAgICAgICAgICAgICAgICAgICAiRXJyb3IiCitVbmtub3duRmlsZSAgICAgICAgICAgICAgICAgICIodW5rbm93biBmaWxlKSIKK05vdEFOdW1iZXIgICAgICAgICAgICAgICAgICAgIm5vdCBhIG51bWJlciIKK0JhZFVuaXQgICAgICAgICAgICAgICAgICAgICAgImJhZCB1bml0IgorSWxsZWdhbENoYXJhY3RlcnMgICAgICAgICAgICAiaWxsZWdhbCBjaGFyYWN0ZXJzIgorVmFsdWVUb29MYXJnZSAgICAgICAgICAgICAgICAidmFsdWUgdG9vIGxhcmdlIgorVmFsdWVUb29TbWFsbCAgICAgICAgICAgICAgICAidmFsdWUgdG9vIHNtYWxsIgorTm90TXVsdGlwbGU0SyAgICAgICAgICAgICAgICAidmFsdWUgaXMgbm90IGEgbXVsdGlwbGUgb2YgNGsiCitVbmtub3duVG9wb2xvZ3kgICAgICAgICAgICAgICJVbmtub3duIHByb2Nlc3NvciB0b3BvbG9neSIKK0NhbnRPcGVuQ3B1aW5mbyAgICAgICAgICAgICAgIkNhbm5vdCBvcGVuIC9wcm9jL2NwdWluZm8iCitQcm9jQ3B1aW5mbyAgICAgICAgICAgICAgICAgICIvcHJvYy9jcHVpbmZvIgorTm9Qcm9jUmVjb3JkcyAgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGludmFsaWQgKE5vIHByb2Nlc3NvciByZWNvcmRzKSIKK1Rvb01hbnlQcm9jUmVjb3JkcyAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChUb28gbWFueSBwcm9jZXNzb3IgcmVjb3JkcykiCitDYW50UmV3aW5kQ3B1aW5mbyAgICAgICAgICAgICJDYW5ub3QgcmV3aW5kIGNwdWluZm8gZmlsZSIKK0xvbmdMaW5lQ3B1aW5mbyAgICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChsb25nIGxpbmUpIgorVG9vTWFueUVudHJpZXMgICAgICAgICAgICAgICAiY3B1aW5mbyBmaWxlIGNvbnRhaW5zIHRvbyBtYW55IGVudHJpZXMiCitNaXNzaW5nUHJvY0ZpZWxkICAgICAgICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwcm9jZXNzb3IgZmllbGQiCitNaXNzaW5nUGh5c2ljYWxJREZpZWxkICAgICAgICJjcHVpbmZvIGZpbGUgbWlzc2luZyBwaHlzaWNhbCBpZCBmaWVsZCIKK01pc3NpbmdWYWxDcHVpbmZvICAgICAgICAgICAgImNwdWluZm8gZmlsZSBpbnZhbGlkIChtaXNzaW5nIHZhbCkiCitEdXBsaWNhdGVGaWVsZENwdWluZm8gICAgICAgICJjcHVpbmZvIGZpbGUgaW52YWxpZCAoZHVwbGljYXRlIGZpZWxkKSIKK1BoeXNpY2FsSURzTm90VW5pcXVlICAgICAgICAgIlBoeXNpY2FsIG5vZGUvcGtnL2NvcmUvdGhyZWFkIGlkcyBub3QgdW5pcXVlIgorQXBpY05vdFByZXNlbnQgICAgICAgICAgICAgICAiQVBJQyBub3QgcHJlc2VudCIKK0ludmFsaWRDcHVpZEluZm8gICAgICAgICAgICAgIkludmFsaWQgY3B1aWQgaW5mbyIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkFQSUMgaWRzIG5vdCB1bmlxdWUiCitJbmNvbnNpc3RlbnRDcHVpZEluZm8gICAgICAgICJJbmNvbnNpc3RlbnQgY3B1aWQgaW5mbyIKK091dE9mSGVhcE1lbW9yeSAgICAgICAgICAgICAgIk91dCBvZiBoZWFwIG1lbW9yeSIKK01lbW9yeUFsbG9jRmFpbGVkICAgICAgICAgICAgIk1lbW9yeSBhbGxvY2F0aW9uIGZhaWxlZCIKK0NvcmUgICAgICAgICAgICAgICAgICAgICAgICAgImNvcmUiCitUaHJlYWQgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWQiCitQYWNrYWdlICAgICAgICAgICAgICAgICAgICAgICJwYWNrYWdlIgorTm9kZSAgICAgICAgICAgICAgICAgICAgICAgICAibm9kZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIjx1bmRlZj4iCitEZWNvZGluZ0xlZ2FjeUFQSUMgICAgICAgICAgICJkZWNvZGluZyBsZWdhY3kgQVBJQyBpZHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJwYXJzaW5nIC9wcm9jL2NwdWluZm8iCitOb3REZWZpbmVkICAgICAgICAgICAgICAgICAgICJ2YWx1ZSBpcyBub3QgZGVmaW5lZCIKK0VmZmVjdGl2ZVNldHRpbmdzICAgICAgICAgICAgIkVmZmVjdGl2ZSBzZXR0aW5nczoiCitVc2VyU2V0dGluZ3MgICAgICAgICAgICAgICAgICJVc2VyIHNldHRpbmdzOiIKK1N0b3JhZ2VNYXBXYXJuaW5nICAgICAgICAgICAgIndhcm5pbmc6IHBvaW50ZXJzIG9yIHNpemUgZG9uJ3QgbWFrZSBzZW5zZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlRQVXMgcGVyIHBhY2thZ2UiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJIVCBlbmFibGVkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiSFQgZGlzYWJsZWQiCitEZWNvZGluZ3gyQVBJQyAgICAgICAgICAgICAgICJkZWNvZGluZyB4MkFQSUMgaWRzIgorTm9MZWFmMTFTdXBwb3J0ICAgICAgICAgICAgICAiY3B1aWQgbGVhZiAxMSBub3Qgc3VwcG9ydGVkIgorTm9MZWFmNFN1cHBvcnQgICAgICAgICAgICAgICAiY3B1aWQgbGVhZiA0IG5vdCBzdXBwb3J0ZWQiCitUaHJlYWRJRHNOb3RVbmlxdWUgICAgICAgICAgICJ0aHJlYWQgaWRzIG5vdCB1bmlxdWUiCitVc2luZ1B0aHJlYWQgICAgICAgICAgICAgICAgICJ1c2luZyBwdGhyZWFkIGluZm8iCitMZWdhY3lBcGljSURzTm90VW5pcXVlICAgICAgICJsZWdhY3kgQVBJQyBpZHMgbm90IHVuaXF1ZSIKK3gyQXBpY0lEc05vdFVuaXF1ZSAgICAgICAgICAgIngyQVBJQyBpZHMgbm90IHVuaXF1ZSIKK0Rpc3BsYXlFbnZCZWdpbgkJICAgICAiT1BFTk1QIERJU1BMQVkgRU5WSVJPTk1FTlQgQkVHSU4iCitEaXNwbGF5RW52RW5kCQkgICAgICJPUEVOTVAgRElTUExBWSBFTlZJUk9OTUVOVCBFTkQiCitEZXZpY2UJCQkgICAgICJbZGV2aWNlXSIKK0hvc3QJCQkgICAgICJbaG9zdF0iCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gRk9STUFUUyAtKi0KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworSW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAiT01QOiBJbmZvICMlMSRkOiAlMiRzXG4iCitXYXJuaW5nICAgICAgICAgICAgICAgICAgICAgICJPTVA6IFdhcm5pbmcgIyUxJGQ6ICUyJHNcbiIKK0ZhdGFsICAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogRXJyb3IgIyUxJGQ6ICUyJHNcbiIKK1N5c0VyciAgICAgICAgICAgICAgICAgICAgICAgIk9NUDogU3lzdGVtIGVycm9yICMlMSRkOiAlMiRzXG4iCitIaW50ICAgICAgICAgICAgICAgICAgICAgICAgICJPTVA6IEhpbnQ6ICUyJHNcbiIKKworUHJhZ21hICAgICAgICAgICAgICAgICAgICAgICAiJTEkcyBwcmFnbWEgKGF0ICUyJHM6JTMkcygpOiU0JHMpIgorICAgICMgJTEgaXMgcHJhZ21hIG5hbWUgKGxpa2UgInBhcmFsbGVsIiBvciAibWFzdGVyIiwKKyAgICAjICUyIGlzIGZpbGUgbmFtZSwKKyAgICAjICUzIGlzIGZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLAorICAgICMgJTQgaXMgdGhlIGxpbmUgbnVtYmVyIChhcyBzdHJpbmcsIHNvICJzIiB0eXBlIHNwZWNpZmllciBzaG91bGQgYmUgdXNlZCkuCisKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCistKi0gTUVTU0FHRVMgLSotCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgTWVzc2FnZXMgb2YgYW55IHNldmVyaXR5OiBpbmZvcm1hdGlvbmFsLCB3YXJuaW5nLCBvciBmYXRhbC4KKyMgVG8gbWFpbnRhaW4gbWVzc2FnZSBudW1iZXJzICh0aGV5IGFyZSB2aXNpYmxlIHRvIGN1c3RvbWVycyksIGFkZCBuZXcgbWVzc2FnZXMgdG8gdGhlIGVuZC4KKworIyBVc2UgZm9sbG93aW5nIHByZWZpeGVzIGZvciBtZXNzYWdlcyBhbmQgaGludHMgd2hlbiBhcHByb3ByaWF0ZToKKyMgICAgQWZmIC0tIEFmZmluaXR5IG1lc3NhZ2VzLgorIyAgICBDbnMgLS0gQ29uc2lzdGVuY3kgY2hlY2sgZmFpbHVyZXMgKEtNUF9DT05TSVNURU5DWV9DSEVDSykuCisjICAgIEl0dCAtLSBJVFQgTm90aWZ5LXJlbGF0ZWQgbWVzc2FnZXMuCisKK0xpYnJhcnlJc1NlcmlhbCAgICAgICAgICAgICAgIkxpYnJhcnkgaXMgXCJzZXJpYWxcIi4iCitDYW50T3Blbk1lc3NhZ2VDYXRhbG9nICAgICAgICJDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IgorV2lsbFVzZURlZmF1bHRNZXNzYWdlcyAgICAgICAiRGVmYXVsdCBtZXNzYWdlcyB3aWxsIGJlIHVzZWQuIgorTG9ja0lzVW5pbml0aWFsaXplZCAgICAgICAgICAiJTEkczogTG9jayBpcyB1bmluaXRpYWxpemVkIgorTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlICAgICAiJTEkczogTG9jayB3YXMgaW5pdGlhbGl6ZWQgYXMgc2ltcGxlLCBidXQgdXNlZCBhcyBuZXN0YWJsZSIKK0xvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSAgICAgIiUxJHM6IExvY2sgd2FzIGluaXRpYWxpemVkIGFzIG5lc3RhYmxlLCBidXQgdXNlZCBhcyBzaW1wbGUiCitMb2NrSXNBbHJlYWR5T3duZWQgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIGFscmVhZHkgb3duZWQgYnkgcmVxdWVzdGluZyB0aHJlYWQiCitMb2NrU3RpbGxPd25lZCAgICAgICAgICAgICAgICIlMSRzOiBMb2NrIGlzIHN0aWxsIG93bmVkIGJ5IGEgdGhyZWFkIgorTG9ja1Vuc2V0dGluZ0ZyZWUgICAgICAgICAgICAiJTEkczogQXR0ZW1wdCB0byByZWxlYXNlIGEgbG9jayBub3Qgb3duZWQgYnkgYW55IHRocmVhZCIKK0xvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIgICAgIiUxJHM6IEF0dGVtcHQgdG8gcmVsZWFzZSBhIGxvY2sgb3duZWQgYnkgYW5vdGhlciB0aHJlYWQiCitTdGFja092ZXJmbG93ICAgICAgICAgICAgICAgICJTdGFjayBvdmVyZmxvdyBkZXRlY3RlZCBmb3IgT3Blbk1QIHRocmVhZCAjJTEkZCIKK1N0YWNrT3ZlcmxhcCAgICAgICAgICAgICAgICAgIlN0YWNrIG92ZXJsYXAgZGV0ZWN0ZWQuICIKK0Fzc2VydGlvbkZhaWx1cmUgICAgICAgICAgICAgIkFzc2VydGlvbiBmYWlsdXJlIGF0ICUxJHMoJTIkZCkuIgorQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICAgICAgICAiVW5hYmxlIHRvIHJlZ2lzdGVyIGEgbmV3IHVzZXIgdGhyZWFkLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIkluaXRpYWxpemluZyAlMSRzLCBidXQgZm91bmQgJTIkcyBhbHJlYWR5IGluaXRpYWxpemVkLiIKK0NhbnRPcGVuRmlsZUZvclJlYWRpbmcgICAgICAgIkNhbm5vdCBvcGVuIGZpbGUgXCIlMSRzXCIgZm9yIHJlYWRpbmc6IgorQ2FudEdldEVudlZhciAgICAgICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudFNldEVudlZhciAgICAgICAgICAgICAgICAiU2V0dGluZyBlbnZpcm9ubWVudCB2YXJpYWJsZSBcIiUxJHNcIiBmYWlsZWQ6IgorQ2FudEdldEVudmlyb25tZW50ICAgICAgICAgICAiR2V0dGluZyBlbnZpcm9ubWVudCBmYWlsZWQ6IgorQmFkQm9vbFZhbHVlICAgICAgICAgICAgICAgICAiJTEkcz1cIiUyJHNcIjogV3JvbmcgdmFsdWUsIGJvb2xlYW4gZXhwZWN0ZWQuIgorU1NQTm90QnVpbHRJbiAgICAgICAgICAgICAgICAiTm8gSGVscGVyIFRocmVhZCBzdXBwb3J0IGJ1aWx0IGluIHRoaXMgT01QIGxpYnJhcnkuIgorU1BQU290ZlRlcm1pbmF0ZUZhaWxlZCAgICAgICAiSGVscGVyIHRocmVhZCBmYWlsZWQgdG8gc29mdCB0ZXJtaW5hdGUuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiQnVmZmVyIG92ZXJmbG93IGRldGVjdGVkLiIKK1JlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgICAgIlJlYWwtdGltZSBzY2hlZHVsaW5nIHBvbGljeSBpcyBub3Qgc3VwcG9ydGVkLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIk9NUCBhcHBsaWNhdGlvbiBpcyBydW5uaW5nIGF0IG1heGltdW0gcHJpb3JpdHkgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kuICIKK0NhbnRDaGFuZ2VNb25pdG9yUHJpb3JpdHkgICAgIkNoYW5naW5nIHByaW9yaXR5IG9mIHRoZSBtb25pdG9yIHRocmVhZCBmYWlsZWQ6IgorTW9uaXRvcldpbGxTdGFydmUgICAgICAgICAgICAiRGVhZGxvY2tzIGFyZSBoaWdobHkgcG9zc2libGUgZHVlIHRvIG1vbml0b3IgdGhyZWFkIHN0YXJ2YXRpb24uIgorQ2FudFNldE1vbml0b3JTdGFja1NpemUgICAgICAiVW5hYmxlIHRvIHNldCBtb25pdG9yIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRTZXRXb3JrZXJTdGFja1NpemUgICAgICAgIlVuYWJsZSB0byBzZXQgT01QIHRocmVhZCBzdGFjayBzaXplIHRvICUxJGx1IGJ5dGVzOiIKK0NhbnRJbml0VGhyZWFkQXR0cnMgICAgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgaW5pdGlhbGl6YXRpb24gZmFpbGVkOiIKK0NhbnREZXN0cm95VGhyZWFkQXR0cnMgICAgICAgIlRocmVhZCBhdHRyaWJ1dGUgZGVzdHJveWluZyBmYWlsZWQ6IgorQ2FudFNldFdvcmtlclN0YXRlICAgICAgICAgICAiT01QIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitDYW50U2V0TW9uaXRvclN0YXRlICAgICAgICAgICJNb25pdG9yIHRocmVhZCBqb2luYWJsZSBzdGF0ZSBzZXR0aW5nIGZhaWxlZDoiCitOb1Jlc291cmNlc0ZvcldvcmtlclRocmVhZCAgICJTeXN0ZW0gdW5hYmxlIHRvIGFsbG9jYXRlIG5lY2Vzc2FyeSByZXNvdXJjZXMgZm9yIE9NUCB0aHJlYWQ6IgorTm9SZXNvdXJjZXNGb3JNb25pdG9yVGhyZWFkICAiU3lzdGVtIHVuYWJsZSB0byBhbGxvY2F0ZSBuZWNlc3NhcnkgcmVzb3VyY2VzIGZvciB0aGUgbW9uaXRvciB0aHJlYWQ6IgorQ2FudFRlcm1pbmF0ZVdvcmtlclRocmVhZCAgICAiVW5hYmxlIHRvIHRlcm1pbmF0ZSBPTVAgdGhyZWFkOiIKK1NjaGVkdWxlS2luZE91dE9mUmFuZ2UgICAgICAgIldyb25nIHNjaGVkdWxlIHR5cGUgJTEkZCwgc2VlIDxvbXAuaD4gb3IgPG9tcF9saWIuaD4gZmlsZSBmb3IgdGhlIGxpc3Qgb2YgdmFsdWVzIHN1cHBvcnRlZC4iCitVbmtub3duU2NoZWR1bGluZ1R5cGUgICAgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBcIiUxJGRcIi4iCitJbnZhbGlkVmFsdWUgICAgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIgorU21hbGxWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gc21hbGwuIgorTGFyZ2VWYWx1ZSAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0b28gbGFyZ2UuIgorU3RnSW52YWxpZFZhbHVlICAgICAgICAgICAgICAiJTEkczogXCIlMiRzXCIgaXMgYW4gaW52YWxpZCB2YWx1ZTsgaWdub3JlZC4iCitCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCAgICAgICIlMSRzIHJlbGVhc2UgdmFsdWUgXCIlMiRzXCIgaXMgaW52YWxpZC4iCitCYXJyR2F0aGVyVmFsdWVJbnZhbGlkICAgICAgICIlMSRzIGdhdGhlciB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgc3VwcG9ydGVkIG9ubHkgb24gZGVidWcgYnVpbGRzOyBpZ25vcmVkLiIKK1BhclJhbmdlU3ludGF4ICAgICAgICAgICAgICAgIlN5bnRheCBlcnJvcjogVXNhZ2U6ICUxJHM9WyByb3V0aW5lPTxmdW5jPiB8IGZpbGVuYW1lPTxmaWxlPiB8IHJhbmdlPTxsYj46PHViPiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ8IGV4Y2xfcmFuZ2U9PGxiPjo8dWI+IF0sLi4uIgorVW5iYWxhbmNlZFF1b3RlcyAgICAgICAgICAgICAiVW5iYWxhbmNlZCBxdW90ZXMgaW4gJTEkcy4iCitFbXB0eVN0cmluZyAgICAgICAgICAgICAgICAgICJFbXB0eSBzdHJpbmcgc3BlY2lmaWVkIGZvciAlMSRzOyBpZ25vcmVkLiIKK0xvbmdWYWx1ZSAgICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgaXMgdG9vIGxvbmc7IGlnbm9yZWQuIgorSW52YWxpZENsYXVzZSAgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBjbGF1c2UgaW4gXCIlMiRzXCIuIgorRW1wdHlDbGF1c2UgICAgICAgICAgICAgICAgICAiRW1wdHkgY2xhdXNlIGluICUxJHMuIgorSW52YWxpZENodW5rICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyBpbnZhbGlkIGNodW5rIHNpemUuIgorTGFyZ2VDaHVuayAgICAgICAgICAgICAgICAgICAiJTEkcyB2YWx1ZSBcIiUyJHNcIiBpcyB0byBsYXJnZSBjaHVuayBzaXplLiIKK0lnbm9yZUNodW5rICAgICAgICAgICAgICAgICAgIiUxJHMgdmFsdWUgXCIlMiRzXCIgaXMgaWdub3JlZC4iCitDYW50R2V0UHJvY0ZyZXEgICAgICAgICAgICAgICJDYW5ub3QgZ2V0IHByb2Nlc3NvciBmcmVxdWVuY3ksIHVzaW5nIHplcm8gS01QX0lUVF9QUkVQQVJFX0RFTEFZLiIKK0VudlBhcmFsbGVsV2FybiAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgcGFyYWxsZWwgcmVnaW9uOyBpZ25vcmVkLiIKK0FmZlBhcmFtRGVmaW5lZCAgICAgICAgICAgICAgIiUxJHM6IHBhcmFtZXRlciBoYXMgYmVlbiBzcGVjaWZpZWQgYWxyZWFkeSwgaWdub3JpbmcgXCIlMiRzXCIuIgorQWZmSW52YWxpZFBhcmFtICAgICAgICAgICAgICAiJTEkczogcGFyYW1ldGVyIGludmFsaWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXMgICAgICAgICAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQsIGlnbm9yaW5nIFwiJTIkc1wiLiIKK0FmZk1hbnlQYXJhbXNGb3JMb2dpYyAgICAgICAgIiUxJHM6IHRvbyBtYW55IGludGVnZXIgcGFyYW1ldGVycyBzcGVjaWZpZWQgZm9yIGxvZ2ljYWwgb3IgcGh5c2ljYWwgdHlwZSwgaWdub3JpbmcgXCIlMiRkXCIuIgorQWZmTm9QYXJhbSAgICAgICAgICAgICAgICAgICAiJTEkczogJyUyJHMnIHR5cGUgZG9lcyBub3QgdGFrZSBhbnkgaW50ZWdlciBwYXJhbWV0ZXJzLCBpZ25vcmluZyB0aGVtLiIKK0FmZk5vUHJvY0xpc3QgICAgICAgICAgICAgICAgIiUxJHM6IHByb2NsaXN0IG5vdCBzcGVjaWZpZWQgd2l0aCBleHBsaWNpdCBhZmZpbml0eSB0eXBlLCB1c2luZyBcIm5vbmVcIi4iCitBZmZQcm9jTGlzdE5vVHlwZSAgICAgICAgICAgICIlMSRzOiBwcm9jbGlzdCBzcGVjaWZpZWQsIHNldHRpbmcgYWZmaW5pdHkgdHlwZSB0byBcImV4cGxpY2l0XCIuIgorQWZmUHJvY0xpc3ROb3RFeHBsaWNpdCAgICAgICAiJTEkczogcHJvY2xpc3Qgc3BlY2lmaWVkIHdpdGhvdXQgXCJleHBsaWNpdFwiIGFmZmluaXR5IHR5cGUsIHByb2NsaXN0IGlnbm9yZWQuIgorQWZmU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogc3ludGF4IGVycm9yLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorQWZmWmVyb1N0cmlkZSAgICAgICAgICAgICAgICAiJTEkczogcmFuZ2UgZXJyb3IgKHplcm8gc3RyaWRlKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlN0YXJ0R3JlYXRlckVuZCAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICglMiRkID4gJTMkZCksIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZTdHJpZGVMZXNzWmVybyAgICAgICAgICAgICIlMSRzOiByYW5nZSBlcnJvciAoJTIkZCA8ICUzJGQgJiBzdHJpZGUgPCAwKSwgbm90IHVzaW5nIGFmZmluaXR5LiIKK0FmZlJhbmdlVG9vQmlnICAgICAgICAgICAgICAgIiUxJHM6IHJhbmdlIGVycm9yICgoJTIkZC0lMyRkKS8lNCRkIHRvbyBiaWcpLCBub3QgdXNpbmcgYWZmaW5pdHkuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogJTIkcyBpcyBkZWZpbmVkLiAlMyRzIHdpbGwgYmUgaWdub3JlZC4iCitBZmZOb3RTdXBwb3J0ZWQgICAgICAgICAgICAgICIlMSRzOiBhZmZpbml0eSBub3Qgc3VwcG9ydGVkLCB1c2luZyBcImRpc2FibGVkXCIuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogYWZmaW5pdHkgb25seSBzdXBwb3J0ZWQgZm9yIEludGVsKFIpIHByb2Nlc3NvcnMuIgorR2V0QWZmU3lzQ2FsbE5vdFN1cHBvcnRlZCAgICAiJTEkczogZ2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwgbm90IHN1cHBvcnRlZC4iCitTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkICAgICIlMSRzOiBzZXRhZmZpbml0eSBzeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHB0aHJlYWRfYWZmX3NldF9ucCBjYWxsIG5vdCBmb3VuZC4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIGNhbGwgbm90IGZvdW5kLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IHRoZSBPUyBrZXJuZWwgZG9lcyBub3Qgc3VwcG9ydCBhZmZpbml0eS4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBwdGhyZWFkX2dldF9udW1fcmVzb3VyY2VzX25wIHJldHVybmVkICUyJGQuIgorQWZmQ2FudEdldE1hc2tTaXplICAgICAgICAgICAiJTEkczogY2Fubm90IGRldGVybWluZSBwcm9wZXIgYWZmaW5pdHkgbWFzayBzaXplLiIKK1BhcnNlU2l6ZUludFdhcm4gICAgICAgICAgICAgIiUxJHM9XCIlMiRzXCI6ICUzJHMuIgorUGFyc2VFeHRyYUNoYXJzV2FybiAgICAgICAgICAiJTEkczogZXh0cmEgdHJhaWxpbmcgY2hhcmFjdGVycyBpZ25vcmVkOiBcIiUyJHNcIi4iCitVbmtub3duRm9yY2VSZWR1Y3Rpb24gICAgICAgICIlMSRzOiB1bmtub3duIG1ldGhvZCBcIiUyJHNcIi4iCitUaW1lclVzZUdldHRpbWVvZmRheSAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrX2dldHRpbWUgaXMgdW5kZWZpbmVkLCB1c2luZyBnZXR0aW1lb2ZkYXkuIgorVGltZXJOZWVkTW9yZVBhcmFtICAgICAgICAgICAiS01QX1NUQVRTX1RJTUVSOiBcIiUxJHNcIiBuZWVkcyBhZGRpdGlvbmFsIHBhcmFtZXRlciwgZS5nLiAnY2xvY2tfZ2V0dGltZSwyJy4gVXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVySW52YWxpZFBhcmFtICAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBwYXJhbWV0ZXIgXCIlMSRzXCIgaXMgaW52YWxpZCwgdXNpbmcgZ2V0dGltZW9mZGF5LiIKK1RpbWVyR2V0dGltZUZhaWxlZCAgICAgICAgICAgIktNUF9TVEFUU19USU1FUjogY2xvY2tfZ2V0dGltZSBmYWlsZWQsIHVzaW5nIGdldHRpbWVvZmRheS4iCitUaW1lclVua25vd25GdW5jdGlvbiAgICAgICAgICJLTVBfU1RBVFNfVElNRVI6IGNsb2NrIGZ1bmN0aW9uIHVua25vd24gKGlnbm9yaW5nIHZhbHVlIFwiJTEkc1wiKS4iCitVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgICAgICJVbmtub3duIHNjaGVkdWxpbmcgdHlwZSBkZXRlY3RlZC4iCitEaXNwYXRjaE1hbnlUaHJlYWRzICAgICAgICAgICJUb28gbWFueSB0aHJlYWRzIHRvIHVzZSBhbmFseXRpY2FsIGd1aWRlZCBzY2hlZHVsaW5nIC0gc3dpdGNoaW5nIHRvIGl0ZXJhdGl2ZSBndWlkZWQgc2NoZWR1bGluZy4iCitJdHRMb29rdXBGYWlsZWQgICAgICAgICAgICAgICJpdHRub3RpZnk6IExvb2t1cCBvZiBcIiUxJHNcIiBmdW5jdGlvbiBpbiBcIiUyJHNcIiBsaWJyYXJ5IGZhaWxlZC4iCitJdHRMb2FkTGliRmFpbGVkICAgICAgICAgICAgICJpdHRub3RpZnk6IExvYWRpbmcgXCIlMSRzXCIgbGlicmFyeSBmYWlsZWQuIgorSXR0QWxsTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBBbGwgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0T2JqTm90aWZEaXNhYmxlZCAgICAgICAgICAiaXR0bm90aWZ5OiBPYmplY3Qgc3RhdGUgaXR0IG5vdGlmaWNhdGlvbnMgZGlzYWJsZWQuIgorSXR0TWFya05vdGlmRGlzYWJsZWQgICAgICAgICAiaXR0bm90aWZ5OiBNYXJrIGl0dCBub3RpZmljYXRpb25zIGRpc2FibGVkLiIKK0l0dFVubG9hZExpYkZhaWxlZCAgICAgICAgICAgIml0dG5vdGlmeTogVW5sb2FkaW5nIFwiJTEkc1wiIGxpYnJhcnkgZmFpbGVkLiIKK0NhbnRGb3JtVGhyVGVhbSAgICAgICAgICAgICAgIkNhbm5vdCBmb3JtIGEgdGVhbSB3aXRoICUxJGQgdGhyZWFkcywgdXNpbmcgJTIkZCBpbnN0ZWFkLiIKK0FjdGl2ZUxldmVsc05lZ2F0aXZlICAgICAgICAgIlJlcXVlc3RlZCBudW1iZXIgb2YgYWN0aXZlIHBhcmFsbGVsIGxldmVscyBcIiUxJGRcIiBpcyBuZWdhdGl2ZTsgaWdub3JlZC4iCitBY3RpdmVMZXZlbHNFeGNlZWRMaW1pdCAgICAgICJSZXF1ZXN0ZWQgbnVtYmVyIG9mIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbHMgXCIlMSRkXCIgZXhjZWVkcyBzdXBwb3J0ZWQgbGltaXQ7ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoZSBmb2xsb3dpbmcgbGltaXQgdmFsdWUgd2lsbCBiZSB1c2VkOiBcIiUxJGRcIi4iCitTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCAgICAgICJrbXBfc2V0X2xpYnJhcnkgbXVzdCBvbmx5IGJlIGNhbGxlZCBmcm9tIHRoZSB0b3AgbGV2ZWwgc2VyaWFsIHRocmVhZDsgaWdub3JlZC4iCitGYXRhbFN5c0Vycm9yICAgICAgICAgICAgICAgICJGYXRhbCBzeXN0ZW0gZXJyb3IgZGV0ZWN0ZWQuIgorT3V0T2ZIZWFwTWVtb3J5ICAgICAgICAgICAgICAiT3V0IG9mIGhlYXAgbWVtb3J5LiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkNsZWFyaW5nIF9fS01QX1JFR0lTVEVSRURfTElCIGVudiB2YXIgZmFpbGVkLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGxpYnJhcnkgd2l0aCBlbnYgdmFyIGZhaWxlZC4iCitVc2luZ19pbnRfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkZFwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50X1ZhbHVlICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkdVwiIHdpbGwgYmUgdXNlZC4iCitVc2luZ191aW50NjRfVmFsdWUgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitVc2luZ19zdHJfVmFsdWUgICAgICAgICAgICAgICIlMSRzIHZhbHVlIFwiJTIkc1wiIHdpbGwgYmUgdXNlZC4iCitNYXhWYWx1ZVVzaW5nICAgICAgICAgICAgICAgICIlMSRzIG1heGltdW0gdmFsdWUgXCIlMiRkXCIgd2lsbCBiZSB1c2VkLiIKK01pblZhbHVlVXNpbmcgICAgICAgICAgICAgICAgIiUxJHMgbWluaW11bSB2YWx1ZSBcIiUyJGRcIiB3aWxsIGJlIHVzZWQuIgorTWVtb3J5QWxsb2NGYWlsZWQgICAgICAgICAgICAiTWVtb3J5IGFsbG9jYXRpb24gZmFpbGVkLiIKK0ZpbGVOYW1lVG9vTG9uZyAgICAgICAgICAgICAgIkZpbGUgbmFtZSB0b28gbG9uZy4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb2NrIHRhYmxlIG92ZXJmbG93LiIKK01hbnlUaHJlYWRzRm9yVFBEaXJlY3RpdmUgICAgIlRvbyBtYW55IHRocmVhZHMgdG8gdXNlIHRocmVhZHByaXZhdGUgZGlyZWN0aXZlLiIKK0FmZmluaXR5SW52YWxpZE1hc2sgICAgICAgICAgIiUxJHM6IGludmFsaWQgbWFzay4iCitXcm9uZ0RlZmluaXRpb24gICAgICAgICAgICAgICJXcm9uZyBkZWZpbml0aW9uLiIKK1RMU1NldFZhbHVlRmFpbGVkICAgICAgICAgICAgIldpbmRvd3MqIE9TOiBUTFMgU2V0IFZhbHVlIGZhaWxlZC4iCitUTFNPdXRPZkluZGV4ZXMgICAgICAgICAgICAgICJXaW5kb3dzKiBPUzogVExTIG91dCBvZiBpbmRleGVzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIlBET05FIGRpcmVjdGl2ZSBtdXN0IGJlIG5lc3RlZCB3aXRoaW4gYSBETyBkaXJlY3RpdmUuIgorQ2FudEdldE51bUF2YWlsQ1BVICAgICAgICAgICAiQ2Fubm90IGdldCBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuIgorQXNzdW1lZE51bUNQVSAgICAgICAgICAgICAgICAiQXNzdW1lZCBudW1iZXIgb2YgQ1BVcyBpcyAyLiIKK0Vycm9ySW5pdGlhbGl6ZUFmZmluaXR5ICAgICAgIkVycm9yIGluaXRpYWxpemluZyBhZmZpbml0eSAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitBZmZUaHJlYWRzTWF5TWlncmF0ZSAgICAgICAgICJUaHJlYWRzIG1heSBtaWdyYXRlIGFjcm9zcyBhbGwgYXZhaWxhYmxlIE9TIHByb2NzIChncmFudWxhcml0eSBzZXR0aW5nIHRvbyBjb2Fyc2UpLiIKK0FmZklnbm9yZUludmFsaWRQcm9jSUQgICAgICAgIklnbm9yaW5nIGludmFsaWQgT1MgcHJvYyBJRCAlMSRkLiIKK0FmZk5vVmFsaWRQcm9jSUQgICAgICAgICAgICAgIk5vIHZhbGlkIE9TIHByb2MgSURzIHNwZWNpZmllZCAtIG5vdCB1c2luZyBhZmZpbml0eS4iCitVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICAgICIlMSRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGUgICAgICAgICAgICAgICIlMSRzOiAlMiRzIC0gdXNpbmcgXCJmbGF0XCIgT1MgPC0+IHBoeXNpY2FsIHByb2MgbWFwcGluZy4iCitVc2luZ0ZsYXRPU0ZpbGVMaW5lICAgICAgICAgICIlMSRzLCBsaW5lICUyJGQ6ICUzJHMgLSB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0ZpbGVNc2dFeGl0aW5nICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSBleGl0aW5nLiIKK0ZpbGVMaW5lTXNnRXhpdGluZyAgICAgICAgICAgIiUxJHMsIGxpbmUgJTIkZDogJTMkcyAtIGV4aXRpbmcuIgorQ29uc3RydWN0SWRlbnRJbnZhbGlkICAgICAgICAiQ29uc3RydWN0IGlkZW50aWZpZXIgaW52YWxpZC4iCitUaHJlYWRJZGVudEludmFsaWQgICAgICAgICAgICJUaHJlYWQgaWRlbnRpZmllciBpbnZhbGlkLiIKK1JUTE5vdEluaXRpYWxpemVkICAgICAgICAgICAgInJ1bnRpbWUgbGlicmFyeSBub3QgaW5pdGlhbGl6ZWQuIgorVFBDb21tb25CbG9ja3NJbmNvbnNpc3QgICAgICAiSW5jb25zaXN0ZW50IFRIUkVBRFBSSVZBVEUgY29tbW9uIGJsb2NrIGRlY2xhcmF0aW9ucyBhcmUgbm9uLWNvbmZvcm1pbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYW5kIGFyZSB1bnN1cHBvcnRlZC4gRWl0aGVyIGFsbCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9ja3MgbXVzdCBiZSBkZWNsYXJlZCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJpZGVudGljYWxseSwgb3IgdGhlIGxhcmdlc3QgaW5zdGFuY2Ugb2YgZWFjaCB0aHJlYWRwcml2YXRlIGNvbW1vbiBibG9jayAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJtdXN0IGJlIHJlZmVyZW5jZWQgZmlyc3QgZHVyaW5nIHRoZSBydW4uIgorQ2FudFNldFRocmVhZEFmZk1hc2sgICAgICAgICAiQ2Fubm90IHNldCB0aHJlYWQgYWZmaW5pdHkgbWFzay4iCitDYW50U2V0VGhyZWFkUHJpb3JpdHkgICAgICAgICJDYW5ub3Qgc2V0IHRocmVhZCBwcmlvcml0eS4iCitDYW50Q3JlYXRlVGhyZWFkICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIHRocmVhZC4iCitDYW50Q3JlYXRlRXZlbnQgICAgICAgICAgICAgICJDYW5ub3QgY3JlYXRlIGV2ZW50LiIKK0NhbnRTZXRFdmVudCAgICAgICAgICAgICAgICAgIkNhbm5vdCBzZXQgZXZlbnQuIgorQ2FudENsb3NlSGFuZGxlICAgICAgICAgICAgICAiQ2Fubm90IGNsb3NlIGhhbmRsZS4iCitVbmtub3duTGlicmFyeVR5cGUgICAgICAgICAgICJVbmtub3duIGxpYnJhcnkgdHlwZTogJTEkZC4iCitSZWFwTW9uaXRvckVycm9yICAgICAgICAgICAgICJNb25pdG9yIGRpZCBub3QgcmVhcCBwcm9wZXJseS4iCitSZWFwV29ya2VyRXJyb3IgICAgICAgICAgICAgICJXb3JrZXIgdGhyZWFkIGZhaWxlZCB0byBqb2luLiIKK0NoYW5nZVRocmVhZEFmZk1hc2tFcnJvciAgICAgIkNhbm5vdCBjaGFuZ2UgdGhyZWFkIGFmZmluaXR5IG1hc2suIgorVGhyZWFkc01pZ3JhdGUgICAgICAgICAgICAgICAiJTEkczogVGhyZWFkcyBtYXkgbWlncmF0ZSBhY3Jvc3MgJTIkZCBpbm5lcm1vc3QgbGV2ZWxzIG9mIG1hY2hpbmUiCitEZWNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBkZWNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitJbmNyZWFzZVRvVGhyZWFkcyAgICAgICAgICAgICIlMSRzOiBpbmNyZWFzZSB0byAlMiRkIHRocmVhZHMiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBJbnRlcm5hbCB0aHJlYWQgJTIkZCBib3VuZCB0byBPUyBwcm9jIHNldCAlMyRzIgorQWZmQ2FwYWJsZVVzZUNwdWluZm8gICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmVXNlR2xvYkNwdWlkICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGluZm8iCitBZmZDYXBhYmxlVXNlRmxhdCAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBkZWZhdWx0IFwiZmxhdFwiIHRvcG9sb2d5IgorQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIHVzaW5nIGxvY2FsIGNwdWlkIGluZm8iCitBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbyAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgY3B1aW5mbyBmaWxlIgorQWZmRmxhdFRvcG9sb2d5ICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgbm90IGNhcGFibGUsIGFzc3VtbWluZyBcImZsYXRcIiB0b3BvbG9neSIKK0luaXRPU1Byb2NTZXRSZXNwZWN0ICAgICAgICAgIiUxJHM6IEluaXRpYWwgT1MgcHJvYyBzZXQgcmVzcGVjdGVkOiAlMiRzIgorSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QgICAgICAiJTEkczogSW5pdGlhbCBPUyBwcm9jIHNldCBub3QgcmVzcGVjdGVkOiAlMiRzIgorQXZhaWxhYmxlT1NQcm9jICAgICAgICAgICAgICAiJTEkczogJTIkZCBhdmFpbGFibGUgT1MgcHJvY3MiCitVbmlmb3JtICAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBVbmlmb3JtIHRvcG9sb2d5IgorTm9uVW5pZm9ybSAgICAgICAgICAgICAgICAgICAiJTEkczogTm9udW5pZm9ybSB0b3BvbG9neSIKK1RvcG9sb2d5ICAgICAgICAgICAgICAgICAgICAgIiUxJHM6ICUyJGQgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcCAoW10gPT4gbGV2ZWwgbm90IGluIG1hcCk6IgorT1NQcm9jVG9QYWNrYWdlICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyA8bj4gbWFwcyB0byA8bj50aCBwYWNrYWdlIGNvcmUgMCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSBbdGhyZWFkICU1JGRdIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIFtjb3JlICU0JGRdIHRocmVhZCAlNSRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gW3BhY2thZ2UgJTMkZF0gY29yZSAlNCRkIFt0aHJlYWQgJTUkZF0iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQgW2NvcmUgJTQkZF0gW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIFtwYWNrYWdlICUzJGRdIGNvcmUgJTQkZCB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgW3RocmVhZCAlNSRkXSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBbY29yZSAlNCRkXSB0aHJlYWQgJTUkZCIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IE9TIHByb2MgJTIkZCBtYXBzIHRvIHBhY2thZ2UgJTMkZCBjb3JlICU0JGQgdGhyZWFkICU1JGQiCitPU1Byb2NNYXBUb1BhY2sgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byAlMyRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSW50ZXJuYWwgdGhyZWFkICUyJGQgY2hhbmdlZCBhZmZpbml0eSBtYXNrIGZyb20gJTMkcyB0byAlNCRzIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogT1MgcHJvYyAlMiRkIG1hcHMgdG8gcGFja2FnZSAlMyRkLCBDUFUgJTQkZCwgVFBVICU1JGQiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBwYWNrYWdlICUzJGQsIENQVSAlNCRkIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiJTEkczogSFQgZW5hYmxlZDsgJTIkZCBwYWNrYWdlczsgJTMkZCBUUFU7ICU0JGQgVFBVcyBwZXIgcGFja2FnZSIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IEhUIGRpc2FibGVkOyAlMiRkIHBhY2thZ2VzIgorQmFycmllcnNJbkRpZmZlcmVudE9yZGVyICAgICAiVGhyZWFkcyBlbmNvdW50ZXJlZCBiYXJyaWVycyBpbiBkaWZmZXJlbnQgb3JkZXIuICIKK0Z1bmN0aW9uRXJyb3IgICAgICAgICAgICAgICAgIkZ1bmN0aW9uICUxJHMgZmFpbGVkOiIKK1RvcG9sb2d5RXh0cmEgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgcGFja2FnZXMgeCAlMyRkIGNvcmVzL3BrZyB4ICU0JGQgdGhyZWFkcy9jb3JlICglNSRkIHRvdGFsIGNvcmVzKSIKK1dyb25nTWVzc2FnZUNhdGFsb2cgICAgICAgICAgIkluY29tcGF0aWJsZSBtZXNzYWdlIGNhdGFsb2cgXCIlMSRzXCI6IFZlcnNpb24gXCIlMiRzXCIgZm91bmQsIHZlcnNpb24gXCIlMyRzXCIgZXhwZWN0ZWQuIgorU3RnSWdub3JlZCAgICAgICAgICAgICAgICAgICAiJTEkczogaWdub3JlZCBiZWNhdXNlICUyJHMgaGFzIGJlZW4gZGVmaW5lZCIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJTEsIC0tIG5hbWUgb2YgaWdub3JlZCB2YXJpYWJsZSwgJTIgLS0gbmFtZSBvZiB2YXJpYWJsZSB3aXRoIGhpZ2hlciBwcmlvcml0eS4KK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IG92ZXJyaWRlcyAlMyRzIHNwZWNpZmllZCBiZWZvcmUiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiAtLSBuYW1lIGFuZCB2YWx1ZSBvZiB0aGUgb3ZlcnJpZGluZyB2YXJpYWJsZSwgJTMgLS0gbmFtZSBvZiBvdmVycmlkZW4gdmFyaWFibGUuCisKKyMgLS0tIE9wZW5NUCBlcnJvcnMgZGV0ZWN0ZWQgYXQgcnVudGltZSAtLS0KKyMKKyMgICAgJTEgaXMgdGhlIG5hbWUgb2YgT3Blbk1QIGNvbnN0cnVjdCAoZm9ybWF0dGVkIHdpdGggIlByYWdtYSIgZm9ybWF0KS4KKyMKK0Nuc0JvdW5kVG9Xb3Jrc2hhcmluZyAgICAgICAgIiUxJHMgbXVzdCBiZSBib3VuZCB0byBhIHdvcmstc2hhcmluZyBvciB3b3JrLXF1ZXVpbmcgY29uc3RydWN0IHdpdGggYW4gXCJvcmRlcmVkXCIgY2xhdXNlIgorQ25zRGV0ZWN0ZWRFbmQgICAgICAgICAgICAgICAiRGV0ZWN0ZWQgZW5kIG9mICUxJHMgd2l0aG91dCBmaXJzdCBleGVjdXRpbmcgYSBjb3JyZXNwb25kaW5nIGJlZ2lubmluZy4iCitDbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlICAgICJJdGVyYXRpb24gcmFuZ2UgdG9vIGxhcmdlIGluICUxJHMuIgorQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCAgICAiJTEkcyBtdXN0IG5vdCBoYXZlIGEgbG9vcCBpbmNyZW1lbnQgdGhhdCBldmFsdWF0ZXMgdG8gemVyby4iCisjCisjICAgICUxIGlzIHRoZSBuYW1lIG9mIHRoZSBmaXJzdCBPcGVuTVAgY29uc3RydWN0LCAlMiAtLSB0aGUgbmFtZSBvZiB0aGUgc2Vjb25kIG9uZSAoYm90aCBmb3JtYXR0ZWQgd2l0aCAiUHJhZ21hIiBmb3JtYXQpLgorIworQ25zRXhwZWN0ZWRFbmQgICAgICAgICAgICAgICAiRXhwZWN0ZWQgZW5kIG9mICUxJHM7ICUyJHMsIGhvd2V2ZXIsIGhhcyBtb3N0IHJlY2VudGx5IGJlZ3VuIGV4ZWN1dGlvbi4iCitDbnNJbnZhbGlkTmVzdGluZyAgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyIKK0Nuc011bHRpcGxlTmVzdGluZyAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIGV4ZWN1dGVkIG11bHRpcGxlIHRpbWVzIGR1cmluZyBleGVjdXRpb24gb2Ygb25lIHBhcmFsbGVsIGl0ZXJhdGlvbi9zZWN0aW9uIG9mICUyJHMiCitDbnNOZXN0aW5nU2FtZU5hbWUgICAgICAgICAgICIlMSRzIGlzIGluY29ycmVjdGx5IG5lc3RlZCB3aXRoaW4gJTIkcyBvZiB0aGUgc2FtZSBuYW1lIgorQ25zTm9PcmRlcmVkQ2xhdXNlICAgICAgICAgICAiJTEkcyBpcyBpbmNvcnJlY3RseSBuZXN0ZWQgd2l0aGluICUyJHMgdGhhdCBkb2VzIG5vdCBoYXZlIGFuIFwib3JkZXJlZFwiIGNsYXVzZSIKK0Nuc05vdEluVGFza0NvbnN0cnVjdCAgICAgICAgIiUxJHMgaXMgaW5jb3JyZWN0bHkgbmVzdGVkIHdpdGhpbiAlMiRzIGJ1dCBub3Qgd2l0aGluIGFueSBvZiBpdHMgXCJ0YXNrXCIgY29uc3RydWN0cyIKK0Nuc1RocmVhZHNBdEJhcnJpZXIgICAgICAgICAgIk9uZSB0aHJlYWQgYXQgJTEkcyB3aGlsZSBhbm90aGVyIHRocmVhZCBpcyBhdCAlMiRzLiIKKworIyBOZXcgZXJyb3JzCitDYW50Q29ubmVjdCAgICAgICAgICAgICAgICAgICJDYW5ub3QgY29ubmVjdCB0byAlMSRzIgorQ2FudENvbm5lY3RVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGNvbm5lY3QgdG8gJTEkcyAtIFVzaW5nICUyJHMiCitMaWJOb3RTdXBwb3J0ICAgICAgICAgICAgICAgICIlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorTGliTm90U3VwcG9ydEZvciAgICAgICAgICAgICAiJTEkcyBkb2VzIG5vdCBzdXBwb3J0ICUyJHMgZm9yICUzJHMuIENvbnRpbnVpbmcgd2l0aG91dCB1c2luZyAlMiRzLiIKK1N0YXRpY0xpYk5vdFN1cHBvcnQgICAgICAgICAgIlN0YXRpYyAlMSRzIGRvZXMgbm90IHN1cHBvcnQgJTIkcy4gQ29udGludWluZyB3aXRob3V0IHVzaW5nICUyJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiS01QX0RZTkFNSUNfTU9ERT1pcm1sIGNhbm5vdCBiZSB1c2VkIHdpdGggS01QX1VTRV9JUk1MPTAiCitJdHRVbmtub3duR3JvdXAgICAgICAgICAgICAgICJpdHRub3RpZnk6IFVua25vd24gZ3JvdXAgXCIlMiRzXCIgc3BlY2lmaWVkIGluIGVudmlyb25tZW50IHZhcmlhYmxlIFwiJTEkc1wiLiIKK0l0dEVudlZhclRvb0xvbmcgICAgICAgICAgICAgIml0dG5vdGlmeTogRW52aXJvbm1lbnQgdmFyaWFibGUgXCIlMSRzXCIgdG9vIGxvbmc6IEFjdHVhbCBsZW5ndGhzIGlzICUyJGx1LCBtYXggYWxsb3dlZCBsZW5ndGggaXMgJTMkbHUuIgorQWZmVXNlR2xvYkNwdWlkTDExICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgZ2xvYmFsIGNwdWlkIGxlYWYgMTEgaW5mbyIKK0FmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSAgIiUxJHM6IEFmZmluaXR5IG5vdCBjYXBhYmxlLCB1c2luZyBsb2NhbCBjcHVpZCBsZWFmIDExIGluZm8iCitBZmZJbmZvU3RyICAgICAgICAgICAgICAgICAgICIlMSRzOiAlMiRzLiIKK0FmZkluZm9TdHJTdHIgICAgICAgICAgICAgICAgIiUxJHM6ICUyJHMgLSAlMyRzLiIKK09TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAgICAgIiUxJHM6IE9TIHByb2MgdG8gcGh5c2ljYWwgdGhyZWFkIG1hcDoiCitBZmZVc2luZ0ZsYXRPUyAgICAgICAgICAgICAgICIlMSRzOiB1c2luZyBcImZsYXRcIiBPUyA8LT4gcGh5c2ljYWwgcHJvYyBtYXBwaW5nLiIKK0FmZlBhcnNlRmlsZW5hbWUgICAgICAgICAgICAgIiUxJHM6IHBhcnNpbmcgJTIkcy4iCitNc2dFeGl0aW5nICAgICAgICAgICAgICAgICAgICIlMSRzIC0gZXhpdGluZy4iCitJbmNvbXBhdGlibGVMaWJyYXJ5ICAgICAgICAgICJJbmNvbXBhdGlibGUgJTEkcyBsaWJyYXJ5IHdpdGggdmVyc2lvbiAlMiRzIGZvdW5kLiIKK0l0dEZ1bmN0aW9uRXJyb3IgICAgICAgICAgICAgIml0dG5vdGlmeTogRnVuY3Rpb24gJTEkcyBmYWlsZWQ6IgorSXR0VW5rbm93bkVycm9yICAgICAgICAgICAgICAiaXR0bm9maWZ5OiBFcnJvciAjJTEkZC4iCitFbnZNaWRkbGVXYXJuICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIGZpcnN0IHBhcmFsbGVsIHJlZ2lvbiBvciBjZXJ0YWluIEFQSSBjYWxsczsgaWdub3JlZC4iCitDbnNMb2NrTm90RGVzdHJveWVkICAgICAgICAgICJMb2NrIGluaXRpYWxpemVkIGF0ICUxJHMoJTIkZCkgd2FzIG5vdCBkZXN0cm95ZWQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjICUxLCAlMiwgJTMsICU0IC0tIGZpbGUsIGxpbmUsIGZ1bmMsIGNvbAorQ2FudExvYWRCYWxVc2luZyAgICAgICAgICAgICAiQ2Fubm90IGRldGVybWluZSBtYWNoaW5lIGxvYWQgYmFsYW5jZSAtIFVzaW5nICUxJHMiCitBZmZOb3RDYXBhYmxlVXNlUHRocmVhZCAgICAgICIlMSRzOiBBZmZpbml0eSBub3QgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorQWZmVXNlUHRocmVhZCAgICAgICAgICAgICAgICAiJTEkczogQWZmaW5pdHkgY2FwYWJsZSwgdXNpbmcgcHRocmVhZCBpbmZvIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiTG9hZGluZyBcIiUxJHNcIiBsaWJyYXJ5IGZhaWxlZDoiCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJMb29rdXAgb2YgXCIlMSRzXCIgZnVuY3Rpb24gZmFpbGVkOiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIkJ1ZmZlciB0b28gc21hbGwuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiRXJyb3IgIyUxJGQuIgorTnRoU3ludGF4RXJyb3IgICAgICAgICAgICAgICAiJTEkczogSW52YWxpZCBzeW1ib2xzIGZvdW5kLiBDaGVjayB0aGUgdmFsdWUgXCIlMiRzXCIuIgorTnRoU3BhY2VzTm90QWxsb3dlZCAgICAgICAgICAiJTEkczogU3BhY2VzIGJldHdlZW4gZGlnaXRzIGFyZSBub3QgYWxsb3dlZCBcIiUyJHNcIi4iCitBZmZTdHJQYXJzZUZpbGVuYW1lICAgICAgICAgICIlMSRzOiAlMiRzIC0gcGFyc2luZyAlMyRzLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHMgY2Fubm90IGJlIHNwZWNpZmllZCB2aWEga21wX3NldF9kZWZhdWx0cygpIG9uIHRoaXMgbWFjaGluZSBiZWNhdXNlIGl0IGhhcyBtb3JlIHRoYW4gb25lIHByb2Nlc3NvciBncm91cC4iCitBZmZUeXBlQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IHR5cGUgXCIlMSRzXCIgd2l0aCBtdWx0aXBsZSBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXBzLCB1c2luZyBcIiUyJHNcIi4iCitBZmZHcmFuQ2FudFVzZU11bHRHcm91cHMgICAgICJDYW5ub3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiJTEkc1wiIHdpdGggbXVsdGlwbGUgV2luZG93cyogT1MgcHJvY2Vzc29yIGdyb3VwcywgdXNpbmcgXCIlMiRzXCIuIgorQWZmV2luZG93c1Byb2NHcm91cE1hcCAgICAgICAiJTEkczogTWFwcGluZyBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgPGk+IHByb2MgPGo+IHRvIE9TIHByb2MgNjQqPGk+KzxqPi4iCitBZmZPU1Byb2NUb0dyb3VwICAgICAgICAgICAgICIlMSRzOiBPUyBwcm9jICUyJGQgbWFwcyB0byBXaW5kb3dzKiBPUyBwcm9jZXNzb3IgZ3JvdXAgJTMkZCBwcm9jICU0JGQiCitBZmZCYWxhbmNlZE5vdEF2YWlsICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBiYWxhbmNlZCBpcyBub3QgYXZhaWxhYmxlLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PWNvcmUgd2lsbCBiZSB1c2VkLiIKK0VudkxvY2tXYXJuICAgICAgICAgICAgICAgICAgIiUxJHMgbXVzdCBiZSBzZXQgcHJpb3IgdG8gZmlyc3QgT01QIGxvY2sgY2FsbCBvciBjcml0aWNhbCBzZWN0aW9uOyBpZ25vcmVkLiIKK0Z1dGV4Tm90U3VwcG9ydGVkICAgICAgICAgICAgImZ1dGV4IHN5c3RlbSBjYWxsIG5vdCBzdXBwb3J0ZWQ7ICUxJHM9JTIkcyBpZ25vcmVkLiIKK0FmZkdyYW5Vc2luZyAgICAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PSUyJHMgd2lsbCBiZSB1c2VkLiIKK0FmZkhXU3Vic2V0SW52YWxpZCAgICAgICAgICAgIiUxJHM6IGludmFsaWQgdmFsdWUgXCIlMiRzXCIsIHZhbGlkIGZvcm1hdCBpcyBcIk5zW0BOXSxOY1tATl0sTnQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKG5Tb2NrZXRzQG9mZnNldCwgbkNvcmVzQG9mZnNldCwgblR0aHJlYWRzIHBlciBjb3JlKVwiLiIKK0FmZkhXU3Vic2V0VW5zdXBwb3J0ZWQgICAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlLiIKK0FmZkhXU3Vic2V0TWFueUNvcmVzICAgICAgICAgIktNUF9IV19TVUJTRVQgaWdub3JlZDogdG9vIG1hbnkgY29yZXMgcmVxdWVzdGVkLiIKK1N5bnRheEVycm9yVXNpbmcgICAgICAgICAgICAgIiUxJHM6IHN5bnRheCBlcnJvciwgdXNpbmcgJTIkcy4iCitBZGFwdGl2ZU5vdFN1cHBvcnRlZCAgICAgICAgICIlMSRzOiBBZGFwdGl2ZSBsb2NrcyBhcmUgbm90IHN1cHBvcnRlZDsgdXNpbmcgcXVldWluZy4iCitFbnZTeW50YXhFcnJvciAgICAgICAgICAgICAgICIlMSRzOiBJbnZhbGlkIHN5bWJvbHMgZm91bmQuIENoZWNrIHRoZSB2YWx1ZSBcIiUyJHNcIi4iCitFbnZTcGFjZXNOb3RBbGxvd2VkICAgICAgICAgICIlMSRzOiBTcGFjZXMgYmV0d2VlbiBkaWdpdHMgYXJlIG5vdCBhbGxvd2VkIFwiJTIkc1wiLiIKK0JvdW5kVG9PU1Byb2NTZXQgICAgICAgICAgICAgIiUxJHM6IHBpZCAlMiRkIHRocmVhZCAlMyRkIGJvdW5kIHRvIE9TIHByb2Mgc2V0ICU0JHMiCitDbnNMb29wSW5jcklsbGVnYWwgICAgICAgICAgICIlMSRzIGVycm9yOiBwYXJhbGxlbCBsb29wIGluY3JlbWVudCBhbmQgY29uZGl0aW9uIGFyZSBpbmNvbnNpc3RlbnQuIgorTm9Hb21wQ2FuY2VsbGF0aW9uICAgICAgICAgICAibGliZ29tcCBjYW5jZWxsYXRpb24gaXMgbm90IGN1cnJlbnRseSBzdXBwb3J0ZWQuIgorQWZmSFdTdWJzZXROb25Vbmlmb3JtICAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiBub24tdW5pZm9ybSB0b3BvbG9neS4iCitBZmZIV1N1YnNldE5vblRocmVlTGV2ZWwgICAgICJLTVBfSFdfU1VCU0VUIGlnbm9yZWQ6IG9ubHkgdGhyZWUtbGV2ZWwgdG9wb2xvZ3kgaXMgc3VwcG9ydGVkLiIKK0FmZkdyYW5Ub3BHcm91cCAgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PSUyJHMgaXMgbm90IHN1cHBvcnRlZCB3aXRoIEtNUF9UT1BPTE9HWV9NRVRIT0Q9Z3JvdXAuIFVzaW5nIFwiZ3JhbnVsYXJpdHk9ZmluZVwiLiIKK0FmZkdyYW5Hcm91cFR5cGUgICAgICAgICAgICAgIiUxJHM6IGdyYW51bGFyaXR5PWdyb3VwIGlzIG5vdCBzdXBwb3J0ZWQgd2l0aCBLTVBfQUZGSU5JVFk9JTIkcy4gVXNpbmcgXCJncmFudWxhcml0eT1jb3JlXCIuIgorQWZmSFdTdWJzZXRNYW55U29ja2V0cyAgICAgICAiS01QX0hXX1NVQlNFVCBpZ25vcmVkOiB0b28gbWFueSBzb2NrZXRzIHJlcXVlc3RlZC4iCitBZmZIV1N1YnNldERlcHJlY2F0ZWQgICAgICAgICJLTVBfSFdfU1VCU0VUIFwib1wiIG9mZnNldCBkZXNpZ25hdG9yIGRlcHJlY2F0ZWQsIHBsZWFzZSB1c2UgQCBwcmVmaXggZm9yIG9mZnNldCB2YWx1ZS4iCitBZmZVc2luZ0h3bG9jICAgICAgICAgICAgICAgICIlMSRzOiBBZmZpbml0eSBjYXBhYmxlLCB1c2luZyBod2xvYy4iCitBZmZJZ25vcmluZ0h3bG9jICAgICAgICAgICAgICIlMSRzOiBJZ25vcmluZyBod2xvYyBtZWNoYW5pc20uIgorQWZmSHdsb2NFcnJvck9jY3VycmVkICAgICAgICAiJTEkczogSHdsb2MgZmFpbGVkIGluICUyJHMuIFJlbHlpbmcgb24gaW50ZXJuYWwgYWZmaW5pdHkgbWVjaGFuaXNtcy4iCitFbnZTZXJpYWxXYXJuICAgICAgICAgICAgICAgICIlMSRzIG11c3QgYmUgc2V0IHByaW9yIHRvIE9wZW5NUCBydW50aW1lIGxpYnJhcnkgaW5pdGlhbGl6YXRpb247IGlnbm9yZWQuIgorRW52VmFyRGVwcmVjYXRlZCAgICAgICAgICAgICAiJTEkcyB2YXJpYWJsZSBkZXByZWNhdGVkLCBwbGVhc2UgdXNlICUyJHMgaW5zdGVhZC4iCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLSotIEhJTlRTIC0qLQorIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjIEhpbnRzLiBIaW50IG1heSBiZSBwcmludGVkIGFmdGVyIGEgbWVzc2FnZS4gVXN1YWxseSBpdCBpcyBsb25nZXIgZXhwbGFuYXRpb24gdGV4dCBvciBzdWdnZXN0aW9uLgorIyBUbyBtYWludGFpbiBoaW50IG51bWJlcnMgKHRoZXkgYXJlIHZpc2libGUgdG8gY3VzdG9tZXJzKSwgYWRkIG5ldyBoaW50cyB0byB0aGUgZW5kLgorCitTdWJtaXRCdWdSZXBvcnQgICAgICAgICAgICAgICJQbGVhc2Ugc3VibWl0IGEgYnVnIHJlcG9ydCB3aXRoIHRoaXMgbWVzc2FnZSwgY29tcGlsZSBhbmQgcnVuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbW1hbmRzIHVzZWQsIGFuZCBtYWNoaW5lIGNvbmZpZ3VyYXRpb24gaW5mbyBpbmNsdWRpbmcgbmF0aXZlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImNvbXBpbGVyIGFuZCBvcGVyYXRpbmcgc3lzdGVtIHZlcnNpb25zLiBGYXN0ZXIgcmVzcG9uc2Ugd2lsbCBiZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJvYnRhaW5lZCBieSBpbmNsdWRpbmcgYWxsIHByb2dyYW0gc291cmNlcy4gRm9yIGluZm9ybWF0aW9uIG9uICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInN1Ym1pdHRpbmcgdGhpcyBpc3N1ZSwgcGxlYXNlIHNlZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJodHRwOi8vd3d3LmludGVsLmNvbS9zb2Z0d2FyZS9wcm9kdWN0cy9zdXBwb3J0Ly4iCitPQlNPTEVURSAgICAgICAgICAgICAgICAgICAgICJDaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLCBpdHMgdmFsdWUgaXMgXCIlMSRzXCIuIgorQ2hhbmdlU3RhY2tMaW1pdCAgICAgICAgICAgICAiUGxlYXNlIHRyeSBjaGFuZ2luZyB0aGUgc2hlbGwgc3RhY2sgbGltaXQgb3IgYWRqdXN0aW5nIHRoZSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPTVBfU1RBQ0tTSVpFIGVudmlyb25tZW50IHZhcmlhYmxlLiIKK1Vuc2V0X0FMTF9USFJFQURTICAgICAgICAgICAgIkNvbnNpZGVyIHVuc2V0dGluZyBLTVBfQUxMX1RIUkVBRFMgYW5kIE9NUF9USFJFQURfTElNSVQgKGlmIGVpdGhlciBpcyBzZXQpLiIKK1NldF9BTExfVEhSRUFEUFJJVkFURSAgICAgICAgIkNvbnNpZGVyIHNldHRpbmcgS01QX0FMTF9USFJFQURQUklWQVRFIHRvIGEgdmFsdWUgbGFyZ2VyIHRoYW4gJTEkZC4iCitQb3NzaWJsZVN5c3RlbUxpbWl0T25UaHJlYWRzICJUaGlzIGNvdWxkIGFsc28gYmUgZHVlIHRvIGEgc3lzdGVtLXJlbGF0ZWQgbGltaXQgb24gdGhlIG51bWJlciBvZiB0aHJlYWRzLiIKK0R1cGxpY2F0ZUxpYnJhcnkgICAgICAgICAgICAgIlRoaXMgbWVhbnMgdGhhdCBtdWx0aXBsZSBjb3BpZXMgb2YgdGhlIE9wZW5NUCBydW50aW1lIGhhdmUgYmVlbiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJsaW5rZWQgaW50byB0aGUgcHJvZ3JhbS4gVGhhdCBpcyBkYW5nZXJvdXMsIHNpbmNlIGl0IGNhbiBkZWdyYWRlICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInBlcmZvcm1hbmNlIG9yIGNhdXNlIGluY29ycmVjdCByZXN1bHRzLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGUgYmVzdCB0aGluZyB0byBkbyBpcyB0byBlbnN1cmUgdGhhdCBvbmx5IGEgc2luZ2xlIE9wZW5NUCBydW50aW1lIGlzICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImxpbmtlZCBpbnRvIHRoZSBwcm9jZXNzLCBlLmcuIGJ5IGF2b2lkaW5nIHN0YXRpYyBsaW5raW5nIG9mIHRoZSBPcGVuTVAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAicnVudGltZSBpbiBhbnkgbGlicmFyeS4gQXMgYW4gdW5zYWZlLCB1bnN1cHBvcnRlZCwgdW5kb2N1bWVudGVkIHdvcmthcm91bmQgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAieW91IGNhbiBzZXQgdGhlIGVudmlyb25tZW50IHZhcmlhYmxlIEtNUF9EVVBMSUNBVEVfTElCX09LPVRSVUUgdG8gYWxsb3cgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhlIHByb2dyYW0gdG8gY29udGludWUgdG8gZXhlY3V0ZSwgYnV0IHRoYXQgbWF5IGNhdXNlIGNyYXNoZXMgb3IgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAic2lsZW50bHkgcHJvZHVjZSBpbmNvcnJlY3QgcmVzdWx0cy4gIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiRm9yIG1vcmUgaW5mb3JtYXRpb24sIHBsZWFzZSBzZWUgaHR0cDovL3d3dy5pbnRlbC5jb20vc29mdHdhcmUvcHJvZHVjdHMvc3VwcG9ydC8uIgorTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUgICAiVGhpcyBuYW1lIGlzIHNwZWNpZmllZCBpbiBlbnZpcm9ubWVudCB2YXJpYWJsZSBLTVBfQ1BVSU5GT19GSUxFLiIKK05vdEVub3VnaE1lbW9yeSAgICAgICAgICAgICAgIlNlZW1zIGFwcGxpY2F0aW9uIHJlcXVpcmVkIHRvbyBtdWNoIG1lbW9yeS4iCitWYWxpZEJvb2xWYWx1ZXMgICAgICAgICAgICAgICJVc2UgXCIwXCIsIFwiRkFMU0VcIi4gXCIuRi5cIiwgXCJvZmZcIiwgXCJub1wiIGFzIGZhbHNlIHZhbHVlcywgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiXCIxXCIsIFwiVFJVRVwiLCBcIi5ULlwiLCBcIm9uXCIsIFwieWVzXCIgYXMgdHJ1ZSB2YWx1ZXMuIgorQnVmZmVyT3ZlcmZsb3cgICAgICAgICAgICAgICAiUGVyaGFwcyB0b28gbWFueSB0aHJlYWRzLiIKK1J1bm5pbmdBdE1heFByaW9yaXR5ICAgICAgICAgIkRlY3JlYXNlIHByaW9yaXR5IG9mIGFwcGxpY2F0aW9uLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJUaGlzIHdpbGwgYWxsb3cgdGhlIG1vbml0b3IgdGhyZWFkIHJ1biBhdCBoaWdoZXIgcHJpb3JpdHkgdGhhbiBvdGhlciB0aHJlYWRzLiIKK0NoYW5nZU1vbml0b3JTdGFja1NpemUgICAgICAgIlRyeSBjaGFuZ2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUgb3IgdGhlIHNoZWxsIHN0YWNrIGxpbWl0LiIKK0NoYW5nZVdvcmtlclN0YWNrU2l6ZSAgICAgICAgIlRyeSBjaGFuZ2luZyBPTVBfU1RBQ0tTSVpFIGFuZC9vciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGluY3JlYXNpbmcgT01QX1NUQUNLU0laRSBvciB0aGUgc2hlbGwgc3RhY2sgbGltaXQuIgorRGVjcmVhc2VXb3JrZXJTdGFja1NpemUgICAgICAiVHJ5IGRlY3JlYXNpbmcgT01QX1NUQUNLU0laRS4iCitEZWNyZWFzZV9OVU1fVEhSRUFEUyAgICAgICAgICJUcnkgZGVjcmVhc2luZyB0aGUgdmFsdWUgb2YgT01QX05VTV9USFJFQURTLiIKK0luY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSAgICAgIlRyeSBpbmNyZWFzaW5nIEtNUF9NT05JVE9SX1NUQUNLU0laRS4iCitEZWNyZWFzZU1vbml0b3JTdGFja1NpemUgICAgICJUcnkgZGVjcmVhc2luZyBLTVBfTU9OSVRPUl9TVEFDS1NJWkUuIgorRGVjcmVhc2VOdW1iZXJPZlRocmVhZHNJblVzZSAiVHJ5IGRlY3JlYXNpbmcgdGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHVzZSBzaW11bHRhbmVvdXNseS4iCitEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCAgICAgICJXaWxsIHVzZSBkZWZhdWx0IHNjaGVkdWxlIHR5cGUgKCUxJHMpLiIKK0dldE5ld2VyTGlicmFyeSAgICAgICAgICAgICAgIkl0IGNvdWxkIGJlIGEgcmVzdWx0IG9mIHVzaW5nIGFuIG9sZGVyIE9NUCBsaWJyYXJ5IHdpdGggYSBuZXdlciAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJjb21waWxlciBvciBtZW1vcnkgY29ycnVwdGlvbi4gWW91IG1heSBjaGVjayB0aGUgcHJvcGVyIE9NUCBsaWJyYXJ5ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImlzIGxpbmtlZCB0byB0aGUgYXBwbGljYXRpb24uIgorQ2hlY2tFbnZWYXIgICAgICAgICAgICAgICAgICAiQ2hlY2sgJTEkcyBlbnZpcm9ubWVudCB2YXJpYWJsZSwgaXRzIHZhbHVlIGlzIFwiJTIkc1wiLiIKK09CU09MRVRFICAgICAgICAgICAgICAgICAgICAgIllvdSBtYXkgd2FudCB0byB1c2UgYW4gJTEkcyBsaWJyYXJ5IHRoYXQgc3VwcG9ydHMgJTIkcyBpbnRlcmZhY2Ugd2l0aCB2ZXJzaW9uICUzJHMuIgorT0JTT0xFVEUgICAgICAgICAgICAgICAgICAgICAiWW91IG1heSB3YW50IHRvIHVzZSBhbiAlMSRzIGxpYnJhcnkgd2l0aCB2ZXJzaW9uICUyJHMuIgorQmFkRXhlRm9ybWF0ICAgICAgICAgICAgICAgICAiU3lzdGVtIGVycm9yICMxOTMgaXMgXCJCYWQgZm9ybWF0IG9mIEVYRSBvciBETEwgZmlsZVwiLiAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJVc3VhbGx5IGl0IG1lYW5zIHRoZSBmaWxlIGlzIGZvdW5kLCBidXQgaXQgaXMgY29ycnVwdGVkIG9yICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgImEgZmlsZSBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUuICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkNoZWNrIHdoZXRoZXIgXCIlMSRzXCIgaXMgYSBmaWxlIGZvciAlMiRzIGFyY2hpdGVjdHVyZS4iCitTeXN0ZW1MaW1pdE9uVGhyZWFkcyAgICAgICAgICJTeXN0ZW0tcmVsYXRlZCBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHRocmVhZHMuIgorCisKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBlbmQgb2YgZmlsZSAjCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMGJkODkwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wLmgudmFyCkBAIC0wLDAgKzEsMTY1IEBACisvKgorICogaW5jbHVkZS8zMC9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgICAgICBkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworIyAgICAgICBkZWZpbmUgb21wX3NldF9keW5hbWljICAgICAgICAgICAgICBvbXBjX3NldF9keW5hbWljCisjICAgICAgIGRlZmluZSBvbXBfc2V0X25lc3RlZCAgICAgICAgICAgICAgIG9tcGNfc2V0X25lc3RlZAorIyAgICAgICBkZWZpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAgICBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscworIyAgICAgICBkZWZpbmUgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAgICBvbXBjX3NldF9zY2hlZHVsZQorIyAgICAgICBkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjICAgICAgIGRlZmluZSBvbXBfZ2V0X3RlYW1fc2l6ZSAgICAgICAgICAgIG9tcGNfZ2V0X3RlYW1fc2l6ZQorCisKKyMgICAgICAgZGVmaW5lIGttcF9zZXRfc3RhY2tzaXplICAgICAgICAgICAga21wY19zZXRfc3RhY2tzaXplCisjICAgICAgIGRlZmluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAgIGttcGNfc2V0X3N0YWNrc2l6ZV9zCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorIyAgICAgICBkZWZpbmUga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgICBrbXBjX3NldF9saWJyYXJ5CisjICAgICAgIGRlZmluZSBrbXBfc2V0X2RlZmF1bHRzICAgICAgICAgICAgIGttcGNfc2V0X2RlZmF1bHRzCisjICAgICAgIGRlZmluZSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIGttcGNfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyBrbXBjX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIyAgICAgICBkZWZpbmUga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgICBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworIyAgICAgICBkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworIyAgICAgICBkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworIyAgICAgICBkZWZpbmUga21wX3JlYWxsb2MgICAgICAgICAgICAgICAgICBrbXBjX3JlYWxsb2MKKyMgICAgICAgZGVmaW5lIGttcF9mcmVlICAgICAgICAgICAgICAgICAgICAga21wY19mcmVlCisKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogdGltZSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGRvdWJsZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfd3RpbWUgKHZvaWQpOworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aWNrICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogYWZmaW5pdHkgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eSAgICAgICAgICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYyAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayAgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgICAgKGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyAgIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX21hbGxvYyAgKHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9hbGlnbmVkX21hbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NhbGxvYyAgKHNpemVfdCwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3JlYWxsb2MgKHZvaWQgKiwgc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2ZyZWUgICAgKHZvaWQgKik7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vbih2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF93YXJuaW5nc19vZmYodm9pZCk7CisKKyMgICB1bmRlZiBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKworICAgIC8qIFdhcm5pbmc6CisgICAgICAgVGhlIGZvbGxvd2luZyB0eXBlZGVmcyBhcmUgbm90IHN0YW5kYXJkLCBkZXByZWNhdGVkIGFuZCB3aWxsIGJlIHJlbW92ZWQgaW4gYSBmdXR1cmUgcmVsZWFzZS4KKyAgICAqLworICAgIHR5cGVkZWYgaW50ICAgICBvbXBfaW50X3Q7CisgICAgdHlwZWRlZiBkb3VibGUgIG9tcF93dGltZV90OworCisjICAgaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9CisjICAgZW5kaWYKKworI2VuZGlmIC8qIF9fT01QX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjk4ZGY4ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcF9saWIuZi52YXIKQEAgLTAsMCArMSw2NDQgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmYudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworISoqKgorISoqKiBTb21lIG9mIHRoZSBkaXJlY3RpdmVzIGZvciB0aGUgZm9sbG93aW5nIHJvdXRpbmUgZXh0ZW5kIHBhc3QgY29sdW1uIDcyLAorISoqKiBzbyBwcm9jZXNzIHRoaXMgZmlsZSBpbiAxMzItY29sdW1uIG1vZGUuCishKioqCisKKyFkZWMkIGZpeGVkZm9ybWxpbmVzaXplOjEzMgorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKiksIHBhcmFtZXRlciA6OiBrbXBfYnVpbGRfZGF0ZSAgICA9ICdATElCT01QX0JVSUxEX0RBVEVAJworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfc3RhdGljICA9IDEKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfYXV0byAgICA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX3Rlc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCishZGVjJCBpZiBkZWZpbmVkKF9XSU4zMikKKyFkZWMkICAgaWYgZGVmaW5lZChfV0lONjQpIC5vci4gZGVmaW5lZChfTV9BTUQ2NCkKKworISoqKgorISoqKiBUaGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgbXVzdCBiZSBpbiB1cHBlcmNhc2UsIGV2ZW4gaWYgdGhlIC9RbG93ZXJjYXNlCishKioqIG9wdGlvbiBpcyBzcGVjaWZpZWQuICBUaGUgYWxpYXMgYXR0cmlidXRlIGVuc3VyZXMgdGhhdCB0aGUgc3BlY2lmaWVkCishKioqIHN0cmluZyBpcyB1c2VkIGFzIHRoZSBlbnRyeSBwb2ludC4KKyEqKioKKyEqKiogT24gdGhlIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4KKyEqKiogdW5kZXJzY29yZSBwcmVwZW5kZWQuICBPbiB0aGUgV2luZG93cyogT1MgSW50ZWwoUikgNjQKKyEqKiogYXJjaGl0ZWN0dXJlLCBubyB1bmRlcnNjb3JlIGlzIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2snIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2snIDo6IG9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9EWU5BTUlDJyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfVEhSRUFEUycgOjogb21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lOX1BBUkFMTEVMJyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJyA6OiBvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEhSRUFEX0xJTUlUJyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9MRVZFTCcgOjogb21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTScgOjogb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX1NJWkUnIDo6IG9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElDSycgOjogb21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X2xvY2snIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X2xvY2snIDo6IG9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0X2xvY2snIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRSc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1NFUklBTCc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWSc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5mOTAudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYzNTM5YTEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKQEAgLTAsMCArMSwzNjUgQEAKKyEgaW5jbHVkZS8zMC9vbXBfbGliLmY5MC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCisgICAgICBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IGNfaW50CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IGNfZmxvYXQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9kb3VibGVfa2luZCAgICAgICAgPSBjX2RvdWJsZQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGNfaW50cHRyX3QKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBjX3NpemVfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2FmZmluaXR5X21hc2tfa2luZCA9IGNfaW50cHRyX3QKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCksIHZhbHVlIDo6IGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkgICA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIDo6IG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIHJlYWwgKGtpbmQ9a21wX2RvdWJsZV9raW5kKSBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9jYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXBfbGliLmgudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zODAwNjAyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvMzAvb21wX2xpYi5oLnZhcgpAQCAtMCwwICsxLDY0OSBAQAorISBpbmNsdWRlLzMwL29tcF9saWIuaC52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfaW50ZWdlcl9raW5kICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19raW5kICAgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9zaXplX3Rfa2luZCAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBvcGVubXBfdmVyc2lvbiAgICA9IEBMSUJPTVBfT01QX1lFQVJfTU9OVEhACisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrdmFyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworISAgICAgICAqKioKKyEgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAqKioKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1zZWMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFkZWMkIGlmIGRlZmluZWQoX1dJTjMyKQorIWRlYyQgICBpZiBkZWZpbmVkKF9XSU42NCkgLm9yLiBkZWZpbmVkKF9NX0FNRDY0KQorCishKioqCishKioqIFRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBtdXN0IGJlIGluIHVwcGVyY2FzZSwgZXZlbiBpZiB0aGUgL1Fsb3dlcmNhc2UKKyEqKiogb3B0aW9uIGlzIHNwZWNpZmllZC4gIFRoZSBhbGlhcyBhdHRyaWJ1dGUgZW5zdXJlcyB0aGF0IHRoZSBzcGVjaWZpZWQKKyEqKiogc3RyaW5nIGlzIHVzZWQgYXMgdGhlIGVudHJ5IHBvaW50LgorISoqKgorISoqKiBPbiB0aGUgV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbgorISoqKiB1bmRlcnNjb3JlIHByZXBlbmRlZC4gIE9uIHRoZSBXaW5kb3dzKiBPUyBJbnRlbChSKSA2NAorISoqKiBhcmNoaXRlY3R1cmUsIG5vIHVuZGVyc2NvcmUgaXMgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9EWU5BTUlDJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9NQVhfVEhSRUFEUyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTSc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lOX1BBUkFMTEVMJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfSU5fRklOQUwnOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnOjpvbXBfZ2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9USFJFQURfTElNSVQnOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnOjpvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0xFVkVMJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJzo6b21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RFQU1fU0laRSc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRSc6Om9tcF9nZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfV1RJTUUnOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jayc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jayc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jayc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9TVEFDS1NJWkVfUyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWSc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NSRUFURV9BRkZJTklUWV9NQVNLJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQUxJR05FRF9NQUxMT0MnOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfRlJFRSc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkICAgZWxzZQorCishKioqCishKioqIE9uIFdpbmRvd3MqIE9TIElBLTMyIGFyY2hpdGVjdHVyZSwgdGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIGhhdmUgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX05VTV9USFJFQURTJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9USFJFQURTJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fUFJPQ1MnOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9GSU5BTCc6Om9tcF9pbl9maW5hbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTkVTVEVEJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCc6Om9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9BQ1RJVkVfTEVWRUxTJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnOjpvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJzo6b21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfU0NIRURVTEUnOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRSc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJzo6b21wX2dldF93dGljaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9jayc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJzo6b21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jayc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJzo6b21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jayc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9jayc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrJzo6b21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9jayc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9CTE9DS1RJTUUnOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0RFRkFVTFRTJzo6a21wX3NldF9kZWZhdWx0cworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQkxPQ0tUSU1FJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFknOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfREVTVFJPWV9BRkZJTklUWV9NQVNLJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DQUxMT0MnOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfV0FSTklOR1NfT04nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9maW5hbF8nOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbG9ja18nOjpvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X25lc3RfbG9ja18nOjpvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2RlZmF1bHRzXyc6OmttcF9zZXRfZGVmYXVsdHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYmxvY2t0aW1lXyc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrXyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jYWxsb2NfJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb25fJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgZW5kaWYKKworIWRlYyQgaWYgZGVmaW5lZChfX0FQUExFX18pCisKKyEqKioKKyEqKiogVGhlIE1hYyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiBib3RoIGFuIHVuZGVyc2NvcmUKKyEqKiogYXBwZW5kZWQgYW5kIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9udW1fdGhyZWFkc18nOjpvbXBfc2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9keW5hbWljXyc6Om9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fdGhyZWFkc18nOjpvbXBfZ2V0X251bV90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGhyZWFkc18nOjpvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3Byb2NzXyc6Om9tcF9nZXRfbnVtX3Byb2NzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luX3BhcmFsbGVsXyc6Om9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9maW5hbF8nOjpvbXBfaW5fZmluYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF93dGlja18nOjpvbXBfZ2V0X3d0aWNrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrXyc6Om9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrXyc6Om9tcF9kZXN0cm95X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2tfJzo6b21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrXyc6Om9tcF90ZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrXyc6Om9tcF9kZXN0cm95X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrXyc6Om9tcF90ZXN0X25lc3RfbG9jaworCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2Jsb2NrdGltZV8nOjprbXBfc2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXRfJzo6a21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9kZWZhdWx0c18nOjprbXBfc2V0X2RlZmF1bHRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9nZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2FmZmluaXR5Xyc6OmttcF9zZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY3JlYXRlX2FmZmluaXR5X21hc2tfJzo6a21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9hbGlnbmVkX21hbGxvY18nOjprbXBfYWxpZ25lZF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9mcmVlXyc6OmttcF9mcmVlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBlbmRpZgorCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzMwL29tcHQuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg2MDUwYzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS8zMC9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNDg4IEBACisvKgorICogaW5jbHVkZS8zMC9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZGF0YSB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogaWRlbnRpZmllcnMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3RocmVhZF9pZF90OworI2RlZmluZSBvbXB0X3RocmVhZF9pZF9ub25lICgob21wdF90aHJlYWRfaWRfdCkgMCkgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfdGFza19pZF90OworI2RlZmluZSBvbXB0X3Rhc2tfaWRfbm9uZSAoKG9tcHRfdGFza19pZF90KSAwKSAgICAgICAgIC8qIG5vbi1zdGFuZGFyZCAqLworCit0eXBlZGVmIHVpbnQ2NF90IG9tcHRfcGFyYWxsZWxfaWRfdDsKKyNkZWZpbmUgb21wdF9wYXJhbGxlbF9pZF9ub25lICgob21wdF9wYXJhbGxlbF9pZF90KSAwKSAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3dhaXRfaWRfdDsKKyNkZWZpbmUgb21wdF93YWl0X2lkX25vbmUgKChvbXB0X3dhaXRfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogb21wdF9mcmFtZV90CisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgc3RydWN0IG9tcHRfZnJhbWVfcyB7CisgICAgdm9pZCAqZXhpdF9ydW50aW1lX2ZyYW1lOyAgICAvKiBuZXh0IGZyYW1lIGlzIHVzZXIgY29kZSAgICAgKi8KKyAgICB2b2lkICpyZWVudGVyX3J1bnRpbWVfZnJhbWU7IC8qIHByZXZpb3VzIGZyYW1lIGlzIHVzZXIgY29kZSAqLworfSBvbXB0X2ZyYW1lX3Q7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBlbnVtZXJhdGlvbnMgZm9yIHRocmVhZCBzdGF0ZXMgYW5kIHJ1bnRpbWUgZXZlbnRzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIHN0YXRlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X3N0YXRlX21hY3JvKHN0YXRlLCBjb2RlKSBzdGF0ZSA9IGNvZGUsCisgICAgRk9SRUFDSF9PTVBUX1NUQVRFKG9tcHRfc3RhdGVfbWFjcm8pCisjdW5kZWYgb21wdF9zdGF0ZV9tYWNybworfSBvbXB0X3N0YXRlX3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHJ1bnRpbWUgZXZlbnRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgZW51bSB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBldmVudCA9IGV2ZW50aWQsCisgICAgRk9SRUFDSF9PTVBUX0VWRU5UKG9tcHRfZXZlbnRfbWFjcm8pCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2V2ZW50X3Q7CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIHNldCBjYWxsYmFjayByZXN1bHRzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3IgICAgICAgICAgICAgID0gMCwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrICAgICA9IDEsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X25ldmVyX29jY3VycyAgICAgICAgICAgICAgPSAyLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9tYXlfb2NjdXJfY2FsbGJhY2tfc29tZSAgID0gMywKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX2Fsd2F5cyA9IDQsCit9IG9tcHRfc2V0X3Jlc3VsdF90OworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjYWxsYmFjayBzaWduYXR1cmVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGluaXRpYWxpemF0aW9uICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2ludGVyZmFjZV9mbl90KSh2b2lkKTsKKwordHlwZWRlZiBvbXB0X2ludGVyZmFjZV9mbl90ICgqb21wdF9mdW5jdGlvbl9sb29rdXBfdCkoCisgICAgY29uc3QgY2hhciAqICAgICAgICAgICAgICAgICAgICAgIC8qIGVudHJ5IHBvaW50IHRvIGxvb2sgdXAgICAgICAgKi8KKyk7CisKKy8qIHRocmVhZHMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3RocmVhZF9pbml0aWFsID0gMSwgLy8gc3RhcnQgdGhlIGVudW1lcmF0aW9uIGF0IDEKKyAgICBvbXB0X3RocmVhZF93b3JrZXIgID0gMiwKKyAgICBvbXB0X3RocmVhZF9vdGhlciAgID0gMworfSBvbXB0X3RocmVhZF90eXBlX3Q7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF9pbnZva2VyX3Byb2dyYW0gPSAwLCAgICAgICAgIC8qIHByb2dyYW0gaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KKyAgICBvbXB0X2ludm9rZXJfcnVudGltZSA9IDEgICAgICAgICAgLyogcnVudGltZSBpbnZva2VzIG1hc3RlciB0YXNrICAqLworfSBvbXB0X2ludm9rZXJfdDsKKwordHlwZWRlZiB2b2lkICgqb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCAgIC8qIHR5cGUgb2YgdGhyZWFkICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X3RocmVhZF9pZF90IHRocmVhZF9pZCAgICAgICAgLyogSUQgb2YgdGhyZWFkICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF93YWl0X2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3dhaXRfaWRfdCB3YWl0X2lkICAgICAgICAgICAgLyogd2FpdCBpZCAgICAgICAgICAgICAgICAgICAgICAqLworKTsKKworLyogcGFyYWxsZWwgYW5kIHdvcmtzaGFyZXMgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3dvcmtzaGFyZV9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIHZvaWQgKndvcmtzaGFyZV9mdW5jdGlvbiAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF90YXNrX2ZyYW1lLCAgLyogZnJhbWUgZGF0YSBvZiBwYXJlbnQgdGFzayAgICAqLworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIHRlYW0gICAgKi8KKyAgICB2b2lkICpwYXJhbGxlbF9mdW5jdGlvbiwgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworICAgIG9tcHRfaW52b2tlcl90IGludm9rZXIgICAgICAgICAgICAvKiB3aG8gaW52b2tlcyBtYXN0ZXIgdGFzaz8gICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X2VuZF9wYXJhbGxlbF9jYWxsYmFja190KSAoCisgICAgb21wdF9wYXJhbGxlbF9pZF90IHBhcmFsbGVsX2lkLCAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQsICAgICAgICAgICAvKiBpZCBvZiB0YXNrICAgICAgICAgICAgICAgICAgKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICovCispOworCisvKiB0YXNrcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX3BhaXJfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IGZpcnN0X3Rhc2tfaWQsCisgICAgb21wdF90YXNrX2lkX3Qgc2Vjb25kX3Rhc2tfaWQKKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfbmV3X3Rhc2tfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgZm9yIHBhcmVudCB0YXNrICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCAgbmV3X3Rhc2tfaWQsICAgICAgLyogaWQgb2YgY3JlYXRlZCB0YXNrICAgICAgICAgICAqLworICAgIHZvaWQgKnRhc2tfZnVuY3Rpb24gICAgICAgICAgICAgICAvKiBwb2ludGVyIHRvIG91dGxpbmVkIGZ1bmN0aW9uICovCispOworCisvKiBwcm9ncmFtICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCkgKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsICAgICAgICAgICAgICAgICAvKiBjb21tYW5kIG9mIGNvbnRyb2wgY2FsbCAgICAgICovCisgICAgdWludDY0X3QgbW9kaWZpZXIgICAgICAgICAgICAgICAgIC8qIG1vZGlmaWVyIG9mIGNvbnRyb2wgY2FsbCAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfY2FsbGJhY2tfdCkodm9pZCk7CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG9tcHQgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaWZkZWYgIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisjZGVmaW5lIE9NUFRfQVBJX0ZOVFlQRShmbikgZm4jI190CisKKyNkZWZpbmUgT01QVF9BUElfRlVOQ1RJT04ocmV0dXJuX3R5cGUsIGZuLCBhcmdzKSAgXAorICAgIHR5cGVkZWYgcmV0dXJuX3R5cGUgKCpPTVBUX0FQSV9GTlRZUEUoZm4pKSBhcmdzCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5RVUlSWSBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIHN0YXRlICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3N0YXRlX3QsIG9tcHRfZ2V0X3N0YXRlLCAoCisgICAgb21wdF93YWl0X2lkX3QgKm9tcHRfd2FpdF9pZAorKSk7CisKKy8qIHRocmVhZCAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90aHJlYWRfaWRfdCwgb21wdF9nZXRfdGhyZWFkX2lkLCAodm9pZCkpOworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkICosIG9tcHRfZ2V0X2lkbGVfZnJhbWUsICh2b2lkKSk7CisKKy8qIHBhcmFsbGVsIHJlZ2lvbiAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF9wYXJhbGxlbF9pZF90LCBvbXB0X2dldF9wYXJhbGxlbF9pZCwgKAorICAgIGludCBhbmNlc3Rvcl9sZXZlbAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworLyogdGFzayAqLworT01QVF9BUElfRlVOQ1RJT04ob21wdF90YXNrX2lkX3QsIG9tcHRfZ2V0X3Rhc2tfaWQsICgKKyAgICBpbnQgZGVwdGgKKykpOworCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X2ZyYW1lX3QgKiwgb21wdF9nZXRfdGFza19mcmFtZSwgKAorICAgIGludCBkZXB0aAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogUExBQ0VIT0xERVJTIEZPUiBQRVJGT1JNQU5DRSBSRVBPUlRJTkcKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGlkbGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaWRsZSwgKAorICAgIHZvaWQKKykpOworCisvKiBvdmVyaGVhZCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9vdmVyaGVhZCwgKAorICAgIHZvaWQKKykpOworCisvKiBiYXJyaWVyIHdhaXQgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfYmFycmllcl93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKy8qIHRhc2sgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF90YXNrX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogbXV0ZXggd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9tdXRleF93YWl0LCAoCisgICAgdm9pZAorKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogSU5JVElBTElaQVRJT04gRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X2luaXRpYWxpemUsICgKKyAgICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLAorICAgIGNvbnN0IGNoYXIgKnJ1bnRpbWVfdmVyc2lvbiwKKyAgICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uCispKTsKKworCisvKiBpbml0aWFsaXphdGlvbiBpbnRlcmZhY2UgdG8gYmUgZGVmaW5lZCBieSB0b29sICovCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2wodm9pZCk7CisKK3R5cGVkZWYgZW51bSBvcHRfaW5pdF9tb2RlX2UgeworICAgIG9tcHRfaW5pdF9tb2RlX25ldmVyICA9IDAsCisgICAgb21wdF9pbml0X21vZGVfZmFsc2UgID0gMSwKKyAgICBvbXB0X2luaXRfbW9kZV90cnVlICAgPSAyLAorICAgIG9tcHRfaW5pdF9tb2RlX2Fsd2F5cyA9IDMKK30gb21wdF9pbml0X21vZGVfdDsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X3NldF9jYWxsYmFjaywgKAorICAgIG9tcHRfZXZlbnRfdCBldmVudCwKKyAgICBvbXB0X2NhbGxiYWNrX3QgY2FsbGJhY2sKKykpOworCit0eXBlZGVmIGVudW0gb21wdF9zZXRfY2FsbGJhY2tfcmNfZSB7ICAvKiBub24tc3RhbmRhcmQgKi8KKyAgICBvbXB0X3NldF9jYWxsYmFja19lcnJvciAgICAgID0gMCwKKyAgICBvbXB0X2hhc19ldmVudF9ub19jYWxsYmFjayAgID0gMSwKKyAgICBvbXB0X25vX2V2ZW50X25vX2NhbGxiYWNrICAgID0gMiwKKyAgICBvbXB0X2hhc19ldmVudF9tYXlfY2FsbGJhY2sgID0gMywKKyAgICBvbXB0X2hhc19ldmVudF9tdXN0X2NhbGxiYWNrID0gNCwKK30gb21wdF9zZXRfY2FsbGJhY2tfcmNfdDsKKworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZ2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCAqY2FsbGJhY2sKKykpOworCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIE1JU0NFTExBTkVPVVMgRlVOQ1RJT05TCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBjb250cm9sICovCisvLyBGSVhNRTogcmVtb3ZlIHdvcmthcm91bmQgZm9yIGNsYW5nCisjaWYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKK3ZvaWQgb21wdF9jb250cm9sKAorICAgIHVpbnQ2NF90IGNvbW1hbmQsCisgICAgdWludDY0X3QgbW9kaWZpZXIKKyk7CisjaWYgIWRlZmluZWQoX19jbGFuZ19fKSAmJiBkZWZpbmVkKF9PUEVOTVApICYmIChfT1BFTk1QID49IDIwMTMwNykKKyNwcmFnbWEgb21wIGVuZCBkZWNsYXJlIHRhcmdldAorI2VuZGlmCisKKy8qIHN0YXRlIGVudW1lcmF0aW9uICovCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfZW51bWVyYXRlX3N0YXRlLCAoCisgICAgaW50IGN1cnJlbnRfc3RhdGUsCisgICAgaW50ICpuZXh0X3N0YXRlLAorICAgIGNvbnN0IGNoYXIgKipuZXh0X3N0YXRlX25hbWUKKykpOworCisjaWZkZWYgIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKyNlbmRpZgorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXAuaC52YXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjAzMGRiZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcC5oLnZhcgpAQCAtMCwwICsxLDE2MSBAQAorLyoKKyAqIGluY2x1ZGUvNDAvb21wLmgudmFyCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgX19PTVBfSAorIyAgIGRlZmluZSBfX09NUF9ICisKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fTUFKT1IgICAgQExJQk9NUF9WRVJTSU9OX01BSk9SQAorIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NSU5PUiAgICBATElCT01QX1ZFUlNJT05fTUlOT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyMgICBkZWZpbmUgS01QX0JVSUxEX0RBVEUgICAgICAgIkBMSUJPTVBfQlVJTERfREFURUAiCisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworIyAgIGVuZGlmCisKKyMgICBpZiBkZWZpbmVkKF9XSU4zMikKKyMgICAgICAgZGVmaW5lIF9fS0FJX0tNUENfQ09OVkVOVElPTiBfX2NkZWNsCisjICAgZWxzZQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OCisjICAgZW5kaWYKKworICAgIC8qIHNjaGVkdWxlIGtpbmQgY29uc3RhbnRzICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9zY2hlZF90IHsKKwlvbXBfc2NoZWRfc3RhdGljICA9IDEsCisJb21wX3NjaGVkX2R5bmFtaWMgPSAyLAorCW9tcF9zY2hlZF9ndWlkZWQgID0gMywKKwlvbXBfc2NoZWRfYXV0byAgICA9IDQKKyAgICB9IG9tcF9zY2hlZF90OworCisgICAgLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9udW1fdGhyZWFkcyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9keW5hbWljICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9uZXN0ZWQgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9zY2hlZHVsZSAgICAgICAgICAob21wX3NjaGVkX3QsIGludCk7CisKKyAgICAvKiBxdWVyeSBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9keW5hbWljICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X25lc3RlZCAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbWF4X3RocmVhZHMgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbnVtICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV9wcm9jcyAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbl9wYXJhbGxlbCAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX2ZpbmFsICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2xldmVsICAgICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKGludCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90aHJlYWRfbGltaXQgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscyAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9zY2hlZHVsZSAgICAgICAgICAgIChvbXBfc2NoZWRfdCAqLCBpbnQgKik7CisKKyAgICAvKiBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbG9ja190IHsKKyAgICAgICAgdm9pZCAqIF9sazsKKyAgICB9IG9tcF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3NldF9sb2NrICAgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X2xvY2sgICAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbG9jayAob21wX2xvY2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Rlc3RfbG9jayAgICAob21wX2xvY2tfdCAqKTsKKworICAgIC8qIG5lc3RlZCBsb2NrIEFQSSBmdW5jdGlvbnMgKi8KKyAgICB0eXBlZGVmIHN0cnVjdCBvbXBfbmVzdF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX25lc3RfbG9ja190OworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9pbml0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RfbG9jayAgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3Vuc2V0X25lc3RfbG9jayAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9kZXN0cm95X25lc3RfbG9jayAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9uZXN0X2xvY2sgICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyAgICAvKiBPcGVuTVAgNC4wICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fZGV2aWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90ZWFtcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fbnVtICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfY2FuY2VsbGF0aW9uICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIGttcCBBUEkgZnVuY3Rpb25zICovCisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemUgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHNpemVfdCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfc3RhY2tzaXplX3MgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgKHNpemVfdCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYmxvY2t0aW1lICAgICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9saWJyYXJ5ICAgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5ICAgICAgICAgICAgKGludCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV9zZXJpYWwgICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGVmYXVsdHMgICAgICAgICAgIChjaGFyIGNvbnN0ICopOworCisgICAgLyogSW50ZWwgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIC8qIE9wZW5NUCA0LjAgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9wcm9jX2JpbmRfdCB7CisgICAgICAgIG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgICAgICBvbXBfcHJvY19iaW5kX3RydWUgPSAxLAorICAgICAgICBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzLAorICAgICAgICBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKyAgICB9IG9tcF9wcm9jX2JpbmRfdDsKKworICAgIGV4dGVybiBvbXBfcHJvY19iaW5kX3QgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcHJvY19iaW5kICh2b2lkKTsKKworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfbWFsbG9jICAoc2l6ZV90KTsKKyAgICBleHRlcm4gdm9pZCAqIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2FsaWduZWRfbWFsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfY2FsbG9jICAoc2l6ZV90LCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfcmVhbGxvYyAodm9pZCAqLCBzaXplX3QpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZnJlZSAgICAodm9pZCAqKTsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29uKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3dhcm5pbmdzX29mZih2b2lkKTsKKworIyAgIHVuZGVmIF9fS0FJX0tNUENfQ09OVkVOVElPTgorCisgICAgLyogV2FybmluZzoKKyAgICAgICBUaGUgZm9sbG93aW5nIHR5cGVkZWZzIGFyZSBub3Qgc3RhbmRhcmQsIGRlcHJlY2F0ZWQgYW5kIHdpbGwgYmUgcmVtb3ZlZCBpbiBhIGZ1dHVyZSByZWxlYXNlLgorICAgICovCisgICAgdHlwZWRlZiBpbnQgICAgIG9tcF9pbnRfdDsKKyAgICB0eXBlZGVmIGRvdWJsZSAgb21wX3d0aW1lX3Q7CisKKyMgICBpZmRlZiBfX2NwbHVzcGx1cworICAgIH0KKyMgICBlbmRpZgorCisjZW5kaWYgLyogX19PTVBfSCAqLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmYudmFyIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YWIwNzM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mLnZhcgpAQCAtMCwwICsxLDc2OSBAQAorISBpbmNsdWRlLzQwL29tcF9saWIuZi52YXIKKworIQorIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishLy8KKyEvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCishLy8KKyEvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCishLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCishLy8KKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIQorCishKioqCishKioqIFNvbWUgb2YgdGhlIGRpcmVjdGl2ZXMgZm9yIHRoZSBmb2xsb3dpbmcgcm91dGluZSBleHRlbmQgcGFzdCBjb2x1bW4gNzIsCishKioqIHNvIHByb2Nlc3MgdGhpcyBmaWxlIGluIDEzMi1jb2x1bW4gbW9kZS4KKyEqKioKKworIWRlYyQgZml4ZWRmb3JtbGluZXNpemU6MTMyCisKKyAgICAgIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9naWNhbF9raW5kICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3JlYWxfa2luZCAgICAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX25lc3RfbG9ja19raW5kICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfa2luZCAgICAgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9wb2ludGVyX2tpbmQgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfa2luZCAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlcmZhY2UKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG50aHJlYWRzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMoZW5hYmxlKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGV2ZWwKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlKGtpbmQsIG1vZGlmaWVyKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkKKyAgICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrICgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpY2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZShkZmx0X2RldmljZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGRmbHRfZGV2aWNlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fZGV2aWNlcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbXNlYworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkobGlibnVtKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbGlibnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKQorICAgICAgICAgICAgY2hhcmFjdGVyKigqKSBzdHJpbmcKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX21hbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBhbGlnbm1lbnQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfY2FsbG9jKG5lbGVtLCBlbHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgbmVsZW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfcmVhbGxvYworCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbGtpbmQpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpIGNhbmNlbGtpbmQKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9sb2NrJyA6OiBvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9jaycgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF91bnNldF9uZXN0X2xvY2snIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9jaycgOjogb21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfU1RBQ0tTSVpFX1MnOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0JMT0NLVElNRSc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQnOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQnOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRSc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX1NUQUNLU0laRV9TJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9MSUJSQVJZJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ1JFQVRFX0FGRklOSVRZX01BU0snOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX01BTExPQyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9BTElHTkVEX01BTExPQyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9SRUFMTE9DJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9GUkVFJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfV0FSTklOR1NfT0ZGJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTJyA6OiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgICBlbHNlCisKKyEqKioKKyEqKiogT24gV2luZG93cyogT1MgSUEtMzIgYXJjaGl0ZWN0dXJlLCB0aGUgRm9ydHJhbiBlbnRyeSBwb2ludHMgaGF2ZSBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX0RZTkFNSUMnIDo6IG9tcF9zZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfTkVTVEVEJyA6OiBvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9USFJFQURTJyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfSU5fUEFSQUxMRUwnIDo6IG9tcF9pbl9wYXJhbGxlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfRFlOQU1JQycgOjogb21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9USFJFQURfTElNSVQnIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0xFVkVMJyA6OiBvbXBfZ2V0X2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BQ1RJVkVfTEVWRUwnIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fU0laRScgOjogb21wX2dldF90ZWFtX3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX1NDSEVEVUxFJyA6OiBvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfUFJPQ19CSU5EJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJTUUnIDo6IG9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfREVGQVVMVF9ERVZJQ0UnIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEVBTVMnIDo6IG9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9URUFNX05VTScgOjogb21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JU19JTklUSUFMX0RFVklDRScgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrJyA6OiBvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9jaycgOjogb21wX2Rlc3Ryb3lfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbG9jaycgOjogb21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9jaycgOjogb21wX3Rlc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9jaycgOjogb21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9uZXN0X2xvY2tfJzo6b21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9ja18nOjpvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9uZXN0X2xvY2tfJzo6b21wX3Rlc3RfbmVzdF9sb2NrCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3N0YWNrc2l6ZV9zXyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYmxvY2t0aW1lXyc6OmttcF9zZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXyc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dF8nOjprbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfc3RhY2tzaXplX3NfJzo6a21wX2dldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfbGlicmFyeV8nOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfYWZmaW5pdHlfJzo6a21wX3NldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jXyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9jcmVhdGVfYWZmaW5pdHlfbWFza18nOjprbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9tYWxsb2NfJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2FsaWduZWRfbWFsbG9jXyc6OmttcF9hbGlnbmVkX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfcmVhbGxvY18nOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2ZyZWVfJzo6a21wX2ZyZWUKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29mZl8nOjprbXBfc2V0X3dhcm5pbmdzX29mZgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXyc6OmttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fQVBQTEVfXykKKworISoqKgorISoqKiBUaGUgTWFjIGVudHJ5IHBvaW50cyBhcmUgaW4gbG93ZXJjYXNlLCB3aXRoIGFuIGJvdGggYW4gdW5kZXJzY29yZQorISoqKiBhcHBlbmRlZCBhbmQgYW4gdW5kZXJzY29yZSBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X2R5bmFtaWNfJzo6b21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9uZXN0ZWRfJzo6b21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF90aHJlYWRzXyc6Om9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9udW1fJzo6b21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5fcGFyYWxsZWxfJzo6b21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9keW5hbWljXyc6Om9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90aHJlYWRfbGltaXRfJzo6b21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2xldmVsXyc6Om9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2FjdGl2ZV9sZXZlbF8nOjpvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RlYW1fc2l6ZV8nOjpvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfc2NoZWR1bGVfJzo6b21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfcHJvY19iaW5kXycgOjogb21wX2dldF9wcm9jX2JpbmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aW1lXyc6Om9tcF9nZXRfd3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV90ZWFtc18nOjpvbXBfZ2V0X251bV90ZWFtcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9udW1fJzo6b21wX2dldF90ZWFtX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2lzX2luaXRpYWxfZGV2aWNlXyc6Om9tcF9pc19pbml0aWFsX2RldmljZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lOGU1N2U3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNDU1IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliX2tpbmRzCisKKyAgICAgIG1vZHVsZSBvbXBfbGliCisKKyAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWFqb3IgPSBATElCT01QX1ZFUlNJT05fTUFKT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgICBjaGFyYWN0ZXIoKikgICAgICAgICAgICAgICBrbXBfYnVpbGRfZGF0ZQorICAgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfbWFzdGVyID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3BhcmFsbGVsID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX2xvb3AgPSAyCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfc2VjdGlvbnMgPSAzCisgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9jYW5jZWxfdGFza2dyb3VwID0gNAorCisgICAgICAgIGludGVyZmFjZQorCishICAgICAgICAgKioqCishICAgICAgICAgKioqIG9tcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG50aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnRocmVhZHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQoZW5hYmxlKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSwgdmFsdWUgOjogZW5hYmxlCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9maW5hbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9maW5hbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbGltaXQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgbW9kaWZpZXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGVhbXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9jYW5jZWxsYXRpb24KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCishICAgICAgICAgKioqCishICAgICAgICAgKioqIGttcF8qIGVudHJ5IHBvaW50cworISAgICAgICAgICoqKgorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUobXNlYykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1zZWMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKSBiaW5kKGMpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgICAgdXNlLCBpbnRyaW5zaWMgOjogaXNvX2NfYmluZGluZworICAgICAgICAgICAgY2hhcmFjdGVyIChraW5kPWNfY2hhcikgOjogc3RyaW5nKCopCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYmxvY2t0aW1lCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcF9saWIuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0MDVmZjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNTY3IEBACishIGluY2x1ZGUvNDAvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9tYWpvciA9IEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9taW5vciA9IEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgIGNoYXJhY3RlcigqKSAgICAgICAgICAgICAgIGttcF9idWlsZF9kYXRlCisgICAgICBwYXJhbWV0ZXIoIGttcF9idWlsZF9kYXRlID0gJ0BMSUJPTVBfQlVJTERfREFURUAnICkKKworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9keW5hbWljID0gMgorICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2ZhbHNlID0gMAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9tYXN0ZXIgPSAyCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2Nsb3NlID0gMworICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgIGludGVyZmFjZQorCishICAgICAgICoqKgorISAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcyhudGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG50aHJlYWRzCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYyhlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBlbmFibGUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3Byb2NzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fZmluYWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X2R5bmFtaWMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbmVzdGVkCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IG1heF9sZXZlbHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bShsZXZlbCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCB2YWx1ZSA6OiBraW5kCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbW9kaWZpZXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3NjaGVkX2tpbmQpIGtpbmQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfc2NoZWR1bGUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCkgb21wX2dldF9wcm9jX2JpbmQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpIGJpbmQoYykKKyAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGljaworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGljaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlKGRmbHRfZGV2aWNlKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogZGZsdF9kZXZpY2UKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jayhsb2NrdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZShzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemVfcyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5KGxpYm51bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxpYm51bQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMoc3RyaW5nKSBiaW5kKGMpCisgICAgICAgICAgY2hhcmFjdGVyIHN0cmluZygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2xpYnJhcnkKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHkobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX21hbGxvYyhzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jKHNpemUsIGFsaWdubWVudCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBhbGlnbm1lbnQKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogbmVsZW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGVsc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9yZWFsbG9jKHB0ciwgc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX3JlYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfZnJlZShwdHIpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpLCB2YWx1ZSA6OiBwdHIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29mZgorCisgICAgICBlbmQgaW50ZXJmYWNlCisKKyFESVIkIElGIERFRklORUQgKF9fSU5URUxfT0ZGTE9BRCkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2R5bmFtaWMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9uZXN0ZWQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGhyZWFkcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X21heF90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV9wcm9jcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fcGFyYWxsZWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luX2ZpbmFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RocmVhZF9saW1pdAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9zY2hlZHVsZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfcHJvY19iaW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfd3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGljaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2lzX2luaXRpYWxfZGV2aWNlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fdGVhbXMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90ZWFtX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3N0YWNrc2l6ZV9zCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfYmxvY2t0aW1lCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGVmYXVsdHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2xpYnJhcnkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9hbGlnbmVkX21hbGxvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY2FsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9yZWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9mcmVlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfd2FybmluZ3Nfb24KKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vZmYKKworIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF90aHJlYWRzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGhyZWFkX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9wcm9jcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5fcGFyYWxsZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX2ZpbmFsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfZHluYW1pYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X25lc3RlZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9saW1pdCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FjdGl2ZV9sZXZlbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3NjaGVkdWxlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfcHJvY19iaW5kICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpbWUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF93dGljayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2lzX2luaXRpYWxfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX2RldmljZXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fdGVhbXMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90ZWFtX251bSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfaW5pdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF91bnNldF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9kZXN0cm95X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbmVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF90ZXN0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfbWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9hbGlnbmVkX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfY2FsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9yZWFsbG9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9mcmVlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb24gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF93YXJuaW5nc19vZmYgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQwL29tcHQuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmU2ZTBkZDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80MC9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogaW5jbHVkZS80MC9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcywgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCwgNjkpIC8qIHJlcG9ydCB0YXNrIGRlcGVuZGVuY2VzICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpciwgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICA3MCkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZSBwYWlyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXBlbmRlbmNlcyB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ19lIHsKKyAgICAvLyBhIHR3byBiaXQgZmllbGQgZm9yIHRoZSBkZXBlbmRlbmNlIHR5cGUKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dCAgID0gMSwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luICAgID0gMiwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0ID0gMywKK30gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ190OworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9zIHsKKyAgICB2b2lkICp2YXJpYWJsZV9hZGRyOworICAgIHVpbnQzMl90ICBkZXBlbmRlbmNlX2ZsYWdzOworfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogdGFzayBkZXBlbmRlbmNlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2RlcGVuZGVuY2VzX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgIC8qIElEIG9mIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyAqLworICAgIGNvbnN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHMsLyogdmVjdG9yIG9mIHRhc2sgZGVwZW5kZW5jZXMgICovCisgICAgaW50IG5kZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVwZW5kZW5jZXMgICAgICAgKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcC5oLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcC5oLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMjIyZmZmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wLmgudmFyCkBAIC0wLDAgKzEsMTk4IEBACisvKgorICogaW5jbHVkZS80NS9vbXAuaC52YXIKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBfX09NUF9ICisjICAgZGVmaW5lIF9fT01QX0gKKworIyAgIGRlZmluZSBLTVBfVkVSU0lPTl9NQUpPUiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JACisjICAgZGVmaW5lIEtNUF9WRVJTSU9OX01JTk9SICAgIEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAKKyMgICBkZWZpbmUgS01QX1ZFUlNJT05fQlVJTEQgICAgQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorIyAgIGRlZmluZSBLTVBfQlVJTERfREFURSAgICAgICAiQExJQk9NUF9CVUlMRF9EQVRFQCIKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjICAgZW5kaWYKKworIyAgIGlmIGRlZmluZWQoX1dJTjMyKQorIyAgICAgICBkZWZpbmUgX19LQUlfS01QQ19DT05WRU5USU9OIF9fY2RlY2wKKyMgICBlbHNlCisjICAgICAgIGRlZmluZSBfX0tBSV9LTVBDX0NPTlZFTlRJT04KKyMgICBlbmRpZgorCisgICAgLyogc2NoZWR1bGUga2luZCBjb25zdGFudHMgKi8KKyAgICB0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworCW9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKwlvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisJb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorCW9tcF9zY2hlZF9hdXRvICAgID0gNAorICAgIH0gb21wX3NjaGVkX3Q7CisKKyAgICAvKiBzZXQgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X251bV90aHJlYWRzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2R5bmFtaWMgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X25lc3RlZCAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X3NjaGVkdWxlICAgICAgICAgIChvbXBfc2NoZWRfdCwgaW50KTsKKworICAgIC8qIHF1ZXJ5IEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2R5bmFtaWMgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbmVzdGVkICAgICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGhyZWFkcyAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9udW0gICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbnVtX3Byb2NzICAgICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luX3BhcmFsbGVsICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5fZmluYWwgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYWN0aXZlX2xldmVsICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfbGV2ZWwgICAgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSAoaW50KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF90ZWFtX3NpemUgICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RocmVhZF9saW1pdCAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3NjaGVkdWxlICAgICAgICAgICAgKG9tcF9zY2hlZF90ICosIGludCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9tYXhfdGFza19wcmlvcml0eSAgICh2b2lkKTsKKworICAgIC8qIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9sb2NrX3QgeworICAgICAgICB2b2lkICogX2xrOworICAgIH0gb21wX2xvY2tfdDsKKworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaW5pdF9sb2NrICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfc2V0X2xvY2sgICAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbG9jayAgIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZGVzdHJveV9sb2NrIChvbXBfbG9ja190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGVzdF9sb2NrICAgIChvbXBfbG9ja190ICopOworCisgICAgLyogbmVzdGVkIGxvY2sgQVBJIGZ1bmN0aW9ucyAqLworICAgIHR5cGVkZWYgc3RydWN0IG9tcF9uZXN0X2xvY2tfdCB7CisgICAgICAgIHZvaWQgKiBfbGs7CisgICAgfSBvbXBfbmVzdF9sb2NrX3Q7CisKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2luaXRfbmVzdF9sb2NrICAgIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfbmVzdF9sb2NrICAgICAob21wX25lc3RfbG9ja190ICopOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdW5zZXRfbmVzdF9sb2NrICAgKG9tcF9uZXN0X2xvY2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrIChvbXBfbmVzdF9sb2NrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90ZXN0X25lc3RfbG9jayAgICAob21wX25lc3RfbG9ja190ICopOworCisgICAgLyogbG9jayBoaW50IHR5cGUgZm9yIGR5bmFtaWMgdXNlciBsb2NrICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9sb2NrX2hpbnRfdCB7CisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uZSAgICAgICAgICAgPSAwLAorICAgICAgICBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMSwKKyAgICAgICAgb21wX2xvY2tfaGludF9jb250ZW5kZWQgICAgICA9ICgxPDwxICksCisgICAgICAgIG9tcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUgPSAoMTw8MiApLAorICAgICAgICBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gKDE8PDMgKSwKKyAgICAgICAga21wX2xvY2tfaGludF9obGUgICAgICAgICAgICA9ICgxPDwxNiksCisgICAgICAgIGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAoMTw8MTcpLAorICAgICAgICBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gKDE8PDE4KQorICAgIH0gb21wX2xvY2tfaGludF90OworCisgICAgLyogaGludGVkIGxvY2sgaW5pdGlhbGl6ZXJzICovCisgICAgZXh0ZXJuIHZvaWQgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KG9tcF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChvbXBfbmVzdF9sb2NrX3QgKiwgb21wX2xvY2tfaGludF90KTsKKworICAgIC8qIHRpbWUgQVBJIGZ1bmN0aW9ucyAqLworICAgIGV4dGVybiBkb3VibGUgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3d0aW1lICh2b2lkKTsKKyAgICBleHRlcm4gZG91YmxlIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF93dGljayAodm9pZCk7CisKKyAgICAvKiBPcGVuTVAgNC4wICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UgKGludCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfaXNfaW5pdGlhbF9kZXZpY2UgKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX2dldF9udW1fZGV2aWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X251bV90ZWFtcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X3RlYW1fbnVtICh2b2lkKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF9nZXRfY2FuY2VsbGF0aW9uICh2b2lkKTsKKworIyAgIGluY2x1ZGUgPHN0ZGxpYi5oPgorICAgIC8qIE9wZW5NUCA0LjUgKi8KKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCogX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2FsbG9jKHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gdm9pZCAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2ZyZWUodm9pZCAqLCBpbnQpOworICAgIGV4dGVybiBpbnQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIG9tcF90YXJnZXRfaXNfcHJlc2VudCh2b2lkICosIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9tZW1jcHkodm9pZCAqLCB2b2lkICosIHNpemVfdCwgc2l6ZV90LCBzaXplX3QsIGludCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0KHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIGludCwgY29uc3Qgc2l6ZV90ICosCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqLCBjb25zdCBzaXplX3QgKiwgY29uc3Qgc2l6ZV90ICosIGNvbnN0IHNpemVfdCAqLCBpbnQsIGludCk7CisgICAgZXh0ZXJuIGludCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyKHZvaWQgKiwgdm9pZCAqLCBzaXplX3QsIHNpemVfdCwgaW50KTsKKyAgICBleHRlcm4gaW50ICAgX19LQUlfS01QQ19DT05WRU5USU9OICBvbXBfdGFyZ2V0X2Rpc2Fzc29jaWF0ZV9wdHIodm9pZCAqLCBpbnQpOworCisgICAgLyoga21wIEFQSSBmdW5jdGlvbnMgKi8KKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZSAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gc2l6ZV90IF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9zdGFja3NpemVfcyAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X3N0YWNrc2l6ZV9zICAgICAgICAoc2l6ZV90KTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2dldF9ibG9ja3RpbWUgICAgICAgICAgKHZvaWQpOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2xpYnJhcnkgICAgICAgICAgICAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfYmxvY2t0aW1lICAgICAgICAgIChpbnQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAoaW50KTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9saWJyYXJ5X3NlcmlhbCAgICAgKHZvaWQpOworICAgIGV4dGVybiB2b2lkICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCAodm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0ICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgKGNoYXIgY29uc3QgKik7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyAgIChpbnQpOworCisgICAgLyogSW50ZWwgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiB2b2lkICoga21wX2FmZmluaXR5X21hc2tfdDsKKworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfc2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5ICAgICAgICAgICAgIChrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICAgICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrICAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gdm9pZCAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayAgICAoa21wX2FmZmluaXR5X21hc2tfdCAqKTsKKyAgICBleHRlcm4gaW50ICAgIF9fS0FJX0tNUENfQ09OVkVOVElPTiAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MgICAoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworICAgIGV4dGVybiBpbnQgICAgX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jIChpbnQsIGttcF9hZmZpbml0eV9tYXNrX3QgKik7CisgICAgZXh0ZXJuIGludCAgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jICAgKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKKworICAgIC8qIE9wZW5NUCA0LjAgYWZmaW5pdHkgQVBJICovCisgICAgdHlwZWRlZiBlbnVtIG9tcF9wcm9jX2JpbmRfdCB7CisgICAgICAgIG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwLAorICAgICAgICBvbXBfcHJvY19iaW5kX3RydWUgPSAxLAorICAgICAgICBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIsCisgICAgICAgIG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzLAorICAgICAgICBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKyAgICB9IG9tcF9wcm9jX2JpbmRfdDsKKworICAgIGV4dGVybiBvbXBfcHJvY19iaW5kX3QgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcHJvY19iaW5kICh2b2lkKTsKKworICAgIC8qIE9wZW5NUCA0LjUgYWZmaW5pdHkgQVBJICovCisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfbnVtX3BsYWNlcyAodm9pZCk7CisgICAgZXh0ZXJuIGludCAgX19LQUlfS01QQ19DT05WRU5USU9OIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzIChpbnQpOworICAgIGV4dGVybiB2b2lkIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzIChpbnQsIGludCAqKTsKKyAgICBleHRlcm4gaW50ICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wbGFjZV9udW0gKHZvaWQpOworICAgIGV4dGVybiBpbnQgIF9fS0FJX0tNUENfQ09OVkVOVElPTiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzICh2b2lkKTsKKyAgICBleHRlcm4gdm9pZCBfX0tBSV9LTVBDX0NPTlZFTlRJT04gb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyAoaW50ICopOworCisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9tYWxsb2MgIChzaXplX3QpOworICAgIGV4dGVybiB2b2lkICogX19LQUlfS01QQ19DT05WRU5USU9OICBrbXBfYWxpZ25lZF9tYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9jYWxsb2MgIChzaXplX3QsIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgKiBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9yZWFsbG9jICh2b2lkICosIHNpemVfdCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9mcmVlICAgICh2b2lkICopOworCisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb24odm9pZCk7CisgICAgZXh0ZXJuIHZvaWQgICBfX0tBSV9LTVBDX0NPTlZFTlRJT04gIGttcF9zZXRfd2FybmluZ3Nfb2ZmKHZvaWQpOworCisjICAgdW5kZWYgX19LQUlfS01QQ19DT05WRU5USU9OCisKKyAgICAvKiBXYXJuaW5nOgorICAgICAgIFRoZSBmb2xsb3dpbmcgdHlwZWRlZnMgYXJlIG5vdCBzdGFuZGFyZCwgZGVwcmVjYXRlZCBhbmQgd2lsbCBiZSByZW1vdmVkIGluIGEgZnV0dXJlIHJlbGVhc2UuCisgICAgKi8KKyAgICB0eXBlZGVmIGludCAgICAgb21wX2ludF90OworICAgIHR5cGVkZWYgZG91YmxlICBvbXBfd3RpbWVfdDsKKworIyAgIGlmZGVmIF9fY3BsdXNwbHVzCisgICAgfQorIyAgIGVuZGlmCisKKyNlbmRpZiAvKiBfX09NUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuZi52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmYudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJkNDE3OTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmYudmFyCkBAIC0wLDAgKzEsODQwIEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5mLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishZGVjJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2ludGVnZXJfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2dpY2FsX2tpbmQgICAgICAgPSA0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfa2luZCAgICAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3BvaW50ZXJfa2luZCAgICAgICA9IGludF9wdHJfa2luZCgpCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IGttcF9hZmZpbml0eV9tYXNrX2tpbmQgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopLCBwYXJhbWV0ZXIgOjoga21wX2J1aWxkX2RhdGUgICAgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZHluYW1pYyA9IDIKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9ndWlkZWQgID0gMworICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnRocmVhZHMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBudGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGVuYWJsZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIGVuYWJsZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChlbmFibGUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBlbmFibGUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGhyZWFkcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X21heF90aHJlYWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fcGFyYWxsZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2R5bmFtaWMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9uZXN0ZWQKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMobWF4X2xldmVscykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1heF9sZXZlbHMKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbGV2ZWwKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfYWN0aXZlX2xldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0obGV2ZWwpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsZXZlbAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZShsZXZlbCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGxldmVsCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUoa2luZCwgbW9kaWZpZXIpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtb2RpZmllcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBtb2RpZmllcikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSBraW5kCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG1vZGlmaWVyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSBvbXBfZ2V0X3Byb2NfYmluZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzKHBsYWNlX251bSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzKHBsYWNlX251bSwgaWRzKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcGxhY2VfbnVtCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGFydGl0aW9uX251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zKHBsYWNlX251bXMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGltZSgpCisgICAgICAgICAgICBkb3VibGUgcHJlY2lzaW9uIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljayAoKQorICAgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGZsdF9kZXZpY2UpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBkZmx0X2RldmljZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RlYW1fbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9udW0KKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2lzX2luaXRpYWxfZGV2aWNlCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9pbml0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobG9ja3ZhcikKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF9kZXN0cm95X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jayhsb2NrdmFyKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIGxvY2t2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3Vuc2V0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKGxvY2t2YXIpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfdGVzdF9uZXN0X2xvY2sKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBsb2NrdmFyCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X25lc3RfbG9jaworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZCgpCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpCisgICAgICAgICAgICBjaGFyYWN0ZXIqKCopIHN0cmluZworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfc3RhY2tzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zKCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZSgpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfbGlicmFyeQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHkobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrKG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIHByb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfbWFsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2FsaWduZWRfbWFsbG9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkgc2l6ZQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9jYWxsb2MKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGVsc2l6ZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfcmVhbGxvYyhwdHIsIHNpemUpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwdHIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9yZWFsbG9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIHB0cgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9mcmVlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24oKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb24KKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCkgY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9pbml0X2xvY2tfd2l0aF9oaW50KGxvY2t2YXIsIGxvY2toaW50KQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGxvY2toaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2luaXRfbG9ja193aXRoX2hpbnQKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2NrdmFyLCBsb2NraGludCkKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbG9ja3ZhcgorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpIGxvY2toaW50CisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorCisgICAgICAgIGVuZCBpbnRlcmZhY2UKKworIWRlYyQgaWYgZGVmaW5lZChfV0lOMzIpCishZGVjJCAgIGlmIGRlZmluZWQoX1dJTjY0KSAub3IuIGRlZmluZWQoX01fQU1ENjQpCisKKyEqKioKKyEqKiogVGhlIEZvcnRyYW4gZW50cnkgcG9pbnRzIG11c3QgYmUgaW4gdXBwZXJjYXNlLCBldmVuIGlmIHRoZSAvUWxvd2VyY2FzZQorISoqKiBvcHRpb24gaXMgc3BlY2lmaWVkLiAgVGhlIGFsaWFzIGF0dHJpYnV0ZSBlbnN1cmVzIHRoYXQgdGhlIHNwZWNpZmllZAorISoqKiBzdHJpbmcgaXMgdXNlZCBhcyB0aGUgZW50cnkgcG9pbnQuCishKioqCishKioqIE9uIHRoZSBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuCishKioqIHVuZGVyc2NvcmUgcHJlcGVuZGVkLiAgT24gdGhlIFdpbmRvd3MqIE9TIEludGVsKFIpIDY0CishKioqIGFyY2hpdGVjdHVyZSwgbm8gdW5kZXJzY29yZSBpcyBwcmVwZW5kZWQuCishKioqCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX05FU1RFRCcgOjogb21wX3NldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTlVNX1RIUkVBRFMnIDo6IG9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEhSRUFEX05VTScgOjogb21wX2dldF90aHJlYWRfbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9QUk9DUycgOjogb21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RZTkFNSUMnIDo6IG9tcF9nZXRfZHluYW1pYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9ORVNURUQnIDo6IG9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9TRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMnIDo6IG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQUNUSVZFX0xFVkVMJyA6OiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9BTkNFU1RPUl9USFJFQURfTlVNJyA6OiBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX1NFVF9TQ0hFRFVMRScgOjogb21wX3NldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9TQ0hFRFVMRScgOjogb21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSU1FJyA6OiBvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX1dUSUNLJyA6OiBvbXBfZ2V0X3d0aWNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfU0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9ERVZJQ0VTJyA6OiBvbXBfZ2V0X251bV9kZXZpY2VzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidPTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfVEVBTV9OVU0nIDo6IG9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfQ0FOQ0VMTEFUSU9OJyA6OiBvbXBfZ2V0X2NhbmNlbGxhdGlvbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J09NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9jaycgOjogb21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja193aXRoX2hpbnQnIDo6IG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2snIDo6IG9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X2xvY2snIDo6IG9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2snIDo6IG9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrJyA6OiBvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Vuc2V0X25lc3RfbG9jaycgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkUnOjprbXBfc2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9TVEFDS1NJWkVfUyc6OmttcF9zZXRfc3RhY2tzaXplX3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfTElCUkFSWV9TRVJJQUwnOjprbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORCc6OmttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX0xJQlJBUlknOjprbXBfc2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFJzo6a21wX2dldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0JMT0NLVElNRSc6OmttcF9nZXRfYmxvY2t0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0xJQlJBUlknOjprbXBfZ2V0X2xpYnJhcnkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZJzo6a21wX2dldF9hZmZpbml0eQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0RFU1RST1lfQUZGSU5JVFlfTUFTSyc6OmttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9TRVRfQUZGSU5JVFlfTUFTS19QUk9DJzo6a21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQyc6OmttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfTUFMTE9DJzo6a21wX21hbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfQ0FMTE9DJzo6a21wX2NhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1JFQUxMT0MnOjprbXBfcmVhbGxvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfU0VUX1dBUk5JTkdTX09OJzo6a21wX3NldF93YXJuaW5nc19vbgorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonS01QX1NFVF9XQVJOSU5HU19PRkYnOjprbXBfc2V0X3dhcm5pbmdzX29mZgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidLTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVsc2UKKworISoqKgorISoqKiBPbiBXaW5kb3dzKiBPUyBJQS0zMiBhcmNoaXRlY3R1cmUsIHRoZSBGb3J0cmFuIGVudHJ5IHBvaW50cyBoYXZlIGFuIHVuZGVyc2NvcmUgcHJlcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9OVU1fVEhSRUFEUycgOjogb21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfRFlOQU1JQycgOjogb21wX3NldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ORVNURUQnIDo6IG9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9OVU1fVEhSRUFEUycgOjogb21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTUFYX1RIUkVBRFMnIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX1BST0NTJyA6OiBvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9JTl9QQVJBTExFTCcgOjogb21wX2luX3BhcmFsbGVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9EWU5BTUlDJyA6OiBvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05FU1RFRCcgOjogb21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RIUkVBRF9MSU1JVCcgOjogb21wX2dldF90aHJlYWRfbGltaXQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTJyA6OiBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9NQVhfQUNUSVZFX0xFVkVMUycgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTEVWRUwnIDo6IG9tcF9nZXRfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FDVElWRV9MRVZFTCcgOjogb21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0nIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfVEVBTV9TSVpFJyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9TRVRfU0NIRURVTEUnIDo6IG9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1NDSEVEVUxFJyA6OiBvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9QUk9DX0JJTkQnIDo6IG9tcF9nZXRfcHJvY19iaW5kCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9XVElNRScgOjogb21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfV1RJQ0snIDo6IG9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX0RFRkFVTFRfREVWSUNFJyA6OiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX1NFVF9ERUZBVUxUX0RFVklDRScgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX09NUF9HRVRfTlVNX0RFVklDRVMnIDo6IG9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX05VTV9URUFNUycgOjogb21wX2dldF9udW1fdGVhbXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX1RFQU1fTlVNJyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0dFVF9DQU5DRUxMQVRJT04nIDo6IG9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfT01QX0lTX0lOSVRJQUxfREVWSUNFJyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19PTVBfR0VUX01BWF9UQVNLX1BSSU9SVFknIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2snIDo6IG9tcF9pbml0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9sb2NrX3dpdGhfaGludCcgOjogb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZGVzdHJveV9sb2NrJyA6OiBvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrJyA6OiBvbXBfc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbG9jaycgOjogb21wX3Vuc2V0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdGVzdF9sb2NrJyA6OiBvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrJyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50JyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbmVzdF9sb2NrJyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9jaycgOjogb21wX3NldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfdW5zZXRfbmVzdF9sb2NrJyA6OiBvbXBfdW5zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbmVzdF9sb2NrJyA6OiBvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfU1RBQ0tTSVpFJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1NUQUNLU0laRV9TJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQkxPQ0tUSU1FJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfU0VSSUFMJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX0xJQlJBUllfVEhST1VHSFBVVCc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9MSUJSQVJZJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9TVEFDS1NJWkUnOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfU1RBQ0tTSVpFX1MnOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9CTE9DS1RJTUUnOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9HRVRfTElCUkFSWSc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9TRVRfQUZGSU5JVFknOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWSc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0FGRklOSVRZX01BWF9QUk9DJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0snOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0dFVF9BRkZJTklUWV9NQVNLX1BST0MnOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX0tNUF9NQUxMT0MnOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0FMSUdORURfTUFMTE9DJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0NBTExPQyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfUkVBTExPQyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX0ZSRUUnOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfS01QX1NFVF9XQVJOSU5HU19PTic6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfU0VUX1dBUk5JTkdTX09GRic6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19LTVBfR0VUX0NBTkNFTExBVElPTl9TVEFUVVMnIDo6IGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cworCishZGVjJCAgIGVuZGlmCishZGVjJCBlbmRpZgorCishZGVjJCBpZiBkZWZpbmVkKF9fbGludXgpCisKKyEqKioKKyEqKiogVGhlIExpbnV4KiBPUyBlbnRyeSBwb2ludHMgYXJlIGluIGxvd2VyY2FzZSwgd2l0aCBhbiB1bmRlcnNjb3JlIGFwcGVuZGVkLgorISoqKgorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X251bV90aHJlYWRzXyc6Om9tcF9zZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdGVkXyc6Om9tcF9zZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV90aHJlYWRzXyc6Om9tcF9nZXRfbnVtX3RocmVhZHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF90aHJlYWRfbnVtXyc6Om9tcF9nZXRfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9udW1fcHJvY3NfJzo6b21wX2dldF9udW1fcHJvY3MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZHluYW1pY18nOjpvbXBfZ2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbmVzdGVkXyc6Om9tcF9nZXRfbmVzdGVkCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9tYXhfYWN0aXZlX2xldmVsc18nOjpvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzXyc6Om9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9hY3RpdmVfbGV2ZWxfJzo6b21wX2dldF9hY3RpdmVfbGV2ZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bV8nOjpvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X3NjaGVkdWxlXyc6Om9tcF9zZXRfc2NoZWR1bGUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfc2NoZWR1bGVfJzo6b21wX2dldF9zY2hlZHVsZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2dldF93dGltZV8nOjpvbXBfZ2V0X3d0aW1lCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3d0aWNrXyc6Om9tcF9nZXRfd3RpY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfZGVmYXVsdF9kZXZpY2VfJzo6b21wX2dldF9kZWZhdWx0X2RldmljZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3NldF9kZWZhdWx0X2RldmljZV8nOjpvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X251bV9kZXZpY2VzXyc6Om9tcF9nZXRfbnVtX2RldmljZXMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X3RlYW1fbnVtXyc6Om9tcF9nZXRfdGVhbV9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9nZXRfY2FuY2VsbGF0aW9uXyc6Om9tcF9nZXRfY2FuY2VsbGF0aW9uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2luaXRfbG9ja18nOjpvbXBfaW5pdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9sb2NrX3dpdGhfaGludF8nOjpvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfc2V0X2xvY2tfJzo6b21wX3NldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbG9ja18nOjpvbXBfdW5zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfJzo6b21wX2luaXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF9zZXRfbmVzdF9sb2NrXyc6Om9tcF9zZXRfbmVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidvbXBfdW5zZXRfbmVzdF9sb2NrXyc6Om9tcF91bnNldF9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9zdGFja3NpemVfJzo6a21wX3NldF9zdGFja3NpemUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfc3RhY2tzaXplX3NfJzo6a21wX3NldF9zdGFja3NpemVfcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV9zZXJpYWxfJzo6a21wX3NldF9saWJyYXJ5X3NlcmlhbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmRfJzo6a21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2xpYnJhcnlfJzo6a21wX3NldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X3N0YWNrc2l6ZV8nOjprbXBfZ2V0X3N0YWNrc2l6ZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2Jsb2NrdGltZV8nOjprbXBfZ2V0X2Jsb2NrdGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2dldF9saWJyYXJ5Xyc6OmttcF9nZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5Xyc6OmttcF9nZXRfYWZmaW5pdHkKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFza18nOjprbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworIWRlYyQgYXR0cmlidXRlcyBhbGlhczona21wX21hbGxvY18nOjprbXBfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfY2FsbG9jXyc6OmttcF9jYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9yZWFsbG9jXyc6OmttcF9yZWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfc2V0X3dhcm5pbmdzX29uXyc6OmttcF9zZXRfd2FybmluZ3Nfb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J2ttcF9zZXRfd2FybmluZ3Nfb2ZmXyc6OmttcF9zZXRfd2FybmluZ3Nfb2ZmCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXNfJzo6a21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyFkZWMkIGVuZGlmCisKKyFkZWMkIGlmIGRlZmluZWQoX19BUFBMRV9fKQorCishKioqCishKioqIFRoZSBNYWMgZW50cnkgcG9pbnRzIGFyZSBpbiBsb3dlcmNhc2UsIHdpdGggYW4gYm90aCBhbiB1bmRlcnNjb3JlCishKioqIGFwcGVuZGVkIGFuZCBhbiB1bmRlcnNjb3JlIHByZXBlbmRlZC4KKyEqKioKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbnVtX3RocmVhZHNfJzo6b21wX3NldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfZHluYW1pY18nOjpvbXBfc2V0X2R5bmFtaWMKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RlZF8nOjpvbXBfc2V0X25lc3RlZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RocmVhZHNfJzo6b21wX2dldF9udW1fdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X3RocmVhZHNfJzo6b21wX2dldF9tYXhfdGhyZWFkcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGhyZWFkX251bV8nOjpvbXBfZ2V0X3RocmVhZF9udW0KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X251bV9wcm9jc18nOjpvbXBfZ2V0X251bV9wcm9jcworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbl9wYXJhbGxlbF8nOjpvbXBfaW5fcGFyYWxsZWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X2R5bmFtaWNfJzo6b21wX2dldF9keW5hbWljCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9uZXN0ZWRfJzo6b21wX2dldF9uZXN0ZWQKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfZ2V0X3RocmVhZF9saW1pdF8nOjpvbXBfZ2V0X3RocmVhZF9saW1pdAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX3NldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfJzo6b21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbGV2ZWxfJzo6b21wX2dldF9sZXZlbAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfYWN0aXZlX2xldmVsXyc6Om9tcF9nZXRfYWN0aXZlX2xldmVsCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtXyc6Om9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfdGVhbV9zaXplXyc6Om9tcF9nZXRfdGVhbV9zaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9zY2hlZHVsZV8nOjpvbXBfc2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9zY2hlZHVsZV8nOjpvbXBfZ2V0X3NjaGVkdWxlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9wcm9jX2JpbmRfJyA6OiBvbXBfZ2V0X3Byb2NfYmluZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpbWVfJzo6b21wX2dldF93dGltZQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfd3RpY2tfJzo6b21wX2dldF93dGljaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9nZXRfbnVtX3RlYW1zXyc6Om9tcF9nZXRfbnVtX3RlYW1zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF90ZWFtX251bV8nOjpvbXBfZ2V0X3RlYW1fbnVtCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9jYW5jZWxsYXRpb25fJzo6b21wX2dldF9jYW5jZWxsYXRpb24KKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfaXNfaW5pdGlhbF9kZXZpY2VfJzo6b21wX2lzX2luaXRpYWxfZGV2aWNlCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2dldF9tYXhfdGFza19wcmlvcnR5Xyc6Om9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfJzo6b21wX2luaXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X2xvY2tfd2l0aF9oaW50Xyc6Om9tcF9pbml0X2xvY2tfd2l0aF9oaW50CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2Rlc3Ryb3lfbG9ja18nOjpvbXBfZGVzdHJveV9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3NldF9sb2NrXyc6Om9tcF9zZXRfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9sb2NrXyc6Om9tcF91bnNldF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX3Rlc3RfbG9ja18nOjpvbXBfdGVzdF9sb2NrCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfb21wX2luaXRfbmVzdF9sb2NrXyc6Om9tcF9pbml0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnRfJzo6b21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF9kZXN0cm95X25lc3RfbG9ja18nOjpvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19vbXBfc2V0X25lc3RfbG9ja18nOjpvbXBfc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF91bnNldF9uZXN0X2xvY2tfJzo6b21wX3Vuc2V0X25lc3RfbG9jaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX29tcF90ZXN0X25lc3RfbG9ja18nOjpvbXBfdGVzdF9uZXN0X2xvY2sKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfc3RhY2tzaXplXyc6OmttcF9zZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9zdGFja3NpemVfc18nOjprbXBfc2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9ibG9ja3RpbWVfJzo6a21wX3NldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfc2VyaWFsXyc6OmttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZF8nOjprbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0Xyc6OmttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9saWJyYXJ5Xyc6OmttcF9zZXRfbGlicmFyeQorIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfc3RhY2tzaXplXyc6OmttcF9nZXRfc3RhY2tzaXplCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9zdGFja3NpemVfc18nOjprbXBfZ2V0X3N0YWNrc2l6ZV9zCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9ibG9ja3RpbWVfJzo6a21wX2dldF9ibG9ja3RpbWUKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZ2V0X2xpYnJhcnlfJzo6a21wX2dldF9saWJyYXJ5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF9hZmZpbml0eV8nOjprbXBfc2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV8nOjprbXBfZ2V0X2FmZmluaXR5CishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXhfcHJvY18nOjprbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXyc6OmttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfJzo6a21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jXyc6OmttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18nOjprbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2NfJzo6a21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfbWFsbG9jXyc6OmttcF9tYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfYWxpZ25lZF9tYWxsb2NfJzo6a21wX2FsaWduZWRfbWFsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX2NhbGxvY18nOjprbXBfY2FsbG9jCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3JlYWxsb2NfJzo6a21wX3JlYWxsb2MKKyFkZWMkIGF0dHJpYnV0ZXMgYWxpYXM6J19rbXBfZnJlZV8nOjprbXBfZnJlZQorCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vbl8nOjprbXBfc2V0X3dhcm5pbmdzX29uCishZGVjJCBhdHRyaWJ1dGVzIGFsaWFzOidfa21wX3NldF93YXJuaW5nc19vZmZfJzo6a21wX3NldF93YXJuaW5nc19vZmYKKworIWRlYyQgYXR0cmlidXRlcyBhbGlhczonX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1c18nOjprbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKworIWRlYyQgZW5kaWYKKworICAgICAgZW5kIG1vZHVsZSBvbXBfbGliCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuZjkwLnZhciBiL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuZjkwLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZTk3ZDU3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2luY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyCkBAIC0wLDAgKzEsNTI0IEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5mOTAudmFyCisKKyEKKyEvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIS8vCishLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIS8vCishLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIS8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIS8vCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEKKworICAgICAgbW9kdWxlIG9tcF9saWJfa2luZHMKKworICAgICAgICB1c2UsIGludHJpbnNpYyA6OiBpc29fY19iaW5kaW5nCisKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSBjX2ludAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9yZWFsX2tpbmQgICAgICAgICAgPSBjX2Zsb2F0CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfZG91YmxlX2tpbmQgICAgICAgID0gY19kb3VibGUKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBjX2ludHB0cl90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbmVzdF9sb2NrX2tpbmQgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2tpbmQgICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX3NpemVfdF9raW5kICAgICAgICA9IGNfc2l6ZV90CisgICAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gY19pbnRwdHJfdAorICAgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9raW5kICAgICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfa2luZCAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisKKyAgICAgIGVuZCBtb2R1bGUgb21wX2xpYl9raW5kcworCisgICAgICBtb2R1bGUgb21wX2xpYgorCisgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IG9wZW5tcF92ZXJzaW9uICAgID0gQExJQk9NUF9PTVBfWUVBUl9NT05USEAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX3ZlcnNpb25fbWlub3IgPSBATElCT01QX1ZFUlNJT05fTUlOT1JACisgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfdmVyc2lvbl9idWlsZCA9IEBMSUJPTVBfVkVSU0lPTl9CVUlMREAKKyAgICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgICAgcGFyYW1ldGVyKCBrbXBfYnVpbGRfZGF0ZSA9ICdATElCT01QX0JVSUxEX0RBVEVAJyApCisKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9zdGF0aWMgID0gMQorICAgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICAgIGludGVnZXIoa2luZD1vbXBfc2NoZWRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfc2NoZWRfZ3VpZGVkICA9IDMKKyAgICAgICAgaW50ZWdlcihraW5kPW9tcF9zY2hlZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9hdXRvICAgID0gNAorCisKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9mYWxzZSA9IDAKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF90cnVlID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9jbG9zZSA9IDMKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9zcHJlYWQgPSA0CisKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9wYXJhbGxlbCA9IDEKKyAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfY2FuY2VsX2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2NhbmNlbF9sb29wID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3NlY3Rpb25zID0gMworICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9jYW5jZWxfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfY2FuY2VsX3Rhc2tncm91cCA9IDQKKworICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbmUgICAgICAgICAgID0gMAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkICAgID0gMQorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlID0gNAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlICAgID0gOAorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjoga21wX2xvY2tfaGludF9ydG0gICAgICAgICAgICA9IDEzMTA3MgorICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2FkYXB0aXZlICAgICAgID0gMjYyMTQ0CisKKyAgICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgICAqKioKKyEgICAgICAgICAqKiogb21wXyogZW50cnkgcG9pbnRzCishICAgICAgICAgKioqCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMobnVtX3RocmVhZHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW1fdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfbnVtX3RocmVhZHMKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfZHluYW1pYworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZChuZXN0ZWQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpLCB2YWx1ZSA6OiBuZXN0ZWQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fcHJvY3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wcm9jcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9wcm9jcworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9wYXJhbGxlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2luX2ZpbmFsKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX2ZpbmFsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9keW5hbWljKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2dldF9keW5hbWljCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X25lc3RlZAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90aHJlYWRfbGltaXQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKG1heF9sZXZlbHMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtYXhfbGV2ZWxzCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9sZXZlbCgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbGV2ZWwKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hY3RpdmVfbGV2ZWwoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGxldmVsCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogY2h1bmtfc2l6ZQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9zZXRfc2NoZWR1bGUKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBjaHVua19zaXplCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcHJvY19iaW5kCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9wbGFjZXMoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9wbGFjZXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcyhwbGFjZV9udW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wbGFjZV9wcm9jX2lkcyhwbGFjZV9udW0sIGlkcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHBsYWNlX251bQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBpZHMoKikKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BsYWNlX251bSgpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfcGxhY2VfbnVtCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfcGxhY2VfbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMocGxhY2VfbnVtcykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkgcGxhY2VfbnVtcygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgcmVhbCAoa2luZD1rbXBfZG91YmxlX2tpbmQpIG9tcF9nZXRfd3RpbWUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgICAgZnVuY3Rpb24gb21wX2dldF93dGljaygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICByZWFsIChraW5kPWttcF9kb3VibGVfa2luZCkgb21wX2dldF93dGljaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9kZWZhdWx0X2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fZGV2aWNlcworICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X251bV90ZWFtcygpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RlYW1zCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2NhbmNlbGxhdGlvbigpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfY2FuY2VsbGF0aW9uCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9pbml0aWFsX2RldmljZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfdGVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICBlbmQgZnVuY3Rpb24gb21wX3Rlc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sKKworICAgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RfbG9jaworCisgICAgICAgICAgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgICBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX3Rlc3RfbmVzdF9sb2NrCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKworISAgICAgICAgICoqKgorISAgICAgICAgICoqKiBrbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgICAqKioKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zKHNpemUpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfYmxvY2t0aW1lKG1zZWMpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBtc2VjCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9ibG9ja3RpbWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0KCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnkKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cyhzdHJpbmcpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSwgaW50cmluc2ljIDo6IGlzb19jX2JpbmRpbmcKKyAgICAgICAgICAgIGNoYXJhY3RlciAoa2luZD1jX2NoYXIpIDo6IHN0cmluZygqKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfZGVmYXVsdHMKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemUKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplX3MoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpIGttcF9nZXRfc3RhY2tzaXplX3MKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9ibG9ja3RpbWUoKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2Jsb2NrdGltZQorCisgICAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfbGlicmFyeQorCisgICAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5KG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHkKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jKCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sobWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MocHJvYywgbWFzaykgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwcm9jCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9tYWxsb2Moc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9hbGlnbmVkX21hbGxvYyhzaXplLCBhbGlnbm1lbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9hbGlnbmVkX21hbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBzaXplCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2MKKworICAgICAgICAgIGZ1bmN0aW9uIGttcF9jYWxsb2MobmVsZW0sIGVsc2l6ZSkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCkga21wX2NhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBlbHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2NhbGxvYworCisgICAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX2ZyZWUocHRyKSBiaW5kKGMpCisgICAgICAgICAgICB1c2Ugb21wX2xpYl9raW5kcworICAgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSwgdmFsdWUgOjogcHRyCisgICAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX2ZyZWUKKworICAgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3dhcm5pbmdzX29uCisKKyAgICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmKCkgYmluZChjKQorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgICBmdW5jdGlvbiBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMoY2FuY2Vsa2luZCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2NhbmNlbF9raW5kKSwgdmFsdWUgOjogY2FuY2Vsa2luZAorICAgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyAgICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzCisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50KHN2YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICAgIHVzZSBvbXBfbGliX2tpbmRzCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobnZhciwgaGludCkgYmluZChjKQorICAgICAgICAgICAgdXNlIG9tcF9saWJfa2luZHMKKyAgICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHZhbHVlIDo6IGhpbnQKKyAgICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgZW5kIGludGVyZmFjZQorCisgICAgICBlbmQgbW9kdWxlIG9tcF9saWIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcF9saWIuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2Mjg0ZjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXBfbGliLmgudmFyCkBAIC0wLDAgKzEsNjQ0IEBACishIGluY2x1ZGUvNDUvb21wX2xpYi5oLnZhcgorCishCishLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyEvLworIS8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyEvLworIS8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyEvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyEvLworIS8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCishCisKKyEqKioKKyEqKiogU29tZSBvZiB0aGUgZGlyZWN0aXZlcyBmb3IgdGhlIGZvbGxvd2luZyByb3V0aW5lIGV4dGVuZCBwYXN0IGNvbHVtbiA3MiwKKyEqKiogc28gcHJvY2VzcyB0aGlzIGZpbGUgaW4gMTMyLWNvbHVtbiBtb2RlLgorISoqKgorCishRElSJCBmaXhlZGZvcm1saW5lc2l6ZToxMzIKKworICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9pbnRlZ2VyX2tpbmQgICAgICAgPSA0CisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX2xvZ2ljYWxfa2luZCAgICAgICA9IDQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfcmVhbF9raW5kICAgICAgICAgID0gNAorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2tpbmQgICAgICAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9uZXN0X2xvY2tfa2luZCAgICAgPSBpbnRfcHRyX2tpbmQoKQorICAgICAgaW50ZWdlciwgcGFyYW1ldGVyIDo6IG9tcF9zY2hlZF9raW5kICAgICAgICAgPSBvbXBfaW50ZWdlcl9raW5kCisgICAgICBpbnRlZ2VyLCBwYXJhbWV0ZXIgOjogb21wX3Byb2NfYmluZF9raW5kICAgICA9IG9tcF9pbnRlZ2VyX2tpbmQKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfcG9pbnRlcl9raW5kICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfc2l6ZV90X2tpbmQgICAgICAgID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBrbXBfYWZmaW5pdHlfbWFza19raW5kID0gaW50X3B0cl9raW5kKCkKKyAgICAgIGludGVnZXIsIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2tpbmQgICAgID0gb21wX2ludGVnZXJfa2luZAorCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCBwYXJhbWV0ZXIgOjogb3Blbm1wX3ZlcnNpb24gICAgPSBATElCT01QX09NUF9ZRUFSX01PTlRIQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21ham9yID0gQExJQk9NUF9WRVJTSU9OX01BSk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX21pbm9yID0gQExJQk9NUF9WRVJTSU9OX01JTk9SQAorICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF92ZXJzaW9uX2J1aWxkID0gQExJQk9NUF9WRVJTSU9OX0JVSUxEQAorICAgICAgY2hhcmFjdGVyKCopICAgICAgICAgICAgICAga21wX2J1aWxkX2RhdGUKKyAgICAgIHBhcmFtZXRlcigga21wX2J1aWxkX2RhdGUgPSAnQExJQk9NUF9CVUlMRF9EQVRFQCcgKQorCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX3N0YXRpYyAgPSAxCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2R5bmFtaWMgPSAyCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2d1aWRlZCAgPSAzCisgICAgICBpbnRlZ2VyKGtpbmQ9b21wX3NjaGVkX2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX3NjaGVkX2F1dG8gICAgPSA0CisKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfZmFsc2UgPSAwCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3RydWUgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX21hc3RlciA9IDIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX3Byb2NfYmluZF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9wcm9jX2JpbmRfY2xvc2UgPSAzCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9wcm9jX2JpbmRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfcHJvY19iaW5kX3NwcmVhZCA9IDQKKworICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25lICAgICAgICAgICA9IDAKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfdW5jb250ZW5kZWQgICAgPSAxCisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBvbXBfbG9ja19oaW50X2NvbnRlbmRlZCAgICAgID0gMgorICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCBwYXJhbWV0ZXIgOjogb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSA9IDQKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUgICAgPSA4CisgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2hpbnRfa2luZCksIHBhcmFtZXRlciA6OiBrbXBfbG9ja19oaW50X2hsZSAgICAgICAgICAgID0gNjU1MzYKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfcnRtICAgICAgICAgICAgPSAxMzEwNzIKKyAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgcGFyYW1ldGVyIDo6IGttcF9sb2NrX2hpbnRfYWRhcHRpdmUgICAgICAgPSAyNjIxNDQKKworICAgICAgaW50ZXJmYWNlCisKKyEgICAgICAgKioqCishICAgICAgICoqKiBvbXBfKiBlbnRyeSBwb2ludHMKKyEgICAgICAgKioqCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X251bV90aHJlYWRzKG51bV90aHJlYWRzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbnVtX3RocmVhZHMKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9udW1fdGhyZWFkcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9keW5hbWljKGR5bmFtaWNfdGhyZWFkcykgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IGR5bmFtaWNfdGhyZWFkcworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2R5bmFtaWMKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfbmVzdGVkKG5lc3RlZCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCksIHZhbHVlIDo6IG5lc3RlZAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X25lc3RlZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3RocmVhZHMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV90aHJlYWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfdGhyZWFkcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X3RocmVhZHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGhyZWFkX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9udW1fcHJvY3MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3Byb2NzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2luX3BhcmFsbGVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGxvZ2ljYWwgKGtpbmQ9b21wX2xvZ2ljYWxfa2luZCkgb21wX2luX3BhcmFsbGVsCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfaW5fcGFyYWxsZWwKKworICAgICAgICBmdW5jdGlvbiBvbXBfaW5fZmluYWwoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfaW5fZmluYWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9pbl9maW5hbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfZHluYW1pYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9nZXRfZHluYW1pYworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9keW5hbWljCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgbG9naWNhbCAoa2luZD1vbXBfbG9naWNhbF9raW5kKSBvbXBfZ2V0X25lc3RlZAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9uZXN0ZWQKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdCgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGhyZWFkX2xpbWl0CisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3RocmVhZF9saW1pdAorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscyhtYXhfbGV2ZWxzKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbWF4X2xldmVscworICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9tYXhfYWN0aXZlX2xldmVscygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9sZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9sZXZlbAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9hY3RpdmVfbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfYWN0aXZlX2xldmVsCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKGxldmVsKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsZXZlbAorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF90ZWFtX3NpemUobGV2ZWwpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfdGVhbV9zaXplCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbGV2ZWwKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfdGVhbV9zaXplCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X3NjaGVkdWxlKGtpbmQsIGNodW5rX3NpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9zY2hlZF9raW5kKSwgdmFsdWUgOjoga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGNodW5rX3NpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9zY2hlZHVsZQorCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9zY2hlZHVsZShraW5kLCBjaHVua19zaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfc2NoZWRfa2luZCkga2luZAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgY2h1bmtfc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3NjaGVkdWxlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wcm9jX2JpbmQoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfcHJvY19iaW5kX2tpbmQpIG9tcF9nZXRfcHJvY19iaW5kCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3Byb2NfYmluZAorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX3BsYWNlcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fcGxhY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MocGxhY2VfbnVtKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcGxhY2VfbnVtCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bV9wcm9jcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9nZXRfcGxhY2VfcHJvY19pZHMocGxhY2VfbnVtLCBpZHMpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBwbGFjZV9udW0KKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGlkcygqKQorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0oKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X3BsYWNlX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wbGFjZV9udW0KKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlcworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcyhwbGFjZV9udW1zKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBwbGFjZV9udW1zKCopCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9nZXRfcGFydGl0aW9uX3BsYWNlX251bXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3d0aW1lKCkgYmluZChjKQorICAgICAgICAgIGRvdWJsZSBwcmVjaXNpb24gb21wX2dldF93dGltZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF93dGltZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfd3RpY2soKSBiaW5kKGMpCisgICAgICAgICAgZG91YmxlIHByZWNpc2lvbiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X3d0aWNrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9kZWZhdWx0X2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9zZXRfZGVmYXVsdF9kZXZpY2UoZGV2aWNlX251bSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IGRldmljZV9udW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9kZWZhdWx0X2RldmljZQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9nZXRfbnVtX2RldmljZXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV9kZXZpY2VzCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfZ2V0X251bV9kZXZpY2VzCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMoKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBvbXBfZ2V0X251bV90ZWFtcworICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9udW1fdGVhbXMKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X3RlYW1fbnVtKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF90ZWFtX251bQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF90ZWFtX251bQorCisgICAgICAgIGZ1bmN0aW9uIG9tcF9pc19pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF9pc19pbml0aWFsX2RldmljZQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2lzX2luaXRpYWxfZGV2aWNlCisKKyAgICAgICAgZnVuY3Rpb24gb21wX2dldF9pbml0aWFsX2RldmljZSgpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2luaXRfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX2Rlc3Ryb3lfbG9jayhzdmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfZGVzdHJveV9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfZGVzdHJveV9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfc2V0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfc2V0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9sb2NrKHN2YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF91bnNldF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfa2luZCkgc3ZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbG9jaworCisgICAgICAgIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2soc3ZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBsb2dpY2FsIChraW5kPW9tcF9sb2dpY2FsX2tpbmQpIG9tcF90ZXN0X2xvY2sKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9sb2NrX2tpbmQpIHN2YXIKKyAgICAgICAgZW5kIGZ1bmN0aW9uIG9tcF90ZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF9pbml0X25lc3RfbG9jayhudmFyKSBiaW5kKGMpCishRElSJCBJRihfX0lOVEVMX0NPTVBJTEVSLkdFLjE0MDApCishRElSJCBhdHRyaWJ1dGVzIGtub3duX2ludHJpbnNpYyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX2luaXRfbmVzdF9sb2NrCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfZGVzdHJveV9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBFTkRJRgorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9kZXN0cm95X25lc3RfbG9jaworCisgICAgICAgIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3NldF9uZXN0X2xvY2sKKyFESVIkIEVORElGCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbmVzdF9sb2NrX2tpbmQpIG52YXIKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUgb21wX3NldF9uZXN0X2xvY2sKKworICAgICAgICBzdWJyb3V0aW5lIG9tcF91bnNldF9uZXN0X2xvY2sobnZhcikgYmluZChjKQorIURJUiQgSUYoX19JTlRFTF9DT01QSUxFUi5HRS4xNDAwKQorIURJUiQgYXR0cmlidXRlcyBrbm93bl9pbnRyaW5zaWMgOjogb21wX3Vuc2V0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfdW5zZXRfbmVzdF9sb2NrCisKKyAgICAgICAgZnVuY3Rpb24gb21wX3Rlc3RfbmVzdF9sb2NrKG52YXIpIGJpbmQoYykKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyFESVIkIGF0dHJpYnV0ZXMga25vd25faW50cmluc2ljIDo6IG9tcF90ZXN0X25lc3RfbG9jaworIURJUiQgRU5ESUYKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIG9tcF90ZXN0X25lc3RfbG9jaworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX25lc3RfbG9ja19raW5kKSBudmFyCisgICAgICAgIGVuZCBmdW5jdGlvbiBvbXBfdGVzdF9uZXN0X2xvY2sKKworICAgICAgICBmdW5jdGlvbiBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkgb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorICAgICAgICBlbmQgZnVuY3Rpb24gb21wX2dldF9tYXhfdGFza19wcmlvcml0eQorCishICAgICAgICoqKgorISAgICAgICAqKioga21wXyogZW50cnkgcG9pbnRzCishICAgICAgICoqKgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUoc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9zdGFja3NpemUKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfc3RhY2tzaXplX3Moc2l6ZSkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X3N0YWNrc2l6ZV9zCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZShtc2VjKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogbXNlYworICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfc2V0X2Jsb2NrdGltZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3NlcmlhbAorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2xpYnJhcnlfdGhyb3VnaHB1dCgpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfbGlicmFyeShsaWJudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBsaWJudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9saWJyYXJ5CisKKyAgICAgICAgc3Vicm91dGluZSBrbXBfc2V0X2RlZmF1bHRzKHN0cmluZykgYmluZChjKQorICAgICAgICAgIGNoYXJhY3RlciBzdHJpbmcoKikKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kZWZhdWx0cworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9zdGFja3NpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfc3RhY2tzaXplCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCkga21wX2dldF9zdGFja3NpemVfcworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9zdGFja3NpemVfcworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lKCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9ibG9ja3RpbWUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYmxvY2t0aW1lCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9saWJyYXJ5KCkgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCkga21wX2dldF9saWJyYXJ5CisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2xpYnJhcnkKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycyhudW0pIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpLCB2YWx1ZSA6OiBudW0KKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF9kaXNwX251bV9idWZmZXJzCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3NldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eShtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfZ2V0X2FmZmluaXR5CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfZ2V0X2FmZmluaXR5CisKKyAgICAgICAgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYygpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworCisgICAgICAgIHN1YnJvdXRpbmUga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzayhtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfYWZmaW5pdHlfbWFza19raW5kKSBtYXNrCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKworICAgICAgICBmdW5jdGlvbiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2ludGVnZXJfa2luZCksIHZhbHVlIDo6IHByb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9hZmZpbml0eV9tYXNrX2tpbmQpIG1hc2sKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYyhwcm9jLCBtYXNrKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgICAgIGZ1bmN0aW9uIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKHByb2MsIG1hc2spIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9pbnRlZ2VyX2tpbmQpIGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfaW50ZWdlcl9raW5kKSwgdmFsdWUgOjogcHJvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX2FmZmluaXR5X21hc2tfa2luZCkgbWFzaworICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfbWFsbG9jKHNpemUpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9wb2ludGVyX2tpbmQpIGttcF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgZW5kIGZ1bmN0aW9uIGttcF9tYWxsb2MKKworICAgICAgICBmdW5jdGlvbiBrbXBfYWxpZ25lZF9tYWxsb2Moc2l6ZSwgYWxpZ25tZW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfYWxpZ25lZF9tYWxsb2MKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IHNpemUKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPWttcF9zaXplX3Rfa2luZCksIHZhbHVlIDo6IGFsaWdubWVudAorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX2FsaWduZWRfbWFsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX2NhbGxvYyhuZWxlbSwgZWxzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfY2FsbG9jCisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfc2l6ZV90X2tpbmQpLCB2YWx1ZSA6OiBuZWxlbQorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogZWxzaXplCisgICAgICAgIGVuZCBmdW5jdGlvbiBrbXBfY2FsbG9jCisKKyAgICAgICAgZnVuY3Rpb24ga21wX3JlYWxsb2MocHRyLCBzaXplKSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1rbXBfcG9pbnRlcl9raW5kKSBrbXBfcmVhbGxvYworICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3NpemVfdF9raW5kKSwgdmFsdWUgOjogc2l6ZQorICAgICAgICBlbmQgZnVuY3Rpb24ga21wX3JlYWxsb2MKKworICAgICAgICBzdWJyb3V0aW5lIGttcF9mcmVlKHB0cikgYmluZChjKQorICAgICAgICAgIGltcG9ydAorICAgICAgICAgIGludGVnZXIgKGtpbmQ9a21wX3BvaW50ZXJfa2luZCksIHZhbHVlIDo6IHB0cgorICAgICAgICBlbmQgc3Vicm91dGluZSBrbXBfZnJlZQorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbigpIGJpbmQoYykKKyAgICAgICAgZW5kIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vbgorCisgICAgICAgIHN1YnJvdXRpbmUga21wX3NldF93YXJuaW5nc19vZmYoKSBiaW5kKGMpCisgICAgICAgIGVuZCBzdWJyb3V0aW5lIGttcF9zZXRfd2FybmluZ3Nfb2ZmCisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9sb2NrX3dpdGhfaGludChzdmFyLCBoaW50KSBiaW5kKGMpCisgICAgICAgICAgaW1wb3J0CisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19raW5kKSBzdmFyCisgICAgICAgICAgaW50ZWdlciAoa2luZD1vbXBfbG9ja19oaW50X2tpbmQpLCB2YWx1ZSA6OiBoaW50CisgICAgICAgIGVuZCBzdWJyb3V0aW5lIG9tcF9pbml0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgICAgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50KG52YXIsIGhpbnQpIGJpbmQoYykKKyAgICAgICAgICBpbXBvcnQKKyAgICAgICAgICBpbnRlZ2VyIChraW5kPW9tcF9uZXN0X2xvY2tfa2luZCkgbnZhcgorICAgICAgICAgIGludGVnZXIgKGtpbmQ9b21wX2xvY2tfaGludF9raW5kKSwgdmFsdWUgOjogaGludAorICAgICAgICBlbmQgc3Vicm91dGluZSBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyAgICAgIGVuZCBpbnRlcmZhY2UKKworIURJUiQgSUYgREVGSU5FRCAoX19JTlRFTF9PRkZMT0FEKQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfZHluYW1pYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X25lc3RlZAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90aHJlYWRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3RocmVhZHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF90aHJlYWRfbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbnVtX3Byb2NzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbl9wYXJhbGxlbAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5fZmluYWwKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9keW5hbWljCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbmVzdGVkCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfdGhyZWFkX2xpbWl0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9tYXhfYWN0aXZlX2xldmVscworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYWN0aXZlX2xldmVsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fc2l6ZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X3NjaGVkdWxlCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfc2NoZWR1bGUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9wcm9jX2JpbmQKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF93dGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3d0aWNrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3NldF9kZWZhdWx0X2RldmljZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaXNfaW5pdGlhbF9kZXZpY2UKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2dldF9udW1fZGV2aWNlcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X251bV90ZWFtcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfZ2V0X3RlYW1fbnVtCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9pbml0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Vuc2V0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbG9jaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9zZXRfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF91bnNldF9uZXN0X2xvY2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjogb21wX3Rlc3RfbmVzdF9sb2NrCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF9zdGFja3NpemVfcworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2Jsb2NrdGltZQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfbGlicmFyeQorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2RlZmF1bHRzCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfc3RhY2tzaXplX3MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9ibG9ja3RpbWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9saWJyYXJ5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9zZXRfZGlzcF9udW1fYnVmZmVycworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5CishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHkKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfY3JlYXRlX2FmZmluaXR5X21hc2sKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2Rlc3Ryb3lfYWZmaW5pdHlfbWFzaworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9tYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2FsaWduZWRfbWFsbG9jCishRElSJCBBVFRSSUJVVEVTIE9GRkxPQUQ6TUlDIDo6IGttcF9jYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3JlYWxsb2MKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX2ZyZWUKKyFESVIkIEFUVFJJQlVURVMgT0ZGTE9BRDpNSUMgOjoga21wX3NldF93YXJuaW5nc19vbgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBrbXBfc2V0X3dhcm5pbmdzX29mZgorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9sb2NrX3dpdGhfaGludAorIURJUiQgQVRUUklCVVRFUyBPRkZMT0FEOk1JQyA6OiBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisKKyFESVIkIElGKF9fSU5URUxfQ09NUElMRVIuR0UuMTQwMCkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9keW5hbWljICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbmVzdGVkICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RocmVhZHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGhyZWFkcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3RocmVhZF9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9udW1fcHJvY3MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luX3BhcmFsbGVsICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbl9maW5hbCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X2R5bmFtaWMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9uZXN0ZWQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF90aHJlYWRfbGltaXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9tYXhfYWN0aXZlX2xldmVscyApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hY3RpdmVfbGV2ZWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9zaXplICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfc2NoZWR1bGUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9zY2hlZHVsZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3Byb2NfYmluZCApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X3d0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfd3RpY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9kZWZhdWx0X2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfc2V0X2RlZmF1bHRfZGV2aWNlICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pc19pbml0aWFsX2RldmljZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZ2V0X251bV9kZXZpY2VzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfbnVtX3RlYW1zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9nZXRfdGVhbV9udW0gKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2luaXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdW5zZXRfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9sb2NrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfZGVzdHJveV9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3NldF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX3Vuc2V0X25lc3RfbG9jayApCishJG9tcCBkZWNsYXJlIHRhcmdldChvbXBfdGVzdF9uZXN0X2xvY2sgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQob21wX2dldF9tYXhfdGFza19wcmlvcml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3N0YWNrc2l6ZV9zICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYmxvY2t0aW1lICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfbGlicmFyeV9zZXJpYWwgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3R1cm5hcm91bmQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5X3Rocm91Z2hwdXQgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9saWJyYXJ5ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfZGVmYXVsdHMgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemUgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9zdGFja3NpemVfcyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2Jsb2NrdGltZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2xpYnJhcnkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX3NldF9kaXNwX251bV9idWZmZXJzICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHkgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZ2V0X2FmZmluaXR5X21heF9wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzayApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2dldF9hZmZpbml0eV9tYXNrX3Byb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX21hbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfYWxpZ25lZF9tYWxsb2MgKQorISRvbXAgZGVjbGFyZSB0YXJnZXQoa21wX2NhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfcmVhbGxvYyApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfZnJlZSApCishJG9tcCBkZWNsYXJlIHRhcmdldChrbXBfc2V0X3dhcm5pbmdzX29uICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KGttcF9zZXRfd2FybmluZ3Nfb2ZmICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X2xvY2tfd2l0aF9oaW50ICkKKyEkb21wIGRlY2xhcmUgdGFyZ2V0KG9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQgKQorIURJUiQgRU5ESUYKKyFESVIkIEVORElGCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9pbmNsdWRlLzQ1L29tcHQuaC52YXIgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXB0LmgudmFyCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNzE4YzUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvaW5jbHVkZS80NS9vbXB0LmgudmFyCkBAIC0wLDAgKzEsNTE1IEBACisvKgorICogaW5jbHVkZS80NS9vbXB0LmgudmFyCisgKi8KKworI2lmbmRlZiBfX09NUFRfXworI2RlZmluZSBfX09NUFRfXworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHN5c3RlbSBpbmNsdWRlIGZpbGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogaXRlcmF0aW9uIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9JTlFVSVJZX0ZOKG1hY3JvKSAgXAorICAgIG1hY3JvIChvbXB0X2VudW1lcmF0ZV9zdGF0ZSkgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfc2V0X2NhbGxiYWNrKSAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF9jYWxsYmFjaykgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X2lkbGVfZnJhbWUpICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2ZyYW1lKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3N0YXRlKSAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfcGFyYWxsZWxfaWQpICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZ2V0X3BhcmFsbGVsX3RlYW1fc2l6ZSkgXAorICAgIG1hY3JvIChvbXB0X2dldF90YXNrX2lkKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9nZXRfdGhyZWFkX2lkKQorCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihtYWNybykgIFwKKyAgICBtYWNybyAob21wdF9pZGxlKSAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X292ZXJoZWFkKSAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfYmFycmllcl93YWl0KSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF90YXNrX3dhaXQpICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X211dGV4X3dhaXQpCisKKyNkZWZpbmUgRk9SRUFDSF9PTVBUX1NUQVRFKG1hY3JvKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBmaXJzdCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9maXJzdCwgMHg3MSkgICAgICAgICAgLyogaW5pdGlhbCBlbnVtZXJhdGlvbiBzdGF0ZSAqLyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB3b3JrIHN0YXRlcyAoMC4uMTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3NlcmlhbCwgMHgwMCkgICAgLyogd29ya2luZyBvdXRzaWRlIHBhcmFsbGVsICovICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsLCAweDAxKSAgLyogd29ya2luZyB3aXRoaW4gcGFyYWxsZWwgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93b3JrX3JlZHVjdGlvbiwgMHgwMikgLyogcGVyZm9ybWluZyBhIHJlZHVjdGlvbiAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBpZGxlICgxNi4uMzEpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9pZGxlLCAweDEwKSAgICAgICAgICAgIC8qIHdhaXRpbmcgZm9yIHdvcmsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBvdmVyaGVhZCBzdGF0ZXMgKDMyLi42MykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV9vdmVyaGVhZCwgMHgyMCkgICAgICAgIC8qIG92ZXJoZWFkIGV4Y2x1ZGluZyB3YWl0IHN0YXRlcyAqLyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBiYXJyaWVyIHdhaXQgc3RhdGVzICg2NC4uNzkpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXIsIDB4NDApICAgIC8qIHdhaXRpbmcgYXQgYSBiYXJyaWVyICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfaW1wbGljaXQsIDB4NDEpICAgIC8qIGltcGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2JhcnJpZXJfZXhwbGljaXQsIDB4NDIpICAgIC8qIGV4cGxpY2l0IGJhcnJpZXIgKi8gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiB0YXNrIHdhaXQgc3RhdGVzICg4MC4uOTUpICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2t3YWl0LCAweDUwKSAgIC8qIHdhaXRpbmcgYXQgYSB0YXNrd2FpdCAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3Rhc2tncm91cCwgMHg1MSkgIC8qIHdhaXRpbmcgYXQgYSB0YXNrZ3JvdXAgKi8gICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtdXRleCB3YWl0IHN0YXRlcyAoOTYuLjExMSkgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2xvY2ssIDB4NjApICAgICAgIC8qIHdhaXRpbmcgZm9yIGxvY2sgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X25lc3RfbG9jaywgMHg2MSkgIC8qIHdhaXRpbmcgZm9yIG5lc3QgbG9jayAqLyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2NyaXRpY2FsLCAweDYyKSAgIC8qIHdhaXRpbmcgZm9yIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X2F0b21pYywgMHg2MykgICAgIC8qIHdhaXRpbmcgZm9yIGF0b21pYyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X29yZGVyZWQsIDB4NjQpICAgIC8qIHdhaXRpbmcgZm9yIG9yZGVyZWQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV93YWl0X3NpbmdsZSwgMHg2RikgICAgIC8qIHdhaXRpbmcgZm9yIHNpbmdsZSByZWdpb24gKG5vbi1zdGFuZGFyZCEpICovICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKiBtaXNjICgxMTIuLjEyNykgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9zdGF0ZV91bmRlZmluZWQsIDB4NzApICAgICAgIC8qIHVuZGVmaW5lZCB0aHJlYWQgc3RhdGUgKi8KKworCisjZGVmaW5lIEZPUkVBQ0hfT01QVF9FVkVOVChtYWNybykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKi0tLSBNYW5kYXRvcnkgRXZlbnRzIC0tLSovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4sICAgICAgICAgICBvbXB0X25ld19wYXJhbGxlbF9jYWxsYmFja190LCAgIDEpIC8qIHBhcmFsbGVsIGJlZ2luICovICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCwgICAgICAgICAgICAgb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAyKSAvKiBwYXJhbGxlbCBlbmQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19iZWdpbiwgICAgICAgICAgICAgICBvbXB0X25ld190YXNrX2NhbGxiYWNrX3QsICAgICAgIDMpIC8qIHRhc2sgYmVnaW4gKi8gICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tfZW5kLCAgICAgICAgICAgICAgICAgb21wdF90YXNrX2NhbGxiYWNrX3QsICAgICAgICAgICA0KSAvKiB0YXNrIGRlc3Ryb3kgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luLCAgICAgICAgICAgICBvbXB0X3RocmVhZF90eXBlX2NhbGxiYWNrX3QsICAgIDUpIC8qIHRocmVhZCBiZWdpbiAqLyAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3RocmVhZF9lbmQsICAgICAgICAgICAgICAgb21wdF90aHJlYWRfdHlwZV9jYWxsYmFja190LCAgICA2KSAvKiB0aHJlYWQgZW5kICovICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfY29udHJvbCwgICAgICAgICAgICAgICAgICBvbXB0X2NvbnRyb2xfY2FsbGJhY2tfdCwgICAgICAgIDcpIC8qIHN1cHBvcnQgY29udHJvbCBjYWxscyAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duLCAgICAgICAgIG9tcHRfY2FsbGJhY2tfdCwgICAgICAgICAgICAgICAgOCkgLyogcnVudGltZSBzaHV0ZG93biAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoYmxhbWUgc2hpZnRpbmcsIG9tcHRfZXZlbnRfdW5pbXBsZW1lbnRlZCkgLS0tKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pZGxlX2JlZ2luLCAgICAgICAgICAgICAgIG9tcHRfdGhyZWFkX2NhbGxiYWNrX3QsICAgICAgICAgOSkgLyogYmVnaW4gaWRsZSBzdGF0ZSAqLyAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaWRsZV9lbmQsICAgICAgICAgICAgICAgICBvbXB0X3RocmVhZF9jYWxsYmFja190LCAgICAgICAgMTApIC8qIGVuZCBpZGxlIHN0YXRlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMSkgLyogYmVnaW4gd2FpdCBhdCBiYXJyaWVyICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTIpIC8qIGVuZCB3YWl0IGF0IGJhcnJpZXIgKi8gICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxMykgLyogYmVnaW4gd2FpdCBhdCB0YXNrd2FpdCAqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrd2FpdF9lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTQpIC8qIGVuZCB3YWl0IGF0IHRhc2t3YWl0ICovICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbiwgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAxNSkgLyogYmVnaW4gd2FpdCBhdCB0YXNrZ3JvdXAgKi9cCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kLCAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMTYpIC8qIGVuZCB3YWl0IGF0IHRhc2tncm91cCAqLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX2xvY2ssICAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAxNykgLyogbG9jayByZWxlYXNlICovICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCwgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMTgpIC8qIGxhc3QgbmVzdCBsb2NrIHJlbGVhc2UgKi8gXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwsICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDE5KSAvKiBjcml0aWNhbCByZWxlYXNlICovICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMsICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgMjApIC8qIGF0b21pYyByZWxlYXNlICovICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQsICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICAyMSkgLyogb3JkZXJlZCByZWxlYXNlICovICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIC8qLS0tIE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzLCBvbXB0X2V2ZW50X3VuaW1wbGVtZW50ZWQpIC0tLSAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyMikgLyogaW1wbGljaXQgdGFzayBiZWdpbiAgICovICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjMpIC8qIGltcGxpY2l0IHRhc2sgZW5kICAqLyAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0aWFsX3Rhc2tfYmVnaW4sICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyNCkgLyogaW5pdGlhbCB0YXNrIGJlZ2luICAgKi8gICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2VuZCwgICAgICAgICBvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QsICAgICAgMjUpIC8qIGluaXRpYWwgdGFzayBlbmQgICovICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX3N3aXRjaCwgICAgICAgICAgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICAyNikgLyogdGFzayBzd2l0Y2ggKi8gICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2xvb3BfYmVnaW4sICAgICAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI3KSAvKiB0YXNrIGF0IGxvb3AgYmVnaW4gKi8gICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9sb29wX2VuZCwgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAyOCkgLyogdGFzayBhdCBsb29wIGVuZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NlY3Rpb25zX2JlZ2luLCAgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDI5KSAvKiB0YXNrIGF0IHNlY3Rpb25zIGJlZ2luICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF9zZWN0aW9uc19lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMCkgLyogdGFzayBhdCBzZWN0aW9ucyBlbmQgKi8gICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19iZWdpbiwgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDMxKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiovICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfZW5kLCAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzMikgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfYmVnaW4sICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDMzKSAvKiB0YXNrIGF0IHNpbmdsZSBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCwgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNCkgLyogdGFzayBhdCBzaW5nbGUgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dvcmtzaGFyZV9iZWdpbiwgICAgICAgICAgb21wdF9uZXdfd29ya3NoYXJlX2NhbGxiYWNrX3QsIDM1KSAvKiB0YXNrIGF0IHdvcmtzaGFyZSBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF93b3Jrc2hhcmVfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzNikgLyogdGFzayBhdCB3b3Jrc2hhcmUgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbiwgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM3KSAvKiB0YXNrIGF0IG1hc3RlciBiZWdpbiAqLyAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9tYXN0ZXJfZW5kLCAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICAzOCkgLyogdGFzayBhdCBtYXN0ZXIgZW5kICovICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDM5KSAvKiB0YXNrIGF0IGJhcnJpZXIgYmVnaW4gICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9iYXJyaWVyX2VuZCwgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MCkgLyogdGFzayBhdCBiYXJyaWVyIGVuZCAqLyAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luLCAgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQxKSAvKiB0YXNrIGF0IHRhc2t3YWl0IGJlZ2luICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrd2FpdF9lbmQsICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0MikgLyogdGFzayBhdCB0YXNrIHdhaXQgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbiwgICAgICAgICAgb21wdF9wYXJhbGxlbF9jYWxsYmFja190LCAgICAgIDQzKSAvKiB0YXNrIGF0IHRhc2tncm91cCBiZWdpbiAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrZ3JvdXBfZW5kLCAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfY2FsbGJhY2tfdCwgICAgICA0NCkgLyogdGFzayBhdCB0YXNrZ3JvdXAgZW5kICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX3ByZXYsICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ1KSAvKiBwcmV2IG5lc3QgbG9jayByZWxlYXNlICovIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9sb2NrLCAgICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDYpIC8qIGxvY2sgd2FpdCAqLyAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrLCAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDQ3KSAvKiBuZXN0IGxvY2sgd2FpdCAqLyAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF93YWl0X2NyaXRpY2FsLCAgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA0OCkgLyogY3JpdGljYWwgd2FpdCAqLyAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMsICAgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNDkpIC8qIGF0b21pYyB3YWl0ICovICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZCwgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUwKSAvKiBvcmRlcmVkIHdhaXQgKi8gICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaywgICAgICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTEpIC8qIGxvY2sgYWNxdWlyZWQgKi8gICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCwgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDUyKSAvKiAxc3QgbmVzdCBsb2NrIGFjcXVpcmVkICovIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfbmV4dCwgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1MykgLyogbmV4dCBuZXN0IGxvY2sgYWNxdWlyZWQqLyBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfYWNxdWlyZWRfY3JpdGljYWwsICAgICAgICBvbXB0X3dhaXRfY2FsbGJhY2tfdCwgICAgICAgICAgNTQpIC8qIGNyaXRpY2FsIGFjcXVpcmVkICovICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYywgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU1KSAvKiBhdG9taWMgYWNxdWlyZWQgKi8gICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9hY3F1aXJlZF9vcmRlcmVkLCAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1NikgLyogb3JkZXJlZCBhY3F1aXJlZCAqLyAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2luaXRfbG9jaywgICAgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU3KSAvKiBsb2NrIGluaXQgKi8gICAgICAgICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9pbml0X25lc3RfbG9jaywgICAgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA1OCkgLyogbmVzdCBsb2NrIGluaXQgKi8gICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaywgICAgICAgICAgICAgb21wdF93YWl0X2NhbGxiYWNrX3QsICAgICAgICAgIDU5KSAvKiBsb2NrIGRlc3RydWN0aW9uICovICAgICAgIFwKKyAgICBtYWNybyAob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaywgICAgICAgIG9tcHRfd2FpdF9jYWxsYmFja190LCAgICAgICAgICA2MCkgLyogbmVzdCBsb2NrIGRlc3RydWN0aW9uICovICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChvbXB0X2V2ZW50X2ZsdXNoLCAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja190LCAgICAgICAgICAgICAgIDYxKSAvKiBhZnRlciBleGVjdXRpbmcgZmx1c2ggKi8gIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcywgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZXNfY2FsbGJhY2tfdCwgNjkpIC8qIHJlcG9ydCB0YXNrIGRlcGVuZGVuY2VzICAqL1wKKyAgICBtYWNybyAob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpciwgICAgIG9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QsICAgICA3MCkgLyogcmVwb3J0IHRhc2sgZGVwZW5kZW5jZSBwYWlyICovCisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGRhdGEgdHlwZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIGlkZW50aWZpZXJzCisgKi0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF90aHJlYWRfaWRfdDsKKyNkZWZpbmUgb21wdF90aHJlYWRfaWRfbm9uZSAoKG9tcHRfdGhyZWFkX2lkX3QpIDApICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3Rhc2tfaWRfdDsKKyNkZWZpbmUgb21wdF90YXNrX2lkX25vbmUgKChvbXB0X3Rhc2tfaWRfdCkgMCkgICAgICAgICAvKiBub24tc3RhbmRhcmQgKi8KKwordHlwZWRlZiB1aW50NjRfdCBvbXB0X3BhcmFsbGVsX2lkX3Q7CisjZGVmaW5lIG9tcHRfcGFyYWxsZWxfaWRfbm9uZSAoKG9tcHRfcGFyYWxsZWxfaWRfdCkgMCkgLyogbm9uLXN0YW5kYXJkICovCisKK3R5cGVkZWYgdWludDY0X3Qgb21wdF93YWl0X2lkX3Q7CisjZGVmaW5lIG9tcHRfd2FpdF9pZF9ub25lICgob21wdF93YWl0X2lkX3QpIDApICAgICAgICAgLyogbm9uLXN0YW5kYXJkICovCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAqIG9tcHRfZnJhbWVfdAorICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2ZyYW1lX3MgeworICAgIHZvaWQgKmV4aXRfcnVudGltZV9mcmFtZTsgICAgLyogbmV4dCBmcmFtZSBpcyB1c2VyIGNvZGUgICAgICovCisgICAgdm9pZCAqcmVlbnRlcl9ydW50aW1lX2ZyYW1lOyAvKiBwcmV2aW91cyBmcmFtZSBpcyB1c2VyIGNvZGUgKi8KK30gb21wdF9mcmFtZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBkZXBlbmRlbmNlcyB0eXBlcworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ19lIHsKKyAgICAvLyBhIHR3byBiaXQgZmllbGQgZm9yIHRoZSBkZXBlbmRlbmNlIHR5cGUKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX291dCAgID0gMSwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2luICAgID0gMiwKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0ID0gMywKK30gb21wdF90YXNrX2RlcGVuZGVuY2VfZmxhZ190OworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3Rhc2tfZGVwZW5kZW5jZV9zIHsKKyAgICB2b2lkICp2YXJpYWJsZV9hZGRyOworICAgIHVpbnQzMl90ICBkZXBlbmRlbmNlX2ZsYWdzOworfSBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90OworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZW51bWVyYXRpb25zIGZvciB0aHJlYWQgc3RhdGVzIGFuZCBydW50aW1lIGV2ZW50cworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICogcnVudGltZSBzdGF0ZXMKKyAqLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKwordHlwZWRlZiBlbnVtIHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgc3RhdGUgPSBjb2RlLAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK30gb21wdF9zdGF0ZV90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBydW50aW1lIGV2ZW50cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCit0eXBlZGVmIGVudW0geworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50LCBjYWxsYmFjaywgZXZlbnRpZCkgZXZlbnQgPSBldmVudGlkLAorICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorI3VuZGVmIG9tcHRfZXZlbnRfbWFjcm8KK30gb21wdF9ldmVudF90OworCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBzZXQgY2FsbGJhY2sgcmVzdWx0cworICotLS0tLS0tLS0tLS0tLS0tLS0tLS0qLwordHlwZWRlZiBlbnVtIHsKKyAgICBvbXB0X3NldF9yZXN1bHRfcmVnaXN0cmF0aW9uX2Vycm9yICAgICAgICAgICAgICA9IDAsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9ub19jYWxsYmFjayAgICAgPSAxLAorICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMgICAgICAgICAgICAgID0gMiwKKyAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX2NhbGxiYWNrX3NvbWUgICA9IDMsCisgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMgPSA0LAorfSBvbXB0X3NldF9yZXN1bHRfdDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2sgc2lnbmF0dXJlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBpbml0aWFsaXphdGlvbiAqLwordHlwZWRlZiB2b2lkICgqb21wdF9pbnRlcmZhY2VfZm5fdCkodm9pZCk7CisKK3R5cGVkZWYgb21wdF9pbnRlcmZhY2VfZm5fdCAoKm9tcHRfZnVuY3Rpb25fbG9va3VwX3QpKAorICAgIGNvbnN0IGNoYXIgKiAgICAgICAgICAgICAgICAgICAgICAvKiBlbnRyeSBwb2ludCB0byBsb29rIHVwICAgICAgICovCispOworCisvKiB0aHJlYWRzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3RocmVhZF9jYWxsYmFja190KSAoCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgZW51bSB7CisgICAgb21wdF90aHJlYWRfaW5pdGlhbCA9IDEsIC8vIHN0YXJ0IHRoZSBlbnVtZXJhdGlvbiBhdCAxCisgICAgb21wdF90aHJlYWRfd29ya2VyICA9IDIsCisgICAgb21wdF90aHJlYWRfb3RoZXIgICA9IDMKK30gb21wdF90aHJlYWRfdHlwZV90OworCit0eXBlZGVmIGVudW0geworICAgIG9tcHRfaW52b2tlcl9wcm9ncmFtID0gMCwgICAgICAgICAvKiBwcm9ncmFtIGludm9rZXMgbWFzdGVyIHRhc2sgICovCisgICAgb21wdF9pbnZva2VyX3J1bnRpbWUgPSAxICAgICAgICAgIC8qIHJ1bnRpbWUgaW52b2tlcyBtYXN0ZXIgdGFzayAgKi8KK30gb21wdF9pbnZva2VyX3Q7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGhyZWFkX3R5cGVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgICAvKiB0eXBlIG9mIHRocmVhZCAgICAgICAgICAgICAgICovCisgICAgb21wdF90aHJlYWRfaWRfdCB0aHJlYWRfaWQgICAgICAgIC8qIElEIG9mIHRocmVhZCAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfd2FpdF9jYWxsYmFja190KSAoCisgICAgb21wdF93YWl0X2lkX3Qgd2FpdF9pZCAgICAgICAgICAgIC8qIHdhaXQgaWQgICAgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKKy8qIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmVzICovCit0eXBlZGVmIHZvaWQgKCpvbXB0X3BhcmFsbGVsX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgIC8qIGlkIG9mIHBhcmFsbGVsIHJlZ2lvbiAgICAgICAqLworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgICAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld193b3Jrc2hhcmVfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgICovCisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24gICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9uZXdfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLCAgICAvKiBpZCBvZiBwYXJlbnQgdGFzayAgICAgICAgICAgICovCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfdGFza19mcmFtZSwgIC8qIGZyYW1lIGRhdGEgb2YgcGFyZW50IHRhc2sgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIHVpbnQzMl90IHJlcXVlc3RlZF90ZWFtX3NpemUsICAgICAvKiBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KKyAgICBvbXB0X2ludm9rZXJfdCBpbnZva2VyICAgICAgICAgICAgLyogd2hvIGludm9rZXMgbWFzdGVyIHRhc2s/ICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9lbmRfcGFyYWxsZWxfY2FsbGJhY2tfdCkgKAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwgICAvKiBpZCBvZiBwYXJhbGxlbCByZWdpb24gICAgICAgKi8KKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgLyogaWQgb2YgdGFzayAgICAgICAgICAgICAgICAgICovCisgICAgb21wdF9pbnZva2VyX3QgaW52b2tlciAgICAgICAgICAgIC8qIHdobyBpbnZva2VzIG1hc3RlciB0YXNrPyAgICAqLworKTsKKworLyogdGFza3MgKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19jYWxsYmFja190KSAoCisgICAgb21wdF90YXNrX2lkX3QgdGFza19pZCAgICAgICAgICAgIC8qIGlkIG9mIHRhc2sgICAgICAgICAgICAgICAgICAgKi8KKyk7CisKK3R5cGVkZWYgdm9pZCAoKm9tcHRfdGFza19wYWlyX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBmaXJzdF90YXNrX2lkLAorICAgIG9tcHRfdGFza19pZF90IHNlY29uZF90YXNrX2lkCispOworCit0eXBlZGVmIHZvaWQgKCpvbXB0X25ld190YXNrX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCBwYXJlbnRfdGFza19pZCwgICAgLyogaWQgb2YgcGFyZW50IHRhc2sgICAgICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsICAvKiBmcmFtZSBkYXRhIGZvciBwYXJlbnQgdGFzayAgICovCisgICAgb21wdF90YXNrX2lkX3QgIG5ld190YXNrX2lkLCAgICAgIC8qIGlkIG9mIGNyZWF0ZWQgdGFzayAgICAgICAgICAgKi8KKyAgICB2b2lkICp0YXNrX2Z1bmN0aW9uICAgICAgICAgICAgICAgLyogcG9pbnRlciB0byBvdXRsaW5lZCBmdW5jdGlvbiAqLworKTsKKworLyogdGFzayBkZXBlbmRlbmNlcyAqLwordHlwZWRlZiB2b2lkICgqb21wdF90YXNrX2RlcGVuZGVuY2VzX2NhbGxiYWNrX3QpICgKKyAgICBvbXB0X3Rhc2tfaWRfdCB0YXNrX2lkLCAgICAgICAgICAgIC8qIElEIG9mIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyAqLworICAgIGNvbnN0IG9tcHRfdGFza19kZXBlbmRlbmNlX3QgKmRlcHMsLyogdmVjdG9yIG9mIHRhc2sgZGVwZW5kZW5jZXMgICovCisgICAgaW50IG5kZXBzICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBudW1iZXIgb2YgZGVwZW5kZW5jZXMgICAgICAgKi8KKyk7CisKKy8qIHByb2dyYW0gKi8KK3R5cGVkZWYgdm9pZCAoKm9tcHRfY29udHJvbF9jYWxsYmFja190KSAoCisgICAgdWludDY0X3QgY29tbWFuZCwgICAgICAgICAgICAgICAgIC8qIGNvbW1hbmQgb2YgY29udHJvbCBjYWxsICAgICAgKi8KKyAgICB1aW50NjRfdCBtb2RpZmllciAgICAgICAgICAgICAgICAgLyogbW9kaWZpZXIgb2YgY29udHJvbCBjYWxsICAgICAqLworKTsKKwordHlwZWRlZiB2b2lkICgqb21wdF9jYWxsYmFja190KSh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogb21wdCBBUEkKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKyNkZWZpbmUgT01QVF9BUElfRk5UWVBFKGZuKSBmbiMjX3QKKworI2RlZmluZSBPTVBUX0FQSV9GVU5DVElPTihyZXR1cm5fdHlwZSwgZm4sIGFyZ3MpICBcCisgICAgdHlwZWRlZiByZXR1cm5fdHlwZSAoKk9NUFRfQVBJX0ZOVFlQRShmbikpIGFyZ3MKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTlFVSVJZIEZVTkNUSU9OUworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogc3RhdGUgKi8KK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfc3RhdGVfdCwgb21wdF9nZXRfc3RhdGUsICgKKyAgICBvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkCispKTsKKworLyogdGhyZWFkICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3RocmVhZF9pZF90LCBvbXB0X2dldF90aHJlYWRfaWQsICh2b2lkKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQgKiwgb21wdF9nZXRfaWRsZV9mcmFtZSwgKHZvaWQpKTsKKworLyogcGFyYWxsZWwgcmVnaW9uICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3BhcmFsbGVsX2lkX3QsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkLCAoCisgICAgaW50IGFuY2VzdG9yX2xldmVsCispKTsKKworT01QVF9BUElfRlVOQ1RJT04oaW50LCBvbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemUsICgKKyAgICBpbnQgYW5jZXN0b3JfbGV2ZWwKKykpOworCisvKiB0YXNrICovCitPTVBUX0FQSV9GVU5DVElPTihvbXB0X3Rhc2tfaWRfdCwgb21wdF9nZXRfdGFza19pZCwgKAorICAgIGludCBkZXB0aAorKSk7CisKK09NUFRfQVBJX0ZVTkNUSU9OKG9tcHRfZnJhbWVfdCAqLCBvbXB0X2dldF90YXNrX2ZyYW1lLCAoCisgICAgaW50IGRlcHRoCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBQTEFDRUhPTERFUlMgRk9SIFBFUkZPUk1BTkNFIFJFUE9SVElORworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworLyogaWRsZSAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9pZGxlLCAoCisgICAgdm9pZAorKSk7CisKKy8qIG92ZXJoZWFkICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X292ZXJoZWFkLCAoCisgICAgdm9pZAorKSk7CisKKy8qIGJhcnJpZXIgd2FpdCAqLworT01QVF9BUElfRlVOQ1RJT04odm9pZCwgb21wdF9iYXJyaWVyX3dhaXQsICgKKyAgICB2b2lkCispKTsKKworLyogdGFzayB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X3Rhc2tfd2FpdCwgKAorICAgIHZvaWQKKykpOworCisvKiBtdXRleCB3YWl0ICovCitPTVBUX0FQSV9GVU5DVElPTih2b2lkLCBvbXB0X211dGV4X3dhaXQsICgKKyAgICB2b2lkCispKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBJTklUSUFMSVpBVElPTiBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX0ZVTkNUSU9OKHZvaWQsIG9tcHRfaW5pdGlhbGl6ZSwgKAorICAgIG9tcHRfZnVuY3Rpb25fbG9va3VwX3Qgb21wdF9mbl9sb29rdXAsCisgICAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICAgIHVuc2lnbmVkIGludCBvbXB0X3ZlcnNpb24KKykpOworCisKKy8qIGluaXRpYWxpemF0aW9uIGludGVyZmFjZSB0byBiZSBkZWZpbmVkIGJ5IHRvb2wgKi8KK29tcHRfaW5pdGlhbGl6ZV90IG9tcHRfdG9vbCh2b2lkKTsKKwordHlwZWRlZiBlbnVtIG9wdF9pbml0X21vZGVfZSB7CisgICAgb21wdF9pbml0X21vZGVfbmV2ZXIgID0gMCwKKyAgICBvbXB0X2luaXRfbW9kZV9mYWxzZSAgPSAxLAorICAgIG9tcHRfaW5pdF9tb2RlX3RydWUgICA9IDIsCisgICAgb21wdF9pbml0X21vZGVfYWx3YXlzID0gMworfSBvbXB0X2luaXRfbW9kZV90OworCitPTVBUX0FQSV9GVU5DVElPTihpbnQsIG9tcHRfc2V0X2NhbGxiYWNrLCAoCisgICAgb21wdF9ldmVudF90IGV2ZW50LAorICAgIG9tcHRfY2FsbGJhY2tfdCBjYWxsYmFjaworKSk7CisKK3R5cGVkZWYgZW51bSBvbXB0X3NldF9jYWxsYmFja19yY19lIHsgIC8qIG5vbi1zdGFuZGFyZCAqLworICAgIG9tcHRfc2V0X2NhbGxiYWNrX2Vycm9yICAgICAgPSAwLAorICAgIG9tcHRfaGFzX2V2ZW50X25vX2NhbGxiYWNrICAgPSAxLAorICAgIG9tcHRfbm9fZXZlbnRfbm9fY2FsbGJhY2sgICAgPSAyLAorICAgIG9tcHRfaGFzX2V2ZW50X21heV9jYWxsYmFjayAgPSAzLAorICAgIG9tcHRfaGFzX2V2ZW50X211c3RfY2FsbGJhY2sgPSA0LAorfSBvbXB0X3NldF9jYWxsYmFja19yY190OworCisKK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9nZXRfY2FsbGJhY2ssICgKKyAgICBvbXB0X2V2ZW50X3QgZXZlbnQsCisgICAgb21wdF9jYWxsYmFja190ICpjYWxsYmFjaworKSk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogTUlTQ0VMTEFORU9VUyBGVU5DVElPTlMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qIGNvbnRyb2wgKi8KKy8vIEZJWE1FOiByZW1vdmUgd29ya2Fyb3VuZCBmb3IgY2xhbmcKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZGVjbGFyZSB0YXJnZXQKKyNlbmRpZgordm9pZCBvbXB0X2NvbnRyb2woCisgICAgdWludDY0X3QgY29tbWFuZCwKKyAgICB1aW50NjRfdCBtb2RpZmllcgorKTsKKyNpZiAhZGVmaW5lZChfX2NsYW5nX18pICYmIGRlZmluZWQoX09QRU5NUCkgJiYgKF9PUEVOTVAgPj0gMjAxMzA3KQorI3ByYWdtYSBvbXAgZW5kIGRlY2xhcmUgdGFyZ2V0CisjZW5kaWYKKworLyogc3RhdGUgZW51bWVyYXRpb24gKi8KK09NUFRfQVBJX0ZVTkNUSU9OKGludCwgb21wdF9lbnVtZXJhdGVfc3RhdGUsICgKKyAgICBpbnQgY3VycmVudF9zdGF0ZSwKKyAgICBpbnQgKm5leHRfc3RhdGUsCisgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZQorKSk7CisKKyNpZmRlZiAgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXAuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXAuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZmMzNzhiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcC5oCkBAIC0wLDAgKzEsMzY2NCBAQAorLyohIFxmaWxlICovCisvKgorICoga21wLmggLS0gS1BUUyBydW50aW1lIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ICisjZGVmaW5lIEtNUF9ICisKKyNpbmNsdWRlICJrbXBfY29uZmlnLmgiCisKKy8qICNkZWZpbmUgQlVJTERfUEFSQUxMRUxfT1JERVJFRCAxICovCisKKy8qIFRoaXMgZml4IHJlcGxhY2VzIGdldHRpbWVvZmRheSB3aXRoIGNsb2NrX2dldHRpbWUgZm9yIGJldHRlciBzY2FsYWJpbGl0eSBvbgorICAgdGhlIEFsdGl4LiAgUmVxdWlyZXMgdXNlciBjb2RlIHRvIGJlIGxpbmtlZCB3aXRoIC1scnQuCisqLworLy8jZGVmaW5lIEZJWF9TR0lfQ0xPQ0sKKworLyogRGVmaW5lcyBmb3IgT3Blbk1QIDMuMCB0YXNraW5nIGFuZCBhdXRvIHNjaGVkdWxpbmcgKi8KKworIyBpZm5kZWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisjICBkZWZpbmUgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEIDEKKyMgZW5kaWYKKworI2RlZmluZSBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAgMAorI2RlZmluZSBUQVNLX0NVUlJFTlRfUVVFVUVEICAgICAgMQorCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfRU1QVFkgICAgICAgICAwICAvLyBlbnRyaWVzIHdoZW4gdGhlIHN0YWNrIGlzIGVtcHR5CisKKyNkZWZpbmUgVEFTS19TVEFDS19CTE9DS19CSVRTICAgIDUgIC8vIFVzZWQgdG8gZGVmaW5lIFRBU0tfU1RBQ0tfU0laRSBhbmQgVEFTS19TVEFDS19NQVNLCisjZGVmaW5lIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAgICAoIDEgPDwgVEFTS19TVEFDS19CTE9DS19CSVRTICkgLy8gTnVtYmVyIG9mIGVudHJpZXMgaW4gZWFjaCB0YXNrIHN0YWNrIGFycmF5CisjZGVmaW5lIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyAgICAoIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAtIDEgKSAgLy8gTWFzayBmb3IgZGV0ZXJtaW5pbmcgaW5kZXggaW50byBzdGFjayBibG9jaworI2VuZGlmIC8vIEJVSUxEX1RJRURfVEFTS19TVEFDSworCisjZGVmaW5lIFRBU0tfTk9UX1BVU0hFRCAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRCAwCisjZGVmaW5lIFRBU0tfVElFRCAgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfVU5USUVEICAgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfRVhQTElDSVQgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfSU1QTElDSVQgICAgICAgICAgICAwCisjZGVmaW5lIFRBU0tfUFJPWFkgICAgICAgICAgICAgICAxCisjZGVmaW5lIFRBU0tfRlVMTCAgICAgICAgICAgICAgICAwCisKKyNkZWZpbmUgS01QX0NBTkNFTF9USFJFQURTCisjZGVmaW5lIEtNUF9USFJFQURfQVRUUgorCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxzaWduYWwuaD4KKy8qICBpbmNsdWRlIDxjdHlwZS5oPiBkb24ndCB1c2U7IHByb2JsZW1zIHdpdGggL01EIG9uIFdpbmRvd3MqIE9TIE5UIGR1ZSB0byBiYWQgTWljcm9zb2Z0IGxpYnJhcnkgICovCisvKiAgc29tZSBtYWNyb3MgcHJvdmlkZWQgYmVsb3cgdG8gcmVwbGFjZSBzb21lIG9mIHRoZXNlIGZ1bmN0aW9ucyAgKi8KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjZW5kaWYKKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlIDx0aW1lLmg+CisKKyNpbmNsdWRlIDxlcnJuby5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKyNpbmNsdWRlICJrbXBfc2FmZV9jX2FwaS5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKK2NsYXNzIGttcF9zdGF0c19saXN0OworI2VuZGlmCisKKyNpZiBLTVBfVVNFX0hXTE9DICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyMgaW5jbHVkZSAiaHdsb2MuaCIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorI2luY2x1ZGUgPHhtbWludHJpbi5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaWYgVVNFX0RFQlVHR0VSCisjaW5jbHVkZSAia21wX2RlYnVnZ2VyLmgiCisjZW5kaWYKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisjZGVmaW5lIEtNUF9IQU5ETEVfU0lHTkFMUyAoS01QX09TX1VOSVggfHwgS01QX09TX1dJTkRPV1MpCisKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9tYWxsb2MuaCIKKyNpZiBLTVBfT1NfVU5JWAorIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaWYgIWRlZmluZWQgTlNJRyAmJiBkZWZpbmVkIF9OU0lHCisjICBkZWZpbmUgTlNJRyBfTlNJRworIyBlbmRpZgorI2VuZGlmCisKKyNpZiBLTVBfT1NfTElOVVgKKyMgcHJhZ21hIHdlYWsgY2xvY2tfZ2V0dGltZQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjZW5kaWYKKworLypTZWxlY3QgZGF0YSBwbGFjZW1lbnQgaW4gTlVNQSBtZW1vcnkgKi8KKyNkZWZpbmUgTk9fRklSU1RfVE9VQ0ggMAorI2RlZmluZSBGSVJTVF9UT1VDSCAxICAgICAgIC8qIEV4cGxvaXQgU0dJJ3MgZmlyc3QgdG91Y2ggcGFnZSBwbGFjZW1lbnQgYWxnbyAqLworCisvKiBJZiBub3Qgc3BlY2lmaWVkIG9uIGNvbXBpbGUgY29tbWFuZCBsaW5lLCBhc3N1bWUgbm8gZmlyc3QgdG91Y2ggKi8KKyNpZm5kZWYgQlVJTERfTUVNT1JZCisjZGVmaW5lIEJVSUxEX01FTU9SWSBOT19GSVJTVF9UT1VDSAorI2VuZGlmCisKKy8vIDAgLSBubyBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uLCBhbGlnbm1lbnQ6IDgtYnl0ZSBvbiB4ODYsIDE2LWJ5dGUgb24geDY0LgorLy8gMyAtIGZhc3QgYWxsb2NhdGlvbiB1c2luZyBzeW5jLCBub24tc3luYyBmcmVlIGxpc3RzIG9mIGFueSBzaXplLCBub24tc2VsZiBmcmVlIGxpc3RzIG9mIGxpbWl0ZWQgc2l6ZS4KKyNpZm5kZWYgVVNFX0ZBU1RfTUVNT1JZCisjZGVmaW5lIFVTRV9GQVNUX01FTU9SWSAzCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyBkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMAorIyBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpCisjZWxzZQorIyBpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworIyAgaWYgT01QXzQwX0VOQUJMRUQKKyMgICBkZWZpbmUgVVNFX05FU1RFRF9IT1RfQVJHKHgpICx4CisjICBlbHNlCisvLyBOZXN0ZWQgaG90IHRlYW1zIGZlYXR1cmUgZGVwZW5kcyBvbiBvbXAgNC4wLCBkaXNhYmxlIGl0IGZvciBlYXJsaWVyIHZlcnNpb25zCisjICAgdW5kZWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyMgICBkZWZpbmUgS01QX05FU1RFRF9IT1RfVEVBTVMgMAorIyAgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyMgIGVuZGlmCisjIGVsc2UKKyMgIGRlZmluZSBVU0VfTkVTVEVEX0hPVF9BUkcoeCkKKyMgZW5kaWYKKyNlbmRpZgorCisvLyBBc3N1bWUgdXNpbmcgQkdFVCBjb21wYXJlX2V4Y2hhbmdlIGluc3RydWN0aW9uIGluc3RlYWQgb2YgbG9jayBieSBkZWZhdWx0LgorI2lmbmRlZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyNkZWZpbmUgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUIDEKKyNlbmRpZgorCisvLyBUZXN0IHRvIHNlZSBpZiBxdWV1aW5nIGxvY2sgaXMgYmV0dGVyIHRoYW4gYm9vdHN0cmFwIGxvY2sgZm9yIGJnZXQKKy8vICNpZm5kZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorLy8gI2RlZmluZSBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisvLyAjZW5kaWYKKworI2RlZmluZSBLTVBfTlNFQ19QRVJfU0VDIDEwMDAwMDAwMDBMCisjZGVmaW5lIEtNUF9VU0VDX1BFUl9TRUMgMTAwMDAwMEwKKworLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8vIEZJWE1FIERPWFlHRU4uLi4gbmVlZCB0byBncm91cCB0aGVzZSBmbGFncyBzb21laG93IChNYWtpbmcgdGhlbSBhbiBhbm9ueW1vdXMgZW51bSB3b3VsZCBkbyBpdC4uLikKKy8qIQorVmFsdWVzIGZvciBiaXQgZmxhZ3MgdXNlZCBpbiB0aGUgaWRlbnRfdCB0byBkZXNjcmliZSB0aGUgZmllbGRzLgorKi8KKy8qISBVc2UgdHJhbXBvbGluZSBmb3IgaW50ZXJuYWwgbWljcm90YXNrcyAqLworI2RlZmluZSBLTVBfSURFTlRfSU1CICAgICAgICAgICAgIDB4MDEKKy8qISBVc2UgYy1zdHlsZSBpZGVudCBzdHJ1Y3R1cmUgKi8KKyNkZWZpbmUgS01QX0lERU5UX0tNUEMgICAgICAgICAgICAweDAyCisvKiAweDA0IGlzIG5vIGxvbmdlciB1c2VkICovCisvKiEgRW50cnkgcG9pbnQgZ2VuZXJhdGVkIGJ5IGF1dG8tcGFyYWxsZWxpemF0aW9uICovCisjZGVmaW5lIEtNUF9JREVOVF9BVVRPUEFSICAgICAgICAgMHgwOAorLyohIENvbXBpbGVyIGdlbmVyYXRlcyBhdG9taWMgcmVkdWN0aW9uIG9wdGlvbiBmb3Iga21wY19yZWR1Y2UqICovCisjZGVmaW5lIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICAgMHgxMAorLyohIFRvIG1hcmsgYSAnYmFycmllcicgZGlyZWN0aXZlIGluIHVzZXIgY29kZSAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9FWFBMICAgIDB4MjAKKy8qISBUbyBNYXJrIGltcGxpY2l0IGJhcnJpZXJzLiAqLworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMICAgICAgICAgICAweDAwNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9NQVNLICAgICAgMHgwMUMwCisjZGVmaW5lIEtNUF9JREVOVF9CQVJSSUVSX0lNUExfRk9SICAgICAgIDB4MDA0MAorI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NFQ1RJT05TICAweDAwQzAKKworI2RlZmluZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NJTkdMRSAgICAweDAxNDAKKyNkZWZpbmUgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9XT1JLU0hBUkUgMHgwMUMwCisKKy8qIQorICogVGhlIGlkZW50IHN0cnVjdHVyZSB0aGF0IGRlc2NyaWJlcyBhIHNvdXJjZSBsb2NhdGlvbi4KKyAqLwordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIGttcF9pbnQzMiByZXNlcnZlZF8xOyAgIC8qKjwgIG1pZ2h0IGJlIHVzZWQgaW4gRm9ydHJhbjsgc2VlIGFib3ZlICAqLworICAgIGttcF9pbnQzMiBmbGFnczsgICAgICAgIC8qKjwgIGFsc28gZi5mbGFnczsgS01QX0lERU5UX3h4eCBmbGFnczsgS01QX0lERU5UX0tNUEMgaWRlbnRpZmllcyB0aGlzIHVuaW9uIG1lbWJlciAgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMjsgICAvKio8ICBub3QgcmVhbGx5IHVzZWQgaW4gRm9ydHJhbiBhbnkgbW9yZTsgc2VlIGFib3ZlICovCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBidXQgY3VycmVudGx5IHVzZWQgZm9yIHN0b3JpbmcgcmVnaW9uLXNwZWNpZmljIElUVCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBjb250ZXh0dWFsIGluZm9ybWF0aW9uLiAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfaW50MzIgcmVzZXJ2ZWRfMzsgICAvKio8IHNvdXJjZVs0XSBpbiBGb3J0cmFuLCBkbyBub3QgdXNlIGZvciBDKysgICovCisgICAgY2hhciBjb25zdCAqcHNvdXJjZTsgICAgLyoqPCBTdHJpbmcgZGVzY3JpYmluZyB0aGUgc291cmNlIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRoZSBzdHJpbmcgaXMgY29tcG9zZWQgb2Ygc2VtaS1jb2xvbiBzZXBhcmF0ZWQgZmllbGRzIHdoaWNoIGRlc2NyaWJlIHRoZSBzb3VyY2UgZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgZnVuY3Rpb24gYW5kIGEgcGFpciBvZiBsaW5lIG51bWJlcnMgdGhhdCBkZWxpbWl0IHRoZSBjb25zdHJ1Y3QuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9IGlkZW50X3Q7CisvKiEKK0B9CisqLworCisvLyBTb21lIGZvcndhcmQgZGVjbGFyYXRpb25zLgorCit0eXBlZGVmIHVuaW9uICBrbXBfdGVhbSAgICAgIGttcF90ZWFtX3Q7Cit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza2RhdGEgIGttcF90YXNrZGF0YV90OwordHlwZWRlZiB1bmlvbiAga21wX3Rhc2tfdGVhbSBrbXBfdGFza190ZWFtX3Q7Cit0eXBlZGVmIHVuaW9uICBrbXBfdGVhbSAgICAgIGttcF90ZWFtX3A7Cit0eXBlZGVmIHVuaW9uICBrbXBfaW5mbyAgICAgIGttcF9pbmZvX3A7Cit0eXBlZGVmIHVuaW9uICBrbXBfcm9vdCAgICAgIGttcF9yb290X3A7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogUGFjayB0d28gMzItYml0IHNpZ25lZCBpbnRlZ2VycyBpbnRvIGEgNjQtYml0IHNpZ25lZCBpbnRlZ2VyICovCisvKiBUb0RvOiBGaXggd29yZCBvcmRlcmluZyBmb3IgYmlnLWVuZGlhbiBtYWNoaW5lcy4gKi8KKyNkZWZpbmUgS01QX1BBQ0tfNjQoSElHSF8zMixMT1dfMzIpIFwKKyAgICAoIChrbXBfaW50NjQpICgoKChrbXBfdWludDY0KShISUdIXzMyKSk8PDMyKSB8IChrbXBfdWludDY0KShMT1dfMzIpKSApCisKKworLyoKKyAqIEdlbmVyaWMgc3RyaW5nIG1hbmlwdWxhdGlvbiBtYWNyb3MuCisgKiBBc3N1bWUgdGhhdCBfeCBpcyBvZiB0eXBlIGNoYXIgKgorICovCisjZGVmaW5lIFNLSVBfV1MoX3gpICAgICB7IHdoaWxlICgqKF94KSA9PSAnICcgfHwgKihfeCkgPT0gJ1x0JykgKF94KSsrOyB9CisjZGVmaW5lIFNLSVBfRElHSVRTKF94KSB7IHdoaWxlICgqKF94KSA+PSAnMCcgJiYgKihfeCkgPD0gJzknKSAoX3gpKys7IH0KKyNkZWZpbmUgU0tJUF9UTyhfeCxfYykgIHsgd2hpbGUgKCooX3gpICE9ICdcMCcgJiYgKihfeCkgIT0gKF9jKSkgKF94KSsrOyB9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX01BWCggeCwgeSApICggKHgpID4gKHkpID8gKHgpIDogKHkpICkKKyNkZWZpbmUgS01QX01JTiggeCwgeSApICggKHgpIDwgKHkpID8gKHgpIDogKHkpICkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBFbnVtZXJhdGlvbiB0eXBlcyAqLworCitlbnVtIGttcF9zdGF0ZV90aW1lciB7CisgICAgdHNfc3RvcCwKKyAgICB0c19zdGFydCwKKyAgICB0c19wYXVzZSwKKworICAgIHRzX2xhc3Rfc3RhdGUKK307CisKK2VudW0gZHluYW1pY19tb2RlIHsKKyAgICBkeW5hbWljX2RlZmF1bHQsCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorICAgIGR5bmFtaWNfbG9hZF9iYWxhbmNlLAorI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKyAgICBkeW5hbWljX3JhbmRvbSwKKyAgICBkeW5hbWljX3RocmVhZF9saW1pdCwKKyAgICBkeW5hbWljX21heAorfTsKKworLyogZXh0ZXJuYWwgc2NoZWR1bGUgY29uc3RhbnRzLCBkdXBsaWNhdGUgZW51bSBvbXBfc2NoZWQgaW4gb21wLmggaW4gb3JkZXIgdG8gbm90IGluY2x1ZGUgaXQgaGVyZSAqLworI2lmbmRlZiBLTVBfU0NIRURfVFlQRV9ERUZJTkVECisjZGVmaW5lIEtNUF9TQ0hFRF9UWVBFX0RFRklORUQKK3R5cGVkZWYgZW51bSBrbXBfc2NoZWQgeworICAgIGttcF9zY2hlZF9sb3dlciAgICAgICAgICAgICA9IDAsICAgICAvLyBsb3dlciBhbmQgdXBwZXIgYm91bmRzIGFyZSBmb3Igcm91dGluZSBwYXJhbWV0ZXIgY2hlY2sKKyAgICAvLyBOb3RlOiBuZWVkIHRvIGFkanVzdCBfX2ttcF9zY2hfbWFwIGdsb2JhbCBhcnJheSBpbiBjYXNlIHRoaXMgZW51bSBpcyBjaGFuZ2VkCisgICAga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMSwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX3N0YXRpY19jaHVua2VkICAgICAgICAgICAoMzMpCisgICAga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMiwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAoMzYpCisgICAga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNCwgICAgIC8vIG1hcHBlZCB0byBrbXBfc2NoX2F1dG8gICAgICAgICAgICAgICAgICAgICAoMzgpCisgICAga21wX3NjaGVkX3VwcGVyX3N0ZCAgICAgICAgID0gNSwgICAgIC8vIHVwcGVyIGJvdW5kIGZvciBzdGFuZGFyZCBzY2hlZHVsZXMKKyAgICBrbXBfc2NoZWRfbG93ZXJfZXh0ICAgICAgICAgPSAxMDAsICAgLy8gbG93ZXIgYm91bmQgb2YgSW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworICAgIGttcF9zY2hlZF90cmFwZXpvaWRhbCAgICAgICA9IDEwMSwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgKDM5KQorLy8gIGttcF9zY2hlZF9zdGF0aWNfc3RlYWwgICAgICA9IDEwMiwgICAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfc3RlYWwgICAgICAgICAgICAgKDQ0KQorICAgIGttcF9zY2hlZF91cHBlciAgICAgICAgICAgICA9IDEwMiwKKyAgICBrbXBfc2NoZWRfZGVmYXVsdCA9IGttcF9zY2hlZF9zdGF0aWMgLy8gZGVmYXVsdCBzY2hlZHVsaW5nCit9IGttcF9zY2hlZF90OworI2VuZGlmCisKKy8qIQorIEBpbmdyb3VwIFdPUktfU0hBUklORworICogRGVzY3JpYmVzIHRoZSBsb29wIHNjaGVkdWxlIHRvIGJlIHVzZWQgZm9yIGEgcGFyYWxsZWwgZm9yIGxvb3AuCisgKi8KK2VudW0gc2NoZWRfdHlwZSB7CisgICAga21wX3NjaF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gMzIsICAgLyoqPCBsb3dlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDMzLAorICAgIGttcF9zY2hfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDM0LCAgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAgPSAzNSwKKyAgICBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgPSAzNiwgICAvKio8IGd1aWRlZCB1bnNwZWNpYWxpemVkICovCisgICAga21wX3NjaF9ydW50aW1lICAgICAgICAgICAgICAgICAgID0gMzcsCisgICAga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgID0gMzgsICAgLyoqPCBhdXRvICovCisgICAga21wX3NjaF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gMzksCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX3N0YXRpY19ncmVlZHkgICAgICAgICAgICAgPSA0MCwKKyAgICBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgPSA0MSwKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfc2NoX2d1aWRlZF9pdGVyYXRpdmVfY2h1bmtlZCAgPSA0MiwKKyAgICBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgPSA0MywKKworICAgIGttcF9zY2hfc3RhdGljX3N0ZWFsICAgICAgICAgICAgICA9IDQ0LCAgIC8qKjwgYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkX2NodW5rZWQgICA9IDQ1LCAgIC8qKjwgc3RhdGljIHdpdGggY2h1bmsgYWRqdXN0bWVudCAoZS5nLiwgc2ltZCkgKi8KKyNlbmRpZgorCisgICAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggS01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisgICAga21wX3NjaF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNDYsICAgLyoqPCB1cHBlciBib3VuZCBmb3IgdW5vcmRlcmVkIHZhbHVlcyAqLworCisgICAga21wX29yZF9sb3dlciAgICAgICAgICAgICAgICAgICAgID0gNjQsICAgLyoqPCBsb3dlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMsIG11c3QgYmUgcG93ZXIgb2YgMiAqLworICAgIGttcF9vcmRfc3RhdGljX2NodW5rZWQgICAgICAgICAgICA9IDY1LAorICAgIGttcF9vcmRfc3RhdGljICAgICAgICAgICAgICAgICAgICA9IDY2LCAgIC8qKjwgb3JkZXJlZCBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9vcmRfZHluYW1pY19jaHVua2VkICAgICAgICAgICA9IDY3LAorICAgIGttcF9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICA9IDY4LAorICAgIGttcF9vcmRfcnVudGltZSAgICAgICAgICAgICAgICAgICA9IDY5LAorICAgIGttcF9vcmRfYXV0byAgICAgICAgICAgICAgICAgICAgICA9IDcwLCAgIC8qKjwgb3JkZXJlZCBhdXRvICovCisgICAga21wX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgICAgID0gNzEsCisgICAga21wX29yZF91cHBlciAgICAgICAgICAgICAgICAgICAgID0gNzIsICAgLyoqPCB1cHBlciBib3VuZCBmb3Igb3JkZXJlZCB2YWx1ZXMgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLyogU2NoZWR1bGVzIGZvciBEaXN0cmlidXRlIGNvbnN0cnVjdCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpY19jaHVua2VkICAgICA9IDkxLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgY2h1bmtlZCAqLworICAgIGttcF9kaXN0cmlidXRlX3N0YXRpYyAgICAgICAgICAgICA9IDkyLCAgIC8qKjwgZGlzdHJpYnV0ZSBzdGF0aWMgdW5zcGVjaWFsaXplZCAqLworI2VuZGlmCisKKyAgICAvKgorICAgICAqIEZvciB0aGUgIm5vbWVyZ2UiIHZlcnNpb25zLCBrbXBfZGlzcGF0Y2hfbmV4dCooKSB3aWxsIGFsd2F5cyByZXR1cm4KKyAgICAgKiBhIHNpbmdsZSBpdGVyYXRpb24vY2h1bmssIGV2ZW4gaWYgdGhlIGxvb3AgaXMgc2VyaWFsaXplZC4gIEZvciB0aGUKKyAgICAgKiBzY2hlZHVsZSB0eXBlcyBsaXN0ZWQgYWJvdmUsIHRoZSBlbnRpcmUgaXRlcmF0aW9uIHZlY3RvciBpcyByZXR1cm5lZAorICAgICAqIGlmIHRoZSBsb29wIGlzIHNlcmlhbGl6ZWQuICBUaGlzIGRvZXNuJ3Qgd29yayBmb3IgZ2NjL2djb21wIHNlY3Rpb25zLgorICAgICAqLworICAgIGttcF9ubV9sb3dlciAgICAgICAgICAgICAgICAgICAgICA9IDE2MCwgIC8qKjwgbG93ZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyAgICBrbXBfbm1fc3RhdGljX2NodW5rZWQgICAgICAgICAgICAgPSAoa21wX3NjaF9zdGF0aWNfY2h1bmtlZCAtIGttcF9zY2hfbG93ZXIgKyBrbXBfbm1fbG93ZXIpLAorICAgIGttcF9ubV9zdGF0aWMgICAgICAgICAgICAgICAgICAgICA9IDE2MiwgIC8qKjwgc3RhdGljIHVuc3BlY2lhbGl6ZWQgKi8KKyAgICBrbXBfbm1fZHluYW1pY19jaHVua2VkICAgICAgICAgICAgPSAxNjMsCisgICAga21wX25tX2d1aWRlZF9jaHVua2VkICAgICAgICAgICAgID0gMTY0LCAgLyoqPCBndWlkZWQgdW5zcGVjaWFsaXplZCAqLworICAgIGttcF9ubV9ydW50aW1lICAgICAgICAgICAgICAgICAgICA9IDE2NSwKKyAgICBrbXBfbm1fYXV0byAgICAgICAgICAgICAgICAgICAgICAgPSAxNjYsICAvKio8IGF1dG8gKi8KKyAgICBrbXBfbm1fdHJhcGV6b2lkYWwgICAgICAgICAgICAgICAgPSAxNjcsCisKKyAgICAvKiBhY2Nlc3NpYmxlIG9ubHkgdGhyb3VnaCBLTVBfU0NIRURVTEUgZW52aXJvbm1lbnQgdmFyaWFibGUgKi8KKyAgICBrbXBfbm1fc3RhdGljX2dyZWVkeSAgICAgICAgICAgICAgPSAxNjgsCisgICAga21wX25tX3N0YXRpY19iYWxhbmNlZCAgICAgICAgICAgID0gMTY5LAorICAgIC8qIGFjY2Vzc2libGUgb25seSB0aHJvdWdoIEtNUF9TQ0hFRFVMRSBlbnZpcm9ubWVudCB2YXJpYWJsZSAqLworICAgIGttcF9ubV9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgICA9IDE3MCwKKyAgICBrbXBfbm1fZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCAgPSAxNzEsCisgICAga21wX25tX3N0YXRpY19zdGVhbCAgICAgICAgICAgICAgID0gMTcyLCAgLyogYWNjZXNzaWJsZSBvbmx5IHRocm91Z2ggT01QX1NDSEVEVUxFIGVudmlyb25tZW50IHZhcmlhYmxlICovCisKKyAgICBrbXBfbm1fb3JkX3N0YXRpY19jaHVua2VkICAgICAgICAgPSAxOTMsCisgICAga21wX25tX29yZF9zdGF0aWMgICAgICAgICAgICAgICAgID0gMTk0LCAgLyoqPCBvcmRlcmVkIHN0YXRpYyB1bnNwZWNpYWxpemVkICovCisgICAga21wX25tX29yZF9keW5hbWljX2NodW5rZWQgICAgICAgID0gMTk1LAorICAgIGttcF9ubV9vcmRfZ3VpZGVkX2NodW5rZWQgICAgICAgICA9IDE5NiwKKyAgICBrbXBfbm1fb3JkX3J1bnRpbWUgICAgICAgICAgICAgICAgPSAxOTcsCisgICAga21wX25tX29yZF9hdXRvICAgICAgICAgICAgICAgICAgID0gMTk4LCAgLyoqPCBhdXRvICovCisgICAga21wX25tX29yZF90cmFwZXpvaWRhbCAgICAgICAgICAgID0gMTk5LAorICAgIGttcF9ubV91cHBlciAgICAgICAgICAgICAgICAgICAgICA9IDIwMCwgIC8qKjwgdXBwZXIgYm91bmQgZm9yIG5vbWVyZ2UgdmFsdWVzICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIC8qIFN1cHBvcnQgZm9yIE9wZW5NUCA0LjUgbW9ub3RvbmljIGFuZCBub25tb25vdG9uaWMgc2NoZWR1bGUgbW9kaWZpZXJzLgorICAgICAqIFNpbmNlIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlIHRocmVlIHBvc3NpYmxlIGNhc2VzIChubyBtb2RpZmllciwgbW9ub3RvbmljIG1vZGlmaWVyLAorICAgICAqIG5vbm1vbm90b25pYyBtb2RpZmllciksIHdlIG5lZWQgc2VwYXJhdGUgYml0cyBmb3IgZWFjaCBtb2RpZmllci4KKyAgICAgKiBUaGUgYWJzZW5jZSBvZiBtb25vdG9uaWMgZG9lcyBub3QgaW1wbHkgbm9ubW9ub3RvbmljLCBlc3BlY2lhbGx5IHNpbmNlIDQuNSBzYXlzCisgICAgICogdGhhdCB0aGUgYmVoYXZpb3VyIG9mIHRoZSAibm8gbW9kaWZpZXIiIGNhc2UgaXMgaW1wbGVtZW50YXRpb24gZGVmaW5lZCBpbiA0LjUsCisgICAgICogYnV0IHdpbGwgYmVjb21lICJub25tb25vdG9uaWMiIGluIDUuMC4KKyAgICAgKgorICAgICAqIFNpbmNlIHdlJ3JlIHBhc3NpbmcgYSBmdWxsIDMyIGJpdCB2YWx1ZSwgd2UgY2FuIHVzZSBhIGNvdXBsZSBvZiBoaWdoIGJpdHMgZm9yIHRoZXNlCisgICAgICogZmxhZ3M7IG91dCBvZiBwYXJhbm9pYSB3ZSBhdm9pZCB0aGUgc2lnbiBiaXQuCisgICAgICoKKyAgICAgKiBUaGVzZSBtb2RpZmllcnMgY2FuIGJlIG9yLWVkIGludG8gbm9uLXN0YXRpYyBzY2hlZHVsZXMgYnkgdGhlIGNvbXBpbGVyIHRvIHBhc3MKKyAgICAgKiB0aGUgYWRkaXRpb25hbCBpbmZvcm1hdGlvbi4KKyAgICAgKiBUaGV5IHdpbGwgYmUgc3RyaXBwZWQgZWFybHkgaW4gdGhlIHByb2Nlc3NpbmcgaW4gX19rbXBfZGlzcGF0Y2hfaW5pdCB3aGVuIHNldHRpbmcgdXAgc2NoZWR1bGVzLCBzbworICAgICAqIG1vc3Qgb2YgdGhlIGNvZGUgd29uJ3QgZXZlciBzZWUgc2NoZWR1bGVzIHdpdGggdGhlc2UgYml0cyBzZXQuCisgICAgICovCisgICAga21wX3NjaF9tb2RpZmllcl9tb25vdG9uaWMgICAgICA9ICgxPDwyOSksIC8qKjwgU2V0IGlmIHRoZSBtb25vdG9uaWMgc2NoZWR1bGUgbW9kaWZpZXIgd2FzIHByZXNlbnQgKi8KKyAgICBrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYyAgID0gKDE8PDMwKSwgLyoqPCBTZXQgaWYgdGhlIG5vbm1vbm90b25pYyBzY2hlZHVsZSBtb2RpZmllciB3YXMgcHJlc2VudCAqLworCisjIGRlZmluZSBTQ0hFRFVMRV9XSVRIT1VUX01PRElGSUVSUyhzKSAoZW51bSBzY2hlZF90eXBlKSgocykgJiB+IChrbXBfc2NoX21vZGlmaWVyX25vbm1vbm90b25pYyB8IGttcF9zY2hfbW9kaWZpZXJfbW9ub3RvbmljKSkKKyMgZGVmaW5lIFNDSEVEVUxFX0hBU19NT05PVE9OSUMocykgICAgICgoKHMpICYga21wX3NjaF9tb2RpZmllcl9tb25vdG9uaWMpICAgICE9IDApCisjIGRlZmluZSBTQ0hFRFVMRV9IQVNfTk9OTU9OT1RPTklDKHMpICAoKChzKSAmIGttcF9zY2hfbW9kaWZpZXJfbm9ubW9ub3RvbmljKSAhPSAwKQorIyBkZWZpbmUgU0NIRURVTEVfSEFTX05PX01PRElGSUVSUyhzKSAgKCgocykgJiAoa21wX3NjaF9tb2RpZmllcl9ub25tb25vdG9uaWMgfCBrbXBfc2NoX21vZGlmaWVyX21vbm90b25pYykpID09IDApCisjZWxzZQorICAgIC8qIEJ5IGRvaW5nIHRoaXMgd2UgaG9wZSB0byBhdm9pZCBtdWx0aXBsZSB0ZXN0cyBvbiBPTVBfNDVfRU5BQkxFRC4gQ29tcGlsZXJzIGNhbiBub3cgZWxpbWluYXRlIHRlc3RzIG9uIGNvbXBpbGUgdGltZQorICAgICAqIGNvbnN0YW50cyBhbmQgZGVhZCBjb2RlIHRoYXQgcmVzdWx0cyBmcm9tIHRoZW0sIHNvIHdlIGNhbiBsZWF2ZSBjb2RlIGd1YXJkZWQgYnkgc3VjaCBhbiBpZiBpbiBwbGFjZS4KKyAgICAgKi8KKyMgZGVmaW5lIFNDSEVEVUxFX1dJVEhPVVRfTU9ESUZJRVJTKHMpIChzKQorIyBkZWZpbmUgU0NIRURVTEVfSEFTX01PTk9UT05JQyhzKSAgICAgZmFsc2UKKyMgZGVmaW5lIFNDSEVEVUxFX0hBU19OT05NT05PVE9OSUMocykgIGZhbHNlCisjIGRlZmluZSBTQ0hFRFVMRV9IQVNfTk9fTU9ESUZJRVJTKHMpICB0cnVlCisjZW5kaWYKKworICAgIGttcF9zY2hfZGVmYXVsdCA9IGttcF9zY2hfc3RhdGljICAvKio8IGRlZmF1bHQgc2NoZWR1bGluZyBhbGdvcml0aG0gKi8KK307CisKKy8qIFR5cGUgdG8ga2VlcCBydW50aW1lIHNjaGVkdWxlIHNldCB2aWEgT01QX1NDSEVEVUxFIG9yIG9tcF9zZXRfc2NoZWR1bGUoKSAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Jfc2NoZWQgeworICAgIGVudW0gc2NoZWRfdHlwZSByX3NjaGVkX3R5cGU7CisgICAgaW50ICAgICAgICAgICAgIGNodW5rOworfSBrbXBfcl9zY2hlZF90OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbXTsgLy8gbWFwIE9NUCAzLjAgc2NoZWR1bGUgdHlwZXMgd2l0aCBvdXIgaW50ZXJuYWwgc2NoZWR1bGUgdHlwZXMKKworZW51bSBsaWJyYXJ5X3R5cGUgeworICAgIGxpYnJhcnlfbm9uZSwKKyAgICBsaWJyYXJ5X3NlcmlhbCwKKyAgICBsaWJyYXJ5X3R1cm5hcm91bmQsCisgICAgbGlicmFyeV90aHJvdWdocHV0Cit9OworCisjaWYgS01QX09TX0xJTlVYCitlbnVtIGNsb2NrX2Z1bmN0aW9uX3R5cGUgeworICAgIGNsb2NrX2Z1bmN0aW9uX2dldHRpbWVvZmRheSwKKyAgICBjbG9ja19mdW5jdGlvbl9jbG9ja19nZXR0aW1lCit9OworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCitlbnVtIG1pY190eXBlIHsKKyAgICBub25fbWljLAorICAgIG1pYzEsCisgICAgbWljMiwKKyAgICBtaWMzLAorICAgIGR1bW15Cit9OworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0gZmFzdCByZWR1Y3Rpb24gc3R1ZmYgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyN1bmRlZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorI2RlZmluZSBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUiAxCisKKyN1bmRlZiBLTVBfRkFTVF9SRURVQ1RJT05fQ09SRV9EVU8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgI2RlZmluZSBLTVBfRkFTVF9SRURVQ1RJT05fQ09SRV9EVU8gMQorI2VuZGlmCisKK2VudW0gX3JlZHVjdGlvbl9tZXRob2QgeworICAgIHJlZHVjdGlvbl9tZXRob2Rfbm90X2RlZmluZWQgPSAwLAorICAgIGNyaXRpY2FsX3JlZHVjZV9ibG9jayAgICAgICAgPSAoIDEgPDwgOCApLAorICAgIGF0b21pY19yZWR1Y2VfYmxvY2sgICAgICAgICAgPSAoIDIgPDwgOCApLAorICAgIHRyZWVfcmVkdWNlX2Jsb2NrICAgICAgICAgICAgPSAoIDMgPDwgOCApLAorICAgIGVtcHR5X3JlZHVjZV9ibG9jayAgICAgICAgICAgPSAoIDQgPDwgOCApCit9OworCisvLyBkZXNjcmlwdGlvbiBvZiB0aGUgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgdmFyaWFibGUKKy8vIHRoZSBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCB2YXJpYWJsZSBjb25zaXN0cyBvZiB0d28gZW51bSB0eXBlcyB2YXJpYWJsZXMgdGhhdCBhcmUgcGFja2VkIHRvZ2V0aGVyIGludG8gMC10aCBieXRlIGFuZCAxLXN0IGJ5dGU6CisvLyAwOiAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwMDBGRiApIGlzIGEgJ2VudW0gYmFycmllcl90eXBlJyB2YWx1ZSBvZiBiYXJyaWVyIHRoYXQgd2lsbCBiZSB1c2VkIGluIGZhc3QgcmVkdWN0aW9uOiBic19wbGFpbl9iYXJyaWVyIG9yIGJzX3JlZHVjdGlvbl9iYXJyaWVyCisvLyAxOiAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICYgMHgwMDAwRkYwMCApIGlzIGEgcmVkdWN0aW9uIG1ldGhvZCB0aGF0IHdpbGwgYmUgdXNlZCBpbiBmYXN0IHJlZHVjdGlvbjsKKy8vIHJlZHVjdGlvbiBtZXRob2QgaXMgb2YgJ2VudW0gX3JlZHVjdGlvbl9tZXRob2QnIHR5cGUgYW5kIGl0J3MgZGVmaW5lZCB0aGUgd2F5IHNvIHRoYXQgdGhlIGJpdHMgb2YgMC10aCBieXRlIGFyZSBlbXB0eSwKKy8vIHNvIG5vIG5lZWQgdG8gZXhlY3V0ZSBhIHNoaWZ0IGluc3RydWN0aW9uIHdoaWxlIHBhY2tpbmcvdW5wYWNraW5nCisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgUEFDS19SRURVQ1RJT05fTUVUSE9EX0FORF9CQVJSSUVSKHJlZHVjdGlvbl9tZXRob2QsYmFycmllcl90eXBlKSBcCisgICAgICAgICAgICAoICggcmVkdWN0aW9uX21ldGhvZCApIHwgKCBiYXJyaWVyX3R5cGUgKSApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoICggZW51bSBfcmVkdWN0aW9uX21ldGhvZCApKCAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgJiAoIDB4MDAwMEZGMDAgKSApICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoICggZW51bSBiYXJyaWVyX3R5cGUgKSggICAgICAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgJiAoIDB4MDAwMDAwRkYgKSApICkKKyNlbHNlCisgICAgI2RlZmluZSBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIocmVkdWN0aW9uX21ldGhvZCxiYXJyaWVyX3R5cGUpIFwKKyAgICAgICAgICAgICggcmVkdWN0aW9uX21ldGhvZCApCisKKyAgICAjZGVmaW5lIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkKKworICAgICNkZWZpbmUgVU5QQUNLX1JFRFVDVElPTl9CQVJSSUVSKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kKSBcCisgICAgICAgICAgICAoIGJzX3BsYWluX2JhcnJpZXIgKQorI2VuZGlmCisKKyNkZWZpbmUgVEVTVF9SRURVQ1RJT05fTUVUSE9EKHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLHdoaWNoX3JlZHVjdGlvbl9ibG9jaykgXAorICAgICAgICAgICAgKCAoIFVOUEFDS19SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICkgPT0gKCB3aGljaF9yZWR1Y3Rpb25fYmxvY2sgKSApCisKKyNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICNkZWZpbmUgVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUiBcCisgICAgICAgICAgICAoIFBBQ0tfUkVEVUNUSU9OX01FVEhPRF9BTkRfQkFSUklFUiggdHJlZV9yZWR1Y2VfYmxvY2ssIGJzX3JlZHVjdGlvbl9iYXJyaWVyICkgKQorCisgICAgI2RlZmluZSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1BMQUlOX0JBUlJJRVIgXAorICAgICAgICAgICAgKCBQQUNLX1JFRFVDVElPTl9NRVRIT0RfQU5EX0JBUlJJRVIoIHRyZWVfcmVkdWNlX2Jsb2NrLCBic19wbGFpbl9iYXJyaWVyICkgKQorI2VuZGlmCisKK3R5cGVkZWYgaW50IFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1Q7CisKKy8qIC0tIGVuZCBvZiBmYXN0IHJlZHVjdGlvbiBzdHVmZiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIFVTRV9DQkxLREFUQQorIyBwcmFnbWEgd2FybmluZyggcHVzaCApCisjIHByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAyNzEgMzEwICkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgorIyBwcmFnbWEgd2FybmluZyggcG9wICkKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKyMgaW5jbHVkZSA8cHRocmVhZC5oPgorIyBpbmNsdWRlIDxkbGZjbi5oPgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBPbmx5IExpbnV4KiBPUyBhbmQgV2luZG93cyogT1Mgc3VwcG9ydCB0aHJlYWQgYWZmaW5pdHkuCisgKi8KKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisvLyBHUk9VUF9BRkZJTklUWSBpcyBhbHJlYWR5IGRlZmluZWQgZm9yIF9NU0NfVkVSPj0xNjAwIChWUzIwMTAgYW5kIGxhdGVyKS4KKyMgIGlmIF9NU0NfVkVSIDwgMTYwMAordHlwZWRlZiBzdHJ1Y3QgR1JPVVBfQUZGSU5JVFkgeworICAgIEtBRkZJTklUWSBNYXNrOworICAgIFdPUkQgR3JvdXA7CisgICAgV09SRCBSZXNlcnZlZFszXTsKK30gR1JPVVBfQUZGSU5JVFk7CisjICBlbmRpZiAvKiBfTVNDX1ZFUiA8IDE2MDAgKi8KK2V4dGVybiBpbnQgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOwordHlwZWRlZiBEV09SRCAoKmttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KShXT1JEKTsKK2V4dGVybiBrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudDsKKwordHlwZWRlZiBXT1JEICgqa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCkodm9pZCk7CitleHRlcm4ga21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50OworCit0eXBlZGVmIEJPT0wgKCprbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eV90KShIQU5ETEUsIEdST1VQX0FGRklOSVRZICopOworZXh0ZXJuIGttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eTsKKwordHlwZWRlZiBCT09MICgqa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkoSEFORExFLCBjb25zdCBHUk9VUF9BRkZJTklUWSAqLCBHUk9VUF9BRkZJTklUWSAqKTsKK2V4dGVybiBrbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eV90IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHk7CisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCitleHRlcm4gc2l6ZV90IF9fa21wX2FmZmluX21hc2tfc2l6ZTsKKyMgZGVmaW5lIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKF9fa21wX2FmZmluX21hc2tfc2l6ZSA+IDApCisjIGRlZmluZSBLTVBfQUZGSU5JVFlfRElTQUJMRSgpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSAwKQorIyBkZWZpbmUgS01QX0FGRklOSVRZX0VOQUJMRShtYXNrX3NpemUpIChfX2ttcF9hZmZpbl9tYXNrX3NpemUgPSBtYXNrX3NpemUpCisjIGlmICFLTVBfVVNFX0hXTE9DCisjICBkZWZpbmUgS01QX0NQVV9TRVRTSVpFICAgICAgICAoX19rbXBfYWZmaW5fbWFza19zaXplICogQ0hBUl9CSVQpCisjICBkZWZpbmUgS01QX0NQVV9TRVRfSVRFUkFURShpLG1hc2spIFwKKyAgICBmb3IoaSA9IDA7IChzaXplX3QpaSA8IEtNUF9DUFVfU0VUU0laRTsgKytpKQorIyBlbmRpZgorCisjaWYgS01QX1VTRV9IV0xPQworCitleHRlcm4gaHdsb2NfdG9wb2xvZ3lfdCBfX2ttcF9od2xvY190b3BvbG9neTsKK2V4dGVybiBpbnQgX19rbXBfaHdsb2NfZXJyb3I7Cit0eXBlZGVmIGh3bG9jX2NwdXNldF90IGttcF9hZmZpbl9tYXNrX3Q7CisjIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgICAgIGh3bG9jX2JpdG1hcF9zZXQoKGh3bG9jX2NwdXNldF90KW1hc2ssICh1bnNpZ25lZClpKQorIyBkZWZpbmUgS01QX0NQVV9JU1NFVChpLG1hc2spICAgICBod2xvY19iaXRtYXBfaXNzZXQoKGh3bG9jX2NwdXNldF90KW1hc2ssICh1bnNpZ25lZClpKQorIyBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSAgICAgICBod2xvY19iaXRtYXBfY2xyKChod2xvY19jcHVzZXRfdCltYXNrLCAodW5zaWduZWQpaSkKKyMgZGVmaW5lIEtNUF9DUFVfWkVSTyhtYXNrKSAgICAgICAgaHdsb2NfYml0bWFwX3plcm8oKGh3bG9jX2NwdXNldF90KW1hc2spCisjIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSAgIGh3bG9jX2JpdG1hcF9jb3B5KChod2xvY19jcHVzZXRfdClkZXN0LCAoaHdsb2NfY3B1c2V0X3Qpc3JjKQorIyBkZWZpbmUgS01QX0NQVV9BTkQoZGVzdCwgc3JjKSAgICBod2xvY19iaXRtYXBfYW5kKChod2xvY19jcHVzZXRfdClkZXN0LCAoaHdsb2NfY3B1c2V0X3QpZGVzdCwgKGh3bG9jX2NwdXNldF90KXNyYykKKyMgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgXAorICAgIHsgXAorICAgICAgICB1bnNpZ25lZCBpOyBcCisgICAgICAgIGZvcihpPTA7aTwodW5zaWduZWQpbWF4X2JpdF9udW1iZXIrMTtpKyspIHsgXAorICAgICAgICAgICAgaWYoaHdsb2NfYml0bWFwX2lzc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCBpKSkgeyBcCisgICAgICAgICAgICAgICAgaHdsb2NfYml0bWFwX2NscigoaHdsb2NfY3B1c2V0X3QpbWFzaywgaSk7IFwKKyAgICAgICAgICAgIH0gZWxzZSB7IFwKKyAgICAgICAgICAgICAgICBod2xvY19iaXRtYXBfc2V0KChod2xvY19jcHVzZXRfdCltYXNrLCBpKTsgXAorICAgICAgICAgICAgfSBcCisgICAgICAgIH0gXAorICAgICAgICBod2xvY19iaXRtYXBfYW5kKChod2xvY19jcHVzZXRfdCltYXNrLCAoaHdsb2NfY3B1c2V0X3QpbWFzaywgXAorICAgICAgICAgICAgKGh3bG9jX2NwdXNldF90KV9fa21wX2FmZmluX2Z1bGxNYXNrKTsgXAorICAgIH0gXAorCisjIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgIGh3bG9jX2JpdG1hcF9vcigoaHdsb2NfY3B1c2V0X3QpZGVzdCwgKGh3bG9jX2NwdXNldF90KWRlc3QsIChod2xvY19jcHVzZXRfdClzcmMpCisjIGRlZmluZSBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksbWFzaykgXAorICAgIGZvcihpID0gaHdsb2NfYml0bWFwX2ZpcnN0KChod2xvY19jcHVzZXRfdCltYXNrKTsgKGludClpICE9IC0xOyBpID0gaHdsb2NfYml0bWFwX25leHQoKGh3bG9jX2NwdXNldF90KW1hc2ssIGkpKQorCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DKHB0cikgcHRyID0gKGttcF9hZmZpbl9tYXNrX3QqKWh3bG9jX2JpdG1hcF9hbGxvYygpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUUocHRyKSBod2xvY19iaXRtYXBfZnJlZSgoaHdsb2NfYml0bWFwX3QpcHRyKTsKKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0socHRyKSBLTVBfQ1BVX0FMTE9DKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKHB0cikgS01QX0NQVV9GUkVFKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0MocHRyKSBLTVBfQ1BVX0FMTE9DKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfRlJFRShwdHIpIEtNUF9DUFVfRlJFRShwdHIpCisKKy8vCisvLyBUaGUgZm9sbG93aW5nIG1hY3JvIHNob3VsZCBiZSB1c2VkIHRvIGluZGV4IGFuIGFycmF5IG9mIG1hc2tzLgorLy8gVGhlIGFycmF5IHNob3VsZCBiZSBkZWNsYXJlZCBhcyAia21wX2FmZmluaXR5X3QgKiIgYW5kIGFsbG9jYXRlZCB3aXRoCisvLyBzaXplICJfX2ttcF9hZmZpbml0eV9tYXNrX3NpemUgKiBsZW4iLiAgVGhlIG1hY3JvIHRha2VzIGNhcmUgb2YgdGhlIGZhY3QKKy8vIHRoYXQgb24gV2luZG93cyogT1MsIHNpemVvZihrbXBfYWZmaW5fdCkgaXMgcmVhbGx5IHRoZSBzaXplIG9mIHRoZSBtYXNrLCBidXQKKy8vIG9uIExpbnV4KiBPUywgc2l6ZW9mKGttcF9hZmZpbl90KSBpcyAxLgorLy8KKyMgZGVmaW5lIEtNUF9DUFVfSU5ERVgoYXJyYXksaSkgKChrbXBfYWZmaW5fbWFza190KikoYXJyYXlbaV0pKQorIyBkZWZpbmUgS01QX0NQVV9BTExPQ19BUlJBWShhcnIsIG4pIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKV9fa21wX2FsbG9jYXRlKG4qc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKTsgXAorICAgIHVuc2lnbmVkIGk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKGk9MDtpPCh1bnNpZ25lZCluO2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJyW2ldID0gaHdsb2NfYml0bWFwX2FsbG9jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisjIGRlZmluZSBLTVBfQ1BVX0ZSRUVfQVJSQVkoYXJyLCBuKSB7IFwKKyAgICB1bnNpZ25lZCBpOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBmb3IoaT0wO2k8KHVuc2lnbmVkKW47aSsrKSB7ICAgICAgIFwKKyAgICAgICAgaHdsb2NfYml0bWFwX2ZyZWUoYXJyW2ldKTsgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9mcmVlKGFycik7ICAgICAgICAgICAgICAgICAgIFwKKyAgIH0KKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkoYXJyLCBuKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBhcnIgPSAoa21wX2FmZmluX21hc2tfdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MobipzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpOyBcCisgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGZvcihpPTA7aTwodW5zaWduZWQpbjtpKyspIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgYXJyW2ldID0gaHdsb2NfYml0bWFwX2FsbG9jKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgfQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKGFyciwgbikgeyBcCisgICAgdW5zaWduZWQgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZm9yKGk9MDtpPCh1bnNpZ25lZCluO2krKykgeyAgICAgICAgICAgICAgICBcCisgICAgICAgIGh3bG9jX2JpdG1hcF9mcmVlKGFycltpXSk7ICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYXJyKTsgICAgICAgICAgICAgICAgICAgICBcCisgICB9CisKKyNlbHNlIC8qIEtNUF9VU0VfSFdMT0MgKi8KKyMgaWYgS01QX09TX0xJTlVYCisvLworLy8gT24gTGludXgqIE9TLCB0aGUgbWFzayBpcyBhY3R1YWxseSBhIHZlY3RvciBvZiBsZW5ndGggX19rbXBfYWZmaW5fbWFza19zaXplCisvLyAoaW4gYnl0ZXMpLiAgSXQgc2hvdWxkIGJlIGFsbG9jYXRlZCBvbiBhIHdvcmQgYm91bmRhcnkuCisvLworLy8gV0FSTklORyEhISAgV2UgaGF2ZSBtYWRlIHRoZSBiYXNlIHR5cGUgb2YgdGhlIGFmZmluaXR5IG1hc2sgdW5zaWduZWQgY2hhciwKKy8vIGluIG9yZGVyIHRvIGVsaW1pbmF0ZSBhIGxvdCBvZiBjaGVja3MgdGhhdCB0aGUgdHJ1ZSBzeXN0ZW0gbWFzayBzaXplIGlzCisvLyByZWFsbHkgYSBtdWx0aXBsZSBvZiA0IGJ5dGVzIChvbiBMaW51eCogT1MpLgorLy8KKy8vIFRIRVNFIE1BQ1JPUyBXT04nVCBXT1JLIFBST1BFUkxZIE9OIEJJRyBFTkRJQU4gTUFDSElORVMhISEKKy8vCisKK3R5cGVkZWYgdW5zaWduZWQgY2hhciBrbXBfYWZmaW5fbWFza190OworCisjICBkZWZpbmUgX0tNUF9DUFVfU0VUKGksbWFzaykgICAobWFza1tpL0NIQVJfQklUXSB8PSAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX1NFVChpLG1hc2spICAgIF9LTVBfQ1BVX1NFVCgoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisjICBkZWZpbmUgX0tNUF9DUFVfSVNTRVQoaSxtYXNrKSAoISEobWFza1tpL0NIQVJfQklUXSAmICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSBDSEFSX0JJVCkpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0lTU0VUKGksbWFzaykgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKyMgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSAgIChtYXNrW2kvQ0hBUl9CSVRdICY9IH4oKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgQ0hBUl9CSVQpKSkKKyMgIGRlZmluZSBLTVBfQ1BVX0NMUihpLG1hc2spICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSA9IDA7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9DT1BZKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzaXplX3QgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfYWZmaW5fbWFza19zaXplOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9ICgoa21wX2FmZmluX21hc2tfdCAqKShzcmMpKVtfX2ldOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgIGRlZmluZSBLTVBfQ1BVX0FORChkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgJj0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9DT01QTEVNRU5UKG1heF9iaXRfbnVtYmVyLCBtYXNrKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9hZmZpbl9tYXNrX3NpemU7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gfigoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX0FORChtYXNrLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICBkZWZpbmUgS01QX0NQVV9VTklPTihkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc2l6ZV90IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX2FmZmluX21hc2tfc2l6ZTsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgfD0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjIGlmIEtNUF9PU19XSU5ET1dTCisvLworLy8gT24gV2luZG93cyogT1MsIHRoZSBtYXNrIHNpemUgaXMgNCBieXRlcyBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlLCBhbmQgb24KKy8vIEludGVsKFIpIDY0IGl0IGlzIDggYnl0ZXMgdGltZXMgdGhlIG51bWJlciBvZiBwcm9jZXNzb3IgZ3JvdXBzLgorLy8KKworIyAgaWYgS01QX0dST1VQX0FGRklOSVRZCit0eXBlZGVmIERXT1JEX1BUUiBrbXBfYWZmaW5fbWFza190OworCisjICAgZGVmaW5lIF9LTVBfQ1BVX1NFVChpLG1hc2spIFwKKyAgICAgICAgKG1hc2tbaS8oQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpXSB8PSAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpICUgKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgXAorICAgICAgICBfS01QX0NQVV9TRVQoKGkpLCAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpKQorCisjICAgZGVmaW5lIF9LTVBfQ1BVX0lTU0VUKGksbWFzaykgXAorICAgICAgICAoISEobWFza1tpLyhDSEFSX0JJVCAqIHNpemVvZihrbXBfYWZmaW5fbWFza190KSldICYgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpKQorCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0lTU0VUKChpKSwgKChrbXBfYWZmaW5fbWFza190ICopKG1hc2spKSkKKworIyAgIGRlZmluZSBfS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIChtYXNrW2kvKENIQVJfQklUICogc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKV0gJj0gICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfigoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkgJSAoQ0hBUl9CSVQgKiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkpKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9DTFIoaSxtYXNrKSBcCisgICAgICAgIF9LTVBfQ1BVX0NMUigoaSksICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSkpCisKKyMgICBkZWZpbmUgS01QX0NQVV9aRVJPKG1hc2spIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV0gPSAwOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBfX2k7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgZm9yIChfX2kgPSAwOyBfX2kgPCBfX2ttcF9udW1fcHJvY19ncm91cHM7IF9faSsrKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKChrbXBfYWZmaW5fbWFza190ICopKGRlc3QpKVtfX2ldICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgID0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX0FORChkZXN0LCBzcmMpIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaW50IF9faTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBmb3IgKF9faSA9IDA7IF9faSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgX19pKyspIHsgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAoKGttcF9hZmZpbl9tYXNrX3QgKikoZGVzdCkpW19faV0gICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgJj0gKChrbXBfYWZmaW5fbWFza190ICopKHNyYykpW19faV07ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfQorCisjICAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShtYXNrKSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICA9IH4oKGttcF9hZmZpbl9tYXNrX3QgKikobWFzaykpW19faV07ICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0NQVV9BTkQobWFzaywgX19rbXBfYWZmaW5fZnVsbE1hc2spOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworIyAgIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgX19pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvciAoX19pID0gMDsgX19pIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBfX2krKykgeyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKShkZXN0KSlbX19pXSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICB8PSAoKGttcF9hZmZpbl9tYXNrX3QgKikoc3JjKSlbX19pXTsgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKworIyAgZWxzZSAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKwordHlwZWRlZiBEV09SRCBrbXBfYWZmaW5fbWFza190OyAvKiBmb3IgY29tcGF0aWJpbGl0eSB3aXRoIG9sZGVyIHdpbmJhc2UuaCAqLworCisjICAgZGVmaW5lIEtNUF9DUFVfU0VUKGksbWFzaykgICAgICAoKihtYXNrKSB8PSAoKChrbXBfYWZmaW5fbWFza190KTEpIDw8IChpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfSVNTRVQoaSxtYXNrKSAgICAoISEoKihtYXNrKSAmICgoKGttcF9hZmZpbl9tYXNrX3QpMSkgPDwgKGkpKSkpCisjICAgZGVmaW5lIEtNUF9DUFVfQ0xSKGksbWFzaykgICAgICAoKihtYXNrKSAmPSB+KCgoa21wX2FmZmluX21hc2tfdCkxKSA8PCAoaSkpKQorIyAgIGRlZmluZSBLTVBfQ1BVX1pFUk8obWFzaykgICAgICAgKCoobWFzaykgPSAwKQorIyAgIGRlZmluZSBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKSAgKCooZGVzdCkgPSAqKHNyYykpCisjICAgZGVmaW5lIEtNUF9DUFVfQU5EKGRlc3QsIHNyYykgICAoKihkZXN0KSAmPSAqKHNyYykpCisjICAgZGVmaW5lIEtNUF9DUFVfQ09NUExFTUVOVChtYXhfYml0X251bWJlciwgbWFzaykgKCoobWFzaykgPSB+KihtYXNrKSk7IEtNUF9DUFVfQU5EKG1hc2ssIF9fa21wX2FmZmluX2Z1bGxNYXNrKQorIyAgIGRlZmluZSBLTVBfQ1BVX1VOSU9OKGRlc3QsIHNyYykgKCooZGVzdCkgfD0gKihzcmMpKQorCisjICBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisvLworLy8gX19rbXBfYWxsb2NhdGUoKSB3aWxsIHJldHVybiBtZW1vcnkgYWxsb2NhdGVkIG9uIGEgNC1ieXRlcyBib3VuZGFyeS4KKy8vIGFmdGVyIHplcm9pbmcgaXQgLSBpdCB0YWtlcyBjYXJlIG9mIHRob3NlIGFzc3VtcHRpb25zIHN0YXRlZCBhYm92ZS4KKy8vCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DKHB0cikgXAorICAgICAgICAocHRyID0gKChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUoX19rbXBfYWZmaW5fbWFza19zaXplKSkpCisjIGRlZmluZSBLTVBfQ1BVX0ZSRUUocHRyKSBfX2ttcF9mcmVlKHB0cikKKyMgZGVmaW5lIEtNUF9DUFVfQUxMT0NfT05fU1RBQ0socHRyKSAocHRyID0gKChrbXBfYWZmaW5fbWFza190ICopS01QX0FMTE9DQShfX2ttcF9hZmZpbl9tYXNrX3NpemUpKSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRV9GUk9NX1NUQUNLKHB0cikgLyogTm90aGluZyAqLworIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9BTExPQyhwdHIpIChwdHIgPSAoKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKF9fa21wX2FmZmluX21hc2tfc2l6ZSkpKQorIyBkZWZpbmUgS01QX0NQVV9JTlRFUk5BTF9GUkVFKHB0cikgIEtNUF9JTlRFUk5BTF9GUkVFKHB0cikKKworLy8KKy8vIFRoZSBmb2xsb3dpbmcgbWFjcm8gc2hvdWxkIGJlIHVzZWQgdG8gaW5kZXggYW4gYXJyYXkgb2YgbWFza3MuCisvLyBUaGUgYXJyYXkgc2hvdWxkIGJlIGRlY2xhcmVkIGFzICJrbXBfYWZmaW5pdHlfdCAqIiBhbmQgYWxsb2NhdGVkIHdpdGgKKy8vIHNpemUgIl9fa21wX2FmZmluaXR5X21hc2tfc2l6ZSAqIGxlbiIuICBUaGUgbWFjcm8gdGFrZXMgY2FyZSBvZiB0aGUgZmFjdAorLy8gdGhhdCBvbiBXaW5kb3dzKiBPUywgc2l6ZW9mKGttcF9hZmZpbl90KSBpcyByZWFsbHkgdGhlIHNpemUgb2YgdGhlIG1hc2ssIGJ1dAorLy8gb24gTGludXgqIE9TLCBzaXplb2Yoa21wX2FmZmluX3QpIGlzIDEuCisvLworIyBkZWZpbmUgS01QX0NQVV9JTkRFWChhcnJheSxpKSBcCisgICAgICAgICgoa21wX2FmZmluX21hc2tfdCAqKSgoKGNoYXIgKikoYXJyYXkpKSArIChpKSAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSkpCisjIGRlZmluZSBLTVBfQ1BVX0FMTE9DX0FSUkFZKGFyciwgbikgIGFyciA9IChrbXBfYWZmaW5fbWFza190ICopX19rbXBfYWxsb2NhdGUobiAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSkKKyMgZGVmaW5lIEtNUF9DUFVfRlJFRV9BUlJBWShhcnIsIG4pIF9fa21wX2ZyZWUoYXJyKTsKKyMgZGVmaW5lIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkoYXJyLCBuKSAgYXJyID0gKGttcF9hZmZpbl9tYXNrX3QgKilLTVBfSU5URVJOQUxfTUFMTE9DKG4gKiBfX2ttcF9hZmZpbl9tYXNrX3NpemUpCisjIGRlZmluZSBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkoYXJyLCBuKSBLTVBfSU5URVJOQUxfRlJFRShhcnIpOworCisjZW5kaWYgLyogS01QX1VTRV9IV0xPQyAqLworCisvLyBwcm90b3R5cGUgYWZ0ZXIgdHlwZWRlZiBvZiBrbXBfYWZmaW5fbWFza190CisjaWYgS01QX0dST1VQX0FGRklOSVRZCitleHRlcm4gaW50IF9fa21wX2dldF9wcm9jX2dyb3VwKGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2spOworI2VuZGlmCisKKy8vCisvLyBEZWNsYXJlIGxvY2FsIGNoYXIgYnVmZmVycyB3aXRoIHRoaXMgc2l6ZSBmb3IgcHJpbnRpbmcgZGVidWcgYW5kIGluZm8KKy8vIG1lc3NhZ2VzLCB1c2luZyBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKCkuCisvLworI2RlZmluZSBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4gICAgICAgIDEwMjQKKworZW51bSBhZmZpbml0eV90eXBlIHsKKyAgICBhZmZpbml0eV9ub25lID0gMCwKKyAgICBhZmZpbml0eV9waHlzaWNhbCwKKyAgICBhZmZpbml0eV9sb2dpY2FsLAorICAgIGFmZmluaXR5X2NvbXBhY3QsCisgICAgYWZmaW5pdHlfc2NhdHRlciwKKyAgICBhZmZpbml0eV9leHBsaWNpdCwKKyAgICBhZmZpbml0eV9iYWxhbmNlZCwKKyAgICBhZmZpbml0eV9kaXNhYmxlZCwgIC8vIG5vdCB1c2VkIG91dHNpemUgdGhlIGVudiB2YXIgcGFyc2VyCisgICAgYWZmaW5pdHlfZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV9ncmFuIHsKKyAgICBhZmZpbml0eV9ncmFuX2ZpbmUgPSAwLAorICAgIGFmZmluaXR5X2dyYW5fdGhyZWFkLAorICAgIGFmZmluaXR5X2dyYW5fY29yZSwKKyAgICBhZmZpbml0eV9ncmFuX3BhY2thZ2UsCisgICAgYWZmaW5pdHlfZ3Jhbl9ub2RlLAorI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIC8vCisgICAgLy8gVGhlICJncm91cCIgZ3JhbnVsYXJpdHkgaXNuJ3QgbmVjZXNzc2FyaWx5IGNvYXJzZXIgdGhhbiBhbGwgb2YgdGhlCisgICAgLy8gb3RoZXIgbGV2ZWxzLCBidXQgd2UgcHV0IGl0IGxhc3QgaW4gdGhlIGVudW0uCisgICAgLy8KKyAgICBhZmZpbml0eV9ncmFuX2dyb3VwLAorI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgIGFmZmluaXR5X2dyYW5fZGVmYXVsdAorfTsKKworZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIHsKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2FsbCA9IDAsIC8vIHRyeSBhbGwgKHN1cHBvcnRlZCkgbWV0aG9kcywgaW4gb3JkZXIKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQsCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF94MmFwaWNpZCwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvLCAvLyBLTVBfQ1BVSU5GT19GSUxFIGlzIHVzYWJsZSBvbiBXaW5kb3dzKiBPUywgdG9vCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCwKKyNlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQsCisjaWYgS01QX1VTRV9IV0xPQworICAgIGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MsCisjZW5kaWYKKyAgICBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQKK307CisKKyNkZWZpbmUgYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgICAoLTEpCisKK2V4dGVybiBlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZTsgLyogQWZmaW5pdHkgdHlwZSAqLworZXh0ZXJuIGVudW0gYWZmaW5pdHlfZ3JhbiBfX2ttcF9hZmZpbml0eV9ncmFuOyAvKiBBZmZpbml0eSBncmFudWxhcml0eSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVsczsgLyogY29ycmVzcG9uZGluZyBpbnQgdmFsdWUgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfZHVwczsgLyogQWZmaW5pdHkgZHVwbGljYXRlIG1hc2tzICovCitleHRlcm4gZW51bSBhZmZpbml0eV90b3BfbWV0aG9kIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2Q7CitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworZXh0ZXJuIGludCBfX2ttcF9hZmZpbml0eV9vZmZzZXQ7IC8qIEFmZmluaXR5IG9mZnNldCB2YWx1ZSAgKi8KK2V4dGVybiBpbnQgX19rbXBfYWZmaW5pdHlfdmVyYm9zZTsgLyogV2FzIHZlcmJvc2Ugc3BlY2lmaWVkIGZvciBLTVBfQUZGSU5JVFk/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzOyAvKiBLTVBfQUZGSU5JVFkgd2FybmluZ3MgZW5hYmxlZCA/ICovCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzazsgLyogUmVzcGVjdCBwcm9jZXNzJyBpbml0aWFsIGFmZmluaXR5IG1hc2s/ICovCitleHRlcm4gY2hhciAqIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0OyAvKiBwcm9jIElEIGxpc3QgKi8KK2V4dGVybiBrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrczsKK2V4dGVybiB1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3M7CitleHRlcm4gaW50IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoa21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yKTsKK2V4dGVybiBpbnQgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoaW50IHdoaWNoKTsKKworZXh0ZXJuIGttcF9hZmZpbl9tYXNrX3QgKl9fa21wX2FmZmluX2Z1bGxNYXNrOworZXh0ZXJuIGNoYXIgY29uc3QgKiBfX2ttcF9jcHVpbmZvX2ZpbGU7CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLworLy8gVGhpcyBuZWVkcyB0byBiZSBrZXB0IGluIHN5bmMgd2l0aCB0aGUgdmFsdWVzIGluIG9tcC5oICEhIQorLy8KK3R5cGVkZWYgZW51bSBrbXBfcHJvY19iaW5kX3QgeworICAgIHByb2NfYmluZF9mYWxzZSA9IDAsCisgICAgcHJvY19iaW5kX3RydWUsCisgICAgcHJvY19iaW5kX21hc3RlciwKKyAgICBwcm9jX2JpbmRfY2xvc2UsCisgICAgcHJvY19iaW5kX3NwcmVhZCwKKyAgICBwcm9jX2JpbmRfaW50ZWwsICAgIC8vIHVzZSBLTVBfQUZGSU5JVFkgaW50ZXJmYWNlCisgICAgcHJvY19iaW5kX2RlZmF1bHQKK30ga21wX3Byb2NfYmluZF90OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbmVzdGVkX3Byb2NfYmluZF90IHsKKyAgICBrbXBfcHJvY19iaW5kX3QgKmJpbmRfdHlwZXM7CisgICAgaW50IHNpemU7CisgICAgaW50IHVzZWQ7Cit9IGttcF9uZXN0ZWRfcHJvY19iaW5kX3Q7CisKK2V4dGVybiBrbXBfbmVzdGVkX3Byb2NfYmluZF90IF9fa21wX25lc3RlZF9wcm9jX2JpbmQ7CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyMgIGRlZmluZSBLTVBfUExBQ0VfQUxMICAgICAgICgtMSkKKyMgIGRlZmluZSBLTVBfUExBQ0VfVU5ERUZJTkVEICgtMikKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisKKworI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIGVudW0ga21wX2NhbmNlbF9raW5kX3QgeworICAgIGNhbmNlbF9ub3JlcSA9IDAsCisgICAgY2FuY2VsX3BhcmFsbGVsID0gMSwKKyAgICBjYW5jZWxfbG9vcCA9IDIsCisgICAgY2FuY2VsX3NlY3Rpb25zID0gMywKKyAgICBjYW5jZWxfdGFza2dyb3VwID0gNAorfSBrbXBfY2FuY2VsX2tpbmRfdDsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCitleHRlcm4gaW50IF9fa21wX3BsYWNlX251bV9zb2NrZXRzOworZXh0ZXJuIGludCBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0OworZXh0ZXJuIGludCBfX2ttcF9wbGFjZV9udW1fY29yZXM7CitleHRlcm4gaW50IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0OworZXh0ZXJuIGludCBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfUEFEKHR5cGUsIHN6KSAgICAgKHNpemVvZih0eXBlKSArIChzeiAtICgoc2l6ZW9mKHR5cGUpIC0gMSkgJSAoc3opKSAtIDEpKQorCisvLworLy8gV2UgbmVlZCB0byBhdm9pZCB1c2luZyAtMSBhcyBhIEdUSUQgYXMgKzEgaXMgYWRkZWQgdG8gdGhlIGd0aWQKKy8vIHdoZW4gc3RvcmluZyBpdCBpbiBhIGxvY2ssIGFuZCB0aGUgdmFsdWUgMCBpcyByZXNlcnZlZC4KKy8vCisjZGVmaW5lIEtNUF9HVElEX0RORSAgICAgICAgICAgICgtMikgICAgLyogRG9lcyBub3QgZXhpc3QgKi8KKyNkZWZpbmUgS01QX0dUSURfU0hVVERPV04gICAgICAgKC0zKSAgICAvKiBMaWJyYXJ5IGlzIHNodXR0aW5nIGRvd24gKi8KKyNkZWZpbmUgS01QX0dUSURfTU9OSVRPUiAgICAgICAgKC00KSAgICAvKiBNb25pdG9yIHRocmVhZCBJRCAqLworI2RlZmluZSBLTVBfR1RJRF9VTktOT1dOICAgICAgICAoLTUpICAgIC8qIElzIG5vdCBrbm93biAqLworI2RlZmluZSBLTVBfR1RJRF9NSU4gICAgICAgICAgICAoLTYpICAgIC8qIE1pbmltYWwgZ3RpZCBmb3IgbG93IGJvdW5kIGNoZWNrIGluIERFQlVHICovCisKKyNkZWZpbmUgX19rbXBfZ2V0X2d0aWQoKSAgICAgICAgICAgICAgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCkKKyNkZWZpbmUgX19rbXBfZW50cnlfZ3RpZCgpICAgICAgICAgICAgIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZygpCisKKyNkZWZpbmUgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSAgICAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgKGd0aWQpIF0tPnRoLnRoX2luZm8uZHMuZHNfdGlkICkKKworI2RlZmluZSBfX2ttcF9nZXRfdGlkKCkgICAgICAgICAgICAgICAoIF9fa21wX3RpZF9mcm9tX2d0aWQoIF9fa21wX2dldF9ndGlkKCkgKSApCisjZGVmaW5lIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLHRlYW0pICggS01QX0RFQlVHX0FTU0VSVCggKHRpZCkgPj0gMCAmJiAodGVhbSkgIT0gTlVMTCApLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSAtPiB0LnRfdGhyZWFkc1sgKHRpZCkgXSAtPiB0aC50aF9pbmZvIC5kcy5kc19ndGlkICkKKworI2RlZmluZSBfX2ttcF9nZXRfdGVhbSgpICAgICAgICAgICAgICAoIF9fa21wX3RocmVhZHNbIChfX2ttcF9nZXRfZ3RpZCgpKSBdLT4gdGgudGhfdGVhbSApCisjZGVmaW5lIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpICAgICggS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpID49IDAgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbIChndGlkKSBdLT4gdGgudGhfdGVhbSApCisKKyNkZWZpbmUgX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKSAgKCBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gMCApLCBfX2ttcF90aHJlYWRzWyAoZ3RpZCkgXSApCisjZGVmaW5lIF9fa21wX2dldF90aHJlYWQoKSAgICAgICAgICAgICggX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggX19rbXBfZ2V0X2d0aWQoKSApICkKKworICAgIC8vIFJldHVybnMgY3VycmVudCB0aHJlYWQgKHBvaW50ZXIgdG8ga21wX2luZm9fdCkuIEluIGNvbnRyYXN0IHRvIF9fa21wX2dldF90aHJlYWQoKSwgaXQgd29ya3MKKyAgICAvLyB3aXRoIHJlZ2lzdGVyZWQgYW5kIG5vdC15ZXQtcmVnaXN0ZXJlZCB0aHJlYWRzLgorI2RlZmluZSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocikgICAoIEtNUF9ERUJVR19BU1NFUlQoICh0aHIpICE9IE5VTEwgKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICh0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKQorCisvLyBBVDogV2hpY2ggd2F5IGlzIGNvcnJlY3Q/CisvLyBBVDogMS4gbnByb2MgPSBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworLy8gQVQ6IDIuIG5wcm9jID0gX19rbXBfdGhyZWFkc1sgKCBndGlkICkgXSAtPiB0aC50aF90ZWFtX25wcm9jOworI2RlZmluZSBfX2ttcF9nZXRfdGVhbV9udW1fdGhyZWFkcyhndGlkKSAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfbnByb2MgKQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX1VJTlQ2NF9NQVggICAgICAgICAofigoa21wX3VpbnQ2NCkxPDwoKHNpemVvZihrbXBfdWludDY0KSooMTw8MykpLTEpKSkKKworI2RlZmluZSBLTVBfTUlOX05USCAgICAgICAgICAgMQorCisjaWZuZGVmIEtNUF9NQVhfTlRICisjICBpZiBkZWZpbmVkKFBUSFJFQURfVEhSRUFEU19NQVgpICYmIFBUSFJFQURfVEhSRUFEU19NQVggPCBJTlRfTUFYCisjICAgIGRlZmluZSBLTVBfTUFYX05USCAgICAgICAgICBQVEhSRUFEX1RIUkVBRFNfTUFYCisjICBlbHNlCisjICAgIGRlZmluZSBLTVBfTUFYX05USCAgICAgICAgICBJTlRfTUFYCisjICBlbmRpZgorI2VuZGlmIC8qIEtNUF9NQVhfTlRIICovCisKKyNpZmRlZiBQVEhSRUFEX1NUQUNLX01JTgorIyBkZWZpbmUgS01QX01JTl9TVEtTSVpFICAgICAgICAgUFRIUkVBRF9TVEFDS19NSU4KKyNlbHNlCisjIGRlZmluZSBLTVBfTUlOX1NUS1NJWkUgICAgICAgICAoKHNpemVfdCkoMzIgKiAxMDI0KSkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NQVhfU1RLU0laRSAgICAgICAgICAofigoc2l6ZV90KTE8PCgoc2l6ZW9mKHNpemVfdCkqKDE8PDMpKS0xKSkpCisKKyNpZiBLTVBfQVJDSF9YODYKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2VsaWYgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtTSVpFICAgICAoKHNpemVfdCkoNCAqIDEwMjQgKiAxMDI0KSkKKyMgZGVmaW5lIEtNUF9CQUNLVVBfU1RLU0laRSAgICAgICgoc2l6ZV90KSgyICogMTAyNCAqIDEwMjQpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ERUZBVUxUX1NUS1NJWkUgICAgICgoc2l6ZV90KSgxMDI0ICogMTAyNCkpCisjZW5kaWYKKworI2RlZmluZSBLTVBfREVGQVVMVF9NT05JVE9SX1NUS1NJWkUgICAgICgoc2l6ZV90KSg2NCAqIDEwMjQpKQorCisjZGVmaW5lIEtNUF9ERUZBVUxUX01BTExPQ19QT09MX0lOQ1IgICAgKChzaXplX3QpICgxMDI0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NSU5fTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKChzaXplX3QpICg0ICogMTAyNCkpCisjZGVmaW5lIEtNUF9NQVhfTUFMTE9DX1BPT0xfSU5DUiAgICAgICAgKH4oKHNpemVfdCkxPDwoKHNpemVvZihzaXplX3QpKigxPDwzKSktMSkpKQorCisjZGVmaW5lIEtNUF9NSU5fU1RLT0ZGU0VUICAgICAgICgwKQorI2RlZmluZSBLTVBfTUFYX1NUS09GRlNFVCAgICAgICBLTVBfTUFYX1NUS1NJWkUKKyNpZiBLTVBfT1NfREFSV0lOCisjIGRlZmluZSBLTVBfREVGQVVMVF9TVEtPRkZTRVQgIEtNUF9NSU5fU1RLT0ZGU0VUCisjZWxzZQorIyBkZWZpbmUgS01QX0RFRkFVTFRfU1RLT0ZGU0VUICBDQUNIRV9MSU5FCisjZW5kaWYKKworI2RlZmluZSBLTVBfTUlOX1NUS1BBRERJTkcgICAgICAoMCkKKyNkZWZpbmUgS01QX01BWF9TVEtQQURESU5HICAgICAgKDIgKiAxMDI0ICogMTAyNCkKKworI2RlZmluZSBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyAgICAgICgxKSAgICAgICAvKiBtaW4gbnVtYmVyIG9mIHRpbWVzIG1vbml0b3Igd2FrZXMgdXAgcGVyIHNlY29uZCAqLworI2RlZmluZSBLTVBfTUFYX01PTklUT1JfV0FLRVVQUyAgICAgICgxMDAwKSAgICAvKiBtYXhpbXVtIG51bWJlciBvZiB0aW1lcyBtb25pdG9yIGNhbiB3YWtlIHVwIHBlciBzZWNvbmQgKi8KKyNkZWZpbmUgS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSICAgICAoMTAwMCkgICAgLyogbnVtYmVyIG9mIGJsb2NrdGltZSB1bml0cyBwZXIgc2Vjb25kICovCisjZGVmaW5lIEtNUF9NSU5fQkxPQ0tUSU1FICAgICAgICAgICAgKDApCisjZGVmaW5lIEtNUF9NQVhfQkxPQ0tUSU1FICAgICAgICAgICAgKElOVF9NQVgpIC8qIE11c3QgYmUgdGhpcyBmb3IgImluZmluaXRlIiBzZXR0aW5nIHRoZSB3b3JrICovCisjZGVmaW5lIEtNUF9ERUZBVUxUX0JMT0NLVElNRSAgICAgICAgKDIwMCkgICAgIC8qICBfX2ttcF9ibG9ja3RpbWUgaXMgaW4gbWlsbGlzZWNvbmRzICAqLworLyogQ2FsY3VsYXRlIG5ldyBudW1iZXIgb2YgbW9uaXRvciB3YWtldXBzIGZvciBhIHNwZWNpZmljIGJsb2NrIHRpbWUgYmFzZWQgb24gcHJldmlvdXMgbW9uaXRvcl93YWtldXBzICovCisvKiBPbmx5IGFsbG93IGluY3JlYXNpbmcgbnVtYmVyIG9mIHdha2V1cHMgKi8KKyNkZWZpbmUgS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoYmxvY2t0aW1lLCBtb25pdG9yX3dha2V1cHMpIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKChibG9ja3RpbWUpID09IEtNUF9NQVhfQkxPQ0tUSU1FKSA/IChtb25pdG9yX3dha2V1cHMpIDogXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKGJsb2NrdGltZSkgPT0gS01QX01JTl9CTE9DS1RJTUUpID8gS01QX01BWF9NT05JVE9SX1dBS0VVUFMgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICgobW9uaXRvcl93YWtldXBzKSA+IChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAoYmxvY2t0aW1lKSkpID8gKG1vbml0b3Jfd2FrZXVwcykgOiBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSKSAvIChibG9ja3RpbWUpICkKKworLyogQ2FsY3VsYXRlIG51bWJlciBvZiBpbnRlcnZhbHMgZm9yIGEgc3BlY2lmaWMgYmxvY2sgdGltZSBiYXNlZCBvbiBtb25pdG9yX3dha2V1cHMgKi8KKyNkZWZpbmUgS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIG1vbml0b3Jfd2FrZXVwcykgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggKCAoYmxvY2t0aW1lKSArIChLTVBfQkxPQ0tUSU1FX01VTFRJUExJRVIgLyAobW9uaXRvcl93YWtldXBzKSkgLSAxICkgLyAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoS01QX0JMT0NLVElNRV9NVUxUSVBMSUVSIC8gKG1vbml0b3Jfd2FrZXVwcykpICkKKworI2RlZmluZSBLTVBfTUlOX1NUQVRTQ09MUyAgICAgICA0MAorI2RlZmluZSBLTVBfTUFYX1NUQVRTQ09MUyAgICAgICA0MDk2CisjZGVmaW5lIEtNUF9ERUZBVUxUX1NUQVRTQ09MUyAgIDgwCisKKyNkZWZpbmUgS01QX01JTl9JTlRFUlZBTCAgICAgICAgMAorI2RlZmluZSBLTVBfTUFYX0lOVEVSVkFMICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTlRFUlZBTCAgICAwCisKKyNkZWZpbmUgS01QX01JTl9DSFVOSyAgICAgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0NIVU5LICAgICAgICAgICAoSU5UX01BWC0xKQorI2RlZmluZSBLTVBfREVGQVVMVF9DSFVOSyAgICAgICAxCisKKyNkZWZpbmUgS01QX01JTl9JTklUX1dBSVQgICAgICAgMQorI2RlZmluZSBLTVBfTUFYX0lOSVRfV0FJVCAgICAgICAoSU5UX01BWC8yKQorI2RlZmluZSBLTVBfREVGQVVMVF9JTklUX1dBSVQgICAyMDQ4VQorCisjZGVmaW5lIEtNUF9NSU5fTkVYVF9XQUlUICAgICAgIDEKKyNkZWZpbmUgS01QX01BWF9ORVhUX1dBSVQgICAgICAgKElOVF9NQVgvMikKKyNkZWZpbmUgS01QX0RFRkFVTFRfTkVYVF9XQUlUICAgMTAyNFUKKworI2RlZmluZSBLTVBfREZMVF9ESVNQX05VTV9CVUZGICA3CisjZGVmaW5lIEtNUF9NQVhfT1JERVJFRCAgICAgICAgIDgKKworI2RlZmluZSBLTVBfTUFYX0ZJRUxEUyAgICAgICAgICAzMgorCisjZGVmaW5lIEtNUF9NQVhfQlJBTkNIX0JJVFMgICAgIDMxCisKKyNkZWZpbmUgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUIElOVF9NQVgKKworI2RlZmluZSBLTVBfTUFYX1RBU0tfUFJJT1JJVFlfTElNSVQgSU5UX01BWAorCisvKiBNaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIGJlZm9yZSBzd2l0Y2ggdG8gVExTIGd0aWQgKGV4cGVyaW1lbnRhbGx5IGRldGVybWluZWQpICovCisvKiBqb3NoIFRPRE86IHdoYXQgYWJvdXQgT1MgWCogdHVuaW5nPyAqLworI2lmICAgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorIyBkZWZpbmUgS01QX1RMU19HVElEX01JTiAgICAgNQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9UTFNfR1RJRF9NSU4gICAgIElOVF9NQVgKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9NQVNURVJfVElEKHRpZCkgICAgICAoICh0aWQpID09IDAgKQorI2RlZmluZSBLTVBfV09SS0VSX1RJRCh0aWQpICAgICAgKCAodGlkKSAhPSAwICkKKworI2RlZmluZSBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgICAgKCBfX2ttcF90aWRfZnJvbV9ndGlkKChndGlkKSkgPT0gMCApCisjZGVmaW5lIEtNUF9XT1JLRVJfR1RJRChndGlkKSAgICAoIF9fa21wX3RpZF9mcm9tX2d0aWQoKGd0aWQpKSAhPSAwICkKKyNkZWZpbmUgS01QX1VCRVJfR1RJRChndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoZ3RpZCkgPj0gS01QX0dUSURfTUlOICksICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGd0aWQpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eSApLCAgICAgICAgICBcCisgICAgICAgIChndGlkKSA+PSAwICYmIF9fa21wX3Jvb3RbKGd0aWQpXSAmJiBfX2ttcF90aHJlYWRzWyhndGlkKV0gJiYgXAorICAgICAgICAoX19rbXBfdGhyZWFkc1soZ3RpZCldID09IF9fa21wX3Jvb3RbKGd0aWQpXS0+ci5yX3ViZXJfdGhyZWFkKVwKKyAgICApCisjZGVmaW5lIEtNUF9JTklUSUFMX0dUSUQoZ3RpZCkgICAoIChndGlkKSA9PSAwICkKKworI2lmbmRlZiBUUlVFCisjZGVmaW5lIEZBTFNFICAgMAorI2RlZmluZSBUUlVFICAgICghIEZBTFNFKQorI2VuZGlmCisKKy8qIE5PVEU6IGFsbCBvZiB0aGUgZm9sbG93aW5nIGNvbnN0YW50cyBtdXN0IGJlIGV2ZW4gKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgICA2NFUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgICAzMlUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfQ05LCisjICBkZWZpbmUgS01QX0lOSVRfV0FJVCAgICAxNlUgICAgICAgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCisjICBkZWZpbmUgS01QX05FWFRfV0FJVCAgICAgOFUgICAgICAgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisjZWxpZiBLTVBfT1NfTElOVVgKKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19EQVJXSU4KKy8qIFRPRE86IHR1bmUgZm9yIEtNUF9PU19EQVJXSU4gKi8KKyMgIGRlZmluZSBLTVBfSU5JVF9XQUlUICAxMDI0VSAgICAgICAgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KKyMgIGRlZmluZSBLTVBfTkVYVF9XQUlUICAgNTEyVSAgICAgICAgICAvKiBzdXNlcXVlbnQgbnVtYmVyIG9mIHNwaW4tdGVzdHMgKi8KKyNlbGlmIEtNUF9PU19GUkVFQlNECisvKiBUT0RPOiB0dW5lIGZvciBLTVBfT1NfRlJFRUJTRCAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VsaWYgS01QX09TX05FVEJTRAorLyogVE9ETzogdHVuZSBmb3IgS01QX09TX05FVEJTRCAqLworIyAgZGVmaW5lIEtNUF9JTklUX1dBSVQgIDEwMjRVICAgICAgICAgIC8qIGluaXRpYWwgbnVtYmVyIG9mIHNwaW4tdGVzdHMgICAqLworIyAgZGVmaW5lIEtNUF9ORVhUX1dBSVQgICA1MTJVICAgICAgICAgIC8qIHN1c2VxdWVudCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAqLworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0Cit0eXBlZGVmIHN0cnVjdCBrbXBfY3B1aWQgeworICAgIGttcF91aW50MzIgIGVheDsKKyAgICBrbXBfdWludDMyICBlYng7CisgICAga21wX3VpbnQzMiAgZWN4OworICAgIGttcF91aW50MzIgIGVkeDsKK30ga21wX2NwdWlkX3Q7CitleHRlcm4gdm9pZCBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKyMgaWYgS01QX0FSQ0hfWDg2CisgIGV4dGVybiB2b2lkIF9fa21wX3g4Nl9wYXVzZSggdm9pZCApOworIyBlbGlmIEtNUF9NSUMKKyAgc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkgeyBfbW1fZGVsYXlfMzIoIDEwMCApOyB9CisjIGVsc2UKKyAgc3RhdGljIHZvaWQgX19rbXBfeDg2X3BhdXNlKCB2b2lkICkgeyBfbW1fcGF1c2UoKTsgfQorIyBlbmRpZgorIyBkZWZpbmUgS01QX0NQVV9QQVVTRSgpIF9fa21wX3g4Nl9wYXVzZSgpCisjZWxpZiBLTVBfQVJDSF9QUEM2NAorIyBkZWZpbmUgS01QX1BQQzY0X1BSSV9MT1coKSBfX2FzbV9fIHZvbGF0aWxlICgib3IgMSwgMSwgMSIpCisjIGRlZmluZSBLTVBfUFBDNjRfUFJJX01FRCgpIF9fYXNtX18gdm9sYXRpbGUgKCJvciAyLCAyLCAyIikKKyMgZGVmaW5lIEtNUF9QUEM2NF9QUklfTE9DX01CKCkgX19hc21fXyB2b2xhdGlsZSAoIiIgOiA6IDogIm1lbW9yeSIpCisjIGRlZmluZSBLTVBfQ1BVX1BBVVNFKCkgZG8geyBLTVBfUFBDNjRfUFJJX0xPVygpOyBLTVBfUFBDNjRfUFJJX01FRCgpOyBLTVBfUFBDNjRfUFJJX0xPQ19NQigpOyB9IHdoaWxlICgwKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9DUFVfUEFVU0UoKSAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKyNkZWZpbmUgS01QX0lOSVRfWUlFTEQoY291bnQpICAgICAgICAgICB7IChjb3VudCkgPSBfX2ttcF95aWVsZF9pbml0OyB9CisKKyNkZWZpbmUgS01QX1lJRUxEKGNvbmQpICAgICAgICAgICAgICAgICB7IEtNUF9DUFVfUEFVU0UoKTsgX19rbXBfeWllbGQoIChjb25kKSApOyB9CisKKy8vIE5vdGUgdGhlIGRlY3JlbWVudCBvZiAyIGluIHRoZSBmb2xsb3dpbmcgTWFjcm9zLiAgV2l0aCBLTVBfTElCUkFSWT10dXJuYXJvdW5kLAorLy8gdGhlcmUgc2hvdWxkIGJlIG5vIHlpZWxkaW5nIHNpbmNlIHRoZSBzdGFydGluZyB2YWx1ZSBmcm9tIEtNUF9JTklUX1lJRUxEKCkgaXMgb2RkLgorCisjZGVmaW5lIEtNUF9ZSUVMRF9XSEVOKGNvbmQsY291bnQpICAgICAgeyBLTVBfQ1BVX1BBVVNFKCk7IChjb3VudCkgLT0gMjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRChjb25kKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorI2RlZmluZSBLTVBfWUlFTERfU1BJTihjb3VudCkgICAgICAgICAgIHsgS01QX0NQVV9QQVVTRSgpOyAoY291bnQpIC09MjsgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCEoY291bnQpKSB7IEtNUF9ZSUVMRCgxKTsgKGNvdW50KSA9IF9fa21wX3lpZWxkX25leHQ7IH0gfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFN1cHBvcnQgZGF0YXR5cGVzIGZvciB0aGUgb3JwaGFuZWQgY29uc3RydWN0IG5lc3RpbmcgY2hlY2tzLiAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2VudW0gY29uc190eXBlIHsKKyAgICBjdF9ub25lLAorICAgIGN0X3BhcmFsbGVsLAorICAgIGN0X3BkbywKKyAgICBjdF9wZG9fb3JkZXJlZCwKKyAgICBjdF9wc2VjdGlvbnMsCisgICAgY3RfcHNpbmdsZSwKKworICAgIC8qIHRoZSBmb2xsb3dpbmcgbXVzdCBiZSBsZWZ0IGluIG9yZGVyIGFuZCBub3Qgc3BsaXQgdXAgKi8KKyAgICBjdF90YXNrcSwKKyAgICBjdF90YXNrLCAgICAgICAgICAgICAgICAgICAgLyogcmVhbGx5IHRhc2sgaW5zaWRlIG5vbi1vcmRlcmVkIHRhc2txLCBjb25zaWRlcmVkIGEgd29ya3NoYXJpbmcgdHlwZSAqLworICAgIGN0X3Rhc2tfb3JkZXJlZCwgICAgICAgICAgICAvKiByZWFsbHkgdGFzayBpbnNpZGUgb3JkZXJlZCB0YXNrcSwgY29uc2lkZXJlZCBhIHdvcmtzaGFyaW5nIHR5cGUgKi8KKyAgICAvKiB0aGUgcHJlY2VkaW5nIG11c3QgYmUgbGVmdCBpbiBvcmRlciBhbmQgbm90IHNwbGl0IHVwICovCisKKyAgICBjdF9jcml0aWNhbCwKKyAgICBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLAorICAgIGN0X29yZGVyZWRfaW5fcGRvLAorICAgIGN0X29yZGVyZWRfaW5fdGFza3EsCisgICAgY3RfbWFzdGVyLAorICAgIGN0X3JlZHVjZSwKKyAgICBjdF9iYXJyaWVyCit9OworCisvKiB0ZXN0IHRvIHNlZSBpZiB3ZSBhcmUgaW4gYSB0YXNrcSBjb25zdHJ1Y3QgKi8KKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9UQVNLUSggY3QgKSAgICAgICAoICgoaW50KShjdCkpID49ICgoaW50KWN0X3Rhc2txKSAmJiAoKGludCkoY3QpKSA8PSAoKGludCljdF90YXNrX29yZGVyZWQpICkKKyMgZGVmaW5lIElTX0NPTlNfVFlQRV9PUkRFUkVEKCBjdCApICAgICAoKGN0KSA9PSBjdF9wZG9fb3JkZXJlZCB8fCAoY3QpID09IGN0X3Rhc2tfb3JkZXJlZCkKKworc3RydWN0IGNvbnNfZGF0YSB7CisgICAgaWRlbnRfdCBjb25zdCAgICAgKmlkZW50OworICAgIGVudW0gY29uc190eXBlICAgICB0eXBlOworICAgIGludCAgICAgICAgICAgICAgICBwcmV2OworICAgIGttcF91c2VyX2xvY2tfcCAgICBuYW1lOyAgICAvKiBhZGRyZXNzIGV4Y2x1c2l2ZWx5IGZvciBjcml0aWNhbCBzZWN0aW9uIG5hbWUgY29tcGFyaXNvbiAqLworfTsKKworc3RydWN0IGNvbnNfaGVhZGVyIHsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHBfdG9wLCB3X3RvcCwgc190b3A7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGFja19zaXplLCBzdGFja190b3A7CisgICAgc3RydWN0IGNvbnNfZGF0YSAgICpzdGFja19kYXRhOworfTsKKworc3RydWN0IGttcF9yZWdpb25faW5mbyB7CisgICAgY2hhciAgICAgICAgICAgICAgICAqdGV4dDsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG9mZnNldFtLTVBfTUFYX0ZJRUxEU107CisgICAgaW50ICAgICAgICAgICAgICAgICBsZW5ndGhbS01QX01BWF9GSUVMRFNdOworfTsKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIHR5cGVkZWYgSEFORExFICAgICAgICAgICAgICBrbXBfdGhyZWFkX3Q7CisgICAgdHlwZWRlZiBEV09SRCAgICAgICAgICAgICAgIGttcF9rZXlfdDsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgS01QX09TX1VOSVgKKyAgICB0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgICAga21wX3RocmVhZF90OworICAgIHR5cGVkZWYgcHRocmVhZF9rZXlfdCAgICAgICBrbXBfa2V5X3Q7CisjZW5kaWYKKworZXh0ZXJuIGttcF9rZXlfdCAgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3N5c19pbmZvIHsKKyAgICBsb25nIG1heHJzczsgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgbG9uZyBtaW5mbHQ7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGxvbmcgbWFqZmx0OyAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBsb25nIG5zd2FwOyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgbG9uZyBpbmJsb2NrOyAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGxvbmcgb3VibG9jazsgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBsb25nIG52Y3N3OyAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgbG9uZyBuaXZjc3c7ICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworfSBrbXBfc3lzX2luZm9fdDsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK3R5cGVkZWYgc3RydWN0IGttcF9jcHVpbmZvIHsKKyAgICBpbnQgICAgICAgIGluaXRpYWxpemVkOyAgLy8gSWYgMCwgb3RoZXIgZmllbGRzIGFyZSBub3QgaW5pdGlhbGl6ZWQuCisgICAgaW50ICAgICAgICBzaWduYXR1cmU7ICAgIC8vIENQVUlEKDEpLkVBWAorICAgIGludCAgICAgICAgZmFtaWx5OyAgICAgICAvLyBDUFVJRCgxKS5FQVhbMjc6MjBdICsgQ1BVSUQoMSkuRUFYWzExOjhdICggRXh0ZW5kZWQgRmFtaWx5ICsgRmFtaWx5ICkKKyAgICBpbnQgICAgICAgIG1vZGVsOyAgICAgICAgLy8gKCBDUFVJRCgxKS5FQVhbMTk6MTZdIDw8IDQgKSArIENQVUlEKDEpLkVBWFs3OjRdICggKCBFeHRlbmRlZCBNb2RlbCA8PCA0ICkgKyBNb2RlbCkKKyAgICBpbnQgICAgICAgIHN0ZXBwaW5nOyAgICAgLy8gQ1BVSUQoMSkuRUFYWzM6MF0gKCBTdGVwcGluZyApCisgICAgaW50ICAgICAgICBzc2UyOyAgICAgICAgIC8vIDAgaWYgU1NFMiBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQsIDEgb3RoZXJ3aXNlLgorICAgIGludCAgICAgICAgcnRtOyAgICAgICAgICAvLyAwIGlmIFJUTSBpbnN0cnVjdGlvbnMgYXJlIG5vdCBzdXBwb3J0ZWQsIDEgb3RoZXJ3aXNlLgorICAgIGludCAgICAgICAgY3B1X3N0YWNrb2Zmc2V0OworICAgIGludCAgICAgICAgYXBpY19pZDsKKyAgICBpbnQgICAgICAgIHBoeXNpY2FsX2lkOworICAgIGludCAgICAgICAgbG9naWNhbF9pZDsKKyAgICBrbXBfdWludDY0IGZyZXF1ZW5jeTsgICAgLy8gTm9taW5hbCBDUFUgZnJlcXVlbmN5IGluIEh6LgorICAgIGNoYXIgICAgICAgbmFtZSBbMypzaXplb2YgKGttcF9jcHVpZF90KV07IC8vIENQVUlEKDB4ODAwMDAwMDIsMHg4MDAwMDAwMywweDgwMDAwMDA0KQorfSBrbXBfY3B1aW5mb190OworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9UVgorCitzdHJ1Y3QgdHZfdGhyZWFkcHJpdmF0ZSB7CisgICAgLyogUmVjb3JkIHR5cGUgIzEgKi8KKyAgICB2b2lkICAgICAgICAqZ2xvYmFsX2FkZHI7CisgICAgdm9pZCAgICAgICAgKnRocmVhZF9hZGRyOworfTsKKworc3RydWN0IHR2X2RhdGEgeworICAgIHN0cnVjdCB0dl9kYXRhICAgICAgKm5leHQ7CisgICAgdm9pZCAgICAgICAgICAgICAgICAqdHlwZTsKKyAgICB1bmlvbiB0dl91bmlvbiB7CisgICAgICAgIHN0cnVjdCB0dl90aHJlYWRwcml2YXRlIHRwOworICAgIH0gdTsKK307CisKK2V4dGVybiBrbXBfa2V5X3QgX19rbXBfdHZfa2V5OworCisjZW5kaWYgLyogQlVJTERfVFYgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyBXZSBjYW5ub3QgaW5jbHVkZSAia21wX2l0dC5oIiBkdWUgdG8gY2lyY3VsYXIgZGVwZW5kZW5jeS4gRGVjbGFyZSB0aGUgb25seSByZXF1aXJlZCB0eXBlIGhlcmUuCisvLyBMYXRlciB3ZSB3aWxsIGNoZWNrIHRoZSB0eXBlIG1lZXRzIHJlcXVpcmVtZW50cy4KK3R5cGVkZWYgaW50IGttcF9pdHRfbWFya190OworI2RlZmluZSBLTVBfSVRUX0RFQlVHIDAKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3EgZGF0YSBzdHJ1Y3R1cmVzCisgKi8KKworI2RlZmluZSBISUdIX1dBVEVSX01BUksobnNsb3RzKSAgICAgICAgICgoKG5zbG90cykgKiAzKSAvIDQpCisjZGVmaW5lIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEggICAgICAgIDEgICAgICAvKiBudW0gdGh1bmtzIHRoYXQgZWFjaCB0aHJlYWQgY2FuIHNpbXVsdGFuZW91c2x5IGV4ZWN1dGUgZnJvbSBhIHRhc2sgcXVldWUgKi8KKworLyogIGZsYWdzIGZvciB0YXNrcV9nbG9iYWxfZmxhZ3MsIGttcF90YXNrX3F1ZXVlX3QgdHFfZmxhZ3MsIGttcGNfdGh1bmtfdCB0aF9mbGFncyAgKi8KKworI2RlZmluZSBUUUZfSVNfT1JERVJFRCAgICAgICAgICAweDAwMDEgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB0YXNrcSBvcmRlcmVkICAqLworI2RlZmluZSBUUUZfSVNfTEFTVFBSSVZBVEUgICAgICAweDAwMDIgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCB0YXNrcSB3aXRoIGxhc3Rwcml2YXRlIGxpc3QgICovCisjZGVmaW5lIFRRRl9JU19OT1dBSVQgICAgICAgICAgIDB4MDAwNCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIGVuZCB0YXNrcSBub3dhaXQgICovCisjZGVmaW5lIFRRRl9IRVVSSVNUSUNTICAgICAgICAgIDB4MDAwOCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHVzZSBoZXVyaXN0aWNzIHRvIGRlY2lkZSB0YXNrIHF1ZXVlIHNpemUgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQxIDB4MDAxMCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworI2RlZmluZSBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMiAweDAwMjAgIC8qICBfX2ttcGNfdGFza3EgaW50ZXJmYWNlLCByZXNlcnZlZCBmb3IgZnV0dXJlIHVzZSAgKi8KKyNkZWZpbmUgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDMgMHgwMDQwICAvKiAgX19rbXBjX3Rhc2txIGludGVyZmFjZSwgcmVzZXJ2ZWQgZm9yIGZ1dHVyZSB1c2UgICovCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQ0IDB4MDA4MCAgLyogIF9fa21wY190YXNrcSBpbnRlcmZhY2UsIHJlc2VydmVkIGZvciBmdXR1cmUgdXNlICAqLworCisjZGVmaW5lIFRRRl9JTlRFUkZBQ0VfRkxBR1MgICAgIDB4MDBmZiAgLyogIGFsbCB0aGUgX19rbXBjX3Rhc2txIGludGVyZmFjZSBmbGFncyAgKi8KKworI2RlZmluZSBUUUZfSVNfTEFTVF9UQVNLICAgICAgICAweDAxMDAgIC8qICBpbnRlcm5hbC9yZWFkIGJ5IGluc3RydW1lbnRhdGlvbjsgb25seSB1c2VkIHdpdGggVFFGX0lTX0xBU1RQUklWQVRFICAqLworI2RlZmluZSBUUUZfVEFTS1FfVEFTSyAgICAgICAgICAweDAyMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgdGhpcyB0aHVuay0+dGhfdGFzayBpcyB0aGUgdGFza3FfdGFzayAgKi8KKyNkZWZpbmUgVFFGX1JFTEVBU0VfV09SS0VSUyAgICAgMHgwNDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IG11c3QgcmVsZWFzZSB3b3JrZXIgdGhyZWFkcyBvbmNlIEFOWSBxdWV1ZWQgdGFzayBleGlzdHMgKGdsb2JhbCkgKi8KKyNkZWZpbmUgVFFGX0FMTF9UQVNLU19RVUVVRUQgICAgMHgwODAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk7IG5vdGlmeSB3b3JrZXJzIHRoYXQgbWFzdGVyIGhhcyBmaW5pc2hlZCBlbnF1ZXVpbmcgdGFza3MgKi8KKyNkZWZpbmUgVFFGX1BBUkFMTEVMX0NPTlRFWFQgICAgMHgxMDAwICAvKiAgaW50ZXJuYWwgdXNlIG9ubHk6IHRoaXMgcXVldWUgZW5jb3VudGVyZWQgaW4gYSBwYXJhbGxlbCBjb250ZXh0OiBub3Qgc2VyaWFsaXplZCAqLworI2RlZmluZSBUUUZfREVBTExPQ0FURUQgICAgICAgICAweDIwMDAgIC8qICBpbnRlcm5hbCB1c2Ugb25seTsgdGhpcyBxdWV1ZSBpcyBvbiB0aGUgZnJlZWxpc3QgYW5kIG5vdCBpbiB1c2UgKi8KKworI2RlZmluZSBUUUZfSU5URVJOQUxfRkxBR1MgICAgICAweDNmMDAgIC8qICBhbGwgdGhlIGludGVybmFsIHVzZSBvbmx5IGZsYWdzICAqLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wY19hbGlnbmVkX2ludDMyX3QgeworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICAgICAgICBhaV9kYXRhOworfSBrbXBjX2FsaWduZWRfaW50MzJfdDsKKwordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgeworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAqcXNfdGh1bms7Cit9IGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcGNfdGFza19xdWV1ZV90IHsKKyAgICAgICAgLyogdGFzayBxdWV1ZSBsaW5rYWdlIGZpZWxkcyBmb3Igbi1hcnkgdHJlZSBvZiBxdWV1ZXMgKGxvY2tlZCB3aXRoIGdsb2JhbCB0YXNrcV90cmVlX2xjaykgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9saW5rX2xjazsgICAgICAgICAgLyogIGxvY2sgZm9yIGNoaWxkIGxpbmssIGNoaWxkIG5leHQvcHJldiBsaW5rcyBhbmQgY2hpbGQgcmVmIGNvdW50cyAqLworICAgIHVuaW9uIHsKKyAgICAgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICp0cV9wYXJlbnQ7ICAgICAgICAgICAgLyogIHBvaW50ZXIgdG8gcGFyZW50IHRhc2txLCBub3QgbG9ja2VkICovCisgICAgICAgIHN0cnVjdCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFfbmV4dF9mcmVlOyAgICAgICAgIC8qICBmb3IgdGFza3EgaW50ZXJuYWwgZnJlZWxpc3RzLCBsb2NrZWQgd2l0aCBnbG9iYWwgdGFza3FfZnJlZWxpc3RfbGNrICovCisgICAgfSB0cTsKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgKnRxX2ZpcnN0X2NoaWxkOyAgLyogIHBvaW50ZXIgdG8gbGlua2VkLWxpc3Qgb2YgY2hpbGRyZW4sIGxvY2tlZCBieSB0cSdzIHRxX2xpbmtfbGNrICovCisgICAgc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICAgICAqdHFfbmV4dF9jaGlsZDsgICAgICAgIC8qICBuZXh0IGNoaWxkIGluIGxpbmtlZC1saXN0LCBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICBzdHJ1Y3Qga21wY190YXNrX3F1ZXVlX3QgICAgICp0cV9wcmV2X2NoaWxkOyAgICAgICAgLyogIHByZXZpb3VzIGNoaWxkIGluIGxpbmtlZC1saXN0LCBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9yZWZfY291bnQ7ICAgICAgICAgLyogIHJlZmVyZW5jZSBjb3VudCBvZiB0aHJlYWRzIHdpdGggYWNjZXNzIHRvIHRoaXMgdGFzayBxdWV1ZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgKG90aGVyIHRoYW4gdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGttcGNfZW5kX3Rhc2txIGNhbGwpICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qICBsb2NrZWQgYnkgcGFyZW50IHRxJ3MgdHFfbGlua19sY2sgKi8KKworICAgICAgICAvKiBzaGFyZWQgZGF0YSBmb3IgdGFzayBxdWV1ZSAqLworICAgIHN0cnVjdCBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCAgICAqdHFfc2hhcmVkczsgICAvKiAgcGVyLXRocmVhZCBhcnJheSBvZiBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGUgc3RydWN0dXJlcyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAgb25seSBvbmUgYXJyYXkgZWxlbWVudCBleGlzdHMgZm9yIGFsbCBidXQgb3V0ZXJtb3N0IHRhc2txICovCisKKyAgICAgICAgLyogYm9va2tlZXBpbmcgZm9yIG9yZGVyZWQgdGFzayBxdWV1ZSAqLworICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICAgIHRxX3Rhc2tudW1fcXVldWluZzsgICAvKiAgb3JkZXJlZCB0YXNrIG51bWJlciBhc3NpZ25lZCB3aGlsZSBxdWV1aW5nIHRhc2tzICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgICAgICAgdHFfdGFza251bV9zZXJ2aW5nOyAgIC8qICBvcmRlcmVkIG51bWJlciBvZiBuZXh0IHRhc2sgdG8gYmUgc2VydmVkIChleGVjdXRlZCkgKi8KKworICAgICAgICAvKiB0aHVuayBzdG9yYWdlIG1hbmFnZW1lbnQgZm9yIHRhc2sgcXVldWUgKi8KKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgICB0cV9mcmVlX3RodW5rc19sY2s7ICAgLyogIGxvY2sgZm9yIHRodW5rIGZyZWVsaXN0IG1hbmlwdWxhdGlvbiAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgICAgICAgICAgKnRxX2ZyZWVfdGh1bmtzOyAgICAgICAvKiAgdGh1bmsgZnJlZWxpc3QsIGNoYWluZWQgdmlhIHRoLnRoX25leHRfZnJlZSAgKi8KKyAgICBzdHJ1Y3Qga21wY190aHVua190ICAgICAgICAgICp0cV90aHVua19zcGFjZTsgICAgICAgLyogIHNwYWNlIGFsbG9jYXRlZCBmb3IgdGh1bmtzIGZvciB0aGlzIHRhc2sgcXVldWUgICovCisKKyAgICAgICAgLyogZGF0YSBmaWVsZHMgZm9yIHF1ZXVlIGl0c2VsZiAqLworICAgIGttcF9sb2NrX3QgICAgICAgICAgICAgICAgICAgIHRxX3F1ZXVlX2xjazsgICAgICAgICAvKiAgbG9jayBmb3IgW2RlXWVucXVldWUgb3BlcmF0aW9uczogdHFfcXVldWUsIHRxX2hlYWQsIHRxX3RhaWwsIHRxX25mdWxsICovCisgICAga21wY19hbGlnbmVkX3F1ZXVlX3Nsb3RfdCAgICAqdHFfcXVldWU7ICAgICAgICAgICAgIC8qICBhcnJheSBvZiBxdWV1ZSBzbG90cyB0byBob2xkIHRodW5rcyBmb3IgdGFza3MgKi8KKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wY190aHVua190ICp0cV90YXNrcV9zbG90OyAgICAgICAgLyogIHNwZWNpYWwgc2xvdCBmb3IgdGFza3EgdGFzayB0aHVuaywgb2NjdXBpZWQgaWYgbm90IE5VTEwgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfbnNsb3RzOyAgICAgICAgICAgIC8qICAjIG9mIHRxX3RodW5rX3NwYWNlIHRodW5rcyBhbGxvYydkIChub3QgaW5jbC4gdHFfdGFza3Ffc2xvdCBzcGFjZSkgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfaGVhZDsgICAgICAgICAgICAgIC8qICBlbnF1ZXVlIHB1dHMgbmV4dCBpdGVtIGluIGhlcmUgKGluZGV4IGludG8gdHFfcXVldWUgYXJyYXkpICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfdGFpbDsgICAgICAgICAgICAgIC8qICBkZXF1ZXVlIHRha2VzIG5leHQgaXRlbSBvdXQgb2YgaGVyZSAoaW5kZXggaW50byB0cV9xdWV1ZSBhcnJheSkgKi8KKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICAgICAgICAgICB0cV9uZnVsbDsgICAgICAgICAgICAgLyogICMgb2Ygb2NjdXBpZWQgZW50cmllcyBpbiB0YXNrIHF1ZXVlIHJpZ2h0IG5vdyAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICB0cV9oaXdhdDsgICAgICAgICAgICAgLyogIGhpZ2gtd2F0ZXIgbWFyayBmb3IgdHFfbmZ1bGwgYW5kIHF1ZXVlIHNjaGVkdWxpbmcgICovCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgICAgdHFfZmxhZ3M7ICAgICAgICAgICAgIC8qICBUUUZfeHh4ICAqLworCisgICAgICAgIC8qIGJvb2trZWVwaW5nIGZvciBvdXRzdGFuZGluZyB0aHVua3MgKi8KKyAgICBzdHJ1Y3Qga21wY19hbGlnbmVkX2ludDMyX3QgICp0cV90aF90aHVua3M7ICAgICAgICAgLyogIHBlci10aHJlYWQgYXJyYXkgZm9yICMgb2YgcmVndWxhciB0aHVua3MgY3VycmVudGx5IGJlaW5nIGV4ZWN1dGVkICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgdHFfbnByb2M7ICAgICAgICAgICAgIC8qICBudW1iZXIgb2YgdGh1bmtzIGluIHRoZSB0aF90aHVua3MgYXJyYXkgKi8KKworICAgICAgICAvKiBzdGF0aXN0aWNzIGxpYnJhcnkgYm9va2tlZXBpbmcgKi8KKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAgICAgICAqdHFfbG9jOyAgICAgICAgICAgICAgLyogIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbiBmb3IgdGFza3EgZGlyZWN0aXZlICovCit9IGttcGNfdGFza19xdWV1ZV90OworCit0eXBlZGVmIHZvaWQgKCprbXBjX3Rhc2tfdCkgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBzdHJ1Y3Qga21wY190aHVua190ICp0aHVuayk7CisKKy8qICBzaXplb2Zfc2hhcmVkcyBwYXNzZWQgYXMgYXJnIHRvIF9fa21wY190YXNrcSBjYWxsICAqLwordHlwZWRlZiBzdHJ1Y3Qga21wY19zaGFyZWRfdmFyc190IHsgICAgICAgICAgICAgLyogIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAqLworICAgIGttcGNfdGFza19xdWV1ZV90ICAgICAgICAgKnN2X3F1ZXVlOworICAgIC8qICAocG9pbnRlcnMgdG8pIHNoYXJlZCB2YXJzICAqLworfSBrbXBjX3NoYXJlZF92YXJzX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBjX2FsaWduZWRfc2hhcmVkX3ZhcnNfdCB7CisgICAgdm9sYXRpbGUgc3RydWN0IGttcGNfc2hhcmVkX3ZhcnNfdCAgICAgKmFpX2RhdGE7Cit9IGttcGNfYWxpZ25lZF9zaGFyZWRfdmFyc190OworCisvKiAgc2l6ZW9mX3RodW5rIHBhc3NlZCBhcyBhcmcgdG8ga21wY190YXNrcSBjYWxsICAqLwordHlwZWRlZiBzdHJ1Y3Qga21wY190aHVua190IHsgICAgICAgICAgICAgICAgICAgLyogIGFsaWduZWQgZHVyaW5nIGR5bmFtaWMgYWxsb2NhdGlvbiAqLworICAgIHVuaW9uIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogIGZpZWxkIHVzZWQgZm9yIGludGVybmFsIGZyZWVsaXN0cyB0b28gICovCisgICAgICAgIGttcGNfc2hhcmVkX3ZhcnNfdCAgKnRoX3NoYXJlZHM7CisgICAgICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRoX25leHRfZnJlZTsgICAgICAvKiAgZnJlZWxpc3Qgb2YgaW5kaXZpZHVhbCB0aHVua3Mgd2l0aGluIHF1ZXVlLCBoZWFkIGF0IHRxX2ZyZWVfdGh1bmtzICAqLworICAgIH0gdGg7CisgICAga21wY190YXNrX3QgdGhfdGFzazsgICAgICAgICAgICAgICAgICAgICAgICAvKiAgdGFza3FfdGFzayBpZiBmbGFncyAmIFRRRl9UQVNLUV9UQVNLICAqLworICAgIHN0cnVjdCBrbXBjX3RodW5rX3QgKnRoX2VuY2xfdGh1bms7ICAgICAgICAgLyogIHBvaW50ZXIgdG8gZHluYW1pY2FsbHkgZW5jbG9zaW5nIHRodW5rIG9uIHRoaXMgdGhyZWFkJ3MgY2FsbCBzdGFjayAqLworICAgIGttcF9pbnQzMiB0aF9mbGFnczsgICAgICAgICAgICAgICAgICAgICAgICAgLyogIFRRRl94eHggKHRxX2ZsYWdzIGludGVyZmFjZSBwbHVzIHBvc3NpYmxlIGludGVybmFsIGZsYWdzKSAgKi8KKyAgICBrbXBfaW50MzIgdGhfc3RhdHVzOworICAgIGttcF91aW50MzIgdGhfdGFza251bTsgICAgICAgICAgICAgICAgICAgICAgLyogIHRhc2sgbnVtYmVyIGFzc2lnbmVkIGluIG9yZGVyIG9mIHF1ZXVpbmcsIHVzZWQgZm9yIG9yZGVyZWQgc2VjdGlvbnMgKi8KKyAgICAvKiAgcHJpdmF0ZSB2YXJzICAqLworfSBrbXBjX3RodW5rX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfdGFza3EgeworICAgIGludCAgICAgICAgICAgICAgICAgdHFfY3Vycl90aHVua19jYXBhY2l0eTsKKworICAgIGttcGNfdGFza19xdWV1ZV90ICAqdHFfcm9vdDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIHRxX2dsb2JhbF9mbGFnczsKKworICAgIGttcF9sb2NrX3QgICAgICAgICAgdHFfZnJlZWxpc3RfbGNrOworICAgIGttcGNfdGFza19xdWV1ZV90ICAqdHFfZnJlZWxpc3Q7CisKKyAgICBrbXBjX3RodW5rX3QgICAgICAqKnRxX2N1cnJfdGh1bms7Cit9IGttcF90YXNrcV90OworCisvKiBFTkQgVGFza3EgZGF0YSBzdHJ1Y3R1cmVzICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordHlwZWRlZiBrbXBfaW50MzIga21wX2NyaXRpY2FsX25hbWVbOF07CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK1RoZSB0eXBlIGZvciBhIG1pY3JvdGFzayB3aGljaCBnZXRzIHBhc3NlZCB0byBAcmVmIF9fa21wY19mb3JrX2NhbGwoKS4KK1RoZSBhcmd1bWVudHMgdG8gdGhlIG91dGxpbmVkIGZ1bmN0aW9uIGFyZQorQHBhcmFtIGdsb2JhbF90aWQgdGhlIGdsb2JhbCB0aHJlYWQgaWRlbnRpdHkgb2YgdGhlIHRocmVhZCBleGVjdXRpbmcgdGhlIGZ1bmN0aW9uLgorQHBhcmFtIGJvdW5kX3RpZCAgdGhlIGxvY2FsIGlkZW50aXRpeSBvZiB0aGUgdGhyZWFkIGV4ZWN1dGluZyB0aGUgZnVuY3Rpb24KK0BwYXJhbSAuLi4gcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyBhY2Nlc3NlZCBieSB0aGUgZnVuY3Rpb24uCisqLwordHlwZWRlZiB2b2lkICgqa21wY19taWNybykgICAgICAgICAgICAgICgga21wX2ludDMyICogZ2xvYmFsX3RpZCwga21wX2ludDMyICogYm91bmRfdGlkLCAuLi4gKTsKK3R5cGVkZWYgdm9pZCAoKmttcGNfbWljcm9fYm91bmQpICAgICAgICAoIGttcF9pbnQzMiAqIGJvdW5kX3RpZCwga21wX2ludDMyICogYm91bmRfbnRoLCAuLi4gKTsKKworLyohCitAaW5ncm91cCBUSFJFQURQUklWQVRFCitAeworKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogVGhyZWFkcHJpdmF0ZSBpbml0aWFsaXphdGlvbi9maW5hbGl6YXRpb24gZnVuY3Rpb24gZGVjbGFyYXRpb25zICovCisKKy8qICBmb3Igbm9uLWFycmF5IG9iamVjdHM6ICBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcigpICAqLworCisvKiEKKyBQb2ludGVyIHRvIHRoZSBjb25zdHJ1Y3RvciBmdW5jdGlvbi4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorKi8KK3R5cGVkZWYgdm9pZCAqKCprbXBjX2N0b3IpICAgICh2b2lkICopOworCisvKiEKKyBQb2ludGVyIHRvIHRoZSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yKSAgICAgKHZvaWQgKiAvKiwgc2l6ZV90ICovKTsgLyogMm5kIGFyZzogbWFnaWMgbnVtYmVyIGZvciBLQ0MgdW51c2VkIGJ5IEludGVsIGNvbXBpbGVyICovCisvKiEKKyBQb2ludGVyIHRvIGFuIGFsdGVybmF0ZSBjb25zdHJ1Y3Rvci4KKyBUaGUgZmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlci4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jY3RvcikgICAodm9pZCAqLCB2b2lkICopOworCisvKiAgZm9yIGFycmF5IG9iamVjdHM6IF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYygpICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBGaXJzdCBhcmc6ICJ0aGlzIiBwb2ludGVyICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIExhc3QgYXJnOiBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMgKi8KKy8qIQorIEFycmF5IGNvbnN0cnVjdG9yLgorIEZpcnN0IGFyZ3VtZW50IGlzIHRoZSA8dHQ+dGhpczwvdHQ+IHBvaW50ZXIKKyBTZWNvbmQgYXJndW1lbnQgdGhlIG51bWJlciBvZiBhcnJheSBlbGVtZW50cy4KKyovCit0eXBlZGVmIHZvaWQgKigqa21wY19jdG9yX3ZlYykgICh2b2lkICosIHNpemVfdCk7CisvKiEKKyBQb2ludGVyIHRvIHRoZSBhcnJheSBkZXN0cnVjdG9yIGZ1bmN0aW9uLgorIFRoZSBmaXJzdCBhcmd1bWVudCBpcyB0aGUgPHR0PnRoaXM8L3R0PiBwb2ludGVyCisgU2Vjb25kIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICgqa21wY19kdG9yX3ZlYykgICAodm9pZCAqLCBzaXplX3QpOworLyohCisgQXJyYXkgY29uc3RydWN0b3IuCisgRmlyc3QgYXJndW1lbnQgaXMgdGhlIDx0dD50aGlzPC90dD4gcG9pbnRlcgorIFRoaXJkIGFyZ3VtZW50IHRoZSBudW1iZXIgb2YgYXJyYXkgZWxlbWVudHMuCisqLwordHlwZWRlZiB2b2lkICooKmttcGNfY2N0b3JfdmVjKSAodm9pZCAqLCB2b2lkICosIHNpemVfdCk7IC8qIGZ1bmN0aW9uIHVudXNlZCBieSBjb21waWxlciAqLworCisvKiEKK0B9CisqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBrZWVwcyB0cmFja2VkIG9mIHRocmVhZHByaXZhdGUgY2FjaGUgYWxsb2NhdGlvbnMgZm9yIGNsZWFudXAgbGF0ZXIgKi8KK3R5cGVkZWYgc3RydWN0IGttcF9jYWNoZWRfYWRkciB7CisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgICAqKmFkZHI7ICAgICAgICAgICAvKiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZSAqLworICAgIHN0cnVjdCBrbXBfY2FjaGVkX2FkZHIgICAgICpuZXh0OyAgICAgICAgICAgLyogcG9pbnRlciB0byBuZXh0IGNhY2hlZCBhZGRyZXNzICovCit9IGttcF9jYWNoZWRfYWRkcl90OworCitzdHJ1Y3QgcHJpdmF0ZV9kYXRhIHsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICpuZXh0OyAgICAgICAgICAvKiBUaGUgbmV4dCBkZXNjcmlwdG9yIGluIHRoZSBsaXN0ICAgICAgKi8KKyAgICB2b2lkICAgICAgICAgICAgICAgICpkYXRhOyAgICAgICAgICAvKiBUaGUgZGF0YSBidWZmZXIgZm9yIHRoaXMgZGVzY3JpcHRvciAgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICBtb3JlOyAgICAgICAgICAvKiBUaGUgcmVwZWF0IGNvdW50IGZvciB0aGlzIGRlc2NyaXB0b3IgKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgICBzaXplOyAgICAgICAgICAvKiBUaGUgZGF0YSBzaXplIGZvciB0aGlzIGRlc2NyaXB0b3IgICAgKi8KK307CisKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiB7CisgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICAgICAqbmV4dDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICAgICpsaW5rOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKmdibF9hZGRyOworICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICAgKnBhcl9hZGRyOyAgICAgICAgLyogcGFyX2FkZHIgPT0gZ2JsX2FkZHIgZm9yIE1BU1RFUiB0aHJlYWQgKi8KKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjbW5fc2l6ZTsKK307CisKK3N0cnVjdCBzaGFyZWRfY29tbW9uCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICAgICAqbmV4dDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICAgICAgICpwb2RfaW5pdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpvYmpfaW5pdDsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAgICpnYmxfYWRkcjsKKyAgICB1bmlvbiB7CisgICAgICAgIGttcGNfY3RvciAgICAgICAgICAgICAgY3RvcjsKKyAgICAgICAga21wY19jdG9yX3ZlYyAgICAgICAgICBjdG9ydjsKKyAgICB9IGN0OworICAgIHVuaW9uIHsKKyAgICAgICAga21wY19jY3RvciAgICAgICAgICAgICBjY3RvcjsKKyAgICAgICAga21wY19jY3Rvcl92ZWMgICAgICAgICBjY3RvcnY7CisgICAgfSBjY3Q7CisgICAgdW5pb24geworICAgICAgICBrbXBjX2R0b3IgICAgICAgICAgICAgIGR0b3I7CisgICAgICAgIGttcGNfZHRvcl92ZWMgICAgICAgICAgZHRvcnY7CisgICAgfSBkdDsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICB2ZWNfbGVuOworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgIGlzX3ZlYzsKKyAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBjbW5fc2l6ZTsKK307CisKKyNkZWZpbmUgS01QX0hBU0hfVEFCTEVfTE9HMiAgICAgOSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBsb2cyIG9mIHRoZSBoYXNoIHRhYmxlIHNpemUgKi8KKyNkZWZpbmUgS01QX0hBU0hfVEFCTEVfU0laRSAgICAgKDEgPDwgS01QX0hBU0hfVEFCTEVfTE9HMikgICAgICAvKiBzaXplIG9mIHRoZSBoYXNoIHRhYmxlICovCisjZGVmaW5lIEtNUF9IQVNIX1NISUZUICAgICAgICAgIDMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGhyb3cgYXdheSB0aGlzIG1hbnkgbG93IGJpdHMgZnJvbSB0aGUgYWRkcmVzcyAqLworI2RlZmluZSBLTVBfSEFTSCh4KSAgICAgICAgICAgICAoKCgoa21wX3VpbnRwdHJfdCkgeCkgPj4gS01QX0hBU0hfU0hJRlQpICYgKEtNUF9IQVNIX1RBQkxFX1NJWkUtMSkpCisKK3N0cnVjdCBjb21tb25fdGFibGUgeworICAgIHN0cnVjdCAgcHJpdmF0ZV9jb21tb24gICAgICAqZGF0YVsgS01QX0hBU0hfVEFCTEVfU0laRSBdOworfTsKKworc3RydWN0IHNoYXJlZF90YWJsZSB7CisgICAgc3RydWN0ICBzaGFyZWRfY29tbW9uICAgICAgICpkYXRhWyBLTVBfSEFTSF9UQUJMRV9TSVpFIF07Cit9OworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3QgS01QX0FMSUdOX0NBQ0hFIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyIHsKKyAgICBrbXBfaW50MzIgY291bnQ7CisgICAga21wX2ludDMyIHViOworICAgIC8qIEFkZGluZyBLTVBfQUxJR05fQ0FDSEUgaGVyZSBkb2Vzbid0IGhlbHAgLyBjYW4gaHVydCBwZXJmb3JtYW5jZSAqLworICAgIGttcF9pbnQzMiBsYjsKKyAgICBrbXBfaW50MzIgc3Q7CisgICAga21wX2ludDMyIHRjOworICAgIGttcF9pbnQzMiBzdGF0aWNfc3RlYWxfY291bnRlcjsgLyogZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViICovCisKKyAgICAvLyBLTVBfQUxJR04oIDE2ICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAvLyAgICBhKSBwYXJtMyBpcyBwcm9wZXJseSBhbGlnbmVkIGFuZAorICAgIC8vICAgIGIpIGFsbCBwYXJtMS00IGFyZSBpbiB0aGUgc2FtZSBjYWNoZSBsaW5lLgorICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgLy8gaWYgdGhleSBhcmUgaW4gdGhlIHNhbWUgbGluZSAobm90IG1lYXN1cmVkIHRob3VnaCkuCisKKyAgICBzdHJ1Y3QgS01QX0FMSUdOKCAzMiApIHsgLy8gQUM6IGNoYW5nZWQgMTYgdG8gMzIgaW4gb3JkZXIgdG8gc2ltcGxpZnkgdGVtcGxhdGUKKyAgICAgICAga21wX2ludDMyIHBhcm0xOyAgICAgLy8gICAgIHN0cnVjdHVyZXMgaW4ga21wX2Rpc3BhdGNoLmNwcC4gVGhpcyBzaG91bGQKKyAgICAgICAga21wX2ludDMyIHBhcm0yOyAgICAgLy8gICAgIG1ha2Ugbm8gcmVhbCBjaGFuZ2UgYXQgbGVhc3Qgd2hpbGUgcGFkZGluZyBpcyBvZmYuCisgICAgICAgIGttcF9pbnQzMiBwYXJtMzsKKyAgICAgICAga21wX2ludDMyIHBhcm00OworICAgIH07CisKKyAgICBrbXBfdWludDMyIG9yZGVyZWRfbG93ZXI7CisgICAga21wX3VpbnQzMiBvcmRlcmVkX3VwcGVyOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgLy8gVGhpcyB2YXIgY2FuIGJlIHBsYWNlZCBpbiB0aGUgaG9sZSBiZXR3ZWVuICd0YycgYW5kICdwYXJtMScsIGluc3RlYWQgb2YgJ3N0YXRpY19zdGVhbF9jb3VudGVyJy4KKyAgICAvLyBJdCB3b3VsZCBiZSBuaWNlIHRvIG1lYXN1cmUgZXhlY3V0aW9uIHRpbWVzLgorICAgIC8vIENvbmRpdGlvbmFsIGlmL2VuZGlmIGNhbiBiZSByZW1vdmVkIGF0IGFsbC4KKyAgICBrbXBfaW50MzIgbGFzdF91cHBlcjsKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworfSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMl90OworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjQgeworICAgIGttcF9pbnQ2NCBjb3VudDsgICAvKiBjdXJyZW50IGNodW5rIG51bWJlciBmb3Igc3RhdGljIGFuZCBzdGF0aWMtc3RlYWwgc2NoZWR1bGluZyovCisgICAga21wX2ludDY0IHViOyAgICAgIC8qIHVwcGVyLWJvdW5kICovCisgICAgLyogQWRkaW5nIEtNUF9BTElHTl9DQUNIRSBoZXJlIGRvZXNuJ3QgaGVscCAvIGNhbiBodXJ0IHBlcmZvcm1hbmNlICovCisgICAga21wX2ludDY0IGxiOyAgICAgIC8qIGxvd2VyLWJvdW5kICovCisgICAga21wX2ludDY0IHN0OyAgICAgIC8qIHN0cmlkZSAqLworICAgIGttcF9pbnQ2NCB0YzsgICAgICAvKiB0cmlwIGNvdW50IChudW1iZXIgb2YgaXRlcmF0aW9ucykgKi8KKyAgICBrbXBfaW50NjQgc3RhdGljX3N0ZWFsX2NvdW50ZXI7IC8qIGZvciBzdGF0aWNfc3RlYWwgb25seTsgbWF5YmUgYmV0dGVyIHRvIHB1dCBhZnRlciB1YiAqLworCisgICAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKworICAgIC8vIEtNUF9BTElHTiggMzIgKSBlbnN1cmVzICggaWYgdGhlIEtNUF9BTElHTiBtYWNybyBpcyB0dXJuZWQgb24gKQorICAgIC8vICAgIGEpIHBhcm0zIGlzIHByb3Blcmx5IGFsaWduZWQgYW5kCisgICAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgICAgLy8gQmVjYXVzZSBvZiBwYXJtMS00IGFyZSB1c2VkIHRvZ2V0aGVyLCBwZXJmb3JtYW5jZSBzZWVtcyB0byBiZSBiZXR0ZXIKKyAgICAvLyBpZiB0aGV5IGFyZSBpbiB0aGUgc2FtZSBsaW5lIChub3QgbWVhc3VyZWQgdGhvdWdoKS4KKworICAgIHN0cnVjdCBLTVBfQUxJR04oIDMyICkgeworICAgICAgICBrbXBfaW50NjQgcGFybTE7CisgICAgICAgIGttcF9pbnQ2NCBwYXJtMjsKKyAgICAgICAga21wX2ludDY0IHBhcm0zOworICAgICAgICBrbXBfaW50NjQgcGFybTQ7CisgICAgfTsKKworICAgIGttcF91aW50NjQgb3JkZXJlZF9sb3dlcjsKKyAgICBrbXBfdWludDY0IG9yZGVyZWRfdXBwZXI7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLyBUaGlzIHZhciBjYW4gYmUgcGxhY2VkIGluIHRoZSBob2xlIGJldHdlZW4gJ3RjJyBhbmQgJ3Bhcm0xJywgaW5zdGVhZCBvZiAnc3RhdGljX3N0ZWFsX2NvdW50ZXInLgorICAgIC8vIEl0IHdvdWxkIGJlIG5pY2UgdG8gbWVhc3VyZSBleGVjdXRpb24gdGltZXMuCisgICAgLy8gQ29uZGl0aW9uYWwgaWYvZW5kaWYgY2FuIGJlIHJlbW92ZWQgYXQgYWxsLgorICAgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZWxzZSAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8zMiB7CisgICAga21wX2ludDMyIGxiOworICAgIGttcF9pbnQzMiB1YjsKKyAgICBrbXBfaW50MzIgc3Q7CisgICAga21wX2ludDMyIHRjOworCisgICAga21wX2ludDMyIHBhcm0xOworICAgIGttcF9pbnQzMiBwYXJtMjsKKyAgICBrbXBfaW50MzIgcGFybTM7CisgICAga21wX2ludDMyIHBhcm00OworCisgICAga21wX2ludDMyIGNvdW50OworCisgICAga21wX3VpbnQzMiBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50MzIgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGttcF9pbnQzMiBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm82NCB7CisgICAga21wX2ludDY0IGxiOyAgICAgIC8qIGxvd2VyLWJvdW5kICovCisgICAga21wX2ludDY0IHViOyAgICAgIC8qIHVwcGVyLWJvdW5kICovCisgICAga21wX2ludDY0IHN0OyAgICAgIC8qIHN0cmlkZSAqLworICAgIGttcF9pbnQ2NCB0YzsgICAgICAvKiB0cmlwIGNvdW50IChudW1iZXIgb2YgaXRlcmF0aW9ucykgKi8KKworICAgIC8qIHBhcm1bMS00XSBhcmUgdXNlZCBpbiBkaWZmZXJlbnQgd2F5cyBieSBkaWZmZXJlbnQgc2NoZWR1bGluZyBhbGdvcml0aG1zICovCisgICAga21wX2ludDY0IHBhcm0xOworICAgIGttcF9pbnQ2NCBwYXJtMjsKKyAgICBrbXBfaW50NjQgcGFybTM7CisgICAga21wX2ludDY0IHBhcm00OworCisgICAga21wX2ludDY0IGNvdW50OyAgIC8qIGN1cnJlbnQgY2h1bmsgbnVtYmVyIGZvciBzdGF0aWMgc2NoZWR1bGluZyAqLworCisgICAga21wX3VpbnQ2NCBvcmRlcmVkX2xvd2VyOworICAgIGttcF91aW50NjQgb3JkZXJlZF91cHBlcjsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGttcF9pbnQ2NCBsYXN0X3VwcGVyOworI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCit9IGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3Q7CisjZW5kaWYgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBkaXNwYXRjaF9wcml2YXRlX2luZm8geworICAgIHVuaW9uIHByaXZhdGVfaW5mbyB7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzMyX3QgIHAzMjsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvNjRfdCAgcDY0OworICAgIH0gdTsKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGU7ICAvKiBzY2hlZHVsaW5nIGFsZ29yaXRobSAqLworICAgIGttcF9pbnQzMiAgICAgICBvcmRlcmVkOyAgIC8qIG9yZGVyZWQgY2xhdXNlIHNwZWNpZmllZCAqLworICAgIGttcF9pbnQzMiAgICAgICBvcmRlcmVkX2J1bXBlZDsKKyAgICBrbXBfaW50MzIgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0zXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCisgICAgc3RydWN0IGRpc3BhdGNoX3ByaXZhdGVfaW5mbyAqIG5leHQ7IC8qIHN0YWNrIG9mIGJ1ZmZlcnMgZm9yIG5lc3Qgb2Ygc2VyaWFsIHJlZ2lvbnMgKi8KKyAgICBrbXBfaW50MzIgICAgICAgbm9tZXJnZTsgICAvKiBkb24ndCBtZXJnZSBpdGVycyBpZiBzZXJpYWxpemVkICovCisgICAga21wX2ludDMyICAgICAgIHR5cGVfc2l6ZTsgLyogdGhlIHNpemUgb2YgdHlwZXMgaW4gcHJpdmF0ZV9pbmZvICovCisgICAgZW51bSBjb25zX3R5cGUgIHB1c2hlZF93czsKK30gZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvMzIgeworICAgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICAgIGl0ZXJhdGlvbiBpbmRleCBvdGhlcndpc2UgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgaXRlcmF0aW9uOworICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgICBudW1fZG9uZTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgb3JkZXJlZF9pdGVyYXRpb247CisgICAga21wX2ludDMyICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtMV07IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfSBkaXNwYXRjaF9zaGFyZWRfaW5mbzMyX3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvNjQgeworICAgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICAgIGl0ZXJhdGlvbiBpbmRleCBvdGhlcndpc2UgKi8KKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgaXRlcmF0aW9uOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICBudW1fZG9uZTsKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgb3JkZXJlZF9pdGVyYXRpb247CisgICAga21wX2ludDY0ICAgb3JkZXJlZF9kdW1teVtLTVBfTUFYX09SREVSRUQtM107IC8vIHRvIHJldGFpbiB0aGUgc3RydWN0dXJlIHNpemUgYWZ0ZXIgbWFraW5nIG9yZGVyZWRfaXRlcmF0aW9uIHNjYWxhcgorfSBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3Q7CisKK3R5cGVkZWYgc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvIHsKKyAgICB1bmlvbiBzaGFyZWRfaW5mbyB7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvMzJfdCAgczMyOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mbzY0X3QgIHM2NDsKKyAgICB9IHU7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgYnVmZmVyX2luZGV4OworI2lmIE9NUF80NV9FTkFCTEVECisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgZG9hY3Jvc3NfYnVmX2lkeDsgIC8vIHRlYW13aXNlIGluZGV4CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAqZG9hY3Jvc3NfZmxhZ3M7ICAgIC8vIHNoYXJlZCBhcnJheSBvZiBpdGVyYXRpb24gZmxhZ3MgKDAvMSkKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICBkb2Fjcm9zc19udW1fZG9uZTsgLy8gY291bnQgZmluaXNoZWQgdGhyZWFkcworI2VuZGlmCisjaWYgS01QX1VTRV9IV0xPQworICAgIC8vIFdoZW4gbGlua2luZyB3aXRoIGxpYmh3bG9jLCB0aGUgT1JERVJFRCBFUENDIHRlc3Qgc2xvd3MgZG93biBvbiBiaWcKKyAgICAvLyBtYWNoaW5lcyAoPiA0OCBjb3JlcykuIFBlcmZvcm1hbmNlIGFuYWx5c2lzIHNob3dlZCB0aGF0IGEgY2FjaGUgdGhyYXNoCisgICAgLy8gd2FzIG9jY3VycmluZyBhbmQgdGhpcyBwYWRkaW5nIGhlbHBzIGFsbGV2aWF0ZSB0aGUgcHJvYmxlbS4KKyAgICBjaGFyIHBhZGRpbmdbNjRdOworI2VuZGlmCit9IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3Q7CisKK3R5cGVkZWYgc3RydWN0IGttcF9kaXNwIHsKKyAgICAvKiBWZWN0b3IgZm9yIE9SREVSRUQgU0VDVElPTiAqLworICAgIHZvaWQgKCp0aF9kZW9fZmNuKSggaW50ICogZ3RpZCwgaW50ICogY2lkLCBpZGVudF90ICopOworICAgIC8qIFZlY3RvciBmb3IgRU5EIE9SREVSRUQgU0VDVElPTiAqLworICAgIHZvaWQgKCp0aF9keG9fZmNuKSggaW50ICogZ3RpZCwgaW50ICogY2lkLCBpZGVudF90ICopOworCisgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAgKnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQ7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQ7CisKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqdGhfZGlzcF9idWZmZXI7CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgIHRoX2Rpc3BfaW5kZXg7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgdGhfZG9hY3Jvc3NfYnVmX2lkeDsgLy8gdGhyZWFkJ3MgZG9hY3Jvc3MgYnVmZmVyIGluZGV4CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgKnRoX2RvYWNyb3NzX2ZsYWdzOyAgIC8vIHBvaW50ZXIgdG8gc2hhcmVkIGFycmF5IG9mIGZsYWdzCisgICAgdW5pb24geyAvLyB3ZSBjYW4gdXNlIHVuaW9uIGhlcmUgYmVjYXVzZSBkb2Fjcm9zcyBjYW5ub3QgYmUgdXNlZCBpbiBub25tb25vdG9uaWMgbG9vcHMKKyAgICAgICAga21wX2ludDY0ICAgICAgICAgICAqdGhfZG9hY3Jvc3NfaW5mbzsgICAgLy8gaW5mbyBvbiBsb29wIGJvdW5kcworICAgICAgICBrbXBfbG9ja190ICAgICAgICAgICp0aF9zdGVhbF9sb2NrOyAgICAgICAvLyBsb2NrIHVzZWQgZm9yIGNodW5rIHN0ZWFsaW5nICg4LWJ5dGUgdmFyaWFibGUpCisgICAgfTsKKyNlbHNlCisgICAgdm9pZCogZHVtbXlfcGFkZGluZ1syXTsgLy8gbWFrZSBpdCA2NCBieXRlcyBvbiBJbnRlbChSKSA2NAorI2VuZGlmCisjaWYgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisgICAgY2hhciBtb3JlX3BhZGRpbmdbSU5URVJOT0RFX0NBQ0hFX0xJTkVdOworI2VuZGlmCit9IGttcF9kaXNwX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEJhcnJpZXIgc3R1ZmYgKi8KKworLyogY29uc3RhbnRzIGZvciBiYXJyaWVyIHN0YXRlIHVwZGF0ZSAqLworI2RlZmluZSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICAwICAgICAgIC8qIHNob3VsZCBwcm9iYWJseSBzdGFydCBmcm9tIHplcm8gKi8KKyNkZWZpbmUgS01QX0JBUlJJRVJfU0xFRVBfQklUICAgMCAgICAgICAvKiBiaXQgdXNlZCBmb3Igc3VzcGVuZC9zbGVlcCBwYXJ0IG9mIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQgIDEgICAgICAgLyogYml0IHRoYXQgbXVzdCBuZXZlciBiZSBzZXQgZm9yIHZhbGlkIHN0YXRlICovCisjZGVmaW5lIEtNUF9CQVJSSUVSX0JVTVBfQklUICAgIDIgICAgICAgLyogbHNiIHVzZWQgZm9yIGJ1bXAgb2YgZ28vYXJyaXZlZCBzdGF0ZSAqLworCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFICAgICAgICAgKDEgPDwgS01QX0JBUlJJRVJfU0xFRVBfQklUKQorI2RlZmluZSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUgICAgICAgICgxIDw8IEtNUF9CQVJSSUVSX1VOVVNFRF9CSVQpCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgICAgICAgICAgKDEgPDwgS01QX0JBUlJJRVJfQlVNUF9CSVQpCisKKyNpZiAoS01QX0JBUlJJRVJfU0xFRVBfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciBzbGVlcCBiaXQgbXVzdCBiZSBzbWFsbGVyIHRoYW4gYmFycmllciBidW1wIGJpdCIKKyNlbmRpZgorI2lmIChLTVBfQkFSUklFUl9VTlVTRURfQklUID49IEtNUF9CQVJSSUVSX0JVTVBfQklUKQorIyBlcnJvciAiQmFycmllciB1bnVzZWQgYml0IG11c3QgYmUgc21hbGxlciB0aGFuIGJhcnJpZXIgYnVtcCBiaXQiCisjZW5kaWYKKworLy8gQ29uc3RhbnRzIGZvciByZWxlYXNlIGJhcnJpZXIgd2FpdCBzdGF0ZTogY3VycmVudGx5LCBoaWVyYXJjaGljYWwgb25seQorI2RlZmluZSBLTVBfQkFSUklFUl9OT1RfV0FJVElORyAgICAgICAgMCAgLy8gTm9ybWFsIHN0YXRlOyB3b3JrZXIgbm90IGluIHdhaXRfc2xlZXAKKyNkZWZpbmUgS01QX0JBUlJJRVJfT1dOX0ZMQUcgICAgICAgICAgIDEgIC8vIE5vcm1hbCBzdGF0ZTsgd29ya2VyIHdhaXRpbmcgb24gb3duIGJfZ28gZmxhZyBpbiByZWxlYXNlCisjZGVmaW5lIEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHICAgICAgICAyICAvLyBTcGVjaWFsIHN0YXRlOyB3b3JrZXIgd2FpdGluZyBvbiBwYXJlbnQncyBiX2dvIGZsYWcgaW4gcmVsZWFzZQorI2RlZmluZSBLTVBfQkFSUklFUl9TV0lUQ0hfVE9fT1dOX0ZMQUcgMyAgLy8gU3BlY2lhbCBzdGF0ZTsgdGVsbHMgd29ya2VyIHRvIHNoaWZ0IGZyb20gcGFyZW50IHRvIG93biBiX2dvCisjZGVmaW5lIEtNUF9CQVJSSUVSX1NXSVRDSElORyAgICAgICAgICA0ICAvLyBTcGVjaWFsIHN0YXRlOyB3b3JrZXIgcmVzZXRzIGFwcHJvcHJpYXRlIGZsYWcgb24gd2FrZS11cAorCitlbnVtIGJhcnJpZXJfdHlwZSB7CisgICAgYnNfcGxhaW5fYmFycmllciA9IDAsICAgICAgIC8qIDAsIEFsbCBub24tZm9yay9qb2luIGJhcnJpZXJzIChleGNlcHQgcmVkdWN0aW9uIGJhcnJpZXJzIGlmIGVuYWJsZWQpICovCisgICAgYnNfZm9ya2pvaW5fYmFycmllciwgICAgICAgIC8qIDEsIEFsbCBmb3JrL2pvaW4gKHBhcmFsbGVsIHJlZ2lvbikgYmFycmllcnMgKi8KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgYnNfcmVkdWN0aW9uX2JhcnJpZXIsICAgLyogMiwgQWxsIGJhcnJpZXJzIHRoYXQgYXJlIHVzZWQgaW4gcmVkdWN0aW9uICovCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgYnNfbGFzdF9iYXJyaWVyICAgICAgICAgICAgIC8qIEp1c3QgYSBwbGFjZWhvbGRlciB0byBtYXJrIHRoZSBlbmQgKi8KK307CisKKy8vIHRvIHdvcmsgd2l0aCByZWR1Y3Rpb24gYmFycmllcnMganVzdCBsaWtlIHdpdGggcGxhaW4gYmFycmllcnMKKyNpZiAhS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAjZGVmaW5lIGJzX3JlZHVjdGlvbl9iYXJyaWVyIGJzX3BsYWluX2JhcnJpZXIKKyNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCit0eXBlZGVmIGVudW0ga21wX2Jhcl9wYXQgeyAgICAgIC8qIEJhcnJpZXIgY29tbXVuaWNhdGlvbiBwYXR0ZXJucyAqLworICAgIGJwX2xpbmVhcl9iYXIgPSAwLCAgICAgICAgICAvKiBTaW5nbGUgbGV2ZWwgKGRlZ2VuZXJhdGUpIHRyZWUgKi8KKyAgICBicF90cmVlX2JhciA9IDEsICAgICAgICAgICAgLyogQmFsYW5jZWQgdHJlZSB3aXRoIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfaHlwZXJfYmFyID0gMiwgICAgICAgICAgIC8qIEh5cGVyY3ViZS1lbWJlZGRlZCB0cmVlIHdpdGggbWluIGJyYW5jaGluZyBmYWN0b3IgMl5uICovCisgICAgYnBfaGllcmFyY2hpY2FsX2JhciA9IDMsICAgIC8qIE1hY2hpbmUgaGllcmFyY2h5IHRyZWUgKi8KKyAgICBicF9sYXN0X2JhciA9IDQgICAgICAgICAgICAgLyogUGxhY2Vob2xkZXIgdG8gbWFyayB0aGUgZW5kICovCit9IGttcF9iYXJfcGF0X2U7CisKKyMgZGVmaW5lIEtNUF9CQVJSSUVSX0lDVl9QVVNIICAgMQorCisvKiBSZWNvcmQgZm9yIGhvbGRpbmcgdGhlIHZhbHVlcyBvZiB0aGUgaW50ZXJuYWwgY29udHJvbHMgc3RhY2sgcmVjb3JkcyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgeworICAgIGludCAgICAgICAgICAgc2VyaWFsX25lc3RpbmdfbGV2ZWw7ICAvKiBjb3JyZXNwb25kcyB0byB0aGUgdmFsdWUgb2YgdGhlIHRoX3RlYW1fc2VyaWFsaXplZCBmaWVsZCAqLworICAgIGttcF9pbnQ4ICAgICAgbmVzdGVkOyAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpICovCisgICAga21wX2ludDggICAgICBkeW5hbWljOyAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIGR5bmFtaWMgYWRqdXN0bWVudCBvZiB0aHJlYWRzIChwZXIgdGhyZWFkKSAqLworICAgIGttcF9pbnQ4ICAgICAgYnRfc2V0OyAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciB3aGV0aGVyIGJsb2NrdGltZSBpcyBleHBsaWNpdGx5IHNldCAqLworICAgIGludCAgICAgICAgICAgYmxvY2t0aW1lOyAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciBibG9ja3RpbWUgKi8KKyAgICBpbnQgICAgICAgICAgIGJ0X2ludGVydmFsczsgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscyAqLworICAgIGludCAgICAgICAgICAgbnByb2M7ICAgICAgICAgICAgICAgICAvKiBpbnRlcm5hbCBjb250cm9sIGZvciAjdGhyZWFkcyBmb3IgbmV4dCBwYXJhbGxlbCByZWdpb24gKHBlciB0aHJlYWQpICovCisgICAgaW50ICAgICAgICAgICBtYXhfYWN0aXZlX2xldmVsczsgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzICovCisgICAga21wX3Jfc2NoZWRfdCBzY2hlZDsgICAgICAgICAgICAgICAgIC8qIGludGVybmFsIGNvbnRyb2wgZm9yIHJ1bnRpbWUgc2NoZWR1bGUge3NjaGVkLGNodW5rfSBwYWlyICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kOyAgICAgICAgICAgLyogaW50ZXJuYWwgY29udHJvbCBmb3IgYWZmaW5pdHkgICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICBzdHJ1Y3Qga21wX2ludGVybmFsX2NvbnRyb2wgKm5leHQ7Cit9IGttcF9pbnRlcm5hbF9jb250cm9sX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorY29weV9pY3ZzKCBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpkc3QsIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnNyYyApIHsKKyAgICAqZHN0ID0gKnNyYzsKK30KKworLyogVGhyZWFkIGJhcnJpZXIgbmVlZHMgdm9sYXRpbGUgYmFycmllciBmaWVsZHMgKi8KK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYnN0YXRlIHsKKyAgICAvLyB0aF9maXhlZF9pY3ZzIGlzIGFsaWduZWQgYnkgdmlydHVlIG9mIGttcF9ic3RhdGUgYmVpbmcgYWxpZ25lZCAoYW5kIGFsbCB1c2VzIG9mIGl0KS4KKyAgICAvLyBJdCBpcyBub3QgZXhwbGljaXRseSBhbGlnbmVkIGJlbG93LCBiZWNhdXNlIHdlICpkb24ndCogd2FudCBpdCB0byBiZSBwYWRkZWQgLS0gaW5zdGVhZCwKKyAgICAvLyB3ZSBmaXQgYl9nbyBpbnRvIHRoZSBzYW1lIGNhY2hlIGxpbmUgd2l0aCB0aF9maXhlZF9pY3ZzLCBlbmFibGluZyBOR08gY2FjaGUgbGluZXMKKyAgICAvLyBzdG9yZXMgaW4gdGhlIGhpZXJhcmNoaWNhbCBiYXJyaWVyLgorICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgdGhfZml4ZWRfaWN2czsgICAgICAgICAgLy8gSW5pdGlhbCBJQ1ZzIGZvciB0aGUgdGhyZWFkCisgICAgLy8gVHVjayBiX2dvIGludG8gZW5kIG9mIHRoX2ZpeGVkX2ljdnMgY2FjaGUgbGluZSwgc28gaXQgY2FuIGJlIHN0b3JlZCB3aXRoIHNhbWUgTkdPIHN0b3JlCisgICAgdm9sYXRpbGUga21wX3VpbnQ2NCBiX2dvOyAgICAgICAgICAgICAgICAgICAgICAvLyBTVEFURSA9PiB0YXNrIHNob3VsZCBwcm9jZWVkIChoaWVyYXJjaGljYWwpCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50NjQgYl9hcnJpdmVkOyAvLyBTVEFURSA9PiB0YXNrIHJlYWNoZWQgc3luY2ggcG9pbnQuCisgICAga21wX3VpbnQzMiAqc2tpcF9wZXJfbGV2ZWw7CisgICAga21wX3VpbnQzMiBteV9sZXZlbDsKKyAgICBrbXBfaW50MzIgcGFyZW50X3RpZDsKKyAgICBrbXBfaW50MzIgb2xkX3RpZDsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIHN0cnVjdCBrbXBfYnN0YXRlICpwYXJlbnRfYmFyOworICAgIGttcF90ZWFtX3QgKnRlYW07CisgICAga21wX3VpbnQ2NCBsZWFmX3N0YXRlOworICAgIGttcF91aW50MzIgbnByb2M7CisgICAga21wX3VpbnQ4IGJhc2VfbGVhZl9raWRzOworICAgIGttcF91aW50OCBsZWFmX2tpZHM7CisgICAga21wX3VpbnQ4IG9mZnNldDsKKyAgICBrbXBfdWludDggd2FpdF9mbGFnOworICAgIGttcF91aW50OCB1c2Vfb25jb3JlX2JhcnJpZXI7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gVGhlIGZvbGxvd2luZyBmaWVsZCBpcyBpbnRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSB0aGUgd29ya2VyIHRocmVhZCBpdHNlbGYgYWNjZXNzZXMgdGhpcworICAgIC8vIGZpZWxkOiB0aGUgd29ya2VyIGluY3JlYXNlcyBpdCBieSAxIHdoZW4gaXQgYXJyaXZlcyB0byBhIGJhcnJpZXIuCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF91aW50IGJfd29ya2VyX2Fycml2ZWQ7CisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCit9IGttcF9ic3RhdGVfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9iYXJyaWVyX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgS01QX1BBRChrbXBfYnN0YXRlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2JzdGF0ZV90IGJiOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl91bmlvbiBrbXBfYmFsaWduX3Q7CisKKy8qIFRlYW0gYmFycmllciBuZWVkcyBvbmx5IG5vbi12b2xhdGlsZSBhcnJpdmVkIGNvdW50ZXIgKi8KK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFycmllcl90ZWFtX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgYl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICBiX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHN0cnVjdCB7CisgICAgICAgIGttcF91aW50NjQgICBiX2Fycml2ZWQ7ICAgICAgIC8qIFNUQVRFID0+IHRhc2sgcmVhY2hlZCBzeW5jaCBwb2ludC4gKi8KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgLy8gVGhlIGZvbGxvd2luZyB0d28gZmllbGRzIGFyZSBpbmRlbmRlZCBmb3IgdGhlIGRlYnVnZ2VyIHNvbGVseS4gT25seSBtYXN0ZXIgb2YgdGhlIHRlYW0gYWNjZXNzZXMKKyAgICAgICAgLy8gdGhlc2UgZmllbGRzOiB0aGUgZmlyc3Qgb25lIGlzIGluY3JlYXNlZCBieSAxIHdoZW4gbWFzdGVyIGFycml2ZXMgdG8gYSBiYXJyaWVyLCB0aGUKKyAgICAgICAgLy8gc2Vjb25kIG9uZSBpcyBpbmNyZWFzZWQgYnkgb25lIHdoZW4gYWxsIHRoZSB0aHJlYWRzIGFycml2ZWQuCisgICAgICAgIGttcF91aW50ICAgICBiX21hc3Rlcl9hcnJpdmVkOworICAgICAgICBrbXBfdWludCAgICAgYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICB9OworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfYmFycmllcl90ZWFtX3VuaW9uIGttcF9iYWxpZ25fdGVhbV90OworCisvKgorICogUGFkZGluZyBmb3IgTGludXgqIE9TIHB0aHJlYWRzIGNvbmRpdGlvbiB2YXJpYWJsZXMgYW5kIG11dGV4ZXMgdXNlZCB0byBzaWduYWwKKyAqIHRocmVhZHMgd2hlbiBhIGNvbmRpdGlvbiBjaGFuZ2VzLiAgVGhpcyBpcyB0byB3b3JrYXJvdW5kIGFuIE5QVEwgYnVnCisgKiB3aGVyZSBwYWRkaW5nIHdhcyBhZGRlZCB0byBwdGhyZWFkX2NvbmRfdCB3aGljaCBjYXVzZWQgdGhlIGluaXRpYWxpemF0aW9uCisgKiByb3V0aW5lIHRvIHdyaXRlIG91dHNpZGUgb2YgdGhlIHN0cnVjdHVyZSBpZiBjb21waWxlZCBvbiBwcmUtTlBUTCB0aHJlYWRzLgorICovCisKKyNpZiBLTVBfT1NfV0lORE9XUwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX211dGV4Cit7CisgICAgLyogVGhlIExvY2sgKi8KKyAgICBDUklUSUNBTF9TRUNUSU9OIGNzOworfSBrbXBfd2luMzJfbXV0ZXhfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX3dpbjMyX2NvbmQKK3sKKyAgICAvKiBDb3VudCBvZiB0aGUgbnVtYmVyIG9mIHdhaXRlcnMuICovCisgICAgaW50IHdhaXRlcnNfY291bnRfOworCisgICAgLyogU2VyaWFsaXplIGFjY2VzcyB0byA8d2FpdGVyc19jb3VudF8+ICovCisgICAga21wX3dpbjMyX211dGV4X3Qgd2FpdGVyc19jb3VudF9sb2NrXzsKKworICAgIC8qIE51bWJlciBvZiB0aHJlYWRzIHRvIHJlbGVhc2UgdmlhIGEgPGNvbmRfYnJvYWRjYXN0PiBvciBhICovCisgICAgLyogPGNvbmRfc2lnbmFsPiAqLworICAgIGludCByZWxlYXNlX2NvdW50XzsKKworICAgIC8qIEtlZXBzIHRyYWNrIG9mIHRoZSBjdXJyZW50ICJnZW5lcmF0aW9uIiBzbyB0aGF0IHdlIGRvbid0IGFsbG93ICovCisgICAgLyogb25lIHRocmVhZCB0byBzdGVhbCBhbGwgdGhlICJyZWxlYXNlcyIgZnJvbSB0aGUgYnJvYWRjYXN0LiAqLworICAgIGludCB3YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgLyogQSBtYW51YWwtcmVzZXQgZXZlbnQgdGhhdCdzIHVzZWQgdG8gYmxvY2sgYW5kIHJlbGVhc2Ugd2FpdGluZyAqLworICAgIC8qIHRocmVhZHMuICovCisgICAgSEFORExFIGV2ZW50XzsKK30ga21wX3dpbjMyX2NvbmRfdDsKKyNlbmRpZgorCisjaWYgS01QX09TX1VOSVgKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9jb25kX3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGNfYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBjX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfY29uZF90ICAgICAgY19jb25kOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfY29uZF91bmlvbiBrbXBfY29uZF9hbGlnbl90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX211dGV4X3VuaW9uIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIG1fYWxpZ247CisgICAgY2hhciAgICAgICAgICAgICAgICBtX3BhZFsgQ0FDSEVfTElORSBdOworICAgIHB0aHJlYWRfbXV0ZXhfdCAgICAgbV9tdXRleDsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX211dGV4X3VuaW9uIGttcF9tdXRleF9hbGlnbl90OworCisjZW5kaWYgLyogS01QX09TX1VOSVggKi8KKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Rlc2NfYmFzZSB7CisgICAgdm9pZCAgICAqZHNfc3RhY2tiYXNlOworICAgIHNpemVfdCAgICAgICAgICAgIGRzX3N0YWNrc2l6ZTsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19zdGFja2dyb3c7CisgICAga21wX3RocmVhZF90ICAgICAgZHNfdGhyZWFkOworICAgIHZvbGF0aWxlIGludCAgICAgIGRzX3RpZDsKKyAgICBpbnQgICAgICAgICAgICAgICBkc19ndGlkOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgdm9sYXRpbGUgaW50ICAgICAgZHNfYWxpdmU7CisgICAgRFdPUkQgICAgICAgICAgICAgZHNfdGhyZWFkX2lkOworICAgICAgICAvKgorICAgICAgICAgICAgZHNfdGhyZWFkIGtlZXBzIHRocmVhZCBoYW5kbGUgb24gV2luZG93cyogT1MuIEl0IGlzIGVub3VnaCBmb3IgUlRMIHB1cnBvc2VzLiBIb3dldmVyLAorICAgICAgICAgICAgZGVidWdnZXIgc3VwcG9ydCAobGlib21wX2RiKSBjYW5ub3Qgd29yayB3aXRoIGhhbmRsZXMsIGJlY2F1c2UgdGhleSB1bmNvbXBhcmFibGUuIEZvcgorICAgICAgICAgICAgZXhhbXBsZSwgZGVidWdnZXIgcmVxdWVzdHMgaW5mbyBhYm91dCB0aHJlYWQgd2l0aCBoYW5kbGUgaC4gaCBpcyB2YWxpZCB3aXRoaW4gZGVidWdnZXIKKyAgICAgICAgICAgIHByb2Nlc3MsIGFuZCBtZWFuaW5nbGVzcyB3aXRoaW4gZGVidWdlZSBwcm9jZXNzLiBFdmVuIGlmIGggaXMgZHVwZWQgYnkgY2FsbCB0bworICAgICAgICAgICAgRHVwbGljYXRlSGFuZGxlKCksIHNvIHRoZSByZXN1bHQgaCcgaXMgdmFsaWQgd2l0aGluIGRlYnVnZWUgcHJvY2VzcywgYnV0IGl0IGlzIGEgKm5ldyoKKyAgICAgICAgICAgIGhhbmRsZSB3aGljaCBkb2VzICpub3QqIGVxdWFsIHRvIGFueSBvdGhlciBoYW5kbGUgaW4gZGVidWdlZS4uLiBUaGUgb25seSB3YXkgdG8KKyAgICAgICAgICAgIGNvbXBhcmUgaGFuZGxlcyBpcyBjb252ZXJ0IHRoZW0gdG8gc3lzdGVtLXdpZGUgaWRzLiBHZXRUaHJlYWRJZCgpIGZ1bmN0aW9uIGlzCisgICAgICAgICAgICBhdmFpbGFibGUgb25seSBpbiBMb25naG9ybiBhbmQgU2VydmVyIDIwMDMuIDotKCBJbiBjb250cmFzdCwgR2V0Q3VycmVudFRocmVhZElkKCkgaXMKKyAgICAgICAgICAgIGF2YWlsYWJsZSBvbiBhbGwgV2luZG93cyogT1MgZmxhdm91cnMgKGluY2x1ZGluZyBXaW5kb3dzKiA5NSkuIFRodXMsIHdlIGhhdmUgdG8gZ2V0IHRocmVhZCBpZCBieQorICAgICAgICAgICAgY2FsbCB0byBHZXRDdXJyZW50VGhyZWFkSWQoKSBmcm9tIHdpdGhpbiB0aGUgdGhyZWFkIGFuZCBzYXZlIGl0IHRvIGxldCBsaWJvbXBfZGIKKyAgICAgICAgICAgIGlkZW50aWZ5IHRocmVhZHMuCisgICAgICAgICovCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KK30ga21wX2Rlc2NfYmFzZV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVzYyB7CisgICAgZG91YmxlICAgICAgICAgICBkc19hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgZHNfcGFkWyBLTVBfUEFEKGttcF9kZXNjX2Jhc2VfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfZGVzY19iYXNlX3QgIGRzOworfSBrbXBfZGVzY190OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NhbCB7CisgICAgdm9sYXRpbGUgaW50ICAgICAgICAgICB0aGlzX2NvbnN0cnVjdDsgLyogY291bnQgb2Ygc2luZ2xlJ3MgZW5jb3VudGVyZWQgYnkgdGhyZWFkICovCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICpyZWR1Y2VfZGF0YTsKKyNpZiBLTVBfVVNFX0JHRVQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfZGF0YTsKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgKmJnZXRfbGlzdDsKKyNpZiAhIFVTRV9DTVBfWENIR19GT1JfQkdFVAorI2lmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgIGJnZXRfbG9jazsgICAgICAvKiBMb2NrIGZvciBhY2Nlc3NpbmcgYmdldCBmcmVlIGxpc3QgKi8KKyNlbHNlCisgICAga21wX2Jvb3RzdHJhcF9sb2NrX3QgICBiZ2V0X2xvY2s7ICAgICAgLyogTG9jayBmb3IgYWNjZXNzaW5nIGJnZXQgZnJlZSBsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogTXVzdCBiZSBib290c3RyYXAgbG9jayBzbyB3ZSBjYW4gdXNlIGl0IGF0IGxpYnJhcnkgc2h1dGRvd24gKi8KKyNlbmRpZiAvKiBVU0VfTE9DS19GT1JfQkdFVCAqLworI2VuZGlmIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjZW5kaWYgLyogS01QX1VTRV9CR0VUICovCisKKyNpZmRlZiBCVUlMRF9UVgorICAgIHN0cnVjdCB0dl9kYXRhICAgICAgICAqdHZfZGF0YTsKKyNlbmRpZgorCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsgLyogc3RvcmVkIGJ5IF9fa21wY19yZWR1Y2UqKCksIHVzZWQgYnkgX19rbXBjX2VuZF9yZWR1Y2UqKCkgKi8KKworfSBrbXBfbG9jYWxfdDsKKworI2RlZmluZSBLTVBfQ0hFQ0tfVVBEQVRFKGEsIGIpIGlmICgoYSkgIT0gKGIpKSAoYSkgPSAoYikKKyNkZWZpbmUgS01QX0NIRUNLX1VQREFURV9TWU5DKGEsIGIpIGlmICgoYSkgIT0gKGIpKSBUQ1dfU1lOQ19QVFIoKGEpLCAoYikpCisKKyNkZWZpbmUgZ2V0X19ibG9ja3RpbWUoIHh0ZWFtLCB4dGlkICkgICAgICgoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYmxvY2t0aW1lKQorI2RlZmluZSBnZXRfX2J0X3NldCggeHRlYW0sIHh0aWQgKSAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5idF9zZXQpCisjZGVmaW5lIGdldF9fYnRfaW50ZXJ2YWxzKCB4dGVhbSwgeHRpZCApICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X2ludGVydmFscykKKworI2RlZmluZSBnZXRfX25lc3RlZF8yKHh0ZWFtLHh0aWQpICAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5uZXN0ZWQpCisjZGVmaW5lIGdldF9fZHluYW1pY18yKHh0ZWFtLHh0aWQpICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmR5bmFtaWMpCisjZGVmaW5lIGdldF9fbnByb2NfMih4dGVhbSx4dGlkKSAgICAgICAgICAoKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jKQorI2RlZmluZSBnZXRfX3NjaGVkXzIoeHRlYW0seHRpZCkgICAgICAgICAgKCh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5zY2hlZCkKKworI2RlZmluZSBzZXRfX2Jsb2NrdGltZV90ZWFtKCB4dGVhbSwgeHRpZCwgeHZhbCApIFwKKyAgICAgICAgKCAoICh4dGVhbSktPnQudF90aHJlYWRzWyh4dGlkKV0tPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ibG9ja3RpbWUgKSAgICA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggeHRlYW0sIHh0aWQsIHh2YWwgKSBcCisgICAgICAgICggKCAoeHRlYW0pLT50LnRfdGhyZWFkc1soeHRpZCldLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuYnRfaW50ZXJ2YWxzICkgPSAoeHZhbCkgKQorCisjZGVmaW5lIHNldF9fYnRfc2V0X3RlYW0oIHh0ZWFtLCB4dGlkLCB4dmFsICkgXAorICAgICAgICAoICggKHh0ZWFtKS0+dC50X3RocmVhZHNbKHh0aWQpXS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLmJ0X3NldCApICAgICAgID0gKHh2YWwpICkKKworCisjZGVmaW5lIHNldF9fbmVzdGVkKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubmVzdGVkICkgPSAoeHZhbCkgKQorI2RlZmluZSBnZXRfX25lc3RlZCggeHRocmVhZCApIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5lc3RlZCApID8gKEZUTl9UUlVFKSA6IChGVE5fRkFMU0UpICkKKworI2RlZmluZSBzZXRfX2R5bmFtaWMoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljICkgPSAoeHZhbCkgKQorI2RlZmluZSBnZXRfX2R5bmFtaWMoIHh0aHJlYWQgKSBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5keW5hbWljICkgPyAoRlROX1RSVUUpIDogKEZUTl9GQUxTRSkgKQorCisjZGVmaW5lIHNldF9fbnByb2MoIHh0aHJlYWQsIHh2YWwgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyApID0gKHh2YWwpICkKKworI2RlZmluZSBzZXRfX21heF9hY3RpdmVfbGV2ZWxzKCB4dGhyZWFkLCB4dmFsICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoICggKHh0aHJlYWQpLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubWF4X2FjdGl2ZV9sZXZlbHMgKSA9ICh4dmFsKSApCisKKyNkZWZpbmUgc2V0X19zY2hlZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkICkgPSAoeHZhbCkgKQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworI2RlZmluZSBzZXRfX3Byb2NfYmluZCggeHRocmVhZCwgeHZhbCApICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKCAoeHRocmVhZCktPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5wcm9jX2JpbmQgKSA9ICh4dmFsKSApCisjZGVmaW5lIGdldF9fcHJvY19iaW5kKCB4dGhyZWFkICkgXAorICAgICAgICAoICh4dGhyZWFkKS0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCApCisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3Blbk1QIHRhc2tpbmcgZGF0YSBzdHJ1Y3R1cmVzCisvLworCit0eXBlZGVmIGVudW0ga21wX3Rhc2tpbmdfbW9kZSB7CisgICAgdHNrbV9pbW1lZGlhdGVfZXhlYyA9IDAsCisgICAgdHNrbV9leHRyYV9iYXJyaWVyID0gMSwKKyAgICB0c2ttX3Rhc2tfdGVhbXMgPSAyLAorICAgIHRza21fbWF4ID0gMgorfSBrbXBfdGFza2luZ19tb2RlX3Q7CisKK2V4dGVybiBrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlOyAgICAgICAgIC8qIGRldGVybWluZXMgaG93L3doZW4gdG8gZXhlY3V0ZSB0YXNrcyAqLworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQ7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX21heF90YXNrX3ByaW9yaXR5OyAvLyBTZXQgdmlhIE9NUF9NQVhfVEFTS19QUklPUklUWSBpZiBzcGVjaWZpZWQsIGRlZmF1bHRzIHRvIDAgb3RoZXJ3aXNlCisjZW5kaWYKKworLyogTk9URToga21wX3Rhc2tkYXRhX3QgYW5kIGttcF90YXNrX3Qgc3RydWN0dXJlcyBhbGxvY2F0ZWQgaW4gc2luZ2xlIGJsb2NrIHdpdGggdGFza2RhdGEgZmlyc3QgKi8KKyNkZWZpbmUgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgICAgICgoKGttcF90YXNrZGF0YV90ICopIHRhc2spIC0gMSkKKyNkZWZpbmUgS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpIChrbXBfdGFza190ICopICh0YXNrZGF0YSArIDEpCisKKy8vIFRoZSB0dF9mb3VuZF90YXNrcyBmbGFnIGlzIGEgc2lnbmFsIHRvIGFsbCB0aHJlYWRzIGluIHRoZSB0ZWFtIHRoYXQgdGFza3Mgd2VyZSBzcGF3bmVkIGFuZAorLy8gcXVldWVkIHNpbmNlIHRoZSBwcmV2aW91cyBiYXJyaWVyIHJlbGVhc2UuCisjZGVmaW5lIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSBcCisgICAgKFRDUl9TWU5DXzQoKHRhc2tfdGVhbSktPnR0LnR0X2ZvdW5kX3Rhc2tzKSA9PSBUUlVFKQorLyohCitAaW5ncm91cCBCQVNJQ19UWVBFUworQHsKKyovCisKKy8qIQorICovCit0eXBlZGVmIGttcF9pbnQzMiAoKiBrbXBfcm91dGluZV9lbnRyeV90KSgga21wX2ludDMyLCB2b2lkICogKTsKKworI2lmIE9NUF80MF9FTkFCTEVEIHx8IE9NUF80NV9FTkFCTEVECit0eXBlZGVmIHVuaW9uIGttcF9jbXBscmRhdGEgeworI2lmIE9NUF80NV9FTkFCTEVECisgICAga21wX2ludDMyICAgICAgICAgICBwcmlvcml0eTsgICAgICAgICAgIC8qKjwgcHJpb3JpdHkgc3BlY2lmaWVkIGJ5IHVzZXIgZm9yIHRoZSB0YXNrICovCisjZW5kaWYgLy8gT01QXzQ1X0VOQUJMRUQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgZGVzdHJ1Y3RvcnM7ICAgICAgICAvKiBwb2ludGVyIHRvIGZ1bmN0aW9uIHRvIGludm9rZSBkZWNvbnN0cnVjdG9ycyBvZiBmaXJzdHByaXZhdGUgQysrIG9iamVjdHMgKi8KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorICAgIC8qIGZ1dHVyZSBkYXRhICovCit9IGttcF9jbXBscmRhdGFfdDsKKyNlbmRpZgorCisvKiAgc2l6ZW9mX2ttcF90YXNrX3QgcGFzc2VkIGFzIGFyZyB0byBrbXBjX29tcF90YXNrIGNhbGwgICovCisvKiEKKyAqLwordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2sgeyAgICAgICAgICAgICAgICAgICAvKiBHRUg6IFNob3VsZG4ndCB0aGlzIGJlIGFsaWduZWQgc29tZWhvdz8gKi8KKyAgICB2b2lkICogICAgICAgICAgICAgIHNoYXJlZHM7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIGJsb2NrIG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJzICAgKi8KKyAgICBrbXBfcm91dGluZV9lbnRyeV90IHJvdXRpbmU7ICAgICAgICAgICAgLyoqPCBwb2ludGVyIHRvIHJvdXRpbmUgdG8gY2FsbCBmb3IgZXhlY3V0aW5nIHRhc2sgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgIHBhcnRfaWQ7ICAgICAgICAgICAgLyoqPCBwYXJ0IGlkIGZvciB0aGUgdGFzayAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRCB8fCBPTVBfNDVfRU5BQkxFRAorICAgIGttcF9jbXBscmRhdGFfdCBkYXRhMTsgICAgICAgICAgICAgICAgICAvKiBUd28ga25vd24gb3B0aW9uYWwgYWRkaXRpb25zOiBkZXN0cnVjdG9ycyBhbmQgcHJpb3JpdHkgKi8KKyAgICBrbXBfY21wbHJkYXRhX3QgZGF0YTI7ICAgICAgICAgICAgICAgICAgLyogUHJvY2VzcyBkZXN0cnVjdG9ycyBmaXJzdCwgcHJpb3JpdHkgc2Vjb25kICovCisgICAgLyogZnV0dXJlIGRhdGEgKi8KKyNlbmRpZgorICAgIC8qICBwcml2YXRlIHZhcnMgICovCit9IGttcF90YXNrX3Q7CisKKy8qIQorQH0KKyovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAordHlwZWRlZiBzdHJ1Y3Qga21wX3Rhc2tncm91cCB7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNvdW50OyAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgY2FuY2VsX3JlcXVlc3Q7IC8vIHJlcXVlc3QgZm9yIGNhbmNlbGxhdGlvbiBvZiB0aGlzIHRhc2tncm91cAorICAgIHN0cnVjdCBrbXBfdGFza2dyb3VwICpwYXJlbnQ7ICAvLyBwYXJlbnQgdGFza2dyb3VwCit9IGttcF90YXNrZ3JvdXBfdDsKKworCisvLyBmb3J3YXJkIGRlY2xhcmF0aW9ucwordHlwZWRlZiB1bmlvbiBrbXBfZGVwbm9kZSAgICAgICBrbXBfZGVwbm9kZV90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcG5vZGVfbGlzdCAga21wX2RlcG5vZGVfbGlzdF90OwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2hfZW50cnkga21wX2RlcGhhc2hfZW50cnlfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGVuZF9pbmZvIHsKKyAgICAga21wX2ludHB0cl90ICAgICAgICAgICAgICAgYmFzZV9hZGRyOworICAgICBzaXplX3QgICAgICAgICAgICAgICAgICAgICBsZW47CisgICAgIHN0cnVjdCB7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIGluOjE7CisgICAgICAgICBib29sICAgICAgICAgICAgICAgICAgIG91dDoxOworICAgICB9IGZsYWdzOworfSBrbXBfZGVwZW5kX2luZm9fdDsKKworc3RydWN0IGttcF9kZXBub2RlX2xpc3QgeworICAga21wX2RlcG5vZGVfdCAqICAgICAgICAgICAgICBub2RlOworICAga21wX2RlcG5vZGVfbGlzdF90ICogICAgICAgICBuZXh0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZGVwbm9kZSB7CisgICAga21wX2RlcG5vZGVfbGlzdF90ICAgICAgICAqIHN1Y2Nlc3NvcnM7CisgICAga21wX3Rhc2tfdCAgICAgICAgICAgICAgICAqIHRhc2s7CisKKyAgICBrbXBfbG9ja190ICAgICAgICAgICAgICAgICAgbG9jazsKKworI2lmIEtNUF9TVVBQT1JUX0dSQVBIX09VVFBVVAorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgICBpZDsKKyNlbmRpZgorCisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5wcmVkZWNlc3NvcnM7CisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgICAgIG5yZWZzOworfSBrbXBfYmFzZV9kZXBub2RlX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZGVwbm9kZSB7CisgICAgZG91YmxlICAgICAgICAgIGRuX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgIGRuX3BhZFsgS01QX1BBRChrbXBfYmFzZV9kZXBub2RlX3QsIENBQ0hFX0xJTkUpIF07CisgICAga21wX2Jhc2VfZGVwbm9kZV90IGRuOworfTsKKworc3RydWN0IGttcF9kZXBoYXNoX2VudHJ5IHsKKyAgICBrbXBfaW50cHRyX3QgICAgICAgICAgICAgICBhZGRyOworICAgIGttcF9kZXBub2RlX3QgICAgICAgICAgICAqIGxhc3Rfb3V0OworICAgIGttcF9kZXBub2RlX2xpc3RfdCAgICAgICAqIGxhc3RfaW5zOworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgICAgICAqIG5leHRfaW5fYnVja2V0OworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2RlcGhhc2ggeworICAga21wX2RlcGhhc2hfZW50cnlfdCAgICAgKiogYnVja2V0czsKKyAgIHNpemVfdAkJICAgICAgc2l6ZTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5lbGVtZW50czsKKyAgIGttcF91aW50MzIgICAgICAgICAgICAgICAgIG5jb25mbGljdHM7CisjZW5kaWYKK30ga21wX2RlcGhhc2hfdDsKKworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKworLyogVGllZCBUYXNrIHN0YWNrIGRlZmluaXRpb25zICovCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgeworICAgIGttcF90YXNrZGF0YV90ICogICAgICAgICAgc2JfYmxvY2tbIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSBdOworICAgIHN0cnVjdCBrbXBfc3RhY2tfYmxvY2sgKiAgc2JfbmV4dDsKKyAgICBzdHJ1Y3Qga21wX3N0YWNrX2Jsb2NrICogIHNiX3ByZXY7Cit9IGttcF9zdGFja19ibG9ja190OworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGFza19zdGFjayB7CisgICAga21wX3N0YWNrX2Jsb2NrX3QgICAgICAgICB0c19maXJzdF9ibG9jazsgIC8vIGZpcnN0IGJsb2NrIG9mIHN0YWNrIGVudHJpZXMKKyAgICBrbXBfdGFza2RhdGFfdCAqKiAgICAgICAgIHRzX3RvcDsgICAgICAgICAgLy8gcG9pbnRlciB0byB0aGUgdG9wIG9mIHN0YWNrCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICB0c19lbnRyaWVzOyAgICAgIC8vIG51bWJlciBvZiBlbnRyaWVzIG9uIHRoZSBzdGFjaworfSBrbXBfdGFza19zdGFja190OworCisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisKK3R5cGVkZWYgc3RydWN0IGttcF90YXNraW5nX2ZsYWdzIHsgICAgICAgICAgLyogVG90YWwgc3RydWN0IG11c3QgYmUgZXhhY3RseSAzMiBiaXRzICovCisgICAgLyogQ29tcGlsZXIgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgIC8qIFRvdGFsIGNvbXBpbGVyIGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRpZWRuZXNzICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciB0aWVkICgxKSBvciB1bnRpZWQgKDApICovCisgICAgdW5zaWduZWQgZmluYWwgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIHRhc2sgaXMgZmluYWwoMSkgc28gZXhlY3V0ZSBpbW1lZGlhdGVseSAqLworICAgIHVuc2lnbmVkIG1lcmdlZF9pZjAgIDogMTsgICAgICAgICAgICAgICAvKiBubyBfX2ttcGNfdGFza197YmVnaW4vY29tcGxldGV9X2lmMCBjYWxscyBpbiBpZjAgY29kZSBwYXRoICovCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB1bnNpZ25lZCBkZXN0cnVjdG9yc190aHVuayA6IDE7ICAgICAgICAgLyogc2V0IGlmIHRoZSBjb21waWxlciBjcmVhdGVzIGEgdGh1bmsgdG8gaW52b2tlIGRlc3RydWN0b3JzIGZyb20gdGhlIHJ1bnRpbWUgKi8KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHVuc2lnbmVkIHByb3h5ICAgICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGEgcHJveHkgdGFzayAoaXQgd2lsbCBiZSBleGVjdXRlZCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRoZSBSVEwpICovCisgICAgdW5zaWduZWQgcHJpb3JpdHlfc3BlY2lmaWVkIDoxOyAgICAgICAgIC8qIHNldCBpZiB0aGUgY29tcGlsZXIgcHJvdmlkZXMgcHJpb3JpdHkgc2V0dGluZyBmb3IgdGhlIHRhc2sgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZCAgICA6IDEwOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyIHVzZSAqLworI2Vsc2UKKyAgICB1bnNpZ25lZCByZXNlcnZlZCAgICA6IDEyOyAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGNvbXBpbGVyIHVzZSAqLworI2VuZGlmCisjZWxzZSAvLyBPTVBfNDBfRU5BQkxFRAorICAgIHVuc2lnbmVkIHJlc2VydmVkICAgIDogMTM7ICAgICAgICAgICAgICAvKiByZXNlcnZlZCBmb3IgY29tcGlsZXIgdXNlICovCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8qIExpYnJhcnkgZmxhZ3MgKi8gICAgICAgICAgICAgICAgICAgICAvKiBUb3RhbCBsaWJyYXJ5IGZsYWdzIG11c3QgYmUgMTYgYml0cyAqLworICAgIHVuc2lnbmVkIHRhc2t0eXBlICAgIDogMTsgICAgICAgICAgICAgICAvKiB0YXNrIGlzIGVpdGhlciBleHBsaWNpdCgxKSBvciBpbXBsaWNpdCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNrX3NlcmlhbCA6IDE7ICAgICAgICAgICAgICAgLyogdGhpcyB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5ICgxKSBvciBkZWZlcnJlZCAoMCkgKi8KKyAgICB1bnNpZ25lZCB0YXNraW5nX3NlciA6IDE7ICAgICAgICAgICAgICAgLyogYWxsIHRhc2tzIGluIHRlYW0gYXJlIGVpdGhlciBleGVjdXRlZCBpbW1lZGlhdGVseSAoMSkgb3IgbWF5IGJlIGRlZmVycmVkICgwKSAqLworICAgIHVuc2lnbmVkIHRlYW1fc2VyaWFsIDogMTsgICAgICAgICAgICAgICAvKiBlbnRpcmUgdGVhbSBpcyBzZXJpYWwgKDEpIFsxIHRocmVhZF0gb3IgcGFyYWxsZWwgKDApIFs+PSAyIHRocmVhZHNdICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIElmIGVpdGhlciB0ZWFtX3NlcmlhbCBvciB0YXNraW5nX3NlciBpcyBzZXQsIHRhc2sgdGVhbSBtYXkgYmUgTlVMTCAqLworICAgIC8qIFRhc2sgU3RhdGUgRmxhZ3M6ICovCisgICAgdW5zaWduZWQgc3RhcnRlZCAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PXN0YXJ0ZWQsIDA9PW5vdCBzdGFydGVkICAgICAqLworICAgIHVuc2lnbmVkIGV4ZWN1dGluZyAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1leGVjdXRpbmcsIDA9PW5vdCBleGVjdXRpbmcgKi8KKyAgICB1bnNpZ25lZCBjb21wbGV0ZSAgICA6IDE7ICAgICAgICAgICAgICAgLyogMT09Y29tcGxldGUsIDA9PW5vdCBjb21wbGV0ZSAgICovCisgICAgdW5zaWduZWQgZnJlZWQgICAgICAgOiAxOyAgICAgICAgICAgICAgIC8qIDE9PWZyZWVkLCAwPT1hbGxvY2F0ZWVkICAgICAgICAqLworICAgIHVuc2lnbmVkIG5hdGl2ZSAgICAgIDogMTsgICAgICAgICAgICAgICAvKiAxPT1nY2MtY29tcGlsZWQgdGFzaywgMD09aW50ZWwgKi8KKyAgICB1bnNpZ25lZCByZXNlcnZlZDMxICA6IDc7ICAgICAgICAgICAgICAgLyogcmVzZXJ2ZWQgZm9yIGxpYnJhcnkgdXNlICovCisKK30ga21wX3Rhc2tpbmdfZmxhZ3NfdDsKKworCitzdHJ1Y3Qga21wX3Rhc2tkYXRhIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbGlnbmVkIGR1cmluZyBkeW5hbWljIGFsbG9jYXRpb24gICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrX2lkOyAgICAgICAgICAgICAgIC8qIGlkLCBhc3NpZ25lZCBieSBkZWJ1Z2dlciAgICAgICAgICAgICAgICAqLworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgICAgIHRkX2ZsYWdzOyAgICAgICAgICAgICAgICAgLyogdGFzayBmbGFncyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX3RlYW1fdCAqICAgICAgICAgICAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAvKiB0ZWFtIGZvciB0aGlzIHRhc2sgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF9hbGxvY190aHJlYWQ7ICAgICAgICAgIC8qIHRocmVhZCB0aGF0IGFsbG9jYXRlZCBkYXRhIHN0cnVjdHVyZXMgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ3VycmVudGx5IG5vdCB1c2VkIGV4Y2VwdCBmb3IgcGVyaGFwcyBJREIgKi8KKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgICB0ZF9wYXJlbnQ7ICAgICAgICAgICAgICAgIC8qIHBhcmVudCB0YXNrICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2xldmVsOyAgICAgICAgICAgICAgICAgLyogdGFzayBuZXN0aW5nIGxldmVsICAgICAgICAgICAgICAgICAgICAgICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfdW50aWVkX2NvdW50OyAgICAgICAgICAvKiB1bnRpZWQgdGFzayBhY3RpdmUgcGFydHMgY291bnRlciAgICAgICAgKi8KKyAgICBpZGVudF90ICogICAgICAgICAgICAgICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgIC8qIHRhc2sgaWRlbnRpZmllciAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRhc2t3YWl0IGRhdGEuCisgICAgaWRlbnRfdCAqICAgICAgICAgICAgICAgdGRfdGFza3dhaXRfaWRlbnQ7CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgdGRfdGFza3dhaXRfY291bnRlcjsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgIC8qIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfaW50ZXJuYWxfY29udHJvbF90ICB0ZF9pY3ZzOyAgLyogSW50ZXJuYWwgY29udHJvbCB2YXJpYWJsZXMgZm9yIHRoZSB0YXNrICovCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlIGttcF91aW50MzIgdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzOyAgLyogQ2hpbGQgdGFza3MgKCsgY3VycmVudCB0YXNrKSBub3QgeWV0IGRlYWxsb2NhdGVkICovCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrczsgLyogQ2hpbGQgdGFza3Mgbm90IHlldCBjb21wbGV0ZSAqLworI2lmIE9NUF80MF9FTkFCTEVECisgICAga21wX3Rhc2tncm91cF90ICogICAgICAgdGRfdGFza2dyb3VwOyAgICAgICAgIC8vIEVhY2ggdGFzayBrZWVwcyBwb2ludGVyIHRvIGl0cyBjdXJyZW50IHRhc2tncm91cAorICAgIGttcF9kZXBoYXNoX3QgKiAgICAgICAgIHRkX2RlcGhhc2g7ICAgICAgICAgICAvLyBEZXBlbmRlbmNpZXMgZm9yIGNoaWxkcmVuIHRhc2tzIGFyZSB0cmFja2VkIGZyb20gaGVyZQorICAgIGttcF9kZXBub2RlX3QgKiAgICAgICAgIHRkX2RlcG5vZGU7ICAgICAgICAgICAvLyBQb2ludGVyIHRvIGdyYXBoIG5vZGUgaWYgdGhpcyB0YXNrIGhhcyBkZXBlbmRlbmNpZXMKKyNlbmRpZgorI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGFza19pbmZvX3QgICAgICAgIG9tcHRfdGFza19pbmZvOworI2VuZGlmCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgICB0ZF90YXNrX3RlYW07CisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdGRfc2l6ZV9hbGxvYzsgICAgICAgIC8vIFRoZSBzaXplIG9mIHRhc2sgc3RydWN0dXJlLCBpbmNsdWRpbmcgc2hhcmVkcyBldGMuCisjZW5kaWYKK307IC8vIHN0cnVjdCBrbXBfdGFza2RhdGEKKworLy8gTWFrZSBzdXJlIHBhZGRpbmcgYWJvdmUgd29ya2VkCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICUgc2l6ZW9mKHZvaWQgKikgPT0gMCApOworCisvLyBEYXRhIGZvciB0YXNrIHRlYW0gYnV0IHBlciB0aHJlYWQKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfaW5mb19wICogICAgICAgICAgICB0ZF90aHI7ICAgICAgICAgICAgICAgIC8vIFBvaW50ZXIgYmFjayB0byB0aHJlYWQgaW5mbworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVXNlZCBvbmx5IGluIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUsIG1heWJlIG5vdCBhdmFpbCB1bnRpbCB0YXNrIGlzIHF1ZXVlZD8KKyAgICBrbXBfYm9vdHN0cmFwX2xvY2tfdCAgICB0ZF9kZXF1ZV9sb2NrOyAgICAgICAgIC8vIExvY2sgZm9yIGFjY2Vzc2luZyBkZXF1ZQorICAgIGttcF90YXNrZGF0YV90ICoqICAgICAgIHRkX2RlcXVlOyAgICAgICAgICAgICAgLy8gRGVxdWUgb2YgdGFza3MgZW5jb3VudGVyZWQgYnkgdGRfdGhyLCBkeW5hbWljYWxseSBhbGxvY2F0ZWQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9zaXplOyAgICAgICAgIC8vIFNpemUgb2YgZGVjaworICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX2hlYWQ7ICAgICAgICAgLy8gSGVhZCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgIHRkX2RlcXVlX3RhaWw7ICAgICAgICAgLy8gVGFpbCBvZiBkZXF1ZSAod2lsbCB3cmFwKQorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHRkX2RlcXVlX250YXNrczsgICAgICAgLy8gTnVtYmVyIG9mIHRhc2tzIGluIGRlcXVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBHRUg6IHNob3VsZG4ndCB0aGlzIGJlIHZvbGF0aWxlIHNpbmNlIHVzZWQgaW4gd2hpbGUtc3Bpbj8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0ZF9kZXF1ZV9sYXN0X3N0b2xlbjsgIC8vIFRocmVhZCBudW1iZXIgb2YgbGFzdCBzdWNjZXNzZnVsIHN0ZWFsCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAga21wX3Rhc2tfc3RhY2tfdCAgICAgICAgdGRfc3VzcF90aWVkX3Rhc2tzOyAgICAvLyBTdGFjayBvZiBzdXNwZW5kZWQgdGllZCB0YXNrcyBmb3IgdGFzayBzY2hlZHVsaW5nIGNvbnN0cmFpbnQKKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKK30ga21wX2Jhc2VfdGhyZWFkX2RhdGFfdDsKKworI2RlZmluZSBUQVNLX0RFUVVFX0JJVFMgICAgICAgICAgOCAgLy8gVXNlZCBzb2xlbHkgdG8gZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFCisjZGVmaW5lIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFICAoIDEgPDwgVEFTS19ERVFVRV9CSVRTICkKKworI2RlZmluZSBUQVNLX0RFUVVFX1NJWkUodGQpICAgICAoKHRkKS50ZF9kZXF1ZV9zaXplKQorI2RlZmluZSBUQVNLX0RFUVVFX01BU0sodGQpICAgICAoKHRkKS50ZF9kZXF1ZV9zaXplIC0gMSkKKwordHlwZWRlZiB1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3RocmVhZF9kYXRhIHsKKyAgICBrbXBfYmFzZV90aHJlYWRfZGF0YV90ICB0ZDsKKyAgICBkb3VibGUgICAgICAgICAgICAgICAgICB0ZF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgdGRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIENBQ0hFX0xJTkUpIF07Cit9IGttcF90aHJlYWRfZGF0YV90OworCisKKy8vIERhdGEgZm9yIHRhc2sgdGVhbXMgd2hpY2ggYXJlIHVzZWQgd2hlbiB0YXNraW5nIGlzIGVuYWJsZWQgZm9yIHRoZSB0ZWFtCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNrX3RlYW0geworICAgIGttcF9ib290c3RyYXBfbG9ja190ICAgIHR0X3RocmVhZHNfbG9jazsgICAgICAgLyogTG9jayB1c2VkIHRvIGFsbG9jYXRlIHBlci10aHJlYWQgcGFydCBvZiB0YXNrIHRlYW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgYmUgYm9vdHN0cmFwIGxvY2sgc2luY2UgdXNlZCBhdCBsaWJyYXJ5IHNodXRkb3duKi8KKyAgICBrbXBfdGFza190ZWFtX3QgKiAgICAgICB0dF9uZXh0OyAgICAgICAgICAgICAgIC8qIEZvciBsaW5raW5nIHRoZSB0YXNrIHRlYW0gZnJlZSBsaXN0ICovCisgICAga21wX3RocmVhZF9kYXRhX3QgKiAgICAgdHRfdGhyZWFkc19kYXRhOyAgICAgICAvKiBBcnJheSBvZiBwZXItdGhyZWFkIHN0cnVjdHVyZXMgZm9yIHRhc2sgdGVhbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogRGF0YSBzdXJ2aXZlcyB0YXNrIHRlYW0gZGVhbGxvY2F0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgdHRfZm91bmRfdGFza3M7ICAgICAgICAvKiBIYXZlIHdlIGZvdW5kIHRhc2tzIGFuZCBxdWV1ZWQgdGhlbSB3aGlsZSBleGVjdXRpbmcgdGhpcyB0ZWFtPyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVFJVRSBtZWFucyB0dF90aHJlYWRzX2RhdGEgaXMgc2V0IHVwIGFuZCBpbml0aWFsaXplZCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIHR0X25wcm9jOyAgICAgICAgICAgICAgLyogI3RocmVhZHMgaW4gdGVhbSAgICAgICAgICAgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9tYXhfdGhyZWFkczsgICAgICAgIC8qIG51bWJlciBvZiBlbnRyaWVzIGFsbG9jYXRlZCBmb3IgdGhyZWFkc19kYXRhIGFycmF5ICovCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICB0dF9mb3VuZF9wcm94eV90YXNrczsgIC8qIEhhdmUgd2UgZm91bmQgcHJveHkgdGFza3Mgc2luY2UgbGFzdCBiYXJyaWVyICovCisjZW5kaWYKKworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHR0X3VuZmluaXNoZWRfdGhyZWFkczsgLyogI3RocmVhZHMgc3RpbGwgYWN0aXZlICAgICAgKi8KKworICAgIEtNUF9BTElHTl9DQUNIRQorICAgIHZvbGF0aWxlIGttcF91aW50MzIgICAgIHR0X2FjdGl2ZTsgICAgICAgICAgICAgLyogaXMgdGhlIHRlYW0gc3RpbGwgYWN0aXZlbHkgZXhlY3V0aW5nIHRhc2tzICovCit9IGttcF9iYXNlX3Rhc2tfdGVhbV90OworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3Rhc2tfdGVhbSB7CisgICAga21wX2Jhc2VfdGFza190ZWFtX3QgdHQ7CisgICAgZG91YmxlICAgICAgICAgICAgICAgdHRfYWxpZ247ICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgIHR0X3BhZFsgS01QX1BBRChrbXBfYmFzZV90YXNrX3RlYW1fdCwgQ0FDSEVfTElORSkgXTsKK307CisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisvLyBGcmVlIGxpc3RzIGtlZXAgc2FtZS1zaXplIGZyZWUgbWVtb3J5IHNsb3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCit0eXBlZGVmIHN0cnVjdCBrbXBfZnJlZV9saXN0IHsKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc2VsZjsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBmcmVlIGxpc3QKKyAgICB2b2lkICAgICAgICAgICAgICp0aF9mcmVlX2xpc3Rfc3luYzsgICAvLyBTZWxmLWFsbG9jYXRlZCB0YXNrcyBzdG9sZW4vcmV0dXJuZWQgYnkgb3RoZXIgdGhyZWFkcworICAgIHZvaWQgICAgICAgICAgICAgKnRoX2ZyZWVfbGlzdF9vdGhlcjsgIC8vIE5vbi1zZWxmIGZyZWUgbGlzdCAodG8gYmUgcmV0dXJuZWQgdG8gb3duZXIncyBzeW5jIGxpc3QpCit9IGttcF9mcmVlX2xpc3RfdDsKKyNlbmRpZgorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisvLyBIb3QgdGVhbXMgYXJyYXkga2VlcHMgaG90IHRlYW1zIGFuZCB0aGVpciBzaXplcyBmb3IgZ2l2ZW4gdGhyZWFkLgorLy8gSG90IHRlYW1zIGFyZSBub3QgcHV0IGluIHRlYW1zIHBvb2wsIGFuZCB0aGV5IGRvbid0IHB1dCB0aHJlYWRzIGluIHRocmVhZHMgcG9vbC4KK3R5cGVkZWYgc3RydWN0IGttcF9ob3RfdGVhbV9wdHIgeworICAgIGttcF90ZWFtX3AgKmhvdF90ZWFtOyAgICAgIC8vIHBvaW50ZXIgdG8gaG90X3RlYW0gb2YgZ2l2ZW4gbmVzdGluZyBsZXZlbAorICAgIGttcF9pbnQzMiAgIGhvdF90ZWFtX250aDsgIC8vIG51bWJlciBvZiB0aHJlYWRzIGFsbG9jYXRlZCBmb3IgdGhlIGhvdF90ZWFtCit9IGttcF9ob3RfdGVhbV9wdHJfdDsKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbXNfc2l6ZSB7CisgICAga21wX2ludDMyICAgbnRlYW1zOyAgICAgICAgLy8gbnVtYmVyIG9mIHRlYW1zIGluIGEgbGVhZ3VlCisgICAga21wX2ludDMyICAgbnRoOyAgICAgICAgICAgLy8gbnVtYmVyIG9mIHRocmVhZHMgaW4gZWFjaCB0ZWFtIG9mIHRoZSBsZWFndWUKK30ga21wX3RlYW1zX3NpemVfdDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIE9wZW5NUCB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmVzCisvLworCit0eXBlZGVmIHN0cnVjdCBLTVBfQUxJR05fQ0FDSEUga21wX2Jhc2VfaW5mbyB7CisvKgorICogU3RhcnQgd2l0aCB0aGUgcmVhZG9ubHkgZGF0YSB3aGljaCBpcyBjYWNoZSBhbGlnbmVkIGFuZCBwYWRkZWQuCisgKiB0aGlzIGlzIHdyaXR0ZW4gYmVmb3JlIHRoZSB0aHJlYWQgc3RhcnRzIHdvcmtpbmcgYnkgdGhlIG1hc3Rlci4KKyAqICh1YmVyIG1hc3RlcnMgbWF5IHVwZGF0ZSB0aGVtc2VsdmVzIGxhdGVyKQorICogKHVzYWdlIGRvZXMgbm90IGNvbnNpZGVyIHNlcmlhbGl6ZWQgcmVnaW9ucykKKyAqLworICAgIGttcF9kZXNjX3QgICAgICAgIHRoX2luZm87CisgICAga21wX3RlYW1fcCAgICAgICAqdGhfdGVhbTsgICAgICAgLyogdGVhbSB3ZSBiZWxvbmcgdG8gKi8KKyAgICBrbXBfcm9vdF9wICAgICAgICp0aF9yb290OyAgICAgICAvKiBwb2ludGVyIHRvIHJvb3Qgb2YgdGFzayBoaWVyYXJjaHkgKi8KKyAgICBrbXBfaW5mb19wICAgICAgICp0aF9uZXh0X3Bvb2w7ICAvKiBuZXh0IGF2YWlsYWJsZSB0aHJlYWQgaW4gdGhlIHBvb2wgKi8KKyAgICBrbXBfZGlzcF90ICAgICAgICp0aF9kaXNwYXRjaDsgICAvKiB0aHJlYWQncyBkaXNwYXRjaCBkYXRhICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfaW5fcG9vbDsgICAgLyogaW4gdGhyZWFkIHBvb2wgKDMyIGJpdHMgZm9yIFRDUi9UQ1cpICovCisKKyAgICAvKiBUaGUgZm9sbG93aW5nIGFyZSBjYWNoZWQgZnJvbSB0aGUgdGVhbSBpbmZvIHN0cnVjdHVyZSAqLworICAgIC8qIFRPRE8gdXNlIHRoZXNlIGluIG1vcmUgcGxhY2VzIGFzIGRldGVybWluZWQgdG8gYmUgbmVlZGVkIHZpYSBwcm9maWxpbmcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtX25wcm9jOyAgICAgIC8qIG51bWJlciBvZiB0aHJlYWRzIGluIGEgdGVhbSAqLworICAgIGttcF9pbmZvX3AgICAgICAgKnRoX3RlYW1fbWFzdGVyOyAgICAgLyogdGhlIHRlYW0ncyBtYXN0ZXIgdGhyZWFkICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9zZXJpYWxpemVkOyAvKiB0ZWFtIGlzIHNlcmlhbGl6ZWQgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG1pY3JvdGFza190ICAgICAgIHRoX3RlYW1zX21pY3JvdGFzazsgLyogc2F2ZSBlbnRyeSBhZGRyZXNzIGZvciB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICBpbnQgICAgICAgICAgICAgICB0aF90ZWFtc19sZXZlbDsgICAgIC8qIHNhdmUgaW5pdGlhbCBsZXZlbCBvZiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGl0IGlzIDAgb24gZGV2aWNlIGJ1dCBtYXkgYmUgYW55IG9uIGhvc3QgKi8KKyNlbmRpZgorCisgICAgLyogVGhlIGJsb2NrdGltZSBpbmZvIGlzIGNvcGllZCBmcm9tIHRoZSB0ZWFtIHN0cnVjdCB0byB0aGUgdGhyZWFkIHNydWN0ICovCisgICAgLyogYXQgdGhlIHN0YXJ0IG9mIGEgYmFycmllciwgYW5kIHRoZSB2YWx1ZXMgc3RvcmVkIGluIHRoZSB0ZWFtIGFyZSB1c2VkICovCisgICAgLyogYXQgcG9pbnRzIGluIHRoZSBjb2RlIHdoZXJlIHRoZSB0ZWFtIHN0cnVjdCBpcyBubyBsb25nZXIgZ3VhcmFudGVlZCAgICovCisgICAgLyogdG8gZXhpc3QgKGZyb20gdGhlIFBPViBvZiB3b3JrZXIgdGhyZWFkcykuICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9idF9pbnRlcnZhbHM7CisgICAgaW50ICAgICAgICAgICAgICAgdGhfdGVhbV9idF9zZXQ7CisKKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBrbXBfYWZmaW5fbWFza190ICAqdGhfYWZmaW5fbWFzazsgLyogdGhyZWFkJ3MgY3VycmVudCBhZmZpbml0eSBtYXNrICovCisjZW5kaWYKKworLyoKKyAqIFRoZSBkYXRhIHNldCBieSB0aGUgbWFzdGVyIGF0IHJlaW5pdCwgdGhlbiBSL1cgYnkgdGhlIHdvcmtlcgorICovCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgdGhfc2V0X25wcm9jOyAgLyogaWYgPiAwLCB0aGVuIG9ubHkgdXNlIHRoaXMgcmVxdWVzdCBmb3IgdGhlIG5leHQgZm9yayAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAga21wX2hvdF90ZWFtX3B0cl90ICAgICAqdGhfaG90X3RlYW1zOyAgICAgLyogYXJyYXkgb2YgaG90IHRlYW1zICovCisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCAgICAgICAgIHRoX3NldF9wcm9jX2JpbmQ7IC8qIGlmICE9IHByb2NfYmluZF9kZWZhdWx0LCB1c2UgcmVxdWVzdCBmb3IgbmV4dCBmb3JrICovCisgICAga21wX3RlYW1zX3NpemVfdCAgICAgICAgdGhfdGVhbXNfc2l6ZTsgICAgLyogbnVtYmVyIG9mIHRlYW1zL3RocmVhZHMgaW4gdGVhbXMgY29uc3RydWN0ICovCisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9jdXJyZW50X3BsYWNlOyAvKiBwbGFjZSBjdXJyZW50bHkgYm91bmQgdG8gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9uZXdfcGxhY2U7ICAgICAvKiBwbGFjZSB0byBiaW5kIHRvIGluIHBhciByZWcgKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9maXJzdF9wbGFjZTsgICAvKiBmaXJzdCBwbGFjZSBpbiBwYXJ0aXRpb24gKi8KKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICB0aF9sYXN0X3BsYWNlOyAgICAvKiBsYXN0IHBsYWNlIGluIHBhcnRpdGlvbiAqLworIyBlbmRpZgorI2VuZGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF91aW50NjQgICAgICAgICAgICAgIHRoX2Jhcl9hcnJpdmVfdGltZTsgICAgICAgICAgIC8qIGFycml2YWwgdG8gYmFycmllciB0aW1lc3RhbXAgKi8KKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICB0aF9iYXJfbWluX3RpbWU7ICAgICAgICAgICAgICAvKiBtaW5pbXVtIGFycml2YWwgdGltZSBhdCB0aGUgYmFycmllciAqLworICAgIGttcF91aW50NjQgICAgICAgICAgICAgIHRoX2ZyYW1lX3RpbWU7ICAgICAgICAgICAgICAgIC8qIGZyYW1lIHRpbWVzdGFtcCAqLworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBrbXBfbG9jYWxfdCAgICAgICAgICAgICB0aF9sb2NhbDsKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gICp0aF9wcmlfaGVhZDsKKworLyoKKyAqIE5vdyB0aGUgZGF0YSBvbmx5IHVzZWQgYnkgdGhlIHdvcmtlciAoYWZ0ZXIgaW5pdGlhbCBhbGxvY2F0aW9uKQorICovCisgICAgLyogVE9ETyB0aGUgZmlyc3Qgc2VyaWFsIHRlYW0gc2hvdWxkIGFjdHVhbGx5IGJlIHN0b3JlZCBpbiB0aGUgaW5mb190CisgICAgICogc3RydWN0dXJlLiAgdGhpcyB3aWxsIGhlbHAgcmVkdWNlIGluaXRpYWwgYWxsb2NhdGlvbiBvdmVyaGVhZCAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbV9wICp0aF9zZXJpYWxfdGVhbTsgLypzZXJpYWxpemVkIHRlYW0gaGVsZCBpbiByZXNlcnZlKi8KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGhyZWFkX2luZm9fdCAgICAgIG9tcHRfdGhyZWFkX2luZm87CisjZW5kaWYKKworLyogVGhlIGZvbGxvd2luZyBhcmUgYWxzbyByZWFkIGJ5IHRoZSBtYXN0ZXIgZHVyaW5nIHJlaW5pdCAqLworICAgIHN0cnVjdCBjb21tb25fdGFibGUgICAgKnRoX3ByaV9jb21tb247CisKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICB0aF9zcGluX2hlcmU7ICAgLyogdGhyZWFkLWxvY2FsIGxvY2F0aW9uIGZvciBzcGlubmluZyAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiB3aGlsZSBhd2FpdGluZyBxdWV1aW5nIGxvY2sgYWNxdWlyZSAqLworCisgICAgdm9sYXRpbGUgdm9pZCAgICAgICAgICAqdGhfc2xlZXBfbG9jOyAgIC8vIHRoaXMgcG9pbnRzIGF0IGEga21wX2ZsYWc8VD4KKworICAgIGlkZW50X3QgICAgICAgICAgKnRoX2lkZW50OworICAgIHVuc2lnbmVkICAgICAgICAgdGhfeDsgICAgICAgICAgICAgICAgICAgICAvLyBSYW5kb20gbnVtYmVyIGdlbmVyYXRvciBkYXRhCisgICAgdW5zaWduZWQgICAgICAgICB0aF9hOyAgICAgICAgICAgICAgICAgICAgIC8vIFJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGRhdGEKKworLyoKKyAqIFRhc2tpbmctcmVsYXRlZCBkYXRhIGZvciB0aGUgdGhyZWFkCisgKi8KKyAgICBrbXBfdGFza190ZWFtX3QgICAgKiB0aF90YXNrX3RlYW07ICAgICAgICAgICAvLyBUYXNrIHRlYW0gc3RydWN0CisgICAga21wX3Rhc2tkYXRhX3QgICAgICogdGhfY3VycmVudF90YXNrOyAgICAgICAgLy8gSW5uZXJtb3N0IFRhc2sgYmVpbmcgZXhlY3V0ZWQKKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF90YXNrX3N0YXRlOyAgICAgICAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICAgIGttcF91aW50OCAgICAgICAgICAqIHRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjazsgIC8vIFN0YWNrIGhvbGRpbmcgbWVtb3Mgb2YgdGhfdGFza19zdGF0ZSBhdCBuZXN0ZWQgbGV2ZWxzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgdGhfdGFza19zdGF0ZV90b3A7ICAgICAgICAgLy8gVG9wIGVsZW1lbnQgb2YgdGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrCisgICAga21wX3VpbnQzMiAgICAgICAgICAgdGhfdGFza19zdGF0ZV9zdGFja19zejsgICAgLy8gU2l6ZSBvZiB0aF90YXNrX3N0YXRlX21lbW9fc3RhY2sKKworICAgIC8qCisgICAgICogTW9yZSBzdHVmZiBmb3Iga2VlcGluZyB0cmFjayBvZiBhY3RpdmUvc2xlZXBpbmcgdGhyZWFkcworICAgICAqICh0aGlzIHBhcnQgaXMgd3JpdHRlbiBieSB0aGUgd29ya2VyIHRocmVhZCkKKyAgICAgKi8KKyAgICBrbXBfdWludDggICAgICAgICAgICB0aF9hY3RpdmVfaW5fcG9vbDsgICAgICAvLyBpbmNsdWRlZCBpbiBjb3VudCBvZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICNhY3RpdmUgdGhyZWFkcyBpbiBwb29sCisgICAgaW50ICAgICAgICAgICAgICAgICAgdGhfYWN0aXZlOyAgICAgICAgICAgICAgLy8gISBzbGVlcGluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIDMyIGJpdHMgZm9yIFRDUi9UQ1cKKworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqIHRoX2NvbnM7IC8vIHVzZWQgZm9yIGNvbnNpc3RlbmN5IGNoZWNrCisKKy8qCisgKiBBZGQgdGhlIHN5bmNyb25pemluZyBkYXRhIHdoaWNoIGlzIGNhY2hlIGFsaWduZWQgYW5kIHBhZGRlZC4KKyAqLworICAgIEtNUF9BTElHTl9DQUNIRSBrbXBfYmFsaWduX3QgICAgICB0aF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworCisgICAgS01QX0FMSUdOX0NBQ0hFIHZvbGF0aWxlICAgICBrbXBfaW50MzIgICAgdGhfbmV4dF93YWl0aW5nOyAgLyogZ3RpZCsxIG9mIG5leHQgdGhyZWFkIG9uIGxvY2sgd2FpdCBxdWV1ZSwgMCBpZiBub25lICovCisKKyNpZiAoIFVTRV9GQVNUX01FTU9SWSA9PSAzICkgfHwgKCBVU0VfRkFTVF9NRU1PUlkgPT0gNSApCisgICAgI2RlZmluZSBOVU1fTElTVFMgNAorICAgIGttcF9mcmVlX2xpc3RfdCAgIHRoX2ZyZWVfbGlzdHNbTlVNX0xJU1RTXTsgICAvLyBGcmVlIGxpc3RzIGZvciBmYXN0IG1lbW9yeSBhbGxvY2F0aW9uIHJvdXRpbmVzCisjZW5kaWYKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAga21wX3dpbjMyX2NvbmRfdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfd2luMzJfbXV0ZXhfdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdDsKKyNlbmRpZgorI2lmIEtNUF9PU19VTklYCisgICAga21wX2NvbmRfYWxpZ25fdCAgdGhfc3VzcGVuZF9jdjsKKyAgICBrbXBfbXV0ZXhfYWxpZ25fdCB0aF9zdXNwZW5kX214OworICAgIGludCAgICAgICAgICAgICAgIHRoX3N1c3BlbmRfaW5pdF9jb3VudDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF9pdHRfbWFya190ICAgICAgICB0aF9pdHRfbWFya19zaW5nbGU7CisgICAgLy8gYWxpZ25tZW50ID8/PworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIGttcF9zdGF0c19saXN0KiB0aF9zdGF0czsKKyNlbmRpZgorfSBrbXBfYmFzZV9pbmZvX3Q7CisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9pbmZvIHsKKyAgICBkb3VibGUgICAgICAgICAgdGhfYWxpZ247ICAgICAgICAvKiB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQgKi8KKyAgICBjaGFyICAgICAgICAgICAgdGhfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2luZm9fdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9pbmZvX3QgdGg7Cit9IGttcF9pbmZvX3Q7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gT3Blbk1QIHRocmVhZCB0ZWFtIGRhdGEgc3RydWN0dXJlcworLy8KK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2RhdGEgeworICAgIHZvbGF0aWxlIGttcF91aW50MzIgdF92YWx1ZTsKK30ga21wX2Jhc2VfZGF0YV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfc2xlZXBfdGVhbSB7CisgICAgZG91YmxlICAgICAgICAgICAgICBkdF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kYXRhX3QgICAgIGR0OworfSBrbXBfc2xlZXBfdGVhbV90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfb3JkZXJlZF90ZWFtIHsKKyAgICBkb3VibGUgICAgICAgICAgICAgIGR0X2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBkdF9wYWRbIEtNUF9QQUQoa21wX2Jhc2VfZGF0YV90LCBDQUNIRV9MSU5FKSBdOworICAgIGttcF9iYXNlX2RhdGFfdCAgICAgZHQ7Cit9IGttcF9vcmRlcmVkX3RlYW1fdDsKKwordHlwZWRlZiBpbnQgICAgICgqbGF1bmNoX3QpKCBpbnQgZ3RpZCApOworCisvKiBNaW5pbXVtIG51bWJlciBvZiBBUkdWIGVudHJpZXMgdG8gbWFsbG9jIGlmIG5lY2Vzc2FyeSAqLworI2RlZmluZSBLTVBfTUlOX01BTExPQ19BUkdWX0VOVFJJRVMgICAgIDEwMAorCisvLyBTZXQgdXAgaG93IG1hbnkgYXJndiBwb2ludGVycyB3aWxsIGZpdCBpbiBjYWNoZSBsaW5lcyBjb250YWluaW5nIHRfaW5saW5lX2FyZ3YuIEhpc3RvcmljYWxseSwgd2UKKy8vIGhhdmUgc3VwcG9ydGVkIGF0IGxlYXN0IDk2IGJ5dGVzLiBVc2luZyBhIGxhcmdlciB2YWx1ZSBmb3IgbW9yZSBzcGFjZSBiZXR3ZWVuIHRoZSBtYXN0ZXIgd3JpdGUvd29ya2VyCisvLyByZWFkIHNlY3Rpb24gYW5kIHJlYWQvd3JpdGUgYnkgYWxsIHNlY3Rpb24gc2VlbXMgdG8gYnV5IG1vcmUgcGVyZm9ybWFuY2Ugb24gRVBDQyBQQVJBTExFTC4KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfSU5MSU5FX0FSR1ZfQllURVMgICAgICAgICAoIDQgKiBDQUNIRV9MSU5FIC0gKCAoIDMgKiBLTVBfUFRSX1NLSVAgKyAyICogc2l6ZW9mKGludCkgKyAyICogc2l6ZW9mKGttcF9pbnQ4KSArIHNpemVvZihrbXBfaW50MTYpICsgc2l6ZW9mKGttcF91aW50MzIpICkgJSBDQUNIRV9MSU5FICkgKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAgICAgICAgICggMiAqIENBQ0hFX0xJTkUgLSAoICggMyAqIEtNUF9QVFJfU0tJUCArIDIgKiBzaXplb2YoaW50KSApICUgQ0FDSEVfTElORSApICkKKyNlbmRpZgorI2RlZmluZSBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyAgICAgICAgKGludCkoIEtNUF9JTkxJTkVfQVJHVl9CWVRFUyAvIEtNUF9QVFJfU0tJUCApCisKK3R5cGVkZWYgc3RydWN0IEtNUF9BTElHTl9DQUNIRSBrbXBfYmFzZV90ZWFtIHsKKyAgICAvLyBTeW5jaHJvbml6YXRpb24gRGF0YSAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX29yZGVyZWRfdGVhbV90IHRfb3JkZXJlZDsKKyAgICBrbXBfYmFsaWduX3RlYW1fdCAgICAgICAgdF9iYXJbIGJzX2xhc3RfYmFycmllciBdOworICAgIHZvbGF0aWxlIGludCAgICAgICAgICAgICB0X2NvbnN0cnVjdDsgICAgLy8gY291bnQgb2Ygc2luZ2xlIGRpcmVjdGl2ZSBlbmNvdW50ZXJlZCBieSB0ZWFtCisgICAga21wX2xvY2tfdCAgICAgICAgICAgICAgIHRfc2luZ2xlX2xvY2s7ICAvLyB0ZWFtIHNwZWNpZmljIGxvY2sKKworICAgIC8vIE1hc3RlciBvbmx5IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgIHRfbWFzdGVyX3RpZDsgICAvLyB0aWQgb2YgbWFzdGVyIGluIHBhcmVudCB0ZWFtCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWFzdGVyX3RoaXNfY29uczsgLy8gInRoaXNfY29uc3RydWN0IiBzaW5nbGUgY291bnRlciBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBpZGVudF90ICAgICAgICAgICAgICAgICAqdF9pZGVudDsgICAgICAgIC8vIGlmIHZvbGF0aWxlLCBoYXZlIHRvIGNoYW5nZSB0b28gbXVjaCBvdGhlciBjcnVkIHRvIHZvbGF0aWxlIHRvbworICAgIGttcF90ZWFtX3AgICAgICAgICAgICAgICp0X3BhcmVudDsgICAgICAgLy8gcGFyZW50IHRlYW0KKyAgICBrbXBfdGVhbV9wICAgICAgICAgICAgICAqdF9uZXh0X3Bvb2w7ICAgIC8vIG5leHQgZnJlZSB0ZWFtIGluIHRoZSB0ZWFtIHBvb2wKKyAgICBrbXBfZGlzcF90ICAgICAgICAgICAgICAqdF9kaXNwYXRjaDsgICAgIC8vIHRocmVhZCdzIGRpc3BhdGNoIGRhdGEKKyAgICBrbXBfdGFza190ZWFtX3QgICAgICAgICAqdF90YXNrX3RlYW1bMl07IC8vIFRhc2sgdGVhbSBzdHJ1Y3Q7IHN3aXRjaCBiZXR3ZWVuIDIKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCAgICAgICAgICB0X3Byb2NfYmluZDsgICAgLy8gYmluZCB0eXBlIGZvciBwYXIgcmVnaW9uCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZiBVU0VfSVRUX0JVSUxECisgICAga21wX3VpbnQ2NCAgICAgICAgICAgICAgIHRfcmVnaW9uX3RpbWU7ICAvLyByZWdpb24gYmVnaW4gdGltZXN0YW1wCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLy8gTWFzdGVyIHdyaXRlLCB3b3JrZXJzIHJlYWQgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBLTVBfQUxJR05fQ0FDSEUgdm9pZCAgICoqdF9hcmd2OworICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2FyZ2M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbnByb2M7ICAgICAgICAvLyBudW1iZXIgb2YgdGhyZWFkcyBpbiB0ZWFtCisgICAgbWljcm90YXNrX3QgICAgICAgICAgICAgIHRfcGtmbjsKKyAgICBsYXVuY2hfdCAgICAgICAgICAgICAgICAgdF9pbnZva2U7ICAgICAgIC8vIHByb2NlZHVyZSB0byBsYXVuY2ggdGhlIG1pY3JvdGFzaworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF90ZWFtX2luZm9fdCAgICAgICAgIG9tcHRfdGVhbV9pbmZvOworICAgIG9tcHRfbHdfdGFza3RlYW1fdCAgICAgICpvbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAga21wX2ludDggICAgICAgICAgICAgICAgIHRfZnBfY29udHJvbF9zYXZlZDsKKyAgICBrbXBfaW50OCAgICAgICAgICAgICAgICAgdF9wYWQyYjsKKyAgICBrbXBfaW50MTYgICAgICAgICAgICAgICAgdF94ODdfZnB1X2NvbnRyb2xfd29yZDsgLy8gRlAgY29udHJvbCByZWdzCisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgIHRfbXhjc3I7CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgdm9pZCAgICAgICAgICAgICAgICAgICAgKnRfaW5saW5lX2FyZ3ZbIEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTIF07CisKKyAgICBLTVBfQUxJR05fQ0FDSEUga21wX2luZm9fdCAqKnRfdGhyZWFkczsKKyAgICBrbXBfdGFza2RhdGFfdCAqdF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhOyAgLy8gVGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbGV2ZWw7ICAgICAgICAgIC8vIG5lc3RlZCBwYXJhbGxlbCBsZXZlbAorCisgICAgS01QX0FMSUdOX0NBQ0hFIGludCAgICAgIHRfbWF4X2FyZ2M7CisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbWF4X25wcm9jOyAgICAvLyBtYXhpbXVtIHRocmVhZHMgdGhpcyB0ZWFtIGNhbiBoYW5kbGUgKGR5bmFtaWNseSBleHBhbmRhYmxlKQorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X3NlcmlhbGl6ZWQ7ICAgLy8gbGV2ZWxzIGRlZXAgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgICp0X2Rpc3BfYnVmZmVyOyAgLy8gYnVmZmVycyBmb3IgZGlzcGF0Y2ggc3lzdGVtCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfaWQ7ICAgICAgICAgICAvLyB0ZWFtJ3MgaWQsIGFzc2lnbmVkIGJ5IGRlYnVnZ2VyLgorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2FjdGl2ZV9sZXZlbDsgLy8gbmVzdGVkIGFjdGl2ZSBwYXJhbGxlbCBsZXZlbAorICAgIGttcF9yX3NjaGVkX3QgICAgICAgICAgICB0X3NjaGVkOyAgICAgICAgLy8gcnVuLXRpbWUgc2NoZWR1bGUgZm9yIHRoZSB0ZWFtCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICB0X2ZpcnN0X3BsYWNlOyAgLy8gZmlyc3QgJiBsYXN0IHBsYWNlIGluIHBhcmVudCB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgIHRfbGFzdF9wbGFjZTsgICAvLyBSZXN0b3JlIHRoZXNlIHZhbHVlcyB0byBtYXN0ZXIgYWZ0ZXIgcGFyIHJlZ2lvbi4KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaW50IHRfc2l6ZV9jaGFuZ2VkOyAvLyB0ZWFtIHNpemUgd2FzIGNoYW5nZWQ/OiAwOiBubywgMTogeWVzLCAtMTogY2hhbmdlZCB2aWEgb21wX3NldF9udW1fdGhyZWFkcygpIGNhbGwKKworICAgIC8vIFJlYWQvd3JpdGUgYnkgd29ya2VycyBhcyB3ZWxsIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpICYmICFLTVBfVVNFX0hXTE9DCisgICAgLy8gVXNpbmcgQ0FDSEVfTElORT02NCByZWR1Y2VzIG1lbW9yeSBmb290cHJpbnQsIGJ1dCBjYXVzZXMgYSBiaWcgcGVyZiByZWdyZXNzaW9uIG9mIGVwY2MgJ3BhcmFsbGVsJworICAgIC8vIGFuZCAnYmFycmllcicgb24gZnhlMjU2bGluMDEuIFRoaXMgZXh0cmEgcGFkZGluZyBzZXJ2ZXMgdG8gZml4IHRoZSBwZXJmb3JtYW5jZSBvZiBlcGNjICdwYXJhbGxlbCcKKyAgICAvLyBhbmQgJ2JhcnJpZXInIHdoZW4gQ0FDSEVfTElORT02NC4gVE9ETzogaW52ZXN0aWdhdGUgbW9yZSBhbmQgZ2V0IHJpZCBpZiB0aGlzIHBhZGRpbmcuCisgICAgY2hhciBkdW1teV9wYWRkaW5nWzEwMjRdOworI2VuZGlmCisgICAgS01QX0FMSUdOX0NBQ0hFIGttcF9pbnRlcm5hbF9jb250cm9sX3QgKnRfY29udHJvbF9zdGFja190b3A7ICAvLyBpbnRlcm5hbCBjb250cm9sIHN0YWNrIGZvciBhZGRpdGlvbmFsIG5lc3RlZCB0ZWFtcy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGZvciBTRVJJQUxJWkVEIHRlYW1zIG5lc3RlZCAyIG9yIG1vcmUgbGV2ZWxzIGRlZXAKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgICB0X2NhbmNlbF9yZXF1ZXN0OyAvLyB0eXBlZCBmbGFnIHRvIHN0b3JlIHJlcXVlc3Qgc3RhdGUgb2YgY2FuY2VsbGF0aW9uCisjZW5kaWYKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgdF9tYXN0ZXJfYWN0aXZlOyAgLy8gc2F2ZSBvbiBmb3JrLCByZXN0b3JlIG9uIGpvaW4KKyAgICBrbXBfdGFza3FfdCAgICAgICAgICAgICAgdF90YXNrcTsgICAgICAgICAgLy8gdGhpcyB0ZWFtJ3MgdGFzayBxdWV1ZQorICAgIHZvaWQgICAgICAgICAgICAgICAgICAgICp0X2NvcHlwcml2X2RhdGE7ICAvLyB0ZWFtIHNwZWNpZmljIHBvaW50ZXIgdG8gY29weXByaXZhdGUgZGF0YSBhcnJheQorICAgIGttcF91aW50MzIgICAgICAgICAgICAgICB0X2NvcHlpbl9jb3VudGVyOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB2b2lkICAgICAgICAgICAgICAgICAgICAqdF9zdGFja19pZDsgICAgICAgLy8gdGVhbSBzcGVjaWZpYyBzdGFjayBzdGl0Y2hpbmcgaWQgKGZvciBpdHRub3RpZnkpCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfSBrbXBfYmFzZV90ZWFtX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfdGVhbSB7CisgICAga21wX2Jhc2VfdGVhbV90ICAgICB0OworICAgIGRvdWJsZSAgICAgICAgICAgICAgdF9hbGlnbjsgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICB0X3BhZFsgS01QX1BBRChrbXBfYmFzZV90ZWFtX3QsIENBQ0hFX0xJTkUpIF07Cit9OworCisKK3R5cGVkZWYgdW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aW1lX2dsb2JhbCB7CisgICAgZG91YmxlICAgICAgICAgICAgICBkdF9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgZHRfcGFkWyBLTVBfUEFEKGttcF9iYXNlX2RhdGFfdCwgQ0FDSEVfTElORSkgXTsKKyAgICBrbXBfYmFzZV9kYXRhX3QgICAgIGR0OworfSBrbXBfdGltZV9nbG9iYWxfdDsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfZ2xvYmFsIHsKKyAgICAvKiBjYWNoZS1hbGlnbmVkICovCisgICAga21wX3RpbWVfZ2xvYmFsX3QgICBnX3RpbWU7CisKKyAgICAvKiBub24gY2FjaGUtYWxpZ25lZCAqLworICAgIHZvbGF0aWxlIGludCAgICAgICAgZ19hYm9ydDsKKyAgICB2b2xhdGlsZSBpbnQgICAgICAgIGdfZG9uZTsKKworICAgIGludCAgICAgICAgICAgICAgICAgZ19keW5hbWljOworICAgIGVudW0gZHluYW1pY19tb2RlICAgZ19keW5hbWljX21vZGU7Cit9IGttcF9iYXNlX2dsb2JhbF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfZ2xvYmFsIHsKKyAgICBrbXBfYmFzZV9nbG9iYWxfdCAgIGc7CisgICAgZG91YmxlICAgICAgICAgICAgICBnX2FsaWduOyAgICAgICAgLyogdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50ICovCisgICAgY2hhciAgICAgICAgICAgICAgICBnX3BhZFsgS01QX1BBRChrbXBfYmFzZV9nbG9iYWxfdCwgQ0FDSEVfTElORSkgXTsKK30ga21wX2dsb2JhbF90OworCisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX3Jvb3QgeworICAgIC8vIFRPRE86IEdFSCAtIGNvbWJpbmUgcl9hY3RpdmUgd2l0aCByX2luX3BhcmFsbGVsIHRoZW4gcl9hY3RpdmUgPT0gKHJfaW5fcGFyYWxsZWw+PSAwKQorICAgIC8vIFRPRE86IEdFSCAtIHRoZW4gcmVwbGFjZSByX2FjdGl2ZSB3aXRoIHRfYWN0aXZlX2xldmVscyBpZiB3ZSBjYW4gdG8gcmVkdWNlIHRoZSBzeW5jaAorICAgIC8vICAgICAgICAgICAgIG92ZXJoZWFkIG9yIGtlZXBpbmcgcl9hY3RpdmUKKworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9hY3RpdmU7ICAgICAgIC8qIFRSVUUgaWYgc29tZSByZWdpb24gaW4gYSBuZXN0IGhhcyA+IDEgdGhyZWFkICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9pbl9wYXJhbGxlbAorICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9uZXN0ZWQ7ICAgICAgIC8vIFRPRE86IEdFSCAtIFRoaXMgaXMgdW51c2VkLCBqdXN0IHJlbW92ZSBpdCBlbnRpcmVseS4KKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfaW5fcGFyYWxsZWw7ICAvKiBrZWVwcyBhIGNvdW50IG9mIGFjdGl2ZSBwYXJhbGxlbCByZWdpb25zIHBlciByb290ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gR0VIOiBUaGlzIGlzIG1pc25hbWVkLCBzaG91bGQgYmUgcl9hY3RpdmVfbGV2ZWxzCisgICAga21wX3RlYW1fdCAgICAgICAgICpyX3Jvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgKnJfaG90X3RlYW07CisgICAga21wX2luZm9fdCAgICAgICAgICpyX3ViZXJfdGhyZWFkOworICAgIGttcF9sb2NrX3QgICAgICAgICAgcl9iZWdpbl9sb2NrOworICAgIHZvbGF0aWxlIGludCAgICAgICAgcl9iZWdpbjsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJfYmxvY2t0aW1lOyAvKiBibG9ja3RpbWUgZm9yIHRoaXMgcm9vdCBhbmQgZGVzY2VuZGFudHMgKi8KK30ga21wX2Jhc2Vfcm9vdF90OworCit0eXBlZGVmIHVuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfcm9vdCB7CisgICAga21wX2Jhc2Vfcm9vdF90ICAgICByOworICAgIGRvdWJsZSAgICAgICAgICAgICAgcl9hbGlnbjsgICAgICAgIC8qIHVzZSB3b3JzdCBjYXNlIGFsaWdubWVudCAqLworICAgIGNoYXIgICAgICAgICAgICAgICAgcl9wYWRbIEtNUF9QQUQoa21wX2Jhc2Vfcm9vdF90LCBDQUNIRV9MSU5FKSBdOworfSBrbXBfcm9vdF90OworCitzdHJ1Y3QgZm9ydHJhbl9pbnhfaW5mbyB7CisgICAga21wX2ludDMyICAgZGF0YTsKK307CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gaW50ICAgICAgX19rbXBfc2V0dGluZ3M7CitleHRlcm4gaW50ICAgICAgX19rbXBfZHVwbGljYXRlX2xpYnJhcnlfb2s7CisjaWYgVVNFX0lUVF9CVUlMRAorZXh0ZXJuIGludCAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lczsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZTsKKyNlbmRpZgorZXh0ZXJuIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZDsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9kZXRlcm1fcmVkOworCisjaWZkZWYgS01QX0RFQlVHCitleHRlcm4gaW50ICAgICAga21wX2FfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2JfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2NfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2RfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2VfZGVidWc7CitleHRlcm4gaW50ICAgICAga21wX2ZfZGVidWc7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKy8qIEZvciBkZWJ1ZyBpbmZvcm1hdGlvbiBsb2dnaW5nIHVzaW5nIHJvdGF0aW5nIGJ1ZmZlciAqLworI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX0lOSVQgICAgICAgIDUxMgorI2RlZmluZSBLTVBfREVCVUdfQlVGX0xJTkVTX01JTiAgICAgICAgIDEKKworI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX0lOSVQgICAgICAgIDEyOAorI2RlZmluZSBLTVBfREVCVUdfQlVGX0NIQVJTX01JTiAgICAgICAgIDIKKworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmOyAgICAgICAgICAgIC8qIFRSVUUgbWVhbnMgdXNlIGJ1ZmZlciwgRkFMU0UgbWVhbnMgcHJpbnQgdG8gc3RkZXJyICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfbGluZXM7ICAgICAgLyogSG93IG1hbnkgbGluZXMgb2YgZGVidWcgc3RvcmVkIGluIGJ1ZmZlciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX2NoYXJzOyAgICAgIC8qIEhvdyBtYW55IGNoYXJhY3RlcnMgYWxsb3dlZCBwZXIgbGluZSBpbiBidWZmZXIgKi8KK2V4dGVybiBpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9hdG9taWM7ICAgICAvKiBUUlVFIG1lYW5zIHVzZSBhdG9taWMgdXBkYXRlIG9mIGJ1ZmZlciBlbnRyeSBwb2ludGVyICovCisKK2V4dGVybiBjaGFyICAgKl9fa21wX2RlYnVnX2J1ZmZlcjsgICAgICAgICAvKiBEZWJ1ZyBidWZmZXIgaXRzZWxmICovCitleHRlcm4gaW50ICAgICBfX2ttcF9kZWJ1Z19jb3VudDsgICAgICAgICAgLyogQ291bnRlciBmb3IgbnVtYmVyIG9mIGxpbmVzIHByaW50ZWQgaW4gYnVmZmVyIHNvIGZhciAqLworZXh0ZXJuIGludCAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnM7IC8qIEtlZXAgdHJhY2sgb2YgY2hhciBpbmNyZWFzZSByZWNvbW1lbmRlZCBpbiB3YXJuaW5ncyAqLworLyogZW5kIHJvdGF0aW5nIGRlYnVnIGJ1ZmZlciAqLworCisjaWZkZWYgS01QX0RFQlVHCitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlOyAgICAgICAgICAgLyogKzEgPT4gb25seSBnbyBwYXIgZm9yIGNvbnN0cnVjdHMgaW4gcmFuZ2UgKi8KKworI2RlZmluZSBLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOICAgICAgIDEwMjQKK2V4dGVybiBjaGFyICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZVtLTVBfUEFSX1JBTkdFX1JPVVRJTkVfTEVOXTsKKyNkZWZpbmUgS01QX1BBUl9SQU5HRV9GSUxFTkFNRV9MRU4gICAgICAxMDI0CitleHRlcm4gY2hhciAgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXTsKK2V4dGVybiBpbnQgICAgICBfX2ttcF9wYXJfcmFuZ2VfbGI7CitleHRlcm4gaW50ICAgICAgX19rbXBfcGFyX3JhbmdlX3ViOworI2VuZGlmCisKKy8qIEZvciBwcmludGluZyBvdXQgZHluYW1pYyBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcDsgICAgICAgICAvKiBUcnVlIG1lYW5zIHByaW50IHN0b3JhZ2UgbWFwIGZvciB0aHJlYWRzIGFuZCB0ZWFtcyAqLworZXh0ZXJuIGludCAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2U7IC8qIFRydWUgbWVhbnMgc3RvcmFnZSBtYXAgaW5jbHVkZXMgcGxhY2VtZW50IGluZm8gKi8KK2V4dGVybiBpbnQgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZDsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2V4dGVybiBrbXBfY3B1aW5mb190ICAgIF9fa21wX2NwdWluZm87CisjZW5kaWYKKworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X3NlcmlhbDsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9ndGlkOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF9pbml0X2NvbW1vbjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF9taWRkbGU7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfcGFyYWxsZWw7CitleHRlcm4gdm9sYXRpbGUgaW50IF9fa21wX2luaXRfbW9uaXRvcjsKK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfaW5pdF91c2VyX2xvY2tzOworZXh0ZXJuIGludCBfX2ttcF9pbml0X2NvdW50ZXI7CitleHRlcm4gaW50IF9fa21wX3Jvb3RfY291bnRlcjsKK2V4dGVybiBpbnQgX19rbXBfdmVyc2lvbjsKKworLyogbGlzdCBvZiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZXMgZm9yIGNvbW1vbnMgKi8KK2V4dGVybiBrbXBfY2FjaGVkX2FkZHJfdCAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0OworCisvKiBCYXJyaWVyIGFsZ29yaXRobSB0eXBlcyBhbmQgb3B0aW9ucyAqLworZXh0ZXJuIGttcF91aW50MzIgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYmJfZGZsdDsKK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQ7CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0X2RmbHQ7CitleHRlcm4ga21wX3VpbnQzMiAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBrbXBfdWludDMyICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0cyBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4ga21wX2Jhcl9wYXRfZSBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybiAgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSBbIGJzX2xhc3RfYmFycmllciBdOworZXh0ZXJuIGNoYXIgY29uc3QgICAqX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lICAgIFsgYnNfbGFzdF9iYXJyaWVyIF07CitleHRlcm4gY2hhciBjb25zdCAgICpfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZSAgICAgICAgICAgWyBic19sYXN0X2JhcnJpZXIgXTsKK2V4dGVybiBjaGFyIGNvbnN0ICAgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lICAgICAgICBbIGJwX2xhc3RfYmFyIF07CisKKy8qIEdsb2JhbCBMb2NrcyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2s7ICAgICAvKiBjb250cm9sIGluaXRpYWxpemF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZm9ya2pvaW5fbG9jazsgIC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX21vbml0b3JfbG9jazsgICAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitleHRlcm4ga21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfdHBfY2FjaGVkX2xvY2s7IC8qIHVzZWQgZm9yIHRoZSBoYWNrIHRvIGFsbG93IHRocmVhZHByaXZhdGUgY2FjaGUgYW5kIF9fa21wX3RocmVhZHMgZXhwYW5zaW9uIHRvIGNvLWV4aXN0ICovCisKK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2dsb2JhbF9sb2NrOyAgICAvKiBjb250cm9sIE9TL2dsb2JhbCBhY2Nlc3MgICovCitleHRlcm4ga21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAvKiBjb250cm9sIGRpc3BhdGNoIGFjY2VzcyAgKi8KK2V4dGVybiBrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAvKiBjb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworCisvKiB1c2VkIGZvciB5aWVsZGluZyBzcGluLXdhaXRzICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdDsgICAgLyogaW5pdGlhbCBudW1iZXIgb2Ygc3Bpbi10ZXN0cyAgICovCitleHRlcm4gdW5zaWduZWQgaW50IF9fa21wX25leHRfd2FpdDsgICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK2V4dGVybiBlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5OworCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9zY2hlZDsgICAgLyogZGVmYXVsdCBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2V4dGVybiBlbnVtIHNjaGVkX3R5cGUgIF9fa21wX3N0YXRpYzsgICAvKiBkZWZhdWx0IHN0YXRpYyBzY2hlZHVsaW5nIG1ldGhvZCAqLworZXh0ZXJuIGVudW0gc2NoZWRfdHlwZSAgX19rbXBfZ3VpZGVkOyAgIC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gZW51bSBzY2hlZF90eXBlICBfX2ttcF9hdXRvOyAgICAgLyogZGVmYXVsdCBhdXRvIHNjaGVkdWxpbmcgbWV0aG9kICovCitleHRlcm4gaW50ICAgICAgICAgICAgICBfX2ttcF9jaHVuazsgICAgLyogZGVmYXVsdCBydW50aW1lIGNodW5rIHNpemUgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfc3Rrc2l6ZTsgICAgICAgIC8qIHN0YWNrIHNpemUgcGVyIHRocmVhZCAgICAgICAgICovCitleHRlcm4gc2l6ZV90ICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemU7Lyogc3RhY2sgc2l6ZSBmb3IgbW9uaXRvciB0aHJlYWQgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N0a29mZnNldDsgICAgICAvKiBzdGFjayBvZmZzZXQgcGVyIHRocmVhZCAgICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfc3RrcGFkZGluZzsgICAgIC8qIFNob3VsZCB3ZSBwYWQgcm9vdCB0aHJlYWQocykgc3RhY2sgKi8KKworZXh0ZXJuIHNpemVfdCAgICAgX19rbXBfbWFsbG9jX3Bvb2xfaW5jcjsgLyogaW5jcmVtZW50YWwgc2l6ZSBvZiBwb29sIGZvciBrbXBfbWFsbG9jKCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jaHVuazsgICAgICAvKiB3YXMgS01QX0NIVU5LIHNwZWNpZmllZD8gICAgICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZTsgICAgLyogd2FzIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9zdGtzaXplOy8qIHdhcyBPTVBfU1RBQ0tTSVpFIHNwZWNpZmllZD8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9hbGxfdGhyZWFkczsgICAgLyogd2FzIEtNUF9BTExfVEhSRUFEUyBvciBLTVBfTUFYX1RIUkVBRFMgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X29tcF9hbGxfdGhyZWFkczsvKiB3YXMgT01QX1RIUkVBRF9MSU1JVCBzcGVjaWZpZWQ/ICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lOyAgLyogd2FzIEtNUF9CTE9DS1RJTUUgc3BlY2lmaWVkPyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZW52X2NoZWNrczsgICAgIC8qIHdhcyBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjazsgICAgIC8qIHdhcyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sgc3BlY2lmaWVkPyAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3M7IC8qIHNob3VsZCB3ZSBpc3N1ZSB3YXJuaW5ncz8gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybjsgICAvKiBoYXZlIHdlIGlzc3VlZCByZXNlcnZlX3RocmVhZHMgd2FybmluZz8gKi8KKworI2lmZGVmIERFQlVHX1NVU1BFTkQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3N1c3BlbmRfY291bnQ7ICAvKiBjb3VudCBpbnNpZGUgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSgpICovCisjZW5kaWYKKworZXh0ZXJuIGttcF91aW50MzIgX19rbXBfeWllbGRfaW5pdDsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX25leHQ7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF95aWVsZGluZ19vbjsKK2V4dGVybiBrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlOworZXh0ZXJuIGttcF9pbnQzMiAgX19rbXBfeWllbGRfb25fY291bnQ7CitleHRlcm4ga21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2FsbFRocmVhZHNTcGVjaWZpZWQ7CisKK2V4dGVybiBzaXplX3QgICAgIF9fa21wX2FsaWduX2FsbG9jOworLyogZm9sbG93aW5nIGRhdGEgcHJvdGVjdGVkIGJ5IGluaXRpYWxpemF0aW9uIHJvdXRpbmVzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF94cHJvYzsgICAgICAgICAgLyogbnVtYmVyIG9mIHByb2Nlc3NvcnMgaW4gdGhlIHN5c3RlbSAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYXZhaWxfcHJvYzsgICAgICAvKiBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdmFpbGFibGUgdG8gdGhlIHByb2Nlc3MgKi8KK2V4dGVybiBzaXplX3QgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZTsgLyogc3lzdGVtLWRlZmluZWQgbWluaW11bSBzdGFjayBzaXplICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9zeXNfbWF4X250aDsgICAgLyogc3lzdGVtLWltcG9zZWQgbWF4aW11bSBudW1iZXIgb2YgdGhyZWFkcyAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfbWF4X250aDsgICAgICAgIC8qIG1heGltdW0gdG90YWwgbnVtYmVyIG9mIGNvbmN1cnJlbnRseS1leGlzdGluZyB0aHJlYWRzICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyAvKiBjYXBhY2l0eSBvZiB0aGUgYXJyYXlzIF9fa21wX3RocmVhZHMgYW5kIF9fa21wX3Jvb3QgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGg7ICAvKiBkZWZhdWx0IG51bWJlciBvZiB0aHJlYWRzIGluIGEgcGFyYWxsZWwgcmVnaW9uIGEgbGEgT01QX05VTV9USFJFQURTICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViOyAvKiB1cHBlciBib3VuZCBvbiAiIiBkZXRlcm1pbmVkIGF0IHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfdHBfY2FwYWNpdHk7ICAgIC8qIGNhcGFjaXR5IG9mIF9fa21wX3RocmVhZHMgaWYgdGhyZWFkcHJpdmF0ZSBpcyB1c2VkIChmaXhlZCkgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX3RwX2NhY2hlZDsgICAgICAvKiB3aGV0aGVyIHRocmVhZHByaXZhdGUgY2FjaGUgaGFzIGJlZW4gY3JlYXRlZCAoX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKCkpICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kZmx0X25lc3RlZDsgICAgLyogbmVzdGVkIHBhcmFsbGVsaXNtIGVuYWJsZWQgYnkgZGVmYXVsdCBhIGxhIE9NUF9ORVNURUQgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lOyAvKiBudW1iZXIgb2YgbWlsbGlzZWNvbmRzIHRvIHdhaXQgYmVmb3JlIGJsb2NraW5nIChlbnYgc2V0dGluZykgKi8KK2V4dGVybiBpbnQgICAgICAgIF9fa21wX21vbml0b3Jfd2FrZXVwczsvKiBudW1iZXIgb2YgdGltZXMgbW9uaXRvciB3YWtlcyB1cCBwZXIgc2Vjb25kICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9idF9pbnRlcnZhbHM7ICAgLyogbnVtYmVyIG9mIG1vbml0b3IgdGltZXN0YW1wIGludGVydmFscyBiZWZvcmUgYmxvY2tpbmcgKi8KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorZXh0ZXJuIGludCAgICAgICAgX19rbXBfemVyb19idDsgICAgICAgIC8qIHdoZXRoZXIgYmxvY2t0aW1lIGhhcyBiZWVuIGZvcmNlZCB0byB6ZXJvICovCisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX25jb3JlczsgICAgICAgICAvKiBUb3RhbCBudW1iZXIgb2YgY29yZXMgZm9yIHRocmVhZHMgcGxhY2VtZW50ICovCisjZW5kaWYKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2Fib3J0X2RlbGF5OyAgICAvKiBOdW1iZXIgb2YgbWlsbGlzZWNzIHRvIGRlbGF5IG9uIGFib3J0IGZvciBWVHVuZSAqLworCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9ya19zcGVjaWZpZWQ7CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yazsvKiBBdCBpbml0aWFsaXphdGlvbiwgY2FsbCBwdGhyZWFkX2F0Zm9yayB0byBpbnN0YWxsIGZvcmsgaGFuZGxlciAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZ3RpZF9tb2RlOyAgICAgIC8qIE1ldGhvZCBvZiBnZXR0aW5nIGd0aWQsIHZhbHVlczoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAwIC0gbm90IHNldCwgd2lsbCBiZSBzZXQgYXQgcnVudGltZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEgLSB1c2luZyBzdGFjayBzZWFyY2gKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyIC0gZHluYW1pYyBUTFMgKHB0aHJlYWRfZ2V0c3BlY2lmaWMoTGludXgqIE9TL09TIFgqKSBvciBUbHNHZXRWYWx1ZShXaW5kb3dzKiBPUykpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMyAtIHN0YXRpYyBUTFMgKF9fZGVjbHNwZWModGhyZWFkKSBfX2ttcF9ndGlkKSwgTGludXgqIE9TIC5zbyBvbmx5LgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZTsgLyogSWYgdHJ1ZSwgYWRqdXN0IG1ldGhvZCBiYXNlZCBvbiAjdGhyZWFkcyAqLworI2lmZGVmIEtNUF9UREFUQV9HVElECisjaWYgS01QX09TX1dJTkRPV1MKK2V4dGVybiBfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQ7IC8qIFRoaXMgdGhyZWFkJ3MgZ3RpZCwgaWYgX19rbXBfZ3RpZF9tb2RlID09IDMgKi8KKyNlbHNlCitleHRlcm4gX190aHJlYWQgaW50IF9fa21wX2d0aWQ7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgY29tcGlsZXIgMjAxMTAzMTYgZG9lc24ndCBhY2NlcHQgX19kZWNsc3BlYyAqLworI2VuZGlmCitleHRlcm4gaW50ICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW47ICAgLyogI3RocmVhZHMgYmVsb3cgd2hpY2ggdXNlIHNwIHNlYXJjaCBmb3IgZ3RpZCAqLworZXh0ZXJuIGludCAgICAgICAgX19rbXBfZm9yZWlnbl90cDsgICAgIC8qIElmIHRydWUsIHNlcGFyYXRlIFRQIHZhciBmb3IgZWFjaCBmb3JlaWduIHRocmVhZCAqLworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2luaGVyaXRfZnBfY29udHJvbDsgLyogY29weSBmcCBjcmVnKHMpIHBhcmVudC0+d29ya2VycyBhdCBmb3JrICovCitleHRlcm4ga21wX2ludDE2ICBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkOyAvKiBpbml0IHRocmVhZCdzIEZQIGNvbnRyb2wgcmVnICovCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9pbml0X214Y3NyOyAgICAgIC8qIGluaXQgdGhyZWFkJ3MgbXhzY3IgKi8KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK2V4dGVybiBpbnQgICAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHM7IC8qIG1heF9hY3RpdmVfbGV2ZWxzIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gZW5hYmxlZCBieSBkZWZhdWx0IGEgbGEgT01QX01BWF9BQ1RJVkVfTEVWRUxTICovCitleHRlcm4gaW50ICAgICAgICBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVyczsgLyogbWF4IHBvc3NpYmxlIGR5bmFtaWMgbG9vcHMgaW4gY29uY3VycmVudCBleGVjdXRpb24gcGVyIHRlYW0gKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworZXh0ZXJuIGludCAgICAgICAgX19rbXBfaG90X3RlYW1zX21vZGU7CitleHRlcm4gaW50ICAgICAgICBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsOworI2VuZGlmCisKKyMgaWYgS01QX09TX0xJTlVYCitleHRlcm4gZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIF9fa21wX2Nsb2NrX2Z1bmN0aW9uOworZXh0ZXJuIGludCBfX2ttcF9jbG9ja19mdW5jdGlvbl9wYXJhbTsKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKK2V4dGVybiBlbnVtIG1pY190eXBlIF9fa21wX21pY190eXBlOworI2VuZGlmCisKKyMgaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorZXh0ZXJuIGRvdWJsZSAgICAgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbDsgICAvKiBJbnRlcnZhbCBmb3IgdGhlIGxvYWQgYmFsYW5jZSBhbGdvcml0aG0gKi8KKyMgZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisvLyBPcGVuTVAgMy4xIC0gTmVzdGVkIG51bSB0aHJlYWRzIGFycmF5Cit0eXBlZGVmIHN0cnVjdCBrbXBfbmVzdGVkX250aHJlYWRzX3QgeworICAgIGludCAqIG50aDsKKyAgICBpbnQgICBzaXplOworICAgIGludCAgIHVzZWQ7Cit9IGttcF9uZXN0ZWRfbnRocmVhZHNfdDsKKworZXh0ZXJuIGttcF9uZXN0ZWRfbnRocmVhZHNfdCBfX2ttcF9uZXN0ZWRfbnRoOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyBQYXJhbWV0ZXJzIGZvciB0aGUgc3BlY3VsYXRpdmUgbG9jayBiYWNrb2ZmIHN5c3RlbS4KK3N0cnVjdCBrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCB7CisgICAgLy8gTnVtYmVyIG9mIHNvZnQgcmV0cmllcyBiZWZvcmUgaXQgY291bnRzIGFzIGEgaGFyZCByZXRyeS4KKyAgICBrbXBfdWludDMyIG1heF9zb2Z0X3JldHJpZXM7CisgICAgLy8gQmFkbmVzcyBpcyBhIGJpdCBtYXNrIDogMCwxLDMsNywxNSwuLi4gb24gZWFjaCBoYXJkIGZhaWx1cmUgd2UgbW92ZSBvbmUgdG8gdGhlIHJpZ2h0CisgICAga21wX3VpbnQzMiBtYXhfYmFkbmVzczsKK307CisKK2V4dGVybiBrbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXNfdCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtczsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworZXh0ZXJuIGNoYXIgKiBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGU7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gaW50IF9fa21wX2Rpc3BsYXlfZW52OyAgICAgICAgICAgLyogVFJVRSBvciBGQUxTRSAqLworZXh0ZXJuIGludCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlOyAgIC8qIFRSVUUgaWYgT01QX0RJU1BMQVlfRU5WPVZFUkJPU0UgKi8KK2V4dGVybiBpbnQgX19rbXBfb21wX2NhbmNlbGxhdGlvbjsgICAgICAvKiBUUlVFIG9yIEZBTFNFICovCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRoZSBmb2xsb3dpbmcgYXJlIHByb3RlY3RlZCBieSB0aGUgZm9yay9qb2luIGxvY2sgKi8KKy8qIHdyaXRlOiBsb2NrICByZWFkOiBhbnl0aW1lICovCitleHRlcm4gICAgICAgICAga21wX2luZm9fdCAqKl9fa21wX3RocmVhZHM7ICAgICAgLyogRGVzY3JpcHRvcnMgZm9yIHRoZSB0aHJlYWRzICovCisvKiByZWFkL3dyaXRlOiBsb2NrICovCitleHRlcm4gdm9sYXRpbGUga21wX3RlYW1fdCAgKiAgICAgX19rbXBfdGVhbV9wb29sOworZXh0ZXJuIHZvbGF0aWxlIGttcF9pbmZvX3QgICogICAgIF9fa21wX3RocmVhZF9wb29sOworCisvKiB0b3RhbCBudW1iZXIgb2YgdGhyZWFkcyByZWFjaGFibGUgZnJvbSBzb21lIHJvb3QgdGhyZWFkIGluY2x1ZGluZyBhbGwgcm9vdCB0aHJlYWRzKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfbnRoOworLyogdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgcmVhY2hhYmxlIGZyb20gc29tZSByb290IHRocmVhZCBpbmNsdWRpbmcgYWxsIHJvb3QgdGhyZWFkcywKKyAgIGFuZCB0aG9zZSBpbiB0aGUgdGhyZWFkIHBvb2wgKi8KK2V4dGVybiB2b2xhdGlsZSBpbnQgX19rbXBfYWxsX250aDsKK2V4dGVybiBpbnQgX19rbXBfdGhyZWFkX3Bvb2xfbnRoOworZXh0ZXJuIHZvbGF0aWxlIGludCBfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoOworCitleHRlcm4ga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3Q7ICAgICAgICAgLyogcm9vdCBvZiB0aHJlYWQgaGllcmFyY2h5ICovCisvKiBlbmQgZGF0YSBwcm90ZWN0ZWQgYnkgZm9yay9qb2luIGxvY2sgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4ga21wX2dsb2JhbF90ICBfX2ttcF9nbG9iYWw7ICAgICAgICAgLyogZ2xvYmFsIHN0YXR1cyAqLworCitleHRlcm4ga21wX2luZm9fdCBfX2ttcF9tb25pdG9yOworZXh0ZXJuIHZvbGF0aWxlIGttcF91aW50MzIgX19rbXBfdGVhbV9jb3VudGVyOyAgICAgIC8vIFVzZWQgYnkgRGVidWdnaW5nIFN1cHBvcnQgTGlicmFyeS4KK2V4dGVybiB2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3Rhc2tfY291bnRlcjsgICAgICAvLyBVc2VkIGJ5IERlYnVnZ2luZyBTdXBwb3J0IExpYnJhcnkuCisKKyNpZiBVU0VfREVCVUdHRVIKKworI2RlZmluZSBfS01QX0dFTl9JRCggY291bnRlciApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfZGVidWdnaW5nICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICA/ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoICh2b2xhdGlsZSBrbXBfaW50MzIgKikgJiBjb3VudGVyICkgKyAxICAgIFwKKyAgICAgICAgOiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB+IDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKQorI2Vsc2UKKyNkZWZpbmUgX0tNUF9HRU5fSUQoIGNvdW50ZXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICggICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH4gMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCisKKyNkZWZpbmUgS01QX0dFTl9UQVNLX0lEKCkgICAgX0tNUF9HRU5fSUQoIF9fa21wX3Rhc2tfY291bnRlciApCisjZGVmaW5lIEtNUF9HRU5fVEVBTV9JRCgpICAgIF9LTVBfR0VOX0lEKCBfX2ttcF90ZWFtX2NvdW50ZXIgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitleHRlcm4gdm9pZCBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpbnQgZ3RpZCwgdm9pZCAqcDEsIHZvaWQqIHAyLCBzaXplX3Qgc2l6ZSwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCB2b2lkICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggaW50IGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQoIGludCBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9lbmRfZmluaSggdm9pZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW50ZXJuYWxfZW5kX2R0b3IoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2VuZF9kZXN0KCB2b2lkKiApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWdpc3Rlcl9yb290KCBpbnQgaW5pdGlhbF90aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3VucmVnaXN0ZXJfcm9vdCggaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGJlZyggdm9pZCApOworZXh0ZXJuIGludCAgX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9lbnRlcl9zaW5nbGUoIGludCBndGlkLCBpZGVudF90ICppZF9yZWYsIGludCBwdXNoX3dzICk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3NpbmdsZSggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKTsKK2V4dGVybiB2b2lkIF9fa21wX3BhcmFsbGVsX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICk7CisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCitleHRlcm4gaW50ICBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgKTsKKyNlbmRpZgorCisjaWZkZWYgQlVJTERfVFYKK2V4dGVybiB2b2lkIF9fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwgdm9pZCAqdGhyZWFkX2FkZHIgKTsKKyNlbmRpZgorCitleHRlcm4gaW50ICBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZCggdm9pZCApOworZXh0ZXJuIGludCAgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9leGl0X3RocmVhZCggaW50IGV4aXRfc3RhdHVzICk7CitleHRlcm4gdm9pZCBfX2ttcF9hYm9ydCggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9hYm9ydF90aHJlYWQoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Fib3J0X3Byb2Nlc3MoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhcm4oIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApOworCitleHRlcm4gdm9pZCBfX2ttcF9zZXRfbnVtX3RocmVhZHMoIGludCBuZXdfbnRoLCBpbnQgZ3RpZCApOworCisvLyBSZXR1cm5zIGN1cnJlbnQgdGhyZWFkIChwb2ludGVyIHRvIGttcF9pbmZvX3QpLiBDdXJyZW50IHRocmVhZCAqbXVzdCogYmUgcmVnaXN0ZXJlZC4KK3N0YXRpYyBpbmxpbmUga21wX2luZm9fdCAqIF9fa21wX2VudHJ5X3RocmVhZCgpCit7CisgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgICAgcmV0dXJuIF9fa21wX3RocmVhZHNbZ3RpZF07Cit9CisKK2V4dGVybiB2b2lkIF9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQsIGludCBuZXdfbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICk7CitleHRlcm4gaW50ICBfX2ttcF9nZXRfdGVhbV9zaXplKCBpbnQgZ3RpZCwgaW50IGxldmVsICk7CitleHRlcm4gdm9pZCBfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBuZXdfc2NoZWQsIGludCBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBfZ2V0X3NjaGVkdWxlKCBpbnQgZ3RpZCwga21wX3NjaGVkX3QgKiBzY2hlZCwgaW50ICogY2h1bmsgKTsKKworZXh0ZXJuIHVuc2lnbmVkIHNob3J0IF9fa21wX2dldF9yYW5kb20oIGttcF9pbmZvX3QgKiB0aHJlYWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICk7CisKK2V4dGVybiBrbXBfcl9zY2hlZF90IF9fa21wX2dldF9zY2hlZHVsZV9nbG9iYWwoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2FkanVzdF9udW1fdGhyZWFkcyggaW50IG5ld19ucHJvYyApOworCitleHRlcm4gdm9pZCAqIF9fX2ttcF9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX19rbXBfZnJlZSggdm9pZCAqIHB0ciBLTVBfU1JDX0xPQ19ERUNMICk7CisjZGVmaW5lIF9fa21wX2FsbG9jYXRlKCBzaXplICkgICAgICBfX19rbXBfYWxsb2NhdGUoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfcGFnZV9hbGxvY2F0ZSggc2l6ZSApIF9fX2ttcF9wYWdlX2FsbG9jYXRlKCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX2ZyZWUoIHB0ciApICAgICAgICAgICBfX19rbXBfZnJlZSggKHB0cikgS01QX1NSQ19MT0NfQ1VSUiApCisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKK2V4dGVybiB2b2lkICogX19fa21wX2Zhc3RfYWxsb2NhdGUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICk7CitleHRlcm4gdm9pZCAgIF9fX2ttcF9mYXN0X2ZyZWUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgICBfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aGlzX3RociApOworZXh0ZXJuIHZvaWQgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aGlzX3RociApOworI2RlZmluZSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aGlzX3Rociwgc2l6ZSApIF9fX2ttcF9mYXN0X2FsbG9jYXRlKCAodGhpc190aHIpLCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisjZGVmaW5lIF9fa21wX2Zhc3RfZnJlZSggdGhpc190aHIsIHB0ciApICAgICAgX19fa21wX2Zhc3RfZnJlZSggKHRoaXNfdGhyKSwgKHB0cikgS01QX1NSQ19MT0NfQ1VSUiApCisjZW5kaWYKKworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX21hbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICogX19fa21wX3RocmVhZF9jYWxsb2MoIGttcF9pbmZvX3QgKnRoLCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgS01QX1NSQ19MT0NfREVDTCApOworZXh0ZXJuIHZvaWQgKiBfX19rbXBfdGhyZWFkX3JlYWxsb2MoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIsIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKTsKK2V4dGVybiB2b2lkICAgX19fa21wX3RocmVhZF9mcmVlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKTsKKyNkZWZpbmUgX19rbXBfdGhyZWFkX21hbGxvYyggIHRoLCBzaXplICkgICAgICAgICAgX19fa21wX3RocmVhZF9tYWxsb2MoICAodGgpLCAoc2l6ZSkgICAgICAgICAgICBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfdGhyZWFkX2NhbGxvYyggIHRoLCBuZWxlbSwgZWxzaXplICkgX19fa21wX3RocmVhZF9jYWxsb2MoICAodGgpLCAobmVsZW0pLCAoZWxzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfdGhyZWFkX3JlYWxsb2MoIHRoLCBwdHIsIHNpemUgKSAgICAgX19fa21wX3RocmVhZF9yZWFsbG9jKCAodGgpLCAocHRyKSwgKHNpemUpICAgICBLTVBfU1JDX0xPQ19DVVJSICkKKyNkZWZpbmUgX19rbXBfdGhyZWFkX2ZyZWUoICAgIHRoLCBwdHIgKSAgICAgICAgICAgX19fa21wX3RocmVhZF9mcmVlKCAgICAodGgpLCAocHRyKSAgICAgICAgICAgICBLTVBfU1JDX0xPQ19DVVJSICkKKworI2RlZmluZSBLTVBfSU5URVJOQUxfTUFMTE9DKHN6KSAgICBtYWxsb2Moc3opCisjZGVmaW5lIEtNUF9JTlRFUk5BTF9GUkVFKHApICAgICAgIGZyZWUocCkKKyNkZWZpbmUgS01QX0lOVEVSTkFMX1JFQUxMT0MocCxzeikgcmVhbGxvYygocCksKHN6KSkKKyNkZWZpbmUgS01QX0lOVEVSTkFMX0NBTExPQyhuLHN6KSAgY2FsbG9jKChuKSwoc3opKQorCitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX251bV90aHJlYWRzKCBpZGVudF90ICpsb2MsIGludCBndGlkLCBpbnQgbnVtX3RocmVhZHMgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gdm9pZCBfX2ttcF9wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Byb2NfYmluZF90IHByb2NfYmluZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcHVzaF9udW1fdGVhbXMoIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGludCBudW1fdGVhbXMsIGludCBudW1fdGhyZWFkcyApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3lpZWxkKCBpbnQgY29uZCApOworCitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX2ludDMyIGxiLCBrbXBfaW50MzIgdWIsIGttcF9pbnQzMiBzdCwKKyAgICBrbXBfaW50MzIgY2h1bmsgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgIGttcF9pbnQzMiBjaHVuayApOworZXh0ZXJuIHZvaWQgX19rbXBjX2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAga21wX2ludDY0IGNodW5rICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwKKyAgICBrbXBfaW50NjQgY2h1bmsgKTsKKworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICk7CitleHRlcm4gaW50IF9fa21wY19kaXNwYXRjaF9uZXh0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfdWludDMyICpwX2xiLCBrbXBfdWludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QgKTsKK2V4dGVybiBpbnQgX19rbXBjX2Rpc3BhdGNoX25leHRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApOworZXh0ZXJuIGludCBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0ICk7CisKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wY19kaXNwYXRjaF9maW5pXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcGNfZGlzcGF0Y2hfZmluaV84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsCisgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAga21wX2ludDY0IGNodW5rLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLCBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAga21wX2ludDY0IGNodW5rLCBpbnQgcHVzaF93cyApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICk7CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9lcV80KCAga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9uZXFfNCgga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sdF80KCAga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9nZV80KCAga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF9sZV80KCAga21wX3VpbnQzMiB2YWx1ZSwga21wX3VpbnQzMiBjaGVja2VyICk7CitleHRlcm4ga21wX3VpbnQzMiBfX2ttcF93YWl0X3lpZWxkXzQoIGttcF91aW50MzIgdm9sYXRpbGUgKiBzcGlubmVyLCBrbXBfdWludDMyIGNoZWNrZXIsIGttcF91aW50MzIgKCpwcmVkKSAoa21wX3VpbnQzMiwga21wX3VpbnQzMiksIHZvaWQgKiBvYmogKTsKK2V4dGVybiB2b2lkIF9fa21wX3dhaXRfeWllbGRfNF9wdHIoIHZvaWQgKiBzcGlubmVyLCBrbXBfdWludDMyIGNoZWNrZXIsIGttcF91aW50MzIgKCogcHJlZCkoIHZvaWQgKiwga21wX3VpbnQzMiApLCB2b2lkICogb2JqICk7CisKK2NsYXNzIGttcF9mbGFnXzMyOworY2xhc3Mga21wX2ZsYWdfNjQ7CitjbGFzcyBrbXBfZmxhZ19vbmNvcmU7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0XzY0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgLCB2b2lkICogaXR0X3N5bmNfb2JqCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVsZWFzZV82NChrbXBfZmxhZ182NCAqZmxhZyk7CisKK2V4dGVybiB2b2lkIF9fa21wX2luZmluaXRlX2xvb3AoIHZvaWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgZXh0ZXJuIGludCAgX19rbXBfaGFuZGxlX3NpZ25hbHM7CisgICAgZXh0ZXJuIHZvaWQgX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApOworICAgIGV4dGVybiB2b2lkIF9fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICk7CisjZW5kaWYKKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYWRfc3lzdGVtX3RpbWUoIGRvdWJsZSAqZGVsdGEgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCgga21wX2luZm9fdCAqdGhyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2V4cGFuZF9ob3N0X25hbWUoIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUgKTsKK2V4dGVybiB2b2lkIF9fa21wX2V4cGFuZF9maWxlX25hbWUoIGNoYXIgKnJlc3VsdCwgc2l6ZV90IHJsZW4sIGNoYXIgKnBhdHRlcm4gKTsKKworI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gdm9pZCBfX2ttcF9pbml0aWFsaXplX3N5c3RlbV90aWNrKCB2b2lkICk7ICAvKiBJbml0aWFsaXplIHRpbWVyIHRpY2sgdmFsdWUgKi8KKyNlbmRpZgorCitleHRlcm4gdm9pZCBfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKTsgIC8qIG1hY2hpbmUgc3BlY2lmaWMgaW5pdGlhbGl6YXRpb24gKi8KK2V4dGVybiB2b2lkIF9fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApOworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorZXh0ZXJuIGNoYXIgKl9fa21wX2FmZmluaXR5X3ByaW50X21hc2soY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwga21wX2FmZmluX21hc2tfdCAqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfdW5pbml0aWFsaXplKHZvaWQpOworZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhpbnQgZ3RpZCwgaW50IGlzYV9yb290KTsgLyogc2V0IGFmZmluaXR5IGFjY29yZGluZyB0byBLTVBfQUZGSU5JVFkgKi8KKyNpZiBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlKGludCBndGlkKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGUoIGNvbnN0IGNoYXIgKmVudl92YXIgKTsKK2V4dGVybiBpbnQgX19rbXBfYXV4X3NldF9hZmZpbml0eSh2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHkodm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyhpbnQgcHJvYywgdm9pZCAqKm1hc2spOworZXh0ZXJuIGludCBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gaW50IF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzayk7CitleHRlcm4gdm9pZCBfX2ttcF9iYWxhbmNlZF9hZmZpbml0eSggaW50IHRpZCwgaW50IHRlYW1fc2l6ZSApOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKTsKK2V4dGVybiB2b2lkIF9fa21wX2dldF9oaWVyYXJjaHkoa21wX3VpbnQzMiBucHJvYywga21wX2JzdGF0ZV90ICp0aHJfYmFyKTsKKworI2lmIEtNUF9VU0VfRlVURVgKKworZXh0ZXJuIGludCBfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSggdm9pZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCitleHRlcm4gdm9pZCBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKTsKK2V4dGVybiBpbnQgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCB2b2lkICk7CisKK2V4dGVybiBkb3VibGUgX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApOworCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApOworCitleHRlcm4gdm9pZCAqX19rbXBfbGF1bmNoX3RocmVhZCgga21wX2luZm9fdCAqdGhyICk7CisKK2V4dGVybiB2b2lkIF9fa21wX2NyZWF0ZV93b3JrZXIoIGludCBndGlkLCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHN0YWNrX3NpemUgKTsKKworI2lmIEtNUF9PU19XSU5ET1dTCitleHRlcm4gaW50ICBfX2ttcF9zdGlsbF9ydW5uaW5nKGttcF9pbmZvX3QgKnRoKTsKK2V4dGVybiBpbnQgIF9fa21wX2lzX3RocmVhZF9hbGl2ZSgga21wX2luZm9fdCAqIHRoLCBEV09SRCAqZXhpdF92YWwgKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApOworI2VuZGlmCisKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlYXBfd29ya2VyKCBrbXBfaW5mb190ICp0aCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGVybWluYXRlX3RocmVhZCggaW50IGd0aWQgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfc3VzcGVuZF8zMiggaW50IHRoX2d0aWQsIGttcF9mbGFnXzMyICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kXzY0KCBpbnQgdGhfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfb25jb3JlKCBpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnICk7CitleHRlcm4gdm9pZCBfX2ttcF9yZXN1bWVfMzIoIGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfMzIgKmZsYWcgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Jlc3VtZV82NCggaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ182NCAqZmxhZyApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVzdW1lX29uY29yZSggaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZWxhcHNlZCggZG91YmxlICogKTsKK2V4dGVybiB2b2lkIF9fa21wX2VsYXBzZWRfdGljayggZG91YmxlICogKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfZW5hYmxlKCBpbnQgb2xkX3N0YXRlICk7CitleHRlcm4gdm9pZCBfX2ttcF9kaXNhYmxlKCBpbnQgKm9sZF9zdGF0ZSApOworCitleHRlcm4gdm9pZCBfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKTsKKworZXh0ZXJuIHZvaWQgX19rbXBfY29tbW9uX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NvbW1vbl9kZXN0cm95KCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF9jb21tb25fZGVzdHJveV9ndGlkKCBpbnQgZ3RpZCApOworCisjaWYgS01QX09TX1VOSVgKK2V4dGVybiB2b2lkIF9fa21wX3JlZ2lzdGVyX2F0Zm9yayggdm9pZCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKTsKKworZXh0ZXJuIGttcF9pbmZvX3QgKiBfX2ttcF9hbGxvY2F0ZV90aHJlYWQoIGttcF9yb290X3QgKnJvb3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCk7CisjaWYgT01QXzQwX0VOQUJMRUQKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfYWxsb2NhdGVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwgaW50IG5ld19ucHJvYywgaW50IG1heF9ucHJvYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjIFVTRV9ORVNURURfSE9UX0FSRyhrbXBfaW5mb190ICp0aHIpICk7CisjZWxzZQorZXh0ZXJuIGttcF90ZWFtX3QgKiBfX2ttcF9hbGxvY2F0ZV90ZWFtKCBrbXBfcm9vdF90ICpyb290LCBpbnQgbmV3X25wcm9jLCBpbnQgbWF4X25wcm9jLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICpuZXdfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKnRocikgKTsKKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90aHJlYWQoIGttcF9pbmZvX3QgKiApOworZXh0ZXJuIHZvaWQgX19rbXBfZnJlZV90ZWFtKCBrbXBfcm9vdF90ICosIGttcF90ZWFtX3QgKiAgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKikgKTsKK2V4dGVybiBrbXBfdGVhbV90ICogX19rbXBfcmVhcF90ZWFtKCBrbXBfdGVhbV90ICogKTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK2V4dGVybiB2b2lkIF9fa21wX2luaXRpYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKTsKK2V4dGVybiB2b2lkIF9fa21wX2ZpbmFsaXplX2JnZXQoIGttcF9pbmZvX3QgKnRoICk7CisKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19tYWxsb2MoIHNpemVfdCBzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfYWxpZ25lZF9tYWxsb2MoIHNpemVfdCBzaXplLCBzaXplX3QgYWxpZ25tZW50ICk7CitLTVBfRVhQT1JUIHZvaWQgKmttcGNfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKTsKK0tNUF9FWFBPUlQgdm9pZCAqa21wY19yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICk7CitLTVBfRVhQT1JUIHZvaWQgIGttcGNfZnJlZSggdm9pZCAqcHRyICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogZGVjbGFyYXRpb25zIGZvciBpbnRlcm5hbCB1c2UgKi8KKworZXh0ZXJuIGludCAgX19rbXBfYmFycmllciggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkLCBpbnQgaXNfc3BsaXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikgKTsKK2V4dGVybiB2b2lkIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyICggZW51bSBiYXJyaWVyX3R5cGUgYnQsIGludCBndGlkICk7CisKKy8qIQorICogVGVsbCB0aGUgZm9yayBjYWxsIHdoaWNoIGNvbXBpbGVyIGdlbmVyYXRlZCB0aGUgZm9yayBjYWxsLCBhbmQgdGhlcmVmb3JlIGhvdyB0byBkZWFsIHdpdGggdGhlIGNhbGwuCisgKi8KK2VudW0gZm9ya19jb250ZXh0X2UKK3sKKyAgICBmb3JrX2NvbnRleHRfZ251LCAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qKjwgQ2FsbGVkIGZyb20gR05VIGdlbmVyYXRlZCBjb2RlLCBzbyBtdXN0IG5vdCBpbnZva2UgdGhlIG1pY3JvdGFzayBpbnRlcm5hbGx5LiAqLworICAgIGZvcmtfY29udGV4dF9pbnRlbCwgICAgICAgICAgICAgICAgICAgICAgICAgLyoqPCBDYWxsZWQgZnJvbSBJbnRlbCBnZW5lcmF0ZWQgY29kZS4gICovCisgICAgZm9ya19jb250ZXh0X2xhc3QKK307CitleHRlcm4gaW50IF9fa21wX2ZvcmtfY2FsbCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQsCisgIGttcF9pbnQzMiBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICB2b2lkICp1bndyYXBwZWRfdGFzaywKKyNlbmRpZgorICBtaWNyb3Rhc2tfdCBtaWNyb3Rhc2ssIGxhdW5jaF90IGludm9rZXIsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmFfbGlzdCAqYXAKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZhX2xpc3QgYXAKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitleHRlcm4gdm9pZCBfX2ttcF9qb2luX2NhbGwoIGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZW51bSBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludCBleGl0X3RlYW1zID0gMAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworCitleHRlcm4gdm9pZCBfX2ttcF9zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmlkLCBrbXBfaW50MzIgZ3RpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbnRlcm5hbF9mb3JrKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGttcF90ZWFtX3QgKnRlYW0gKTsKK2V4dGVybiB2b2lkIF9fa21wX2ludGVybmFsX2pvaW4oIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfcnVuX2JlZm9yZV9pbnZva2VkX3Rhc2soIGludCBndGlkLCBpbnQgdGlkLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICk7CisKKy8vIHNob3VsZCBuZXZlciBoYXZlIGJlZW4gZXhwb3J0ZWQKK0tNUF9FWFBPUlQgaW50IF9fa21wY19pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApOworI2lmIE9NUF80MF9FTkFCTEVECitleHRlcm4gaW50ICBfX2ttcF9pbnZva2VfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApOworI2VuZGlmCitleHRlcm4gdm9pZCBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCBrbXBfaW5mb190ICogdGhyZWFkICk7CitleHRlcm4gdm9pZCBfX2ttcF91c2VyX3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcpOworZXh0ZXJuIHZvaWQgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCk7CitleHRlcm4gdm9pZCBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyLCBpbnQgbGVuICk7CisKKy8qIEZ1bmN0aW9ucyBiZWxvdyBwdXQgaGVyZSB0byBjYWxsIHRoZW0gZnJvbSBfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoKSBpbiBrbXBfc2V0dGluZ3MuYyAqLwordm9pZCBrbXBjX3NldF9ibG9ja3RpbWUgKGludCBhcmcpOwordm9pZCBvbXBjX3NldF9uZXN0ZWQoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X2R5bmFtaWMoIGludCBmbGFnICk7Cit2b2lkIG9tcGNfc2V0X251bV90aHJlYWRzKCBpbnQgYXJnICk7CisKK2V4dGVybiB2b2lkIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIsCisgICAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApOworZXh0ZXJuIGttcF90YXNrX3QqIF9fa21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLAorICBrbXBfdGFza2luZ19mbGFnc190ICpmbGFncywgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3RociwKKyAgICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQsIGludCBzZXRfY3Vycl90YXNrICk7CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzMyICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmosCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzY0KGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzY0ICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKiBpdHRfc3luY19vYmosCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKTsKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzX29uY29yZShrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ19vbmNvcmUgKmZsYWcsIGludCBmaW5hbF9zcGluLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkLAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqLAorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpOworCitleHRlcm4gdm9pZCBfX2ttcF9mcmVlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfcmVhcF90YXNrX3RlYW1zKCB2b2lkICk7CitleHRlcm4gdm9pZCBfX2ttcF93YWl0X3RvX3VucmVmX3Rhc2tfdGVhbXMoIHZvaWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX3Rhc2tfdGVhbV9zZXR1cCAoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgYWx3YXlzICk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNrX3RlYW1fc3luYyAgKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSApOworZXh0ZXJuIHZvaWQgX19rbXBfdGFza190ZWFtX3dhaXQgICgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKiBpdHRfc3luY19vYmoKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIGludCB3YWl0PTEKKyk7CitleHRlcm4gdm9pZCBfX2ttcF90YXNraW5nX2JhcnJpZXIoIGttcF90ZWFtX3QgKnRlYW0sIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IGd0aWQgKTsKKworZXh0ZXJuIGludCAgX19rbXBfaXNfYWRkcmVzc19tYXBwZWQoIHZvaWQgKmFkZHIgKTsKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCh2b2lkKTsKKworI2lmIEtNUF9PU19VTklYCitleHRlcm4gaW50ICBfX2ttcF9yZWFkX2Zyb21fZmlsZSggY2hhciBjb25zdCAqcGF0aCwgY2hhciBjb25zdCAqZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBBc3NlbWJseSByb3V0aW5lcyB0aGF0IGhhdmUgbm8gY29tcGlsZXIgaW50cmluc2ljIHJlcGxhY2VtZW50CisvLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitleHRlcm4gdm9pZCAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApOworCisjZGVmaW5lIF9fa21wX2xvYWRfbXhjc3IocCkgX21tX3NldGNzcigqKHApKQorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N0b3JlX214Y3NyKCBrbXBfdWludDMyICpwICkgeyAqcCA9IF9tbV9nZXRjc3IoKTsgfQorCitleHRlcm4gdm9pZCBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKK2V4dGVybiB2b2lkIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyMgZGVmaW5lIEtNUF9YODZfTVhDU1JfTUFTSyAgICAgIDB4ZmZmZmZmYzAgICAvKiBpZ25vcmUgc3RhdHVzIGZsYWdzICg2IGxzYikgKi8KKworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworZXh0ZXJuIGludCBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLCBpbnQgZ3RpZCwgaW50IG5wciwgaW50IGFyZ2MsIHZvaWQgKmFyZ3ZbXQorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKipleGl0X2ZyYW1lX3B0cgorI2VuZGlmCispOworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfYmVnaW4gICAgICAgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBmbGFncyApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZCAgICAgICAgICAgICAgICAgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3Rvcl92ZWMgY3RvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wY19jY3Rvcl92ZWMgY2N0b3IsIGttcGNfZHRvcl92ZWMgZHRvciwgc2l6ZV90IHZlY3Rvcl9sZW5ndGggKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyICAgICAoIGlkZW50X3QgKiwgdm9pZCAqIGRhdGEsIGttcGNfY3RvciBjdG9yLCBrbXBjX2NjdG9yIGNjdG9yLCBrbXBjX2R0b3IgZHRvciApOworS01QX0VYUE9SVCB2b2lkICogX19rbXBjX3RocmVhZHByaXZhdGUgICAgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqIGRhdGEsIHNpemVfdCBzaXplICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0gICggaWRlbnRfdCAqICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkcyAoIGlkZW50X3QgKiApOworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19ib3VuZF90aHJlYWRfbnVtICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfYm91bmRfbnVtX3RocmVhZHMgICggaWRlbnRfdCAqICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfb2tfdG9fZm9yayAgICAgKCBpZGVudF90ICogKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mb3JrX2NhbGwgICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBuYXJncywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLiApOworCitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19mbHVzaCAgICAgICAgICAgICAgKCBpZGVudF90ICopOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2JhcnJpZXIgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfbWFzdGVyICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX21hc3RlciAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX29yZGVyZWQgICAgICAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCAgIF9fa21wY19lbmRfb3JkZXJlZCAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfY3JpdGljYWwgICAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9jcml0aWNhbCAgICAgICAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICogKTsKKworI2lmIE9NUF80NV9FTkFCTEVECitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfY3JpdGljYWxfd2l0aF9oaW50ICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiwgdWludHB0cl90IGhpbnQgKTsKKyNlbmRpZgorCitLTVBfRVhQT1JUIGttcF9pbnQzMiAgX19rbXBjX2JhcnJpZXJfbWFzdGVyICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworS01QX0VYUE9SVCB2b2lkICAgX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlciAoIGlkZW50X3QgKiwga21wX2ludDMyIGdsb2JhbF90aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgIF9fa21wY19iYXJyaWVyX21hc3Rlcl9ub3dhaXQgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CisKK0tNUF9FWFBPUlQga21wX2ludDMyICBfX2ttcGNfc2luZ2xlICAgICAgICAgKCBpZGVudF90ICosIGttcF9pbnQzMiBnbG9iYWxfdGlkICk7CitLTVBfRVhQT1JUIHZvaWQgICBfX2ttcGNfZW5kX3NpbmdsZSAgICAgICAgICggaWRlbnRfdCAqLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIHZvaWQgS01QQ19GT1JfU1RBVElDX0lOSVQgICAgKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQgKnBsb3dlciwga21wX2ludCAqcHVwcGVyLCBrbXBfaW50ICpwc3RyaWRlLCBrbXBfaW50IGluY3IsIGttcF9pbnQgY2h1bmsgKTsKKworS01QX0VYUE9SVCB2b2lkIF9fa21wY19mb3Jfc3RhdGljX2ZpbmkgICggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApOworCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2NvcHlwcml2YXRlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBzaXplX3QgY3B5X3NpemUsIHZvaWQgKmNweV9kYXRhLCB2b2lkKCpjcHlfZnVuYykodm9pZCosdm9pZCopLCBrbXBfaW50MzIgZGlkaXQgKTsKKworZXh0ZXJuIHZvaWQgS01QQ19TRVRfTlVNX1RIUkVBRFMgICAgICAgICggaW50IGFyZyApOworZXh0ZXJuIHZvaWQgS01QQ19TRVRfRFlOQU1JQyAgICAgICAgICAgICggaW50IGZsYWcgKTsKK2V4dGVybiB2b2lkIEtNUENfU0VUX05FU1RFRCAgICAgICAgICAgICAoIGludCBmbGFnICk7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3EgaW50ZXJmYWNlIHJvdXRpbmVzCisgKi8KKworS01QX0VYUE9SVCBrbXBjX3RodW5rX3QgKiBfX2ttcGNfdGFza3EgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza190IHRhc2txX3Rhc2ssIHNpemVfdCBzaXplb2ZfdGh1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9zaGFyZWRzLCBrbXBfaW50MzIgZmxhZ3MsIGttcGNfc2hhcmVkX3ZhcnNfdCAqKnNoYXJlZHMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfdGFza3EgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3Rhc2sgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspOworS01QX0VYUE9SVCB2b2lkIF9fa21wY190YXNrcV90YXNrIChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgc3RhdHVzKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmspOworS01QX0VYUE9SVCBrbXBjX3RodW5rX3QgKiBfX2ttcGNfdGFza19idWZmZXIgKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGFza3FfdGh1bmssIGttcGNfdGFza190IHRhc2spOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIE9NUCAzLjAgdGFza2luZyBpbnRlcmZhY2Ugcm91dGluZXMKKyAqLworCitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrICk7CitLTVBfRVhQT1JUIGttcF90YXNrX3QqCitfX2ttcGNfb21wX3Rhc2tfYWxsb2MoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgZmxhZ3MsCisgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICAgICAgICAgICBrbXBfcm91dGluZV9lbnRyeV90IHRhc2tfZW50cnkgKTsKK0tNUF9FWFBPUlQgdm9pZAorX19rbXBjX29tcF90YXNrX2JlZ2luX2lmMCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICk7CitLTVBfRVhQT1JUIHZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrX3BhcnRzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrICk7CitLTVBfRVhQT1JUIGttcF9pbnQzMgorX19rbXBjX29tcF90YXNrd2FpdCggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3lpZWxkKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwgaW50IGVuZF9wYXJ0ICk7CisKKyNpZiBUQVNLX1VOVVNFRAordm9pZCBfX2ttcGNfb21wX3Rhc2tfYmVnaW4oIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogdGFzayApOwordm9pZCBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGUoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICk7CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCAqIGxvYywgaW50IGd0aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3Rhc2tncm91cCggaWRlbnRfdCAqIGxvYywgaW50IGd0aWQgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX29tcF90YXNrX3dpdGhfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX29tcF93YWl0X2RlcHMgKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKTsKK2V4dGVybiB2b2lkIF9fa21wX3JlbGVhc2VfZGVwcyAoIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza2RhdGFfdCAqdGFzayApOworCitleHRlcm4ga21wX2ludDMyIF9fa21wX29tcF90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLCBib29sIHNlcmlhbGl6ZV9pbW1lZGlhdGUgKTsKKworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbChpZGVudF90KiBsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIGNuY2xfa2luZCk7CitLTVBfRVhQT1JUIGttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX2NhbmNlbF9iYXJyaWVyKGlkZW50X3QqIGxvY19yZWYsIGttcF9pbnQzMiBndGlkKTsKK0tNUF9FWFBPUlQgaW50IF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGludCBjYW5jZWxfa2luZCk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorCitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Byb3h5X3Rhc2tfY29tcGxldGVkKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqcHRhc2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vICgga21wX3Rhc2tfdCAqcHRhc2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywga21wX2ludDMyIGlmX3ZhbCwKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgbm9ncm91cCwga21wX2ludDMyIHNjaGVkLCBrbXBfdWludDY0IGdyYWluc2l6ZSwgdm9pZCAqIHRhc2tfZHVwICk7CisjZW5kaWYKKworI2VuZGlmCisKKworLyoKKyAqIExvY2sgaW50ZXJmYWNlIHJvdXRpbmVzIChmYXN0IHZlcnNpb25zIHdpdGggZ3RpZCBwYXNzZWQgaW4pCisgKi8KK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfaW5pdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCAgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kZXN0cm95X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3Vuc2V0X25lc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbG9jayggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jayApOworS01QX0VYUE9SVCBpbnQgX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X2xvY2tfd2l0aF9oaW50KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgaGludCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19pbml0X25lc3RfbG9ja193aXRoX2hpbnQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2ssIHVpbnRwdHJfdCBoaW50ICk7CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlX2Z1bmMpKHZvaWQgKmxoc19kYXRhLCB2b2lkICpyaHNfZGF0YSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19lbmRfcmVkdWNlX25vd2FpdCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBjX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZW5kX3JlZHVjZSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKmxjayApOworCisvKgorICogaW50ZXJuYWwgZmFzdCByZWR1Y3Rpb24gcm91dGluZXMKKyAqLworCitleHRlcm4gUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICk7CisKKy8vIHRoaXMgZnVuY3Rpb24gaXMgZm9yIHRlc3Rpbmcgc2V0L2dldC9kZXRlcm1pbmUgcmVkdWNlIG1ldGhvZAorS01QX0VYUE9SVCBrbXBfaW50MzIgX19rbXBfZ2V0X3JlZHVjZV9tZXRob2QoIHZvaWQgKTsKKworS01QX0VYUE9SVCBrbXBfdWludDY0IF9fa21wY19nZXRfdGFza2lkKCk7CitLTVBfRVhQT1JUIGttcF91aW50NjQgX19rbXBjX2dldF9wYXJlbnRfdGFza2lkKCk7CisKKy8vIHRoaXMgZnVuY3Rpb24gZXhwb3J0ZWQgZm9yIHRlc3Rpbmcgb2YgS01QX1BMQUNFX1RIUkVBRFMgZnVuY3Rpb25hbGl0eQorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wbGFjZV90aHJlYWRzKGludCxpbnQsaW50LGludCxpbnQpOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvLyBDKysgcG9ydAorLy8gbWlzc2luZyAnZXh0ZXJuICJDIicgZGVjbGFyYXRpb25zCisKK0tNUF9FWFBPUlQga21wX2ludDMyIF9fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX3BvcF9udW1fdGhyZWFkcyggIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfcHVzaF9udW1fdGhyZWFkcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90aHJlYWRzICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX3Byb2NfYmluZCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgaW50IHByb2NfYmluZCApOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2ludDMyIG51bV90ZWFtcywga21wX2ludDMyIG51bV90aHJlYWRzICk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2ZvcmtfdGVhbXMoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgYXJnYywga21wY19taWNybyBtaWNyb3Rhc2ssIC4uLik7CisjZW5kaWYKKyNpZiBPTVBfNDVfRU5BQkxFRAorc3RydWN0IGttcF9kaW0geyAgLy8gbG9vcCBib3VuZHMgaW5mbyBjYXN0ZWQgdG8ga21wX2ludDY0CisgICAga21wX2ludDY0IGxvOyAvLyBsb3dlcgorICAgIGttcF9pbnQ2NCB1cDsgLy8gdXBwZXIKKyAgICBrbXBfaW50NjQgc3Q7IC8vIHN0cmlkZQorfTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZG9hY3Jvc3NfaW5pdChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgbnVtX2RpbXMsIHN0cnVjdCBrbXBfZGltICogZGltcyk7CitLTVBfRVhQT1JUIHZvaWQgX19rbXBjX2RvYWNyb3NzX3dhaXQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDY0ICp2ZWMpOworS01QX0VYUE9SVCB2b2lkIF9fa21wY19kb2Fjcm9zc19wb3N0KGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQ2NCAqdmVjKTsKK0tNUF9FWFBPUlQgdm9pZCBfX2ttcGNfZG9hY3Jvc3NfZmluaShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKTsKKyNlbmRpZgorCitLTVBfRVhQT1JUIHZvaWQqCitfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICogZGF0YSwgc2l6ZV90IHNpemUsIHZvaWQgKioqIGNhY2hlICk7CisKKy8vIFN5bWJvbHMgZm9yIE1TIG11dHVhbCBkZXRlY3Rpb24uCitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfZXhhY3RseV9vbmVfT3Blbk1QX2xpYnJhcnk7CitleHRlcm4gaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfSW50ZWxfT3Blbk1QX2xpYnJhcnk7CisjaWYgS01QX09TX1dJTkRPV1MgJiYgKCBLTVBfVkVSU0lPTl9NQUpPUiA+IDQgKQorICAgIGV4dGVybiBpbnQgX1lvdV9tdXN0X2xpbmtfd2l0aF9NaWNyb3NvZnRfT3Blbk1QX2xpYnJhcnk7CisjZW5kaWYKKworCisvLyBUaGUgcm91dGluZXMgYmVsb3cgYXJlIG5vdCBleHBvcnRlZC4KKy8vIENvbnNpZGVyIG1ha2luZyB0aGVtICdzdGF0aWMnIGluIGNvcnJlc3BvbmRpbmcgc291cmNlIGZpbGVzLgordm9pZAora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKTsKK3N0cnVjdCBwcml2YXRlX2NvbW1vbiAqCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CisKKy8vCisvLyBvbXBjXywga21wY18gZW50cmllcyBtb3ZlZCBmcm9tIG9tcC5oLgorLy8KKyNpZiBLTVBfT1NfV0lORE9XUworIyAgIGRlZmluZSBLTVBDX0NPTlZFTlRJT04gX19jZGVjbAorI2Vsc2UKKyMgICBkZWZpbmUgS01QQ19DT05WRU5USU9OCisjZW5kaWYKKworI2lmbmRlZiBfX09NUF9ICit0eXBlZGVmIGVudW0gb21wX3NjaGVkX3QgeworICAgIG9tcF9zY2hlZF9zdGF0aWMgID0gMSwKKyAgICBvbXBfc2NoZWRfZHluYW1pYyA9IDIsCisgICAgb21wX3NjaGVkX2d1aWRlZCAgPSAzLAorICAgIG9tcF9zY2hlZF9hdXRvICAgID0gNAorfSBvbXBfc2NoZWRfdDsKK3R5cGVkZWYgdm9pZCAqIGttcF9hZmZpbml0eV9tYXNrX3Q7CisjZW5kaWYKKworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyhpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBvbXBjX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfdCwgaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04gb21wY19nZXRfYW5jZXN0b3JfdGhyZWFkX251bShpbnQpOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBvbXBjX2dldF90ZWFtX3NpemUoaW50KTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY19zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCwga21wX2FmZmluaXR5X21hc2tfdCAqKTsKK0tNUF9FWFBPUlQgaW50ICBLTVBDX0NPTlZFTlRJT04ga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworS01QX0VYUE9SVCBpbnQgIEtNUENfQ09OVkVOVElPTiBrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50LCBrbXBfYWZmaW5pdHlfbWFza190ICopOworCitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X3N0YWNrc2l6ZShpbnQpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9zdGFja3NpemVfcyhzaXplX3QpOworS01QX0VYUE9SVCB2b2lkIEtNUENfQ09OVkVOVElPTiBrbXBjX3NldF9saWJyYXJ5KGludCk7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2RlZmF1bHRzKGNoYXIgY29uc3QgKik7CitLTVBfRVhQT1JUIHZvaWQgS01QQ19DT05WRU5USU9OIGttcGNfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMoaW50KTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9IICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9hZmZpbml0eS5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZmNhODdkOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuY3BwCkBAIC0wLDAgKzEsNDgyMSBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5jcHAgLS0gYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3dyYXBwZXJfZ2V0cGlkLmgiCisjaW5jbHVkZSAia21wX2FmZmluaXR5LmgiCisKKy8vIFN0b3JlIHRoZSByZWFsIG9yIGltYWdpbmVkIG1hY2hpbmUgaGllcmFyY2h5IGhlcmUKK3N0YXRpYyBoaWVyYXJjaHlfaW5mbyBtYWNoaW5lX2hpZXJhcmNoeTsKKwordm9pZCBfX2ttcF9jbGVhbnVwX2hpZXJhcmNoeSgpIHsKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5maW5pKCk7Cit9CisKK3ZvaWQgX19rbXBfZ2V0X2hpZXJhcmNoeShrbXBfdWludDMyIG5wcm9jLCBrbXBfYnN0YXRlX3QgKnRocl9iYXIpIHsKKyAgICBrbXBfdWludDMyIGRlcHRoOworICAgIC8vIFRoZSB0ZXN0IGJlbG93IGlzIHRydWUgaWYgYWZmaW5pdHkgaXMgYXZhaWxhYmxlLCBidXQgc2V0IHRvICJub25lIi4gTmVlZCB0byBpbml0IG9uIGZpcnN0IHVzZSBvZiBoaWVyYXJjaGljYWwgYmFycmllci4KKyAgICBpZiAoVENSXzEobWFjaGluZV9oaWVyYXJjaHkudW5pbml0aWFsaXplZCkpCisgICAgICAgIG1hY2hpbmVfaGllcmFyY2h5LmluaXQoTlVMTCwgbnByb2MpOworCisgICAgLy8gQWRqdXN0IHRoZSBoaWVyYXJjaHkgaW4gY2FzZSBudW0gdGhyZWFkcyBleGNlZWRzIG9yaWdpbmFsCisgICAgaWYgKG5wcm9jID4gbWFjaGluZV9oaWVyYXJjaHkuYmFzZV9udW1fdGhyZWFkcykKKyAgICAgICAgbWFjaGluZV9oaWVyYXJjaHkucmVzaXplKG5wcm9jKTsKKworICAgIGRlcHRoID0gbWFjaGluZV9oaWVyYXJjaHkuZGVwdGg7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA+IDApOworCisgICAgdGhyX2Jhci0+ZGVwdGggPSBkZXB0aDsKKyAgICB0aHJfYmFyLT5iYXNlX2xlYWZfa2lkcyA9IChrbXBfdWludDgpbWFjaGluZV9oaWVyYXJjaHkubnVtUGVyTGV2ZWxbMF0tMTsKKyAgICB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbCA9IG1hY2hpbmVfaGllcmFyY2h5LnNraXBQZXJMZXZlbDsKK30KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8KKy8vIFByaW50IHRoZSBhZmZpbml0eSBtYXNrIHRvIHRoZSBjaGFyYWN0ZXIgYXJyYXkgaW4gYSBwcmV0dHkgZm9ybWF0LgorLy8KKyNpZiBLTVBfVVNFX0hXTE9DCitjaGFyICoKK19fa21wX2FmZmluaXR5X3ByaW50X21hc2soY2hhciAqYnVmLCBpbnQgYnVmX2xlbiwga21wX2FmZmluX21hc2tfdCAqbWFzaykKK3sKKyAgICBpbnQgbnVtX2NoYXJzX3RvX3dyaXRlLCBudW1fY2hhcnNfd3JpdHRlbjsKKyAgICBjaGFyKiBzY2FuOworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisKKyAgICAvLyBidWZzaXplIG9mIDAganVzdCByZXRyaWV2ZXMgdGhlIG5lZWRlZCBidWZmZXIgc2l6ZS4KKyAgICBudW1fY2hhcnNfdG9fd3JpdGUgPSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZihidWYsIDAsIChod2xvY19iaXRtYXBfdCltYXNrKTsKKworICAgIC8vIG5lZWQgJ3snLCAieHh4eHh4eHguLi54eCIsICd9JywgJ1wwJyA9IG51bV9jaGFyc190b193cml0ZSArIDMgYnl0ZXMKKyAgICAvLyAqIG51bV9jaGFyc190b193cml0ZSByZXR1cm5lZCBieSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZiBkb2VzIG5vdAorICAgIC8vICAgdGFrZSBpbnRvIGFjY291bnQgdGhlICdcMCcgY2hhcmFjdGVyLgorICAgIGlmKGh3bG9jX2JpdG1hcF9pc3plcm8oKGh3bG9jX2JpdG1hcF90KW1hc2spKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihidWYsIGJ1Zl9sZW4sICJ7PGVtcHR5Pn0iKTsKKyAgICB9IGVsc2UgaWYobnVtX2NoYXJzX3RvX3dyaXRlIDwgYnVmX2xlbiAtIDMpIHsKKyAgICAgICAgLy8gbm8gcHJvYmxlbSBmaXR0aW5nIHRoZSBtYXNrIGludG8gYnVmX2xlbiBudW1iZXIgb2YgY2hhcmFjdGVycworICAgICAgICBidWZbMF0gPSAneyc7CisgICAgICAgIC8vIHVzZSBidWZfbGVuLTMgYmVjYXVzZSB3ZSBoYXZlIHRoZSB0aHJlZSBjaGFyYWN0ZXJzOiAneycgJ30nICdcMCcgdG8gYWRkIHRvIHRoZSBidWZmZXIKKyAgICAgICAgbnVtX2NoYXJzX3dyaXR0ZW4gPSBod2xvY19iaXRtYXBfbGlzdF9zbnByaW50ZihidWYrMSwgYnVmX2xlbi0zLCAoaHdsb2NfYml0bWFwX3QpbWFzayk7CisgICAgICAgIGJ1ZltudW1fY2hhcnNfd3JpdHRlbisxXSA9ICd9JzsKKyAgICAgICAgYnVmW251bV9jaGFyc193cml0dGVuKzJdID0gJ1wwJzsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHRydW5jYXRlIHRoZSBhZmZpbml0eSBtYXNrIHN0cmluZyBhbmQgYWRkIGVsbGlwc2lzLgorICAgICAgICAvLyBUbyBkbyB0aGlzLCB3ZSBmaXJzdCB3cml0ZSBvdXQgdGhlICd7JyArIHN0cihtYXNrKQorICAgICAgICBidWZbMF0gPSAneyc7CisgICAgICAgIGh3bG9jX2JpdG1hcF9saXN0X3NucHJpbnRmKGJ1ZisxLCBidWZfbGVuLTEsIChod2xvY19iaXRtYXBfdCltYXNrKTsKKyAgICAgICAgLy8gdGhlbiwgd2hhdCB3ZSBkbyBoZXJlIGlzIGdvIHRvIHRoZSA3dGggdG8gbGFzdCBjaGFyYWN0ZXIsIHRoZW4gZ28gYmFja3dhcmRzIHVudGlsIHdlIGFyZSBOT1QKKyAgICAgICAgLy8gb24gYSBkaWdpdCB0aGVuIHdyaXRlICIuLi59XDAiLiAgVGhpcyB3YXkgaXQgaXMgYSBjbGVhbiBlbGxpcHNpcyBhZGRpdGlvbiBhbmQgd2UgZG9uJ3QKKyAgICAgICAgLy8gb3ZlcndyaXRlIHBhcnQgb2YgYW4gYWZmaW5pdHkgbnVtYmVyLiBpLmUuLCB3ZSBhdm9pZCBzb21ldGhpbmcgbGlrZSB7IDQ1LCA2NywgOC4uLn0gYW5kIGdldAorICAgICAgICAvLyB7IDQ1LCA2NywuLi59IGluc3RlYWQuCisgICAgICAgIHNjYW4gPSBidWYgKyBidWZfbGVuIC0gNzsKKyAgICAgICAgd2hpbGUoKnNjYW4gPj0gJzAnICYmICpzY2FuIDw9ICc5JyAmJiBzY2FuID49IGJ1ZikKKyAgICAgICAgICAgIHNjYW4tLTsKKyAgICAgICAgKihzY2FuKzEpID0gJy4nOworICAgICAgICAqKHNjYW4rMikgPSAnLic7CisgICAgICAgICooc2NhbiszKSA9ICcuJzsKKyAgICAgICAgKihzY2FuKzQpID0gJ30nOworICAgICAgICAqKHNjYW4rNSkgPSAnXDAnOworICAgIH0KKyAgICByZXR1cm4gYnVmOworfQorI2Vsc2UKK2NoYXIgKgorX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhjaGFyICpidWYsIGludCBidWZfbGVuLCBrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9BU1NFUlQoYnVmX2xlbiA+PSA0MCk7CisgICAgY2hhciAqc2NhbiA9IGJ1ZjsKKyAgICBjaGFyICplbmQgPSBidWYgKyBidWZfbGVuIC0gMTsKKworICAgIC8vCisgICAgLy8gRmluZCBmaXJzdCBlbGVtZW50IC8gY2hlY2sgZm9yIGVtcHR5IHNldC4KKyAgICAvLworICAgIHNpemVfdCBpOworICAgIGZvciAoaSA9IDA7IGkgPCBLTVBfQ1BVX1NFVFNJWkU7IGkrKykgeworICAgICAgICBpZiAoS01QX0NQVV9JU1NFVChpLCBtYXNrKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICB9CisgICAgaWYgKGkgPT0gS01QX0NQVV9TRVRTSVpFKSB7CisgICAgICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAiezxlbXB0eT59Iik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgICAgIEtNUF9BU1NFUlQoc2NhbiA8PSBlbmQpOworICAgICAgICByZXR1cm4gYnVmOworICAgIH0KKworICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAieyVsZCIsIChsb25nKWkpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgaSsrOworICAgIGZvciAoOyBpIDwgS01QX0NQVV9TRVRTSVpFOyBpKyspIHsKKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChpLCBtYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYnVmZmVyIG92ZXJmbG93LiAgQSBzdHJpbmcgb2YgdGhlIGZvcm0gIiw8bj4iIHdpbGwgaGF2ZQorICAgICAgICAvLyBhdCBtb3N0IDEwIGNoYXJhY3RlcnMsIHBsdXMgd2Ugd2FudCB0byBsZWF2ZSByb29tIHRvIHByaW50ICIsLi4ufSIKKyAgICAgICAgLy8gaWYgdGhlIHNldCBpcyB0b28gbGFyZ2UgdG8gcHJpbnQgZm9yIGEgdG90YWwgb2YgMTUgY2hhcmFjdGVycy4KKyAgICAgICAgLy8gV2UgYWxyZWFkeSBsZWZ0IHJvb20gZm9yICdcMCcgaW4gc2V0dGluZyBlbmQuCisgICAgICAgIC8vCisgICAgICAgIGlmIChlbmQgLSBzY2FuIDwgMTUpIHsKKyAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgS01QX1NOUFJJTlRGKHNjYW4sIGVuZC1zY2FuKzEsICIsJS1sZCIsIChsb25nKWkpOworICAgICAgICB3aGlsZSAoKnNjYW4gIT0gJ1wwJykgc2NhbisrOworICAgIH0KKyAgICBpZiAoaSA8IEtNUF9DUFVfU0VUU0laRSkgeworICAgICAgICBLTVBfU05QUklOVEYoc2NhbiwgZW5kLXNjYW4rMSwgICIsLi4uIik7CisgICAgICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgfQorICAgIEtNUF9TTlBSSU5URihzY2FuLCBlbmQtc2NhbisxLCAifSIpOworICAgIHdoaWxlICgqc2NhbiAhPSAnXDAnKSBzY2FuKys7CisgICAgS01QX0FTU0VSVChzY2FuIDw9IGVuZCk7CisgICAgcmV0dXJuIGJ1ZjsKK30KKyNlbmRpZiAvLyBLTVBfVVNFX0hXTE9DCisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfZW50aXJlX21hY2hpbmVfbWFzayhrbXBfYWZmaW5fbWFza190ICptYXNrKQoreworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgIGludCBncm91cDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCAhPSBOVUxMKTsKKyAgICAgICAgZm9yIChncm91cCA9IDA7IGdyb3VwIDwgX19rbXBfbnVtX3Byb2NfZ3JvdXBzOyBncm91cCsrKSB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIGludCBudW0gPSBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudChncm91cCk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbnVtOyBpKyspIHsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVChpICsgZ3JvdXAgKiAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSksIG1hc2spOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UKKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIHsKKyAgICAgICAgaW50IHByb2M7CisgICAgICAgIGZvciAocHJvYyA9IDA7IHByb2MgPCBfX2ttcF94cHJvYzsgcHJvYysrKSB7CisgICAgICAgICAgICBLTVBfQ1BVX1NFVChwcm9jLCBtYXNrKTsKKyAgICAgICAgfQorICAgIH0KK30KKworLy8KKy8vIFdoZW4gc29ydGluZyBieSBsYWJlbHMsIF9fa21wX2FmZmluaXR5X2Fzc2lnbl9jaGlsZF9udW1zKCkgbXVzdCBmaXJzdCBiZQorLy8gY2FsbGVkIHRvIHJlbnVtYmVyIHRoZSBsYWJlbHMgZnJvbSBbMC4ubl0gYW5kIHBsYWNlIHRoZW0gaW50byB0aGUgY2hpbGRfbnVtCisvLyB2ZWN0b3Igb2YgdGhlIGFkZHJlc3Mgb2JqZWN0LiAgVGhpcyBpcyBkb25lIGluIGNhc2UgdGhlIGxhYmVscyB1c2VkIGZvcgorLy8gdGhlIGNoaWxkcmVuIGF0IG9uZSBub2RlIG9mIHRoZSBoaWVyYXJjaHkgZGlmZmVyIGZyb20gdGhvc2UgdXNlZCBmb3IKKy8vIGFub3RoZXIgbm9kZSBhdCB0aGUgc2FtZSBsZXZlbC4gIEV4YW1wbGU6ICBzdXBwb3NlIHRoZSBtYWNoaW5lIGhhcyAyIG5vZGVzCisvLyB3aXRoIDIgcGFja2FnZXMgZWFjaC4gIFRoZSBmaXJzdCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMSBhbmQgNjAyLCBhbmQKKy8vIHNlY29uZCBub2RlIGNvbnRhaW5zIHBhY2thZ2VzIDYwMyBhbmQgNjA0LiAgSWYgd2UgdHJ5IHRvIHNvcnQgdGhlIHRhYmxlCisvLyBmb3IgInNjYXR0ZXIiIGFmZmluaXR5LCB0aGUgdGFibGUgd2lsbCBzdGlsbCBiZSBzb3J0ZWQgNjAxLCA2MDIsIDYwMywgNjA0CisvLyBiZWNhdXNlIHdlIGFyZSBwYXlpbmcgYXR0ZW50aW9uIHRvIHRoZSBsYWJlbHMgdGhlbXNlbHZlcywgbm90IHRoZSBvcmRpbmFsCisvLyBjaGlsZCBudW1iZXJzLiAgQnkgdXNpbmcgdGhlIGNoaWxkIG51bWJlcnMgaW4gdGhlIHNvcnQsIHRoZSByZXN1bHQgaXMKKy8vIHswLDB9PTYwMSwgezAsMX09NjAzLCB7MSwwfT02MDIsIHsxLDF9PTYwNC4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsCisgIGludCBudW1BZGRycykKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bUFkZHJzID4gMCk7CisgICAgaW50IGRlcHRoID0gYWRkcmVzczJvcy0+Zmlyc3QuZGVwdGg7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3RMYWJlbCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworICAgIGludCBsYWJDdDsKKyAgICBmb3IgKGxhYkN0ID0gMDsgbGFiQ3QgPCBkZXB0aDsgbGFiQ3QrKykgeworICAgICAgICBhZGRyZXNzMm9zWzBdLmZpcnN0LmNoaWxkTnVtc1tsYWJDdF0gPSBjb3VudHNbbGFiQ3RdID0gMDsKKyAgICAgICAgbGFzdExhYmVsW2xhYkN0XSA9IGFkZHJlc3Myb3NbMF0uZmlyc3QubGFiZWxzW2xhYkN0XTsKKyAgICB9CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMTsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGlmIChhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF0gIT0gbGFzdExhYmVsW2xhYkN0XSkgeworICAgICAgICAgICAgICAgIGludCBsYWJDdDI7CisgICAgICAgICAgICAgICAgZm9yIChsYWJDdDIgPSBsYWJDdCArIDE7IGxhYkN0MiA8IGRlcHRoOyBsYWJDdDIrKykgeworICAgICAgICAgICAgICAgICAgICBjb3VudHNbbGFiQ3QyXSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdDJdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbbGFiQ3QyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRzW2xhYkN0XSsrOworICAgICAgICAgICAgICAgIGxhc3RMYWJlbFtsYWJDdF0gPSBhZGRyZXNzMm9zW2ldLmZpcnN0LmxhYmVsc1tsYWJDdF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZm9yIChsYWJDdCA9IDA7IGxhYkN0IDwgZGVwdGg7IGxhYkN0KyspIHsKKyAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QuY2hpbGROdW1zW2xhYkN0XSA9IGNvdW50c1tsYWJDdF07CisgICAgICAgIH0KKyAgICAgICAgZm9yICg7IGxhYkN0IDwgKGludClBZGRyZXNzOjptYXhEZXB0aDsgbGFiQ3QrKykgeworICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5jaGlsZE51bXNbbGFiQ3RdID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlKGxhc3RMYWJlbCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworfQorCisKKy8vCisvLyBBbGwgb2YgdGhlIF9fa21wX2FmZmluaXR5X2NyZWF0ZV8qX21hcCgpIHJvdXRpbmVzIHNob3VsZCBzZXQKKy8vIF9fa21wX2FmZmluaXR5X21hc2tzIHRvIGEgdmVjdG9yIG9mIGFmZmluaXR5IG1hc2sgb2JqZWN0cyBvZiBsZW5ndGgKKy8vIF9fa21wX2FmZmluaXR5X251bV9tYXNrcywgaWYgX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lLCBhbmQKKy8vIHJldHVybiB0aGUgbnVtYmVyIG9mIGxldmVscyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSB0cmVlICh6ZXJvIGlmCisvLyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpLgorLy8KKy8vIEFsbCBvZiB0aGUgX19rbXBfYWZmaW5pdHlfY3JlYXRlXypfbWFwKCkgcm91dGluZXMgc2hvdWxkIHNldCAqX19rbXBfYWZmaW5fZnVsbE1hc2sKKy8vIHRvIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkLiAgVGhleSBuZWVkIHRvIHNhdmUgYW5kCisvLyByZXN0b3JlIHRoZSBtYXNrLCBhbmQgaXQgY291bGQgYmUgbmVlZGVkIGxhdGVyLCBzbyBzYXZpbmcgaXQgaXMganVzdCBhbgorLy8gb3B0aW1pemF0aW9uIHRvIGF2b2lkIGNhbGxpbmcga21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKSBhZ2Fpbi4KKy8vCitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbl9mdWxsTWFzayA9IE5VTEw7CisKK3N0YXRpYyBpbnQgbkNvcmVzUGVyUGtnLCBuUGFja2FnZXM7CitzdGF0aWMgaW50IF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyNpZm5kZWYgS01QX0RGTFRfTlRIX0NPUkVTCitzdGF0aWMgaW50IF9fa21wX25jb3JlczsKKyNlbmRpZgorc3RhdGljIGludCAqX19rbXBfcHVfb3NfaWR4ID0gTlVMTDsKKworLy8KKy8vIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSBkb2Vzbid0IHdvcmsgd2hlbiBjYWxsZWQgZnJvbQorLy8gcGxhY2VzIHdoaWNoIHN1cHBvcnQgYXJiaXRyYXJpbHkgbWFueSBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kKKy8vIG1hcCwgaS5lLiB0aGUgbm9uLWRlZmF1bHQgY2FzZXMgaW4gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCkKKy8vIF9fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoKS4KKy8vCitpbmxpbmUgc3RhdGljIGJvb2wKK19fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKQoreworICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jID09IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBuQ29yZXNQZXJQa2cgKiBuUGFja2FnZXMpOworfQorCisKKy8vCisvLyBQcmludCBvdXQgdGhlIGRldGFpbGVkIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLCBpLmUuIHRoZSBwaHlzaWNhbCBsb2NhdGlvbnMKKy8vIG9mIGVhY2ggT1MgcHJvYy4KKy8vCitzdGF0aWMgdm9pZAorX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBsZW4sIGludCBkZXB0aCwKKyAgaW50IHBrZ0xldmVsLCBpbnQgY29yZUxldmVsLCBpbnQgdGhyZWFkTGV2ZWwpCit7CisgICAgaW50IHByb2M7CisKKyAgICBLTVBfSU5GT1JNKE9TUHJvY1RvUGh5c2ljYWxUaHJlYWRNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICBmb3IgKHByb2MgPSAwOyBwcm9jIDwgbGVuOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCZidWYpOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKGxldmVsID09IHRocmVhZExldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFRocmVhZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAobGV2ZWwgPT0gY29yZUxldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKENvcmUpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMgIiwgS01QX0kxOE5fU1RSKFBhY2thZ2UpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKGxldmVsID4gcGtnTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlc18lZCAiLCBLTVBfSTE4Tl9TVFIoTm9kZSksCisgICAgICAgICAgICAgICAgICBsZXZlbCAtIHBrZ0xldmVsIC0gMSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJMJWQgIiwgbGV2ZWwpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQgIiwKKyAgICAgICAgICAgICAgYWRkcmVzczJvc1twcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKE9TUHJvY01hcFRvUGFjaywgIktNUF9BRkZJTklUWSIsIGFkZHJlc3Myb3NbcHJvY10uc2Vjb25kLAorICAgICAgICAgIGJ1Zi5zdHIpOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoJmJ1Zik7CisgICAgfQorfQorCisjaWYgS01QX1VTRV9IV0xPQworCisvLyBUaGlzIGZ1bmN0aW9uIHJlbW92ZXMgdGhlIHRvcG9sb2d5IGxldmVscyB0aGF0IGFyZSByYWRpeCAxIGFuZCBkb24ndCBvZmZlcgorLy8gZnVydGhlciBpbmZvcm1hdGlvbiBhYm91dCB0aGUgdG9wb2xvZ3kuICBUaGUgbW9zdCBjb21tb24gZXhhbXBsZSBpcyB3aGVuIHlvdQorLy8gaGF2ZSBvbmUgdGhyZWFkIGNvbnRleHQgcGVyIGNvcmUsIHdlIGRvbid0IHdhbnQgdGhlIGV4dHJhIHRocmVhZCBjb250ZXh0CisvLyBsZXZlbCBpZiBpdCBvZmZlcnMgbm8gdW5pcXVlIGxhYmVscy4gIFNvIHRoZXkgYXJlIHJlbW92ZWQuCisvLyByZXR1cm4gdmFsdWU6IHRoZSBuZXcgZGVwdGggb2YgYWRkcmVzczJvcworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfcmVtb3ZlX3JhZGl4X29uZV9sZXZlbHMoQWRkclVuc1BhaXIgKmFkZHJlc3Myb3MsIGludCBuQWN0aXZlVGhyZWFkcywgaW50IGRlcHRoLCBpbnQqIHBrZ0xldmVsLCBpbnQqIGNvcmVMZXZlbCwgaW50KiB0aHJlYWRMZXZlbCkgeworICAgIGludCBsZXZlbDsKKyAgICBpbnQgaTsKKyAgICBpbnQgcmFkaXgxX2RldGVjdGVkOworCisgICAgZm9yIChsZXZlbCA9IGRlcHRoLTE7IGxldmVsID49IDA7IC0tbGV2ZWwpIHsKKyAgICAgICAgLy8gQWx3YXlzIGtlZXAgdGhlIHBhY2thZ2UgbGV2ZWwKKyAgICAgICAgaWYgKGxldmVsID09ICpwa2dMZXZlbCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBEZXRlY3QgaWYgdGhpcyBsZXZlbCBpcyByYWRpeCAxCisgICAgICAgIHJhZGl4MV9kZXRlY3RlZCA9IDE7CisgICAgICAgIGZvciAoaSA9IDE7IGkgPCBuQWN0aXZlVGhyZWFkczsgKytpKSB7CisgICAgICAgICAgICBpZiAoYWRkcmVzczJvc1swXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9IGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzW2xldmVsXSkgeworICAgICAgICAgICAgICAgIC8vIFRoZXJlIGFyZSBkaWZmZXJpbmcgbGFiZWwgdmFsdWVzIGZvciB0aGlzIGxldmVsIHNvIGl0IHN0YXlzCisgICAgICAgICAgICAgICAgcmFkaXgxX2RldGVjdGVkID0gMDsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIXJhZGl4MV9kZXRlY3RlZCkKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAvLyBSYWRpeCAxIHdhcyBkZXRlY3RlZAorICAgICAgICBpZiAobGV2ZWwgPT0gKnRocmVhZExldmVsKSB7CisgICAgICAgICAgICAvLyBJZiBvbmx5IG9uZSB0aHJlYWQgcGVyIGNvcmUsIHRoZW4ganVzdCBkZWNyZW1lbnQKKyAgICAgICAgICAgIC8vIHRoZSBkZXB0aCB3aGljaCByZW1vdmVzIHRoZSB0aHJlYWRsZXZlbCBmcm9tIGFkZHJlc3Myb3MKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuQWN0aXZlVGhyZWFkczsgKytpKSB7CisgICAgICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5kZXB0aC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKnRocmVhZExldmVsID0gLTE7CisgICAgICAgIH0gZWxzZSBpZiAobGV2ZWwgPT0gKmNvcmVMZXZlbCkgeworICAgICAgICAgICAgLy8gRm9yIGNvcmUgbGV2ZWwsIHdlIG1vdmUgdGhlIHRocmVhZCBsYWJlbHMgb3ZlciBpZiB0aGV5IGFyZSBzdGlsbAorICAgICAgICAgICAgLy8gdmFsaWQgKCp0aHJlYWRMZXZlbCAhPSAtMSksIGFuZCBhbHNvIHJlZHVjZSB0aGUgZGVwdGggYW5vdGhlciBsZXZlbAorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG5BY3RpdmVUaHJlYWRzOyArK2kpIHsKKyAgICAgICAgICAgICAgICBpZiAoKnRocmVhZExldmVsICE9IC0xKSB7CisgICAgICAgICAgICAgICAgICAgIGFkZHJlc3Myb3NbaV0uZmlyc3QubGFiZWxzWypjb3JlTGV2ZWxdID0gYWRkcmVzczJvc1tpXS5maXJzdC5sYWJlbHNbKnRocmVhZExldmVsXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkcmVzczJvc1tpXS5maXJzdC5kZXB0aC0tOworICAgICAgICAgICAgfQorICAgICAgICAgICAgKmNvcmVMZXZlbCA9IC0xOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBhZGRyZXNzMm9zWzBdLmZpcnN0LmRlcHRoOworfQorCisvLyBSZXR1cm5zIHRoZSBudW1iZXIgb2Ygb2JqZWN0cyBvZiB0eXBlICd0eXBlJyBiZWxvdyAnb2JqJyB3aXRoaW4gdGhlIHRvcG9sb2d5IHRyZWUgc3RydWN0dXJlLgorLy8gZS5nLiwgaWYgb2JqIGlzIGEgSFdMT0NfT0JKX1NPQ0tFVCBvYmplY3QsIGFuZCB0eXBlIGlzIEhXTE9DX09CSl9QVSwgdGhlbgorLy8gIHRoaXMgd2lsbCByZXR1cm4gdGhlIG51bWJlciBvZiBQVSdzIHVuZGVyIHRoZSBTT0NLRVQgb2JqZWN0Lgorc3RhdGljIGludAorX19rbXBfaHdsb2NfZ2V0X25vYmpzX3VuZGVyX29iaihod2xvY19vYmpfdCBvYmosIGh3bG9jX29ial90eXBlX3QgdHlwZSkgeworICAgIGludCByZXR2YWwgPSAwOworICAgIGh3bG9jX29ial90IGZpcnN0OworICAgIGZvcihmaXJzdCA9IGh3bG9jX2dldF9vYmpfYmVsb3dfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgb2JqLT50eXBlLCBvYmotPmxvZ2ljYWxfaW5kZXgsIHR5cGUsIDApOworICAgICAgICBmaXJzdCAhPSBOVUxMICYmIGh3bG9jX2dldF9hbmNlc3Rvcl9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgb2JqLT50eXBlLCBmaXJzdCkgPT0gb2JqOworICAgICAgICBmaXJzdCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBmaXJzdC0+dHlwZSwgZmlyc3QpKQorICAgIHsKKyAgICAgICAgKytyZXR2YWw7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9od2xvY19tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAgKmFkZHJlc3Myb3MgPSBOVUxMOworICAgICptc2dfaWQgPSBrbXBfaTE4bl9udWxsOworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICAgIEtNUF9DUFVfQUxMT0Mob2xkTWFzayk7CisgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIGludCBkZXB0aCA9IDM7CisgICAgaW50IHBrZ0xldmVsID0gMDsKKyAgICBpbnQgY29yZUxldmVsID0gMTsKKyAgICBpbnQgdGhyZWFkTGV2ZWwgPSAyOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkKKyAgICB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfaHdsb2NfZ2V0X25vYmpzX3VuZGVyX29iaihod2xvY19nZXRfb2JqX2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIEhXTE9DX09CSl9TT0NLRVQsIDApLCBIV0xPQ19PQkpfQ09SRSk7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IF9fa21wX2h3bG9jX2dldF9ub2Jqc191bmRlcl9vYmooaHdsb2NfZ2V0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfQ09SRSwgMCksIEhXTE9DX09CSl9QVSk7CisgICAgICAgIF9fa21wX25jb3JlcyA9IF9fa21wX3hwcm9jIC8gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBuUGFja2FnZXMgPSAoX19rbXBfeHByb2MgKyBuQ29yZXNQZXJQa2cgLSAxKSAvIG5Db3Jlc1BlclBrZzsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUxvY0NwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBBbGxvY2F0ZSB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBBZGRyVW5zUGFpciAqcmV0dmFsID0gKEFkZHJVbnNQYWlyICopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIF9fa21wX3B1X29zX2lkeCA9IChpbnQqKV9fa21wX2FsbG9jYXRlKHNpemVvZihpbnQpICogX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKworICAgIGh3bG9jX29ial90IHB1OworICAgIGh3bG9jX29ial90IGNvcmU7CisgICAgaHdsb2Nfb2JqX3Qgc29ja2V0OworICAgIGludCBuQWN0aXZlVGhyZWFkcyA9IDA7CisgICAgaW50IHNvY2tldF9pZGVudGlmaWVyID0gMDsKKyAgICAvLyByZS1jYWxjdWxhdGUgZ2xvYmFscyB0byBjb3VudCBvbmx5IGFjY2Vzc2libGUgcmVzb3VyY2VzCisgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzID0gbkNvcmVzUGVyUGtnID0gX19rbXBfblRocmVhZHNQZXJDb3JlID0gMDsKKyAgICBmb3Ioc29ja2V0ID0gaHdsb2NfZ2V0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfU09DS0VULCAwKTsKKyAgICAgICAgc29ja2V0ICE9IE5VTEw7CisgICAgICAgIHNvY2tldCA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfU09DS0VULCBzb2NrZXQpLAorICAgICAgICBzb2NrZXRfaWRlbnRpZmllcisrKQorICAgIHsKKyAgICAgICAgaW50IGNvcmVfaWRlbnRpZmllciA9IDA7CisgICAgICAgIGludCBudW1fYWN0aXZlX2NvcmVzID0gMDsKKyAgICAgICAgZm9yKGNvcmUgPSBod2xvY19nZXRfb2JqX2JlbG93X2J5X3R5cGUoX19rbXBfaHdsb2NfdG9wb2xvZ3ksIHNvY2tldC0+dHlwZSwgc29ja2V0LT5sb2dpY2FsX2luZGV4LCBIV0xPQ19PQkpfQ09SRSwgMCk7CisgICAgICAgICAgICBjb3JlICE9IE5VTEwgJiYgaHdsb2NfZ2V0X2FuY2VzdG9yX29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBzb2NrZXQtPnR5cGUsIGNvcmUpID09IHNvY2tldDsKKyAgICAgICAgICAgIGNvcmUgPSBod2xvY19nZXRfbmV4dF9vYmpfYnlfdHlwZShfX2ttcF9od2xvY190b3BvbG9neSwgSFdMT0NfT0JKX0NPUkUsIGNvcmUpLAorICAgICAgICAgICAgY29yZV9pZGVudGlmaWVyKyspCisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBwdV9pZGVudGlmaWVyID0gMDsKKyAgICAgICAgICAgIGludCBudW1fYWN0aXZlX3RocmVhZHMgPSAwOworICAgICAgICAgICAgZm9yKHB1ID0gaHdsb2NfZ2V0X29ial9iZWxvd19ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjb3JlLT50eXBlLCBjb3JlLT5sb2dpY2FsX2luZGV4LCBIV0xPQ19PQkpfUFUsIDApOworICAgICAgICAgICAgICAgIHB1ICE9IE5VTEwgJiYgaHdsb2NfZ2V0X2FuY2VzdG9yX29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBjb3JlLT50eXBlLCBwdSkgPT0gY29yZTsKKyAgICAgICAgICAgICAgICBwdSA9IGh3bG9jX2dldF9uZXh0X29ial9ieV90eXBlKF9fa21wX2h3bG9jX3RvcG9sb2d5LCBIV0xPQ19PQkpfUFUsIHB1KSwKKyAgICAgICAgICAgICAgICBwdV9pZGVudGlmaWVyKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgQWRkcmVzcyBhZGRyKDMpOworICAgICAgICAgICAgICAgIGlmKCEgS01QX0NQVV9JU1NFVChwdS0+b3NfaW5kZXgsIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7ICAgICAgICAgLy8gc2tpcCBpbmFjdGl2ZSAoaW5hY2Nlc3NpYmxlKSB1bml0CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiSHdsb2MgaW5zZXJ0aW5nICVkICglZCkgJWQgKCVkKSAlZCAoJWQpIGludG8gYWRkcmVzczJvc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgc29ja2V0LT5vc19pbmRleCwgc29ja2V0LT5sb2dpY2FsX2luZGV4LCBjb3JlLT5vc19pbmRleCwgY29yZS0+bG9naWNhbF9pbmRleCwgcHUtPm9zX2luZGV4LHB1LT5sb2dpY2FsX2luZGV4KSk7CisgICAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBzb2NrZXRfaWRlbnRpZmllcjsgLy8gcGFja2FnZQorICAgICAgICAgICAgICAgIGFkZHIubGFiZWxzWzFdID0gY29yZV9pZGVudGlmaWVyOyAvLyBjb3JlCisgICAgICAgICAgICAgICAgYWRkci5sYWJlbHNbMl0gPSBwdV9pZGVudGlmaWVyOyAvLyBwdQorICAgICAgICAgICAgICAgIHJldHZhbFtuQWN0aXZlVGhyZWFkc10gPSBBZGRyVW5zUGFpcihhZGRyLCBwdS0+b3NfaW5kZXgpOworICAgICAgICAgICAgICAgIF9fa21wX3B1X29zX2lkeFtuQWN0aXZlVGhyZWFkc10gPSBwdS0+b3NfaW5kZXg7IC8vIGtlZXAgb3MgaW5kZXggZm9yIGVhY2ggYWN0aXZlIHB1CisgICAgICAgICAgICAgICAgbkFjdGl2ZVRocmVhZHMrKzsKKyAgICAgICAgICAgICAgICArK251bV9hY3RpdmVfdGhyZWFkczsgLy8gY291bnQgYWN0aXZlIHRocmVhZHMgcGVyIGNvcmUKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fYWN0aXZlX3RocmVhZHMpIHsgLy8gd2VyZSB0aGVyZSBhbnkgYWN0aXZlIHRocmVhZHMgb24gdGhlIGNvcmU/CisgICAgICAgICAgICAgICAgKytfX2ttcF9uY29yZXM7ICAgICAgIC8vIGNvdW50IHRvdGFsIGFjdGl2ZSBjb3JlcworICAgICAgICAgICAgICAgICsrbnVtX2FjdGl2ZV9jb3JlczsgICAvLyBjb3VudCBhY3RpdmUgY29yZXMgcGVyIHNvY2tldAorICAgICAgICAgICAgICAgIGlmIChudW1fYWN0aXZlX3RocmVhZHMgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpCisgICAgICAgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG51bV9hY3RpdmVfdGhyZWFkczsgLy8gY2FsYyBtYXhpbXVtCisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgaWYgKG51bV9hY3RpdmVfY29yZXMpIHsgICAgICAgLy8gd2VyZSB0aGVyZSBhbnkgYWN0aXZlIGNvcmVzIG9uIHRoZSBzb2NrZXQ/CisgICAgICAgICAgICArK25QYWNrYWdlczsgICAgICAgICAgICAgIC8vIGNvdW50IHRvdGFsIGFjdGl2ZSBwYWNrYWdlcworICAgICAgICAgICAgaWYgKG51bV9hY3RpdmVfY29yZXMgPiBuQ29yZXNQZXJQa2cpCisgICAgICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gbnVtX2FjdGl2ZV9jb3JlczsgLy8gY2FsYyBtYXhpbXVtCisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgcmV0dXJuIG5vdy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQobkFjdGl2ZVRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgS01QX0FTU0VSVChuQWN0aXZlVGhyZWFkcyA+IDApOworICAgIGlmIChuQWN0aXZlVGhyZWFkcyA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3JtIGFuIEFkZHJlc3Mgb2JqZWN0IHdoaWNoIG9ubHkgaW5jbHVkZXMgdGhlIHBhY2thZ2UgbGV2ZWwuCisgICAgICAgIC8vCisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSByZXR2YWxbMF0uZmlyc3QubGFiZWxzW3BrZ0xldmVsXTsKKyAgICAgICAgcmV0dmFsWzBdLmZpcnN0ID0gYWRkcjsKKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0YWJsZSBieSBwaHlzaWNhbCBJZC4KKyAgICAvLworICAgIHFzb3J0KHJldHZhbCwgbkFjdGl2ZVRocmVhZHMsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHVuaWZvcm0gPSAoblBhY2thZ2VzICogbkNvcmVzUGVyUGtnICogX19rbXBfblRocmVhZHNQZXJDb3JlID09IG5BY3RpdmVUaHJlYWRzKTsKKworICAgIC8vCisgICAgLy8gUHJpbnQgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgc3VtbWFyeS4KKyAgICAvLworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIGNoYXIgbWFza1tLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKG1hc2ssIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZVc2luZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCBuUGFja2FnZXMpOworICAgICAgICAvL2ZvciAobGV2ZWwgPSAxOyBsZXZlbCA8PSBwa2dMZXZlbDsgbGV2ZWwrKykgeworICAgICAgICAvLyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIgeCAlZCIsIG1heEN0W2xldmVsXSk7CisgICAgICAgLy8gfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZpbmQgYW55IGxldmVscyB3aXRoIHJhZGlpeCAxLCBhbmQgcmVtb3ZlIHRoZW0gZnJvbSB0aGUgbWFwCisgICAgLy8gKGV4Y2VwdCBmb3IgdGhlIHBhY2thZ2UgbGV2ZWwpLgorICAgIC8vCisgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9yZW1vdmVfcmFkaXhfb25lX2xldmVscyhyZXR2YWwsIG5BY3RpdmVUaHJlYWRzLCBkZXB0aCwgJnBrZ0xldmVsLCAmY29yZUxldmVsLCAmdGhyZWFkTGV2ZWwpOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgoY29yZUxldmVsID49IDApICYmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA+IGFmZmluaXR5X2dyYW5fcGFja2FnZSkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KHJldHZhbCwgbkFjdGl2ZVRocmVhZHMsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgKmFkZHJlc3Myb3MgPSByZXR2YWw7CisgICAgcmV0dXJuIGRlcHRoOworfQorI2VuZGlmIC8vIEtNUF9VU0VfSFdMT0MKKworLy8KKy8vIElmIHdlIGRvbid0IGtub3cgaG93IHRvIHJldHJpZXZlIHRoZSBtYWNoaW5lJ3MgcHJvY2Vzc29yIHRvcG9sb2d5LCBvcgorLy8gZW5jb3VudGVyIGFuIGVycm9yIGluIGRvaW5nIHNvLCB0aGlzIHJvdXRpbmUgaXMgY2FsbGVkIHRvIGZvcm0gYSAiZmxhdCIKKy8vIG1hcHBpbmcgb2Ygb3MgdGhyZWFkIGlkJ3MgPC0+IHByb2Nlc3NvciBpZCdzLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIEV2ZW4gaWYgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLCB0aGlzIHJvdXRpbmUgbWlnaHQgc3RpbGwKKyAgICAvLyBjYWxsZWQgdG8gc2V0IF9fa21wX25jb3JlcywgYXMgd2VsbCBhcworICAgIC8vIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4KKyAgICAvLworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpOworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmRmxhdFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyAgY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gbkNvcmVzUGVyUGtnID0gMTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisKKyAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlRmxhdCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgICBfX2ttcF9wdV9vc19pZHggPSAoaW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgaW50IGF2YWlsX2N0ID0gMDsKKyAgICAgICAgdW5zaWduZWQgaW50IGk7CisgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgX19rbXBfcHVfb3NfaWR4W2F2YWlsX2N0KytdID0gaTsgLy8gc3VwcG9zZSBpbmRpY2VzIGFyZSBmbGF0CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb250cnVjdCB0aGUgZGF0YSBzdHJ1Y3R1cmUgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopCisgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2YoKiphZGRyZXNzMm9zKSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGludCBhdmFpbF9jdCA9IDA7CisgICAgdW5zaWduZWQgaW50IGk7CisgICAgS01QX0NQVV9TRVRfSVRFUkFURShpLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykgeworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIHRoaXMgcHJvYyBpZiBpdCBpcyBub3QgaW5jbHVkZWQgaW4gdGhlIG1hY2hpbmUgbW9kZWwuCisgICAgICAgIC8vCisgICAgICAgIGlmICghIEtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9wdV9vc19pZHhbYXZhaWxfY3RdID0gaTsgLy8gc3VwcG9zZSBpbmRpY2VzIGFyZSBmbGF0CisgICAgICAgIEFkZHJlc3MgYWRkcigxKTsKKyAgICAgICAgYWRkci5sYWJlbHNbMF0gPSBpOworICAgICAgICAoKmFkZHJlc3Myb3MpW2F2YWlsX2N0KytdID0gQWRkclVuc1BhaXIoYWRkcixpKTsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgS01QX0lORk9STShPU1Byb2NUb1BhY2thZ2UsICJLTVBfQUZGSU5JVFkiKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgdGhlIHBhY2thZ2UgbGV2ZWwgaXMgbW9kZWxlZCBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAsCisgICAgICAgIC8vIHNvIHRoZSAjbGV2ZWxzIG9mIGdyYW51bGFyaXR5IGlzIGVpdGhlciAwIG9yIDEuCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDE7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDE7Cit9CisKKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworLy8KKy8vIElmIG11bHRpcGxlIFdpbmRvd3MqIE9TIHByb2Nlc3NvciBncm91cHMgZXhpc3QsIHdlIGNhbiBjcmVhdGUgYSAyLWxldmVsCisvLyB0b3BvbG9neSBtYXAgd2l0aCB0aGUgZ3JvdXBzIGF0IGxldmVsIDAgYW5kIHRoZSBpbmRpdmlkdWFsIHByb2NzIGF0CisvLyBsZXZlbCAxLgorLy8KKy8vIFRoaXMgZmFjaWxpdGF0ZXMgbGV0dGluZyB0aGUgdGhyZWFkcyBmbG9hdCBhbW9uZyBhbGwgcHJvY3MgaW4gYSBncm91cCwKKy8vIGlmIGdyYW51bGFyaXR5PWdyb3VwICh0aGUgZGVmYXVsdCB3aGVuIHRoZXJlIGFyZSBtdWx0aXBsZSBncm91cHMpLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcChBZGRyVW5zUGFpciAqKmFkZHJlc3Myb3MsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCkKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIElmIHdlIGRvbid0IGhhdmUgbXVsdGlwbGUgcHJvY2Vzc29yIGdyb3VwcywgcmV0dXJuIG5vdy4KKyAgICAvLyBUaGUgZmxhdCBtYXBwaW5nIHdpbGwgYmUgdXNlZC4KKyAgICAvLworICAgIGlmICgoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB8fCAoX19rbXBfZ2V0X3Byb2NfZ3JvdXAoX19rbXBfYWZmaW5fZnVsbE1hc2spID49IDApKSB7CisgICAgICAgIC8vIEZJWE1FIHNldCAqbXNnX2lkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIENvbnRydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0byBiZSByZXR1cm5lZC4KKyAgICAvLworICAgICphZGRyZXNzMm9zID0gKEFkZHJVbnNQYWlyKikKKyAgICAgIF9fa21wX2FsbG9jYXRlKHNpemVvZigqKmFkZHJlc3Myb3MpICogX19rbXBfYXZhaWxfcHJvYyk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gKGludCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBpbnQgYXZhaWxfY3QgPSAwOworICAgIGludCBpOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcHVfb3NfaWR4W2F2YWlsX2N0XSA9IGk7ICAvLyBzdXBwb3NlIGluZGljZXMgYXJlIGZsYXQKKyAgICAgICAgQWRkcmVzcyBhZGRyKDIpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IGkgLyAoQ0hBUl9CSVQgKiBzaXplb2YoRFdPUkRfUFRSKSk7CisgICAgICAgIGFkZHIubGFiZWxzWzFdID0gaSAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVthdmFpbF9jdCsrXSA9IEFkZHJVbnNQYWlyKGFkZHIsaSk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmT1NQcm9jVG9Hcm91cCwgIktNUF9BRkZJTklUWSIsIGksIGFkZHIubGFiZWxzWzBdLAorICAgICAgICAgICAgICBhZGRyLmxhYmVsc1sxXSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZ3JvdXApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICgoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUpCisgICAgICAgICAgfHwgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpncmFuX3N0ciA9IE5VTEw7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2NvcmUpIHsKKyAgICAgICAgICAgICAgICBncmFuX3N0ciA9ICJjb3JlIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgZ3Jhbl9zdHIgPSAicGFja2FnZSI7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fbm9kZSkgeworICAgICAgICAgICAgICAgIGdyYW5fc3RyID0gIm5vZGUiOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gV2FybmluZzogY2FuJ3QgdXNlIGFmZmluaXR5IGdyYW51bGFyaXR5IFwiZ3JhblwiIHdpdGggZ3JvdXAgdG9wb2xvZ3kgbWV0aG9kLCB1c2luZyAidGhyZWFkIgorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiAyOworfQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCitzdGF0aWMgaW50CitfX2ttcF9jcHVpZF9tYXNrX3dpZHRoKGludCBjb3VudCkgeworICAgIGludCByID0gMDsKKworICAgIHdoaWxlKCgxPDxyKSA8IGNvdW50KQorICAgICAgICArK3I7CisgICAgcmV0dXJuIHI7Cit9CisKKworY2xhc3MgYXBpY1RocmVhZEluZm8geworcHVibGljOgorICAgIHVuc2lnbmVkIG9zSWQ7ICAgICAgICAgICAgICAvLyBwYXJhbSB0byBfX2ttcF9hZmZpbml0eV9iaW5kX3RocmVhZAorICAgIHVuc2lnbmVkIGFwaWNJZDsgICAgICAgICAgICAvLyBmcm9tIGNwdWlkIGFmdGVyIGJpbmRpbmcKKyAgICB1bnNpZ25lZCBtYXhDb3Jlc1BlclBrZzsgICAgLy8gICAgICAiIgorICAgIHVuc2lnbmVkIG1heFRocmVhZHNQZXJQa2c7ICAvLyAgICAgICIiCisgICAgdW5zaWduZWQgcGtnSWQ7ICAgICAgICAgICAgIC8vIGluZmVycmVkIGZyb20gYWJvdmUgdmFsdWVzCisgICAgdW5zaWduZWQgY29yZUlkOyAgICAgICAgICAgIC8vICAgICAgIiIKKyAgICB1bnNpZ25lZCB0aHJlYWRJZDsgICAgICAgICAgLy8gICAgICAiIgorfTsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fb3NfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5vc0lkIDwgYmItPm9zSWQpIHJldHVybiAtMTsKKyAgICBpZiAoYWEtPm9zSWQgPiBiYi0+b3NJZCkgcmV0dXJuIDE7CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX2FwaWNUaHJlYWRJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCBhcGljVGhyZWFkSW5mbyAqYWEgPSAoY29uc3QgYXBpY1RocmVhZEluZm8gKilhOworICAgIGNvbnN0IGFwaWNUaHJlYWRJbmZvICpiYiA9IChjb25zdCBhcGljVGhyZWFkSW5mbyAqKWI7CisgICAgaWYgKGFhLT5wa2dJZCA8IGJiLT5wa2dJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+cGtnSWQgPiBiYi0+cGtnSWQpIHJldHVybiAxOworICAgIGlmIChhYS0+Y29yZUlkIDwgYmItPmNvcmVJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+Y29yZUlkID4gYmItPmNvcmVJZCkgcmV0dXJuIDE7CisgICAgaWYgKGFhLT50aHJlYWRJZCA8IGJiLT50aHJlYWRJZCkgcmV0dXJuIC0xOworICAgIGlmIChhYS0+dGhyZWFkSWQgPiBiYi0+dGhyZWFkSWQpIHJldHVybiAxOworICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IGFyY2hpdGVjdHVyZSwgd2UgYXR0ZW1wdCB0byB1c2UKKy8vIGFuIGFsZ29yaXRobSB3aGljaCBjeWNsZXMgdGhyb3VnaCB0aGUgYXZhaWxhYmxlIG9zIHRocmVhZHMsIHNldHRpbmcKKy8vIHRoZSBjdXJyZW50IHRocmVhZCdzIGFmZmluaXR5IG1hc2sgdG8gdGhhdCB0aHJlYWQsIGFuZCB0aGVuIHJldHJpZXZlcworLy8gdGhlIEFwaWMgSWQgZm9yIGVhY2ggdGhyZWFkIGNvbnRleHQgdXNpbmcgdGhlIGNwdWlkIGluc3RydWN0aW9uLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV9hcGljaWRfbWFwKEFkZHJVbnNQYWlyICoqYWRkcmVzczJvcywKKyAga21wX2kxOG5faWRfdCAqY29uc3QgbXNnX2lkKQoreworICAgIGttcF9jcHVpZCBidWY7CisgICAgaW50IHJjOworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgaWYgY3B1aWQgbGVhZiA0IGlzIHN1cHBvcnRlZC4KKyAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMCwgMCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWF4IDwgNCkgeworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWY0U3VwcG9ydDsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZQorICAgIC8vIG5vdCBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZAorICAgIC8vIF9rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpLCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UgLSB1c2UKKyAgICAvLyB0aGUgZGVmYXVsdHMgdGhhdCB3ZSBjYWxjdWxhdGVkIGZyb20gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcKKyAgICAvLyB0byBlYWNoIHByb2MuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEhhY2sgdG8gdHJ5IGFuZCBpbmZlciB0aGUgbWFjaGluZSB0b3BvbG9neSB1c2luZyBvbmx5IHRoZSBkYXRhCisgICAgICAgIC8vIGF2YWlsYWJsZSBmcm9tIGNwdWlkIG9uIHRoZSBjdXJyZW50IHRocmVhZCwgYW5kIF9fa21wX3hwcm9jLgorICAgICAgICAvLworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gR2V0IGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSB1c2luZworICAgICAgICAvLyBjcHVpZCgxKS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gT24gc29tZSBPUy9jaHBzIGNvbWJpbmF0aW9ucyB3aGVyZSBIVCBpcyBzdXBwb3J0ZWQgYnkgdGhlIGNoaXAKKyAgICAgICAgLy8gYnV0IGlzIGRpc2FibGVkLCB0aGlzIHZhbHVlIHdpbGwgYmUgMiBvbiBhIHNpbmdsZSBjb3JlIGNoaXAuCisgICAgICAgIC8vIFVzdWFsbHksIGl0IHdpbGwgYmUgMiBpZiBIVCBpcyBlbmFibGVkIGFuZCAxIGlmIEhUIGlzIGRpc2FibGVkLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGludCBtYXhUaHJlYWRzUGVyUGtnID0gKGJ1Zi5lYnggPj4gMTYpICYgMHhmZjsKKyAgICAgICAgaWYgKG1heFRocmVhZHNQZXJQa2cgPT0gMCkgeworICAgICAgICAgICAgbWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgbnVtIGNvcmVzIHBlciBwa2cgY29tZXMgZnJvbSBjcHVpZCg0KS4KKyAgICAgICAgLy8gMSBtdXN0IGJlIGFkZGVkIHRvIHRoZSBlbmNvZGVkIHZhbHVlLgorICAgICAgICAvLworICAgICAgICAvLyBUaGUgYXV0aG9yIG9mIGNwdV9jb3VudC5jcHAgdHJlYXRlZCB0aGlzIG9ubHkgYW4gdXBwZXIgYm91bmQKKyAgICAgICAgLy8gb24gdGhlIG51bWJlciBvZiBjb3JlcywgYnV0IEkgaGF2ZW4ndCBzZWVuIGFueSBjYXNlcyB3aGVyZSBpdAorICAgICAgICAvLyB3YXMgZ3JlYXRlciB0aGFuIHRoZSBhY3R1YWwgbnVtYmVyIG9mIGNvcmVzLCBzbyB3ZSB3aWxsIHRyZWF0CisgICAgICAgIC8vIGl0IGFzIGV4YWN0IGluIHRoaXMgYmxvY2sgb2YgY29kZS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmlyc3QsIHdlIG5lZWQgdG8gY2hlY2sgaWYgY3B1aWQoNCkgaXMgc3VwcG9ydGVkIG9uIHRoaXMgY2hpcC4KKyAgICAgICAgLy8gVG8gc2VlIGlmIGNwdWlkKG4pIGlzIHN1cHBvcnRlZCwgaXNzdWUgY3B1aWQoMCkgYW5kIGNoZWNrIGlmIGVheAorICAgICAgICAvLyBoYXMgdGhlIHZhbHVlIG4gb3IgZ3JlYXRlci4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgICAgICBpZiAoYnVmLmVheCA+PSA0KSB7CisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNCwgMCwgJmJ1Zik7CisgICAgICAgICAgICBuQ29yZXNQZXJQa2cgPSAoKGJ1Zi5lYXggPj4gMjYpICYgMHgzZikgKyAxOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHdheSB0byByZWxpYWJseSB0ZWxsIGlmIEhUIGlzIGVuYWJsZWQgd2l0aG91dCBpc3N1aW5nCisgICAgICAgIC8vIHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmcm9tIGV2ZXJ5IHRocmVhZCwgY2FuIGNvcnJlbGF0aW5nIHRoZSBjcHVpZAorICAgICAgICAvLyBpbmZvLCBzbyBpZiB0aGUgbWFjaGluZSBpcyBub3QgYWZmaW5pdHkgY2FwYWJsZSwgd2UgYXNzdW1lIHRoYXQgSFQKKyAgICAgICAgLy8gaXMgb2ZmLiAgV2UgaGF2ZSBzZWVuIHF1aXRlIGEgZmV3IG1hY2hpbmVzIHdoZXJlIG1heFRocmVhZHNQZXJQa2cKKyAgICAgICAgLy8gaXMgMiwgeWV0IHRoZSBtYWNoaW5lIGRvZXMgbm90IHN1cHBvcnQgSFQuCisgICAgICAgIC8vCisgICAgICAgIC8vIC0gT2xkZXIgT1NlcyBhcmUgdXN1YWxseSBmb3VuZCBvbiBtYWNoaW5lcyB3aXRoIG9sZGVyIGNoaXBzLCB3aGljaAorICAgICAgICAvLyAgIGRvIG5vdCBzdXBwb3J0IEhULgorICAgICAgICAvLworICAgICAgICAvLyAtIFRoZSBwZXJmb3JtYW5jZSBwZW5hbHR5IGZvciBtaXN0YWtlbmx5IGlkZW50aWZ5aW5nIGEgbWFjaGluZSBhcworICAgICAgICAvLyAgIEhUIHdoZW4gaXQgaXNuJ3QgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjbHkgc2V0CisgICAgICAgIC8vICAgdG8gMCkgaXMgZ3JlYXRlciB0aGFuIHRoZSBwZW5hbHR5IHdoZW4gZm9yIG1pc3Rha2VubHkgaWRlbnRpZnlpbmcKKyAgICAgICAgLy8gICBhIG1hY2hpbmUgYXMgYmVpbmcgMSB0aHJlYWQvY29yZSB3aGVuIGl0IGlzIHJlYWxseSBIVCBlbmFibGVkCisgICAgICAgIC8vICAgKHdoaWNoIHJlc3VsdHMgaW4gYmxvY2t0aW1lIGJlaW5nIGluY29ycmVjdGx5IHNldCB0byBhIHBvc2l0aXZlCisgICAgICAgIC8vICAgdmFsdWUpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgaXMgc2FmZSB0byBjYWxsCisgICAgLy8gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCksCisgICAgLy8gZXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZS4KKyAgICAvLworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICAgIEtNUF9DUFVfQUxMT0Mob2xkTWFzayk7CisgICAgS01QX0FTU0VSVChvbGRNYXNrICE9IE5VTEwpOworICAgIF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIGVhY2ggb2YgdGhlIGF2YWlsYWJsZSBjb250ZXh0cywgYmluZGluZyB0aGUgY3VycmVudCB0aHJlYWQKKyAgICAvLyB0byBpdCwgYW5kIG9idGFpbmluZyB0aGUgcGVydGluZW50IGluZm9ybWF0aW9uIHVzaW5nIHRoZSBjcHVpZCBpbnN0ci4KKyAgICAvLworICAgIC8vIFRoZSByZWxldmFudCBpbmZvcm1hdGlvbiBpczoKKyAgICAvLworICAgIC8vIEFwaWMgSWQ6IEJpdHMgMjQ6MzEgb2YgZWJ4IGFmdGVyIGlzc3VpbmcgY3B1aWQoMSkgLSBlYWNoIHRocmVhZCBjb250ZXh0CisgICAgLy8gICAgaGFzIGEgdW5pcWllIEFwaWMgSWQsIHdoaWNoIGlzIG9mIHRoZSBmb3JtIHBrZyMgOiBjb3JlIyA6IHRocmVhZCMuCisgICAgLy8KKyAgICAvLyBNYXggVGhyZWFkcyBQZXIgUGtnOiBCaXRzIDE2OjIzIG9mIGVieCBhZnRlciBpc3N1aW5nIGNwdWlkKDEpLiAgVGhlCisgICAgLy8gICAgdmFsdWUgb2YgdGhpcyBmaWVsZCBkZXRlcm1pbmVzIHRoZSB3aWR0aCBvZiB0aGUgY29yZSMgKyB0aHJlYWQjCisgICAgLy8gICAgZmllbGRzIGluIHRoZSBBcGljIElkLiAgSXQgaXMgYWxzbyBhbiB1cHBlciBib3VuZCBvbiB0aGUgbnVtYmVyCisgICAgLy8gICAgb2YgdGhyZWFkcyBwZXIgcGFja2FnZSwgYnV0IGl0IGhhcyBiZWVuIHZlcmlmaWVkIHRoYXQgc2l0dWF0aW9ucworICAgIC8vICAgIGhhcHBlbiB3ZXJlIGl0IGlzIG5vdCBleGFjdC4gIEluIHBhcnRpY3VsYXIsIG9uIGNlcnRhaW4gT1MvY2hpcAorICAgIC8vICAgIGNvbWJpbmF0aW9ucyB3aGVyZSBJbnRlbChSKSBIeXBlci1UaHJlYWRpbmcgVGVjaG5vbG9neSBpcyBzdXBwb3J0ZWQKKyAgICAvLyAgICBieSB0aGUgY2hpcCBidXQgaGFzCisgICAgLy8gICAgYmVlbiBkaXNhYmxlZCwgdGhlIHZhbHVlIG9mIHRoaXMgZmllbGQgd2lsbCBiZSAyIChmb3IgYSBzaW5nbGUgY29yZQorICAgIC8vICAgIGNoaXApLiAgT24gb3RoZXIgT1MvY2hpcCBjb21iaW5hdGlvbnMgc3VwcG9ydGluZworICAgIC8vICAgIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5LCB0aGUgdmFsdWUgb2YKKyAgICAvLyAgICB0aGlzIGZpZWxkIHdpbGwgYmUgMSB3aGVuIEludGVsKFIpIEh5cGVyLVRocmVhZGluZyBUZWNobm9sb2d5IGlzCisgICAgLy8gICAgZGlzYWJsZWQgYW5kIDIgd2hlbiBpdCBpcyBlbmFibGVkLgorICAgIC8vCisgICAgLy8gTWF4IENvcmVzIFBlciBQa2c6ICBCaXRzIDI2OjMxIG9mIGVheCBhZnRlciBpc3N1aW5nIGNwdWlkKDQpLiAgVGhlCisgICAgLy8gICAgdmFsdWUgb2YgdGhpcyBmaWVsZCAoKzEpIGRldGVybWluZXMgdGhlIHdpZHRoIG9mIHRoZSBjb3JlIyBmaWVsZCBpbgorICAgIC8vICAgIHRoZSBBcGljIElkLiAgVGhlIGNvbW1lbnRzIGluICJjcHVjb3VudC5jcHAiIHNheSB0aGF0IHRoaXMgdmFsdWUgaXMKKyAgICAvLyAgICBhbiB1cHBlciBib3VuZCwgYnV0IHRoZSBJQS0zMiBhcmNoaXRlY3R1cmUgbWFudWFsIHNheXMgdGhhdCBpdCBpcworICAgIC8vICAgIGV4YWN0bHkgdGhlIG51bWJlciBvZiBjb3JlcyBwZXIgcGFja2FnZSwgYW5kIEkgaGF2ZW4ndCBzZWVuIGFueQorICAgIC8vICAgIGNhc2Ugd2hlcmUgaXQgd2Fzbid0LgorICAgIC8vCisgICAgLy8gRnJvbSB0aGlzIGluZm9ybWF0aW9uLCBkZWR1Y2UgdGhlIHBhY2thZ2UgSWQsIGNvcmUgSWQsIGFuZCB0aHJlYWQgSWQsCisgICAgLy8gYW5kIHNldCB0aGUgY29ycmVzcG9uZGluZyBmaWVsZHMgaW4gdGhlIGFwaWNUaHJlYWRJbmZvIHN0cnVjdC4KKyAgICAvLworICAgIHVuc2lnbmVkIGk7CisgICAgYXBpY1RocmVhZEluZm8gKnRocmVhZEluZm8gPSAoYXBpY1RocmVhZEluZm8gKilfX2ttcF9hbGxvY2F0ZSgKKyAgICAgIF9fa21wX2F2YWlsX3Byb2MgKiBzaXplb2YoYXBpY1RocmVhZEluZm8pKTsKKyAgICB1bnNpZ25lZCBuQXBpY3MgPSAwOworICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2tpcCB0aGlzIHByb2MgaWYgaXQgaXMgbm90IGluY2x1ZGVkIGluIHRoZSBtYWNoaW5lIG1vZGVsLgorICAgICAgICAvLworICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgoaW50KW5BcGljcyA8IF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgICAgIF9fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKGkpOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ub3NJZCA9IGk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGFwaWMgaWQgYW5kIG1heCB0aHJlYWRzIHBlciBwa2cgY29tZSBmcm9tIGNwdWlkKDEpLgorICAgICAgICAvLworICAgICAgICBfX2ttcF94ODZfY3B1aWQoMSwgMCwgJmJ1Zik7CisgICAgICAgIGlmICghIChidWYuZWR4ID4+IDkpICYgMSkgeworICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0FwaWNOb3RQcmVzZW50OworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPSAoYnVmLmVieCA+PiAyNCkgJiAweGZmOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IChidWYuZWJ4ID4+IDE2KSAmIDB4ZmY7CisgICAgICAgIGlmICh0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9PSAwKSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBNYXggY29yZXMgcGVyIHBrZyBjb21lcyBmcm9tIGNwdWlkKDQpLgorICAgICAgICAvLyAxIG11c3QgYmUgYWRkZWQgdG8gdGhlIGVuY29kZWQgdmFsdWUuCisgICAgICAgIC8vCisgICAgICAgIC8vIEZpcnN0LCB3ZSBuZWVkIHRvIGNoZWNrIGlmIGNwdWlkKDQpIGlzIHN1cHBvcnRlZCBvbiB0aGlzIGNoaXAuCisgICAgICAgIC8vIFRvIHNlZSBpZiBjcHVpZChuKSBpcyBzdXBwb3J0ZWQsIGlzc3VlIGNwdWlkKDApIGFuZCBjaGVjayBpZiBlYXgKKyAgICAgICAgLy8gaGFzIHRoZSB2YWx1ZSBuIG9yIGdyZWF0ZXIuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgwLCAwLCAmYnVmKTsKKyAgICAgICAgaWYgKGJ1Zi5lYXggPj0gNCkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKDQsIDAsICZidWYpOworICAgICAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLm1heENvcmVzUGVyUGtnID0gKChidWYuZWF4ID4+IDI2KSAmIDB4M2YpICsgMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5tYXhDb3Jlc1BlclBrZyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJbmZlciB0aGUgcGtnSWQgLyBjb3JlSWQgLyB0aHJlYWRJZCB1c2luZyBvbmx5IHRoZSBpbmZvCisgICAgICAgIC8vIG9idGFpbmVkIGxvY2FsbHkuCisgICAgICAgIC8vCisgICAgICAgIGludCB3aWR0aENUID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4VGhyZWFkc1BlclBrZyk7CisgICAgICAgIHRocmVhZEluZm9bbkFwaWNzXS5wa2dJZCA9IHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhDVDsKKworICAgICAgICBpbnQgd2lkdGhDID0gX19rbXBfY3B1aWRfbWFza193aWR0aCgKKyAgICAgICAgICB0aHJlYWRJbmZvW25BcGljc10ubWF4Q29yZXNQZXJQa2cpOworICAgICAgICBpbnQgd2lkdGhUID0gd2lkdGhDVCAtIHdpZHRoQzsKKyAgICAgICAgaWYgKHdpZHRoVCA8IDApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJJ3ZlIG5ldmVyIHNlZW4gdGhpcyBvbmUgaGFwcGVuLCBidXQgSSBzdXBwb3NlIGl0IGNvdWxkLCBpZgorICAgICAgICAgICAgLy8gdGhlIGNwdWlkIGluc3RydWN0aW9uIG9uIGEgY2hpcCB3YXMgcmVhbGx5IHNjcmV3ZWQgdXAuCisgICAgICAgICAgICAvLyBNYWtlIHN1cmUgdG8gcmVzdG9yZSB0aGUgYWZmaW5pdHkgbWFzayBiZWZvcmUgdGhlIHRhaWwgY2FsbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KG9sZE1hc2ssIFRSVUUpOworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIGludCBtYXNrQyA9ICgxIDw8IHdpZHRoQykgLSAxOworICAgICAgICB0aHJlYWRJbmZvW25BcGljc10uY29yZUlkID0gKHRocmVhZEluZm9bbkFwaWNzXS5hcGljSWQgPj4gd2lkdGhUKQorICAgICAgICAgICZtYXNrQzsKKworICAgICAgICBpbnQgbWFza1QgPSAoMSA8PCB3aWR0aFQpIC0gMTsKKyAgICAgICAgdGhyZWFkSW5mb1tuQXBpY3NdLnRocmVhZElkID0gdGhyZWFkSW5mb1tuQXBpY3NdLmFwaWNJZCAmbWFza1Q7CisKKyAgICAgICAgbkFwaWNzKys7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBXZSd2ZSBjb2xsZWN0ZWQgYWxsIHRoZSBpbmZvIHdlIG5lZWQuCisgICAgLy8gUmVzdG9yZSB0aGUgb2xkIGFmZmluaXR5IG1hc2sgZm9yIHRoaXMgdGhyZWFkLgorICAgIC8vCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhlcmUncyBvbmx5IG9uZSB0aHJlYWQgY29udGV4dCB0byBiaW5kIHRvLCBmb3JtIGFuIEFkZHJlc3Mgb2JqZWN0CisgICAgLy8gd2l0aCBkZXB0aCAxIGFuZCByZXR1cm4gaW1tZWRpYXRlbHkgKG9yLCBpZiBhZmZpbml0eSBpcyBvZmYsIHNldAorICAgIC8vIGFkZHJlc3Myb3MgdG8gTlVMTCBhbmQgcmV0dXJuKS4KKyAgICAvLworICAgIC8vIElmIGl0IGlzIGNvbmZpZ3VyZWQgdG8gb21pdCB0aGUgcGFja2FnZSBsZXZlbCB3aGVuIHRoZXJlIGlzIG9ubHkgYQorICAgIC8vIHNpbmdsZSBwYWNrYWdlLCB0aGUgbG9naWMgYXQgdGhlIGVuZCBvZiB0aGlzIHJvdXRpbmUgd29uJ3Qgd29yayBpZgorICAgIC8vIHRoZXJlIGlzIG9ubHkgYSBzaW5nbGUgdGhyZWFkIC0gaXQgd291bGQgdHJ5IHRvIGZvcm0gYW4gQWRkcmVzcworICAgIC8vIG9iamVjdCB3aXRoIGRlcHRoIDAuCisgICAgLy8KKyAgICBLTVBfQVNTRVJUKG5BcGljcyA+IDApOworICAgIGlmIChuQXBpY3MgPT0gMSkgeworICAgICAgICBfX2ttcF9uY29yZXMgPSBuUGFja2FnZXMgPSAxOworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSAxOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXROb3RSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3ksICJLTVBfQUZGSU5JVFkiLCBuUGFja2FnZXMsIG5Db3Jlc1BlclBrZywKKyAgICAgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXS5wa2dJZDsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF0ub3NJZCk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRocmVhZEluZm8gdGFibGUgYnkgcGh5c2ljYWwgSWQuCisgICAgLy8KKyAgICBxc29ydCh0aHJlYWRJbmZvLCBuQXBpY3MsIHNpemVvZigqdGhyZWFkSW5mbyksCisgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfYXBpY1RocmVhZEluZm9fcGh5c19pZCk7CisKKyAgICAvLworICAgIC8vIFRoZSB0YWJsZSBpcyBub3cgc29ydGVkIGJ5IHBrZ0lkIC8gY29yZUlkIC8gdGhyZWFkSWQsIGJ1dCB3ZSByZWFsbHkKKyAgICAvLyBkb24ndCBrbm93IHRoZSByYWRpeCBvZiBhbnkgb2YgdGhlIGZpZWxkcy4gIHBrZ0lkJ3MgbWF5IGJlIHNwYXJzZWx5CisgICAgLy8gYXNzaWduZWQgYW1vbmcgdGhlIGNoaXBzIG9uIGEgc3lzdGVtLiAgQWx0aG91Z2ggY29yZUlkJ3MgYXJlIHVzdWFsbHkKKyAgICAvLyBhc3NpZ25lZCBbMCAuLiBjb3Jlc1BlclBrZy0xXSBhbmQgdGhyZWFkSWQncyBhcmUgdXN1YWxseSBhc3NpZ25lZAorICAgIC8vIFswLi50aHJlYWRzUGVyQ29yZS0xXSwgd2UgZG9uJ3Qgd2FudCB0byBtYWtlIGFueSBzdWNoIGFzc3VtcHRpb25zLgorICAgIC8vCisgICAgLy8gRm9yIHRoYXQgbWF0dGVyLCB3ZSBkb24ndCBrbm93IHdoYXQgY29yZXNQZXJQa2cgYW5kIHRocmVhZHNQZXJDb3JlCisgICAgLy8gKG9yIHRoZSB0b3RhbCAjIHBhY2thZ2VzKSBhcmUgYXQgdGhpcyBwb2ludCAtIHdlIHdhbnQgdG8gZGV0ZXJtaW5lCisgICAgLy8gdGhhdCBub3cuICBXZSBvbmx5IGhhdmUgYW4gdXBwZXIgYm91bmQgb24gdGhlIGZpcnN0IHR3byBmaWd1cmVzLgorICAgIC8vCisgICAgLy8gV2UgYWxzbyBwZXJmb3JtIGEgY29uc2lzdGVuY3kgY2hlY2sgYXQgdGhpcyBwb2ludDogdGhlIHZhbHVlcyByZXR1cm5lZAorICAgIC8vIGJ5IHRoZSBjcHVpZCBpbnN0cnVjdGlvbiBmb3IgYW55IHRocmVhZCBib3VuZCB0byBhIGdpdmVuIHBhY2thZ2UgaGFkCisgICAgLy8gYmV0dGVyIHJldHVybiB0aGUgc2FtZSBpbmZvIGZvciBtYXhUaHJlYWRzUGVyUGtnIGFuZCBtYXhDb3Jlc1BlclBrZy4KKyAgICAvLworICAgIG5QYWNrYWdlcyA9IDE7CisgICAgbkNvcmVzUGVyUGtnID0gMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIHVuc2lnbmVkIG5Db3JlcyA9IDE7CisKKyAgICB1bnNpZ25lZCBwa2dDdCA9IDE7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvIGRldGVybWluZSByYWRpaQorICAgIHVuc2lnbmVkIGxhc3RQa2dJZCA9IHRocmVhZEluZm9bMF0ucGtnSWQ7CisgICAgdW5zaWduZWQgY29yZUN0ID0gMTsKKyAgICB1bnNpZ25lZCBsYXN0Q29yZUlkID0gdGhyZWFkSW5mb1swXS5jb3JlSWQ7CisgICAgdW5zaWduZWQgdGhyZWFkQ3QgPSAxOworICAgIHVuc2lnbmVkIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9bMF0udGhyZWFkSWQ7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGludHJhLXBrZyBjb25zaXN0IGNoZWNrcworICAgIHVuc2lnbmVkIHByZXZNYXhDb3Jlc1BlclBrZyA9IHRocmVhZEluZm9bMF0ubWF4Q29yZXNQZXJQa2c7CisgICAgdW5zaWduZWQgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvWzBdLm1heFRocmVhZHNQZXJQa2c7CisKKyAgICBmb3IgKGkgPSAxOyBpIDwgbkFwaWNzOyBpKyspIHsKKyAgICAgICAgaWYgKHRocmVhZEluZm9baV0ucGtnSWQgIT0gbGFzdFBrZ0lkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIHBrZ0N0Kys7CisgICAgICAgICAgICBsYXN0UGtnSWQgPSB0aHJlYWRJbmZvW2ldLnBrZ0lkOworICAgICAgICAgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgICAgICAgICBjb3JlQ3QgPSAxOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBkaWZmZXJlbnQgcGFja2FnZSwgc28gZ28gb24gdG8gdGhlIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAvLyB3aXRob3V0IGRvaW5nIGFueSBjb25zaXN0ZW5jeSBjaGVja3MuICBSZXNldCB0aGUgY29uc2lzdGVuY3kKKyAgICAgICAgICAgIC8vIGNoZWNrIHZhcnMsIHRob3VnaC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBwcmV2TWF4Q29yZXNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnOworICAgICAgICAgICAgcHJldk1heFRocmVhZHNQZXJQa2cgPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2c7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldLmNvcmVJZCAhPSBsYXN0Q29yZUlkKSB7CisgICAgICAgICAgICBuQ29yZXMrKzsKKyAgICAgICAgICAgIGNvcmVDdCsrOworICAgICAgICAgICAgbGFzdENvcmVJZCA9IHRocmVhZEluZm9baV0uY29yZUlkOworICAgICAgICAgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworICAgICAgICAgICAgdGhyZWFkQ3QgPSAxOworICAgICAgICAgICAgbGFzdFRocmVhZElkID0gdGhyZWFkSW5mb1tpXS50aHJlYWRJZDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICh0aHJlYWRJbmZvW2ldLnRocmVhZElkICE9IGxhc3RUaHJlYWRJZCkgeworICAgICAgICAgICAgdGhyZWFkQ3QrKzsKKyAgICAgICAgICAgIGxhc3RUaHJlYWRJZCA9IHRocmVhZEluZm9baV0udGhyZWFkSWQ7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9MZWdhY3lBcGljSURzTm90VW5pcXVlOworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgdG8gbWFrZSBjZXJ0YWluIHRoYXQgdGhlIG1heENvcmVzUGVyUGtnIGFuZCBtYXhUaHJlYWRzUGVyUGtnCisgICAgICAgIC8vIGZpZWxkcyBhZ3JlZSBiZXR3ZWVuIGFsbCB0aGUgdGhyZWFkcyBib3VuZHMgdG8gYSBnaXZlbiBwYWNrYWdlLgorICAgICAgICAvLworICAgICAgICBpZiAoKHByZXZNYXhDb3Jlc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heENvcmVzUGVyUGtnKQorICAgICAgICAgIHx8IChwcmV2TWF4VGhyZWFkc1BlclBrZyAhPSB0aHJlYWRJbmZvW2ldLm1heFRocmVhZHNQZXJQa2cpKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm8pOworICAgICAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICB9CisgICAgblBhY2thZ2VzID0gcGtnQ3Q7CisgICAgaWYgKChpbnQpY29yZUN0ID4gbkNvcmVzUGVyUGtnKSBuQ29yZXNQZXJQa2cgPSBjb3JlQ3Q7CisgICAgaWYgKChpbnQpdGhyZWFkQ3QgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IHRocmVhZEN0OworCisgICAgLy8KKyAgICAvLyBXaGVuIGFmZmluaXR5IGlzIG9mZiwgdGhpcyByb3V0aW5lIHdpbGwgc3RpbGwgYmUgY2FsbGVkIHRvIHNldAorICAgIC8vIF9fa21wX25jb3JlcywgYXMgd2VsbCBhcyBfX2ttcF9uVGhyZWFkc1BlckNvcmUsCisgICAgLy8gbkNvcmVzUGVyUGtnLCAmIG5QYWNrYWdlcy4gIE1ha2Ugc3VyZSBhbGwgdGhlc2UgdmFycyBhcmUgc2V0CisgICAgLy8gY29ycmVjdGx5LCBhbmQgcmV0dXJuIG5vdyBpZiBhZmZpbml0eSBpcyBub3QgZW5hYmxlZC4KKyAgICAvLworICAgIF9fa21wX25jb3JlcyA9IG5Db3JlczsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBvbGRNYXNrKTsKKworICAgICAgICBLTVBfSU5GT1JNKEFmZlVzZUdsb2JDcHVpZCwgIktNUF9BRkZJTklUWSIpOworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEluaXRPU1Byb2NTZXRSZXNwZWN0LCAiS01QX0FGRklOSVRZIiwgYnVmKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX3B1X29zX2lkeCA9PSBOVUxMKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG5BcGljcyA9PSBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBfX2ttcF9wdV9vc19pZHggPSAoaW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2YoaW50KSAqIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGZvciAoaSA9IDA7IGkgPCBuQXBpY3M7ICsraSkgeworICAgICAgICBfX2ttcF9wdV9vc19pZHhbaV0gPSB0aHJlYWRJbmZvW2ldLm9zSWQ7CisgICAgfQorICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgX19rbXBfZnJlZSh0aHJlYWRJbmZvKTsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIE5vdyB0aGF0IHdlJ3ZlIGRldGVybWluZWQgdGhlIG51bWJlciBvZiBwYWNrYWdlcywgdGhlIG51bWJlciBvZiBjb3JlcworICAgIC8vIHBlciBwYWNrYWdlLCBhbmQgdGhlIG51bWJlciBvZiB0aHJlYWRzIHBlciBjb3JlLCB3ZSBjYW4gY29uc3RydWN0IHRoZQorICAgIC8vIGRhdGEgc3RydWN0dXJlIHRoYXQgaXMgdG8gYmUgcmV0dXJuZWQuCisgICAgLy8KKyAgICBpbnQgcGtnTGV2ZWwgPSAwOworICAgIGludCBjb3JlTGV2ZWwgPSAobkNvcmVzUGVyUGtnIDw9IDEpID8gLTEgOiAxOworICAgIGludCB0aHJlYWRMZXZlbCA9IChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPD0gMSkgPyAtMSA6ICgoY29yZUxldmVsID49IDApID8gMiA6IDEpOworICAgIHVuc2lnbmVkIGRlcHRoID0gKHBrZ0xldmVsID49IDApICsgKGNvcmVMZXZlbCA+PSAwKSArICh0aHJlYWRMZXZlbCA+PSAwKTsKKworICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKyAgICAqYWRkcmVzczJvcyA9IChBZGRyVW5zUGFpciopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG5BcGljcyk7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbkFwaWNzOyArK2kpIHsKKyAgICAgICAgQWRkcmVzcyBhZGRyKGRlcHRoKTsKKyAgICAgICAgdW5zaWduZWQgb3MgPSB0aHJlYWRJbmZvW2ldLm9zSWQ7CisgICAgICAgIGludCBkID0gMDsKKworICAgICAgICBpZiAocGtnTGV2ZWwgPj0gMCkgeworICAgICAgICAgICAgYWRkci5sYWJlbHNbZCsrXSA9IHRocmVhZEluZm9baV0ucGtnSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgICAgICBhZGRyLmxhYmVsc1tkKytdID0gdGhyZWFkSW5mb1tpXS5jb3JlSWQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2QrK10gPSB0aHJlYWRJbmZvW2ldLnRocmVhZElkOworICAgICAgICB9CisgICAgICAgICgqYWRkcmVzczJvcylbaV0gPSBBZGRyVW5zUGFpcihhZGRyLCBvcyk7CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTZXQgdGhlIGdyYW51bGFyaXR5IGxldmVsIGJhc2VkIG9uIHdoYXQgbGV2ZWxzIGFyZSBtb2RlbGVkCisgICAgICAgIC8vIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcC4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBpZiAoKHRocmVhZExldmVsID49IDApCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmICgocGtnTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3BhY2thZ2UpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG5BcGljcywgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisvLworLy8gSW50ZWwoUikgbWljcm9hcmNoaXRlY3R1cmUgY29kZSBuYW1lIE5laGFsZW0sIER1bm5pbmd0b24gYW5kIGxhdGVyCisvLyBhcmNoaXRlY3R1cmVzIHN1cHBvcnQgYSBuZXdlciBpbnRlcmZhY2UgZm9yIHNwZWNpZnlpbmcgdGhlIHgyQVBJQyBJZHMsCisvLyBiYXNlZCBvbiBjcHVpZCBsZWFmIDExLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX2FmZmluaXR5X2NyZWF0ZV94MmFwaWNpZF9tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLAorICBrbXBfaTE4bl9pZF90ICpjb25zdCBtc2dfaWQpCit7CisgICAga21wX2NwdWlkIGJ1ZjsKKworICAgICphZGRyZXNzMm9zID0gTlVMTDsKKyAgICAqbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIGNwdWlkIGxlYWYgMTEgaXMgc3VwcG9ydGVkLgorICAgIC8vCisgICAgX19rbXBfeDg2X2NwdWlkKDAsIDAsICZidWYpOworICAgIGlmIChidWYuZWF4IDwgMTEpIHsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob0xlYWYxMVN1cHBvcnQ7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgX19rbXBfeDg2X2NwdWlkKDExLCAwLCAmYnVmKTsKKyAgICBpZiAoYnVmLmVieCA9PSAwKSB7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTm9MZWFmMTFTdXBwb3J0OworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgbGV2ZWxzIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5LiAgV2hpbGUgd2UncmUgYXQgaXQsCisgICAgLy8gZ2V0IHRoZSBkZWZhdWx0IHZhbHVlcyBmb3IgX19rbXBfblRocmVhZHNQZXJDb3JlICYgbkNvcmVzUGVyUGtnLiAgV2Ugd2lsbAorICAgIC8vIHRyeSB0byBnZXQgbW9yZSBhY2N1cmF0ZSB2YWx1ZXMgbGF0ZXIgYnkgZXhwbGljaXRseSBjb3VudGluZyB0aGVtLAorICAgIC8vIGJ1dCBnZXQgcmVhc29uYWJsZSBkZWZhdWx0cyBub3csIGluIGNhc2Ugd2UgcmV0dXJuIGVhcmx5LgorICAgIC8vCisgICAgaW50IGxldmVsOworICAgIGludCB0aHJlYWRMZXZlbCA9IC0xOworICAgIGludCBjb3JlTGV2ZWwgPSAtMTsKKyAgICBpbnQgcGtnTGV2ZWwgPSAtMTsKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBuQ29yZXNQZXJQa2cgPSBuUGFja2FnZXMgPSAxOworCisgICAgZm9yIChsZXZlbCA9IDA7OyBsZXZlbCsrKSB7CisgICAgICAgIGlmIChsZXZlbCA+IDMxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gRklYTUU6IEhhY2sgZm9yIERQRDIwMDE2MzE4MAorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGxldmVsIGlzIGJpZyB0aGVuIHNvbWV0aGluZyB3ZW50IHdyb25nIC0+IGV4aXRpbmcKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUaGVyZSBjb3VsZCBhY3R1YWxseSBiZSAzMiB2YWxpZCBsZXZlbHMgaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3ksCisgICAgICAgICAgICAvLyBidXQgc28gZmFyLCB0aGUgb25seSBtYWNoaW5lIHdlIGhhdmUgc2VlbiB3aGljaCBkb2VzIG5vdCBleGl0CisgICAgICAgICAgICAvLyB0aGlzIGxvb3AgYmVmb3JlIGl0ZXJhdGlvbiAzMiBoYXMgZnViYXIgeDJBUElDIHNldHRpbmdzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEZvciBub3csIGp1c3QgcmVqZWN0IHRoaXMgY2FzZSBiYXNlZCB1cG9uIGxvb3AgdHJpcCBjb3VudC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfeDg2X2NwdWlkKDExLCBsZXZlbCwgJmJ1Zik7CisgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgIGlmIChwa2dMZXZlbCA8IDApIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdpbGwgaW5mZXIgblBhY2thZ2VzIGZyb20gX19rbXBfeHByb2MKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGludCBraW5kID0gKGJ1Zi5lY3ggPj4gOCkgJiAweGZmOworICAgICAgICBpZiAoa2luZCA9PSAxKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gU01UIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIGNvcmVMZXZlbCA9IC0xOworICAgICAgICAgICAgcGtnTGV2ZWwgPSAtMTsKKyAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IGJ1Zi5lYnggJiAweGZmOworICAgICAgICAgICAgaWYgKF9fa21wX25UaHJlYWRzUGVyQ29yZSA9PSAwKSB7CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbnZhbGlkQ3B1aWRJbmZvOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmIChraW5kID09IDIpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBjb3JlIGxldmVsCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29yZUxldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBwa2dMZXZlbCA9IC0xOworICAgICAgICAgICAgbkNvcmVzUGVyUGtnID0gYnVmLmVieCAmIDB4ZmY7CisgICAgICAgICAgICBpZiAobkNvcmVzUGVyUGtnID09IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKGxldmVsIDw9IDApIHsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0ludmFsaWRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKHBrZ0xldmVsID49IDApIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHBrZ0xldmVsID0gbGV2ZWw7CisgICAgICAgICAgICBuUGFja2FnZXMgPSBidWYuZWJ4ICYgMHhmZjsKKyAgICAgICAgICAgIGlmIChuUGFja2FnZXMgPT0gMCkgeworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfSW52YWxpZENwdWlkSW5mbzsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgaW50IGRlcHRoID0gbGV2ZWw7CisKKyAgICAvLworICAgIC8vIEluIHRoZSBhYm92ZSBsb29wLCAibGV2ZWwiIHdhcyBjb3VudGVkIGZyb20gdGhlIGZpbmVzdCBsZXZlbCAodXN1YWxseQorICAgIC8vIHRocmVhZCkgdG8gdGhlIGNvYXJzZXN0LiAgVGhlIGNhbGxlciBleHBlY3RzIHRoYXQgd2Ugd2lsbCBwbGFjZSB0aGUKKyAgICAvLyBsYWJlbHMgaW4gKCphZGRyZXNzMm9zKVtdLmZpcnN0LmxhYmVsc1tdIGluIHRoZSBpbnZlcnNlIG9yZGVyLCBzbworICAgIC8vIHdlIG5lZWQgdG8gaW52ZXJ0IHRoZSB2YXJzIHNheWluZyB3aGljaCBsZXZlbCBtZWFucyB3aGF0LgorICAgIC8vCisgICAgaWYgKHRocmVhZExldmVsID49IDApIHsKKyAgICAgICAgdGhyZWFkTGV2ZWwgPSBkZXB0aCAtIHRocmVhZExldmVsIC0gMTsKKyAgICB9CisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIGNvcmVMZXZlbCA9IGRlcHRoIC0gY29yZUxldmVsIC0gMTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChwa2dMZXZlbCA+PSAwKTsKKyAgICBwa2dMZXZlbCA9IGRlcHRoIC0gcGtnTGV2ZWwgLSAxOworCisgICAgLy8KKyAgICAvLyBUaGUgYWxnb3JpdGhtIHVzZWQgc3RhcnRzIGJ5IHNldHRpbmcgdGhlIGFmZmluaXR5IHRvIGVhY2ggYXZhaWxhYmxlCisgICAgLy8gdGhyZWFkIGFuZCByZXRyaWV2aW5nIGluZm8gZnJvbSB0aGUgY3B1aWQgaW5zdHJ1Y3Rpb24sIHNvIGlmIHdlIGFyZQorICAgIC8vIG5vdCBjYXBhYmxlIG9mIGNhbGxpbmcgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZAorICAgIC8vIF9rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpLCB0aGVuIHdlIG5lZWQgdG8gZG8gc29tZXRoaW5nIGVsc2UgLSB1c2UKKyAgICAvLyB0aGUgZGVmYXVsdHMgdGhhdCB3ZSBjYWxjdWxhdGVkIGZyb20gaXNzdWluZyBjcHVpZCB3aXRob3V0IGJpbmRpbmcKKyAgICAvLyB0byBlYWNoIHByb2MuCisgICAgLy8KKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKQorICAgIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSGFjayB0byB0cnkgYW5kIGluZmVyIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHVzaW5nIG9ubHkgdGhlIGRhdGEKKyAgICAgICAgLy8gYXZhaWxhYmxlIGZyb20gY3B1aWQgb24gdGhlIGN1cnJlbnQgdGhyZWFkLCBhbmQgX19rbXBfeHByb2MuCisgICAgICAgIC8vCisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsKKworICAgICAgICBfX2ttcF9uY29yZXMgPSBfX2ttcF94cHJvYyAvIF9fa21wX25UaHJlYWRzUGVyQ29yZTsKKyAgICAgICAgblBhY2thZ2VzID0gKF9fa21wX3hwcm9jICsgbkNvcmVzUGVyUGtnIC0gMSkgLyBuQ29yZXNQZXJQa2c7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZk5vdENhcGFibGVVc2VMb2NDcHVpZEwxMSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKFVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5LCAiS01QX0FGRklOSVRZIiwgblBhY2thZ2VzLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSwgX19rbXBfbmNvcmVzKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gMDsKKyAgICB9CisKKyAgICAvLworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB3ZSBjYW4gYXNzdW1lIHRoYXQgaXQgaXMgc2FmZSB0byBjYWxsCisgICAgLy8gX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgpIGFuZCBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCksCisgICAgLy8gZXZlbiBpZiBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZS4KKyAgICAvLworCisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBhZmZpbml0eSBtYXNrIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICpvbGRNYXNrOworICAgIEtNUF9DUFVfQUxMT0Mob2xkTWFzayk7CisgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShvbGRNYXNrLCBUUlVFKTsKKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGRhdGEgc3RydWN0dXJlIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgQWRkclVuc1BhaXIgKnJldHZhbCA9IChBZGRyVW5zUGFpciAqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIF9fa21wX2F2YWlsX3Byb2MpOworCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCBlYWNoIG9mIHRoZSBhdmFpbGFibGUgY29udGV4dHMsIGJpbmRpbmcgdGhlIGN1cnJlbnQgdGhyZWFkCisgICAgLy8gdG8gaXQsIGFuZCBvYnRhaW5pbmcgdGhlIHBlcnRpbmVudCBpbmZvcm1hdGlvbiB1c2luZyB0aGUgY3B1aWQgaW5zdHIuCisgICAgLy8KKyAgICB1bnNpZ25lZCBpbnQgcHJvYzsKKyAgICBpbnQgbkFwaWNzID0gMDsKKyAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKHByb2MsIF9fa21wX2FmZmluX2Z1bGxNYXNrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobkFwaWNzIDwgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQocHJvYyk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRXh0cmFjaCB0aGUgbGFiZWxzIGZvciBlYWNoIGxldmVsIGluIHRoZSBtYWNoaW5lIHRvcG9sb2d5IG1hcAorICAgICAgICAvLyBmcm9tIHRoZSBBcGljIElELgorICAgICAgICAvLworICAgICAgICBBZGRyZXNzIGFkZHIoZGVwdGgpOworICAgICAgICBpbnQgcHJldl9zaGlmdCA9IDA7CisKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgxMSwgbGV2ZWwsICZidWYpOworICAgICAgICAgICAgdW5zaWduZWQgYXBpY0lkID0gYnVmLmVkeDsKKyAgICAgICAgICAgIGlmIChidWYuZWJ4ID09IDApIHsKKyAgICAgICAgICAgICAgICBpZiAobGV2ZWwgIT0gZGVwdGggLSAxKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9JbmNvbnNpc3RlbnRDcHVpZEluZm87CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gYXBpY0lkID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICAgICAgbGV2ZWwrKzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGludCBzaGlmdCA9IGJ1Zi5lYXggJiAweDFmOworICAgICAgICAgICAgaW50IG1hc2sgPSAoMSA8PCBzaGlmdCkgLSAxOworICAgICAgICAgICAgYWRkci5sYWJlbHNbZGVwdGggLSBsZXZlbCAtIDFdID0gKGFwaWNJZCAmIG1hc2spID4+IHByZXZfc2hpZnQ7CisgICAgICAgICAgICBwcmV2X3NoaWZ0ID0gc2hpZnQ7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGxldmVsICE9IGRlcHRoKSB7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX0luY29uc2lzdGVudENwdWlkSW5mbzsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorCisgICAgICAgIHJldHZhbFtuQXBpY3NdID0gQWRkclVuc1BhaXIoYWRkciwgcHJvYyk7CisgICAgICAgIG5BcGljcysrOworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UndmUgY29sbGVjdGVkIGFsbCB0aGUgaW5mbyB3ZSBuZWVkLgorICAgIC8vIFJlc3RvcmUgdGhlIG9sZCBhZmZpbml0eSBtYXNrIGZvciB0aGlzIHRocmVhZC4KKyAgICAvLworICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkob2xkTWFzaywgVFJVRSk7CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgcmV0dXJuIG5vdy4KKyAgICAvLworICAgIEtNUF9BU1NFUlQobkFwaWNzID4gMCk7CisgICAgaWYgKG5BcGljcyA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgb2xkTWFzayk7CisKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lORk9STShBdmFpbGFibGVPU1Byb2MsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgS01QX0lORk9STShUb3BvbG9neSwgIktNUF9BRkZJTklUWSIsIG5QYWNrYWdlcywgbkNvcmVzUGVyUGtnLAorICAgICAgICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUsIF9fa21wX25jb3Jlcyk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlKHJldHZhbCk7CisgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIEZvcm0gYW4gQWRkcmVzcyBvYmplY3Qgd2hpY2ggb25seSBpbmNsdWRlcyB0aGUgcGFja2FnZSBsZXZlbC4KKyAgICAgICAgLy8KKyAgICAgICAgQWRkcmVzcyBhZGRyKDEpOworICAgICAgICBhZGRyLmxhYmVsc1swXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbcGtnTGV2ZWxdOworICAgICAgICByZXR2YWxbMF0uZmlyc3QgPSBhZGRyOworCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID0gMDsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF90b3BvbG9neShyZXR2YWwsIDEsIDEsIDAsIC0xLCAtMSk7CisgICAgICAgIH0KKworICAgICAgICAqYWRkcmVzczJvcyA9IHJldHZhbDsKKyAgICAgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICAgICByZXR1cm4gMTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFNvcnQgdGhlIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQocmV0dmFsLCBuQXBpY3MsIHNpemVvZigqcmV0dmFsKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKworICAgIC8vCisgICAgLy8gRmluZCB0aGUgcmFkaXggYXQgZWFjaCBvZiB0aGUgbGV2ZWxzLgorICAgIC8vCisgICAgdW5zaWduZWQgKnRvdGFscyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmNvdW50cyA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKm1heEN0ID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoZGVwdGggKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbGFzdCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKGRlcHRoICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgdG90YWxzW2xldmVsXSA9IDE7CisgICAgICAgIG1heEN0W2xldmVsXSA9IDE7CisgICAgICAgIGNvdW50c1tsZXZlbF0gPSAxOworICAgICAgICBsYXN0W2xldmVsXSA9IHJldHZhbFswXS5maXJzdC5sYWJlbHNbbGV2ZWxdOworICAgIH0KKworICAgIC8vCisgICAgLy8gRnJvbSBoZXJlIG9uLCB0aGUgaXRlcmF0aW9uIHZhcmlhYmxlICJsZXZlbCIgcnVucyBmcm9tIHRoZSBmaW5lc3QKKyAgICAvLyBsZXZlbCB0byB0aGUgY29hcnNlc3QsIGkuZS4gd2UgaXRlcmF0ZSBmb3J3YXJkIHRocm91Z2gKKyAgICAvLyAoKmFkZHJlc3Myb3MpW10uZmlyc3QubGFiZWxzW10gLSBpbiB0aGUgcHJldmlvdXMgbG9vcHMsIHdlIGl0ZXJhdGVkCisgICAgLy8gYmFja3dhcmRzLgorICAgIC8vCisgICAgZm9yIChwcm9jID0gMTsgKGludClwcm9jIDwgbkFwaWNzOyBwcm9jKyspIHsKKyAgICAgICAgaW50IGxldmVsOworICAgICAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICAgICAgaWYgKHJldHZhbFtwcm9jXS5maXJzdC5sYWJlbHNbbGV2ZWxdICE9IGxhc3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgaW50IGo7CisgICAgICAgICAgICAgICAgZm9yIChqID0gbGV2ZWwgKyAxOyBqIDwgZGVwdGg7IGorKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbal0rKzsKKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2pdID0gMTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgYmVsb3cgY2F1c2VzIHByaW50aW5nIGluY29ycmVjdCB0b3BvbG9neSBpbmZvcm1hdGlvbgorICAgICAgICAgICAgICAgICAgICAvLyBpbiBjYXNlIHRoZSBtYXggdmFsdWUgZm9yIHNvbWUgbGV2ZWwgKG1heEN0W2xldmVsXSkgaXMgZW5jb3VudGVyZWQgZWFybGllciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHNvbWUgbGVzcyB2YWx1ZSB3aGlsZSBnb2luZyB0aHJvdWdoIHRoZSBhcnJheS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIGV4YW1wbGUsIGxldCBwa2cwIGhhcyA0IGNvcmVzIGFuZCBwa2cxIGhhcyAyIGNvcmVzLiBUaGVuIG1heEN0WzFdID09IDIKKyAgICAgICAgICAgICAgICAgICAgLy8gd2hlcmVhcyBpdCBtdXN0IGJlIDQuCisgICAgICAgICAgICAgICAgICAgIC8vIFRPRE8hISEgQ2hlY2sgaWYgaXQgY2FuIGJlIGNvbW1lbnRlZCBzYWZlbHkKKyAgICAgICAgICAgICAgICAgICAgLy9tYXhDdFtqXSA9IDE7CisgICAgICAgICAgICAgICAgICAgIGxhc3Rbal0gPSByZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW2pdOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0b3RhbHNbbGV2ZWxdKys7CisgICAgICAgICAgICAgICAgY291bnRzW2xldmVsXSsrOworICAgICAgICAgICAgICAgIGlmIChjb3VudHNbbGV2ZWxdID4gbWF4Q3RbbGV2ZWxdKSB7CisgICAgICAgICAgICAgICAgICAgIG1heEN0W2xldmVsXSA9IGNvdW50c1tsZXZlbF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGxhc3RbbGV2ZWxdID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmIChsZXZlbCA9PSBkZXB0aCAtIDEpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICAgICAgICAgIEtNUF9DUFVfRlJFRShvbGRNYXNrKTsKKyAgICAgICAgICAgICAgICAqbXNnX2lkID0ga21wX2kxOG5fc3RyX3gyQXBpY0lEc05vdFVuaXF1ZTsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFdoZW4gYWZmaW5pdHkgaXMgb2ZmLCB0aGlzIHJvdXRpbmUgd2lsbCBzdGlsbCBiZSBjYWxsZWQgdG8gc2V0CisgICAgLy8gX19rbXBfbmNvcmVzLCBhcyB3ZWxsIGFzIF9fa21wX25UaHJlYWRzUGVyQ29yZSwKKyAgICAvLyBuQ29yZXNQZXJQa2csICYgblBhY2thZ2VzLiAgTWFrZSBzdXJlIGFsbCB0aGVzZSB2YXJzIGFyZSBzZXQKKyAgICAvLyBjb3JyZWN0bHksIGFuZCByZXR1cm4gaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBpZiAodGhyZWFkTGV2ZWwgPj0gMCkgeworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBtYXhDdFt0aHJlYWRMZXZlbF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSAxOworICAgIH0KKyAgICBuUGFja2FnZXMgPSB0b3RhbHNbcGtnTGV2ZWxdOworCisgICAgaWYgKGNvcmVMZXZlbCA+PSAwKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IHRvdGFsc1tjb3JlTGV2ZWxdOworICAgICAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlTGV2ZWxdOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfbmNvcmVzID0gblBhY2thZ2VzOworICAgICAgICBuQ29yZXNQZXJQa2cgPSAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHRoZSBtYWNoaW5lIHRvcG9sb2d5IGlzIHVuaWZvcm0KKyAgICAvLworICAgIHVuc2lnbmVkIHByb2QgPSBtYXhDdFswXTsKKyAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgIHByb2QgKj0gbWF4Q3RbbGV2ZWxdOworICAgIH0KKyAgICBib29sIHVuaWZvcm0gPSAocHJvZCA9PSB0b3RhbHNbbGV2ZWwgLSAxXSk7CisKKyAgICAvLworICAgIC8vIFByaW50IHRoZSBtYWNoaW5lIHRvcG9sb2d5IHN1bW1hcnkuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICBjaGFyIG1hc2tbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhtYXNrLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG9sZE1hc2spOworCisgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNlR2xvYkNwdWlkTDExLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oSW5pdE9TUHJvY1NldE5vdFJlc3BlY3QsICJLTVBfQUZGSU5JVFkiLCBtYXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICBpZiAodW5pZm9ybSkgeworICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKE5vblVuaWZvcm0sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgfQorCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbMF0pOworICAgICAgICBmb3IgKGxldmVsID0gMTsgbGV2ZWwgPD0gcGtnTGV2ZWw7IGxldmVsKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4ICVkIiwgbWF4Q3RbbGV2ZWxdKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfSU5GT1JNKFRvcG9sb2d5RXh0cmEsICJLTVBfQUZGSU5JVFkiLCBidWYuc3RyLCBuQ29yZXNQZXJQa2csCisgICAgICAgICAgX19rbXBfblRocmVhZHNQZXJDb3JlLCBfX2ttcF9uY29yZXMpOworCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChuQXBpY3MgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gKGludCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7ICsrcHJvYykgeworICAgICAgICBfX2ttcF9wdV9vc19pZHhbcHJvY10gPSByZXR2YWxbcHJvY10uc2Vjb25kOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKSB7CisgICAgICAgIF9fa21wX2ZyZWUobGFzdCk7CisgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICBfX2ttcF9mcmVlKGNvdW50cyk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShyZXR2YWwpOworICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkTWFzayk7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gRmluZCBhbnkgbGV2ZWxzIHdpdGggcmFkaWl4IDEsIGFuZCByZW1vdmUgdGhlbSBmcm9tIHRoZSBtYXAKKyAgICAvLyAoZXhjZXB0IGZvciB0aGUgcGFja2FnZSBsZXZlbCkuCisgICAgLy8KKyAgICBpbnQgbmV3X2RlcHRoID0gMDsKKyAgICBmb3IgKGxldmVsID0gMDsgbGV2ZWwgPCBkZXB0aDsgbGV2ZWwrKykgeworICAgICAgICBpZiAoKG1heEN0W2xldmVsXSA9PSAxKSAmJiAobGV2ZWwgIT0gcGtnTGV2ZWwpKSB7CisgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIG5ld19kZXB0aCsrOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgd2UgYXJlIHJlbW92aW5nIGFueSBsZXZlbHMsIGFsbG9jYXRlIGEgbmV3IHZlY3RvciB0byByZXR1cm4sCisgICAgLy8gYW5kIGNvcHkgdGhlIHJlbGV2YW50IGluZm9ybWF0aW9uIHRvIGl0LgorICAgIC8vCisgICAgaWYgKG5ld19kZXB0aCAhPSBkZXB0aCkgeworICAgICAgICBBZGRyVW5zUGFpciAqbmV3X3JldHZhbCA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKAorICAgICAgICAgIHNpemVvZihBZGRyVW5zUGFpcikgKiBuQXBpY3MpOworICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgQWRkcmVzcyBhZGRyKG5ld19kZXB0aCk7CisgICAgICAgICAgICBuZXdfcmV0dmFsW3Byb2NdID0gQWRkclVuc1BhaXIoYWRkciwgcmV0dmFsW3Byb2NdLnNlY29uZCk7CisgICAgICAgIH0KKyAgICAgICAgaW50IG5ld19sZXZlbCA9IDA7CisgICAgICAgIGludCBuZXdQa2dMZXZlbCA9IC0xOworICAgICAgICBpbnQgbmV3Q29yZUxldmVsID0gLTE7CisgICAgICAgIGludCBuZXdUaHJlYWRMZXZlbCA9IC0xOworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChsZXZlbCA9IDA7IGxldmVsIDwgZGVwdGg7IGxldmVsKyspIHsKKyAgICAgICAgICAgIGlmICgobWF4Q3RbbGV2ZWxdID09IDEpCisgICAgICAgICAgICAgICYmIChsZXZlbCAhPSBwa2dMZXZlbCkpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlbW92ZSB0aGlzIGxldmVsLiBOZXZlciByZW1vdmUgdGhlIHBhY2thZ2UgbGV2ZWwKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGxldmVsID09IHBrZ0xldmVsKSB7CisgICAgICAgICAgICAgICAgbmV3UGtnTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSBjb3JlTGV2ZWwpIHsKKyAgICAgICAgICAgICAgICBuZXdDb3JlTGV2ZWwgPSBsZXZlbDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChsZXZlbCA9PSB0aHJlYWRMZXZlbCkgeworICAgICAgICAgICAgICAgIG5ld1RocmVhZExldmVsID0gbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBmb3IgKHByb2MgPSAwOyAoaW50KXByb2MgPCBuQXBpY3M7IHByb2MrKykgeworICAgICAgICAgICAgICAgIG5ld19yZXR2YWxbcHJvY10uZmlyc3QubGFiZWxzW25ld19sZXZlbF0KKyAgICAgICAgICAgICAgICAgID0gcmV0dmFsW3Byb2NdLmZpcnN0LmxhYmVsc1tsZXZlbF07CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXdfbGV2ZWwrKzsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2ZyZWUocmV0dmFsKTsKKyAgICAgICAgcmV0dmFsID0gbmV3X3JldHZhbDsKKyAgICAgICAgZGVwdGggPSBuZXdfZGVwdGg7CisgICAgICAgIHBrZ0xldmVsID0gbmV3UGtnTGV2ZWw7CisgICAgICAgIGNvcmVMZXZlbCA9IG5ld0NvcmVMZXZlbDsKKyAgICAgICAgdGhyZWFkTGV2ZWwgPSBuZXdUaHJlYWRMZXZlbDsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPCAwKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFNldCB0aGUgZ3JhbnVsYXJpdHkgbGV2ZWwgYmFzZWQgb24gd2hhdCBsZXZlbHMgYXJlIG1vZGVsZWQKKyAgICAgICAgLy8gaW4gdGhlIG1hY2hpbmUgdG9wb2xvZ3kgbWFwLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9IDA7CisgICAgICAgIGlmICgodGhyZWFkTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX3RocmVhZCkpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChjb3JlTGV2ZWwgPj0gMCkgJiYgKF9fa21wX2FmZmluaXR5X2dyYW4gPiBhZmZpbml0eV9ncmFuX2NvcmUpKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscysrOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3kocmV0dmFsLCBuQXBpY3MsIGRlcHRoLCBwa2dMZXZlbCwKKyAgICAgICAgICBjb3JlTGV2ZWwsIHRocmVhZExldmVsKTsKKyAgICB9CisKKyAgICBfX2ttcF9mcmVlKGxhc3QpOworICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgS01QX0NQVV9GUkVFKG9sZE1hc2spOworICAgICphZGRyZXNzMm9zID0gcmV0dmFsOworICAgIHJldHVybiBkZXB0aDsKK30KKworCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworCisjZGVmaW5lIG9zSWRJbmRleCAgICAgICAwCisjZGVmaW5lIHRocmVhZElkSW5kZXggICAxCisjZGVmaW5lIGNvcmVJZEluZGV4ICAgICAyCisjZGVmaW5lIHBrZ0lkSW5kZXggICAgICAzCisjZGVmaW5lIG5vZGVJZEluZGV4ICAgICA0CisKK3R5cGVkZWYgdW5zaWduZWQgKlByb2NDcHVJbmZvOworc3RhdGljIHVuc2lnbmVkIG1heEluZGV4ID0gcGtnSWRJbmRleDsKKworCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jbXBfUHJvY0NwdUluZm9fb3NfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICBjb25zdCB1bnNpZ25lZCAqYWEgPSAoY29uc3QgdW5zaWduZWQgKilhOworICAgIGNvbnN0IHVuc2lnbmVkICpiYiA9IChjb25zdCB1bnNpZ25lZCAqKWI7CisgICAgaWYgKGFhW29zSWRJbmRleF0gPCBiYltvc0lkSW5kZXhdKSByZXR1cm4gLTE7CisgICAgaWYgKGFhW29zSWRJbmRleF0gPiBiYltvc0lkSW5kZXhdKSByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQoY29uc3Qgdm9pZCAqYSwgY29uc3Qgdm9pZCAqYikKK3sKKyAgICB1bnNpZ25lZCBpOworICAgIGNvbnN0IHVuc2lnbmVkICphYSA9ICooKGNvbnN0IHVuc2lnbmVkICoqKWEpOworICAgIGNvbnN0IHVuc2lnbmVkICpiYiA9ICooKGNvbnN0IHVuc2lnbmVkICoqKWIpOworICAgIGZvciAoaSA9IG1heEluZGV4OyA7IGktLSkgeworICAgICAgICBpZiAoYWFbaV0gPCBiYltpXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWFbaV0gPiBiYltpXSkgcmV0dXJuIDE7CisgICAgICAgIGlmIChpID09IG9zSWRJbmRleCkgYnJlYWs7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8vCisvLyBQYXJzZSAvcHJvYy9jcHVpbmZvIChvciBhbiBhbHRlcm5hdGUgZmlsZSBpbiB0aGUgc2FtZSBmb3JtYXQpIHRvIG9idGFpbiB0aGUKKy8vIGFmZmluaXR5IG1hcC4KKy8vCitzdGF0aWMgaW50CitfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoQWRkclVuc1BhaXIgKiphZGRyZXNzMm9zLCBpbnQgKmxpbmUsCisgIGttcF9pMThuX2lkX3QgKmNvbnN0IG1zZ19pZCwgRklMRSAqZikKK3sKKyAgICAqYWRkcmVzczJvcyA9IE5VTEw7CisgICAgKm1zZ19pZCA9IGttcF9pMThuX251bGw7CisKKyAgICAvLworICAgIC8vIFNjYW4gb2YgdGhlIGZpbGUsIGFuZCBjb3VudCB0aGUgbnVtYmVyIG9mICJwcm9jZXNzb3IiIChvc0lkKSBmaWVsZHMsCisgICAgLy8gYW5kIGZpbmQgdGhlIGhpZ2hlc3QgdmFsdWUgb2YgPG4+IGZvciBhIG5vZGVfPG4+IGZpZWxkLgorICAgIC8vCisgICAgY2hhciBidWZbMjU2XTsKKyAgICB1bnNpZ25lZCBudW1fcmVjb3JkcyA9IDA7CisgICAgd2hpbGUgKCEgZmVvZihmKSkgeworICAgICAgICBidWZbc2l6ZW9mKGJ1ZikgLSAxXSA9IDE7CisgICAgICAgIGlmICghIGZnZXRzKGJ1Ziwgc2l6ZW9mKGJ1ZiksIGYpKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBlcnJvcnMgcHJlc3VtYWJseSBiZWNhdXNlIG9mIEVPRgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgY2hhciBzMVtdID0gInByb2Nlc3NvciI7CisgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczEsIHNpemVvZihzMSkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICBudW1fcmVjb3JkcysrOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGSVhNRSAtIHRoaXMgd2lsbCBtYXRjaCAibm9kZV88bj4gPGdhcmJhZ2U+IgorICAgICAgICAvLworICAgICAgICB1bnNpZ25lZCBsZXZlbDsKKyAgICAgICAgaWYgKEtNUF9TU0NBTkYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgaWYgKG5vZGVJZEluZGV4ICsgbGV2ZWwgPj0gbWF4SW5kZXgpIHsKKyAgICAgICAgICAgICAgICBtYXhJbmRleCA9IG5vZGVJZEluZGV4ICsgbGV2ZWw7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgZm9yIGVtcHR5IGZpbGUgLyBubyB2YWxpZCBwcm9jZXNzb3IgcmVjb3Jkcywgb3IgdG9vIG1hbnkuCisgICAgLy8gVGhlIG51bWJlciBvZiByZWNvcmRzIGNhbid0IGV4Y2VlZCB0aGUgbnVtYmVyIG9mIHZhbGlkIGJpdHMgaW4gdGhlCisgICAgLy8gYWZmaW5pdHkgbWFzay4KKyAgICAvLworICAgIGlmIChudW1fcmVjb3JkcyA9PSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ob1Byb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmIChudW1fcmVjb3JkcyA+ICh1bnNpZ25lZClfX2ttcF94cHJvYykgeworICAgICAgICAqbGluZSA9IDA7CisgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfVG9vTWFueVByb2NSZWNvcmRzOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGZpbGUgcG9pbnRlciBiYWNrIHRvIHRoZSBiZWdnaW5uaW5nLCBzbyB0aGF0IHdlIGNhbiBzY2FuIHRoZQorICAgIC8vIGZpbGUgYWdhaW4sIHRoaXMgdGltZSBwZXJmb3JtaW5nIGEgZnVsbCBwYXJzZSBvZiB0aGUgZGF0YS4KKyAgICAvLyBBbGxvY2F0ZSBhIHZlY3RvciBvZiBQcm9jQ3B1SW5mbyBvYmplY3QsIHdoZXJlIHdlIHdpbGwgcGxhY2UgdGhlIGRhdGEuCisgICAgLy8gQWRkaW5nIGFuIGV4dHJhIGVsZW1lbnQgYXQgdGhlIGVuZCBhbGxvd3MgdXMgdG8gcmVtb3ZlIGEgbG90IG9mIGV4dHJhCisgICAgLy8gY2hlY2tzIGZvciB0ZXJtaW5hdGlvbiBjb25kaXRpb25zLgorICAgIC8vCisgICAgaWYgKGZzZWVrKGYsIDAsIFNFRUtfU0VUKSAhPSAwKSB7CisgICAgICAgICpsaW5lID0gMDsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50UmV3aW5kQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworICAgIH0KKworICAgIC8vCisgICAgLy8gQWxsb2NhdGUgdGhlIGFycmF5IG9mIHJlY29yZHMgdG8gc3RvcmUgdGhlIHByb2MgaW5mbyBpbi4gIFRoZSBkdW1teQorICAgIC8vIGVsZW1lbnQgYXQgdGhlIGVuZCBtYWtlcyB0aGUgbG9naWMgaW4gZmlsbGluZyB0aGVtIG91dCBlYXNpZXIgdG8gY29kZS4KKyAgICAvLworICAgIHVuc2lnbmVkICoqdGhyZWFkSW5mbyA9ICh1bnNpZ25lZCAqKilfX2ttcF9hbGxvY2F0ZSgobnVtX3JlY29yZHMgKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQgKikpOworICAgIHVuc2lnbmVkIGk7CisgICAgZm9yIChpID0gMDsgaSA8PSBudW1fcmVjb3JkczsgaSsrKSB7CisgICAgICAgIHRocmVhZEluZm9baV0gPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgfQorCisjZGVmaW5lIENMRUFOVVBfVEhSRUFEX0lORk8gXAorICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9mcmVlKHRocmVhZEluZm9baV0pOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2ZyZWUodGhyZWFkSW5mbyk7CisKKyAgICAvLworICAgIC8vIEEgdmFsdWUgb2YgVUlOVF9NQVggbWVhbnMgdGhhdCB3ZSBkaWRuJ3QgZmluZCB0aGUgZmllbGQKKyAgICAvLworICAgIHVuc2lnbmVkIF9faW5kZXg7CisKKyNkZWZpbmUgSU5JVF9QUk9DX0lORk8ocCkgXAorICAgIGZvciAoX19pbmRleCA9IDA7IF9faW5kZXggPD0gbWF4SW5kZXg7IF9faW5kZXgrKykgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAocClbX19pbmRleF0gPSBVSU5UX01BWDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworICAgIGZvciAoaSA9IDA7IGkgPD0gbnVtX3JlY29yZHM7IGkrKykgeworICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW2ldKTsKKyAgICB9CisKKyAgICB1bnNpZ25lZCBudW1fYXZhaWwgPSAwOworICAgICpsaW5lID0gMDsKKyAgICB3aGlsZSAoISBmZW9mKGYpKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSBhbiBpbm5lciBzY29waW5nIGxldmVsLCBzbyB0aGF0IGFsbCB0aGUgZ290byB0YXJnZXRzIGF0IHRoZQorICAgICAgICAvLyBlbmQgb2YgdGhlIGxvb3AgYXBwZWFyIGluIGFuIG91dGVyIHNjb3BpbmcgbGV2ZWwuICBUaGlzIGF2b2lkcworICAgICAgICAvLyB3YXJuaW5ncyBhYm91dCBqdW1waW5nIHBhc3QgYW4gaW5pdGlhbGl6YXRpb24gdG8gYSB0YXJnZXQgaW4gdGhlCisgICAgICAgIC8vIHNhbWUgYmxvY2suCisgICAgICAgIC8vCisgICAgICAgIHsKKyAgICAgICAgICAgIGJ1ZltzaXplb2YoYnVmKSAtIDFdID0gMTsKKyAgICAgICAgICAgIGJvb2wgbG9uZ19saW5lID0gZmFsc2U7CisgICAgICAgICAgICBpZiAoISBmZ2V0cyhidWYsIHNpemVvZihidWYpLCBmKSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gUmVhZCBlcnJvcnMgcHJlc3VtYWJseSBiZWNhdXNlIG9mIEVPRgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gSWYgdGhlcmUgaXMgdmFsaWQgZGF0YSBpbiB0aHJlYWRJbmZvW251bV9hdmFpbF0sIHRoZW4gZmFrZQorICAgICAgICAgICAgICAgIC8vIGEgYmxhbmsgbGluZSBpbiBlbnN1cmUgdGhhdCB0aGUgbGFzdCBhZGRyZXNzIGdldHMgcGFyc2VkLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgYm9vbCB2YWxpZCA9IGZhbHNlOworICAgICAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPD0gbWF4SW5kZXg7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW2ldICE9IFVJTlRfTUFYKSB7CisgICAgICAgICAgICAgICAgICAgICAgICB2YWxpZCA9IHRydWU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEgdmFsaWQpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJ1ZlswXSA9IDA7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCFidWZbc2l6ZW9mKGJ1ZikgLSAxXSkgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gVGhlIGxpbmUgaXMgbG9uZ2VyIHRoYW4gdGhlIGJ1ZmZlci4gIFNldCBhIGZsYWcgYW5kIGRvbid0CisgICAgICAgICAgICAgICAgLy8gZW1pdCBhbiBlcnJvciBpZiB3ZSB3ZXJlIGdvaW5nIHRvIGlnbm9yZSB0aGUgbGluZSwgYW55d2F5LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgbG9uZ19saW5lID0gdHJ1ZTsKKworI2RlZmluZSBDSEVDS19MSU5FIFwKKyAgICBpZiAobG9uZ19saW5lKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Mb25nTGluZUNwdWluZm87ICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIC0xOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKmxpbmUpKys7CisKKyAgICAgICAgICAgIGNoYXIgczFbXSA9ICJwcm9jZXNzb3IiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMSwgc2l6ZW9mKHMxKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMxKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdICE9IFVJTlRfTUFYKSBnb3RvIGR1cF9maWVsZDsKKyAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW251bV9hdmFpbF1bb3NJZEluZGV4XSA9IHZhbDsKKyNpZiBLTVBfT1NfTElOVVggJiYgVVNFX1NZU0ZTX0lORk8KKyAgICAgICAgICAgICAgICBjaGFyIHBhdGhbMjU2XTsKKyAgICAgICAgICAgICAgICBLTVBfU05QUklOVEYocGF0aCwgc2l6ZW9mKHBhdGgpLAorICAgICAgICAgICAgICAgICAgICAiL3N5cy9kZXZpY2VzL3N5c3RlbS9jcHUvY3B1JXUvdG9wb2xvZ3kvcGh5c2ljYWxfcGFja2FnZV9pZCIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWFkX2Zyb21fZmlsZShwYXRoLCAiJXUiLCAmdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdKTsKKworICAgICAgICAgICAgICAgIEtNUF9TTlBSSU5URihwYXRoLCBzaXplb2YocGF0aCksCisgICAgICAgICAgICAgICAgICAgICIvc3lzL2RldmljZXMvc3lzdGVtL2NwdS9jcHUldS90b3BvbG9neS9jb3JlX2lkIiwKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0pOworICAgICAgICAgICAgICAgIF9fa21wX3JlYWRfZnJvbV9maWxlKHBhdGgsICIldSIsICZ0aHJlYWRJbmZvW251bV9hdmFpbF1bY29yZUlkSW5kZXhdKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyNlbHNlCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHMyW10gPSAicGh5c2ljYWwgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMiwgc2l6ZW9mKHMyKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMyKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtwa2dJZEluZGV4XSAhPSBVSU5UX01BWCkgZ290byBkdXBfZmllbGQ7CisgICAgICAgICAgICAgICAgdGhyZWFkSW5mb1tudW1fYXZhaWxdW3BrZ0lkSW5kZXhdID0gdmFsOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2hhciBzM1tdID0gImNvcmUgaWQiOworICAgICAgICAgICAgaWYgKHN0cm5jbXAoYnVmLCBzMywgc2l6ZW9mKHMzKSAtIDEpID09IDApIHsKKyAgICAgICAgICAgICAgICBDSEVDS19MSU5FOworICAgICAgICAgICAgICAgIGNoYXIgKnAgPSBzdHJjaHIoYnVmICsgc2l6ZW9mKHMzKSAtIDEsICc6Jyk7CisgICAgICAgICAgICAgICAgdW5zaWduZWQgdmFsOworICAgICAgICAgICAgICAgIGlmICgocCA9PSBOVUxMKSB8fCAoS01QX1NTQ0FORihwICsgMSwgIiV1XG4iLCAmdmFsKSAhPSAxKSkgZ290byBub192YWw7CisgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9bbnVtX2F2YWlsXVtjb3JlSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtjb3JlSWRJbmRleF0gPSB2YWw7CisgICAgICAgICAgICAgICAgY29udGludWU7CisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIFVTRV9TWVNGU19JTkZPCisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGFyIHM0W10gPSAidGhyZWFkIGlkIjsKKyAgICAgICAgICAgIGlmIChzdHJuY21wKGJ1ZiwgczQsIHNpemVvZihzNCkgLSAxKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgQ0hFQ0tfTElORTsKKyAgICAgICAgICAgICAgICBjaGFyICpwID0gc3RyY2hyKGJ1ZiArIHNpemVvZihzNCkgLSAxLCAnOicpOworICAgICAgICAgICAgICAgIHVuc2lnbmVkIHZhbDsKKyAgICAgICAgICAgICAgICBpZiAoKHAgPT0gTlVMTCkgfHwgKEtNUF9TU0NBTkYocCArIDEsICIldVxuIiwgJnZhbCkgIT0gMSkpIGdvdG8gbm9fdmFsOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bdGhyZWFkSWRJbmRleF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVt0aHJlYWRJZEluZGV4XSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHVuc2lnbmVkIGxldmVsOworICAgICAgICAgICAgaWYgKEtNUF9TU0NBTkYoYnVmLCAibm9kZV8lZCBpZCIsICZsZXZlbCkgPT0gMSkgeworICAgICAgICAgICAgICAgIENIRUNLX0xJTkU7CisgICAgICAgICAgICAgICAgY2hhciAqcCA9IHN0cmNocihidWYgKyBzaXplb2YoczQpIC0gMSwgJzonKTsKKyAgICAgICAgICAgICAgICB1bnNpZ25lZCB2YWw7CisgICAgICAgICAgICAgICAgaWYgKChwID09IE5VTEwpIHx8IChLTVBfU1NDQU5GKHAgKyAxLCAiJXVcbiIsICZ2YWwpICE9IDEpKSBnb3RvIG5vX3ZhbDsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKG5vZGVJZEluZGV4ICsgbGV2ZWwgPD0gbWF4SW5kZXgpOworICAgICAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW251bV9hdmFpbF1bbm9kZUlkSW5kZXggKyBsZXZlbF0gIT0gVUlOVF9NQVgpIGdvdG8gZHVwX2ZpZWxkOworICAgICAgICAgICAgICAgIHRocmVhZEluZm9bbnVtX2F2YWlsXVtub2RlSWRJbmRleCArIGxldmVsXSA9IHZhbDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGRpZG4ndCByZWNvZ25pemUgdGhlIGxlYWRpbmcgdG9rZW4gb24gdGhlIGxpbmUuCisgICAgICAgICAgICAvLyBUaGVyZSBhcmUgbG90cyBvZiBsZWFkaW5nIHRva2VucyB0aGF0IHdlIGRvbid0IHJlY29nbml6ZSAtCisgICAgICAgICAgICAvLyBpZiB0aGUgbGluZSBpc24ndCBlbXB0eSwgZ28gb24gdG8gdGhlIG5leHQgbGluZS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKCpidWYgIT0gMCkgJiYgKCpidWYgIT0gJ1xuJykpIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIElmIHRoZSBsaW5lIGlzIGxvbmdlciB0aGFuIHRoZSBidWZmZXIsIHJlYWQgY2hhcmFjdGVycworICAgICAgICAgICAgICAgIC8vIHVudGlsIHdlIGZpbmQgYSBuZXdsaW5lLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKGxvbmdfbGluZSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgY2g7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlICgoKGNoID0gZmdldGMoZikpICE9IEVPRikgJiYgKGNoICE9ICdcbicpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIG5ld2xpbmUgaGFzIHNpZ25hbGxlZCB0aGUgZW5kIG9mIHRoZSBwcm9jZXNzb3IgcmVjb3JkLgorICAgICAgICAgICAgLy8gQ2hlY2sgdGhhdCB0aGVyZSBhcmVuJ3QgdG9vIG1hbnkgcHJvY3Mgc3BlY2lmaWVkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgoaW50KW51bV9hdmFpbCA9PSBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9Ub29NYW55RW50cmllczsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDaGVjayBmb3IgbWlzc2luZyBmaWVsZHMuICBUaGUgb3NJZCBmaWVsZCBtdXN0IGJlIHRoZXJlLCBhbmQgd2UKKyAgICAgICAgICAgIC8vIGN1cnJlbnRseSByZXF1aXJlIHRoYXQgdGhlIHBoeXNpY2FsIGlkIGZpZWxkIGlzIHNwZWNpZmllZCwgYWxzby4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tudW1fYXZhaWxdW29zSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfTWlzc2luZ1Byb2NGaWVsZDsKKyAgICAgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgICAgICAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nUGh5c2ljYWxJREZpZWxkOworICAgICAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgdGhpcyBwcm9jIGlmIGl0IGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgbWFjaGluZSBtb2RlbC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHRocmVhZEluZm9bbnVtX2F2YWlsXVtvc0lkSW5kZXhdLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhIHN1Y2Nlc3NmdWwgcGFyc2Ugb2YgdGhpcyBwcm9jJ3MgaW5mby4KKyAgICAgICAgICAgIC8vIEluY3JlbWVudCB0aGUgY291bnRlciwgYW5kIHByZXBhcmUgZm9yIHRoZSBuZXh0IHByb2MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbnVtX2F2YWlsKys7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgICAgICAgICBJTklUX1BST0NfSU5GTyh0aHJlYWRJbmZvW251bV9hdmFpbF0pOworICAgICAgICB9CisgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIG5vX3ZhbDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9NaXNzaW5nVmFsQ3B1aW5mbzsKKyAgICAgICAgcmV0dXJuIC0xOworCisgICAgICAgIGR1cF9maWVsZDoKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgKm1zZ19pZCA9IGttcF9pMThuX3N0cl9EdXBsaWNhdGVGaWVsZENwdWluZm87CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgKmxpbmUgPSAwOworCisjIGlmIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorICAgIHVuc2lnbmVkIHRlYW1TaXplID0gMDsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICAvLyBjaGVjayBmb3IgbnVtX3JlY29yZHMgPT0gX19rbXBfeHByb2MgPz8/CisKKyAgICAvLworICAgIC8vIElmIHRoZXJlJ3Mgb25seSBvbmUgdGhyZWFkIGNvbnRleHQgdG8gYmluZCB0bywgZm9ybSBhbiBBZGRyZXNzIG9iamVjdAorICAgIC8vIHdpdGggZGVwdGggMSBhbmQgcmV0dXJuIGltbWVkaWF0ZWx5IChvciwgaWYgYWZmaW5pdHkgaXMgb2ZmLCBzZXQKKyAgICAvLyBhZGRyZXNzMm9zIHRvIE5VTEwgYW5kIHJldHVybikuCisgICAgLy8KKyAgICAvLyBJZiBpdCBpcyBjb25maWd1cmVkIHRvIG9taXQgdGhlIHBhY2thZ2UgbGV2ZWwgd2hlbiB0aGVyZSBpcyBvbmx5IGEKKyAgICAvLyBzaW5nbGUgcGFja2FnZSwgdGhlIGxvZ2ljIGF0IHRoZSBlbmQgb2YgdGhpcyByb3V0aW5lIHdvbid0IHdvcmsgaWYKKyAgICAvLyB0aGVyZSBpcyBvbmx5IGEgc2luZ2xlIHRocmVhZCAtIGl0IHdvdWxkIHRyeSB0byBmb3JtIGFuIEFkZHJlc3MKKyAgICAvLyBvYmplY3Qgd2l0aCBkZXB0aCAwLgorICAgIC8vCisgICAgS01QX0FTU0VSVChudW1fYXZhaWwgPiAwKTsKKyAgICBLTVBfQVNTRVJUKG51bV9hdmFpbCA8PSBudW1fcmVjb3Jkcyk7CisgICAgaWYgKG51bV9hdmFpbCA9PSAxKSB7CisgICAgICAgIF9fa21wX25jb3JlcyA9IDE7CisgICAgICAgIF9fa21wX25UaHJlYWRzUGVyQ29yZSA9IG5Db3Jlc1BlclBrZyA9IG5QYWNrYWdlcyA9IDE7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZOb3RDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgaW5kZXg7CisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCgmYnVmKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIjEiKTsKKyAgICAgICAgICAgIGZvciAoaW5kZXggPSBtYXhJbmRleCAtIDE7IGluZGV4ID4gcGtnSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoJmJ1ZiwgIiB4IDEiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsIDEsIDEsIDEpOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKV9fa21wX2FsbG9jYXRlKHNpemVvZihBZGRyVW5zUGFpcikpOworICAgICAgICBBZGRyZXNzIGFkZHIoMSk7CisgICAgICAgIGFkZHIubGFiZWxzWzBdID0gdGhyZWFkSW5mb1swXVtwa2dJZEluZGV4XTsKKyAgICAgICAgKCphZGRyZXNzMm9zKVswXSA9IEFkZHJVbnNQYWlyKGFkZHIsIHRocmVhZEluZm9bMF1bb3NJZEluZGV4XSk7CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzIDwgMCkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICB9CisKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X3RvcG9sb2d5KCphZGRyZXNzMm9zLCAxLCAxLCAwLCAtMSwgLTEpOworICAgICAgICB9CisKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSB0aHJlYWRJbmZvIHRhYmxlIGJ5IHBoeXNpY2FsIElkLgorICAgIC8vCisgICAgcXNvcnQodGhyZWFkSW5mbywgbnVtX2F2YWlsLCBzaXplb2YoKnRocmVhZEluZm8pLAorICAgICAgX19rbXBfYWZmaW5pdHlfY21wX1Byb2NDcHVJbmZvX3BoeXNfaWQpOworCisgICAgLy8KKyAgICAvLyBUaGUgdGFibGUgaXMgbm93IHNvcnRlZCBieSBwa2dJZCAvIGNvcmVJZCAvIHRocmVhZElkLCBidXQgd2UgcmVhbGx5CisgICAgLy8gZG9uJ3Qga25vdyB0aGUgcmFkaXggb2YgYW55IG9mIHRoZSBmaWVsZHMuICBwa2dJZCdzIG1heSBiZSBzcGFyc2VseQorICAgIC8vIGFzc2lnbmVkIGFtb25nIHRoZSBjaGlwcyBvbiBhIHN5c3RlbS4gIEFsdGhvdWdoIGNvcmVJZCdzIGFyZSB1c3VhbGx5CisgICAgLy8gYXNzaWduZWQgWzAgLi4gY29yZXNQZXJQa2ctMV0gYW5kIHRocmVhZElkJ3MgYXJlIHVzdWFsbHkgYXNzaWduZWQKKyAgICAvLyBbMC4udGhyZWFkc1BlckNvcmUtMV0sIHdlIGRvbid0IHdhbnQgdG8gbWFrZSBhbnkgc3VjaCBhc3N1bXB0aW9ucy4KKyAgICAvLworICAgIC8vIEZvciB0aGF0IG1hdHRlciwgd2UgZG9uJ3Qga25vdyB3aGF0IGNvcmVzUGVyUGtnIGFuZCB0aHJlYWRzUGVyQ29yZQorICAgIC8vIChvciB0aGUgdG90YWwgIyBwYWNrYWdlcykgYXJlIGF0IHRoaXMgcG9pbnQgLSB3ZSB3YW50IHRvIGRldGVybWluZQorICAgIC8vIHRoYXQgbm93LiAgV2Ugb25seSBoYXZlIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBmaXJzdCB0d28gZmlndXJlcy4KKyAgICAvLworICAgIHVuc2lnbmVkICpjb3VudHMgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqbWF4Q3QgPSAodW5zaWduZWQgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKQorICAgICAgKiBzaXplb2YodW5zaWduZWQpKTsKKyAgICB1bnNpZ25lZCAqdG90YWxzID0gKHVuc2lnbmVkICopX19rbXBfYWxsb2NhdGUoKG1heEluZGV4ICsgMSkKKyAgICAgICogc2l6ZW9mKHVuc2lnbmVkKSk7CisgICAgdW5zaWduZWQgKmxhc3RJZCA9ICh1bnNpZ25lZCAqKV9fa21wX2FsbG9jYXRlKChtYXhJbmRleCArIDEpCisgICAgICAqIHNpemVvZih1bnNpZ25lZCkpOworCisgICAgYm9vbCBhc3NpZ25fdGhyZWFkX2lkcyA9IGZhbHNlOworICAgIHVuc2lnbmVkIHRocmVhZElkQ3Q7CisgICAgdW5zaWduZWQgaW5kZXg7CisKKyAgICByZXN0YXJ0X3JhZGl4X2NoZWNrOgorICAgIHRocmVhZElkQ3QgPSAwOworCisgICAgLy8KKyAgICAvLyBJbml0aWFsaXplIHRoZSBjb3VudGVyIGFycmF5cyB3aXRoIGRhdGEgZnJvbSB0aHJlYWRJbmZvWzBdLgorICAgIC8vCisgICAgaWYgKGFzc2lnbl90aHJlYWRfaWRzKSB7CisgICAgICAgIGlmICh0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID09IFVJTlRfTUFYKSB7CisgICAgICAgICAgICB0aHJlYWRJbmZvWzBdW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKHRocmVhZElkQ3QgPD0gdGhyZWFkSW5mb1swXVt0aHJlYWRJZEluZGV4XSkgeworICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9bMF1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaW5kZXggPSAwOyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBjb3VudHNbaW5kZXhdID0gMTsKKyAgICAgICAgbWF4Q3RbaW5kZXhdID0gMTsKKyAgICAgICAgdG90YWxzW2luZGV4XSA9IDE7CisgICAgICAgIGxhc3RJZFtpbmRleF0gPSB0aHJlYWRJbmZvWzBdW2luZGV4XTs7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBSdW4gdGhyb3VnaCB0aGUgcmVzdCBvZiB0aGUgT1MgcHJvY3MuCisgICAgLy8KKyAgICBmb3IgKGkgPSAxOyBpIDwgbnVtX2F2YWlsOyBpKyspIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRmluZCB0aGUgbW9zdCBzaWduaWZpY2FudCBpbmRleCB3aG9zZSBpZCBkaWZmZXJzCisgICAgICAgIC8vIGZyb20gdGhlIGlkIGZvciB0aGUgcHJldmlvdXMgT1MgcHJvYy4KKyAgICAgICAgLy8KKyAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4OyBpbmRleCA+PSB0aHJlYWRJZEluZGV4OyBpbmRleC0tKSB7CisgICAgICAgICAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMgJiYgKGluZGV4ID09IHRocmVhZElkSW5kZXgpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBBdXRvLWFzc2lnbiB0aGUgdGhyZWFkIGlkIGZpZWxkIGlmIGl0IHdhc24ndCBzcGVjaWZpZWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpZiAodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSA9PSBVSU5UX01BWCkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdID0gdGhyZWFkSWRDdCsrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXBhcnJlbnRseSB0aGUgdGhyZWFkIGlkIGZpZWxkIHdhcyBzcGVjaWZpZWQgZm9yIHNvbWUKKyAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBub3Qgb3RoZXJzLiAgU3RhcnQgdGhlIHRocmVhZCBpZCBjb3VudGVyCisgICAgICAgICAgICAgICAgLy8gb2ZmIGF0IHRoZSBuZXh0IGhpZ2hlciB0aHJlYWQgaWQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgdGhyZWFkSWRDdCA9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gKyAxOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWRJbmZvW2ldW2luZGV4XSAhPSBsYXN0SWRbaW5kZXhdKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSdW4gdGhyb3VnaCBhbGwgaW5kaWNlcyB3aGljaCBhcmUgbGVzcyBzaWduaWZpY2FudCwKKyAgICAgICAgICAgICAgICAvLyBhbmQgcmVzZXQgdGhlIGNvdW50cyB0byAxLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQXQgYWxsIGxldmVscyB1cCB0byBhbmQgaW5jbHVkaW5nIGluZGV4LCB3ZSBuZWVkIHRvCisgICAgICAgICAgICAgICAgLy8gaW5jcmVtZW50IHRoZSB0b3RhbHMgYW5kIHJlY29yZCB0aGUgbGFzdCBpZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHVuc2lnbmVkIGluZGV4MjsKKyAgICAgICAgICAgICAgICBmb3IgKGluZGV4MiA9IHRocmVhZElkSW5kZXg7IGluZGV4MiA8IGluZGV4OyBpbmRleDIrKykgeworICAgICAgICAgICAgICAgICAgICB0b3RhbHNbaW5kZXgyXSsrOworICAgICAgICAgICAgICAgICAgICBpZiAoY291bnRzW2luZGV4Ml0gPiBtYXhDdFtpbmRleDJdKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBtYXhDdFtpbmRleDJdID0gY291bnRzW2luZGV4Ml07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgY291bnRzW2luZGV4Ml0gPSAxOworICAgICAgICAgICAgICAgICAgICBsYXN0SWRbaW5kZXgyXSA9IHRocmVhZEluZm9baV1baW5kZXgyXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgY291bnRzW2luZGV4XSsrOworICAgICAgICAgICAgICAgIHRvdGFsc1tpbmRleF0rKzsKKyAgICAgICAgICAgICAgICBsYXN0SWRbaW5kZXhdID0gdGhyZWFkSW5mb1tpXVtpbmRleF07CisKKyAgICAgICAgICAgICAgICBpZiAoYXNzaWduX3RocmVhZF9pZHMgJiYgKGluZGV4ID4gdGhyZWFkSWRJbmRleCkpIHsKKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gVGhlIGRlZmF1bHQgdGVhbSBzaXplIGlzIHRoZSB0b3RhbCAjdGhyZWFkcyBpbiB0aGUgbWFjaGluZQorICAgICAgICAgICAgICAgICAgICAvLyBtaW51cyAxIHRocmVhZCBmb3IgZXZlcnkgY29yZSB0aGF0IGhhcyAzIG9yIG1vcmUgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgdGVhbVNpemUgKz0gKCB0aHJlYWRJZEN0IDw9IDIgKSA/ICggdGhyZWFkSWRDdCApIDogKCB0aHJlYWRJZEN0IC0gMSApOworIyBlbmRpZiAvLyBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBSZXN0YXJ0IHRoZSB0aHJlYWQgY291bnRlciwgYXMgd2UgYXJlIG9uIGEgbmV3IGNvcmUuCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSAwOworCisgICAgICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgICAgIC8vIEF1dG8tYXNzaWduIHRoZSB0aHJlYWQgaWQgZmllbGQgaWYgaXQgd2Fzbid0IHNwZWNpZmllZC4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPT0gVUlOVF9NQVgpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0gPSB0aHJlYWRJZEN0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICAvLyBBcGFycmVudGx5IHRoZSB0aHJlYWQgaWQgZmllbGQgd2FzIHNwZWNpZmllZCBmb3Igc29tZQorICAgICAgICAgICAgICAgICAgICAvLyBlbnRyaWVzIGFuZCBub3Qgb3RoZXJzLiAgU3RhcnQgdGhlIHRocmVhZCBpZCBjb3VudGVyCisgICAgICAgICAgICAgICAgICAgIC8vIG9mZiBhdCB0aGUgbmV4dCBoaWdoZXIgdGhyZWFkIGlkLgorICAgICAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICh0aHJlYWRJZEN0IDw9IHRocmVhZEluZm9baV1bdGhyZWFkSWRJbmRleF0pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHRocmVhZElkQ3QgPSB0aHJlYWRJbmZvW2ldW3RocmVhZElkSW5kZXhdICsgMTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoaW5kZXggPCB0aHJlYWRJZEluZGV4KSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhyZWFkIGlkcyB3ZXJlIHNwZWNpZmllZCwgaXQgaXMgYW4gZXJyb3IgaWYgdGhleSBhcmUgbm90CisgICAgICAgICAgICAvLyB1bmlxdWUuICBBbHNvLCBjaGVjayB0aGF0IHdlIHdhdmVuJ3QgYWxyZWFkeSByZXN0YXJ0ZWQgdGhlCisgICAgICAgICAgICAvLyBsb29wICh0byBiZSBzYWZlIC0gc2hvdWxkbid0IG5lZWQgdG8pLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICgodGhyZWFkSW5mb1tpXVt0aHJlYWRJZEluZGV4XSAhPSBVSU5UX01BWCkKKyAgICAgICAgICAgICAgfHwgYXNzaWduX3RocmVhZF9pZHMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgICAgICAgICAgICAgX19rbXBfZnJlZSh0b3RhbHMpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUobWF4Q3QpOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgICAgICAgICBDTEVBTlVQX1RIUkVBRF9JTkZPOworICAgICAgICAgICAgICAgICptc2dfaWQgPSBrbXBfaTE4bl9zdHJfUGh5c2ljYWxJRHNOb3RVbmlxdWU7CisgICAgICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSWYgdGhlIHRocmVhZCBpZHMgd2VyZSBub3Qgc3BlY2lmaWVkIGFuZCB3ZSBzZWUgZW50cmllcworICAgICAgICAgICAgLy8gZW50cmllcyB0aGF0IGFyZSBkdXBsaWNhdGVzLCBzdGFydCB0aGUgbG9vcCBvdmVyIGFuZAorICAgICAgICAgICAgLy8gYXNzaWduIHRoZSB0aHJlYWQgaWRzIG1hbnVhbGx5LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGFzc2lnbl90aHJlYWRfaWRzID0gdHJ1ZTsKKyAgICAgICAgICAgIGdvdG8gcmVzdGFydF9yYWRpeF9jaGVjazsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAvLworICAgIC8vIFRoZSBkZWZhdWx0IHRlYW0gc2l6ZSBpcyB0aGUgdG90YWwgI3RocmVhZHMgaW4gdGhlIG1hY2hpbmUKKyAgICAvLyBtaW51cyAxIHRocmVhZCBmb3IgZXZlcnkgY29yZSB0aGF0IGhhcyAzIG9yIG1vcmUgdGhyZWFkcy4KKyAgICAvLworICAgIHRlYW1TaXplICs9ICggdGhyZWFkSWRDdCA8PSAyICkgPyAoIHRocmVhZElkQ3QgKSA6ICggdGhyZWFkSWRDdCAtIDEgKTsKKyMgZW5kaWYgLy8gS01QX01JQyAmJiBSRURVQ0VfVEVBTV9TSVpFCisKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPD0gbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICAgaWYgKGNvdW50c1tpbmRleF0gPiBtYXhDdFtpbmRleF0pIHsKKyAgICAgICAgICAgIG1heEN0W2luZGV4XSA9IGNvdW50c1tpbmRleF07CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2ttcF9uVGhyZWFkc1BlckNvcmUgPSBtYXhDdFt0aHJlYWRJZEluZGV4XTsKKyAgICBuQ29yZXNQZXJQa2cgPSBtYXhDdFtjb3JlSWRJbmRleF07CisgICAgblBhY2thZ2VzID0gdG90YWxzW3BrZ0lkSW5kZXhdOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0byBzZWUgaWYgdGhlIG1hY2hpbmUgdG9wb2xvZ3kgaXMgdW5pZm9ybQorICAgIC8vCisgICAgdW5zaWduZWQgcHJvZCA9IHRvdGFsc1ttYXhJbmRleF07CisgICAgZm9yIChpbmRleCA9IHRocmVhZElkSW5kZXg7IGluZGV4IDwgbWF4SW5kZXg7IGluZGV4KyspIHsKKyAgICAgICBwcm9kICo9IG1heEN0W2luZGV4XTsKKyAgICB9CisgICAgYm9vbCB1bmlmb3JtID0gKHByb2QgPT0gdG90YWxzW3RocmVhZElkSW5kZXhdKTsKKworICAgIC8vCisgICAgLy8gV2hlbiBhZmZpbml0eSBpcyBvZmYsIHRoaXMgcm91dGluZSB3aWxsIHN0aWxsIGJlIGNhbGxlZCB0byBzZXQKKyAgICAvLyBfX2ttcF9uY29yZXMsIGFzIHdlbGwgYXMgX19rbXBfblRocmVhZHNQZXJDb3JlLAorICAgIC8vIG5Db3Jlc1BlclBrZywgJiBuUGFja2FnZXMuICBNYWtlIHN1cmUgYWxsIHRoZXNlIHZhcnMgYXJlIHNldAorICAgIC8vIGNvcnJlY3RseSwgYW5kIHJldHVybiBub3cgaWYgYWZmaW5pdHkgaXMgbm90IGVuYWJsZWQuCisgICAgLy8KKyAgICBfX2ttcF9uY29yZXMgPSB0b3RhbHNbY29yZUlkSW5kZXhdOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmTm90Q2FwYWJsZVVzZUNwdWluZm8sICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEF2YWlsYWJsZU9TUHJvYywgIktNUF9BRkZJTklUWSIsIF9fa21wX2F2YWlsX3Byb2MpOworICAgICAgICAgICAgICAgIGlmICh1bmlmb3JtKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oTm9uVW5pZm9ybSwgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9wcmludF9tYXNrKGJ1ZiwgS01QX0FGRklOX01BU0tfUFJJTlRfTEVOLCBfX2ttcF9hZmZpbl9mdWxsTWFzayk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZDYXBhYmxlVXNlQ3B1aW5mbywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2spIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShJbml0T1NQcm9jU2V0Tm90UmVzcGVjdCwgIktNUF9BRkZJTklUWSIsIGJ1Zik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQXZhaWxhYmxlT1NQcm9jLCAiS01QX0FGRklOSVRZIiwgX19rbXBfYXZhaWxfcHJvYyk7CisgICAgICAgICAgICAgICAgaWYgKHVuaWZvcm0pIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShOb25Vbmlmb3JtLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJWQiLCB0b3RhbHNbbWF4SW5kZXhdKTsKKyAgICAgICAgZm9yIChpbmRleCA9IG1heEluZGV4IC0gMTsgaW5kZXggPj0gcGtnSWRJbmRleDsgaW5kZXgtLSkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiIHggJWQiLCBtYXhDdFtpbmRleF0pOworICAgICAgICB9CisgICAgICAgIEtNUF9JTkZPUk0oVG9wb2xvZ3lFeHRyYSwgIktNUF9BRkZJTklUWSIsIGJ1Zi5zdHIsICBtYXhDdFtjb3JlSWRJbmRleF0sCisgICAgICAgICAgbWF4Q3RbdGhyZWFkSWRJbmRleF0sIF9fa21wX25jb3Jlcyk7CisKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworICAgIH0KKworIyBpZiBLTVBfTUlDICYmIFJFRFVDRV9URUFNX1NJWkUKKyAgICAvLworICAgIC8vIFNldCB0aGUgZGVmYXVsdCB0ZWFtIHNpemUuCisgICAgLy8KKyAgICBpZiAoKF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCkgJiYgKHRlYW1TaXplID4gMCkpIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IHRlYW1TaXplOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXA6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9ICVkXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGgpKTsKKyAgICB9CisjIGVuZGlmIC8vIEtNUF9NSUMgJiYgUkVEVUNFX1RFQU1fU0laRQorCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9wdV9vc19pZHggPT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1fYXZhaWwgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgX19rbXBfcHVfb3NfaWR4ID0gKGludCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGludCkgKiBfX2ttcF9hdmFpbF9wcm9jKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbnVtX2F2YWlsOyArK2kpIHsgLy8gZmlsbCB0aGUgb3MgaW5kaWNlcworICAgICAgICBfX2ttcF9wdV9vc19pZHhbaV0gPSB0aHJlYWRJbmZvW2ldW29zSWRJbmRleF07CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgeworICAgICAgICBfX2ttcF9mcmVlKGxhc3RJZCk7CisgICAgICAgIF9fa21wX2ZyZWUodG90YWxzKTsKKyAgICAgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgICAgIF9fa21wX2ZyZWUoY291bnRzKTsKKyAgICAgICAgQ0xFQU5VUF9USFJFQURfSU5GTzsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGxldmVscyB3aGljaCBoYXZlIG1vcmUgbm9kZXMgYXQgdGhhdCBsZXZlbCB0aGFuCisgICAgLy8gYXQgdGhlIHBhcmVudCdzIGxldmVsICh3aXRoIHRoZXJlIGJlaW5nIGFuIGltcGxpY2l0IHJvb3Qgbm9kZSBvZgorICAgIC8vIHRoZSB0b3AgbGV2ZWwpLiAgVGhpcyBpcyBlcXVpdmFsZW50IHRvIHNheWluZyB0aGF0IHRoZXJlIGlzIGF0IGxlYXN0CisgICAgLy8gb25lIG5vZGUgYXQgdGhpcyBsZXZlbCB3aGljaCBoYXMgYSBzaWJsaW5nLiAgVGhlc2UgbGV2ZWxzIGFyZSBpbiB0aGUKKyAgICAvLyBtYXAsIGFuZCB0aGUgcGFja2FnZSBsZXZlbCBpcyBhbHdheXMgaW4gdGhlIG1hcC4KKyAgICAvLworICAgIGJvb2wgKmluTWFwID0gKGJvb2wgKilfX2ttcF9hbGxvY2F0ZSgobWF4SW5kZXggKyAxKSAqIHNpemVvZihib29sKSk7CisgICAgaW50IGxldmVsID0gMDsKKyAgICBmb3IgKGluZGV4ID0gdGhyZWFkSWRJbmRleDsgaW5kZXggPCBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBLTVBfQVNTRVJUKHRvdGFsc1tpbmRleF0gPj0gdG90YWxzW2luZGV4ICsgMV0pOworICAgICAgICBpbk1hcFtpbmRleF0gPSAodG90YWxzW2luZGV4XSA+IHRvdGFsc1tpbmRleCArIDFdKTsKKyAgICB9CisgICAgaW5NYXBbbWF4SW5kZXhdID0gKHRvdGFsc1ttYXhJbmRleF0gPiAxKTsKKyAgICBpbk1hcFtwa2dJZEluZGV4XSA9IHRydWU7CisKKyAgICBpbnQgZGVwdGggPSAwOworICAgIGZvciAoaW5kZXggPSB0aHJlYWRJZEluZGV4OyBpbmRleCA8PSBtYXhJbmRleDsgaW5kZXgrKykgeworICAgICAgICBpZiAoaW5NYXBbaW5kZXhdKSB7CisgICAgICAgICAgICBkZXB0aCsrOworICAgICAgICB9CisgICAgfQorICAgIEtNUF9BU1NFUlQoZGVwdGggPiAwKTsKKworICAgIC8vCisgICAgLy8gQ29uc3RydWN0IHRoZSBkYXRhIHN0cnVjdHVyZSB0aGF0IGlzIHRvIGJlIHJldHVybmVkLgorICAgIC8vCisgICAgKmFkZHJlc3Myb3MgPSAoQWRkclVuc1BhaXIqKQorICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKEFkZHJVbnNQYWlyKSAqIG51bV9hdmFpbCk7CisgICAgaW50IHBrZ0xldmVsID0gLTE7CisgICAgaW50IGNvcmVMZXZlbCA9IC0xOworICAgIGludCB0aHJlYWRMZXZlbCA9IC0xOworCisgICAgZm9yIChpID0gMDsgaSA8IG51bV9hdmFpbDsgKytpKSB7CisgICAgICAgIEFkZHJlc3MgYWRkcihkZXB0aCk7CisgICAgICAgIHVuc2lnbmVkIG9zID0gdGhyZWFkSW5mb1tpXVtvc0lkSW5kZXhdOworICAgICAgICBpbnQgc3JjX2luZGV4OworICAgICAgICBpbnQgZHN0X2luZGV4ID0gMDsKKworICAgICAgICBmb3IgKHNyY19pbmRleCA9IG1heEluZGV4OyBzcmNfaW5kZXggPj0gdGhyZWFkSWRJbmRleDsgc3JjX2luZGV4LS0pIHsKKyAgICAgICAgICAgIGlmICghIGluTWFwW3NyY19pbmRleF0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGFkZHIubGFiZWxzW2RzdF9pbmRleF0gPSB0aHJlYWRJbmZvW2ldW3NyY19pbmRleF07CisgICAgICAgICAgICBpZiAoc3JjX2luZGV4ID09IHBrZ0lkSW5kZXgpIHsKKyAgICAgICAgICAgICAgICBwa2dMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNyY19pbmRleCA9PSBjb3JlSWRJbmRleCkgeworICAgICAgICAgICAgICAgIGNvcmVMZXZlbCA9IGRzdF9pbmRleDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHNyY19pbmRleCA9PSB0aHJlYWRJZEluZGV4KSB7CisgICAgICAgICAgICAgICAgdGhyZWFkTGV2ZWwgPSBkc3RfaW5kZXg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBkc3RfaW5kZXgrKzsKKyAgICAgICAgfQorICAgICAgICAoKmFkZHJlc3Myb3MpW2ldID0gQWRkclVuc1BhaXIoYWRkciwgb3MpOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2V0IHRoZSBncmFudWxhcml0eSBsZXZlbCBiYXNlZCBvbiB3aGF0IGxldmVscyBhcmUgbW9kZWxlZAorICAgICAgICAvLyBpbiB0aGUgbWFjaGluZSB0b3BvbG9neSBtYXAuCisgICAgICAgIC8vCisgICAgICAgIHVuc2lnbmVkIHNyY19pbmRleDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPSAwOworICAgICAgICBmb3IgKHNyY19pbmRleCA9IHRocmVhZElkSW5kZXg7IHNyY19pbmRleCA8PSBtYXhJbmRleDsgc3JjX2luZGV4KyspIHsKKyAgICAgICAgICAgIGlmICghIGluTWFwW3NyY19pbmRleF0pIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHN3aXRjaCAoc3JjX2luZGV4KSB7CisgICAgICAgICAgICAgICAgY2FzZSB0aHJlYWRJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl90aHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMrKzsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGNvcmVJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9jb3JlKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwa2dJZEluZGV4OgorICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuID4gYWZmaW5pdHlfZ3Jhbl9wYWNrYWdlKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfdG9wb2xvZ3koKmFkZHJlc3Myb3MsIG51bV9hdmFpbCwgZGVwdGgsIHBrZ0xldmVsLAorICAgICAgICAgIGNvcmVMZXZlbCwgdGhyZWFkTGV2ZWwpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUoaW5NYXApOworICAgIF9fa21wX2ZyZWUobGFzdElkKTsKKyAgICBfX2ttcF9mcmVlKHRvdGFscyk7CisgICAgX19rbXBfZnJlZShtYXhDdCk7CisgICAgX19rbXBfZnJlZShjb3VudHMpOworICAgIENMRUFOVVBfVEhSRUFEX0lORk87CisgICAgcmV0dXJuIGRlcHRoOworfQorCisKKy8vCisvLyBDcmVhdGUgYW5kIHJldHVybiBhIHRhYmxlIG9mIGFmZmluaXR5IG1hc2tzLCBpbmRleGVkIGJ5IE9TIHRocmVhZCBJRC4KKy8vIFRoaXMgcm91dGluZSBoYW5kbGVzIE9SJ2luZyB0b2dldGhlciBhbGwgdGhlIGFmZmluaXR5IG1hc2tzIG9mIHRocmVhZHMKKy8vIHRoYXQgYXJlIHN1ZmZpY2llbnRseSBjbG9zZSwgaWYgZ3JhbnVsYXJpdHkgPiBmaW5lLgorLy8KK3N0YXRpYyBrbXBfYWZmaW5fbWFza190ICoKK19fa21wX2NyZWF0ZV9tYXNrcyh1bnNpZ25lZCAqbWF4SW5kZXgsIHVuc2lnbmVkICpudW1VbmlxdWUsCisgIEFkZHJVbnNQYWlyICphZGRyZXNzMm9zLCB1bnNpZ25lZCBudW1BZGRycykKK3sKKyAgICAvLworICAgIC8vIEZpcnN0IGZvcm0gYSB0YWJsZSBvZiBhZmZpbml0eSBtYXNrcyBpbiBvcmRlciBvZiBPUyB0aHJlYWQgaWQuCisgICAgLy8KKyAgICB1bnNpZ25lZCBkZXB0aDsKKyAgICB1bnNpZ25lZCBtYXhPc0lkOworICAgIHVuc2lnbmVkIGk7CisKKyAgICBLTVBfQVNTRVJUKG51bUFkZHJzID4gMCk7CisgICAgZGVwdGggPSBhZGRyZXNzMm9zWzBdLmZpcnN0LmRlcHRoOworCisgICAgbWF4T3NJZCA9IDA7CisgICAgZm9yIChpID0gMDsgaSA8IG51bUFkZHJzOyBpKyspIHsKKyAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3NbaV0uc2Vjb25kOworICAgICAgICBpZiAob3NJZCA+IG1heE9zSWQpIHsKKyAgICAgICAgICAgIG1heE9zSWQgPSBvc0lkOworICAgICAgICB9CisgICAgfQorICAgIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKG9zSWQyTWFzaywgKG1heE9zSWQrMSkpOworCisgICAgLy8KKyAgICAvLyBTb3J0IHRoZSBhZGRyZXNzMm9zIHRhYmxlIGFjY29yZGluZyB0byBwaHlzaWNhbCBvcmRlci4gIERvaW5nIHNvCisgICAgLy8gd2lsbCBwdXQgYWxsIHRocmVhZHMgb24gdGhlIHNhbWUgY29yZS9wYWNrYWdlL25vZGUgaW4gY29uc2VjdXRpdmUKKyAgICAvLyBsb2NhdGlvbnMuCisgICAgLy8KKyAgICBxc29ydChhZGRyZXNzMm9zLCBudW1BZGRycywgc2l6ZW9mKCphZGRyZXNzMm9zKSwKKyAgICAgIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2xhYmVscyk7CisKKyAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzID49IDApOworICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlICYmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA+IDApKSB7CisgICAgICAgIEtNUF9JTkZPUk0oVGhyZWFkc01pZ3JhdGUsICJLTVBfQUZGSU5JVFkiLCAgX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMpOworICAgIH0KKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfZ3Jhbl9sZXZlbHMgPj0gKGludClkZXB0aCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZlRocmVhZHNNYXlNaWdyYXRlKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vCisgICAgLy8gUnVuIHRocm91Z2ggdGhlIHRhYmxlLCBmb3JtaW5nIHRoZSBtYXNrcyBmb3IgYWxsIHRocmVhZHMgb24gZWFjaAorICAgIC8vIGNvcmUuICBUaHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUgd2lsbCBoYXZlIGlkZW50aWNhbCAiQWRkcmVzcyIKKyAgICAvLyBvYmplY3RzLCBub3QgY29uc2lkZXJpbmcgdGhlIGxhc3QgbGV2ZWwsIHdoaWNoIG11c3QgYmUgdGhlIHRocmVhZAorICAgIC8vIGlkLiAgQWxsIHRocmVhZHMgb24gYSBjb3JlIHdpbGwgYXBwZWFyIGNvbnNlY3V0aXZlbHkuCisgICAgLy8KKyAgICB1bnNpZ25lZCB1bmlxdWUgPSAwOworICAgIHVuc2lnbmVkIGogPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gaW5kZXggb2YgMXN0IHRocmVhZCBvbiBjb3JlCisgICAgdW5zaWduZWQgbGVhZGVyID0gMDsKKyAgICBBZGRyZXNzICpsZWFkZXJBZGRyID0gJihhZGRyZXNzMm9zWzBdLmZpcnN0KTsKKyAgICBrbXBfYWZmaW5fbWFza190ICpzdW07CisgICAgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhzdW0pOworICAgIEtNUF9DUFVfWkVSTyhzdW0pOworICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbMF0uc2Vjb25kLCBzdW0pOworICAgIGZvciAoaSA9IDE7IGkgPCBudW1BZGRyczsgaSsrKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIHN1ZmZpY2llbnRseSBjbG9zZSB0byB0aGUgbGVhZGVyICh3aXRoaW4gdGhlCisgICAgICAgIC8vIGdyYW51bGFyaXR5IHNldHRpbmcpLCB0aGVuIHNldCB0aGUgYml0IGZvciB0aGlzIG9zIHRocmVhZCBpbiB0aGUKKyAgICAgICAgLy8gYWZmaW5pdHkgbWFzayBmb3IgdGhpcyBncm91cCwgYW5kIGdvIG9uIHRvIHRoZSBuZXh0IHRocmVhZC4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKGxlYWRlckFkZHItPmlzQ2xvc2UoYWRkcmVzczJvc1tpXS5maXJzdCwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscykpIHsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUKGFkZHJlc3Myb3NbaV0uc2Vjb25kLCBzdW0pOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIHRoaXMgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgICAgIC8vIGVudHJ5IGluIHRoZSBvc0lkMk1hc2sgdGFibGUuICBNYXJrIHRoZSBmaXJzdCBhZGRyZXNzIGFzIGEKKyAgICAgICAgLy8gbGVhZGVyLgorICAgICAgICAvLworICAgICAgICBmb3IgKDsgaiA8IGk7IGorKykgeworICAgICAgICAgICAgdW5zaWduZWQgb3NJZCA9IGFkZHJlc3Myb3Nbal0uc2Vjb25kOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBvc0lkKTsKKyAgICAgICAgICAgIEtNUF9DUFVfQ09QWShtYXNrLCBzdW0pOworICAgICAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgICAgICB9CisgICAgICAgIHVuaXF1ZSsrOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFN0YXJ0IGEgbmV3IG1hc2suCisgICAgICAgIC8vCisgICAgICAgIGxlYWRlciA9IGk7CisgICAgICAgIGxlYWRlckFkZHIgPSAmKGFkZHJlc3Myb3NbaV0uZmlyc3QpOworICAgICAgICBLTVBfQ1BVX1pFUk8oc3VtKTsKKyAgICAgICAgS01QX0NQVV9TRVQoYWRkcmVzczJvc1tpXS5zZWNvbmQsIHN1bSk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBGb3IgZXZlcnkgdGhyZWFkIGluIGxhc3QgZ3JvdXAsIGNvcHkgdGhlIG1hc2sgdG8gdGhlIHRocmVhZCdzCisgICAgLy8gZW50cnkgaW4gdGhlIG9zSWQyTWFzayB0YWJsZS4KKyAgICAvLworICAgIGZvciAoOyBqIDwgaTsgaisrKSB7CisgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2pdLnNlY29uZDsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChvc0lkIDw9IG1heE9zSWQpOworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIG9zSWQpOworICAgICAgICBLTVBfQ1BVX0NPUFkobWFzaywgc3VtKTsKKyAgICAgICAgYWRkcmVzczJvc1tqXS5maXJzdC5sZWFkZXIgPSAoaiA9PSBsZWFkZXIpOworICAgIH0KKyAgICB1bmlxdWUrKzsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhzdW0pOworCisgICAgKm1heEluZGV4ID0gbWF4T3NJZDsKKyAgICAqbnVtVW5pcXVlID0gdW5pcXVlOworICAgIHJldHVybiBvc0lkMk1hc2s7Cit9CisKKworLy8KKy8vIFN0dWZmIGZvciB0aGUgYWZmaW5pdHkgcHJvY2xpc3QgcGFyc2Vycy4gIEl0J3MgZWFzaWVyIHRvIGRlY2xhcmUgdGhlc2UgdmFycworLy8gYXMgZmlsZS1zdGF0aWMgdGhhbiB0byB0cnkgYW5kIHBhc3MgdGhlbSB0aHJvdWdoIHRoZSBjYWxsaW5nIHNlcXVlbmNlIG9mCisvLyB0aGUgcmVjdXJzaXZlLWRlc2NlbnQgT01QX1BMQUNFUyBwYXJzZXIuCisvLworc3RhdGljIGttcF9hZmZpbl9tYXNrX3QgKm5ld01hc2tzOworc3RhdGljIGludCBudW1OZXdNYXNrczsKK3N0YXRpYyBpbnQgbmV4dE5ld01hc2s7CisKKyNkZWZpbmUgQUREX01BU0soX21hc2spIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG5leHROZXdNYXNrID49IG51bU5ld01hc2tzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGludCBpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG51bU5ld01hc2tzICo9IDI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIHRlbXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkodGVtcCwgbnVtTmV3TWFza3MpOyAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGZvcihpPTA7aTxudW1OZXdNYXNrcy8yO2krKykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190KiBzcmMgID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7ICAgIFwKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190KiBkZXN0ID0gS01QX0NQVV9JTkRFWCh0ZW1wLCBpKTsgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfSU5URVJOQUxfRlJFRV9BUlJBWShuZXdNYXNrcywgbnVtTmV3TWFza3MvMik7ICAgICAgIFwKKyAgICAgICAgICAgIG5ld01hc2tzID0gdGVtcDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NQVV9DT1BZKEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIG5leHROZXdNYXNrKSwgKF9tYXNrKSk7ICAgIFwKKyAgICAgICAgbmV4dE5ld01hc2srKzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgQUREX01BU0tfT1NJRChfb3NJZCxfb3NJZDJNYXNrLF9tYXhPc0lkKSBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgoKF9vc0lkKSA+IF9tYXhPc0lkKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVCgoX29zSWQpLCBLTVBfQ1BVX0lOREVYKChfb3NJZDJNYXNrKSwgKF9vc0lkKSkpKSkgeyBcCisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgICAgICBcCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgX29zSWQpOyAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBBRERfTUFTSyhLTVBfQ1BVX0lOREVYKF9vc0lkMk1hc2ssIChfb3NJZCkpKTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKy8vCisvLyBSZS1wYXJzZSB0aGUgcHJvY2xpc3QgKGZvciB0aGUgZXhwbGljaXQgYWZmaW5pdHkgdHlwZSksIGFuZCBmb3JtIHRoZSBsaXN0CisvLyBvZiBhZmZpbml0eSBuZXdNYXNrcyBpbmRleGVkIGJ5IGd0aWQuCisvLworc3RhdGljIHZvaWQKK19fa21wX2FmZmluaXR5X3Byb2Nlc3NfcHJvY2xpc3Qoa21wX2FmZmluX21hc2tfdCAqKm91dF9tYXNrcywKKyAgdW5zaWduZWQgaW50ICpvdXRfbnVtTWFza3MsIGNvbnN0IGNoYXIgKnByb2NsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGludCBpOworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBwcm9jbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcHJvY2xpc3Q7CisKKyAgICAvLworICAgIC8vIFdlIHVzZSBtYWxsb2MoKSBmb3IgdGhlIHRlbXBvcmFyeSBtYXNrIHZlY3RvciwKKyAgICAvLyBzbyB0aGF0IHdlIGNhbiB1c2UgcmVhbGxvYygpIHRvIGV4dGVuZCBpdC4KKyAgICAvLworICAgIG51bU5ld01hc2tzID0gMjsKKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0FMTE9DX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgbmV4dE5ld01hc2sgPSAwOworICAgIGttcF9hZmZpbl9tYXNrX3QgKnN1bU1hc2s7CisgICAgS01QX0NQVV9BTExPQyhzdW1NYXNrKTsKKyAgICBpbnQgc2V0U2l6ZSA9IDA7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgZW5kLCBzdHJpZGU7CisKKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbmV4dCA9PSAneycpIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ3snCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHRoZSBmaXJzdCBpbnRlZ2VyIGluIHRoZSBzZXQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgcHJvY2xpc3QiKTsKKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihudW0gPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIENvcHkgdGhlIG1hc2sgZm9yIHRoYXQgb3NJZCB0byB0aGUgc3VtICh1bmlvbikgbWFzay4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKG51bSA+IG1heE9zSWQpIHx8CisgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0NQVV9aRVJPKHN1bU1hc2spOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9DT1BZKHN1bU1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplID0gMTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gQ2hlY2sgZm9yIGVuZCBvZiBzZXQuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAnfScKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFJlYWQgdGhlIG5leHQgaW50ZWdlciBpbiB0aGUgc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksCisgICAgICAgICAgICAgICAgICAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworCisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVDIobnVtID49IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFkZCB0aGUgbWFzayBmb3IgdGhhdCBvc0lkIHRvIHRoZSBzdW0gbWFzay4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgobnVtID4gbWF4T3NJZCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTihzdW1NYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSk7CisgICAgICAgICAgICAgICAgICAgIHNldFNpemUrKzsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoc2V0U2l6ZSA+IDApIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTSyhzdW1NYXNrKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCB0aGUgZmlyc3QgaW50ZWdlci4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICcwJykgJiYgKCpuZXh0IDw9ICc5JyksICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSByYW5nZSwgdGhlbiBhZGQgYSBtYXNrIHRvIHRoZSBsaXN0IGFuZCBnbyBvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgICAgICAgQUREX01BU0tfT1NJRChzdGFydCwgb3NJZDJNYXNrLCBtYXhPc0lkKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICAgICAgLy8KKyAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJy0nCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBLTVBfQVNTRVJUMigoKm5leHQgPj0gJzAnKSAmJiAoKm5leHQgPD0gJzknKSwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGVuZCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUMihlbmQgPj0gMCwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIHN0cmlkZSA9IDE7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAnOicpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBBIHN0cmlkZSBpcyBzcGVjaWZpZWQuICBTa2lwIG92ZXIgdGhlICc6IiBhbmQgcmVhZCB0aGUgM3JkIGludC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJzonCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoKm5leHQgPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiA9IC0xOworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpuZXh0ID49ICAnMCcpICYmICgqbmV4dCA8PSAnOScpLAorICAgICAgICAgICAgICAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKHN0cmlkZSA+PSAwLCAiYmFkIGV4cGxpY2l0IHByb2MgbGlzdCIpOworICAgICAgICAgICAgc3RyaWRlICo9IHNpZ247CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBEbyBzb21lIHJhbmdlIGNoZWNrcy4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0FTU0VSVDIoc3RyaWRlICE9IDAsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA8PSBlbmQsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMihzdGFydCA+PSBlbmQsICJiYWQgZXhwbGljaXQgcHJvYyBsaXN0Iik7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKGVuZCAtIHN0YXJ0KSAvIHN0cmlkZSA8PSA2NTUzNiwgImJhZCBleHBsaWNpdCBwcm9jIGxpc3QiKTsKKworICAgICAgICAvLworICAgICAgICAvLyBBZGQgdGhlIG1hc2sgZm9yIGVhY2ggT1MgcHJvYyAjIHRvIHRoZSBsaXN0LgorICAgICAgICAvLworICAgICAgICBpZiAoc3RyaWRlID4gMCkgeworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIEFERF9NQVNLX09TSUQoc3RhcnQsIG9zSWQyTWFzaywgbWF4T3NJZCk7CisgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgfSB3aGlsZSAoc3RhcnQgPD0gZW5kKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBBRERfTUFTS19PU0lEKHN0YXJ0LCBvc0lkMk1hc2ssIG1heE9zSWQpOworICAgICAgICAgICAgICAgIHN0YXJ0ICs9IHN0cmlkZTsKKyAgICAgICAgICAgIH0gd2hpbGUgKHN0YXJ0ID49IGVuZCk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKCgqb3V0X21hc2tzKSwgbmV4dE5ld01hc2spOworICAgIGZvcihpID0gMDsgaSA8IG5leHROZXdNYXNrOyBpKyspIHsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCogc3JjICA9IEtNUF9DUFVfSU5ERVgobmV3TWFza3MsIGkpOworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBkZXN0ID0gS01QX0NQVV9JTkRFWCgoKm91dF9tYXNrcyksIGkpOworICAgICAgICBLTVBfQ1BVX0NPUFkoZGVzdCwgc3JjKTsKKyAgICB9CisgICAgS01QX0NQVV9JTlRFUk5BTF9GUkVFX0FSUkFZKG5ld01hc2tzLCBudW1OZXdNYXNrcyk7CisgICAgS01QX0NQVV9GUkVFKHN1bU1hc2spOworfQorCisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitSZS1wYXJzZSB0aGUgT01QX1BMQUNFUyBwcm9jIGlkIGxpc3QsIGZvcm1pbmcgdGhlIG5ld01hc2tzIGZvciB0aGUgZGlmZmVyZW50CitwbGFjZXMuICBBZ2FpbiwgSGVyZSBpcyB0aGUgZ3JhbW1hcjoKKworcGxhY2VfbGlzdCA6PSBwbGFjZQorcGxhY2VfbGlzdCA6PSBwbGFjZSAsIHBsYWNlX2xpc3QKK3BsYWNlIDo9IG51bQorcGxhY2UgOj0gcGxhY2UgOiBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtIDogc2lnbmVkCitwbGFjZSA6PSB7IHN1YnBsYWNlbGlzdCB9CitwbGFjZSA6PSAhIHBsYWNlICAgICAgICAgICAgICAgICAgLy8gKGxvd2VzdCBwcmlvcml0eSkKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UKK3N1YnBsYWNlX2xpc3QgOj0gc3VicGxhY2UgLCBzdWJwbGFjZV9saXN0CitzdWJwbGFjZSA6PSBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bQorc3VicGxhY2UgOj0gbnVtIDogbnVtIDogc2lnbmVkCitzaWduZWQgOj0gbnVtCitzaWduZWQgOj0gKyBzaWduZWQKK3NpZ25lZCA6PSAtIHNpZ25lZAorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcm9jZXNzX3N1YnBsYWNlX2xpc3QoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IHN0YXJ0LCBjb3VudCwgc3RyaWRlLCBpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgaW4gdGhlIHN0YXJ0aW5nIHByb2MgaWQKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIEtNUF9BU1NFUlQyKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdGFydCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nIHx8ICoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAoISBLTVBfQ1BVX0lTU0VUKHN0YXJ0LCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZJZ25vcmVJbnZhbGlkUHJvY0lELCBzdGFydCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9VTklPTih0ZW1wTWFzaywgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSk7CisgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQVNTRVJUMigqKnNjYW4gPT0gJzonLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBLTVBfQVNTRVJUMigoKipzY2FuID49ICcwJykgJiYgKCoqc2NhbiA8PSAnOScpLAorICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgY291bnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQrKzsKKyAgICAgICAgICAgICAgICAgICAgKCpzZXRTaXplKSsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAoKnNjYW4pKys7ICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgZm9yICg7OykgeworICAgICAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgICgqc2NhbikrKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqKnNjYW4gPT0gJy0nKSB7CisgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJy0nCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSwKKyAgICAgICAgICAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JyB8fCAqKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoc3RhcnQgPiBtYXhPc0lkKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChzdGFydCwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIHN0YXJ0KSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgc3RhcnQpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOyAgLy8gZG9uJ3QgcHJvbGlmZXJhdGUgd2FybmluZ3MgZm9yIGxhcmdlIGNvdW50CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1VOSU9OKHRlbXBNYXNrLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgc3RhcnQpKTsKKyAgICAgICAgICAgICAgICAgICAgc3RhcnQgKz0gc3RyaWRlOworICAgICAgICAgICAgICAgICAgICAoKnNldFNpemUpKys7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnfScpIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9BU1NFUlQyKDAsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICB9Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3Byb2Nlc3NfcGxhY2UoY29uc3QgY2hhciAqKnNjYW4sIGttcF9hZmZpbl9tYXNrX3QgKm9zSWQyTWFzaywKKyAgaW50IG1heE9zSWQsIGttcF9hZmZpbl9tYXNrX3QgKnRlbXBNYXNrLCBpbnQgKnNldFNpemUpCit7CisgICAgY29uc3QgY2hhciAqbmV4dDsKKworICAgIC8vCisgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICd7JyAnIScgYW5kIG51bQorICAgIC8vCisgICAgU0tJUF9XUygqc2Nhbik7CisgICAgaWYgKCoqc2NhbiA9PSAneycpIHsKKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJ3snCisgICAgICAgIF9fa21wX3Byb2Nlc3Nfc3VicGxhY2VfbGlzdChzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQgLCB0ZW1wTWFzaywKKyAgICAgICAgICBzZXRTaXplKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKipzY2FuID09ICd9JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICAgICAgX19rbXBfcHJvY2Vzc19wbGFjZShzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCBzZXRTaXplKTsKKyAgICAgICAgS01QX0NQVV9DT01QTEVNRU5UKG1heE9zSWQsIHRlbXBNYXNrKTsKKyAgICB9CisgICAgZWxzZSBpZiAoKCoqc2NhbiA+PSAnMCcpICYmICgqKnNjYW4gPD0gJzknKSkgeworICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBpbnQgbnVtID0gX19rbXBfc3RyX3RvX2ludCgqc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKG51bSA+PSAwKTsKKyAgICAgICAgaWYgKChudW0gPiBtYXhPc0lkKSB8fAorICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQobnVtLCBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgbnVtKSkpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSWdub3JlSW52YWxpZFByb2NJRCwgbnVtKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9DUFVfVU5JT04odGVtcE1hc2ssIEtNUF9DUFVfSU5ERVgob3NJZDJNYXNrLCBudW0pKTsKKyAgICAgICAgICAgICgqc2V0U2l6ZSkrKzsKKyAgICAgICAgfQorICAgICAgICAqc2NhbiA9IG5leHQ7ICAvLyBza2lwIG51bQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgIH0KK30KKworCisvL3N0YXRpYyB2b2lkCit2b2lkCitfX2ttcF9hZmZpbml0eV9wcm9jZXNzX3BsYWNlbGlzdChrbXBfYWZmaW5fbWFza190ICoqb3V0X21hc2tzLAorICB1bnNpZ25lZCBpbnQgKm91dF9udW1NYXNrcywgY29uc3QgY2hhciAqcGxhY2VsaXN0LAorICBrbXBfYWZmaW5fbWFza190ICpvc0lkMk1hc2ssIGludCBtYXhPc0lkKQoreworICAgIGludCBpLGosY291bnQsc3RyaWRlLHNpZ247CisgICAgY29uc3QgY2hhciAqc2NhbiA9IHBsYWNlbGlzdDsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gcGxhY2VsaXN0OworCisgICAgbnVtTmV3TWFza3MgPSAyOworICAgIEtNUF9DUFVfSU5URVJOQUxfQUxMT0NfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICBuZXh0TmV3TWFzayA9IDA7CisKKyAgICAvLyB0ZW1wTWFzayBpcyBtb2RpZmllZCBiYXNlZCBvbiB0aGUgcHJldmlvdXMgb3IgaW5pdGlhbAorICAgIC8vICAgcGxhY2UgdG8gZm9ybSB0aGUgY3VycmVudCBwbGFjZQorICAgIC8vIHByZXZpb3VzTWFzayBjb250YWlucyB0aGUgcHJldmlvdXMgcGxhY2UKKyAgICBrbXBfYWZmaW5fbWFza190ICp0ZW1wTWFzazsKKyAgICBrbXBfYWZmaW5fbWFza190ICpwcmV2aW91c01hc2s7CisgICAgS01QX0NQVV9BTExPQyh0ZW1wTWFzayk7CisgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICBLTVBfQ1BVX0FMTE9DKHByZXZpb3VzTWFzayk7CisgICAgS01QX0NQVV9aRVJPKHByZXZpb3VzTWFzayk7CisgICAgaW50IHNldFNpemUgPSAwOworCisgICAgZm9yICg7OykgeworICAgICAgICBfX2ttcF9wcm9jZXNzX3BsYWNlKCZzY2FuLCBvc0lkMk1hc2ssIG1heE9zSWQsIHRlbXBNYXNrLCAmc2V0U2l6ZSk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJyB8fCAqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgIGlmIChzZXRTaXplID4gMCkgeworICAgICAgICAgICAgICAgIEFERF9NQVNLKHRlbXBNYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigqc2NhbiA9PSAnOicsICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBjb3VudCBwYXJhbWV0ZXIKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIGNvdW50ID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCBFT0wKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgaWYgKCpzY2FuID09ICdcMCcgfHwgKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzdHJpZGUgPSArMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCpzY2FuID09ICc6JywgImJhZCBleHBsaWNpdCBwbGFjZXMgbGlzdCIpOworICAgICAgICAgICAgc2NhbisrOyAgICAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBSZWFkIHN0cmlkZSBwYXJhbWV0ZXIKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBzaWduID0gKzE7CisgICAgICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhzY2FuKTsKKyAgICAgICAgICAgICAgICBpZiAoKnNjYW4gPT0gJysnKSB7CisgICAgICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICAgICAgc2lnbiAqPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgc2NhbisrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgS01QX0FTU0VSVDIoKCpzY2FuID49ICcwJykgJiYgKCpzY2FuIDw9ICc5JyksCisgICAgICAgICAgICAgICJiYWQgZXhwbGljaXQgcGxhY2VzIGxpc3QiKTsKKyAgICAgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBzdHJpZGUgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID49IDApOworICAgICAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgICAgICBzdHJpZGUgKj0gc2lnbjsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFkZCBwbGFjZXMgZGV0ZXJtaW5lZCBieSBpbml0aWFsX3BsYWNlIDogY291bnQgOiBzdHJpZGUKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICAgICAgICAgIGlmIChzZXRTaXplID09IDApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIEFkZCB0aGUgY3VycmVudCBwbGFjZSwgdGhlbiBidWlsZCB0aGUgbmV4dCBwbGFjZSAodGVtcE1hc2spIGZyb20gdGhhdAorICAgICAgICAgICAgS01QX0NQVV9DT1BZKHByZXZpb3VzTWFzaywgdGVtcE1hc2spOworICAgICAgICAgICAgQUREX01BU0socHJldmlvdXNNYXNrKTsKKyAgICAgICAgICAgIEtNUF9DUFVfWkVSTyh0ZW1wTWFzayk7CisgICAgICAgICAgICBzZXRTaXplID0gMDsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaiwgcHJldmlvdXNNYXNrKSB7CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChqLCBwcmV2aW91c01hc2spKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoKGorc3RyaWRlID4gbWF4T3NJZCkgfHwgKGorc3RyaWRlIDwgMCkgfHwKKyAgICAgICAgICAgICAgICAgICghIEtNUF9DUFVfSVNTRVQoaiwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB8fAorICAgICAgICAgICAgICAgICAgKCEgS01QX0NQVV9JU1NFVChqK3N0cmlkZSwgS01QX0NQVV9JTkRFWChvc0lkMk1hc2ssIGorc3RyaWRlKSkpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICgoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9ub25lKSkpICYmIGkgPCBjb3VudCAtIDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZklnbm9yZUludmFsaWRQcm9jSUQsIGorc3RyaWRlKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoaitzdHJpZGUsIHRlbXBNYXNrKTsKKyAgICAgICAgICAgICAgICBzZXRTaXplKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0NQVV9aRVJPKHRlbXBNYXNrKTsKKyAgICAgICAgc2V0U2l6ZSA9IDA7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBLTVBfQVNTRVJUMigwLCAiYmFkIGV4cGxpY2l0IHBsYWNlcyBsaXN0Iik7CisgICAgfQorCisgICAgKm91dF9udW1NYXNrcyA9IG5leHROZXdNYXNrOworICAgIGlmIChuZXh0TmV3TWFzayA9PSAwKSB7CisgICAgICAgICpvdXRfbWFza3MgPSBOVUxMOworICAgICAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKCgqb3V0X21hc2tzKSwgbmV4dE5ld01hc2spOworICAgIEtNUF9DUFVfRlJFRSh0ZW1wTWFzayk7CisgICAgS01QX0NQVV9GUkVFKHByZXZpb3VzTWFzayk7CisgICAgZm9yKGkgPSAwOyBpIDwgbmV4dE5ld01hc2s7IGkrKykgeworICAgICAgICBrbXBfYWZmaW5fbWFza190KiBzcmMgID0gS01QX0NQVV9JTkRFWChuZXdNYXNrcywgaSk7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QqIGRlc3QgPSBLTVBfQ1BVX0lOREVYKCgqb3V0X21hc2tzKSwgaSk7CisgICAgICAgIEtNUF9DUFVfQ09QWShkZXN0LCBzcmMpOworICAgIH0KKyAgICBLTVBfQ1BVX0lOVEVSTkFMX0ZSRUVfQVJSQVkobmV3TWFza3MsIG51bU5ld01hc2tzKTsKK30KKworIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisjdW5kZWYgQUREX01BU0sKKyN1bmRlZiBBRERfTUFTS19PU0lECisKK3N0YXRpYyB2b2lkCitfX2ttcF9hcHBseV90aHJlYWRfcGxhY2VzKEFkZHJVbnNQYWlyICoqcEFkZHIsIGludCBkZXB0aCkKK3sKKyAgICBpbnQgaSwgaiwgaywgbl9vbGQgPSAwLCBuX25ldyA9IDAsIHByb2NfbnVtID0gMDsKKyAgICBpZiAoX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPT0gMCAmJgorICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPT0gMCAmJgorICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9PSAwICkKKyAgICAgICAgZ290byBfZXhpdDsgICAvLyBubyB0b3BvbG9neSBsaW1pdGluZyBhY3Rpb25zIHJlcXVlc3RlZCwgZXhpdAorICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9PSAwKQorICAgICAgICBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IG5QYWNrYWdlczsgICAgLy8gdXNlIGFsbCBhdmFpbGFibGUgc29ja2V0cworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fY29yZXMgPT0gMCkKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbkNvcmVzUGVyUGtnOyAgIC8vIHVzZSBhbGwgYXZhaWxhYmxlIGNvcmVzCisgICAgaWYgKF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID09IDAgfHwKKyAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpCisgICAgICAgIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOyAvLyB1c2UgYWxsIEhXIGNvbnRleHRzCisKKyAgICBpZiAoICFfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZIV1N1YnNldE5vblVuaWZvcm0gKTsKKyAgICAgICAgZ290byBfZXhpdDsgLy8gZG9uJ3Qgc3VwcG9ydCBub24tdW5pZm9ybSB0b3BvbG9neQorICAgIH0KKyAgICBpZiAoIGRlcHRoID4gMyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFmZkhXU3Vic2V0Tm9uVGhyZWVMZXZlbCApOworICAgICAgICBnb3RvIF9leGl0OyAvLyBkb24ndCBzdXBwb3J0IG5vdC0zLWxldmVsIHRvcG9sb2d5CisgICAgfQorICAgIGlmIChfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPiBuUGFja2FnZXMpIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRNYW55U29ja2V0cyk7CisgICAgICAgIGdvdG8gX2V4aXQ7CisgICAgfQorICAgIGlmICggX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMgPiBuQ29yZXNQZXJQa2cgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZIV1N1YnNldE1hbnlDb3JlcyApOworICAgICAgICBnb3RvIF9leGl0OworICAgIH0KKworICAgIEFkZHJVbnNQYWlyICpuZXdBZGRyOworICAgIGlmIChwQWRkcikgLy8gcEFkZHIgaXMgTlVMTCBpbiBjYXNlIG9mIGFmZmluaXR5X25vbmUKKyAgICAgICAgbmV3QWRkciA9IChBZGRyVW5zUGFpciAqKV9fa21wX2FsbG9jYXRlKCBzaXplb2YoQWRkclVuc1BhaXIpICoKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzICogX19rbXBfcGxhY2VfbnVtX2NvcmVzICogX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworCisgICAgZm9yIChpID0gMDsgaSA8IG5QYWNrYWdlczsgKytpKSB7CisgICAgICAgIGlmIChpIDwgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCB8fAorICAgICAgICAgICAgaSA+PSBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0ICsgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMpIHsKKyAgICAgICAgICAgIG5fb2xkICs9IG5Db3Jlc1BlclBrZyAqIF9fa21wX25UaHJlYWRzUGVyQ29yZTsgLy8gc2tpcCBub3QtcmVxdWVzdGVkIHNvY2tldAorICAgICAgICAgICAgaWYgKF9fa21wX3B1X29zX2lkeCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG5Db3Jlc1BlclBrZzsgKytqKSB7IC8vIHdhbGsgdGhyb3VnaCBza2lwcGVkIHNvY2tldAorICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgX19rbXBfblRocmVhZHNQZXJDb3JlOyArK2spIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfQ0xSKF9fa21wX3B1X29zX2lkeFtwcm9jX251bV0sIF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrcHJvY19udW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmb3IgKGogPSAwOyBqIDwgbkNvcmVzUGVyUGtnOyArK2opIHsgLy8gd2FsayB0aHJvdWdoIHJlcXVlc3RlZCBzb2NrZXQKKyAgICAgICAgICAgICAgICBpZiAoaiA8IF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0IHx8CisgICAgICAgICAgICAgICAgICAgIGogPj0gX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgKyBfX2ttcF9wbGFjZV9udW1fY29yZXMpIHsKKyAgICAgICAgICAgICAgICAgICAgbl9vbGQgKz0gX19rbXBfblRocmVhZHNQZXJDb3JlOyAvLyBza2lwIG5vdC1yZXF1ZXN0ZWQgY29yZQorICAgICAgICAgICAgICAgICAgICBpZiAoX19rbXBfcHVfb3NfaWR4ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBfX2ttcF9uVGhyZWFkc1BlckNvcmU7ICsraykgeyAvLyB3YWxrIHRocm91Z2ggc2tpcHBlZCBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoX19rbXBfcHVfb3NfaWR4W3Byb2NfbnVtXSwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICsrcHJvY19udW07CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgX19rbXBfblRocmVhZHNQZXJDb3JlOyArK2spIHsgLy8gd2FsayB0aHJvdWdoIHJlcXVlc3RlZCBjb3JlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoayA8IF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKHBBZGRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdBZGRyW25fbmV3XSA9ICgqcEFkZHIpW25fb2xkXTsgLy8gY29sbGVjdCByZXF1ZXN0ZWQgdGhyZWFkJ3MgZGF0YQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5fbmV3Kys7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2ttcF9wdV9vc19pZHggIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9DTFIoX19rbXBfcHVfb3NfaWR4W3Byb2NfbnVtXSwgX19rbXBfYWZmaW5fZnVsbE1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgbl9vbGQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICsrcHJvY19udW07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVChuX29sZCA9PSBuUGFja2FnZXMgKiBuQ29yZXNQZXJQa2cgKiBfX2ttcF9uVGhyZWFkc1BlckNvcmUpOworICAgIEtNUF9ERUJVR19BU1NFUlQobl9uZXcgPT0gX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgKiBfX2ttcF9wbGFjZV9udW1fY29yZXMgKgorICAgICAgICAgICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUpOworCisgICAgblBhY2thZ2VzID0gX19rbXBfcGxhY2VfbnVtX3NvY2tldHM7ICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgblBhY2thZ2VzCisgICAgbkNvcmVzUGVyUGtnID0gX19rbXBfcGxhY2VfbnVtX2NvcmVzOyAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgbkNvcmVzUGVyUGtnCisgICAgX19rbXBfblRocmVhZHNQZXJDb3JlID0gX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmU7IC8vIGNvcnJlY3QgX19rbXBfblRocmVhZHNQZXJDb3JlCisgICAgX19rbXBfYXZhaWxfcHJvYyA9IG5fbmV3OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNvcnJlY3QgYXZhaWxfcHJvYworICAgIF9fa21wX25jb3JlcyA9IG5QYWNrYWdlcyAqIF9fa21wX3BsYWNlX251bV9jb3JlczsgICAgICAgICAvLyBjb3JyZWN0IG5jb3JlcworCisgICAgaWYgKHBBZGRyKSB7CisgICAgICAgIF9fa21wX2ZyZWUoICpwQWRkciApOworICAgICAgICAqcEFkZHIgPSBuZXdBZGRyOyAgICAgIC8vIHJlcGxhY2Ugb2xkIHRvcG9sb2d5IHdpdGggbmV3IG9uZQorICAgIH0KK19leGl0OgorICAgIGlmIChfX2ttcF9wdV9vc19pZHggIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKF9fa21wX3B1X29zX2lkeCk7CisgICAgICAgIF9fa21wX3B1X29zX2lkeCA9IE5VTEw7CisgICAgfQorfQorCisKK3N0YXRpYyBBZGRyVW5zUGFpciAqYWRkcmVzczJvcyA9IE5VTEw7CitzdGF0aWMgaW50ICAgICAgICAgICAqIHByb2NhcnIgPSBOVUxMOworc3RhdGljIGludCAgICAgX19rbXBfYWZmX2RlcHRoID0gMDsKKworI2RlZmluZSBLTVBfRVhJVF9BRkZfTk9ORSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lKTsgXAorICAgIEtNUF9BU1NFUlQoYWRkcmVzczJvcyA9PSBOVUxMKTsgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoTlVMTCwgMCk7ICAgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9hZmZpbml0eV9pbml0aWFsaXplKHZvaWQpCit7CisgICAgaWYgKF9fa21wX2FmZmluaXR5X21hc2tzICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSAiZnVsbCIgbWFzayAtIHRoaXMgZGVmaW5lcyBhbGwgb2YgdGhlIHByb2Nlc3NvcnMgdGhhdCB3ZQorICAgIC8vIGNvbnNpZGVyIHRvIGJlIGluIHRoZSBtYWNoaW5lIG1vZGVsLiAgSWYgcmVzcGVjdCBpcyBzZXQsIHRoZW4gaXQgaXMKKyAgICAvLyB0aGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MgYWZmaW5pdHkgbWFzay4gIE90aGVyd2lzZSwgaXQgaXMgYWxsCisgICAgLy8gcHJvY2Vzc29ycyB0aGF0IHdlIGtub3cgYWJvdXQgb24gdGhlIG1hY2hpbmUuCisgICAgLy8KKyAgICBpZiAoX19rbXBfYWZmaW5fZnVsbE1hc2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0FMTE9DKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICB9CisgICAgaWYgKEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzaykgeworICAgICAgICAgICAgX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eShfX2ttcF9hZmZpbl9mdWxsTWFzaywgVFJVRSk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIGF2YWlsYWJsZSBwcm9jZXNzb3JzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIHVuc2lnbmVkIGk7CisgICAgICAgICAgICBfX2ttcF9hdmFpbF9wcm9jID0gMDsKKyAgICAgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spIHsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYysrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKF9fa21wX2F2YWlsX3Byb2MgPiBfX2ttcF94cHJvYykgeworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9lbnRpcmVfbWFjaGluZV9tYXNrKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICAgICAgfQorICAgIH0KKworICAgIGludCBkZXB0aCA9IC0xOworICAgIGttcF9pMThuX2lkX3QgbXNnX2lkID0ga21wX2kxOG5fbnVsbDsKKworICAgIC8vCisgICAgLy8gRm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHksIHNldHRpbmcgS01QX0NQVUlORk9fRklMRSA9PgorICAgIC8vIEtNUF9UT1BPTE9HWV9NRVRIT0Q9Y3B1aW5mbworICAgIC8vCisgICAgaWYgKChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgJiYKKyAgICAgIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9jcHVpbmZvOworICAgIH0KKworICAgIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfYWxsKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEluIHRoZSBkZWZhdWx0IGNvZGUgcGF0aCwgZXJyb3JzIGFyZSBub3QgZmF0YWwgLSB3ZSBqdXN0IHRyeSB1c2luZworICAgICAgICAvLyBhbm90aGVyIG1ldGhvZC4gIFdlIG9ubHkgZW1pdCBhIHdhcm5pbmcgbWVzc2FnZSBpZiBhZmZpbml0eSBpcyBvbiwKKyAgICAgICAgLy8gb3IgdGhlIHZlcmJvc2UgZmxhZyBpcyBzZXQsIGFuIHRoZSBub3dhcm5pbmdzIGZsYWcgd2FzIG5vdCBzZXQuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKmZpbGVfbmFtZSA9IE5VTEw7CisgICAgICAgIGludCBsaW5lID0gMDsKKyMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYoIV9fa21wX2h3bG9jX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfaHdsb2NfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgICAgICBpZiAoZGVwdGggPT0gMCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgaWYoZGVwdGggPCAwICYmIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShBZmZJZ25vcmluZ0h3bG9jLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIGlmKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZklnbm9yaW5nSHdsb2MsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorIyBlbmRpZgorCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0ciwgIktNUF9BRkZJTklUWSIsIEtNUF9JMThOX1NUUihEZWNvZGluZ3gyQVBJQykpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfeDJhcGljaWRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgICAgICBpZiAobXNnX2lkICE9IGttcF9pMThuX251bGwpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmSW5mb1N0clN0ciwgIktNUF9BRkZJTklUWSIsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpLAorICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLCBLTVBfSTE4Tl9TVFIoRGVjb2RpbmdMZWdhY3lBUElDKSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSBOVUxMOworICAgICAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2FwaWNpZF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9FWElUX0FGRl9OT05FOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworIyBpZiBLTVBfT1NfTElOVVgKKworICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgICAgIGlmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkgeworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlN0clBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSwgIi9wcm9jL2NwdWluZm8iKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmUGFyc2VGaWxlbmFtZSwgIktNUF9BRkZJTklUWSIsICIvcHJvYy9jcHVpbmZvIik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBGSUxFICpmID0gZm9wZW4oIi9wcm9jL2NwdWluZm8iLCAiciIpOworICAgICAgICAgICAgaWYgKGYgPT0gTlVMTCkgeworICAgICAgICAgICAgICAgIG1zZ19pZCA9IGttcF9pMThuX3N0cl9DYW50T3BlbkNwdWluZm87CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAiL3Byb2MvY3B1aW5mbyI7CisgICAgICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfY3B1aW5mb19tYXAoJmFkZHJlc3Myb3MsICZsaW5lLCAmbXNnX2lkLCBmKTsKKyAgICAgICAgICAgICAgICBmY2xvc2UoZik7CisgICAgICAgICAgICAgICAgaWYgKGRlcHRoID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyMgZW5kaWYgLyogS01QX09TX0xJTlVYICovCisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICAgICAgaWYgKChkZXB0aCA8IDApICYmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZldpbmRvd3NQcm9jR3JvdXBNYXAsICJLTVBfQUZGSU5JVFkiKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfcHJvY19ncm91cF9tYXAoJmFkZHJlc3Myb3MsICZtc2dfaWQpOworICAgICAgICAgICAgS01QX0FTU0VSVChkZXB0aCAhPSAwKTsKKyAgICAgICAgfQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlICYmIChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCkpIHsKKyAgICAgICAgICAgICAgICBpZiAoZmlsZV9uYW1lID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVc2luZ0ZsYXRPUywgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIGlmIChsaW5lID09IDApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVc2luZ0ZsYXRPU0ZpbGUsIGZpbGVfbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STShVc2luZ0ZsYXRPU0ZpbGVMaW5lLCBmaWxlX25hbWUsIGxpbmUsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBGSVhNRSAtIHByaW50IG1zZyBpZiBtc2dfaWQgPSBrbXBfaTE4bl9udWxsID8/PworCisgICAgICAgICAgICBmaWxlX25hbWUgPSAiIjsKKyAgICAgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2ZsYXRfbWFwKCZhZGRyZXNzMm9zLCAmbXNnX2lkKTsKKyAgICAgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICAgICAgS01QX0VYSVRfQUZGX05PTkU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfQVNTRVJUKGRlcHRoID4gMCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIElmIHRoZSB1c2VyIGhhcyBzcGVjaWZpZWQgdGhhdCBhIHBhcmljdWxhciB0b3BvbG9neSBkaXNjb3ZlcnkgbWV0aG9kCisgICAgLy8gaXMgdG8gYmUgdXNlZCwgdGhlbiB3ZSBhYm9ydCBpZiB0aGF0IG1ldGhvZCBmYWlscy4gIFRoZSBleGNlcHRpb24gaXMKKyAgICAvLyBncm91cCBhZmZpbml0eSwgd2hpY2ggbWlnaHQgaGF2ZSBiZWVuIGltcGxpY2l0bHkgc2V0LgorICAgIC8vCisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX3gyYXBpY2lkKSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZkluZm9TdHIsICJLTVBfQUZGSU5JVFkiLAorICAgICAgICAgICAgICBLTVBfSTE4Tl9TVFIoRGVjb2Rpbmd4MkFQSUMpKTsKKyAgICAgICAgfQorCisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX3gyYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2FwaWNpZCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZJbmZvU3RyLCAiS01QX0FGRklOSVRZIiwKKyAgICAgICAgICAgICAgS01QX0kxOE5fU1RSKERlY29kaW5nTGVnYWN5QVBJQykpOworICAgICAgICB9CisKKyAgICAgICAgZGVwdGggPSBfX2ttcF9hZmZpbml0eV9jcmVhdGVfYXBpY2lkX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgfQorICAgICAgICBpZiAoZGVwdGggPCAwKSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUKG1zZ19pZCAhPSBrbXBfaTE4bl9udWxsKTsKKyAgICAgICAgICAgIEtNUF9GQVRBTChNc2dFeGl0aW5nLCBfX2ttcF9pMThuX2NhdGdldHMobXNnX2lkKSk7CisgICAgICAgIH0KKyAgICB9CisKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisgICAgZWxzZSBpZiAoX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2NwdWluZm8pIHsKKyAgICAgICAgY29uc3QgY2hhciAqZmlsZW5hbWU7CisgICAgICAgIGlmIChfX2ttcF9jcHVpbmZvX2ZpbGUgIT0gTlVMTCkgeworICAgICAgICAgICAgZmlsZW5hbWUgPSBfX2ttcF9jcHVpbmZvX2ZpbGU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBmaWxlbmFtZSA9ICIvcHJvYy9jcHVpbmZvIjsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlBhcnNlRmlsZW5hbWUsICJLTVBfQUZGSU5JVFkiLCBmaWxlbmFtZSk7CisgICAgICAgIH0KKworICAgICAgICBGSUxFICpmID0gZm9wZW4oZmlsZW5hbWUsICJyIik7CisgICAgICAgIGlmIChmID09IE5VTEwpIHsKKyAgICAgICAgICAgIGludCBjb2RlID0gZXJybm87CisgICAgICAgICAgICBpZiAoX19rbXBfY3B1aW5mb19maWxlICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoTmFtZUNvbWVzRnJvbV9DUFVJTkZPX0ZJTEUpLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhDYW50T3BlbkZpbGVGb3JSZWFkaW5nLCBmaWxlbmFtZSksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoY29kZSksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpbnQgbGluZSA9IDA7CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2NwdWluZm9fbWFwKCZhZGRyZXNzMm9zLCAmbGluZSwgJm1zZ19pZCwgZik7CisgICAgICAgIGZjbG9zZShmKTsKKyAgICAgICAgaWYgKGRlcHRoIDwgMCkgeworICAgICAgICAgICAgS01QX0FTU0VSVChtc2dfaWQgIT0ga21wX2kxOG5fbnVsbCk7CisgICAgICAgICAgICBpZiAobGluZSA+IDApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoRmlsZUxpbmVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgbGluZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEZpbGVNc2dFeGl0aW5nLCBmaWxlbmFtZSwgX19rbXBfaTE4bl9jYXRnZXRzKG1zZ19pZCkpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUpIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggPT0gMCk7CisgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCkgeworICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgS01QX0lORk9STShBZmZXaW5kb3dzUHJvY0dyb3VwTWFwLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9wcm9jX2dyb3VwX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIEtNUF9BU1NFUlQoZGVwdGggIT0gMCk7CisgICAgICAgIGlmIChkZXB0aCA8IDApIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQobXNnX2lkICE9IGttcF9pMThuX251bGwpOworICAgICAgICAgICAgS01QX0ZBVEFMKE1zZ0V4aXRpbmcsIF9fa21wX2kxOG5fY2F0Z2V0cyhtc2dfaWQpKTsKKyAgICAgICAgfQorICAgIH0KKworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKworICAgIGVsc2UgaWYgKF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0KSB7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEFmZlVzaW5nRmxhdE9TLCAiS01QX0FGRklOSVRZIik7CisgICAgICAgIH0KKworICAgICAgICBkZXB0aCA9IF9fa21wX2FmZmluaXR5X2NyZWF0ZV9mbGF0X21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgfQorICAgICAgICAvLyBzaG91bGQgbm90IGZhaWwKKyAgICAgICAgS01QX0FTU0VSVChkZXB0aCA+IDApOworICAgICAgICBLTVBfQVNTRVJUKGFkZHJlc3Myb3MgIT0gTlVMTCk7CisgICAgfQorCisjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICBlbHNlIGlmIChfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID09IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2MpIHsKKyAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oQWZmVXNpbmdId2xvYywgIktNUF9BRkZJTklUWSIpOworICAgICAgICB9CisgICAgICAgIGRlcHRoID0gX19rbXBfYWZmaW5pdHlfY3JlYXRlX2h3bG9jX21hcCgmYWRkcmVzczJvcywgJm1zZ19pZCk7CisgICAgICAgIGlmIChkZXB0aCA9PSAwKSB7CisgICAgICAgICAgICBLTVBfRVhJVF9BRkZfTk9ORTsKKyAgICAgICAgfQorICAgIH0KKyMgZW5kaWYgLy8gS01QX1VTRV9IV0xPQworCisgICAgaWYgKGFkZHJlc3Myb3MgPT0gTlVMTCkgeworICAgICAgICBpZiAoS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEVycm9ySW5pdGlhbGl6ZUFmZmluaXR5KTsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX2FwcGx5X3RocmVhZF9wbGFjZXMoJmFkZHJlc3Myb3MsIGRlcHRoKTsKKworICAgIC8vCisgICAgLy8gQ3JlYXRlIHRoZSB0YWJsZSBvZiBtYXNrcywgaW5kZXhlZCBieSB0aHJlYWQgSWQuCisgICAgLy8KKyAgICB1bnNpZ25lZCBtYXhJbmRleDsKKyAgICB1bnNpZ25lZCBudW1VbmlxdWU7CisgICAga21wX2FmZmluX21hc2tfdCAqb3NJZDJNYXNrID0gX19rbXBfY3JlYXRlX21hc2tzKCZtYXhJbmRleCwgJm51bVVuaXF1ZSwKKyAgICAgIGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworICAgIGlmIChfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA9PSAwKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKGludCludW1VbmlxdWUgPT0gX19rbXBfYXZhaWxfcHJvYyk7CisgICAgfQorCisgICAgLy8KKyAgICAvLyBTZXQgdGhlIGNoaWxkTnVtcyB2ZWN0b3IgaW4gYWxsIEFkZHJlc3Mgb2JqZWN0cy4gIFRoaXMgbXVzdCBiZSBkb25lCisgICAgLy8gYmVmb3JlIHdlIGNhbiBzb3J0IHVzaW5nIF9fa21wX2FmZmluaXR5X2NtcF9BZGRyZXNzX2NoaWxkX251bSgpLAorICAgIC8vIHdoaWNoIHRha2VzIGludG8gYWNjb3VudCB0aGUgc2V0dGluZyBvZiBfX2ttcF9hZmZpbml0eV9jb21wYWN0LgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfYXNzaWduX2NoaWxkX251bXMoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYyk7CisKKyAgICBzd2l0Y2ggKF9fa21wX2FmZmluaXR5X3R5cGUpIHsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9pbnRlbCkKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2Vzc19wcm9jbGlzdCgmX19rbXBfYWZmaW5pdHlfbWFza3MsCisgICAgICAgICAgICAgICZfX2ttcF9hZmZpbml0eV9udW1fbWFza3MsIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCBvc0lkMk1hc2ssCisgICAgICAgICAgICAgIG1heEluZGV4KTsKKyAgICAgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2Nlc3NfcGxhY2VsaXN0KCZfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgICAgICAgICAgJl9fa21wX2FmZmluaXR5X251bV9tYXNrcywgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsIG9zSWQyTWFzaywKKyAgICAgICAgICAgICAgbWF4SW5kZXgpOworICAgICAgICB9CisjIGVuZGlmCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgKF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpKSkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZk5vVmFsaWRQcm9jSUQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIG90aGVyIGFmZmluaXR5IHR5cGVzIHJlbHkgb24gc29ydGluZyB0aGUgQWRkcmVzc2VzIGFjY29yZGluZworICAgICAgICAvLyB0byBzb21lIHBlcm11dGF0aW9uIG9mIHRoZSBtYWNoaW5lIHRvcG9sb2d5IHRyZWUuICBTZXQKKyAgICAgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCBhbmQgX19rbXBfYWZmaW5pdHlfb2Zmc2V0IGFwcHJvcHJpYXRlbHksCisgICAgICAgIC8vIHRoZW4ganVtcCB0byBhIGNvbW1vbiBjb2RlIGZyYWdtZW50IHRvIGRvIHRoZSBzb3J0IGFuZCBjcmVhdGUKKyAgICAgICAgLy8gdGhlIGFycmF5IG9mIGFmZmluaXR5IG1hc2tzLgorICAgICAgICAvLworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9vZmZzZXQpIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCA9IF9fa21wX25UaHJlYWRzUGVyQ29yZSAqIF9fa21wX2FmZmluaXR5X29mZnNldAorICAgICAgICAgICAgICAlIF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIH0KKyAgICAgICAgZ290byBzb3J0QWRkcmVzc2VzOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6CisgICAgICAgIGlmIChfX2ttcF9uVGhyZWFkc1BlckNvcmUgPiAxKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfb2Zmc2V0KSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgPSBfX2ttcF9uVGhyZWFkc1BlckNvcmUgKiBfX2ttcF9hZmZpbml0eV9vZmZzZXQKKyAgICAgICAgICAgICAgJSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gMDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgPSBkZXB0aCAtIDEgLSBfX2ttcF9hZmZpbml0eV9jb21wYWN0OworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6CisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9jb21wYWN0ID49IGRlcHRoKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0ID0gZGVwdGggLSAxOworICAgICAgICB9CisgICAgICAgIGdvdG8gc29ydEFkZHJlc3NlczsKKworICAgICAgICBjYXNlIGFmZmluaXR5X2JhbGFuY2VkOgorICAgICAgICAvLyBCYWxhbmNlZCB3b3JrcyBvbmx5IGZvciB0aGUgY2FzZSBvZiBhIHNpbmdsZSBwYWNrYWdlCisgICAgICAgIGlmKCBuUGFja2FnZXMgPiAxICkgeworICAgICAgICAgICAgaWYoIF9fa21wX2FmZmluaXR5X3ZlcmJvc2UgfHwgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkJhbGFuY2VkTm90QXZhaWwsICJLTVBfQUZGSU5JVFkiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV91bmlmb3JtX3RvcG9sb2d5KCkgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfSBlbHNlIHsgLy8gTm9uLXVuaWZvcm0gdG9wb2xvZ3kKKworICAgICAgICAgICAgLy8gU2F2ZSB0aGUgZGVwdGggZm9yIGZ1cnRoZXIgdXNhZ2UKKyAgICAgICAgICAgIF9fa21wX2FmZl9kZXB0aCA9IGRlcHRoOworCisgICAgICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworCisgICAgICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgICAgIGlmKCBudGhfcGVyX2NvcmUgPiAxICkgeworICAgICAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBkZXB0aCAtIDI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBkZXB0aCAtIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgbmNvcmVzID0gYWRkcmVzczJvc1sgX19rbXBfYXZhaWxfcHJvYyAtIDEgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXSArIDE7CisgICAgICAgICAgICBpbnQgbnByb2MgPSBudGhfcGVyX2NvcmUgKiBuY29yZXM7CisKKyAgICAgICAgICAgIHByb2NhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgcHJvY2FyclsgaSBdID0gLTE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBwcm9jID0gYWRkcmVzczJvc1sgaSBdLnNlY29uZDsKKyAgICAgICAgICAgICAgICAvLyBJZiBkZXB0aCA9PSAzIHRoZW4gbGV2ZWw9MCAtIHBhY2thZ2UsIGxldmVsPTEgLSBjb3JlLCBsZXZlbD0yIC0gdGhyZWFkLgorICAgICAgICAgICAgICAgIC8vIElmIHRoZXJlIGlzIG9ubHkgb25lIHRocmVhZCBwZXIgY29yZSB0aGVuIGRlcHRoID09IDI6IGxldmVsIDAgLSBwYWNrYWdlLAorICAgICAgICAgICAgICAgIC8vIGxldmVsIDEgLSBjb3JlLgorICAgICAgICAgICAgICAgIGludCBsZXZlbCA9IGRlcHRoIC0gMTsKKworICAgICAgICAgICAgICAgIC8vIF9fa21wX250aF9wZXJfY29yZSA9PSAxCisgICAgICAgICAgICAgICAgaW50IHRocmVhZCA9IDA7CisgICAgICAgICAgICAgICAgaW50IGNvcmUgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCBdOworICAgICAgICAgICAgICAgIC8vIElmIHRoZSB0aHJlYWQgbGV2ZWwgZXhpc3RzLCB0aGF0IGlzIHdlIGhhdmUgbW9yZSB0aGFuIG9uZSB0aHJlYWQgY29udGV4dCBwZXIgY29yZQorICAgICAgICAgICAgICAgIGlmKCBudGhfcGVyX2NvcmUgPiAxICkgeworICAgICAgICAgICAgICAgICAgICB0aHJlYWQgPSBhZGRyZXNzMm9zWyBpIF0uZmlyc3QubGFiZWxzWyBsZXZlbCBdICUgbnRoX3Blcl9jb3JlOworICAgICAgICAgICAgICAgICAgICBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgbGV2ZWwgLSAxIF07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHByb2NhcnJbIGNvcmUgKiBudGhfcGVyX2NvcmUgKyB0aHJlYWQgXSA9IHByb2M7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgc29ydEFkZHJlc3NlczoKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxsb2NhdGUgdGhlIGd0aWQtPmFmZmluaXR5IG1hc2sgdGFibGUuCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV9kdXBzKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSBfX2ttcF9hdmFpbF9wcm9jOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzID0gbnVtVW5pcXVlOworICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSAhPSBwcm9jX2JpbmRfaW50ZWwgKQorICAgICAgICAgICYmICggX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA+IDAgKQorICAgICAgICAgICYmICggKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgKSApIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyA9IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisgICAgICAgIH0KKyMgZW5kaWYKKworICAgICAgICBLTVBfQ1BVX0FMTE9DX0FSUkFZKF9fa21wX2FmZmluaXR5X21hc2tzLCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFNvcnQgdGhlIGFkZHJlc3Myb3MgdGFibGUgYWNjb3JkaW5nIHRvIHRoZSBjdXJyZW50IHNldHRpbmcgb2YKKyAgICAgICAgLy8gX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgdGhlbiBmaWxsIG91dCBfX2ttcF9hZmZpbml0eV9tYXNrcy4KKyAgICAgICAgLy8KKyAgICAgICAgcXNvcnQoYWRkcmVzczJvcywgX19rbXBfYXZhaWxfcHJvYywgc2l6ZW9mKCphZGRyZXNzMm9zKSwKKyAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jbXBfQWRkcmVzc19jaGlsZF9udW0pOworICAgICAgICB7CisgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgIHVuc2lnbmVkIGo7CisgICAgICAgICAgICBmb3IgKGkgPSAwLCBqID0gMDsgaSA8IF9fa21wX2F2YWlsX3Byb2M7IGkrKykgeworICAgICAgICAgICAgICAgIGlmICgoISBfX2ttcF9hZmZpbml0eV9kdXBzKSAmJiAoISBhZGRyZXNzMm9zW2ldLmZpcnN0LmxlYWRlcikpIHsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHVuc2lnbmVkIG9zSWQgPSBhZGRyZXNzMm9zW2ldLnNlY29uZDsKKyAgICAgICAgICAgICAgICBrbXBfYWZmaW5fbWFza190ICpzcmMgPSBLTVBfQ1BVX0lOREVYKG9zSWQyTWFzaywgb3NJZCk7CisgICAgICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqZGVzdAorICAgICAgICAgICAgICAgICAgPSBLTVBfQ1BVX0lOREVYKF9fa21wX2FmZmluaXR5X21hc2tzLCBqKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKEtNUF9DUFVfSVNTRVQob3NJZCwgc3JjKSk7CisgICAgICAgICAgICAgICAgS01QX0NQVV9DT1BZKGRlc3QsIHNyYyk7CisgICAgICAgICAgICAgICAgaWYgKCsraiA+PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpIHsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChqID09IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0FTU0VSVDIoMCwgIlVuZXhwZWN0ZWQgYWZmaW5pdHkgc2V0dGluZyIpOworICAgIH0KKworICAgIF9fa21wX2ZyZWUob3NJZDJNYXNrKTsKKyAgICBtYWNoaW5lX2hpZXJhcmNoeS5pbml0KGFkZHJlc3Myb3MsIF9fa21wX2F2YWlsX3Byb2MpOworfQorI3VuZGVmIEtNUF9FWElUX0FGRl9OT05FCisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfaW5pdGlhbGl6ZSh2b2lkKQoreworICAgIC8vCisgICAgLy8gTXVjaCBvZiB0aGUgY29kZSBhYm92ZSB3YXMgd3JpdHRlbiBhc3N1bW1pbmcgdGhhdCBpZiBhIG1hY2hpbmUgd2FzIG5vdAorICAgIC8vIGFmZmluaXR5IGNhcGFibGUsIHRoZW4gX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lLiAgV2Ugbm93CisgICAgLy8gZXhwbGljaXRseSByZXByZXNlbnQgdGhpcyBhcyBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgLy8gVGhlcmUgYXJlIHRvbyBtYW55IGNoZWNrcyBmb3IgX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9ub25lCisgICAgLy8gaW4gdGhpcyBjb2RlLiAgSW5zdGVhZCBvZiB0cnlpbmcgdG8gY2hhbmdlIHRoZW0gYWxsLCBjaGVjayBpZgorICAgIC8vIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQsIGFuZCBpZiBzbywgc2xhbSBpdCB3aXRoCisgICAgLy8gYWZmaW5pdHlfbm9uZSwgY2FsbCB0aGUgcmVhbCBpbml0aWFsaXphdGlvbiByb3V0aW5lLCB0aGVuIHJlc3RvcmUKKyAgICAvLyBfX2ttcF9hZmZpbml0eV90eXBlIHRvIGFmZmluaXR5X2Rpc2FibGVkLgorICAgIC8vCisgICAgaW50IGRpc2FibGVkID0gKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGlzYWJsZWQpOworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgS01QX0FTU0VSVChkaXNhYmxlZCk7CisgICAgfQorICAgIGlmIChkaXNhYmxlZCkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICB9CisgICAgX19rbXBfYXV4X2FmZmluaXR5X2luaXRpYWxpemUoKTsKKyAgICBpZiAoZGlzYWJsZWQpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2Rpc2FibGVkOworICAgIH0KK30KKworCit2b2lkCitfX2ttcF9hZmZpbml0eV91bmluaXRpYWxpemUodm9pZCkKK3sKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfbWFza3MgIT0gTlVMTCkgeworICAgICAgICBLTVBfQ1BVX0ZSRUVfQVJSQVkoX19rbXBfYWZmaW5pdHlfbWFza3MsIF9fa21wX2FmZmluaXR5X251bV9tYXNrcyk7CisgICAgICAgIF9fa21wX2FmZmluaXR5X21hc2tzID0gTlVMTDsKKyAgICB9CisgICAgaWYgKF9fa21wX2FmZmluX2Z1bGxNYXNrICE9IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9GUkVFKF9fa21wX2FmZmluX2Z1bGxNYXNrKTsKKyAgICAgICAgX19rbXBfYWZmaW5fZnVsbE1hc2sgPSBOVUxMOworICAgIH0KKyAgICBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPSAwOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworIyBlbmRpZgorICAgIGlmIChfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2ZyZWUoX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QpOworICAgICAgICBfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCA9IE5VTEw7CisgICAgfQorICAgIGlmKCBhZGRyZXNzMm9zICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIGFkZHJlc3Myb3MgKTsKKyAgICAgICAgYWRkcmVzczJvcyA9IE5VTEw7CisgICAgfQorICAgIGlmKCBwcm9jYXJyICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHByb2NhcnIgKTsKKyAgICAgICAgcHJvY2FyciA9IE5VTEw7CisgICAgfQorIyBpZiBLTVBfVVNFX0hXTE9DCisgICAgaWYgKF9fa21wX2h3bG9jX3RvcG9sb2d5ICE9IE5VTEwpIHsKKyAgICAgICAgaHdsb2NfdG9wb2xvZ3lfZGVzdHJveShfX2ttcF9od2xvY190b3BvbG9neSk7CisgICAgICAgIF9fa21wX2h3bG9jX3RvcG9sb2d5ID0gTlVMTDsKKyAgICB9CisjIGVuZGlmCit9CisKKwordm9pZAorX19rbXBfYWZmaW5pdHlfc2V0X2luaXRfbWFzayhpbnQgZ3RpZCwgaW50IGlzYV9yb290KQoreworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSk7CisgICAgaWYgKHRoLT50aC50aF9hZmZpbl9tYXNrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0NQVV9BTExPQyh0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfQ1BVX1pFUk8odGgtPnRoLnRoX2FmZmluX21hc2spOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29weSB0aGUgdGhyZWFkIG1hc2sgdG8gdGhlIGttcF9pbmZvX3Qgc3RydWN1dHVyZS4KKyAgICAvLyBJZiBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X25vbmUsIGNvcHkgdGhlICJmdWxsIiBtYXNrLCBpLmUuIG9uZQorICAgIC8vIHRoYXQgaGFzIGFsbCBvZiB0aGUgT1MgcHJvYyBpZHMgc2V0LCBvciBpZiBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sKKyAgICAvLyBpcyBzZXQsIHRoZW4gdGhlIGZ1bGwgbWFzayBpcyB0aGUgc2FtZSBhcyB0aGUgbWFzayBvZiB0aGUgaW5pdGlhbGl6YXRpb24KKyAgICAvLyB0aHJlYWQuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgIGludCBpOworCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfaW50ZWwpCisjIGVuZGlmCisgICAgeworICAgICAgICBpZiAoKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSkgfHwgKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfYmFsYW5jZWQpCisgICAgICAgICAgKSB7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisjIGVuZGlmCisgICAgICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2FmZmluX2Z1bGxNYXNrICE9IE5VTEwpOworICAgICAgICAgICAgaSA9IEtNUF9QTEFDRV9BTEw7CisgICAgICAgICAgICBtYXNrID0gX19rbXBfYWZmaW5fZnVsbE1hc2s7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICk7CisgICAgICAgICAgICBpID0gKGd0aWQgKyBfX2ttcF9hZmZpbml0eV9vZmZzZXQpICUgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICAgICAgbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGkpOworICAgICAgICB9CisgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIGVsc2UgeworICAgICAgICBpZiAoKCEgaXNhX3Jvb3QpCisgICAgICAgICAgfHwgKF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZmFsc2UpKSB7CisjICBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgICAgIGlmIChfX2ttcF9udW1fcHJvY19ncm91cHMgPiAxKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorIyAgZW5kaWYKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYWZmaW5fZnVsbE1hc2sgIT0gTlVMTCk7CisgICAgICAgICAgICBpID0gS01QX1BMQUNFX0FMTDsKKyAgICAgICAgICAgIG1hc2sgPSBfX2ttcF9hZmZpbl9mdWxsTWFzazsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBpbnQgaSA9IHNvbWUgaGFzaCBmdW5jdGlvbiBvciBqdXN0IGEgY291bnRlciB0aGF0IGRvZXNuJ3QKKyAgICAgICAgICAgIC8vIGFsd2F5cyBzdGFydCBhdCAwLiAgVXNlIGd0aWQgZm9yIG5vdy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICk7CisgICAgICAgICAgICBpID0gKGd0aWQgKyBfX2ttcF9hZmZpbml0eV9vZmZzZXQpICUgX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICAgICAgbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIGkpOworICAgICAgICB9CisgICAgfQorIyBlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBpOworICAgIGlmIChpc2Ffcm9vdCkgeworICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gaTsKKyAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gMDsKKyAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworICAgIH0KKworICAgIGlmIChpID09IEtNUF9QTEFDRV9BTEwpIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBhbGwgcGxhY2VzXG4iLAorICAgICAgICAgIGd0aWQpKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWRcbiIsCisgICAgICAgICAgZ3RpZCwgaSkpOworICAgIH0KKyMgZWxzZQorICAgIGlmIChpID09IC0xKSB7CisgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrOiBiaW5kaW5nIFQjJWQgdG8gX19rbXBfYWZmaW5fZnVsbE1hc2tcbiIsCisgICAgICAgICAgZ3RpZCkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2s6IGJpbmRpbmcgVCMlZCB0byBtYXNrICVkXG4iLAorICAgICAgICAgIGd0aWQsIGkpKTsKKyAgICB9CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIG1hc2spOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIktNUF9BRkZJTklUWSIsIChrbXBfaW50MzIpZ2V0cGlkKCksIGd0aWQsCisgICAgICAgICAgYnVmKTsKKyAgICB9CisKKyMgaWYgS01QX09TX1dJTkRPV1MKKyAgICAvLworICAgIC8vIE9uIFdpbmRvd3MqIE9TLCB0aGUgcHJvY2VzcyBhZmZpbml0eSBtYXNrIG1pZ2h0IGhhdmUgY2hhbmdlZC4KKyAgICAvLyBJZiB0aGUgdXNlciBkaWRuJ3QgcmVxdWVzdCBhZmZpbml0eSBhbmQgdGhpcyBjYWxsIGZhaWxzLAorICAgIC8vIGp1c3QgY29udGludWUgc2lsZW50bHkuICBTZWUgQ1ExNzEzOTMuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZSApIHsKKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgRkFMU0UpOworICAgIH0KKyAgICBlbHNlCisjIGVuZGlmCisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSh0aC0+dGgudGhfYWZmaW5fbWFzaywgVFJVRSk7Cit9CisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCit2b2lkCitfX2ttcF9hZmZpbml0eV9zZXRfcGxhY2UoaW50IGd0aWQpCit7CisgICAgaW50IHJldHZhbDsKKworICAgIGlmICghIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9pbmZvX3QgKnRoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tndGlkXSk7CisKKyAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfYWZmaW5pdHlfc2V0X3BsYWNlOiBiaW5kaW5nIFQjJWQgdG8gcGxhY2UgJWQgKGN1cnJlbnQgcGxhY2UgPSAlZClcbiIsCisgICAgICBndGlkLCB0aC0+dGgudGhfbmV3X3BsYWNlLCB0aC0+dGgudGhfY3VycmVudF9wbGFjZSkpOworCisgICAgLy8KKyAgICAvLyBDaGVjayB0aGF0IHRoZSBuZXcgcGxhY2UgaXMgd2l0aGluIHRoaXMgdGhyZWFkJ3MgcGFydGl0aW9uLgorICAgIC8vCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICBLTVBfQVNTRVJUKHRoLT50aC50aF9uZXdfcGxhY2UgPj0gMCk7CisgICAgS01QX0FTU0VSVCgodW5zaWduZWQpdGgtPnRoLnRoX25ld19wbGFjZSA8PSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MpOworICAgIGlmICh0aC0+dGgudGhfZmlyc3RfcGxhY2UgPD0gdGgtPnRoLnRoX2xhc3RfcGxhY2UpIHsKKyAgICAgICAgS01QX0FTU0VSVCgodGgtPnRoLnRoX25ld19wbGFjZSA+PSB0aC0+dGgudGhfZmlyc3RfcGxhY2UpCisgICAgICAgICAmJiAodGgtPnRoLnRoX25ld19wbGFjZSA8PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCgodGgtPnRoLnRoX25ld19wbGFjZSA8PSB0aC0+dGgudGhfZmlyc3RfcGxhY2UpCisgICAgICAgICB8fCAodGgtPnRoLnRoX25ld19wbGFjZSA+PSB0aC0+dGgudGhfbGFzdF9wbGFjZSkpOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ29weSB0aGUgdGhyZWFkIG1hc2sgdG8gdGhlIGttcF9pbmZvX3Qgc3RydWN1dHVyZSwKKyAgICAvLyBhbmQgc2V0IHRoaXMgdGhyZWFkJ3MgYWZmaW5pdHkuCisgICAgLy8KKyAgICBrbXBfYWZmaW5fbWFza190ICptYXNrID0gS01QX0NQVV9JTkRFWChfX2ttcF9hZmZpbml0eV9tYXNrcywKKyAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UpOworICAgIEtNUF9DUFVfQ09QWSh0aC0+dGgudGhfYWZmaW5fbWFzaywgbWFzayk7CisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSB0aC0+dGgudGhfbmV3X3BsYWNlOworCisgICAgaWYgKF9fa21wX2FmZmluaXR5X3ZlcmJvc2UpIHsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIEtNUF9JTkZPUk0oQm91bmRUb09TUHJvY1NldCwgIk9NUF9QUk9DX0JJTkQiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgIGd0aWQsIGJ1Zik7CisgICAgfQorICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkodGgtPnRoLnRoX2FmZmluX21hc2ssIFRSVUUpOworfQorCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworaW50CitfX2ttcF9hdXhfc2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKQoreworICAgIGludCBndGlkOworICAgIGttcF9pbmZvX3QgKnRoOworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIEtBX1RSQUNFKDEwMDAsIDt7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfc2V0X2FmZmluaXR5OiBzZXR0aW5nIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLAorICAgICAgICAgIGd0aWQsIGJ1Zik7CisgICAgfSk7CisKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIGlmICgobWFzayA9PSBOVUxMKSB8fCAoKm1hc2sgPT0gTlVMTCkpIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdW5zaWduZWQgcHJvYzsKKyAgICAgICAgICAgIGludCBudW1fcHJvY3MgPSAwOworCisgICAgICAgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKHByb2MsICgoa21wX2FmZmluX21hc2tfdCopKCptYXNrKSkpIHsKKyAgICAgICAgICAgICAgICBpZiAoISBLTVBfQ1BVX0lTU0VUKHByb2MsIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgeworICAgICAgICAgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9zZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpKSB7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBudW1fcHJvY3MrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChudW1fcHJvY3MgPT0gMCkgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTChBZmZpbml0eUludmFsaWRNYXNrLCAia21wX3NldF9hZmZpbml0eSIpOworICAgICAgICAgICAgfQorCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgaWYgKF9fa21wX2dldF9wcm9jX2dyb3VwKChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSkgPCAwKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgIH0KKyAgICB9CisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfYWZmaW5fbWFzayAhPSBOVUxMKTsKKyAgICByZXR2YWwgPSBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSwgRkFMU0UpOworICAgIGlmIChyZXR2YWwgPT0gMCkgeworICAgICAgICBLTVBfQ1BVX0NPUFkodGgtPnRoLnRoX2FmZmluX21hc2ssIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgdGgtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IDA7CisgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxOworCisgICAgLy8KKyAgICAvLyBUdXJuIG9mZiA0LjAgYWZmaW5pdHkgZm9yIHRoZSBjdXJyZW50IHRyZWFkIGF0IHRoaXMgcGFyYWxsZWwgbGV2ZWwuCisgICAgLy8KKyAgICB0aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKworaW50CitfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KHZvaWQgKiptYXNrKQoreworICAgIGludCBndGlkOworICAgIGludCByZXR2YWw7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9hZmZpbl9tYXNrICE9IE5VTEwpOworCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICB0aC0+dGgudGhfYWZmaW5fbWFzayk7CisgICAgICAgIF9fa21wX3ByaW50Zigia21wX2dldF9hZmZpbml0eTogc3RvcmVkIGFmZmluaXR5IG1hc2sgZm9yIHRocmVhZCAlZCA9ICVzXG4iLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF9nZXRfYWZmaW5pdHkiKTsKKyAgICAgICAgfQorICAgIH0KKworIyBpZiAhS01QX09TX1dJTkRPV1MKKworICAgIHJldHZhbCA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spLCBGQUxTRSk7CisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9wcmludGYoImttcF9nZXRfYWZmaW5pdHk6IHN5c3RlbSBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKyAgICByZXR1cm4gcmV0dmFsOworCisjIGVsc2UKKworICAgIEtNUF9DUFVfQ09QWSgoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzayksIHRoLT50aC50aF9hZmZpbl9tYXNrKTsKKyAgICByZXR1cm4gMDsKKworIyBlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit9CisKK2ludAorX19rbXBfYXV4X3NldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9zZXRfYWZmaW5pdHlfbWFza19wcm9jOiBzZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkKKyMgaWYgIUtNUF9VU0VfSFdMT0MKKyAgICAgICAgIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpCisjIGVuZGlmCisgICAgICAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIC0yOworICAgIH0KKworICAgIEtNUF9DUFVfU0VUKHByb2MsIChrbXBfYWZmaW5fbWFza190ICopKCptYXNrKSk7CisgICAgcmV0dXJuIDA7Cit9CisKKworaW50CitfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKGludCBwcm9jLCB2b2lkICoqbWFzaykKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgaWYgKCEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAwMCwgO3sKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIGNoYXIgYnVmW0tNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTl07CisgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sCisgICAgICAgICAgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKKyAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCJrbXBfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jOiB1bnNldHRpbmcgcHJvYyAlZCBpbiBhZmZpbml0eSBtYXNrIGZvciB0aHJlYWQgJWQgPSAlc1xuIiwKKyAgICAgICAgICBwcm9jLCBndGlkLCBidWYpOworICAgIH0pOworCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBpZiAoKG1hc2sgPT0gTlVMTCkgfHwgKCptYXNrID09IE5VTEwpKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoQWZmaW5pdHlJbnZhbGlkTWFzaywgImttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MiKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICgocHJvYyA8IDApCisjIGlmICFLTVBfVVNFX0hXTE9DCisgICAgICAgICB8fCAoKHVuc2lnbmVkKXByb2MgPj0gS01QX0NQVV9TRVRTSVpFKQorIyBlbmRpZgorICAgICAgICkgeworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghIEtNUF9DUFVfSVNTRVQocHJvYywgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB7CisgICAgICAgIHJldHVybiAtMjsKKyAgICB9CisKKyAgICBLTVBfQ1BVX0NMUihwcm9jLCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgIHJldHVybiAwOworfQorCisKK2ludAorX19rbXBfYXV4X2dldF9hZmZpbml0eV9tYXNrX3Byb2MoaW50IHByb2MsIHZvaWQgKiptYXNrKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBpZiAoISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMDAwLCA7eworICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwKKyAgICAgICAgICAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykpOworICAgICAgICBfX2ttcF9kZWJ1Z19wcmludGYoImttcF9nZXRfYWZmaW5pdHlfbWFza19wcm9jOiBnZXR0aW5nIHByb2MgJWQgaW4gYWZmaW5pdHkgbWFzayBmb3IgdGhyZWFkICVkID0gJXNcbiIsCisgICAgICAgICAgcHJvYywgZ3RpZCwgYnVmKTsKKyAgICB9KTsKKworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgaWYgKChtYXNrID09IE5VTEwpIHx8ICgqbWFzayA9PSBOVUxMKSkgeworICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyIpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKChwcm9jIDwgMCkKKyMgaWYgIUtNUF9VU0VfSFdMT0MKKyAgICAgICAgIHx8ICgodW5zaWduZWQpcHJvYyA+PSBLTVBfQ1BVX1NFVFNJWkUpCisjIGVuZGlmCisgICAgICAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgaWYgKCEgS01QX0NQVV9JU1NFVChwcm9jLCBfX2ttcF9hZmZpbl9mdWxsTWFzaykpIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgcmV0dXJuIEtNUF9DUFVfSVNTRVQocHJvYywgKGttcF9hZmZpbl9tYXNrX3QgKikoKm1hc2spKTsKK30KKworCisvLyBEeW5hbWljIGFmZmluaXR5IHNldHRpbmdzIC0gQWZmaW5pdHkgYmFsYW5jZWQKK3ZvaWQgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkoIGludCB0aWQsIGludCBudGhyZWFkcyApCit7CisgICAgaWYoIF9fa21wX2FmZmluaXR5X3VuaWZvcm1fdG9wb2xvZ3koKSApIHsKKyAgICAgICAgaW50IGNvcmVJRDsKKyAgICAgICAgaW50IHRocmVhZElEOworICAgICAgICAvLyBOdW1iZXIgb2YgaHlwZXIgdGhyZWFkcyBwZXIgY29yZSBpbiBIVCBtYWNoaW5lCisgICAgICAgIGludCBfX2ttcF9udGhfcGVyX2NvcmUgPSBfX2ttcF9hdmFpbF9wcm9jIC8gX19rbXBfbmNvcmVzOworICAgICAgICAvLyBOdW1iZXIgb2YgY29yZXMKKyAgICAgICAgaW50IG5jb3JlcyA9IF9fa21wX25jb3JlczsKKyAgICAgICAgLy8gSG93IG1hbnkgdGhyZWFkcyB3aWxsIGJlIGJvdW5kIHRvIGVhY2ggY29yZQorICAgICAgICBpbnQgY2h1bmsgPSBudGhyZWFkcyAvIG5jb3JlczsKKyAgICAgICAgLy8gSG93IG1hbnkgY29yZXMgd2lsbCBoYXZlIGFuIGFkZGl0aW9uYWwgdGhyZWFkIGJvdW5kIHRvIGl0IC0gImJpZyBjb3JlcyIKKyAgICAgICAgaW50IGJpZ19jb3JlcyA9IG50aHJlYWRzICUgbmNvcmVzOworICAgICAgICAvLyBOdW1iZXIgb2YgdGhyZWFkcyBvbiB0aGUgYmlnIGNvcmVzCisgICAgICAgIGludCBiaWdfbnRoID0gKCBjaHVuayArIDEgKSAqIGJpZ19jb3JlczsKKyAgICAgICAgaWYoIHRpZCA8IGJpZ19udGggKSB7CisgICAgICAgICAgICBjb3JlSUQgPSB0aWQgLyAoY2h1bmsgKyAxICk7CisgICAgICAgICAgICB0aHJlYWRJRCA9ICggdGlkICUgKGNodW5rICsgMSApICkgJSBfX2ttcF9udGhfcGVyX2NvcmUgOworICAgICAgICB9IGVsc2UgeyAvL3RpZCA+PSBiaWdfbnRoCisgICAgICAgICAgICBjb3JlSUQgPSAoIHRpZCAtIGJpZ19jb3JlcyApIC8gY2h1bms7CisgICAgICAgICAgICB0aHJlYWRJRCA9ICggKCB0aWQgLSBiaWdfY29yZXMgKSAlIGNodW5rICkgJSBfX2ttcF9udGhfcGVyX2NvcmUgOworICAgICAgICB9CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgICAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGNvcmVJRCAqIF9fa21wX250aF9wZXJfY29yZSArIHRocmVhZElEIF0uc2Vjb25kOworICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICB9IGVsc2UgaWYoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeyAvLyBHcmFudWxhcml0eSA9PSBjb3JlCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IF9fa21wX250aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBvc0lEOworICAgICAgICAgICAgICAgIG9zSUQgPSBhZGRyZXNzMm9zWyBjb3JlSUQgKiBfX2ttcF9udGhfcGVyX2NvcmUgKyBpIF0uc2Vjb25kOworICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkgeworICAgICAgICAgICAgY2hhciBidWZbS01QX0FGRklOX01BU0tfUFJJTlRfTEVOXTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3ByaW50X21hc2soYnVmLCBLTVBfQUZGSU5fTUFTS19QUklOVF9MRU4sIG1hc2spOworICAgICAgICAgICAgS01QX0lORk9STShCb3VuZFRvT1NQcm9jU2V0LCAiS01QX0FGRklOSVRZIiwgKGttcF9pbnQzMilnZXRwaWQoKSwKKyAgICAgICAgICAgICAgdGlkLCBidWYpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIG1hc2ssIFRSVUUgKTsKKyAgICAgICAgS01QX0NQVV9GUkVFX0ZST01fU1RBQ0sobWFzayk7CisgICAgfSBlbHNlIHsgLy8gTm9uLXVuaWZvcm0gdG9wb2xvZ3kKKworICAgICAgICBrbXBfYWZmaW5fbWFza190ICptYXNrOworICAgICAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgICAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGh5cGVyIHRocmVhZHMgcGVyIGNvcmUgaW4gSFQgbWFjaGluZQorICAgICAgICBpbnQgbnRoX3Blcl9jb3JlID0gX19rbXBfblRocmVhZHNQZXJDb3JlOworICAgICAgICBpbnQgY29yZV9sZXZlbDsKKyAgICAgICAgaWYoIG50aF9wZXJfY29yZSA+IDEgKSB7CisgICAgICAgICAgICBjb3JlX2xldmVsID0gX19rbXBfYWZmX2RlcHRoIC0gMjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGNvcmVfbGV2ZWwgPSBfX2ttcF9hZmZfZGVwdGggLSAxOworICAgICAgICB9CisKKyAgICAgICAgLy8gTnVtYmVyIG9mIGNvcmVzIC0gbWF4aW11bSB2YWx1ZTsgaXQgZG9lcyBub3QgY291bnQgdHJhaWwgY29yZXMgd2l0aCAwIHByb2Nlc3NvcnMKKyAgICAgICAgaW50IG5jb3JlcyA9IGFkZHJlc3Myb3NbIF9fa21wX2F2YWlsX3Byb2MgLSAxIF0uZmlyc3QubGFiZWxzWyBjb3JlX2xldmVsIF0gKyAxOworCisgICAgICAgIC8vIEZvciBwZXJmb3JtYW5jZSBnYWluIGNvbnNpZGVyIHRoZSBzcGVjaWFsIGNhc2UgbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYworICAgICAgICBpZiggbnRocmVhZHMgPT0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgaW50IG9zSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgIGludCBjb3JlSUQgPSBhZGRyZXNzMm9zWyB0aWQgXS5maXJzdC5sYWJlbHNbIGNvcmVfbGV2ZWwgXTsKKyAgICAgICAgICAgICAgICAvLyBXZSdsbCBjb3VudCBmb3VuZCBvc0lEcyBmb3IgdGhlIGN1cnJlbnQgY29yZTsgdGhleSBjYW4gYmUgbm90IG1vcmUgdGhhbiBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgLy8gc2luY2UgdGhlIGFkZHJlc3Myb3MgaXMgc29ydGllZCB3ZSBjYW4gYnJlYWsgd2hlbiBjbnQ9PW50aF9wZXJfY29yZQorICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgX19rbXBfYXZhaWxfcHJvYzsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IGFkZHJlc3Myb3NbIGkgXS5zZWNvbmQ7CisgICAgICAgICAgICAgICAgICAgIGludCBjb3JlID0gYWRkcmVzczJvc1sgaSBdLmZpcnN0LmxhYmVsc1sgY29yZV9sZXZlbCBdOworICAgICAgICAgICAgICAgICAgICBpZiggY29yZSA9PSBjb3JlSUQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1NFVCggb3NJRCwgbWFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBjbnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBjbnQgPT0gbnRoX3Blcl9jb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYoIG50aHJlYWRzIDw9IF9fa21wX25jb3JlcyApIHsKKworICAgICAgICAgICAgaW50IGNvcmUgPSAwOworICAgICAgICAgICAgZm9yKCBpbnQgaSA9IDA7IGkgPCBuY29yZXM7IGkrKyApIHsKKyAgICAgICAgICAgICAgICAvLyBDaGVjayBpZiB0aGlzIGNvcmUgZnJvbSBwcm9jYXJyW10gaXMgaW4gdGhlIG1hc2sKKyAgICAgICAgICAgICAgICBpbnQgaW5fbWFzayA9IDA7CisgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF0gIT0gLSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5fbWFzayA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaW5fbWFzayApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIHRpZCA9PSBjb3JlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgZm9yKCBpbnQgaiA9IDA7IGogPCBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBqIF07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIG9zSUQgIT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEZvciBncmFudWxhcml0eT10aHJlYWQgaXQgaXMgZW5vdWdoIHRvIHNldCB0aGUgZmlyc3QgYXZhaWxhYmxlIG9zSUQgZm9yIHRoaXMgY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2ZpbmUgfHwgX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvcmUrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeyAvLyBudGhyZWFkcyA+IF9fa21wX25jb3JlcworCisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgcHJvY2Vzc29ycyBhdCBlYWNoIGNvcmUKKyAgICAgICAgICAgIGludCogbnByb2NfYXRfY29yZSA9IChpbnQqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkqbmNvcmVzKTsKKyAgICAgICAgICAgIC8vIEFycmF5IHRvIHNhdmUgdGhlIG51bWJlciBvZiBjb3JlcyB3aXRoICJ4IiBhdmFpbGFibGUgcHJvY2Vzc29yczsKKyAgICAgICAgICAgIGludCogbmNvcmVzX3dpdGhfeF9wcm9jcyA9IChpbnQqKUtNUF9BTExPQ0Eoc2l6ZW9mKGludCkqKG50aF9wZXJfY29yZSsxKSk7CisgICAgICAgICAgICAvLyBBcnJheSB0byBzYXZlIHRoZSBudW1iZXIgb2YgY29yZXMgd2l0aCAjIHByb2NzIGZyb20geCB0byBudGhfcGVyX2NvcmUKKyAgICAgICAgICAgIGludCogbmNvcmVzX3dpdGhfeF90b19tYXhfcHJvY3MgPSAoaW50KilLTVBfQUxMT0NBKHNpemVvZihpbnQpKihudGhfcGVyX2NvcmUrMSkpOworCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8PSBudGhfcGVyX2NvcmU7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5jb3JlczsgaSsrICkgeworICAgICAgICAgICAgICAgIGludCBjbnQgPSAwOworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSAwOyBqIDwgbnRoX3Blcl9jb3JlOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgaiBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgY250Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgbnByb2NfYXRfY29yZVsgaSBdID0gY250OworICAgICAgICAgICAgICAgIG5jb3Jlc193aXRoX3hfcHJvY3NbIGNudCBdKys7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDw9IG50aF9wZXJfY29yZTsgaSsrICkgeworICAgICAgICAgICAgICAgIGZvciggaW50IGogPSBpOyBqIDw9IG50aF9wZXJfY29yZTsgaisrICkgeworICAgICAgICAgICAgICAgICAgICBuY29yZXNfd2l0aF94X3RvX21heF9wcm9jc1sgaSBdICs9IG5jb3Jlc193aXRoX3hfcHJvY3NbIGogXTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIE1heCBudW1iZXIgb2YgcHJvY2Vzc29ycworICAgICAgICAgICAgaW50IG5wcm9jID0gbnRoX3Blcl9jb3JlICogbmNvcmVzOworICAgICAgICAgICAgLy8gQW4gYXJyYXkgdG8ga2VlcCBudW1iZXIgb2YgdGhyZWFkcyBwZXIgZWFjaCBjb250ZXh0CisgICAgICAgICAgICBpbnQgKiBuZXdhcnIgPSAoIGludCAqIClfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBpbnQgKSAqIG5wcm9jICk7CisgICAgICAgICAgICBmb3IoIGludCBpID0gMDsgaSA8IG5wcm9jOyBpKysgKSB7CisgICAgICAgICAgICAgICAgbmV3YXJyWyBpIF0gPSAwOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBpbnQgbnRoID0gbnRocmVhZHM7CisgICAgICAgICAgICBpbnQgZmxhZyA9IDA7CisgICAgICAgICAgICB3aGlsZSggbnRoID4gMCApIHsKKyAgICAgICAgICAgICAgICBmb3IoIGludCBqID0gMTsgaiA8PSBudGhfcGVyX2NvcmU7IGorKyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGNudCA9IG5jb3Jlc193aXRoX3hfdG9fbWF4X3Byb2NzWyBqIF07CisgICAgICAgICAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbmNvcmVzOyBpKysgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBTa2lwIHRoZSBjb3JlIHdpdGggMCBwcm9jZXNzb3JzCisgICAgICAgICAgICAgICAgICAgICAgICBpZiggbnByb2NfYXRfY29yZVsgaSBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBrID0gMDsgayA8IG50aF9wZXJfY29yZTsgaysrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwcm9jYXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdICE9IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggbmV3YXJyWyBpICogbnRoX3Blcl9jb3JlICsgayBdID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBudGgtLTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGZsYWcgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZXdhcnJbIGkgKiBudGhfcGVyX2NvcmUgKyBrIF0gKys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY250LS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbnRoLS07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggY250ID09IDAgfHwgbnRoID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYoIG50aCA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZmxhZyA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpbnQgc3VtID0gMDsKKyAgICAgICAgICAgIGZvciggaW50IGkgPSAwOyBpIDwgbnByb2M7IGkrKyApIHsKKyAgICAgICAgICAgICAgICBzdW0gKz0gbmV3YXJyWyBpIF07CisgICAgICAgICAgICAgICAgaWYoIHN1bSA+IHRpZCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gR3JhbnVsYXJpdHkgPT0gdGhyZWFkCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZmluZSB8fCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fdGhyZWFkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgb3NJRCA9IHByb2NhcnJbIGkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfU0VUKCBvc0lELCBtYXNrKTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIGlmKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fY29yZSApIHsgLy8gR3JhbnVsYXJpdHkgPT0gY29yZQorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGNvcmVJRCA9IGkgLyBudGhfcGVyX2NvcmU7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IoIGludCBpaSA9IDA7IGlpIDwgbnRoX3Blcl9jb3JlOyBpaSsrICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBvc0lEID0gcHJvY2FyclsgY29yZUlEICogbnRoX3Blcl9jb3JlICsgaWkgXTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggb3NJRCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9TRVQoIG9zSUQsIG1hc2spOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9mcmVlKCBuZXdhcnIgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7CisgICAgICAgICAgICBjaGFyIGJ1ZltLTVBfQUZGSU5fTUFTS19QUklOVF9MRU5dOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJpbnRfbWFzayhidWYsIEtNUF9BRkZJTl9NQVNLX1BSSU5UX0xFTiwgbWFzayk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKEJvdW5kVG9PU1Byb2NTZXQsICJLTVBfQUZGSU5JVFkiLCAoa21wX2ludDMyKWdldHBpZCgpLAorICAgICAgICAgICAgICB0aWQsIGJ1Zik7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggbWFzaywgVFJVRSApOworICAgICAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyAgICB9Cit9CisKKyNpZiBLTVBfT1NfTElOVVgKKy8vIFdlIGRvbid0IG5lZWQgdGhpcyBlbnRyeSBmb3IgV2luZG93cyBiZWNhdXNlCisvLyB0aGVyZSBpcyBHZXRQcm9jZXNzQWZmaW5pdHlNYXNrKCkgYXBpCisvLworLy8gVGhlIGludGVuZGVkIHVzYWdlIGlzIGluZGljYXRlZCBieSB0aGVzZSBzdGVwczoKKy8vIDEpIFRoZSB1c2VyIGdldHMgdGhlIGN1cnJlbnQgYWZmaW5pdHkgbWFzaworLy8gMikgVGhlbiBzZXRzIHRoZSBhZmZpbml0eSBieSBjYWxsaW5nIHRoaXMgZnVuY3Rpb24KKy8vIDMpIEVycm9yIGNoZWNrIHRoZSByZXR1cm4gdmFsdWUKKy8vIDQpIFVzZSBub24tT3Blbk1QIHBhcmFsbGVsaXphdGlvbgorLy8gNSkgUmVzZXQgdGhlIGFmZmluaXR5IHRvIHdoYXQgd2FzIHN0b3JlZCBpbiBzdGVwIDEpCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIKKyNlbmRpZgoraW50CitrbXBfc2V0X3RocmVhZF9hZmZpbml0eV9tYXNrX2luaXRpYWwoKQorLy8gdGhlIGZ1bmN0aW9uIHJldHVybnMgMCBvbiBzdWNjZXNzLAorLy8gICAtMSBpZiB3ZSBjYW5ub3QgYmluZCB0aHJlYWQKKy8vICAgPjAgKGVycm5vKSBpZiBhbiBlcnJvciBoYXBwZW5lZCBkdXJpbmcgYmluZGluZworeworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpZiAoZ3RpZCA8IDApIHsKKyAgICAgICAgLy8gRG8gbm90IHRvdWNoIG5vbi1vbXAgdGhyZWFkcworICAgICAgICBLQV9UUkFDRSgzMCwgKCAia21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19pbml0aWFsOiAiCisgICAgICAgICAgICAibm9uLW9tcCB0aHJlYWQsIHJldHVybmluZ1xuIikpOworICAgICAgICByZXR1cm4gLTE7CisgICAgfQorICAgIGlmICghS01QX0FGRklOSVRZX0NBUEFCTEUoKSB8fCAhX19rbXBfaW5pdF9taWRkbGUpIHsKKyAgICAgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAgICAgImFmZmluaXR5IG5vdCBpbml0aWFsaXplZCwgcmV0dXJuaW5nXG4iKSk7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMzAsICggImttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfaW5pdGlhbDogIgorICAgICAgICAic2V0IGZ1bGwgbWFzayBmb3IgdGhyZWFkICVkXG4iLCBndGlkKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9hZmZpbl9mdWxsTWFzayAhPSBOVUxMKTsKKyAgICByZXR1cm4gX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShfX2ttcF9hZmZpbl9mdWxsTWFzaywgRkFMU0UpOworfQorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmggYi9yYzMvcnVudGltZS9zcmMva21wX2FmZmluaXR5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGVkMzQxNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWZmaW5pdHkuaApAQCAtMCwwICsxLDMxOSBAQAorLyoKKyAqIGttcF9hZmZpbml0eS5oIC0tIGhlYWRlciBmb3IgYWZmaW5pdHkgbWFuYWdlbWVudAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBLTVBfQUZGSU5JVFlfSAorI2RlZmluZSBLTVBfQUZGSU5JVFlfSAorCitleHRlcm4gaW50IF9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IC8qIEFmZmluaXR5ICdjb21wYWN0JyB2YWx1ZSAqLworCitjbGFzcyBBZGRyZXNzIHsKK3B1YmxpYzoKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbWF4RGVwdGggPSAzMjsKKyAgICB1bnNpZ25lZCBsYWJlbHNbbWF4RGVwdGhdOworICAgIHVuc2lnbmVkIGNoaWxkTnVtc1ttYXhEZXB0aF07CisgICAgdW5zaWduZWQgZGVwdGg7CisgICAgdW5zaWduZWQgbGVhZGVyOworICAgIEFkZHJlc3ModW5zaWduZWQgX2RlcHRoKQorICAgICAgOiBkZXB0aChfZGVwdGgpLCBsZWFkZXIoRkFMU0UpIHsKKyAgICB9CisgICAgQWRkcmVzcyAmb3BlcmF0b3I9KGNvbnN0IEFkZHJlc3MgJmIpIHsKKyAgICAgICAgZGVwdGggPSBiLmRlcHRoOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICAgICAgbGFiZWxzW2ldID0gYi5sYWJlbHNbaV07CisgICAgICAgICAgICBjaGlsZE51bXNbaV0gPSBiLmNoaWxkTnVtc1tpXTsKKyAgICAgICAgfQorICAgICAgICBsZWFkZXIgPSBGQUxTRTsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgQWRkcmVzcyAmYikgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgZm9yICh1bnNpZ25lZCBpID0gMDsgaSA8IGRlcHRoOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBpc0Nsb3NlKGNvbnN0IEFkZHJlc3MgJmIsIGludCBsZXZlbCkgY29uc3QgeworICAgICAgICBpZiAoZGVwdGggIT0gYi5kZXB0aCkKKyAgICAgICAgICAgIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYgKCh1bnNpZ25lZClsZXZlbCA+PSBkZXB0aCkKKyAgICAgICAgICAgIHJldHVybiB0cnVlOworICAgICAgICBmb3IgKHVuc2lnbmVkIGkgPSAwOyBpIDwgKGRlcHRoIC0gbGV2ZWwpOyBpKyspCisgICAgICAgICAgICBpZihsYWJlbHNbaV0gIT0gYi5sYWJlbHNbaV0pCisgICAgICAgICAgICAgICAgcmV0dXJuIGZhbHNlOworICAgICAgICByZXR1cm4gdHJ1ZTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvciE9KGNvbnN0IEFkZHJlc3MgJmIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworICAgIH0KKyAgICB2b2lkIHByaW50KCkgY29uc3QgeworICAgICAgICB1bnNpZ25lZCBpOworICAgICAgICBwcmludGYoIkRlcHRoOiAldSAtLS0gIiwgZGVwdGgpOworICAgICAgICBmb3IoaT0wO2k8ZGVwdGg7aSsrKSB7CisgICAgICAgICAgICBwcmludGYoIiV1ICIsIGxhYmVsc1tpXSk7CisgICAgICAgIH0KKyAgICB9Cit9OworCitjbGFzcyBBZGRyVW5zUGFpciB7CitwdWJsaWM6CisgICAgQWRkcmVzcyBmaXJzdDsKKyAgICB1bnNpZ25lZCBzZWNvbmQ7CisgICAgQWRkclVuc1BhaXIoQWRkcmVzcyBfZmlyc3QsIHVuc2lnbmVkIF9zZWNvbmQpCisgICAgICA6IGZpcnN0KF9maXJzdCksIHNlY29uZChfc2Vjb25kKSB7CisgICAgfQorICAgIEFkZHJVbnNQYWlyICZvcGVyYXRvcj0oY29uc3QgQWRkclVuc1BhaXIgJmIpCisgICAgeworICAgICAgICBmaXJzdCA9IGIuZmlyc3Q7CisgICAgICAgIHNlY29uZCA9IGIuc2Vjb25kOworICAgICAgICByZXR1cm4gKnRoaXM7CisgICAgfQorICAgIHZvaWQgcHJpbnQoKSBjb25zdCB7CisgICAgICAgIHByaW50ZigiZmlyc3QgPSAiKTsgZmlyc3QucHJpbnQoKTsKKyAgICAgICAgcHJpbnRmKCIgLS0tIHNlY29uZCA9ICV1Iiwgc2Vjb25kKTsKKyAgICB9CisgICAgYm9vbCBvcGVyYXRvcj09KGNvbnN0IEFkZHJVbnNQYWlyICZiKSBjb25zdCB7CisgICAgICAgIGlmKGZpcnN0ICE9IGIuZmlyc3QpIHJldHVybiBmYWxzZTsKKyAgICAgICAgaWYoc2Vjb25kICE9IGIuc2Vjb25kKSByZXR1cm4gZmFsc2U7CisgICAgICAgIHJldHVybiB0cnVlOworICAgIH0KKyAgICBib29sIG9wZXJhdG9yIT0oY29uc3QgQWRkclVuc1BhaXIgJmIpIGNvbnN0IHsKKyAgICAgICAgcmV0dXJuICFvcGVyYXRvcj09KGIpOworICAgIH0KK307CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIGZvciAoaSAgPSAwOyBpIDwgZGVwdGg7IGkrKykgeworICAgICAgICBpZiAoYWEtPmxhYmVsc1tpXSA8IGJiLT5sYWJlbHNbaV0pIHJldHVybiAtMTsKKyAgICAgICAgaWYgKGFhLT5sYWJlbHNbaV0gPiBiYi0+bGFiZWxzW2ldKSByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworc3RhdGljIGludAorX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfY2hpbGRfbnVtKGNvbnN0IHZvaWQgKmEsIGNvbnN0IHZvaWQgKmIpCit7CisgICAgY29uc3QgQWRkcmVzcyAqYWEgPSAoY29uc3QgQWRkcmVzcyAqKSYoKChBZGRyVW5zUGFpciAqKWEpCisgICAgICAtPmZpcnN0KTsKKyAgICBjb25zdCBBZGRyZXNzICpiYiA9IChjb25zdCBBZGRyZXNzICopJigoKEFkZHJVbnNQYWlyICopYikKKyAgICAgIC0+Zmlyc3QpOworICAgIHVuc2lnbmVkIGRlcHRoID0gYWEtPmRlcHRoOworICAgIHVuc2lnbmVkIGk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkZXB0aCA9PSBiYi0+ZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3QgPD0gZGVwdGgpOworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWZmaW5pdHlfY29tcGFjdCA+PSAwKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgKHVuc2lnbmVkKV9fa21wX2FmZmluaXR5X2NvbXBhY3Q7IGkrKykgeworICAgICAgICBpbnQgaiA9IGRlcHRoIC0gaSAtIDE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdIDwgYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIC0xOworICAgICAgICBpZiAoYWEtPmNoaWxkTnVtc1tqXSA+IGJiLT5jaGlsZE51bXNbal0pIHJldHVybiAxOworICAgIH0KKyAgICBmb3IgKDsgaSA8IGRlcHRoOyBpKyspIHsKKyAgICAgICAgaW50IGogPSBpIC0gX19rbXBfYWZmaW5pdHlfY29tcGFjdDsKKyAgICAgICAgaWYgKGFhLT5jaGlsZE51bXNbal0gPCBiYi0+Y2hpbGROdW1zW2pdKSByZXR1cm4gLTE7CisgICAgICAgIGlmIChhYS0+Y2hpbGROdW1zW2pdID4gYmItPmNoaWxkTnVtc1tqXSkgcmV0dXJuIDE7CisgICAgfQorICAgIHJldHVybiAwOworfQorCisKKy8qKiBBIHN0cnVjdHVyZSBmb3IgaG9sZGluZyBtYWNoaW5lLXNwZWNpZmljIGhpZXJhcmNoeSBpbmZvIHRvIGJlIGNvbXB1dGVkIG9uY2UgYXQgaW5pdC4KKyAgICBUaGlzIHN0cnVjdHVyZSByZXByZXNlbnRzIGEgbWFwcGluZyBvZiB0aHJlYWRzIHRvIHRoZSBhY3R1YWwgbWFjaGluZSBoaWVyYXJjaHksIG9yIHRvCisgICAgb3VyIGJlc3QgZ3Vlc3MgYXQgd2hhdCB0aGUgaGllcmFyY2h5IG1pZ2h0IGJlLCBmb3IgdGhlIHB1cnBvc2Ugb2YgcGVyZm9ybWluZyBhbgorICAgIGVmZmljaWVudCBiYXJyaWVyLiAgSW4gdGhlIHdvcnN0IGNhc2UsIHdoZW4gdGhlcmUgaXMgbm8gbWFjaGluZSBoaWVyYXJjaHkgaW5mb3JtYXRpb24sCisgICAgaXQgcHJvZHVjZXMgYSB0cmVlIHN1aXRhYmxlIGZvciBhIGJhcnJpZXIsIHNpbWlsYXIgdG8gdGhlIHRyZWUgdXNlZCBpbiB0aGUgaHlwZXIgYmFycmllci4gKi8KK2NsYXNzIGhpZXJhcmNoeV9pbmZvIHsKK3B1YmxpYzoKKyAgICAvKiogR29vZCBkZWZhdWx0IHZhbHVlcyBmb3IgbnVtYmVyIG9mIGxlYXZlcyBhbmQgYnJhbmNoaW5nIGZhY3RvciwgZ2l2ZW4gbm8gYWZmaW5pdHkgaW5mb3JtYXRpb24uCisJQmVoYXZlcyBhIGJpdCBsaWtlIGh5cGVyIGJhcnJpZXIuICovCisgICAgc3RhdGljIGNvbnN0IGttcF91aW50MzIgbWF4TGVhdmVzPTQ7CisgICAgc3RhdGljIGNvbnN0IGttcF91aW50MzIgbWluQnJhbmNoPTQ7CisgICAgLyoqIE51bWJlciBvZiBsZXZlbHMgaW4gdGhlIGhpZXJhcmNoeS4gVHlwaWNhbCBsZXZlbHMgYXJlIHRocmVhZHMvY29yZSwgY29yZXMvcGFja2FnZQorCW9yIHNvY2tldCwgcGFja2FnZXMvbm9kZSwgbm9kZXMvbWFjaGluZSwgZXRjLiAgV2UgZG9uJ3Qgd2FudCB0byBnZXQgc3BlY2lmaWMgd2l0aAorCW5vbWVuY2xhdHVyZS4gIFdoZW4gdGhlIG1hY2hpbmUgaXMgb3ZlcnN1YnNjcmliZWQgd2UgYWRkIGxldmVscyB0byBkdXBsaWNhdGUgdGhlCisJaGllcmFyY2h5LCBkb3VibGluZyB0aGUgdGhyZWFkIGNhcGFjaXR5IG9mIHRoZSBoaWVyYXJjaHkgZWFjaCB0aW1lIHdlIGFkZCBhIGxldmVsLiAqLworICAgIGttcF91aW50MzIgbWF4TGV2ZWxzOworCisgICAgLyoqIFRoaXMgaXMgc3BlY2lmaWNhbGx5IHRoZSBkZXB0aCBvZiB0aGUgbWFjaGluZSBjb25maWd1cmF0aW9uIGhpZXJhcmNoeSwgaW4gdGVybXMgb2YgdGhlCisgICAgICAgIG51bWJlciBvZiBsZXZlbHMgYWxvbmcgdGhlIGxvbmdlc3QgcGF0aCBmcm9tIHJvb3QgdG8gYW55IGxlYWYuIEl0IGNvcnJlc3BvbmRzIHRvIHRoZQorICAgICAgICBudW1iZXIgb2YgZW50cmllcyBpbiBudW1QZXJMZXZlbCBpZiB3ZSBleGNsdWRlIGFsbCBidXQgb25lIHRyYWlsaW5nIDEuICovCisgICAga21wX3VpbnQzMiBkZXB0aDsKKyAgICBrbXBfdWludDMyIGJhc2VfbnVtX3RocmVhZHM7CisgICAgZW51bSBpbml0X3N0YXR1cyB7IGluaXRpYWxpemVkPTAsIG5vdF9pbml0aWFsaXplZD0xLCBpbml0aWFsaXppbmc9MiB9OworICAgIHZvbGF0aWxlIGttcF9pbnQ4IHVuaW5pdGlhbGl6ZWQ7IC8vIDA9aW5pdGlhbGl6ZWQsIDE9bm90IGluaXRpYWxpemVkLCAyPWluaXRpYWxpemF0aW9uIGluIHByb2dyZXNzCisgICAgdm9sYXRpbGUga21wX2ludDggcmVzaXppbmc7IC8vIDA9bm90IHJlc2l6aW5nLCAxPXJlc2l6aW5nCisKKyAgICAvKiogTGV2ZWwgMCBjb3JyZXNwb25kcyB0byBsZWF2ZXMuIG51bVBlckxldmVsW2ldIGlzIHRoZSBudW1iZXIgb2YgY2hpbGRyZW4gdGhlIHBhcmVudCBvZiBhCisgICAgICAgIG5vZGUgYXQgbGV2ZWwgaSBoYXMuIEZvciBleGFtcGxlLCBpZiB3ZSBoYXZlIGEgbWFjaGluZSB3aXRoIDQgcGFja2FnZXMsIDQgY29yZXMvcGFja2FnZQorICAgICAgICBhbmQgMiBIVCBwZXIgY29yZSwgdGhlbiBudW1QZXJMZXZlbCA9IHsyLCA0LCA0LCAxLCAxfS4gQWxsIGVtcHR5IGxldmVscyBhcmUgc2V0IHRvIDEuICovCisgICAga21wX3VpbnQzMiAqbnVtUGVyTGV2ZWw7CisgICAga21wX3VpbnQzMiAqc2tpcFBlckxldmVsOworCisgICAgdm9pZCBkZXJpdmVMZXZlbHMoQWRkclVuc1BhaXIgKmFkcjJvcywgaW50IG51bV9hZGRycykgeworICAgICAgICBpbnQgaGllcl9kZXB0aCA9IGFkcjJvc1swXS5maXJzdC5kZXB0aDsKKyAgICAgICAgaW50IGxldmVsID0gMDsKKyAgICAgICAgZm9yIChpbnQgaT1oaWVyX2RlcHRoLTE7IGk+PTA7IC0taSkgeworICAgICAgICAgICAgaW50IG1heCA9IC0xOworICAgICAgICAgICAgZm9yIChpbnQgaj0wOyBqPG51bV9hZGRyczsgKytqKSB7CisgICAgICAgICAgICAgICAgaW50IG5leHQgPSBhZHIyb3Nbal0uZmlyc3QuY2hpbGROdW1zW2ldOworICAgICAgICAgICAgICAgIGlmIChuZXh0ID4gbWF4KSBtYXggPSBuZXh0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtUGVyTGV2ZWxbbGV2ZWxdID0gbWF4KzE7CisgICAgICAgICAgICArK2xldmVsOworICAgICAgICB9CisgICAgfQorCisgICAgaGllcmFyY2h5X2luZm8oKSA6IG1heExldmVscyg3KSwgZGVwdGgoMSksIHVuaW5pdGlhbGl6ZWQobm90X2luaXRpYWxpemVkKSwgcmVzaXppbmcoMCkge30KKworICAgIHZvaWQgZmluaSgpIHsgaWYgKCF1bmluaXRpYWxpemVkICYmIG51bVBlckxldmVsKSBfX2ttcF9mcmVlKG51bVBlckxldmVsKTsgfQorCisgICAgdm9pZCBpbml0KEFkZHJVbnNQYWlyICphZHIyb3MsIGludCBudW1fYWRkcnMpCisgICAgeworICAgICAgICBrbXBfaW50OCBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZ1bmluaXRpYWxpemVkLCBub3RfaW5pdGlhbGl6ZWQsIGluaXRpYWxpemluZyk7CisgICAgICAgIGlmIChib29sX3Jlc3VsdCA9PSAwKSB7IC8vIFdhaXQgZm9yIGluaXRpYWxpemF0aW9uCisgICAgICAgICAgICB3aGlsZSAoVENSXzEodW5pbml0aWFsaXplZCkgIT0gaW5pdGlhbGl6ZWQpIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJvb2xfcmVzdWx0PT0xKTsKKworICAgICAgICAvKiBBZGRlZCBleHBsaWNpdCBpbml0aWFsaXphdGlvbiBvZiB0aGUgZGF0YSBmaWVsZHMgaGVyZSB0byBwcmV2ZW50IHVzYWdlIG9mIGRpcnR5IHZhbHVlCisgICAgICAgICAgIG9ic2VydmVkIHdoZW4gc3RhdGljIGxpYnJhcnkgaXMgcmUtaW5pdGlhbGl6ZWQgbXVsdGlwbGUgdGltZXMgKGUuZy4gd2hlbgorICAgICAgICAgICBub24tT3Blbk1QIHRocmVhZCByZXBlYXRlZGx5IGxhdW5jaGVzL2pvaW5zIHRocmVhZCB0aGF0IHVzZXMgT3Blbk1QKS4gKi8KKyAgICAgICAgZGVwdGggPSAxOworICAgICAgICByZXNpemluZyA9IDA7CisgICAgICAgIG1heExldmVscyA9IDc7CisgICAgICAgIG51bVBlckxldmVsID0gKGttcF91aW50MzIgKilfX2ttcF9hbGxvY2F0ZShtYXhMZXZlbHMqMipzaXplb2Yoa21wX3VpbnQzMikpOworICAgICAgICBza2lwUGVyTGV2ZWwgPSAmKG51bVBlckxldmVsW21heExldmVsc10pOworICAgICAgICBmb3IgKGttcF91aW50MzIgaT0wOyBpPG1heExldmVsczsgKytpKSB7IC8vIGluaXQgbnVtUGVyTGV2ZWxbKl0gdG8gMSBpdGVtIHBlciBsZXZlbAorICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIFNvcnQgdGFibGUgYnkgcGh5c2ljYWwgSUQKKyAgICAgICAgaWYgKGFkcjJvcykgeworICAgICAgICAgICAgcXNvcnQoYWRyMm9zLCBudW1fYWRkcnMsIHNpemVvZigqYWRyMm9zKSwgX19rbXBfYWZmaW5pdHlfY21wX0FkZHJlc3NfbGFiZWxzKTsKKyAgICAgICAgICAgIGRlcml2ZUxldmVscyhhZHIyb3MsIG51bV9hZGRycyk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW1QZXJMZXZlbFswXSA9IG1heExlYXZlczsKKyAgICAgICAgICAgIG51bVBlckxldmVsWzFdID0gbnVtX2FkZHJzL21heExlYXZlczsKKyAgICAgICAgICAgIGlmIChudW1fYWRkcnMlbWF4TGVhdmVzKSBudW1QZXJMZXZlbFsxXSsrOworICAgICAgICB9CisKKyAgICAgICAgYmFzZV9udW1fdGhyZWFkcyA9IG51bV9hZGRyczsKKyAgICAgICAgZm9yIChpbnQgaT1tYXhMZXZlbHMtMTsgaT49MDsgLS1pKSAvLyBjb3VudCBub24tZW1wdHkgbGV2ZWxzIHRvIGdldCBkZXB0aAorICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2ldICE9IDEgfHwgZGVwdGggPiAxKSAvLyBvbmx5IGNvdW50IG9uZSB0b3AtbGV2ZWwgJzEnCisgICAgICAgICAgICAgICAgZGVwdGgrKzsKKworICAgICAgICBrbXBfdWludDMyIGJyYW5jaCA9IG1pbkJyYW5jaDsKKyAgICAgICAgaWYgKG51bVBlckxldmVsWzBdID09IDEpIGJyYW5jaCA9IG51bV9hZGRycy9tYXhMZWF2ZXM7CisgICAgICAgIGlmIChicmFuY2g8bWluQnJhbmNoKSBicmFuY2g9bWluQnJhbmNoOworICAgICAgICBmb3IgKGttcF91aW50MzIgZD0wOyBkPGRlcHRoLTE7ICsrZCkgeyAvLyBvcHRpbWl6ZSBoaWVyYXJjaHkgd2lkdGgKKyAgICAgICAgICAgIHdoaWxlIChudW1QZXJMZXZlbFtkXSA+IGJyYW5jaCB8fCAoZD09MCAmJiBudW1QZXJMZXZlbFtkXT5tYXhMZWF2ZXMpKSB7IC8vIG1heCA0IG9uIGxldmVsIDAhCisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2RdICYgMSkgbnVtUGVyTGV2ZWxbZF0rKzsKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtkXSA9IG51bVBlckxldmVsW2RdID4+IDE7CisgICAgICAgICAgICAgICAgaWYgKG51bVBlckxldmVsW2QrMV0gPT0gMSkgZGVwdGgrKzsKKyAgICAgICAgICAgICAgICBudW1QZXJMZXZlbFtkKzFdID0gbnVtUGVyTGV2ZWxbZCsxXSA8PCAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYobnVtUGVyTGV2ZWxbMF0gPT0gMSkgeworICAgICAgICAgICAgICAgIGJyYW5jaCA9IGJyYW5jaCA+PiAxOworICAgICAgICAgICAgICAgIGlmIChicmFuY2g8NCkgYnJhbmNoID0gbWluQnJhbmNoOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MTsgaTxkZXB0aDsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gbnVtUGVyTGV2ZWxbaS0xXSAqIHNraXBQZXJMZXZlbFtpLTFdOworICAgICAgICAvLyBGaWxsIGluIGhpZXJhcmNoeSBpbiB0aGUgY2FzZSBvZiBvdmVyc3Vic2NyaXB0aW9uCisgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPWRlcHRoOyBpPG1heExldmVsczsgKytpKQorICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gMipza2lwUGVyTGV2ZWxbaS0xXTsKKworICAgICAgICB1bmluaXRpYWxpemVkID0gaW5pdGlhbGl6ZWQ7IC8vIE9uZSB3cml0ZXIKKworICAgIH0KKworICAgIC8vIFJlc2l6ZSB0aGUgaGllcmFyY2h5IGlmIG5wcm9jIGNoYW5nZXMgdG8gc29tZXRoaW5nIGxhcmdlciB0aGFuIGJlZm9yZQorICAgIHZvaWQgcmVzaXplKGttcF91aW50MzIgbnByb2MpCisgICAgeworICAgICAgICBrbXBfaW50OCBib29sX3Jlc3VsdCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KCZyZXNpemluZywgMCwgMSk7CisgICAgICAgIHdoaWxlIChib29sX3Jlc3VsdCA9PSAwKSB7IC8vIHNvbWVvbmUgZWxzZSBpcyB0cnlpbmcgdG8gcmVzaXplCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBpZiAobnByb2MgPD0gYmFzZV9udW1fdGhyZWFkcykgIC8vIGhhcHB5IHdpdGggb3RoZXIgdGhyZWFkJ3MgcmVzaXplCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgZWxzZSAvLyB0cnkgdG8gcmVzaXplCisgICAgICAgICAgICAgICAgYm9vbF9yZXN1bHQgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCgmcmVzaXppbmcsIDAsIDEpOworICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYm9vbF9yZXN1bHQhPTApOworICAgICAgICBpZiAobnByb2MgPD0gYmFzZV9udW1fdGhyZWFkcykgcmV0dXJuOyAvLyBoYXBweSB3aXRoIG90aGVyIHRocmVhZCdzIHJlc2l6ZQorCisgICAgICAgIC8vIENhbGN1bGF0ZSBuZXcgbWF4TGV2ZWxzCisgICAgICAgIGttcF91aW50MzIgb2xkX3N6ID0gc2tpcFBlckxldmVsW2RlcHRoLTFdOworICAgICAgICBrbXBfdWludDMyIGluY3MgPSAwLCBvbGRfbWF4TGV2ZWxzID0gbWF4TGV2ZWxzOworICAgICAgICAvLyBGaXJzdCBzZWUgaWYgb2xkIG1heExldmVscyBpcyBlbm91Z2ggdG8gY29udGFpbiBuZXcgc2l6ZQorICAgICAgICBmb3IgKGttcF91aW50MzIgaT1kZXB0aDsgaTxtYXhMZXZlbHMgJiYgbnByb2M+b2xkX3N6OyArK2kpIHsKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIqc2tpcFBlckxldmVsW2ktMV07CisgICAgICAgICAgICBudW1QZXJMZXZlbFtpLTFdICo9IDI7CisgICAgICAgICAgICBvbGRfc3ogKj0gMjsKKyAgICAgICAgICAgIGRlcHRoKys7CisgICAgICAgIH0KKyAgICAgICAgaWYgKG5wcm9jID4gb2xkX3N6KSB7IC8vIE5vdCBlbm91Z2ggc3BhY2UsIG5lZWQgdG8gZXhwYW5kIGhpZXJhcmNoeQorICAgICAgICAgICAgd2hpbGUgKG5wcm9jID4gb2xkX3N6KSB7CisgICAgICAgICAgICAgICAgb2xkX3N6ICo9MjsKKyAgICAgICAgICAgICAgICBpbmNzKys7CisgICAgICAgICAgICAgICAgZGVwdGgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1heExldmVscyArPSBpbmNzOworCisgICAgICAgICAgICAvLyBSZXNpemUgYXJyYXlzCisgICAgICAgICAgICBrbXBfdWludDMyICpvbGRfbnVtUGVyTGV2ZWwgPSBudW1QZXJMZXZlbDsKKyAgICAgICAgICAgIGttcF91aW50MzIgKm9sZF9za2lwUGVyTGV2ZWwgPSBza2lwUGVyTGV2ZWw7CisgICAgICAgICAgICBudW1QZXJMZXZlbCA9IHNraXBQZXJMZXZlbCA9IE5VTEw7CisgICAgICAgICAgICBudW1QZXJMZXZlbCA9IChrbXBfdWludDMyICopX19rbXBfYWxsb2NhdGUobWF4TGV2ZWxzKjIqc2l6ZW9mKGttcF91aW50MzIpKTsKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbCA9ICYobnVtUGVyTGV2ZWxbbWF4TGV2ZWxzXSk7CisKKyAgICAgICAgICAgIC8vIENvcHkgb2xkIGVsZW1lbnRzIGZyb20gb2xkIGFycmF5cworICAgICAgICAgICAgZm9yIChrbXBfdWludDMyIGk9MDsgaTxvbGRfbWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSBvbGRfbnVtUGVyTGV2ZWxbaV07CisgICAgICAgICAgICAgICAgc2tpcFBlckxldmVsW2ldID0gb2xkX3NraXBQZXJMZXZlbFtpXTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLy8gSW5pdCBuZXcgZWxlbWVudHMgaW4gYXJyYXlzIHRvIDEKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBpPW9sZF9tYXhMZXZlbHM7IGk8bWF4TGV2ZWxzOyArK2kpIHsgLy8gaW5pdCBudW1QZXJMZXZlbFsqXSB0byAxIGl0ZW0gcGVyIGxldmVsCisgICAgICAgICAgICAgICAgbnVtUGVyTGV2ZWxbaV0gPSAxOworICAgICAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEZyZWUgb2xkIGFycmF5cworICAgICAgICAgICAgX19rbXBfZnJlZShvbGRfbnVtUGVyTGV2ZWwpOworICAgICAgICB9CisKKyAgICAgICAgLy8gRmlsbCBpbiBvdmVyc3Vic2NyaXB0aW9uIGxldmVscyBvZiBoaWVyYXJjaHkKKyAgICAgICAgZm9yIChrbXBfdWludDMyIGk9b2xkX21heExldmVsczsgaTxtYXhMZXZlbHM7ICsraSkKKyAgICAgICAgICAgIHNraXBQZXJMZXZlbFtpXSA9IDIqc2tpcFBlckxldmVsW2ktMV07CisKKyAgICAgICAgYmFzZV9udW1fdGhyZWFkcyA9IG5wcm9jOworICAgICAgICByZXNpemluZyA9IDA7IC8vIE9uZSB3cml0ZXIKKworICAgIH0KK307CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX0gKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYWxsb2MuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hZjNmMWRiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9hbGxvYy5jCkBAIC0wLDAgKzEsMjA4MyBAQAorLyoKKyAqIGttcF9hbGxvYy5jIC0tIHByaXZhdGUvc2hhcmVkIGR5YW5taWMgbWVtb3J5IGFsbG9jYXRpb24gYW5kIG1hbmFnZW1lbnQKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX21hbGxvYy5oIgorI2luY2x1ZGUgImttcF9pby5oIgorCisvLyBEaXNhYmxlIGJnZXQgd2hlbiBpdCBpcyBub3QgdXNlZAorI2lmIEtNUF9VU0VfQkdFVAorCisvKiBUaHJlYWQgcHJpdmF0ZSBidWZmZXIgbWFuYWdlbWVudCBjb2RlICovCisKK3R5cGVkZWYgaW50ICAgKCpiZ2V0X2NvbXBhY3RfdCkoc2l6ZV90LCBpbnQpOwordHlwZWRlZiB2b2lkICooKmJnZXRfYWNxdWlyZV90KShzaXplX3QpOwordHlwZWRlZiB2b2lkICAoKmJnZXRfcmVsZWFzZV90KSh2b2lkICopOworCisvKiBOT1RFOiBidWZzaXplIG11c3QgYmUgYSBzaWduZWQgZGF0YXR5cGUgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyAgIHR5cGVkZWYga21wX2ludDMyIGJ1ZnNpemU7CisjIGVsc2UKKyAgIHR5cGVkZWYga21wX2ludDY0IGJ1ZnNpemU7CisjIGVuZGlmCisjZWxzZQorICB0eXBlZGVmIHNzaXplX3QgYnVmc2l6ZTsKKyNlbmRpZgorCisvKiBUaGUgdGhyZWUgbW9kZXMgb2Ygb3BlcmF0aW9uIGFyZSwgZmlmbyBzZWFyY2gsIGxpZm8gc2VhcmNoLCBhbmQgYmVzdC1maXQgKi8KKwordHlwZWRlZiBlbnVtIGJnZXRfbW9kZSB7CisgICAgYmdldF9tb2RlX2ZpZm8gPSAwLAorICAgIGJnZXRfbW9kZV9saWZvID0gMSwKKyAgICBiZ2V0X21vZGVfYmVzdCA9IDIKK30gYmdldF9tb2RlX3Q7CisKKworc3RhdGljIHZvaWQgICAgYnBvb2woIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbGVuKTsKK3N0YXRpYyB2b2lkICAgKmJnZXQoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHooIGttcF9pbmZvX3QgKnRoLCBidWZzaXplIHNpemUpOworc3RhdGljIHZvaWQgICAqYmdldHIoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWZmZXIsIGJ1ZnNpemUgbmV3c2l6ZSk7CitzdGF0aWMgdm9pZCAgICBicmVsKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyICk7CisKKyNpZmRlZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkICAgIGJzdGF0cygga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgKmN1cmFsbG9jLCBidWZzaXplICp0b3RmcmVlLCBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKTsKK3N0YXRpYyB2b2lkICAgIGJzdGF0c2UoIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCk7CitzdGF0aWMgdm9pZCAgICBidWZkdW1wKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmKTsKK3N0YXRpYyB2b2lkICAgIGJwb29sZCgga21wX2luZm9fdCAqdGgsIHZvaWQgKnBvb2wsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSk7CitzdGF0aWMgaW50ICAgICBicG9vbHYoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwb29sKTsKKyNlbmRpZgorCisvKiBCR0VUIENPTkZJR1VSQVRJT04gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyIGFsbG9jYXRpb24gc2l6ZSBxdWFudHVtOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbGwgYnVmZmVycyBhbGxvY2F0ZWQgYXJlIGEKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXVsdGlwbGUgb2YgdGhpcyBzaXplLiAgVGhpcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBNVVNUIGJlIGEgcG93ZXIgb2YgdHdvLiAqLworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIE9uIElBLTMyIGFyY2hpdGVjdHVyZSB3aXRoICBMaW51eCogT1MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1hbGxvYygpIGRvZXMgbm90CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGVuc3VyZSAxNiBieXRlIGFsaWdubW5lbnQgKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCAhS01QX0hBVkVfUVVBRAorCisjZGVmaW5lIFNpemVRdWFudCAgIDgKKyNkZWZpbmUgQWxpZ25UeXBlICAgZG91YmxlCisKKyNlbHNlCisKKyNkZWZpbmUgU2l6ZVF1YW50ICAgMTYKKyNkZWZpbmUgQWxpZ25UeXBlICAgX1F1YWQKKworI2VuZGlmCisKKyNkZWZpbmUgQnVmU3RhdHMgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnN0YXRzKCkgZnVuY3Rpb24gd2hpY2ggY2FsY3VsYXRlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgdG90YWwgZnJlZSBzcGFjZSBpbiB0aGUgYnVmZmVyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBvb2wsIHRoZSBsYXJnZXN0IGF2YWlsYWJsZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXIsIGFuZCB0aGUgdG90YWwgc3BhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY3VycmVudGx5IGFsbG9jYXRlZC4gKi8KKworI2lmZGVmIEtNUF9ERUJVRworCisjZGVmaW5lIEJ1ZkR1bXAgICAgIDEgICAgICAgICAgICAgICAgIC8qIERlZmluZSB0aGlzIHN5bWJvbCB0byBlbmFibGUgdGhlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sZCgpIGZ1bmN0aW9uIHdoaWNoIGR1bXBzIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmZXJzIGluIGEgYnVmZmVyIHBvb2wuICovCisKKyNkZWZpbmUgQnVmVmFsaWQgICAgMSAgICAgICAgICAgICAgICAgLyogRGVmaW5lIHRoaXMgc3ltYm9sIHRvIGVuYWJsZSB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnBvb2x2KCkgZnVuY3Rpb24gZm9yIHZhbGlkYXRpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYSBidWZmZXIgcG9vbC4gKi8KKworI2RlZmluZSBEdW1wRGF0YSAgICAxICAgICAgICAgICAgICAgICAvKiBEZWZpbmUgdGhpcyBzeW1ib2wgdG8gZW5hYmxlIHRoZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZkdW1wKCkgZnVuY3Rpb24gd2hpY2ggYWxsb3dzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGR1bXBpbmcgdGhlIGNvbnRlbnRzIG9mIGFuIGFsbG9jYXRlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvciBmcmVlIGJ1ZmZlci4gKi8KKyNpZmRlZiBOT1RfVVNFRF9OT1cKKworI2RlZmluZSBGcmVlV2lwZSAgICAxICAgICAgICAgICAgICAgICAvKiBXaXBlIGZyZWUgYnVmZmVycyB0byBhIGd1YXJhbnRlZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGF0dGVybiBvZiBnYXJiYWdlIHRvIHRyaXAgdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbWlzY3JlYW50cyB3aG8gYXR0ZW1wdCB0byB1c2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcG9pbnRlcnMgaW50byByZWxlYXNlZCBidWZmZXJzLiAqLworCisjZGVmaW5lIEJlc3RGaXQgICAgIDEgICAgICAgICAgICAgICAgIC8qIFVzZSBhIGJlc3QgZml0IGFsZ29yaXRobSB3aGVuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNlYXJjaGluZyBmb3Igc3BhY2UgZm9yIGFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gcmVxdWVzdC4gIFRoaXMgdXNlcworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtZW1vcnkgbW9yZSBlZmZpY2llbnRseSwgYnV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYXRpb24gd2lsbCBiZSBtdWNoIHNsb3dlci4gKi8KKyNlbmRpZiAvKiBOT1RfVVNFRF9OT1cgKi8KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworCitzdGF0aWMgYnVmc2l6ZSBiZ2V0X2Jpbl9zaXplWyBdID0geworICAgIDAsCisvLyAgICAxIDw8IDYsICAgIC8qIC41IENhY2hlIGxpbmUgKi8KKyAgICAxIDw8IDcsICAgIC8qIDEgQ2FjaGUgbGluZSwgbmV3ICovCisgICAgMSA8PCA4LCAgICAvKiAyIENhY2hlIGxpbmVzICovCisgICAgMSA8PCA5LCAgICAvKiA0IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEwLCAgIC8qIDggQ2FjaGUgbGluZXMgKi8KKyAgICAxIDw8IDExLCAgIC8qIDE2IENhY2hlIGxpbmVzLCBuZXcgKi8KKyAgICAxIDw8IDEyLAorICAgIDEgPDwgMTMsICAgLyogbmV3ICovCisgICAgMSA8PCAxNCwKKyAgICAxIDw8IDE1LCAgIC8qIG5ldyAqLworICAgIDEgPDwgMTYsCisgICAgMSA8PCAxNywKKyAgICAxIDw8IDE4LAorICAgIDEgPDwgMTksCisgICAgMSA8PCAyMCwgICAgLyogIDFNQiAqLworICAgIDEgPDwgMjEsICAgIC8qICAyTUIgKi8KKyAgICAxIDw8IDIyLCAgICAvKiAgNE1CICovCisgICAgMSA8PCAyMywgICAgLyogIDhNQiAqLworICAgIDEgPDwgMjQsICAgIC8qIDE2TUIgKi8KKyAgICAxIDw8IDI1LCAgICAvKiAzMk1CICovCit9OworCisjZGVmaW5lIE1BWF9CR0VUX0JJTlMgICAoaW50KShzaXplb2YoYmdldF9iaW5fc2l6ZSkgLyBzaXplb2YoYnVmc2l6ZSkpCisKK3N0cnVjdCBiZmhlYWQ7CisKKy8qICBEZWNsYXJlIHRoZSBpbnRlcmZhY2UsIGluY2x1ZGluZyB0aGUgcmVxdWVzdGVkIGJ1ZmZlciBzaXplIHR5cGUsCisgICAgYnVmc2l6ZS4gICovCisKKy8qIFF1ZXVlIGxpbmtzICovCisKK3R5cGVkZWYgc3RydWN0IHFsaW5rcyB7CisgICAgc3RydWN0IGJmaGVhZCAqZmxpbms7ICAgICAgICAgICAgIC8qIEZvcndhcmQgbGluayAqLworICAgIHN0cnVjdCBiZmhlYWQgKmJsaW5rOyAgICAgICAgICAgICAvKiBCYWNrd2FyZCBsaW5rICovCit9IHFsaW5rc190OworCisvKiBIZWFkZXIgaW4gYWxsb2NhdGVkIGFuZCBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmhlYWQyIHsKKyAgICBrbXBfaW5mb190ICpidGhyOyAgICAgICAgICAgICAgICAgLyogVGhlIHRocmVhZCB3aGljaCBvd25zIHRoZSBidWZmZXIgcG9vbCAqLworICAgIGJ1ZnNpemUgICAgIHByZXZmcmVlOyAgICAgICAgICAgICAvKiBSZWxhdGl2ZSBsaW5rIGJhY2sgdG8gcHJldmlvdXMKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgaW4gbWVtb3J5IG9yIDAgaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJldmlvdXMgYnVmZmVyIGlzIGFsbG9jYXRlZC4gICovCisgICAgYnVmc2l6ZSAgICAgYnNpemU7ICAgICAgICAgICAgICAgIC8qIEJ1ZmZlciBzaXplOiBwb3NpdGl2ZSBpZiBmcmVlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBuZWdhdGl2ZSBpZiBhbGxvY2F0ZWQuICovCit9IGJoZWFkMl90OworCisvKiBNYWtlIHN1cmUgdGhlIGJoZWFkIHN0cnVjdHVyZSBpcyBhIG11bHRpcGxlIG9mIFNpemVRdWFudCBpbiBzaXplLiAqLworCit0eXBlZGVmIHVuaW9uIGJoZWFkIHsKKyAgICBLTVBfQUxJR04oIFNpemVRdWFudCApCisgICAgQWxpZ25UeXBlICAgICAgICAgICBiX2FsaWduOworICAgIGNoYXIgICAgICAgICAgICAgICAgYl9wYWRbIHNpemVvZihiaGVhZDJfdCkgKyAoU2l6ZVF1YW50IC0gKHNpemVvZihiaGVhZDJfdCkgJSBTaXplUXVhbnQpKSBdOworICAgIGJoZWFkMl90ICAgICAgICAgICAgYmI7Cit9IGJoZWFkX3Q7CisjZGVmaW5lIEJIKHApICAgKChiaGVhZF90ICopIChwKSkKKworLyogIEhlYWRlciBpbiBkaXJlY3RseSBhbGxvY2F0ZWQgYnVmZmVycyAoYnkgYWNxZmNuKSAqLworCit0eXBlZGVmIHN0cnVjdCBiZGhlYWQKK3sKKyAgICBidWZzaXplIHRzaXplOyAgICAgICAgICAgICAgICAgICAgLyogVG90YWwgc2l6ZSwgaW5jbHVkaW5nIG92ZXJoZWFkICovCisgICAgYmhlYWRfdCBiaDsgICAgICAgICAgICAgICAgICAgICAgIC8qIENvbW1vbiBoZWFkZXIgKi8KK30gYmRoZWFkX3Q7CisjZGVmaW5lIEJESChwKSAgKChiZGhlYWRfdCAqKSAocCkpCisKKy8qIEhlYWRlciBpbiBmcmVlIGJ1ZmZlcnMgKi8KKwordHlwZWRlZiBzdHJ1Y3QgYmZoZWFkIHsKKyAgICBiaGVhZF90ICBiaDsgICAgICAgICAgICAgICAgICAgICAgLyogQ29tbW9uIGFsbG9jYXRlZC9mcmVlIGhlYWRlciAqLworICAgIHFsaW5rc190IHFsOyAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rcyBvbiBmcmVlIGxpc3QgKi8KK30gYmZoZWFkX3Q7CisjZGVmaW5lIEJGSChwKSAgKChiZmhlYWRfdCAqKSAocCkpCisKK3R5cGVkZWYgc3RydWN0IHRocl9kYXRhIHsKKyAgICBiZmhlYWRfdCBmcmVlbGlzdFsgTUFYX0JHRVRfQklOUyBdOworI2lmIEJ1ZlN0YXRzCisgICAgc2l6ZV90IHRvdGFsbG9jOyAgICAgICAgICAgICAgIC8qIFRvdGFsIHNwYWNlIGN1cnJlbnRseSBhbGxvY2F0ZWQgKi8KKyAgICBsb25nIG51bWdldCwgbnVtcmVsOyAgICAgICAgICAgLyogTnVtYmVyIG9mIGJnZXQoKSBhbmQgYnJlbCgpIGNhbGxzICovCisgICAgbG9uZyBudW1wYmxrOyAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBwb29sIGJsb2NrcyAqLworICAgIGxvbmcgbnVtcGdldCwgbnVtcHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgZ2V0cyBhbmQgcmVscyAqLworICAgIGxvbmcgbnVtZGdldCwgbnVtZHJlbDsgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IGdldHMgYW5kIHJlbHMgKi8KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogQXV0b21hdGljIGV4cGFuc2lvbiBibG9jayBtYW5hZ2VtZW50IGZ1bmN0aW9ucyAqLworICAgIGJnZXRfY29tcGFjdF90IGNvbXBmY247CisgICAgYmdldF9hY3F1aXJlX3QgYWNxZmNuOworICAgIGJnZXRfcmVsZWFzZV90IHJlbGZjbjsKKworICAgIGJnZXRfbW9kZV90ICAgIG1vZGU7ICAgICAgICAgICAgICAvKiB3aGF0IGFsbG9jYXRpb24gbW9kZSB0byB1c2U/ICovCisKKyAgICBidWZzaXplIGV4cF9pbmNyOyAgICAgICAgICAgICAgICAgLyogRXhwYW5zaW9uIGJsb2NrIHNpemUgKi8KKyAgICBidWZzaXplIHBvb2xfbGVuOyAgICAgICAgICAgICAgICAgLyogMDogbm8gYnBvb2wgY2FsbHMgaGF2ZSBiZWVuIG1hZGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLTE6IG5vdCBhbGwgcG9vbCBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgc2FtZSBzaXplCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID4wOiAoY29tbW9uKSBibG9jayBzaXplIGZvciBhbGwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJwb29sIGNhbGxzIG1hZGUgc28gZmFyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisgICAgYmZoZWFkX3QgKiBsYXN0X3Bvb2w7ICAgICAgICAgICAgIC8qIExhc3QgcG9vbCBvd25lZCBieSB0aGlzIHRocmVhZCAoZGVsYXkgZGVhbG9jYXRpb24pICovCit9IHRocl9kYXRhX3Q7CisKKy8qICBNaW5pbXVtIGFsbG9jYXRpb24gcXVhbnR1bTogKi8KKworI2RlZmluZSBRTFNpemUgIChzaXplb2YocWxpbmtzX3QpKQorI2RlZmluZSBTaXplUSAgICgoU2l6ZVF1YW50ID4gUUxTaXplKSA/IFNpemVRdWFudCA6IFFMU2l6ZSkKKyNkZWZpbmUgTWF4U2l6ZSAoYnVmc2l6ZSkoIH4gKCAoIChidWZzaXplKSggMSApIDw8ICggc2l6ZW9mKCBidWZzaXplICkgKiBDSEFSX0JJVCAtIDEgKSApIHwgKCBTaXplUXVhbnQgLSAxICkgKSApCisgICAgLy8gTWF4aW11biBmb3IgdGhlIHJlcXVlc3RlZCBzaXplLgorCisvKiBFbmQgc2VudGluZWw6IHZhbHVlIHBsYWNlZCBpbiBic2l6ZSBmaWVsZCBvZiBkdW1teSBibG9jayBkZWxpbWl0aW5nCisgICBlbmQgb2YgcG9vbCBibG9jay4gIFRoZSBtb3N0IG5lZ2F0aXZlIG51bWJlciB3aGljaCB3aWxsICBmaXQgIGluICBhCisgICBidWZzaXplLCBkZWZpbmVkIGluIGEgd2F5IHRoYXQgdGhlIGNvbXBpbGVyIHdpbGwgYWNjZXB0LiAqLworCisjZGVmaW5lIEVTZW50ICAgKChidWZzaXplKSAoLSgoKCgoYnVmc2l6ZSkxKTw8KChpbnQpc2l6ZW9mKGJ1ZnNpemUpKjgtMikpLTEpKjIpLTIpKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhyZWFkIERhdGEgbWFuYWdlbWVudCByb3V0aW5lcyAqLworCitzdGF0aWMgaW50CitiZ2V0X2dldF9iaW4oIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgLy8gYmluYXJ5IGNob3AgYmlucworICAgIGludCBsbyA9IDAsIGhpID0gTUFYX0JHRVRfQklOUyAtIDE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID4gMCApOworCisgICAgd2hpbGUgKCAoaGkgLSBsbykgPiAxICkgeworICAgICAgICBpbnQgbWlkID0gKGxvICsgaGkpID4+IDE7CisgICAgICAgIGlmIChzaXplIDwgYmdldF9iaW5fc2l6ZVsgbWlkIF0pCisgICAgICAgICAgICBoaSA9IG1pZCAtIDE7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGxvID0gbWlkOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIChsbyA+PSAwKSAmJiAobG8gPCBNQVhfQkdFVF9CSU5TKSApOworCisgICAgcmV0dXJuIGxvOworfQorCitzdGF0aWMgdm9pZAorc2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaW50IGk7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPQorICAgICAgICAodGhyX2RhdGFfdCAqKSgKKyAgICAgICAgICAgICggISB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhICkgPyBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqZGF0YSApICkgOiB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhCisgICAgICAgICk7CisKKyAgICBtZW1zZXQoIGRhdGEsICdcMCcsIHNpemVvZiggKmRhdGEgKSApOworCisgICAgZm9yIChpID0gMDsgaSA8IE1BWF9CR0VUX0JJTlM7ICsraSkgeworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmZsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgICAgICBkYXRhLT5mcmVlbGlzdFsgaSBdLnFsLmJsaW5rID0gJiBkYXRhLT5mcmVlbGlzdFsgaSBdOworICAgIH0KKworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgPSBkYXRhOworICAgIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3QgPSAwOworI2lmICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgIF9fa21wX2luaXRfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisjZWxzZQorICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworI2VuZGlmIC8qIFVTRV9MT0NLX0ZPUl9CR0VUICovCisjZW5kaWYgLyogISBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworc3RhdGljIHRocl9kYXRhX3QgKgorZ2V0X3Rocl9kYXRhKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgdGhyX2RhdGFfdCAqZGF0YTsKKworICAgIGRhdGEgPSAodGhyX2RhdGFfdCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZGF0YSAhPSAwICk7CisKKyAgICByZXR1cm4gZGF0YTsKK30KKworCisjaWZkZWYgS01QX0RFQlVHCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3ZhbGlkYXRlX3F1ZXVlKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgLyogTk9URTogYXNzdW1lIHRoYXQgdGhlIGdsb2JhbF9sb2NrIGlzIGhlbGQgKi8KKworICAgIHZvaWQgKnAgPSAodm9pZCAqKSB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0OworCisgICAgd2hpbGUgKHAgIT0gMCkgeworICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgIT0gMCk7CisgICAgICAgIHAgPSAodm9pZCAqKSBiLT5xbC5mbGluazsKKyAgICB9Cit9CisKKyNlbmRpZgorCisvKiBXYWxrIHRoZSBmcmVlIGxpc3QgYW5kIHJlbGVhc2UgdGhlIGVucXVldWVkIGJ1ZmZlcnMgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfZGVxdWV1ZSgga21wX2luZm9fdCAqdGggKQoreworICAgIHZvaWQgKnAgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisKKyAgICBpZiAocCAhPSAwKSB7CisgICAgICAgICNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB2b2xhdGlsZSB2b2lkICpvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIoCisgICAgICAgICAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBOVUxMICkgKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICAgICAgICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfU1lOQ19QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHAgPSAodm9pZCAqKSBvbGRfdmFsdWU7CisgICAgICAgICAgICB9CisgICAgICAgICNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisgICAgICAgICAgICAjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aCkgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aC0+dGgudGhfbG9jYWwuYmdldF9sb2NrICk7CisgICAgICAgICAgICAjZW5kaWYgLyogVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVCAqLworCisgICAgICAgICAgICAgcCA9ICh2b2lkICopIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xpc3Q7CisgICAgICAgICAgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9IDA7CisKKyAgICAgICAgICAgICNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoKSApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAjZW5kaWYgLyogVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisKKyAgICAgICAgLyogQ2hlY2sgYWdhaW4gdG8gbWFrZSBzdXJlIHRoZSBsaXN0IGlzIG5vdCBlbXB0eSAqLworCisgICAgICAgIHdoaWxlIChwICE9IDApIHsKKyAgICAgICAgICAgIHZvaWQgKmJ1ZiA9IHA7CisgICAgICAgICAgICBiZmhlYWRfdCAqYiA9IEJGSCgoKGNoYXIgKikgcCkgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBiLT5iaC5iYi5ic2l6ZSAhPSAwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoIChrbXBfdWludHB0cl90KVRDUl9QVFIoYi0+YmguYmIuYnRocikgJiB+MSApID09CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmJsaW5rID09IDAgKTsKKworICAgICAgICAgICAgcCA9ICh2b2lkICopIGItPnFsLmZsaW5rOworCisgICAgICAgICAgICBicmVsKCB0aCwgYnVmICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIENoYWluIHRvZ2V0aGVyIHRoZSBmcmVlIGJ1ZmZlcnMgYnkgdXNpbmcgdGhlIHRocmVhZCBvd25lciBmaWVsZCAqLworCitzdGF0aWMgdm9pZAorX19rbXBfYmdldF9lbnF1ZXVlKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmCisjaWZkZWYgVVNFX1FVRVVJTkdfTE9DS19GT1JfQkdFVAorICAgICAgICAgICAgICAgICAgICAsIGttcF9pbnQzMiByZWxfZ3RpZAorI2VuZGlmCisgICAgICAgICAgICAgICAgICApCit7CisgICAgYmZoZWFkX3QgKmIgPSBCRkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+YmguYmIuYnNpemUgIT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICkgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgIChrbXBfdWludHB0cl90KXRoICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsKKworICAgIGItPnFsLmJsaW5rID0gMDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfYmdldF9lbnF1ZXVlOiBtb3ZpbmcgYnVmZmVyIHRvIFQjJWQgbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7CisKKyNpZiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQKKyAgICB7CisgICAgICAgIHZvbGF0aWxlIHZvaWQgKm9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgYmdldF9saXN0IHRvIGJ1ZiB0byBhdm9pZAorICAgICAgICAgICBleHBvc2luZyBhIGJyb2tlbiBsaXN0IHRvIG90aGVyIHRocmVhZHMsIGV2ZW4gZm9yIGFuIGluc3RhbnQuICovCisgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKworICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUigKKyAgICAgICAgICAgICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCwgb2xkX3ZhbHVlLCBidWYgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IFRDUl9QVFIodGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCk7CisgICAgICAgICAgICAvKiB0aGUgbmV4dCBwb2ludGVyIG11c3QgYmUgc2V0IGJlZm9yZSBzZXR0aW5nIGJnZXRfbGlzdCB0byBidWYgdG8gYXZvaWQKKyAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgIGItPnFsLmZsaW5rID0gQkZIKCBvbGRfdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlIC8qICEgVVNFX0NNUF9YQ0hHX0ZPUl9CR0VUICovCisjIGlmZGVmIFVTRV9RVUVVSU5HX0xPQ0tfRk9SX0JHRVQKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jaywgcmVsX2d0aWQgKTsKKyMgZWxzZQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbG9jayApOworICMgZW5kaWYKKworICAgIGItPnFsLmZsaW5rID0gQkZIKCB0aC0+dGgudGhfbG9jYWwuYmdldF9saXN0ICk7CisgICAgdGgtPnRoLnRoX2xvY2FsLmJnZXRfbGlzdCA9ICh2b2lkICopIGJ1ZjsKKworIyBpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2ssIHJlbF9ndGlkICk7CisjIGVsc2UKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRoLT50aC50aF9sb2NhbC5iZ2V0X2xvY2sgKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVU0VfQ01QX1hDSEdfRk9SX0JHRVQgKi8KK30KKworLyogaW5zZXJ0IGJ1ZmZlciBiYWNrIG9udG8gYSBuZXcgZnJlZWxpc3QgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRocl9kYXRhX3QgKnRociwgYmZoZWFkX3QgKmIgKQoreworICAgIGludCBiaW47CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCliICkgJSBTaXplUXVhbnQgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPmJoLmJiLmJzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIGJpbiA9IGJnZXRfZ2V0X2JpbiggYi0+YmguYmIuYnNpemUgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQodGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmstPnFsLmZsaW5rID09ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluay0+cWwuYmxpbmsgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKTsKKworICAgIGItPnFsLmZsaW5rID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgIGItPnFsLmJsaW5rID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbms7CisKKyAgICB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5ibGluayA9IGI7CisgICAgYi0+cWwuYmxpbmstPnFsLmZsaW5rID0gYjsKK30KKworLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiZmhlYWRfdCAqYiApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5ibGluay0+cWwuZmxpbmsgPT0gYik7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5xbC5mbGluay0+cWwuYmxpbmsgPT0gYik7CisKKyAgICBiLT5xbC5ibGluay0+cWwuZmxpbmsgPSBiLT5xbC5mbGluazsKKyAgICBiLT5xbC5mbGluay0+cWwuYmxpbmsgPSBiLT5xbC5ibGluazsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qICBHRVQgU1RBVFMgLS0gY2hlY2sgaW5mbyBvbiBmcmVlIGxpc3QgKi8KKworc3RhdGljIHZvaWQKK2JjaGVjayggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICptYXhfZnJlZSwgYnVmc2l6ZSAqdG90YWxfZnJlZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGludCBiaW47CisKKyAgICAqdG90YWxfZnJlZSA9ICptYXhfZnJlZSA9IDA7CisKKyAgICBmb3IgKGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluKSB7CisgICAgICAgIGJmaGVhZF90ICpiLCAqYmVzdDsKKworICAgICAgICBiZXN0ID0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOworICAgICAgICBiID0gYmVzdC0+cWwuZmxpbms7CisKKyAgICAgICAgd2hpbGUgKGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB7CisgICAgICAgICAgICAqdG90YWxfZnJlZSArPSAoYi0+YmguYmIuYnNpemUgLSBzaXplb2YoIGJoZWFkX3QgKSk7CisgICAgICAgICAgICBpZiAoKGJlc3QgPT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdKSB8fCAoYi0+YmguYmIuYnNpemUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkpCisgICAgICAgICAgICAgICAgYmVzdCA9IGI7CisKKyAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsKKyAgICAgICAgfQorCisgICAgICAgIGlmICgqbWF4X2ZyZWUgPCBiZXN0LT5iaC5iYi5ic2l6ZSkKKyAgICAgICAgICAgICptYXhfZnJlZSA9IGJlc3QtPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIGlmICgqbWF4X2ZyZWUgPiAoYnVmc2l6ZSlzaXplb2YoIGJoZWFkX3QgKSkKKyAgICAgICAgKm1heF9mcmVlIC09IHNpemVvZiggYmhlYWRfdCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJHRVQgIC0tICBBbGxvY2F0ZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXQoICBrbXBfaW5mb190ICp0aCwgYnVmc2l6ZSByZXF1ZXN0ZWRfc2l6ZSApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJ1ZnNpemUgc2l6ZSA9IHJlcXVlc3RlZF9zaXplOworICAgIGJmaGVhZF90ICpiOworICAgIHZvaWQgKmJ1ZjsKKyAgICBpbnQgY29tcGFjdHNlcSA9IDA7CisgICAgaW50IHVzZV9ibGluayA9IDA7CisvKiBGb3IgQmVzdEZpdCAqLworICAgIGJmaGVhZF90ICpiZXN0OworCisgICAgaWYgKCBzaXplIDwgMCB8fCBzaXplICsgc2l6ZW9mKCBiaGVhZF90ICkgPiBNYXhTaXplICkgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBpZiAoc2l6ZSA8IChidWZzaXplKVNpemVRKSB7ICAgICAgLyogTmVlZCBhdCBsZWFzdCByb29tIGZvciB0aGUgKi8KKyAgICAgICAgc2l6ZSA9IFNpemVROyAgICAgICAgICAgICAgICAgLyogICAgcXVldWUgbGlua3MuICAqLworICAgIH0KKyAgICAjaWYgZGVmaW5lZCggU2l6ZVF1YW50ICkgJiYgKCBTaXplUXVhbnQgPiAxICkKKyAgICAgICAgc2l6ZSA9IChzaXplICsgKFNpemVRdWFudCAtIDEpKSAmICh+KFNpemVRdWFudCAtIDEpKTsKKyAgICAjZW5kaWYKKworICAgIHNpemUgKz0gc2l6ZW9mKGJoZWFkX3QpOyAgICAgLyogQWRkIG92ZXJoZWFkIGluIGFsbG9jYXRlZCBidWZmZXIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdG8gc2l6ZSByZXF1aXJlZC4gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID49IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplICUgU2l6ZVF1YW50ID09IDAgKTsKKworICAgIHVzZV9ibGluayA9ICggdGhyLT5tb2RlID09IGJnZXRfbW9kZV9saWZvICk7CisKKyAgICAvKiBJZiBhIGNvbXBhY3QgZnVuY3Rpb24gd2FzIHByb3ZpZGVkIGluIHRoZSBjYWxsIHRvIGJlY3RsKCksIHdyYXAKKyAgICAgICBhIGxvb3AgYXJvdW5kIHRoZSBhbGxvY2F0aW9uIHByb2Nlc3MgIHRvICBhbGxvdyAgY29tcGFjdGlvbiAgdG8KKyAgICAgICBpbnRlcnZlbmUgaW4gY2FzZSB3ZSBkb24ndCBmaW5kIGEgc3VpdGFibGUgYnVmZmVyIGluIHRoZSBjaGFpbi4gKi8KKworICAgIGZvciAoOzspIHsKKyAgICAgICAgaW50IGJpbjsKKworICAgICAgICBmb3IgKGJpbiA9IGJnZXRfZ2V0X2Jpbiggc2l6ZSApOyBiaW4gPCBNQVhfQkdFVF9CSU5TOyArK2JpbikgeworICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgYiA9ICggdXNlX2JsaW5rID8gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuYmxpbmsgOiB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluayApOworCisgICAgICAgICAgICBpZiAodGhyLT5tb2RlID09IGJnZXRfbW9kZV9iZXN0KSB7CisgICAgICAgICAgICAgICAgYmVzdCA9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXTsKKworICAgICAgICAgICAgICAgIC8qIFNjYW4gdGhlIGZyZWUgbGlzdCBzZWFyY2hpbmcgZm9yIHRoZSBmaXJzdCBidWZmZXIgYmlnIGVub3VnaAorICAgICAgICAgICAgICAgICAgIHRvIGhvbGQgdGhlIHJlcXVlc3RlZCBzaXplIGJ1ZmZlci4gKi8KKworICAgICAgICAgICAgICAgIHdoaWxlIChiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSkgeworICAgICAgICAgICAgICAgICAgICBpZiAoYi0+YmguYmIuYnNpemUgPj0gKGJ1ZnNpemUpIHNpemUpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICgoYmVzdCA9PSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHx8IChiLT5iaC5iYi5ic2l6ZSA8IGJlc3QtPmJoLmJiLmJzaXplKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJlc3QgPSBiOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGIgPSBiZXN0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgICAgICBpZiAoKGJ1ZnNpemUpIGItPmJoLmJiLmJzaXplID49IChidWZzaXplKSBzaXplKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogQnVmZmVyICBpcyBiaWcgZW5vdWdoIHRvIHNhdGlzZnkgIHRoZSByZXF1ZXN0LiAgQWxsb2NhdGUgaXQKKyAgICAgICAgICAgICAgICAgICAgICAgdG8gdGhlIGNhbGxlci4gIFdlIG11c3QgZGVjaWRlIHdoZXRoZXIgdGhlIGJ1ZmZlciBpcyAgbGFyZ2UKKyAgICAgICAgICAgICAgICAgICAgICAgZW5vdWdoICB0byAgc3BsaXQgIGludG8gIHRoZSBwYXJ0IGdpdmVuIHRvIHRoZSBjYWxsZXIgYW5kIGEKKyAgICAgICAgICAgICAgICAgICAgICAgZnJlZSBidWZmZXIgdGhhdCByZW1haW5zIG9uIHRoZSBmcmVlIGxpc3QsIG9yICB3aGV0aGVyICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgZW50aXJlICBidWZmZXIgIHNob3VsZCAgYmUgIHJlbW92ZWQgIGZyb20gdGhlIGZyZWUgbGlzdCBhbmQKKyAgICAgICAgICAgICAgICAgICAgICAgZ2l2ZW4gdG8gdGhlIGNhbGxlciBpbiBpdHMgZW50aXJldHkuICAgV2UgIG9ubHkgIHNwbGl0ICB0aGUKKyAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyIGlmIGVub3VnaCByb29tIHJlbWFpbnMgZm9yIGEgaGVhZGVyIHBsdXMgdGhlIG1pbmltdW0KKyAgICAgICAgICAgICAgICAgICAgICAgcXVhbnR1bSBvZiBhbGxvY2F0aW9uLiAqLworCisgICAgICAgICAgICAgICAgICAgIGlmICgoYi0+YmguYmIuYnNpemUgLSAoYnVmc2l6ZSkgc2l6ZSkgPiAoYnVmc2l6ZSkoU2l6ZVEgKyAoc2l6ZW9mKGJoZWFkX3QpKSkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJoZWFkX3QgKmJhLCAqYm47CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgKGItPmJoLmJiLmJzaXplIC0gKGJ1ZnNpemUpIHNpemUpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJuID0gQkgoKChjaGFyICopIGJhKSArIHNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJuLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFN1YnRyYWN0IHNpemUgZnJvbSBsZW5ndGggb2YgZnJlZSBibG9jay4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGItPmJoLmJiLmJzaXplIC09IChidWZzaXplKSBzaXplOworCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBMaW5rIGFsbG9jYXRlZCBidWZmZXIgdG8gdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFBsdWcgbmVnYXRpdmUgc2l6ZSBpbnRvIHVzZXIgYnVmZmVyLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLmJzaXplID0gLXNpemU7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgdGhpcyBidWZmZXIgYXMgb3duZWQgYnkgdGhpcyB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgICAgICAgICBUQ1dfUFRSKGJhLT5iYi5idGhyLCB0aCk7ICAgLy8gbm90IGFuIGFsbG9jYXRlZCBhZGRyZXNzIChkbyBub3QgbWFyayBpdCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIE1hcmsgYnVmZmVyIGFmdGVyIHRoaXMgb25lIG5vdCBwcmVjZWRlZCBieSBmcmVlIGJsb2NrLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYm4tPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogdW5saW5rIHRoZSBidWZmZXIgZnJvbSB0aGUgb2xkIGZyZWVsaXN0LCBhbmQgcmVpbnNlcnQgaXQgaW50byB0aGUgbmV3IGZyZWVsaXN0ICovCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X2luc2VydF9pbnRvX2ZyZWVsaXN0KCB0aHIsIGIgKTsKKyNpZiBCdWZTdGF0cworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgICAgICAgICAgdGhyLT5udW1nZXQrKzsgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYmdldCgpIGNhbGxzICovCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICh2b2lkICopICgoKChjaGFyICopIGJhKSArIHNpemVvZihiaGVhZF90KSkpOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gYnVmOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgYmhlYWRfdCAqYmE7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhID0gQkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhLT5iYi5wcmV2ZnJlZSA9PSBiLT5iaC5iYi5ic2l6ZSk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8qIFRoZSBidWZmZXIgaXNuJ3QgYmlnIGVub3VnaCB0byBzcGxpdC4gIEdpdmUgIHRoZSAgd2hvbGUKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHNoZWJhbmcgdG8gdGhlIGNhbGxlciBhbmQgcmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdC4gKi8KKworICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisgICAgICAgICAgICAgICAgICAgICAgICB0aHItPm51bWdldCsrOyAgICAgICAgLyogSW5jcmVtZW50IG51bWJlciBvZiBiZ2V0KCkgY2FsbHMgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgLyogTmVnYXRlIHNpemUgdG8gbWFyayBidWZmZXIgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYi0+YmguYmIuYnNpemUgPSAtKGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogTWFyayB0aGlzIGJ1ZmZlciBhcyBvd25lZCBieSB0aGlzIHRocmVhZC4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIFRDV19QVFIoYmEtPmJiLmJ0aHIsIHRoKTsgICAvLyBub3QgYW4gYWxsb2NhdGVkIGFkZHJlc3MgKGRvIG5vdCBtYXJrIGl0KQorICAgICAgICAgICAgICAgICAgICAgICAgLyogWmVybyB0aGUgYmFjayBwb2ludGVyIGluIHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRvIGluZGljYXRlIHRoYXQgdGhpcyBidWZmZXIgaXMgYWxsb2NhdGVkLiAqLworICAgICAgICAgICAgICAgICAgICAgICAgYmEtPmJiLnByZXZmcmVlID0gMDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogR2l2ZSB1c2VyIGJ1ZmZlciBzdGFydGluZyBhdCBxdWV1ZSBsaW5rcy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAmKGItPnFsKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICgoc2l6ZV90KWJ1ZikgJSBTaXplUXVhbnQgPT0gMCApOworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8qIExpbmsgdG8gbmV4dCBidWZmZXIgKi8KKyAgICAgICAgICAgICAgICBiID0gKCB1c2VfYmxpbmsgPyBiLT5xbC5ibGluayA6IGItPnFsLmZsaW5rICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBXZSBmYWlsZWQgdG8gZmluZCBhIGJ1ZmZlci4gIElmIHRoZXJlJ3MgYSBjb21wYWN0ICBmdW5jdGlvbgorICAgICAgICAgICBkZWZpbmVkLCAgbm90aWZ5ICBpdCAgb2YgdGhlIHNpemUgcmVxdWVzdGVkLiAgSWYgaXQgcmV0dXJucworICAgICAgICAgICBUUlVFLCB0cnkgdGhlIGFsbG9jYXRpb24gYWdhaW4uICovCisKKyAgICAgICAgaWYgKCh0aHItPmNvbXBmY24gPT0gMCkgfHwgKCEoKnRoci0+Y29tcGZjbikoc2l6ZSwgKytjb21wYWN0c2VxKSkpIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorCisgICAgLyogTm8gYnVmZmVyIGF2YWlsYWJsZSB3aXRoIHJlcXVlc3RlZCBzaXplIGZyZWUuICovCisKKyAgICAvKiBEb24ndCBnaXZlIHVwIHlldCAtLSBsb29rIGluIHRoZSByZXNlcnZlIHN1cHBseS4gKi8KKworICAgIGlmICh0aHItPmFjcWZjbiAhPSAwKSB7CisgICAgICAgIGlmIChzaXplID4gKGJ1ZnNpemUpICh0aHItPmV4cF9pbmNyIC0gc2l6ZW9mKGJoZWFkX3QpKSkgeworCisgICAgICAgICAgICAvKiBSZXF1ZXN0ICBpcyAgdG9vICBsYXJnZSAgdG8gIGZpdCBpbiBhIHNpbmdsZSBleHBhbnNpb24KKyAgICAgICAgICAgICAgIGJsb2NrLiAgVHJ5IHRvIHNhdGlzeSBpdCBieSBhIGRpcmVjdCBidWZmZXIgYWNxdWlzaXRpb24uICovCisKKyAgICAgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgICAgIHNpemUgKz0gc2l6ZW9mKGJkaGVhZF90KSAtIHNpemVvZihiaGVhZF90KTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0MoICVkIClcbiIsIChpbnQpIHNpemUgKSApOworCisgICAgICAgICAgICAvKiByaWNocnlhbiAqLworICAgICAgICAgICAgYmRoID0gQkRIKCgqdGhyLT5hY3FmY24pKChidWZzaXplKSBzaXplKSk7CisgICAgICAgICAgICBpZiAoYmRoICE9IE5VTEwpIHsKKworICAgICAgICAgICAgICAgIC8qICBNYXJrIHRoZSBidWZmZXIgc3BlY2lhbCBieSBzZXR0aW5nIHRoZSBzaXplIGZpZWxkCisgICAgICAgICAgICAgICAgICAgIG9mIGl0cyBoZWFkZXIgdG8gemVyby4gICovCisgICAgICAgICAgICAgICAgYmRoLT5iaC5iYi5ic2l6ZSA9IDA7CisKKyAgICAgICAgICAgICAgICAvKiBNYXJrIHRoaXMgYnVmZmVyIGFzIG93bmVkIGJ5IHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIFRDV19QVFIoYmRoLT5iaC5iYi5idGhyLCB0aCk7ICAvLyBkb24ndCBtYXJrIGJ1ZmZlciBhcyBhbGxvY2F0ZWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgZGlyZWN0IGJ1ZmZlciBuZXZlciBnb2VzIHRvIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIGJkaC0+YmguYmIucHJldmZyZWUgPSAwOworICAgICAgICAgICAgICAgIGJkaC0+dHNpemUgPSBzaXplOworI2lmIEJ1ZlN0YXRzCisgICAgICAgICAgICAgICAgdGhyLT50b3RhbGxvYyArPSAoc2l6ZV90KSBzaXplOworICAgICAgICAgICAgICAgIHRoci0+bnVtZ2V0Kys7ICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJnZXQoKSBjYWxscyAqLworICAgICAgICAgICAgICAgIHRoci0+bnVtZGdldCsrOyAgICAgICAvKiBEaXJlY3QgYmdldCgpIGNhbGwgY291bnQgKi8KKyNlbmRpZgorICAgICAgICAgICAgICAgIGJ1ZiA9ICAodm9pZCAqKSAoYmRoICsgMSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKworICAgICAgICB9IGVsc2UgeworCisgICAgICAgICAgICAvKiAgVHJ5IHRvIG9idGFpbiBhIG5ldyBleHBhbnNpb24gYmxvY2sgKi8KKworICAgICAgICAgICAgdm9pZCAqbmV3cG9vbDsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBNQUxMT0NCKCAlZCApXG4iLCAoaW50KSB0aHItPmV4cF9pbmNyICkgKTsKKworICAgICAgICAgICAgLyogcmljaHJ5YW4gKi8KKyAgICAgICAgICAgIG5ld3Bvb2wgPSAoKnRoci0+YWNxZmNuKSgoYnVmc2l6ZSkgdGhyLT5leHBfaW5jcik7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoKHNpemVfdCluZXdwb29sKSAlIFNpemVRdWFudCA9PSAwICk7CisgICAgICAgICAgICBpZiAobmV3cG9vbCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnBvb2woIHRoLCBuZXdwb29sLCB0aHItPmV4cF9pbmNyKTsKKyAgICAgICAgICAgICAgICBidWYgPSAgYmdldCggdGgsIHJlcXVlc3RlZF9zaXplKTsgIC8qIFRoaXMgY2FuJ3QsIEkgc2F5LCBjYW4ndCBnZXQgaW50byBhIGxvb3AuICovCisgICAgICAgICAgICAgICAgcmV0dXJuIGJ1ZjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIC8qICBTdGlsbCBubyBidWZmZXIgYXZhaWxhYmxlICovCisKKyAgICByZXR1cm4gTlVMTDsKK30KKworLyogIEJHRVRaICAtLSAgQWxsb2NhdGUgYSBidWZmZXIgYW5kIGNsZWFyIGl0cyBjb250ZW50cyB0byB6ZXJvLiAgV2UgY2xlYXIKKyAgICAgICAgICAgICAgIHRoZSAgZW50aXJlICBjb250ZW50cyAgb2YgIHRoZSBidWZmZXIgdG8gemVybywgbm90IGp1c3QgdGhlCisgICAgICAgICAgICAgICByZWdpb24gcmVxdWVzdGVkIGJ5IHRoZSBjYWxsZXIuICovCisKK3N0YXRpYyB2b2lkICoKK2JnZXR6KCAga21wX2luZm9fdCAqdGgsIGJ1ZnNpemUgc2l6ZSApCit7CisgICAgY2hhciAqYnVmID0gKGNoYXIgKikgYmdldCggdGgsIHNpemUpOworCisgICAgaWYgKGJ1ZiAhPSBOVUxMKSB7CisgICAgICAgIGJoZWFkX3QgKmI7CisgICAgICAgIGJ1ZnNpemUgcnNpemU7CisKKyAgICAgICAgYiA9IEJIKGJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisgICAgICAgIHJzaXplID0gLShiLT5iYi5ic2l6ZSk7CisgICAgICAgIGlmIChyc2l6ZSA9PSAwKSB7CisgICAgICAgICAgICBiZGhlYWRfdCAqYmQ7CisKKyAgICAgICAgICAgIGJkID0gQkRIKGJ1ZiAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICAgICAgcnNpemUgPSBiZC0+dHNpemUgLSAoYnVmc2l6ZSkgc2l6ZW9mKGJkaGVhZF90KTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJzaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocnNpemUgPj0gc2l6ZSk7CisKKyAgICAgICAgKHZvaWQpIG1lbXNldChidWYsIDAsIChidWZzaXplKSByc2l6ZSk7CisgICAgfQorICAgIHJldHVybiAoKHZvaWQgKikgYnVmKTsKK30KKworLyogIEJHRVRSICAtLSAgUmVhbGxvY2F0ZSBhIGJ1ZmZlci4gIFRoaXMgaXMgYSBtaW5pbWFsIGltcGxlbWVudGF0aW9uLAorICAgICAgICAgICAgICAgc2ltcGx5IGluIHRlcm1zIG9mIGJyZWwoKSAgYW5kICBiZ2V0KCkuICAgSXQgIGNvdWxkICBiZQorICAgICAgICAgICAgICAgZW5oYW5jZWQgdG8gYWxsb3cgdGhlIGJ1ZmZlciB0byBncm93IGludG8gYWRqYWNlbnQgZnJlZQorICAgICAgICAgICAgICAgYmxvY2tzIGFuZCB0byBhdm9pZCBtb3ZpbmcgZGF0YSB1bm5lY2Vzc2FyaWx5LiAgKi8KKworc3RhdGljIHZvaWQgKgorYmdldHIoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmLCBidWZzaXplIHNpemUpCit7CisgICAgdm9pZCAqbmJ1ZjsKKyAgICBidWZzaXplIG9zaXplOyAgICAgICAgICAgICAgICAgICAgLyogT2xkIHNpemUgb2YgYnVmZmVyICovCisgICAgYmhlYWRfdCAqYjsKKworICAgIG5idWYgPSBiZ2V0KCB0aCwgc2l6ZSApOworICAgIGlmICggbmJ1ZiA9PSBOVUxMICkgeyAvKiBBY3F1aXJlIG5ldyBidWZmZXIgKi8KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIGlmICggYnVmID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybiBuYnVmOworICAgIH0KKyAgICBiID0gQkgoKChjaGFyICopIGJ1ZikgLSBzaXplb2YoYmhlYWRfdCkpOworICAgIG9zaXplID0gLWItPmJiLmJzaXplOworICAgIGlmIChvc2l6ZSA9PSAwKSB7CisgICAgICAgIC8qICBCdWZmZXIgYWNxdWlyZWQgZGlyZWN0bHkgdGhyb3VnaCBhY3FmY24uICovCisgICAgICAgIGJkaGVhZF90ICpiZDsKKworICAgICAgICBiZCA9IEJESCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiZGhlYWRfdCkpOworICAgICAgICBvc2l6ZSA9IGJkLT50c2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmRoZWFkX3QpOworICAgIH0gZWxzZSB7CisgICAgICAgIG9zaXplIC09IHNpemVvZihiaGVhZF90KTsKKyAgICB9OworCisgICAgS01QX0RFQlVHX0FTU0VSVChvc2l6ZSA+IDApOworCisgICAgKHZvaWQpIEtNUF9NRU1DUFkoKGNoYXIgKikgbmJ1ZiwgKGNoYXIgKikgYnVmLCAvKiBDb3B5IHRoZSBkYXRhICovCisgICAgICAgICAgICAgKHNpemVfdCkgKChzaXplIDwgb3NpemUpID8gc2l6ZSA6IG9zaXplKSk7CisgICAgYnJlbCggdGgsIGJ1ZiApOworCisgICAgcmV0dXJuIG5idWY7Cit9CisKKy8qICBCUkVMICAtLSAgUmVsZWFzZSBhIGJ1ZmZlci4gICovCisKK3N0YXRpYyB2b2lkCiticmVsKCAga21wX2luZm9fdCAqdGgsIHZvaWQgKmJ1ZiApCit7CisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiLCAqYm47CisgICAga21wX2luZm9fdCAqYnRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKChzaXplX3QpYnVmKSAlIFNpemVRdWFudCA9PSAwICk7CisKKyAgICBiID0gQkZIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJoZWFkX3QpKTsKKworICAgIGlmIChiLT5iaC5iYi5ic2l6ZSA9PSAwKSB7ICAgICAgICAvKiBEaXJlY3RseS1hY3F1aXJlZCBidWZmZXI/ICovCisgICAgICAgIGJkaGVhZF90ICpiZGg7CisKKyAgICAgICAgYmRoID0gQkRIKCgoY2hhciAqKSBidWYpIC0gc2l6ZW9mKGJkaGVhZF90KSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIucHJldmZyZWUgPT0gMCk7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgdGhyLT50b3RhbGxvYyAtPSAoc2l6ZV90KSBiZGgtPnRzaXplOworICAgICAgICB0aHItPm51bWRyZWwrKzsgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgZGlyZWN0IHJlbGVhc2VzICovCisgICAgICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgIC8qIEluY3JlbWVudCBudW1iZXIgb2YgYnJlbCgpIGNhbGxzICovCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAodm9pZCkgbWVtc2V0KChjaGFyICopIGJ1ZiwgMHg1NSwKKyAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJkaC0+dHNpemUgLSBzaXplb2YoYmRoZWFkX3QpKSk7CisjZW5kaWYgLyogRnJlZVdpcGUgKi8KKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGJkaCApICk7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT5yZWxmY24gIT0gMCApOworICAgICAgICAoKnRoci0+cmVsZmNuKSgodm9pZCAqKSBiZGgpOyAgICAgIC8qIFJlbGVhc2UgaXQgZGlyZWN0bHkuICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBidGggPSAoa21wX2luZm9fdCAqKSggKGttcF91aW50cHRyX3QpVENSX1BUUihiLT5iaC5iYi5idGhyKSAmIH4xICk7IC8vIGNsZWFyIHBvc3NpYmxlIG1hcmsgYmVmb3JlIGNvbXBhcmlzb24KKyAgICBpZiAoIGJ0aCAhPSB0aCApIHsKKyAgICAgICAgLyogQWRkIHRoaXMgYnVmZmVyIHRvIGJlIHJlbGVhc2VkIGJ5IHRoZSBvd25pbmcgdGhyZWFkIGxhdGVyICovCisgICAgICAgIF9fa21wX2JnZXRfZW5xdWV1ZSggYnRoLCBidWYKKyNpZmRlZiBVU0VfUVVFVUlOR19MT0NLX0ZPUl9CR0VUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApCisjZW5kaWYKKyAgICAgICAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIEJ1ZmZlciBzaXplIG11c3QgYmUgbmVnYXRpdmUsIGluZGljYXRpbmcgdGhhdCB0aGUgYnVmZmVyIGlzCisgICAgICAgYWxsb2NhdGVkLiAqLworCisgICAgaWYgKGItPmJoLmJiLmJzaXplID49IDApIHsKKyAgICAgICAgYm4gPSBOVUxMOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLmJzaXplIDwgMCk7CisKKyAgICAvKiAgQmFjayBwb2ludGVyIGluIG5leHQgYnVmZmVyIG11c3QgYmUgemVybywgaW5kaWNhdGluZyB0aGUKKyAgICAgICAgc2FtZSB0aGluZzogKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiAtIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gMCk7CisKKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcmVsKys7ICAgICAgICAgICAgICAgICAgICAvKiBJbmNyZW1lbnQgbnVtYmVyIG9mIGJyZWwoKSBjYWxscyAqLworICAgIHRoci0+dG90YWxsb2MgKz0gKHNpemVfdCkgYi0+YmguYmIuYnNpemU7CisjZW5kaWYKKworICAgIC8qIElmIHRoZSBiYWNrIGxpbmsgaXMgbm9uemVybywgdGhlIHByZXZpb3VzIGJ1ZmZlciBpcyBmcmVlLiAgKi8KKworICAgIGlmIChiLT5iaC5iYi5wcmV2ZnJlZSAhPSAwKSB7CisgICAgICAgIC8qIFRoZSBwcmV2aW91cyBidWZmZXIgaXMgZnJlZS4gIENvbnNvbGlkYXRlIHRoaXMgYnVmZmVyICB3aXRoICBpdAorICAgICAgICAgICBieSAgYWRkaW5nICB0aGUgIGxlbmd0aCAgb2YgIHRoaXMgIGJ1ZmZlciAgdG8gdGhlIHByZXZpb3VzIGZyZWUKKyAgICAgICAgICAgYnVmZmVyLiAgTm90ZSB0aGF0IHdlIHN1YnRyYWN0IHRoZSBzaXplICBpbiAgdGhlICBidWZmZXIgIGJlaW5nCisgICAgICAgICAgIHJlbGVhc2VkLCAgc2luY2UgIGl0J3MgIG5lZ2F0aXZlIHRvIGluZGljYXRlIHRoYXQgdGhlIGJ1ZmZlciBpcworICAgICAgICAgICBhbGxvY2F0ZWQuICovCisKKyAgICAgICAgcmVnaXN0ZXIgYnVmc2l6ZSBzaXplID0gYi0+YmguYmIuYnNpemU7CisKKyAgICAgICAgLyogTWFrZSB0aGUgcHJldmlvdXMgYnVmZmVyIHRoZSBvbmUgd2UncmUgd29ya2luZyBvbi4gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiIC0gYi0+YmguYmIucHJldmZyZWUpLT5iYi5ic2l6ZSA9PSBiLT5iaC5iYi5wcmV2ZnJlZSk7CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpIC0gYi0+YmguYmIucHJldmZyZWUpOworICAgICAgICBiLT5iaC5iYi5ic2l6ZSAtPSBzaXplOworCisgICAgICAgIC8qIHVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIG9sZCBmcmVlbGlzdCAqLworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvKiBUaGUgcHJldmlvdXMgYnVmZmVyIGlzbid0IGFsbG9jYXRlZC4gIE1hcmsgdGhpcyBidWZmZXIKKyAgICAgICAgICAgc2l6ZSBhcyBwb3NpdGl2ZSAoaS5lLiBmcmVlKSBhbmQgZmFsbCB0aHJvdWdoIHRvIHBsYWNlCisgICAgICAgICAgIHRoZSBidWZmZXIgb24gdGhlIGZyZWUgbGlzdCBhcyBhbiBpc29sYXRlZCBmcmVlIGJsb2NrLiAqLworCisgICAgICAgIGItPmJoLmJiLmJzaXplID0gLWItPmJoLmJiLmJzaXplOworICAgIH0KKworICAgIC8qIGluc2VydCBidWZmZXIgYmFjayBvbnRvIGEgbmV3IGZyZWVsaXN0ICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKworICAgIC8qIE5vdyB3ZSBsb29rIGF0IHRoZSBuZXh0IGJ1ZmZlciBpbiBtZW1vcnksIGxvY2F0ZWQgYnkgYWR2YW5jaW5nIGZyb20KKyAgICAgICB0aGUgIHN0YXJ0ICBvZiAgdGhpcyAgYnVmZmVyICBieSBpdHMgc2l6ZSwgdG8gc2VlIGlmIHRoYXQgYnVmZmVyIGlzCisgICAgICAgZnJlZS4gIElmIGl0IGlzLCB3ZSBjb21iaW5lICB0aGlzICBidWZmZXIgIHdpdGggIHRoZSAgbmV4dCAgb25lICBpbgorICAgICAgIG1lbW9yeSwgZGVjaGFpbmluZyB0aGUgc2Vjb25kIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QuICovCisKKyAgICBibiA9ICBCRkgoKChjaGFyICopIGIpICsgYi0+YmguYmIuYnNpemUpOworICAgIGlmIChibi0+YmguYmIuYnNpemUgPiAwKSB7CisKKyAgICAgICAgLyogVGhlIGJ1ZmZlciBpcyBmcmVlLiAgUmVtb3ZlIGl0IGZyb20gdGhlIGZyZWUgbGlzdCBhbmQgYWRkCisgICAgICAgICAgIGl0cyBzaXplIHRvIHRoYXQgb2Ygb3VyIGJ1ZmZlci4gKi8KKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGJuICsgYm4tPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYm4tPmJoLmJiLmJzaXplKTsKKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBibiApOworCisgICAgICAgIGItPmJoLmJiLmJzaXplICs9IGJuLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAvKiB1bmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBvbGQgZnJlZWxpc3QsIGFuZCByZWluc2VydCBpdCBpbnRvIHRoZSBuZXcgZnJlZWxpc3QgKi8KKworICAgICAgICBfX2ttcF9iZ2V0X3JlbW92ZV9mcm9tX2ZyZWVsaXN0KCBiICk7CisgICAgICAgIF9fa21wX2JnZXRfaW5zZXJ0X2ludG9fZnJlZWxpc3QoIHRociwgYiApOworCisgICAgICAgIC8qIEZpbmFsbHksICBhZHZhbmNlICB0byAgIHRoZSAgYnVmZmVyICB0aGF0ICAgZm9sbG93cyAgdGhlICBuZXdseQorICAgICAgICAgICBjb25zb2xpZGF0ZWQgZnJlZSBibG9jay4gIFdlIG11c3Qgc2V0IGl0cyAgYmFja3BvaW50ZXIgIHRvICB0aGUKKyAgICAgICAgICAgaGVhZCAgb2YgIHRoZSAgY29uc29saWRhdGVkIGZyZWUgYmxvY2suICBXZSBrbm93IHRoZSBuZXh0IGJsb2NrCisgICAgICAgICAgIG11c3QgYmUgYW4gYWxsb2NhdGVkIGJsb2NrIGJlY2F1c2UgdGhlIHByb2Nlc3Mgb2YgcmVjb21iaW5hdGlvbgorICAgICAgICAgICBndWFyYW50ZWVzICB0aGF0ICB0d28gIGZyZWUgIGJsb2NrcyB3aWxsIG5ldmVyIGJlIGNvbnRpZ3VvdXMgaW4KKyAgICAgICAgICAgbWVtb3J5LiAgKi8KKworICAgICAgICBibiA9IEJGSCgoKGNoYXIgKikgYikgKyBiLT5iaC5iYi5ic2l6ZSk7CisgICAgfQorI2lmZGVmIEZyZWVXaXBlCisgICAgKHZvaWQpIG1lbXNldCgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpLCAweDU1LAorICAgICAgICAgICAgKHNpemVfdCkgKGItPmJoLmJiLmJzaXplIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVChibi0+YmguYmIuYnNpemUgPCAwKTsKKworICAgIC8qIFRoZSBuZXh0IGJ1ZmZlciBpcyBhbGxvY2F0ZWQuICBTZXQgdGhlIGJhY2twb2ludGVyIGluIGl0ICB0byAgcG9pbnQKKyAgICAgICB0byB0aGlzIGJ1ZmZlcjsgdGhlIHByZXZpb3VzIGZyZWUgYnVmZmVyIGluIG1lbW9yeS4gKi8KKworICAgIGJuLT5iaC5iYi5wcmV2ZnJlZSA9IGItPmJoLmJiLmJzaXplOworCisgICAgLyogIElmICBhICBibG9jay1yZWxlYXNlIGZ1bmN0aW9uIGlzIGRlZmluZWQsIGFuZCB0aGlzIGZyZWUgYnVmZmVyCisgICAgICAgIGNvbnN0aXR1dGVzIHRoZSBlbnRpcmUgYmxvY2ssIHJlbGVhc2UgaXQuICBOb3RlIHRoYXQgIHBvb2xfbGVuCisgICAgICAgIGlzICBkZWZpbmVkICBpbiAgc3VjaCBhIHdheSB0aGF0IHRoZSB0ZXN0IHdpbGwgZmFpbCB1bmxlc3MgYWxsCisgICAgICAgIHBvb2wgYmxvY2tzIGFyZSB0aGUgc2FtZSBzaXplLiAgKi8KKworICAgIGlmICh0aHItPnJlbGZjbiAhPSAwICYmCisgICAgICAgIGItPmJoLmJiLmJzaXplID09IChidWZzaXplKSh0aHItPnBvb2xfbGVuIC0gc2l6ZW9mKGJoZWFkX3QpKSkKKyAgICB7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgaWYgKHRoci0+bnVtcGJsayAhPSAxKSB7ICAgICAgICAvKiBEbyBub3QgcmVsZWFzZSB0aGUgbGFzdCBidWZmZXIgdW50aWwgZmluYWxpemF0aW9uIHRpbWUgKi8KKyNlbmRpZgorCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGItPmJoLmJiLnByZXZmcmVlID09IDApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKEJIKChjaGFyICopIGIgKyBiLT5iaC5iYi5ic2l6ZSktPmJiLnByZXZmcmVlID09IGItPmJoLmJiLmJzaXplKTsKKworICAgICAgICAgICAgLyogIFVubGluayB0aGUgYnVmZmVyIGZyb20gdGhlIGZyZWUgbGlzdCAgKi8KKyAgICAgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIiUlJSUlJSBGUkVFKCAlcCApXG4iLCAodm9pZCAqKSBiICkgKTsKKworICAgICAgICAgICAgKCp0aHItPnJlbGZjbikoYik7CisjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIHRoci0+bnVtcHJlbCsrOyAgICAgICAgICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aHItPm51bXBibGsgPT0gdGhyLT5udW1wZ2V0IC0gdGhyLT5udW1wcmVsKTsKKworICAgICAgICAgICAgLyogYXZvaWQgbGVhdmluZyBzdGFsZSBsYXN0X3Bvb2wgcG9pbnRlciBhcm91bmQgaWYgaXQgaXMgYmVpbmcgZGVhbGxvY2VkICovCisgICAgICAgICAgICBpZiAodGhyLT5sYXN0X3Bvb2wgPT0gYikgdGhyLT5sYXN0X3Bvb2wgPSAwOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgdGhyLT5sYXN0X3Bvb2wgPSBiOworICAgICAgICB9CisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKyAgICB9Cit9CisKKy8qICBCRUNUTCAgLS0gIEVzdGFibGlzaCBhdXRvbWF0aWMgcG9vbCBleHBhbnNpb24gY29udHJvbCAgKi8KKworc3RhdGljIHZvaWQKK2JlY3RsKCAga21wX2luZm9fdCAqdGgsIGJnZXRfY29tcGFjdF90IGNvbXBhY3QsIGJnZXRfYWNxdWlyZV90IGFjcXVpcmUsIGJnZXRfcmVsZWFzZV90IHJlbGVhc2UsIGJ1ZnNpemUgcG9vbF9pbmNyKQoreworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgIHRoci0+Y29tcGZjbiA9IGNvbXBhY3Q7CisgICAgdGhyLT5hY3FmY24gPSBhY3F1aXJlOworICAgIHRoci0+cmVsZmNuID0gcmVsZWFzZTsKKyAgICB0aHItPmV4cF9pbmNyID0gcG9vbF9pbmNyOworfQorCisvKiAgQlBPT0wgIC0tICBBZGQgYSByZWdpb24gb2YgbWVtb3J5IHRvIHRoZSBidWZmZXIgcG9vbC4gICovCisKK3N0YXRpYyB2b2lkCiticG9vbCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGJ1ZnNpemUgbGVuKQoreworLyogICAgaW50IGJpbiA9IDA7ICovCisgICAgdGhyX2RhdGFfdCAqdGhyID0gZ2V0X3Rocl9kYXRhKCB0aCApOworICAgIGJmaGVhZF90ICpiID0gQkZIKGJ1Zik7CisgICAgYmhlYWRfdCAqYm47CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworI2lmZGVmIFNpemVRdWFudAorICAgIGxlbiAmPSB+KFNpemVRdWFudCAtIDEpOworI2VuZGlmCisgICAgaWYgKHRoci0+cG9vbF9sZW4gPT0gMCkgeworICAgICAgICB0aHItPnBvb2xfbGVuID0gbGVuOworICAgIH0gZWxzZSBpZiAobGVuICE9IHRoci0+cG9vbF9sZW4pIHsKKyAgICAgICAgdGhyLT5wb29sX2xlbiA9IC0xOworICAgIH0KKyNpZiBCdWZTdGF0cworICAgIHRoci0+bnVtcGdldCsrOyAgICAgICAgICAgICAgICAgICAvKiBOdW1iZXIgb2YgYmxvY2sgYWNxdWlzaXRpb25zICovCisgICAgdGhyLT5udW1wYmxrKys7ICAgICAgICAgICAgICAgICAgIC8qIE51bWJlciBvZiBibG9ja3MgdG90YWwgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworI2VuZGlmIC8qIEJ1ZlN0YXRzICovCisKKyAgICAvKiBTaW5jZSB0aGUgYmxvY2sgaXMgaW5pdGlhbGx5IG9jY3VwaWVkIGJ5IGEgc2luZ2xlIGZyZWUgIGJ1ZmZlciwKKyAgICAgICBpdCAgaGFkICBiZXR0ZXIgIG5vdCAgYmUgIChtdWNoKSBsYXJnZXIgdGhhbiB0aGUgbGFyZ2VzdCBidWZmZXIKKyAgICAgICB3aG9zZSBzaXplIHdlIGNhbiBzdG9yZSBpbiBiaGVhZC5iYi5ic2l6ZS4gKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQobGVuIC0gc2l6ZW9mKGJoZWFkX3QpIDw9IC0oKGJ1ZnNpemUpIEVTZW50ICsgMSkpOworCisgICAgLyogQ2xlYXIgIHRoZSAgYmFja3BvaW50ZXIgYXQgIHRoZSBzdGFydCBvZiB0aGUgYmxvY2sgdG8gaW5kaWNhdGUgdGhhdAorICAgICAgIHRoZXJlICBpcyAgbm8gIGZyZWUgIGJsb2NrICBwcmlvciAgdG8gIHRoaXMgICBvbmUuICAgIFRoYXQgICBibG9ja3MKKyAgICAgICByZWNvbWJpbmF0aW9uIHdoZW4gdGhlIGZpcnN0IGJsb2NrIGluIG1lbW9yeSBpcyByZWxlYXNlZC4gKi8KKworICAgIGItPmJoLmJiLnByZXZmcmVlID0gMDsKKworICAgIC8qIENyZWF0ZSBhIGR1bW15IGFsbG9jYXRlZCBidWZmZXIgYXQgdGhlIGVuZCBvZiB0aGUgcG9vbC4gIFRoaXMgZHVtbXkKKyAgICAgICBidWZmZXIgaXMgc2VlbiB3aGVuIGEgYnVmZmVyIGF0IHRoZSBlbmQgb2YgdGhlIHBvb2wgaXMgcmVsZWFzZWQgYW5kCisgICAgICAgYmxvY2tzICByZWNvbWJpbmF0aW9uICBvZiAgdGhlIGxhc3QgYnVmZmVyIHdpdGggdGhlIGR1bW15IGJ1ZmZlciBhdAorICAgICAgIHRoZSBlbmQuICBUaGUgbGVuZ3RoIGluIHRoZSBkdW1teSBidWZmZXIgIGlzICBzZXQgIHRvICB0aGUgIGxhcmdlc3QKKyAgICAgICBuZWdhdGl2ZSAgbnVtYmVyICB0byAgZGVub3RlICB0aGUgIGVuZCAgb2YgIHRoZSBwb29sIGZvciBkaWFnbm9zdGljCisgICAgICAgcm91dGluZXMgKHRoaXMgc3BlY2lmaWMgdmFsdWUgaXMgIG5vdCAgY291bnRlZCAgb24gIGJ5ICB0aGUgIGFjdHVhbAorICAgICAgIGFsbG9jYXRpb24gYW5kIHJlbGVhc2UgZnVuY3Rpb25zKS4gKi8KKworICAgIGxlbiAtPSBzaXplb2YoYmhlYWRfdCk7CisgICAgYi0+YmguYmIuYnNpemUgPSAoYnVmc2l6ZSkgbGVuOworICAgIC8qIFNldCB0aGUgb3duZXIgb2YgdGhpcyBidWZmZXIgKi8KKyAgICBUQ1dfUFRSKCBiLT5iaC5iYi5idGhyLCAoa21wX2luZm9fdCopKChrbXBfdWludHB0cl90KXRoIHwgMSkgKTsgLy8gbWFyayB0aGUgYnVmZmVyIGFzIGFsbG9jYXRlZCBhZGRyZXNzCisKKyAgICAvKiBDaGFpbiB0aGUgbmV3IGJsb2NrIHRvIHRoZSBmcmVlIGxpc3QuICovCisgICAgX19rbXBfYmdldF9pbnNlcnRfaW50b19mcmVlbGlzdCggdGhyLCBiICk7CisKKyNpZmRlZiBGcmVlV2lwZQorICAgICh2b2lkKSBtZW1zZXQoKChjaGFyICopIGIpICsgc2l6ZW9mKGJmaGVhZF90KSwgMHg1NSwKKyAgICAgICAgICAgICAoc2l6ZV90KSAobGVuIC0gc2l6ZW9mKGJmaGVhZF90KSkpOworI2VuZGlmCisgICAgYm4gPSBCSCgoKGNoYXIgKikgYikgKyBsZW4pOworICAgIGJuLT5iYi5wcmV2ZnJlZSA9IChidWZzaXplKSBsZW47CisgICAgLyogRGVmaW5pdGlvbiBvZiBFU2VudCBhc3N1bWVzIHR3bydzIGNvbXBsZW1lbnQhICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggKH4wKSA9PSAtMSAmJiAoYm4gIT0gMCkgKTsKKworICAgIGJuLT5iYi5ic2l6ZSA9IEVTZW50OworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogIEJGUkVFRCAgLS0gIER1bXAgdGhlIGZyZWUgbGlzdHMgZm9yIHRoaXMgdGhyZWFkLiAqLworCitzdGF0aWMgdm9pZAorYmZyZWVkKCAga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBiaW4gPSAwLCBjb3VudCA9IDA7CisgICAgaW50IGd0aWQgPSBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCB0b3RhbD0lIiBLTVBfVUlOVDY0X1NQRUMgIiBnZXQ9JSIgS01QX0lOVDY0X1NQRUMgIiByZWw9JSIgXAorICAgICAgICAgICBLTVBfSU5UNjRfU1BFQyAiIHBibGs9JSIgS01QX0lOVDY0X1NQRUMgIiBwZ2V0PSUiIEtNUF9JTlQ2NF9TUEVDICIgcHJlbD0lIiBLTVBfSU5UNjRfU1BFQyBcCisgICAgICAgICAgICIgZGdldD0lIiBLTVBfSU5UNjRfU1BFQyAiIGRyZWw9JSIgS01QX0lOVDY0X1NQRUMgIlxuIiwKKyAgICAgICAgICAgZ3RpZCwgKGttcF91aW50NjQpIHRoci0+dG90YWxsb2MsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZ2V0LCAgKGttcF9pbnQ2NCkgdGhyLT5udW1yZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtcGJsaywKKyAgICAgICAgICAgKGttcF9pbnQ2NCkgdGhyLT5udW1wZ2V0LCAoa21wX2ludDY0KSB0aHItPm51bXByZWwsCisgICAgICAgICAgIChrbXBfaW50NjQpIHRoci0+bnVtZGdldCwgKGttcF9pbnQ2NCkgdGhyLT5udW1kcmVsICk7CisjZW5kaWYKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmI7CisKKyAgICAgICAgZm9yIChiID0gdGhyLT5mcmVlbGlzdFsgYmluIF0ucWwuZmxpbms7IGIgIT0gJnRoci0+ZnJlZWxpc3RbIGJpbiBdOyBiID0gYi0+cWwuZmxpbmspIHsKKyAgICAgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggYi0+cWwuYmxpbmstPnFsLmZsaW5rID09IGIgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGItPnFsLmZsaW5rLT5xbC5ibGluayA9PSBiICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBicyA+IDAgKTsKKworICAgICAgICAgICAgY291bnQgKz0gMTsKKworICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIl9fa21wX3ByaW50cG9vbDogVCMlZCBGcmVlIGJsb2NrOiAweCVwIHNpemUgJTZsZCBieXRlcy5cbiIsIGd0aWQsIGIsIChsb25nKSBicyApOworI2lmZGVmIEZyZWVXaXBlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY2hhciAqbGVyciA9ICgoY2hhciAqKSBiKSArIHNpemVvZihiZmhlYWRfdCk7CisgICAgICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwgKG1lbWNtcChsZXJyLCBsZXJyICsgMSwgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIl9fa21wX3ByaW50cG9vbDogVCMlZCAgICAgKENvbnRlbnRzIG9mIGFib3ZlIGZyZWUgYmxvY2sgaGF2ZSBiZWVuIG92ZXJzdG9yZWQuKVxuIiwgZ3RpZCApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGNvdW50ID09IDApCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCJfX2ttcF9wcmludHBvb2w6IFQjJWQgTm8gZnJlZSBibG9ja3NcbiIsIGd0aWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfREVCVUcKKworI2lmIEJ1ZlN0YXRzCisKKy8qICBCU1RBVFMgIC0tICBSZXR1cm4gYnVmZmVyIGFsbG9jYXRpb24gZnJlZSBzcGFjZSBzdGF0aXN0aWNzLiAgKi8KKworc3RhdGljIHZvaWQKK2JzdGF0cyggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpjdXJhbGxvYywgIGJ1ZnNpemUgKnRvdGZyZWUsICBidWZzaXplICptYXhmcmVlLCBsb25nICpuZ2V0LCBsb25nICpucmVsKQoreworICAgIGludCBiaW4gPSAwOworICAgIHRocl9kYXRhX3QgKnRociA9IGdldF90aHJfZGF0YSggdGggKTsKKworICAgICpuZ2V0ID0gdGhyLT5udW1nZXQ7CisgICAgKm5yZWwgPSB0aHItPm51bXJlbDsKKyAgICAqY3VyYWxsb2MgPSAoYnVmc2l6ZSkgdGhyLT50b3RhbGxvYzsKKyAgICAqdG90ZnJlZSA9IDA7CisgICAgKm1heGZyZWUgPSAtMTsKKworICAgIGZvciAoYmluID0gMDsgYmluIDwgTUFYX0JHRVRfQklOUzsgKytiaW4pIHsKKyAgICAgICAgYmZoZWFkX3QgKmIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKworICAgICAgICB3aGlsZSAoYiAhPSAmdGhyLT5mcmVlbGlzdFsgYmluIF0pIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYi0+YmguYmIuYnNpemUgPiAwKTsKKyAgICAgICAgICAgICp0b3RmcmVlICs9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgaWYgKGItPmJoLmJiLmJzaXplID4gKm1heGZyZWUpIHsKKyAgICAgICAgICAgICAgICAqbWF4ZnJlZSA9IGItPmJoLmJiLmJzaXplOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYiA9IGItPnFsLmZsaW5rOyAgICAgICAgICAgICAgLyogTGluayB0byBuZXh0IGJ1ZmZlciAqLworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlNUQVRTRSAgLS0gIFJldHVybiBleHRlbmRlZCBzdGF0aXN0aWNzICAqLworCitzdGF0aWMgdm9pZAorYnN0YXRzZSggIGttcF9pbmZvX3QgKnRoLCBidWZzaXplICpwb29sX2luY3IsIGxvbmcgKm5wb29sLCBsb25nICpucGdldCwgbG9uZyAqbnByZWwsIGxvbmcgKm5kZ2V0LCBsb25nICpuZHJlbCkKK3sKKyAgICB0aHJfZGF0YV90ICp0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICAqcG9vbF9pbmNyID0gKHRoci0+cG9vbF9sZW4gPCAwKSA/IC10aHItPmV4cF9pbmNyIDogdGhyLT5leHBfaW5jcjsKKyAgICAqbnBvb2wgPSB0aHItPm51bXBibGs7CisgICAgKm5wZ2V0ID0gdGhyLT5udW1wZ2V0OworICAgICpucHJlbCA9IHRoci0+bnVtcHJlbDsKKyAgICAqbmRnZXQgPSB0aHItPm51bWRnZXQ7CisgICAgKm5kcmVsID0gdGhyLT5udW1kcmVsOworfQorCisjZW5kaWYgLyogQnVmU3RhdHMgKi8KKworLyogIEJVRkRVTVAgIC0tICBEdW1wIHRoZSBkYXRhIGluIGEgYnVmZmVyLiAgVGhpcyBpcyBjYWxsZWQgd2l0aCB0aGUgIHVzZXIKKyAgICAgICAgICAgICAgICAgZGF0YSBwb2ludGVyLCBhbmQgYmFja3MgdXAgdG8gdGhlIGJ1ZmZlciBoZWFkZXIuICBJdCB3aWxsCisgICAgICAgICAgICAgICAgIGR1bXAgZWl0aGVyIGEgZnJlZSBibG9jayBvciBhbiBhbGxvY2F0ZWQgb25lLiAgKi8KKworc3RhdGljIHZvaWQKK2J1ZmR1bXAoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYjsKKyAgICB1bnNpZ25lZCBjaGFyICpiZHVtcDsKKyAgICBidWZzaXplIGJkbGVuOworCisgICAgYiA9IEJGSCgoKGNoYXIgKikgYnVmKSAtIHNpemVvZihiaGVhZF90KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5ic2l6ZSAhPSAwKTsKKyAgICBpZiAoYi0+YmguYmIuYnNpemUgPCAwKSB7CisgICAgICAgIGJkdW1wID0gKHVuc2lnbmVkIGNoYXIgKikgYnVmOworICAgICAgICBiZGxlbiA9ICgtYi0+YmguYmIuYnNpemUpIC0gKGJ1ZnNpemUpIHNpemVvZihiaGVhZF90KTsKKyAgICB9IGVsc2UgeworICAgICAgICBiZHVtcCA9ICh1bnNpZ25lZCBjaGFyICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpKTsKKyAgICAgICAgYmRsZW4gPSBiLT5iaC5iYi5ic2l6ZSAtIChidWZzaXplKSBzaXplb2YoYmZoZWFkX3QpOworICAgIH0KKworICAgIHdoaWxlIChiZGxlbiA+IDApIHsKKyAgICAgICAgaW50IGksIGR1cGVzID0gMDsKKyAgICAgICAgYnVmc2l6ZSBsID0gYmRsZW47CisgICAgICAgIGNoYXIgYmhleFs1MF0sIGJhc2NpaVsyMF07CisKKyAgICAgICAgaWYgKGwgPiAxNikgeworICAgICAgICAgICAgbCA9IDE2OworICAgICAgICB9CisKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IGw7IGkrKykgeworICAgICAgICAgICAgKHZvaWQpIEtNUF9TTlBSSU5URihiaGV4ICsgaSAqIDMsIHNpemVvZihiaGV4KSAtIGkgKiAzLCAiJTAyWCAiLCBiZHVtcFtpXSk7CisgICAgICAgICAgICBpZiAoYmR1bXBbaV0gPiAweDIwICYmIGJkdW1wW2ldIDwgMHg3RikKKyAgICAgICAgICAgICAgICBiYXNjaWlbIGkgXSA9IGJkdW1wWyBpIF07CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgYmFzY2lpWyBpIF0gPSAnICc7CisgICAgICAgIH0KKyAgICAgICAgYmFzY2lpW2ldID0gMDsKKyAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCIlLTQ4cyAgICVzXG4iLCBiaGV4LCBiYXNjaWkpOworICAgICAgICBiZHVtcCArPSBsOworICAgICAgICBiZGxlbiAtPSBsOworICAgICAgICB3aGlsZSAoKGJkbGVuID4gMTYpICYmIChtZW1jbXAoKGNoYXIgKikgKGJkdW1wIC0gMTYpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIgKikgYmR1bXAsIDE2KSA9PSAwKSkgeworICAgICAgICAgICAgZHVwZXMrKzsKKyAgICAgICAgICAgIGJkdW1wICs9IDE2OworICAgICAgICAgICAgYmRsZW4gLT0gMTY7CisgICAgICAgIH0KKyAgICAgICAgaWYgKGR1cGVzID4gMSkgeworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKAorICAgICAgICAgICAgICAgICIgICAgICglZCBsaW5lcyBbJWQgYnl0ZXNdIGlkZW50aWNhbCB0byBhYm92ZSBsaW5lIHNraXBwZWQpXG4iLAorICAgICAgICAgICAgICAgIGR1cGVzLCBkdXBlcyAqIDE2KTsKKyAgICAgICAgfSBlbHNlIGlmIChkdXBlcyA9PSAxKSB7CisgICAgICAgICAgICBiZHVtcCAtPSAxNjsKKyAgICAgICAgICAgIGJkbGVuICs9IDE2OworICAgICAgICB9CisgICAgfQorfQorCisvKiAgQlBPT0xEICAtLSAgRHVtcCBhIGJ1ZmZlciBwb29sLiAgVGhlIGJ1ZmZlciBoZWFkZXJzIGFyZSBhbHdheXMgbGlzdGVkLgorICAgICAgICAgICAgICAgIElmIERVTVBBTExPQyBpcyBub256ZXJvLCB0aGUgY29udGVudHMgb2YgYWxsb2NhdGVkIGJ1ZmZlcnMKKyAgICAgICAgICAgICAgICBhcmUgIGR1bXBlZC4gICBJZiAgRFVNUEZSRUUgIGlzICBub256ZXJvLCAgZnJlZSBibG9ja3MgYXJlCisgICAgICAgICAgICAgICAgZHVtcGVkIGFzIHdlbGwuICBJZiBGcmVlV2lwZSAgY2hlY2tpbmcgIGlzICBlbmFibGVkLCAgZnJlZQorICAgICAgICAgICAgICAgIGJsb2NrcyAgd2hpY2ggIGhhdmUgIGJlZW4gY2xvYmJlcmVkIHdpbGwgYWx3YXlzIGJlIGR1bXBlZC4gKi8KKworc3RhdGljIHZvaWQKK2Jwb29sZCggIGttcF9pbmZvX3QgKnRoLCB2b2lkICpidWYsIGludCBkdW1wYWxsb2MsIGludCBkdW1wZnJlZSkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSCggKGNoYXIqKWJ1ZiAtIHNpemVvZihiaGVhZF90KSk7CisKKyAgICB3aGlsZSAoYi0+YmguYmIuYnNpemUgIT0gRVNlbnQpIHsKKyAgICAgICAgYnVmc2l6ZSBicyA9IGItPmJoLmJiLmJzaXplOworCisgICAgICAgIGlmIChicyA8IDApIHsKKyAgICAgICAgICAgIGJzID0gLWJzOworICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJBbGxvY2F0ZWQgYnVmZmVyOiBzaXplICU2bGQgYnl0ZXMuXG4iLCAobG9uZykgYnMpOworICAgICAgICAgICAgaWYgKGR1bXBhbGxvYykgeworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjb25zdCBjaGFyICpsZXJyID0gIiI7CisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmICgoYi0+cWwuYmxpbmstPnFsLmZsaW5rICE9IGIpIHx8IChiLT5xbC5mbGluay0+cWwuYmxpbmsgIT0gYikpIHsKKyAgICAgICAgICAgICAgICBsZXJyID0gIiAgKEJhZCBmcmVlIGxpc3QgbGlua3MpIjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygiRnJlZSBibG9jazogICAgICAgc2l6ZSAlNmxkIGJ5dGVzLiVzXG4iLAorICAgICAgICAgICAgICAgIChsb25nKSBicywgbGVycik7CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgaWYgKGR1bXBmcmVlKSB7CisgICAgICAgICAgICAgICAgYnVmZHVtcCggdGgsICh2b2lkICopICgoKGNoYXIgKikgYikgKyBzaXplb2YoYmhlYWRfdCkpKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBiID0gQkZIKCgoY2hhciAqKSBiKSArIGJzKTsKKyAgICB9Cit9CisKKy8qICBCUE9PTFYgIC0tICBWYWxpZGF0ZSBhIGJ1ZmZlciBwb29sLiAqLworCitzdGF0aWMgaW50CiticG9vbHYoICBrbXBfaW5mb190ICp0aCwgdm9pZCAqYnVmICkKK3sKKyAgICBiZmhlYWRfdCAqYiA9IEJGSChidWYpOworCisgICAgd2hpbGUgKGItPmJoLmJiLmJzaXplICE9IEVTZW50KSB7CisgICAgICAgIGJ1ZnNpemUgYnMgPSBiLT5iaC5iYi5ic2l6ZTsKKworICAgICAgICBpZiAoYnMgPCAwKSB7CisgICAgICAgICAgICBicyA9IC1iczsKKyAgICAgICAgfSBlbHNlIHsKKyNpZmRlZiBGcmVlV2lwZQorICAgICAgICAgICAgY2hhciAqbGVyciA9ICIiOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYnMgPiAwKTsKKyAgICAgICAgICAgIGlmIChicyA8PSAwKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKGItPnFsLmJsaW5rLT5xbC5mbGluayAhPSBiKSB8fCAoYi0+cWwuZmxpbmstPnFsLmJsaW5rICE9IGIpKSB7CisgICAgICAgICAgICAgICAgKHZvaWQpIF9fa21wX3ByaW50Zl9ub19sb2NrKCJGcmVlIGJsb2NrOiBzaXplICU2bGQgYnl0ZXMuICAoQmFkIGZyZWUgbGlzdCBsaW5rcylcbiIsCisgICAgICAgICAgICAgICAgICAgICAobG9uZykgYnMpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoMCk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisjaWZkZWYgRnJlZVdpcGUKKyAgICAgICAgICAgIGxlcnIgPSAoKGNoYXIgKikgYikgKyBzaXplb2YoYmZoZWFkX3QpOworICAgICAgICAgICAgaWYgKChicyA+IHNpemVvZihiZmhlYWRfdCkpICYmICgoKmxlcnIgIT0gMHg1NSkgfHwKKyAgICAgICAgICAgICAgICAobWVtY21wKGxlcnIsIGxlcnIgKyAxLAorICAgICAgICAgICAgICAgICAgKHNpemVfdCkgKGJzIC0gKHNpemVvZihiZmhlYWRfdCkgKyAxKSkpICE9IDApKSkgeworICAgICAgICAgICAgICAgICh2b2lkKSBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAgICAgICAgIihDb250ZW50cyBvZiBhYm92ZSBmcmVlIGJsb2NrIGhhdmUgYmVlbiBvdmVyc3RvcmVkLilcbiIpOworICAgICAgICAgICAgICAgIGJ1ZmR1bXAoIHRoLCAodm9pZCAqKSAoKChjaGFyICopIGIpICsgc2l6ZW9mKGJoZWFkX3QpKSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgwKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBGcmVlV2lwZSAqLworICAgICAgICB9CisgICAgICAgIGIgPSBCRkgoKChjaGFyICopIGIpICsgYnMpOworICAgIH0KKyAgICByZXR1cm4gMTsKK30KKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBrbXBfaW5mb190ICp0aCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggU2l6ZVF1YW50ID49IHNpemVvZiggdm9pZCAqICkgJiYgKHRoICE9IDApICk7CisKKyAgICBzZXRfdGhyX2RhdGEoIHRoICk7CisKKyAgICBiZWN0bCggdGgsIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwKKyAgICAgICAgICAgKGJ1ZnNpemUpIF9fa21wX21hbGxvY19wb29sX2luY3IgKTsKK30KKwordm9pZAorX19rbXBfZmluYWxpemVfYmdldCgga21wX2luZm9fdCAqdGggKQoreworICAgIHRocl9kYXRhX3QgKnRocjsKKyAgICBiZmhlYWRfdCAqYjsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IDAgKTsKKworI2lmIEJ1ZlN0YXRzCisgICAgdGhyID0gKHRocl9kYXRhX3QgKikgdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHIgIT0gTlVMTCApOworICAgIGIgPSB0aHItPmxhc3RfcG9vbDsKKworICAgIC8qICBJZiAgYSAgYmxvY2stcmVsZWFzZSBmdW5jdGlvbiBpcyBkZWZpbmVkLCBhbmQgdGhpcyBmcmVlIGJ1ZmZlcgorICAgICAgICBjb25zdGl0dXRlcyB0aGUgZW50aXJlIGJsb2NrLCByZWxlYXNlIGl0LiAgTm90ZSB0aGF0ICBwb29sX2xlbgorICAgICAgICBpcyAgZGVmaW5lZCAgaW4gIHN1Y2ggYSB3YXkgdGhhdCB0aGUgdGVzdCB3aWxsIGZhaWwgdW5sZXNzIGFsbAorICAgICAgICBwb29sIGJsb2NrcyBhcmUgdGhlIHNhbWUgc2l6ZS4gICovCisKKyAgICAvKiBEZWFsbG9jYXRlIHRoZSBsYXN0IHBvb2wgaWYgb25lIGV4aXN0cyBiZWNhdXNlIHdlIG5vIGxvbmdlciBkbyBpdCBpbiBicmVsKCkgKi8KKyAgICBpZiAodGhyLT5yZWxmY24gIT0gMCAmJiBiICE9IDAgJiYgdGhyLT5udW1wYmxrICE9IDAgJiYKKyAgICAgICAgYi0+YmguYmIuYnNpemUgPT0gKGJ1ZnNpemUpKHRoci0+cG9vbF9sZW4gLSBzaXplb2YoYmhlYWRfdCkpKQorICAgIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiLT5iaC5iYi5wcmV2ZnJlZSA9PSAwKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChCSCgoY2hhciAqKSBiICsgYi0+YmguYmIuYnNpemUpLT5iYi5ic2l6ZSA9PSBFU2VudCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoQkgoKGNoYXIgKikgYiArIGItPmJoLmJiLmJzaXplKS0+YmIucHJldmZyZWUgPT0gYi0+YmguYmIuYnNpemUpOworCisgICAgICAgIC8qICBVbmxpbmsgdGhlIGJ1ZmZlciBmcm9tIHRoZSBmcmVlIGxpc3QgICovCisgICAgICAgIF9fa21wX2JnZXRfcmVtb3ZlX2Zyb21fZnJlZWxpc3QoIGIgKTsKKworICAgICAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIEZSRUUoICVwIClcbiIsICh2b2lkICopIGIgKSApOworCisgICAgICAgICgqdGhyLT5yZWxmY24pKGIpOworICAgICAgICB0aHItPm51bXByZWwrKzsgICAgICAgICAgICAgICAvKiBOciBvZiBleHBhbnNpb24gYmxvY2sgcmVsZWFzZXMgKi8KKyAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgICAgICAgICAgLyogVG90YWwgbnVtYmVyIG9mIGJsb2NrcyAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoci0+bnVtcGJsayA9PSB0aHItPm51bXBnZXQgLSB0aHItPm51bXByZWwpOworICAgIH0KKyNlbmRpZiAvKiBCdWZTdGF0cyAqLworCisgICAgLyogRGVhbGxvY2F0ZSBiZ2V0X2RhdGEgKi8KKyAgICBpZiAoIHRoLT50aC50aF9sb2NhbC5iZ2V0X2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfZnJlZSggdGgtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSApOworICAgICAgICB0aC0+dGgudGhfbG9jYWwuYmdldF9kYXRhID0gTlVMTDsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitrbXBjX3NldF9wb29sc2l6ZSggc2l6ZV90IHNpemUgKQoreworICAgIGJlY3RsKCBfX2ttcF9nZXRfdGhyZWFkKCksIChiZ2V0X2NvbXBhY3RfdCkgMCwgKGJnZXRfYWNxdWlyZV90KSBtYWxsb2MsCisgICAgICAgICAgIChiZ2V0X3JlbGVhc2VfdCkgZnJlZSwgKGJ1ZnNpemUpIHNpemUgKTsKK30KKworc2l6ZV90CitrbXBjX2dldF9wb29sc2l6ZSggdm9pZCApCit7CisgICAgdGhyX2RhdGFfdCAqcDsKKworICAgIHAgPSBnZXRfdGhyX2RhdGEoIF9fa21wX2dldF90aHJlYWQoKSApOworCisgICAgcmV0dXJuIHAtPmV4cF9pbmNyOworfQorCit2b2lkCitrbXBjX3NldF9wb29sbW9kZSggaW50IG1vZGUgKQoreworICAgIHRocl9kYXRhX3QgKnA7CisKKyAgICBpZiAobW9kZSA9PSBiZ2V0X21vZGVfZmlmbyB8fCBtb2RlID09IGJnZXRfbW9kZV9saWZvIHx8IG1vZGUgPT0gYmdldF9tb2RlX2Jlc3QpIHsKKyAgICAgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisgICAgICAgIHAtPm1vZGUgPSAoYmdldF9tb2RlX3QpIG1vZGU7CisgICAgfQorfQorCitpbnQKK2ttcGNfZ2V0X3Bvb2xtb2RlKCB2b2lkICkKK3sKKyAgICB0aHJfZGF0YV90ICpwOworCisgICAgcCA9IGdldF90aHJfZGF0YSggX19rbXBfZ2V0X3RocmVhZCgpICk7CisKKyAgICByZXR1cm4gcC0+bW9kZTsKK30KKwordm9pZAora21wY19nZXRfcG9vbHN0YXQoIHNpemVfdCAqbWF4bWVtLCBzaXplX3QgKmFsbG1lbSApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisgICAgYnVmc2l6ZSBhLCBiOworCisgICAgX19rbXBfYmdldF9kZXF1ZXVlKCB0aCApOyAgICAgICAgIC8qIFJlbGVhc2UgYW55IHF1ZXVlZCBidWZmZXJzICovCisKKyAgICBiY2hlY2soIHRoLCAmYSwgJmIgKTsKKworICAgICptYXhtZW0gPSBhOworICAgICphbGxtZW0gPSBiOworfQorCit2b2lkCitrbXBjX3Bvb2xwcmludCggdm9pZCApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF9nZXRfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKworICAgIGJmcmVlZCggdGggKTsKK30KKworI2VuZGlmIC8vICNpZiBLTVBfVVNFX0JHRVQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKgora21wY19tYWxsb2MoIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIHB0ciA9IGJnZXQoIF9fa21wX2VudHJ5X3RocmVhZCgpLCAoYnVmc2l6ZSkoc2l6ZSArIHNpemVvZihwdHIpKSApOworICAgIGlmKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gc2F2ZSBhbGxvY2F0ZWQgcG9pbnRlciBqdXN0IGJlZm9yZSBvbmUgcmV0dXJuZWQgdG8gdXNlcgorICAgICAgICAqKHZvaWQqKilwdHIgPSBwdHI7CisgICAgICAgIHB0ciA9ICh2b2lkKiopcHRyICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKworI2RlZmluZSBJU19QT1dFUl9PRl9UV08obikgKCgobikmKChuKS0xKSk9PTApCisKK3ZvaWQgKgora21wY19hbGlnbmVkX21hbGxvYyggc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgdm9pZCAqIHB0cl9hbGxvY2F0ZWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWxpZ25tZW50IDwgMzIgKiAxMDI0ICk7IC8vIEFsaWdubWVudCBzaG91bGQgbm90IGJlIHRvbyBiaWcKKyAgICBpZiggIUlTX1BPV0VSX09GX1RXTyhhbGlnbm1lbnQpICkgeworICAgICAgICAvLyBBQzogZG8gd2UgbmVlZCB0byBpc3N1ZSBhIHdhcm5pbmcgaGVyZT8KKyAgICAgICAgZXJybm8gPSBFSU5WQUw7CisgICAgICAgIHJldHVybiBOVUxMOworICAgIH0KKyAgICBzaXplID0gc2l6ZSArIHNpemVvZiggdm9pZCogKSArIGFsaWdubWVudDsKKyAgICBwdHJfYWxsb2NhdGVkID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKXNpemUgKTsKKyAgICBpZiggcHRyX2FsbG9jYXRlZCAhPSBOVUxMICkgeworICAgICAgICAvLyBzYXZlIGFsbG9jYXRlZCBwb2ludGVyIGp1c3QgYmVmb3JlIG9uZSByZXR1cm5lZCB0byB1c2VyCisgICAgICAgIHB0ciA9ICh2b2lkKikoKChrbXBfdWludHB0cl90KXB0cl9hbGxvY2F0ZWQgKyBzaXplb2YoIHZvaWQqICkgKyBhbGlnbm1lbnQpICYgfihhbGlnbm1lbnQgLSAxKSk7CisgICAgICAgICooKHZvaWQqKilwdHIgLSAxKSA9IHB0cl9hbGxvY2F0ZWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHRyID0gTlVMTDsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitrbXBjX2NhbGxvYyggc2l6ZV90IG5lbGVtLCBzaXplX3QgZWxzaXplICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIHB0ciA9IGJnZXR6KCBfX2ttcF9lbnRyeV90aHJlYWQoKSwgKGJ1ZnNpemUpIChuZWxlbSAqIGVsc2l6ZSArIHNpemVvZihwdHIpKSApOworICAgIGlmKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gc2F2ZSBhbGxvY2F0ZWQgcG9pbnRlciBqdXN0IGJlZm9yZSBvbmUgcmV0dXJuZWQgdG8gdXNlcgorICAgICAgICAqKHZvaWQqKilwdHIgPSBwdHI7CisgICAgICAgIHB0ciA9ICh2b2lkKiopcHRyICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitrbXBjX3JlYWxsb2MoIHZvaWQgKiBwdHIsIHNpemVfdCBzaXplICkKK3sKKyAgICB2b2lkICogcmVzdWx0ID0gTlVMTDsKKyAgICBpZiAoIHB0ciA9PSBOVUxMICkgeworICAgICAgICAvLyBJZiBwb2ludGVyIGlzIE5VTEwsIHJlYWxsb2MgYmVoYXZlcyBsaWtlIG1hbGxvYy4KKyAgICAgICAgcmVzdWx0ID0gYmdldCggX19rbXBfZW50cnlfdGhyZWFkKCksIChidWZzaXplKShzaXplICsgc2l6ZW9mKHB0cikpICk7CisgICAgICAgIC8vIHNhdmUgYWxsb2NhdGVkIHBvaW50ZXIganVzdCBiZWZvcmUgb25lIHJldHVybmVkIHRvIHVzZXIKKyAgICAgICAgaWYoIHJlc3VsdCAhPSBOVUxMICkgeworICAgICAgICAgICAgKih2b2lkKiopcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKilyZXN1bHQgKyAxOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICggc2l6ZSA9PSAwICkgeworICAgICAgICAvLyBJZiBzaXplIGlzIDAsIHJlYWxsb2MgYmVoYXZlcyBsaWtlIGZyZWUuCisgICAgICAgIC8vIFRoZSB0aHJlYWQgbXVzdCBiZSByZWdpc3RlcmVkIGJ5IHRoZSBjYWxsIHRvIGttcGNfbWFsbG9jKCkgb3Iga21wY19jYWxsb2MoKSBiZWZvcmUuCisgICAgICAgIC8vIFNvIGl0IHNob3VsZCBiZSBzYWZlIHRvIGNhbGwgX19rbXBfZ2V0X3RocmVhZCgpLCBub3QgX19rbXBfZW50cnlfdGhyZWFkKCkuCisgICAgICAgIEtNUF9BU1NFUlQoKigodm9pZCoqKXB0ciAtIDEpKTsKKyAgICAgICAgYnJlbCggX19rbXBfZ2V0X3RocmVhZCgpLCAqKCh2b2lkKiopcHRyIC0gMSkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXN1bHQgPSBiZ2V0ciggX19rbXBfZW50cnlfdGhyZWFkKCksICooKHZvaWQqKilwdHIgLSAxKSwgKGJ1ZnNpemUpKHNpemUgKyBzaXplb2YocHRyKSkgKTsKKyAgICAgICAgaWYoIHJlc3VsdCAhPSBOVUxMICkgeworICAgICAgICAgICAgKih2b2lkKiopcmVzdWx0ID0gcmVzdWx0OworICAgICAgICAgICAgcmVzdWx0ID0gKHZvaWQqKilyZXN1bHQgKyAxOworICAgICAgICB9CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcmVzdWx0OworfQorCisvKiBOT1RFOiB0aGUgbGlicmFyeSBtdXN0IGhhdmUgYWxyZWFkeSBiZWVuIGluaXRpYWxpemVkIGJ5IGEgcHJldmlvdXMgYWxsb2NhdGUgKi8KKwordm9pZAora21wY19mcmVlKCB2b2lkICogcHRyICkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfZ2V0X3RocmVhZCgpOworICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgLy8gZXh0cmFjdCBhbGxvY2F0ZWQgcG9pbnRlciBhbmQgZnJlZSBpdAorICAgICAgICBLTVBfQVNTRVJUKCooKHZvaWQqKilwdHIgLSAxKSk7CisgICAgICAgIGJyZWwoIHRoLCAqKCh2b2lkKiopcHRyIC0gMSkgKTsKKyAgICB9OworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICoKK19fX2ttcF90aHJlYWRfbWFsbG9jKCBrbXBfaW5mb190ICp0aCwgc2l6ZV90IHNpemUgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgdm9pZCAqIHB0cjsKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9tYWxsb2MoICVwLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgIHB0ciA9IGJnZXQoIHRoLCAoYnVmc2l6ZSkgc2l6ZSApOworICAgIEtFX1RSQUNFKCAzMCwgKCAiPC0gX19rbXBfdGhyZWFkX21hbGxvYygpIHJldHVybnMgJXBcbiIsIHB0ciApICk7CisgICAgcmV0dXJuIHB0cjsKK30KKwordm9pZCAqCitfX19rbXBfdGhyZWFkX2NhbGxvYygga21wX2luZm9fdCAqdGgsIHNpemVfdCBuZWxlbSwgc2l6ZV90IGVsc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICogcHRyOworICAgIEtFX1RSQUNFKCAzMCwgKAorICAgICAgICAiLT4gX19rbXBfdGhyZWFkX2NhbGxvYyggJXAsICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICB0aCwKKyAgICAgICAgKGludCkgbmVsZW0sCisgICAgICAgIChpbnQpIGVsc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgIHB0ciA9IGJnZXR6KCB0aCwgKGJ1ZnNpemUpIChuZWxlbSAqIGVsc2l6ZSkgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9jYWxsb2MoKSByZXR1cm5zICVwXG4iLCBwdHIgKSApOworICAgIHJldHVybiBwdHI7Cit9CisKK3ZvaWQgKgorX19fa21wX3RocmVhZF9yZWFsbG9jKCBrbXBfaW5mb190ICp0aCwgdm9pZCAqcHRyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBLRV9UUkFDRSggMzAsICgKKyAgICAgICAgIi0+IF9fa21wX3RocmVhZF9yZWFsbG9jKCAlcCwgJXAsICVkICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIsCisgICAgICAgIChpbnQpIHNpemUKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBwdHIgPSBiZ2V0ciggdGgsIHB0ciwgKGJ1ZnNpemUpIHNpemUgKTsKKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9yZWFsbG9jKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfQorCit2b2lkCitfX19rbXBfdGhyZWFkX2ZyZWUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgS0VfVFJBQ0UoIDMwLCAoCisgICAgICAgICItPiBfX2ttcF90aHJlYWRfZnJlZSggJXAsICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsCisgICAgICAgIHRoLAorICAgICAgICBwdHIKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKyAgICBpZiAoIHB0ciAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICAgICAgYnJlbCggdGgsIHB0ciApOworICAgIH0KKyAgICBLRV9UUkFDRSggMzAsICggIjwtIF9fa21wX3RocmVhZF9mcmVlKClcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyoKKyAgICBJZiBMRUFLX01FTU9SWSBpcyBkZWZpbmVkLCBfX2ttcF9mcmVlKCkgd2lsbCAqbm90KiBmcmVlIG1lbW9yeS4gSXQgY2F1c2VzIG1lbW9yeSBsZWFrcywgYnV0IGl0CisgICAgbWF5IGJlIHVzZWZ1bCBmb3IgZGVidWdnaW5nIG1lbW9yeSBjb3JydXB0aW9ucywgdXNlZCBmcmVlZCBwb2ludGVycywgZXRjLgorKi8KKy8qICNkZWZpbmUgTEVBS19NRU1PUlkgKi8KKworc3RydWN0IGttcF9tZW1fZGVzY3IgeyAgICAgIC8vIE1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorICAgIHZvaWQgKiBwdHJfYWxsb2NhdGVkOyAgIC8vIFBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCksIHN1YmplY3QgZm9yIGZyZWUoKS4KKyAgICBzaXplX3Qgc2l6ZV9hbGxvY2F0ZWQ7ICAvLyBTaXplIG9mIGFsbG9jYXRlZCBtZW1vcnkgYmxvY2suCisgICAgdm9pZCAqIHB0cl9hbGlnbmVkOyAgICAgLy8gUG9pbnRlciB0byBhbGlnbmVkIG1lbW9yeSwgdG8gYmUgdXNlZCBieSBjbGllbnQgY29kZS4KKyAgICBzaXplX3Qgc2l6ZV9hbGlnbmVkOyAgICAvLyBTaXplIG9mIGFsaWduZWQgbWVtb3J5IGJsb2NrLgorfTsKK3R5cGVkZWYgc3RydWN0IGttcF9tZW1fZGVzY3Iga21wX21lbV9kZXNjcl90OworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiByZXF1ZXN0ZWQgYm91bmRhcnksIGZpbGwgYWxsb2NhdGVkIG1lbW9yeSB3aXRoIDB4MDAuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLworc3RhdGljCit2b2lkICoKK19fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZV90IHNpemUsIHNpemVfdCBhbGlnbm1lbnQgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAgLyoKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCkgYWxsb2NhdGVzIChieSBjYWxsIHRvIG1hbGxvYygpKSBiaWdnZXIgbWVtb3J5IGJsb2NrIHRoYW4gcmVxdWVzdGVkIHRvCisgICAgICAgIHJldHVybiBwcm9wZXJseSBhbGlnbmVkIHBvaW50ZXIuIE9yaWdpbmFsIHBvaW50ZXIgcmV0dXJuZWQgYnkgbWFsbG9jKCkgYW5kIHNpemUgb2YgYWxsb2NhdGVkCisgICAgICAgIGJsb2NrIGlzIHNhdmVkIGluIGRlc2NyaXB0b3IganVzdCBiZWZvcmUgdGhlIGFsaWduZWQgcG9pbnRlci4gVGhpcyBpbmZvcm1hdGlvbiB1c2VkIGJ5CisgICAgICAgIF9fa21wX2ZyZWUoKSAtLSBpdCBoYXMgdG8gcGFzcyB0byBmcmVlKCkgb3JpZ2luYWwgcG9pbnRlciwgbm90IGFsaWduZWQgb25lLgorCisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICB8IHBhZGRpbmcgfCBkZXNjcmlwdG9yIHwgICAgICAgICAgIGFsaWduZWQgYmxvY2sgICAgICAgICAgIHwgcGFkZGluZyB8CisgICAgICAgICAgICArLS0tLS0tLS0tKy0tLS0tLS0tLS0tLSstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSstLS0tLS0tLS0rCisgICAgICAgICAgICBeICAgICAgICAgICAgICAgICAgICAgIF4KKyAgICAgICAgICAgIHwgICAgICAgICAgICAgICAgICAgICAgfAorICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICArLSBBbGlnbmVkIHBvaW50ZXIgcmV0dXJuZWQgdG8gY2FsbGVyCisgICAgICAgICAgICArLSBQb2ludGVyIHJldHVybmVkIGJ5IG1hbGxvYygpCisKKyAgICAgICAgQWxpZ25lZCBibG9jayBpcyBmaWxsZWQgd2l0aCB6ZXJvcywgcGFkZGluZ3MgYXJlIGZpbGxlZCB3aXRoIDB4RUYuCisgICAgKi8KKworICAgIGttcF9tZW1fZGVzY3JfdCAgZGVzY3I7CisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAga21wX3VpbnRwdHJfdCAgICBhZGRyX2FsaWduZWQ7ICAgICAgICAgIC8vIEFsaWduZWQgYWRkcmVzcyB0byByZXR1cm4gdG8gY2FsbGVyLgorICAgIGttcF91aW50cHRyX3QgICAgYWRkcl9kZXNjcjsgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIG1lbW9yeSBibG9jayBkZXNjcmlwdG9yLgorCisgICAgS0VfVFJBQ0UoIDI1LCAoCisgICAgICAgICItPiBfX19rbXBfYWxsb2NhdGVfYWxpZ24oICVkLCAlZCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgICAoaW50KSBzaXplLAorICAgICAgICAoaW50KSBhbGlnbm1lbnQKKyAgICAgICAgS01QX1NSQ19MT0NfUEFSTQorICAgICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFsaWdubWVudCA8IDMyICogMTAyNCApOyAvLyBBbGlnbm1lbnQgc2hvdWxkIG5vdCBiZSB0b28KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIHZvaWQgKiApIDw9IHNpemVvZigga21wX3VpbnRwdHJfdCApICk7CisgICAgICAgIC8vIE1ha2Ugc3VyZSBrbXBfdWludHB0cl90IGlzIGVub3VnaCB0byBzdG9yZSBhZGRyZXNzZXMuCisKKyAgICBkZXNjci5zaXplX2FsaWduZWQgPSBzaXplOworICAgIGRlc2NyLnNpemVfYWxsb2NhdGVkID0gZGVzY3Iuc2l6ZV9hbGlnbmVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudDsKKworI2lmIEtNUF9ERUJVRworICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPSBfbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworI2Vsc2UKKyAgICBkZXNjci5wdHJfYWxsb2NhdGVkID0gbWFsbG9jX3NyY19sb2MoIGRlc2NyLnNpemVfYWxsb2NhdGVkIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKAorICAgICAgICAiICAgbWFsbG9jKCAlZCApIHJldHVybmVkICVwXG4iLAorICAgICAgICAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgZGVzY3IucHRyX2FsbG9jYXRlZAorICAgICkgKTsKKyAgICBpZiAoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgPT0gTlVMTCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBPdXRPZkhlYXBNZW1vcnkgKTsKKyAgICB9OworCisgICAgYWRkcl9hbGxvY2F0ZWQgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsbG9jYXRlZDsKKyAgICBhZGRyX2FsaWduZWQgPQorICAgICAgICAoIGFkZHJfYWxsb2NhdGVkICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIGFsaWdubWVudCApCisgICAgICAgICYgfiAoIGFsaWdubWVudCAtIDEgKTsKKyAgICBhZGRyX2Rlc2NyID0gYWRkcl9hbGlnbmVkIC0gc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKTsKKworICAgIGRlc2NyLnB0cl9hbGlnbmVkID0gKHZvaWQgKikgYWRkcl9hbGlnbmVkOworCisgICAgS0VfVFJBQ0UoIDI2LCAoCisgICAgICAgICIgICBfX19rbXBfYWxsb2NhdGVfYWxpZ246ICIKKyAgICAgICAgICAgICJwdHJfYWxsb2NhdGVkPSVwLCBzaXplX2FsbG9jYXRlZD0lZCwgIgorICAgICAgICAgICAgInB0cl9hbGlnbmVkPSVwLCBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgIGRlc2NyLnB0cl9hbGxvY2F0ZWQsCisgICAgICAgIChpbnQpIGRlc2NyLnNpemVfYWxsb2NhdGVkLAorICAgICAgICBkZXNjci5wdHJfYWxpZ25lZCwKKyAgICAgICAgKGludCkgZGVzY3Iuc2l6ZV9hbGlnbmVkCisgICAgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGxvY2F0ZWQgPD0gYWRkcl9kZXNjciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfZGVzY3IgKyBzaXplb2YoIGttcF9tZW1fZGVzY3JfdCApID09IGFkZHJfYWxpZ25lZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGFkZHJfYWxpZ25lZCArIGRlc2NyLnNpemVfYWxpZ25lZCA8PSBhZGRyX2FsbG9jYXRlZCArIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYWRkcl9hbGlnbmVkICUgYWxpZ25tZW50ID09IDAgKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgIC8vIEZpbGwgYWxsb2NhdGVkIG1lbW9yeSBibG9jayB3aXRoIDB4RUYuCisjZW5kaWYKKyAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGlnbmVkLCAweDAwLCBkZXNjci5zaXplX2FsaWduZWQgKTsKKyAgICAgICAgLy8gRmlsbCB0aGUgYWxpZ25lZCBtZW1vcnkgYmxvY2sgKHdoaWNoIGlzIGludGVuZGVkIGZvciB1c2luZyBieSBjYWxsZXIpIHdpdGggMHgwMC4gRG8gbm90CisgICAgICAgIC8vIHB1dCB0aGlzIGZpbGxpbmcgdW5kZXIgS01QX0RFQlVHIGNvbmRpdGlvbiEgTWFueSBjYWxsZXJzIGV4cGVjdCB6ZXJvZWQgbWVtb3J5LiAoUGFkZGluZworICAgICAgICAvLyBieXRlcyByZW1haW4gZmlsbGVkIHdpdGggMHhFRiBpbiBkZWJ1Z2dpbmcgbGlicmFyeS4pCisgICAgKiAoIChrbXBfbWVtX2Rlc2NyX3QgKikgYWRkcl9kZXNjciApID0gZGVzY3I7CisKKyAgICBLTVBfTUIoKTsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiPC0gX19fa21wX2FsbG9jYXRlX2FsaWduKCkgcmV0dXJucyAlcFxuIiwgZGVzY3IucHRyX2FsaWduZWQgKSApOworICAgIHJldHVybiBkZXNjci5wdHJfYWxpZ25lZDsKK30gLy8gZnVuYyBfX19rbXBfYWxsb2NhdGVfYWxpZ24KKworCisvKgorICAgIEFsbG9jYXRlIG1lbW9yeSBvbiBjYWNoZSBsaW5lIGJvdW5kYXJ5LCBmaWxsIGFsbG9jYXRlZCBtZW1vcnkgd2l0aCAweDAwLgorICAgIERvIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX2FsbG9jYXRlIG1hY3JvIGluc3RlYWQuCisgICAgTlVMTCBpcyBORVZFUiByZXR1cm5lZCwgX19rbXBfYWJvcnQoKSBpcyBjYWxsZWQgaW4gY2FzZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiBlcnJvci4KKyAgICBNdXN0IHVzZSBfX2ttcF9mcmVlIHdoZW4gZnJlZWluZyBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoaXMgcm91dGluZSEKKyAqLwordm9pZCAqCitfX19rbXBfYWxsb2NhdGUoIHNpemVfdCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIHZvaWQgKiBwdHI7CisgICAgS0VfVFJBQ0UoIDI1LCAoICItPiBfX2ttcF9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwgKGludCkgc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICBwdHIgPSBfX19rbXBfYWxsb2NhdGVfYWxpZ24oIHNpemUsIF9fa21wX2FsaWduX2FsbG9jIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2FsbG9jYXRlKCkgcmV0dXJucyAlcFxuIiwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBmdW5jIF9fX2ttcF9hbGxvY2F0ZQorCisjaWYgKEJVSUxEX01FTU9SWT09RklSU1RfVE9VQ0gpCit2b2lkICoKK19fa21wX2Z0X3BhZ2VfYWxsb2NhdGUoc2l6ZV90IHNpemUpCit7CisgIHZvaWQgKmFkciwgKmFhZHI7CisjaWYgS01QX09TX0xJTlVYCisgIC8qIFRPRE86IFVzZSB0aGlzIGZ1bmN0aW9uIHRvIGdldCBwYWdlIHNpemUgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gZ2V0cGFnZXNpemUoKTsKKyNlbHNlCisgIC8qIFRPRE86IEZpbmQgd2luZG93cyBmdW5jdGlvbiB0byBnZXQgcGFnZSBzaXplIGFuZCB1c2UgaXQgZXZlcnl3aGVyZSAqLworICBpbnQgcGFnZV9zaXplID0gUEFHRV9TSVpFOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisgIGFkciA9ICh2b2lkICopIF9fa21wX3RocmVhZF9tYWxsb2MoIF9fa21wX2dldF90aHJlYWQoKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemUgKyBwYWdlX3NpemUgKyBLTVBfUFRSX1NLSVApOworICBpZiAoIGFkciA9PSAwICkKKyAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworCisgIC8qIGNoZWNrIHRvIHNlZSBpZiBhZHIgaXMgb24gYSBwYWdlIGJvdW5kYXJ5LiAqLworICBpZiAoICggKGttcF91aW50cHRyX3QpIGFkciAmIChwYWdlX3NpemUgLSAxKSkgPT0gMCkKKyAgICAvKiBub3RoaW5nIHRvIGRvIGlmIGFkciBpcyBhbHJlYWR5IG9uIGEgcGFnZSBib3VuZGFyeS4gKi8KKyAgICBhYWRyID0gYWRyOworICBlbHNlCisgICAgLyogZWxzZSBzZXQgYWFkciB0byB0aGUgZmlyc3QgcGFnZSBib3VuZGFyeSBpbiB0aGUgYWxsb2NhdGVkIG1lbW9yeS4gKi8KKyAgICBhYWRyID0gKHZvaWQgKikgKCAoIChrbXBfdWludHB0cl90KSBhZHIgKyBwYWdlX3NpemUpICYgfihwYWdlX3NpemUgLSAxKSApOworCisgIC8qIHRoZSBmaXJzdCB0b3VjaCBieSB0aGUgb3duZXIgdGhyZWFkLiAqLworICAqKCh2b2lkKiopYWFkcikgPSBhZHI7CisKKyAgLyogc2tpcCB0aGUgbWVtb3J5IHNwYWNlIHVzZWQgZm9yIHN0b3JpbmcgYWRyIGFib3ZlLiAqLworICByZXR1cm4gKHZvaWQqKSgoY2hhciopYWFkciArIEtNUF9QVFJfU0tJUCk7Cit9CisjZW5kaWYKKworLyoKKyAgICBBbGxvY2F0ZSBtZW1vcnkgb24gcGFnZSBib3VuZGFyeSwgZmlsbCBhbGxvY2F0ZWQgbWVtb3J5IHdpdGggMHgwMC4KKyAgICBEb2VzIG5vdCBjYWxsIHRoaXMgZnVuYyBkaXJlY3RseSEgVXNlIF9fa21wX3BhZ2VfYWxsb2NhdGUgbWFjcm8gaW5zdGVhZC4KKyAgICBOVUxMIGlzIE5FVkVSIHJldHVybmVkLCBfX2ttcF9hYm9ydCgpIGlzIGNhbGxlZCBpbiBjYXNlIG9mIG1lbW9yeSBhbGxvY2F0aW9uIGVycm9yLgorICAgIE11c3QgdXNlIF9fa21wX2ZyZWUgd2hlbiBmcmVlaW5nIG1lbW9yeSBhbGxvY2F0ZWQgYnkgdGhpcyByb3V0aW5lIQorICovCit2b2lkICoKK19fX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICBpbnQgICAgcGFnZV9zaXplID0gOCAqIDEwMjQ7CisgICAgdm9pZCAqIHB0cjsKKworICAgIEtFX1RSQUNFKCAyNSwgKAorICAgICAgICAiLT4gX19rbXBfcGFnZV9hbGxvY2F0ZSggJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgICAgKGludCkgc2l6ZQorICAgICAgICBLTVBfU1JDX0xPQ19QQVJNCisgICAgKSApOworICAgIHB0ciA9IF9fX2ttcF9hbGxvY2F0ZV9hbGlnbiggc2l6ZSwgcGFnZV9zaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX3BhZ2VfYWxsb2NhdGUoICVkICkgcmV0dXJucyAlcFxuIiwgKGludCkgc2l6ZSwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBfX19rbXBfcGFnZV9hbGxvY2F0ZQorCisvKgorICAgIEZyZWUgbWVtb3J5IGFsbG9jYXRlZCBieSBfX2ttcF9hbGxvY2F0ZSgpIGFuZCBfX2ttcF9wYWdlX2FsbG9jYXRlKCkuCisgICAgSW4gZGVidWcgbW9kZSwgZmlsbCB0aGUgbWVtb3J5IGJsb2NrIHdpdGggMHhFRiBiZWZvcmUgY2FsbCB0byBmcmVlKCkuCisqLwordm9pZAorX19fa21wX2ZyZWUoIHZvaWQgKiBwdHIgS01QX1NSQ19MT0NfREVDTCApCit7CisgICAga21wX21lbV9kZXNjcl90IGRlc2NyOworICAgIGttcF91aW50cHRyX3QgICBhZGRyX2FsbG9jYXRlZDsgICAgICAgIC8vIEFkZHJlc3MgcmV0dXJuZWQgYnkgbWFsbG9jKCkuCisgICAga21wX3VpbnRwdHJfdCAgIGFkZHJfYWxpZ25lZDsgICAgICAgICAgLy8gQWxpZ25lZCBhZGRyZXNzIHBhc3NlZCBieSBjYWxsZXIuCisKKyAgICBLRV9UUkFDRSggMjUsICggIi0+IF9fa21wX2ZyZWUoICVwICkgY2FsbGVkIGZyb20gJXM6JWRcbiIsIHB0ciBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICBLTVBfQVNTRVJUKCBwdHIgIT0gTlVMTCApOworCisgICAgZGVzY3IgPSAqICgga21wX21lbV9kZXNjcl90ICopICggKGttcF91aW50cHRyX3QpIHB0ciAtIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgKTsKKworICAgIEtFX1RSQUNFKCAyNiwgKCAiICAgX19rbXBfZnJlZTogICAgICIKKyAgICAgICAgICAgICAgICAgICAgInB0cl9hbGxvY2F0ZWQ9JXAsIHNpemVfYWxsb2NhdGVkPSVkLCAiCisgICAgICAgICAgICAgICAgICAgICJwdHJfYWxpZ25lZD0lcCwgc2l6ZV9hbGlnbmVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICBkZXNjci5wdHJfYWxsb2NhdGVkLCAoaW50KSBkZXNjci5zaXplX2FsbG9jYXRlZCwKKyAgICAgICAgICAgICAgICAgICAgZGVzY3IucHRyX2FsaWduZWQsIChpbnQpIGRlc2NyLnNpemVfYWxpZ25lZCApKTsKKworICAgIGFkZHJfYWxsb2NhdGVkID0gKGttcF91aW50cHRyX3QpIGRlc2NyLnB0cl9hbGxvY2F0ZWQ7CisgICAgYWRkcl9hbGlnbmVkICAgPSAoa21wX3VpbnRwdHJfdCkgZGVzY3IucHRyX2FsaWduZWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgJSBDQUNIRV9MSU5FID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBkZXNjci5wdHJfYWxpZ25lZCA9PSBwdHIgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsbG9jYXRlZCArIHNpemVvZigga21wX21lbV9kZXNjcl90ICkgPD0gYWRkcl9hbGlnbmVkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZGVzY3Iuc2l6ZV9hbGlnbmVkIDwgZGVzY3Iuc2l6ZV9hbGxvY2F0ZWQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBhZGRyX2FsaWduZWQgKyBkZXNjci5zaXplX2FsaWduZWQgPD0gYWRkcl9hbGxvY2F0ZWQgKyBkZXNjci5zaXplX2FsbG9jYXRlZCApOworCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBtZW1zZXQoIGRlc2NyLnB0cl9hbGxvY2F0ZWQsIDB4RUYsIGRlc2NyLnNpemVfYWxsb2NhdGVkICk7CisgICAgICAgICAgICAvLyBGaWxsIG1lbW9yeSBibG9jayB3aXRoIDB4RUYsIGl0IGhlbHBzIGNhdGNoIHVzaW5nIGZyZWVkIG1lbW9yeS4KKyAgICAjZW5kaWYKKworICAgICNpZm5kZWYgTEVBS19NRU1PUlkKKyAgICAgICAgS0VfVFJBQ0UoIDEwLCAoICIgICBmcmVlKCAlcCApXG4iLCBkZXNjci5wdHJfYWxsb2NhdGVkICkgKTsKKyAgICAjIGlmZGVmIEtNUF9ERUJVRworICAgICAgICBfZnJlZV9zcmNfbG9jKCBkZXNjci5wdHJfYWxsb2NhdGVkLCBfZmlsZV8sIF9saW5lXyApOworICAgICMgZWxzZQorICAgICAgICBmcmVlX3NyY19sb2MoIGRlc2NyLnB0cl9hbGxvY2F0ZWQgS01QX1NSQ19MT0NfUEFSTSApOworICAgICMgZW5kaWYKKyAgICAjZW5kaWYKKyAgICBLTVBfTUIoKTsKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2ZyZWUoKSByZXR1cm5zXG4iICkgKTsKK30gLy8gZnVuYyBfX19rbXBfZnJlZQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgVVNFX0ZBU1RfTUVNT1JZID09IDMKKy8vIEFsbG9jYXRlIGZhc3QgbWVtb3J5IGJ5IGZpcnN0IHNjYW5uaW5nIHRoZSB0aHJlYWQncyBmcmVlIGxpc3RzCisvLyBJZiBhIGNodW5rIHRoZSByaWdodCBzaXplIGV4aXN0cywgZ3JhYiBpdCBvZmYgdGhlIGZyZWUgbGlzdC4KKy8vIE90aGVyd2lzZSBhbGxvY2F0ZSBub3JtYWxseSB1c2luZyBrbXBfdGhyZWFkX21hbGxvYy4KKworLy8gQUM6IEhvdyB0byBjaG9vc2UgdGhlIGxpbWl0PyBKdXN0IGdldCAxNiBmb3Igbm93Li4uCisjZGVmaW5lIEtNUF9GUkVFX0xJU1RfTElNSVQgMTYKKworLy8gQWx3YXlzIHVzZSAxMjggYnl0ZXMgZm9yIGRldGVybWluaW5nIGJ1Y2tldHMgZm9yIGNhY2hpbmcgbWVtb3J5IGJsb2NrcworI2RlZmluZSBEQ0FDSEVfTElORSAgMTI4CisKK3ZvaWQgKgorX19fa21wX2Zhc3RfYWxsb2NhdGUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBzaXplX3Qgc2l6ZSBLTVBfU1JDX0xPQ19ERUNMICkKK3sKKyAgICB2b2lkICAgICAgICAgICAgKiBwdHI7CisgICAgaW50ICAgICAgICAgICAgICAgbnVtX2xpbmVzOworICAgIGludCAgICAgICAgICAgICAgIGlkeDsKKyAgICBpbnQgICAgICAgICAgICAgICBpbmRleDsKKyAgICB2b2lkICAgICAgICAgICAgKiBhbGxvY19wdHI7CisgICAgc2l6ZV90ICAgICAgICAgICAgYWxsb2Nfc2l6ZTsKKyAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkZXNjcjsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZmFzdF9hbGxvY2F0ZSggVCMlZCwgJWQgKSBjYWxsZWQgZnJvbSAlczolZFxuIiwKKyAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCAoaW50KSBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKSApOworCisgICAgbnVtX2xpbmVzID0gKCBzaXplICsgRENBQ0hFX0xJTkUgLSAxICkgLyBEQ0FDSEVfTElORTsKKyAgICBpZHggPSBudW1fbGluZXMgLSAxOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGlkeCA+PSAwICk7CisgICAgaWYgKCBpZHggPCAyICkgeworICAgICAgICBpbmRleCA9IDA7ICAgICAgIC8vIGlkeCBpcyBbIDAsIDEgXSwgdXNlIGZpcnN0IGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSAyOyAgIC8vIDEsIDIgY2FjaGUgbGluZXMgb3IgbGVzcyB0aGFuIGNhY2hlIGxpbmUKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMTsgICAgICAgLy8gaWR4IGlzIFsgMiwgMyBdLCB1c2Ugc2Vjb25kIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSA0OyAgIC8vIDMsIDQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMjsgICAgICAgLy8gaWR4IGlzIFsgNCwgMTUgXSwgdXNlIHRoaXJkIGZyZWUgbGlzdAorICAgICAgICBudW1fbGluZXMgPSAxNjsgIC8vIDUsIDYsIC4uLiwgMTYgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA+Pj0gMiApID09IDAgKSB7CisgICAgICAgIGluZGV4ID0gMzsgICAgICAgLy8gaWR4IGlzIFsgMTYsIDYzIF0sIHVzZSBmb3VydGggZnJlZSBsaXN0CisgICAgICAgIG51bV9saW5lcyA9IDY0OyAgLy8gMTcsIDE4LCAuLi4sIDY0IGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIHsKKyAgICAgICAgZ290byBhbGxvY19jYWxsOyAvLyA2NSBvciBtb3JlIGNhY2hlIGxpbmVzICggPiA4S0IgKSwgZG9uJ3QgdXNlIGZyZWUgbGlzdHMKKyAgICB9CisKKyAgICBwdHIgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGY7CisgICAgaWYgKCBwdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gcG9wIHRoZSBoZWFkIG9mIG5vLXN5bmMgZnJlZSBsaXN0CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc2VsZiA9ICooKHZvaWQgKiopcHRyKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgPT0KKyAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90ICopKCAoa21wX3VpbnRwdHJfdClwdHIgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApKS0+cHRyX2FsaWduZWQgKTsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsKKyAgICBwdHIgPSBUQ1JfU1lOQ19QVFIoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgIC8vIG5vLXN5bmMgZnJlZSBsaXN0IGlzIGVtcHR5LCB1c2Ugc3luYyBmcmVlIGxpc3QgKGZpbGxlZCBpbiBieSBvdGhlciB0aHJlYWRzIG9ubHkpCisgICAgICAgIC8vIHBvcCB0aGUgaGVhZCBvZiB0aGUgc3luYyBmcmVlIGxpc3QsIHB1c2ggTlVMTCBpbnN0ZWFkCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgJnRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYywgcHRyLCBOVUxMICkgKQorICAgICAgICB7CisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICBwdHIgPSBUQ1JfU1lOQ19QVFIoIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICB9CisgICAgICAgIC8vIHB1c2ggdGhlIHJlc3Qgb2YgY2hhaW4gaW50byBuby1zeW5jIGZyZWUgbGlzdCAoY2FuIGJlIE5VTEwgaWYgdGhlcmUgd2FzIHRoZSBvbmx5IGJsb2NrKQorICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSAqKCh2b2lkICoqKXB0cik7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09CisgICAgICAgICAgICAoKGttcF9tZW1fZGVzY3JfdCAqKSggKGttcF91aW50cHRyX3QpcHRyIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKSktPnB0cl9hbGlnbmVkICk7CisgICAgICAgIGdvdG8gZW5kOworICAgIH0KKworICAgIGFsbG9jX2NhbGw6CisgICAgLy8gaGF2ZW4ndCBmb3VuZCBibG9jayBpbiB0aGUgZnJlZSBsaXN0cywgdGh1cyBhbGxvY2F0ZSBpdAorICAgIHNpemUgPSBudW1fbGluZXMgKiBEQ0FDSEVfTElORTsKKworICAgIGFsbG9jX3NpemUgPSBzaXplICsgc2l6ZW9mKCBrbXBfbWVtX2Rlc2NyX3QgKSArIERDQUNIRV9MSU5FOworICAgIEtFX1RSQUNFKCAyNSwgKCAiX19rbXBfZmFzdF9hbGxvY2F0ZTogVCMlZCBDYWxsaW5nIF9fa21wX3RocmVhZF9tYWxsb2Mgd2l0aCBhbGxvY19zaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksIGFsbG9jX3NpemUgKSApOworICAgIGFsbG9jX3B0ciA9IGJnZXQoIHRoaXNfdGhyLCAoYnVmc2l6ZSkgYWxsb2Nfc2l6ZSApOworCisgICAgLy8gYWxpZ24gcHRyIHRvIERDQUNIRV9MSU5FCisgICAgcHRyID0gKHZvaWQgKikoKCAoKGttcF91aW50cHRyX3QpYWxsb2NfcHRyKSArIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICsgRENBQ0hFX0xJTkUgKSAmIH4oIERDQUNIRV9MSU5FIC0gMSApKTsKKyAgICBkZXNjciA9IChrbXBfbWVtX2Rlc2NyX3QgKikoICgoa21wX3VpbnRwdHJfdClwdHIpIC0gc2l6ZW9mKGttcF9tZW1fZGVzY3JfdCkgKTsKKworICAgIGRlc2NyLT5wdHJfYWxsb2NhdGVkID0gYWxsb2NfcHRyOyAgICAgICAgLy8gcmVtZW1iZXIgYWxsb2NhdGVkIHBvaW50ZXIKKyAgICAvLyB3ZSBkb24ndCBuZWVkIHNpemVfYWxsb2NhdGVkCisgICAgZGVzY3ItPnB0cl9hbGlnbmVkICAgPSAodm9pZCAqKXRoaXNfdGhyOyAvLyByZW1lbWJlciBhbGxvY2F0aW5nIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gKGl0IGlzIGFscmVhZHkgc2F2ZWQgaW4gYmdldCBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBidXQgd2UgbWF5IHdhbnQgdG8gdXNlIGFub3RoZXIgYWxsb2NhdG9yIGluIGZ1dHVyZSkKKyAgICBkZXNjci0+c2l6ZV9hbGlnbmVkICA9IHNpemU7CisKKyAgICBlbmQ6CisgICAgS0VfVFJBQ0UoIDI1LCAoICI8LSBfX2ttcF9mYXN0X2FsbG9jYXRlKCBUIyVkICkgcmV0dXJucyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgcHRyICkgKTsKKyAgICByZXR1cm4gcHRyOworfSAvLyBmdW5jIF9fa21wX2Zhc3RfYWxsb2NhdGUKKworLy8gRnJlZSBmYXN0IG1lbW9yeSBhbmQgcGxhY2UgaXQgb24gdGhlIHRocmVhZCdzIGZyZWUgbGlzdCBpZiBpdCBpcyBvZgorLy8gdGhlIGNvcnJlY3Qgc2l6ZS4KK3ZvaWQKK19fX2ttcF9mYXN0X2ZyZWUoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCB2b2lkICogcHRyIEtNUF9TUkNfTE9DX0RFQ0wgKQoreworICAgIGttcF9tZW1fZGVzY3JfdCAqIGRlc2NyOworICAgIGttcF9pbmZvX3QgICAgICAqIGFsbG9jX3RocjsKKyAgICBzaXplX3QgICAgICAgICAgICBzaXplOworICAgIHNpemVfdCAgICAgICAgICAgIGlkeDsKKyAgICBpbnQgICAgICAgICAgICAgICBpbmRleDsKKworICAgIEtFX1RSQUNFKCAyNSwgKCAiLT4gX19rbXBfZmFzdF9mcmVlKCBUIyVkLCAlcCApIGNhbGxlZCBmcm9tICVzOiVkXG4iLAorICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCh0aGlzX3RociksIHB0ciBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICBLTVBfQVNTRVJUKCBwdHIgIT0gTlVMTCApOworCisgICAgZGVzY3IgPSAoa21wX21lbV9kZXNjcl90ICopKCAoKGttcF91aW50cHRyX3QpcHRyKSAtIHNpemVvZihrbXBfbWVtX2Rlc2NyX3QpICk7CisKKyAgICBLRV9UUkFDRSgyNiwgKCIgICBfX2ttcF9mYXN0X2ZyZWU6ICAgICBzaXplX2FsaWduZWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICAoaW50KSBkZXNjci0+c2l6ZV9hbGlnbmVkICkgKTsKKworICAgIHNpemUgPSBkZXNjci0+c2l6ZV9hbGlnbmVkOyAvLyAyLCA0LCAxNiwgNjQsIDY1LCA2NiwgLi4uIGNhY2hlIGxpbmVzCisKKyAgICBpZHggPSBEQ0FDSEVfTElORSAqIDI7IC8vIDIgY2FjaGUgbGluZXMgaXMgbWluaW1hbCBzaXplIG9mIGJsb2NrCisgICAgaWYgKCBpZHggPT0gc2l6ZSApIHsKKyAgICAgICAgaW5kZXggPSAwOyAgICAgICAvLyAyIGNhY2hlIGxpbmVzCisgICAgfSBlbHNlIGlmICggKCBpZHggPDw9IDEgKSA9PSBzaXplICkgeworICAgICAgICBpbmRleCA9IDE7ICAgICAgIC8vIDQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMiApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMjsgICAgICAgLy8gMTYgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgaWYgKCAoIGlkeCA8PD0gMiApID09IHNpemUgKSB7CisgICAgICAgIGluZGV4ID0gMzsgICAgICAgLy8gNjQgY2FjaGUgbGluZXMKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplID4gRENBQ0hFX0xJTkUgKiA2NCApOworICAgICAgICBnb3RvIGZyZWVfY2FsbDsgIC8vIDY1IG9yIG1vcmUgY2FjaGUgbGluZXMgKCA+IDhLQiApCisgICAgfQorCisgICAgYWxsb2NfdGhyID0gKGttcF9pbmZvX3QgKilkZXNjci0+cHRyX2FsaWduZWQ7IC8vIGdldCB0aHJlYWQgb3duaW5nIHRoZSBibG9jaworICAgIGlmICggYWxsb2NfdGhyID09IHRoaXNfdGhyICkgeworICAgICAgICAvLyBwdXNoIGJsb2NrIHRvIHNlbGYgbm8tc3luYyBmcmVlIGxpc3QsIGxpbmtpbmcgcHJldmlvdXMgaGVhZCAoTElGTykKKyAgICAgICAgKigodm9pZCAqKilwdHIpID0gdGhpc190aHItPnRoLnRoX2ZyZWVfbGlzdHNbaW5kZXhdLnRoX2ZyZWVfbGlzdF9zZWxmOworICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3NlbGYgPSBwdHI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdm9pZCAqIGhlYWQgPSB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyOworICAgICAgICBpZiAoIGhlYWQgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIENyZWF0ZSBuZXcgZnJlZSBsaXN0CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsgICAgICAgICAgICAgLy8gbWFyayB0aGUgdGFpbCBvZiB0aGUgbGlzdAorICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gKHNpemVfdCkxOyAgLy8gaGVhZCBvZiB0aGUgbGlzdCBrZWVwcyBpdHMgbGVuZ3RoCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBuZWVkIHRvIGNoZWNrIGV4aXN0ZWQgIm90aGVyIiBsaXN0J3Mgb3duZXIgdGhyZWFkIGFuZCBzaXplIG9mIHF1ZXVlCisgICAgICAgICAgICBrbXBfbWVtX2Rlc2NyX3QgKiBkc2MgID0gKGttcF9tZW1fZGVzY3JfdCAqKSggKGNoYXIqKWhlYWQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSApOworICAgICAgICAgICAga21wX2luZm9fdCAgICAgICogcV90aCA9IChrbXBfaW5mb190ICopKGRzYy0+cHRyX2FsaWduZWQpOyAvLyBhbGxvY2F0aW5nIHRocmVhZCwgc2FtZSBmb3IgYWxsIHF1ZXVlIG5vZGVzCisgICAgICAgICAgICBzaXplX3QgICAgICAgICAgICBxX3N6ID0gZHNjLT5zaXplX2FsbG9jYXRlZCArIDE7ICAgICAgICAgIC8vIG5ldyBzaXplIGluIGNhc2Ugd2UgYWRkIGN1cnJlbnQgdGFzaworICAgICAgICAgICAgaWYgKCBxX3RoID09IGFsbG9jX3RociAmJiBxX3N6IDw9IEtNUF9GUkVFX0xJU1RfTElNSVQgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgY2FuIGFkZCBjdXJyZW50IHRhc2sgdG8gIm90aGVyIiBsaXN0LCBubyBzeW5jIG5lZWRlZAorICAgICAgICAgICAgICAgICooKHZvaWQgKiopcHRyKSA9IGhlYWQ7CisgICAgICAgICAgICAgICAgZGVzY3ItPnNpemVfYWxsb2NhdGVkID0gcV9zejsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X290aGVyID0gcHRyOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBlaXRoZXIgcXVldWUgYmxvY2tzIG93bmVyIGlzIGNoYW5naW5nIG9yIHNpemUgbGltaXQgZXhjZWVkZWQKKyAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHF1ZXVlIHRvIGFsbG9jYXRpbmcgdGhyZWFkIChxX3RoKSBzeW5jaHJvbmVvdXNseSwKKyAgICAgICAgICAgICAgICAvLyBhbmQgc3RhcnQgbmV3IGxpc3QgZm9yIGFsbG9jX3RocidzIHRhc2tzCisgICAgICAgICAgICAgICAgdm9pZCAqIG9sZF9wdHI7CisgICAgICAgICAgICAgICAgdm9pZCAqIHRhaWwgPSBoZWFkOworICAgICAgICAgICAgICAgIHZvaWQgKiBuZXh0ID0gKigodm9pZCAqKiloZWFkKTsKKyAgICAgICAgICAgICAgICB3aGlsZSAoIG5leHQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHF1ZXVlIHNpemUgc2hvdWxkIGRlY3JlYXNlIGJ5IDEgZWFjaCBzdGVwIHRocm91Z2ggdGhlIGxpc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKW5leHQgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCArIDEgPT0KKyAgICAgICAgICAgICAgICAgICAgICAgICgoa21wX21lbV9kZXNjcl90KikoKGNoYXIqKXRhaWwgLSBzaXplb2Yoa21wX21lbV9kZXNjcl90KSkpLT5zaXplX2FsbG9jYXRlZCApOworICAgICAgICAgICAgICAgICAgICB0YWlsID0gbmV4dDsgICAvLyByZW1lbWJlciB0YWlsIG5vZGUKKyAgICAgICAgICAgICAgICAgICAgbmV4dCA9ICooKHZvaWQgKiopbmV4dCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHFfdGggIT0gTlVMTCApOworICAgICAgICAgICAgICAgIC8vIHB1c2ggYmxvY2sgdG8gb3duZXIncyBzeW5jIGZyZWUgbGlzdAorICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgIC8qIHRoZSBuZXh0IHBvaW50ZXIgbXVzdCBiZSBzZXQgYmVmb3JlIHNldHRpbmcgZnJlZV9saXN0IHRvIHB0ciB0byBhdm9pZAorICAgICAgICAgICAgICAgICAgIGV4cG9zaW5nIGEgYnJva2VuIGxpc3QgdG8gb3RoZXIgdGhyZWFkcywgZXZlbiBmb3IgYW4gaW5zdGFudC4gKi8KKyAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKworICAgICAgICAgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKAorICAgICAgICAgICAgICAgICAgICAmcV90aC0+dGgudGhfZnJlZV9saXN0c1tpbmRleF0udGhfZnJlZV9saXN0X3N5bmMsCisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIsCisgICAgICAgICAgICAgICAgICAgIGhlYWQgKSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgICAgICAgICAgICAgIG9sZF9wdHIgPSBUQ1JfUFRSKCBxX3RoLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfc3luYyApOworICAgICAgICAgICAgICAgICAgICAqKCh2b2lkICoqKXRhaWwpID0gb2xkX3B0cjsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAvLyBzdGFydCBuZXcgbGlzdCBvZiBub3Qtc2VsdCB0YXNrcworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmVlX2xpc3RzW2luZGV4XS50aF9mcmVlX2xpc3Rfb3RoZXIgPSBwdHI7CisgICAgICAgICAgICAgICAgKigodm9pZCAqKilwdHIpID0gTlVMTDsKKyAgICAgICAgICAgICAgICBkZXNjci0+c2l6ZV9hbGxvY2F0ZWQgPSAoc2l6ZV90KTE7ICAvLyBoZWFkIG9mIHF1ZXVlIGtlZXBzIGl0cyBsZW5ndGgKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBnb3RvIGVuZDsKKworICAgIGZyZWVfY2FsbDoKKyAgICBLRV9UUkFDRSgyNSwgKCAiX19rbXBfZmFzdF9mcmVlOiBUIyVkIENhbGxpbmcgX19rbXBfdGhyZWFkX2ZyZWUgZm9yIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIpLCBzaXplICkgKTsKKyAgICBfX2ttcF9iZ2V0X2RlcXVldWUoIHRoaXNfdGhyICk7ICAgICAgICAgLyogUmVsZWFzZSBhbnkgcXVldWVkIGJ1ZmZlcnMgKi8KKyAgICBicmVsKCB0aGlzX3RociwgZGVzY3ItPnB0cl9hbGxvY2F0ZWQgKTsKKworICAgIGVuZDoKKyAgICBLRV9UUkFDRSggMjUsICggIjwtIF9fa21wX2Zhc3RfZnJlZSgpIHJldHVybnNcbiIgKSApOworCit9IC8vIGZ1bmMgX19rbXBfZmFzdF9mcmVlCisKKworLy8gSW5pdGlhbGl6ZSB0aGUgdGhyZWFkIGZyZWUgbGlzdHMgcmVsYXRlZCB0byBmYXN0IG1lbW9yeQorLy8gT25seSBkbyB0aGlzIHdoZW4gYSB0aHJlYWQgaXMgaW5pdGlhbGx5IGNyZWF0ZWQuCit2b2lkCitfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgS0VfVFJBQ0UoMTAsICggIl9fa21wX2luaXRpYWxpemVfZmFzdF9tZW1vcnk6IENhbGxlZCBmcm9tIHRoICVwXG4iLCB0aGlzX3RociApICk7CisKKyAgICBtZW1zZXQgKCB0aGlzX3Roci0+dGgudGhfZnJlZV9saXN0cywgMCwgTlVNX0xJU1RTICogc2l6ZW9mKCBrbXBfZnJlZV9saXN0X3QgKSApOworfQorCisvLyBGcmVlIHRoZSBtZW1vcnkgaW4gdGhlIHRocmVhZCBmcmVlIGxpc3RzIHJlbGF0ZWQgdG8gZmFzdCBtZW1vcnkKKy8vIE9ubHkgZG8gdGhpcyB3aGVuIGEgdGhyZWFkIGlzIGJlaW5nIHJlYXBlZCAoZGVzdHJveWVkKS4KK3ZvaWQKK19fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICAvLyBTdXBwb3NlIHdlIHVzZSBCR0VUIHVuZGVybHlpbmcgYWxsb2NhdG9yLCB3YWxrIHRocm91Z2ggaXRzIHN0cnVjdHVyZXMuLi4KKyAgICBpbnQgICAgICAgICAgYmluOworICAgIHRocl9kYXRhX3QgKiB0aHIgPSBnZXRfdGhyX2RhdGEoIHRoICk7CisgICAgdm9pZCAgICAgICoqIGxzdCA9IE5VTEw7CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBDYWxsZWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aCApICkgKTsKKworICAgIF9fa21wX2JnZXRfZGVxdWV1ZSggdGggKTsgICAgICAgICAvLyBSZWxlYXNlIGFueSBxdWV1ZWQgYnVmZmVycworCisgICAgLy8gRGlnIHRocm91Z2ggZnJlZSBsaXN0cyBhbmQgZXh0cmFjdCBhbGwgYWxsb2NhdGVkIGJsb2NrcworICAgIGZvciAoIGJpbiA9IDA7IGJpbiA8IE1BWF9CR0VUX0JJTlM7ICsrYmluICkgeworICAgICAgICBiZmhlYWRfdCAqIGIgPSB0aHItPmZyZWVsaXN0WyBiaW4gXS5xbC5mbGluazsKKyAgICAgICAgd2hpbGUgKCBiICE9ICZ0aHItPmZyZWVsaXN0WyBiaW4gXSApIHsKKyAgICAgICAgICAgIGlmICggKGttcF91aW50cHRyX3QpYi0+YmguYmIuYnRociAmIDEgKSB7ICAgLy8gaWYgdGhlIGJ1ZmZlciBpcyBhbiBhbGxvY2F0ZWQgYWRkcmVzcz8KKyAgICAgICAgICAgICAgICAqKCh2b2lkKiopYikgPSBsc3Q7ICAgLy8gbGluayB0aGUgbGlzdCAob3ZlcnJpZGUgYnRociwgYnV0IGtlZXAgZmxpbmsgeWV0KQorICAgICAgICAgICAgICAgIGxzdCA9ICh2b2lkKiopYjsgICAgICAvLyBwdXNoIGIgaW50byBsc3QKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGIgPSBiLT5xbC5mbGluazsgICAgICAgICAgLy8gZ2V0IG5leHQgYnVmZmVyCisgICAgICAgIH0KKyAgICB9CisgICAgd2hpbGUgKCBsc3QgIT0gTlVMTCApIHsKKyAgICAgICAgdm9pZCAqIG5leHQgPSAqbHN0OworICAgICAgICBLRV9UUkFDRSgxMCwgKCAiX19rbXBfZnJlZV9mYXN0X21lbW9yeTogZnJlZWluZyAlcCwgbmV4dD0lcCB0aCAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGxzdCwgbmV4dCwgdGgsIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICkgKSApOworICAgICAgICAoKnRoci0+cmVsZmNuKShsc3QpOworICAgICAgICAjaWYgQnVmU3RhdHMKKyAgICAgICAgICAgIC8vIGNvdW50IGJsb2NrcyB0byBwcmV2ZW50IHByb2JsZW1zIGluIF9fa21wX2ZpbmFsaXplX2JnZXQoKQorICAgICAgICAgICAgdGhyLT5udW1wcmVsKys7ICAgICAgIC8qIE5yIG9mIGV4cGFuc2lvbiBibG9jayByZWxlYXNlcyAqLworICAgICAgICAgICAgdGhyLT5udW1wYmxrLS07ICAgICAgIC8qIFRvdGFsIG51bWJlciBvZiBibG9ja3MgKi8KKyAgICAgICAgI2VuZGlmCisgICAgICAgIGxzdCA9ICh2b2lkKiopbmV4dDsKKyAgICB9CisKKyAgICBLRV9UUkFDRSg1LCAoICJfX2ttcF9mcmVlX2Zhc3RfbWVtb3J5OiBGcmVlZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKSApICk7Cit9CisKKyNlbmRpZiAvLyBVU0VfRkFTVF9NRU1PUlkKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmMgYi9yYzMvcnVudGltZS9zcmMva21wX2F0b21pYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkNWQzNDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2F0b21pYy5jCkBAIC0wLDAgKzEsMjkwNyBAQAorLyoKKyAqIGttcF9hdG9taWMuYyAtLSBBVE9NSUMgaW1wbGVtZW50YXRpb24gcm91dGluZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXAuaCIgICAgICAgICAgICAgICAgICAvLyBUUlVFLCBhc20gcm91dGluZXMgcHJvdG90eXBlcworCit0eXBlZGVmIHVuc2lnbmVkIGNoYXIgdWNoYXI7Cit0eXBlZGVmIHVuc2lnbmVkIHNob3J0IHVzaG9ydDsKKworLyohCitAZGVmZ3JvdXAgQVRPTUlDX09QUyBBdG9taWMgT3BlcmF0aW9ucworVGhlc2UgZnVuY3Rpb25zIGFyZSB1c2VkIGZvciBpbXBsZW1lbnRpbmcgdGhlIG1hbnkgZGlmZmVyZW50IHZhcmlldGllcyBvZiBhdG9taWMgb3BlcmF0aW9ucy4KKworVGhlIGNvbXBpbGVyIGlzIGF0IGxpYmVydHkgdG8gaW5saW5lIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgYXJlIG5hdHVyYWxseSBzdXBwb3J0ZWQKK2J5IHRoZSB0YXJnZXQgYXJjaGl0ZWN0dXJlLiBGb3IgaW5zdGFuY2Ugb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuIGF0b21pYyBsaWtlIHRoaXMgY2FuIGJlIGlubGluZWQKK0Bjb2RlCitzdGF0aWMgaW50IHMgPSAwOworI3ByYWdtYSBvbXAgYXRvbWljCisgICAgcysrOworQGVuZGNvZGUKK3VzaW5nIHRoZSBzaW5nbGUgaW5zdHJ1Y3Rpb246IGBsb2NrOyBpbmNsIHNgCisKK0hvd2V2ZXIgdGhlIHJ1bnRpbWUgZG9lcyBwcm92aWRlIGVudHJ5cG9pbnRzIGZvciB0aGVzZSBvcGVyYXRpb25zIHRvIHN1cHBvcnQgY29tcGlsZXJzIHRoYXQgY2hvb3NlCitub3QgdG8gaW5saW5lIHRoZW0uIChGb3IgaW5zdGFuY2UsIGBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRgIGNvdWxkIGJlIHVzZWQgdG8gcGVyZm9ybSB0aGUKK2luY3JlbWVudCBhYm92ZS4pCisKK1RoZSBuYW1lcyBvZiB0aGUgZnVuY3Rpb25zIGFyZSBlbmNvZGVkIGJ5IHVzaW5nIHRoZSBkYXRhIHR5cGUgbmFtZSBhbmQgdGhlIG9wZXJhdGlvbiBuYW1lLCBhcyBpbiB0aGVzZSB0YWJsZXMuCisKK0RhdGEgVHlwZSAgfCBEYXRhIHR5cGUgZW5jb2RpbmcKKy0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLQoraW50OF90ICAgICB8IGBmaXhlZDFgCit1aW50OF90ICAgIHwgYGZpeGVkMXVgCitpbnQxNl90ICAgIHwgYGZpeGVkMmAKK3VpbnQxNl90ICAgfCBgZml4ZWQydWAKK2ludDMyX3QgICAgfCBgZml4ZWQ0YAordWludDMyX3QgICB8IGBmaXhlZDR1YAoraW50MzJfdCAgICB8IGBmaXhlZDhgCit1aW50MzJfdCAgIHwgYGZpeGVkOHVgCitmbG9hdCAgICAgIHwgYGZsb2F0NGAKK2RvdWJsZSAgICAgfCBgZmxvYXQ4YAorZmxvYXQgMTAgKDgwODcgZWlnaHR5IGJpdCBmbG9hdCkgIHwgYGZsb2F0MTBgCitjb21wbGV4PGZsb2F0PiAgIHwgIGBjbXBseDRgCitjb21wbGV4PGRvdWJsZT4gIHwgYGNtcGx4OGAKK2NvbXBsZXg8ZmxvYXQxMD4gfCBgY21wbHgxMGAKKzxicj4KKworT3BlcmF0aW9uIHwgT3BlcmF0aW9uIGVuY29kaW5nCistLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLS0tLS0KKysgfCBhZGQKKy0gfCBzdWIKK1wqIHwgbXVsCisvIHwgZGl2CismIHwgYW5kYgorPDwgfCBzaGwKK1w+XD4gfCBzaHIKK1x8IHwgb3JiCiteICB8IHhvcgorJiYgfCBhbmRsCitcfFx8IHwgb3JsCittYXhpbXVtIHwgbWF4CittaW5pbXVtIHwgbWluCisuZXF2LiAgIHwgZXF2CisubmVxdi4gIHwgbmVxdgorCis8YnI+CitGb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMsIGBfcmV2YCBjYW4gYWxzbyBiZSBhZGRlZCBmb3IgdGhlIHJldmVyc2VkIG9wZXJhdGlvbi4KK0ZvciB0aGUgZnVuY3Rpb25zIHRoYXQgY2FwdHVyZSB0aGUgcmVzdWx0LCB0aGUgc3VmZml4IGBfY3B0YCBpcyBhZGRlZC4KKworVXBkYXRlIEZ1bmN0aW9ucworPT09PT09PT09PT09PT09PQorVGhlIGdlbmVyYWwgZm9ybSBvZiBhbiBhdG9taWMgZnVuY3Rpb24gdGhhdCBqdXN0IHBlcmZvcm1zIGFuIHVwZGF0ZSAod2l0aG91dCBhIGBjYXB0dXJlYCkKK0Bjb2RlCit2b2lkIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKTsKK0BlbmRjb2RlCitAcGFyYW0gaWRlbnRfdCAgYSBwb2ludGVyIHRvIHNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgIHRoZSBnbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gbGhzICAgYSBwb2ludGVyIHRvIHRoZSBsZWZ0IG9wZXJhbmQKK0BwYXJhbSByaHMgICB0aGUgcmlnaHQgb3BlcmFuZAorCitgY2FwdHVyZWAgZnVuY3Rpb25zCis9PT09PT09PT09PT09PT09PT09CitUaGUgY2FwdHVyZSBmdW5jdGlvbnMgcGVyZm9ybSBhbiBhdG9taWMgdXBkYXRlIGFuZCByZXR1cm4gYSByZXN1bHQsIHdoaWNoIGlzIGVpdGhlciB0aGUgdmFsdWUKK2JlZm9yZSB0aGUgY2FwdHVyZSwgb3IgdGhhdCBhZnRlci4gVGhleSB0YWtlIGFuIGFkZGl0aW9uYWwgYXJndW1lbnQgdG8gZGV0ZXJtaW5lIHdoaWNoIHJlc3VsdCBpcyByZXR1cm5lZC4KK1RoZWlyIGdlbmVyYWwgZm9ybSBpcyB0aGVyZWZvcmUKK0Bjb2RlCitUWVBFIF9fa21wY19hdG9taWNfPGRhdGF0eXBlPl88b3BlcmF0aW9uPl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzLCBpbnQgZmxhZyApOworQGVuZGNvZGUKK0BwYXJhbSBpZGVudF90ICBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCAgdGhlIGdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBsaHMgICBhIHBvaW50ZXIgdG8gdGhlIGxlZnQgb3BlcmFuZAorQHBhcmFtIHJocyAgIHRoZSByaWdodCBvcGVyYW5kCitAcGFyYW0gZmxhZyAgb25lIGlmIHRoZSByZXN1bHQgaXMgdG8gYmUgY2FwdHVyZWQgKmFmdGVyKiB0aGUgb3BlcmF0aW9uLCB6ZXJvIGlmIGNhcHR1cmVkICpiZWZvcmUqLgorCitUaGUgb25lIHNldCBvZiBleGNlcHRpb25zIHRvIHRoaXMgaXMgdGhlIGBjb21wbGV4PGZsb2F0PmAgdHlwZSB3aGVyZSB0aGUgdmFsdWUgaXMgbm90IHJldHVybmVkLAorcmF0aGVyIGFuIGV4dHJhIGFyZ3VtZW50IHBvaW50ZXIgaXMgcGFzc2VkLgorCitUaGV5IGxvb2sgbGlrZQorQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfPG9wPl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK0BlbmRjb2RlCisKK1JlYWQgYW5kIFdyaXRlIE9wZXJhdGlvbnMKKz09PT09PT09PT09PT09PT09PT09PT09PT0KK1RoZSBPcGVuTVA8c3VwPio8L3N1cD4gc3RhbmRhcmQgbm93IHN1cHBvcnRzIGF0b21pYyBvcGVyYXRpb25zIHRoYXQgc2ltcGx5IGVuc3VyZSB0aGF0IHRoZQordmFsdWUgaXMgcmVhZCBvciB3cml0dGVuIGF0b21pY2FsbHksIHdpdGggbm8gbW9kaWZpY2F0aW9uCitwZXJmb3JtZWQuIEluIG1hbnkgY2FzZXMgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIHRoZXNlIG9wZXJhdGlvbnMgY2FuIGJlIGlubGluZWQgc2luY2UKK3RoZSBhcmNoaXRlY3R1cmUgZ3VhcmFudGVlcyB0aGF0IG5vIHRlYXJpbmcgb2NjdXJzIG9uIGFsaWduZWQgb2JqZWN0cworYWNjZXNzZWQgd2l0aCBhIHNpbmdsZSBtZW1vcnkgb3BlcmF0aW9uIG9mIHVwIHRvIDY0IGJpdHMgaW4gc2l6ZS4KKworVGhlIGdlbmVyYWwgZm9ybSBvZiB0aGUgcmVhZCBvcGVyYXRpb25zIGlzCitAY29kZQorVFlQRSBfX2ttcGNfYXRvbWljXzx0eXBlPl9yZCAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKTsKK0BlbmRjb2RlCisKK0ZvciB0aGUgd3JpdGUgb3BlcmF0aW9ucyB0aGUgZm9ybSBpcworQGNvZGUKK3ZvaWQgX19rbXBjX2F0b21pY188dHlwZT5fd3IgKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocyApOworQGVuZGNvZGUKKworRnVsbCBsaXN0IG9mIGZ1bmN0aW9ucworPT09PT09PT09PT09PT09PT09PT09PQorVGhpcyBsZWFkcyB0byB0aGUgZ2VuZXJhdGlvbiBvZiAzNzYgYXRvbWljIGZ1bmN0aW9ucywgYXMgZm9sbG93cy4KKworRnVuY3RvbnMgZm9yIGludGVnZXJzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBpbnRlZ2VycyBvZiBzaXplIDEsMiw0IGFuZCA4IGJ5dGVzIGJvdGggc2lnbmVkIGFuZCB1bnNpZ25lZCAod2hlcmUgdGhhdCBtYXR0ZXJzKS4KK0Bjb2RlCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDFfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDFfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX25lcXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfcmQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1YgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl93cgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcgorICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3hvcl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2CisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyCisgICAgX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfc2hyX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kbF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2VxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Vxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZmxvYXQ4CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X29ybF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9yZAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2ZwCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3N3cAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X3dyCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yCisgICAgX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfc2hyX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGwKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4KKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfbmVxdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc2hsX3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDhfc3dwCisgICAgX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKKyAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3JfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3NocgorICAgIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHJfY3B0CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9yZXYKK0BlbmRjb2RlCisKK0Z1bmN0aW9ucyBmb3IgZmxvYXRpbmcgcG9pbnQKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK1RoZXJlIGFyZSB2ZXJzaW9ucyBoZXJlIGZvciBmbG9hdGluZyBwb2ludCBudW1iZXJzIG9mIHNpemUgNCwgOCwgMTAgYW5kIDE2IGJ5dGVzLgorKFRlbiBieXRlIGZsb2F0cyBhcmUgdXNlZCBieSBYODcsIGJ1dCBhcmUgbm93IHJhcmUpLgorQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2FkZF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9mbG9hdDgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViCisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF93cgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbgorICAgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfc3dwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2RpdgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxMF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfd3IKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW4KKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIKKyAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19mbG9hdDE2X3N3cAorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl93cgorQGVuZGNvZGUKKworRnVuY3Rpb25zIGZvciBDb21wbGV4IHR5cGVzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0Z1bmN0aW9ucyBmb3IgY29tcGxleCB0eXBlcyB3aG9zZSBjb21wb25lbnQgZmxvYXRpbmcgcG9pbnQgdmFyaWFibGVzIGFyZSBvZiBzaXplIDQsOCwxMCBvciAxNiBieXRlcy4KK1RoZSBuYW1lcyBoZXJlIGFyZSBiYXNlZCBvbiB0aGUgc2l6ZSBvZiB0aGUgY29tcG9uZW50IGZsb2F0LCAqbm90KiB0aGUgc2l6ZSBvZiB0aGUgY29tcGxleCB0eXBlLiBTbworYF9fa21wY19hdG9tY19jbXBseDhfYWRkYCBpcyBhbiBvcGVyYXRpb24gb24gYSBgY29tcGxleDxkb3VibGU+YCBvciBgY29tcGxleChraW5kPTgpYCwgKm5vdCogYGNvbXBsZXg8ZmxvYXQ+YC4KKworQGNvZGUKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfbXVsX2NtcGx4OAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jbXBseDgKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWJfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDRfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDRfd3IKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4OF93cgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0X3JldgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX211bAorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3JkCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorICAgIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2FkZAorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2RpdgorICAgIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9jcHRfcmV2CisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9jcHQKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwCisgICAgX19rbXBjX2F0b21pY19jbXBseDE2X3dyCitAZW5kY29kZQorKi8KKworLyohCitAaW5ncm91cCBBVE9NSUNfT1BTCitAeworKi8KKworLyoKKyAqIEdsb2JhbCB2YXJzCisgKi8KKworI2lmbmRlZiBLTVBfR09NUF9DT01QQVQKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDE7ICAgICAgLy8gSW50ZWwgcGVyZgorI2Vsc2UKK2ludCBfX2ttcF9hdG9taWNfbW9kZSA9IDI7ICAgICAgLy8gR09NUCBjb21wYXRpYmlsaXR5CisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKK0tNUF9BTElHTigxMjgpCisKK2ttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrOyAgICAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBpbiBHbnUgY29tcGF0IG1vZGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMWk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAxLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA0LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfNHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDMyIGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOHI7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBrbXBfcmVhbDY0IGRhdGEgdHlwZSAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGM7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBjb21wbGV4IGJ5dGUgZGF0YSB0eXBlICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZyOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBkYXRhIHR5cGUgICAgICAgICAqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTZjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBkb3VibGUgY29tcGxleCBkYXRhIHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLwora21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMzJjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBfUXVhZCBjb21wbGV4IGRhdGEgdHlwZSAqLworCisKKy8qCisgIDIwMDctMDMtMDI6CisgIFdpdGhvdXQgInZvbGF0aWxlIiBzcGVjaWZpZXIgaW4gT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHIHdlIGhhdmUgYQorICBidWcgb24gKl8zMiBhbmQgKl8zMmUuIFRoaXMgaXMganVzdCBhIHRlbXBvcmFyeSB3b3JrYXJvdW5kIGZvciB0aGUgcHJvYmxlbS4KKyAgSXQgc2VlbXMgdGhlIHJpZ2h0IHNvbHV0aW9uIGlzIHdyaXRpbmcgT1BfQ01QWENIRyBhbmQgTUlOX01BWF9DTVBYQ0hHCisgIHJvdXRpbmVzIGluIGFzc2VtYmxlciBsYW5ndWFnZS4KKyovCisjZGVmaW5lIEtNUF9BVE9NSUNfVk9MQVRJTEUgdm9sYXRpbGUKKworI2lmICggS01QX0FSQ0hfWDg2ICkgJiYgS01QX0hBVkVfUVVBRAorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yIDwgKCBRdWFkX2E0X3QgJiBsaHMsIFF1YWRfYTRfdCAmIHJocyApIHsgcmV0dXJuIGxocy5xIDwgcmhzLnE7IH0KKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPiAoIFF1YWRfYTRfdCAmIGxocywgUXVhZF9hNF90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSArPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgLT0oIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IGxocy5xIC09IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAqPSggUXVhZF9hMTZfdCAmIGxocywgUXVhZF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyBsaHMucSAvPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIGJvb2wgb3BlcmF0b3IgPCAoIFF1YWRfYTE2X3QgJiBsaHMsIFF1YWRfYTE2X3QgJiByaHMgKSB7IHJldHVybiBsaHMucSA8IHJocy5xOyB9CisgICAgc3RhdGljIGlubGluZSBib29sIG9wZXJhdG9yID4gKCBRdWFkX2ExNl90ICYgbGhzLCBRdWFkX2ExNl90ICYgcmhzICkgeyByZXR1cm4gbGhzLnEgPiByaHMucTsgfQorCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xICs9IHJocy5xOyB9OworICAgIHN0YXRpYyBpbmxpbmUgdm9pZCBvcGVyYXRvciAtPSgga21wX2NtcGx4MTI4X2E0X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hNF90ICYgcmhzICkgeyBsaHMucSAtPSByaHMucTsgfTsKKyAgICBzdGF0aWMgaW5saW5lIHZvaWQgb3BlcmF0b3IgKj0oIGttcF9jbXBseDEyOF9hNF90ICYgbGhzLCBrbXBfY21wbHgxMjhfYTRfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTRfdCAmIGxocywga21wX2NtcGx4MTI4X2E0X3QgJiByaHMgKSB7IGxocy5xIC89IHJocy5xOyB9OworCisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICs9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKz0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC09KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLT0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yICo9KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgKj0gcmhzLnE7IH07CisgICAgc3RhdGljIGlubGluZSB2b2lkIG9wZXJhdG9yIC89KCBrbXBfY21wbHgxMjhfYTE2X3QgJiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCAmIHJocyApIHsgbGhzLnEgLz0gcmhzLnE7IH07CisKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEFUT01JQyBpbXBsZW1lbnRhdGlvbiByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogb25lIHJvdXRpbmUgZm9yIGVhY2ggb3BlcmF0aW9uIGFuZCBvcGVyYW5kIHR5cGUgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLy8gQWxsIHJvdXRpbmVzIGRlY2xhcmF0aW9ucyBsb29rcyBsaWtlCisvLyB2b2lkIF9fa21wY19hdG9taWNfUlRZUEVfT1AoIGlkZW50X3QqLCBpbnQsIFRZUEUgKmxocywgVFlQRSByaHMgKTsKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjZGVmaW5lIEtNUF9DSEVDS19HVElEICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIGd0aWQgPT0gS01QX0dUSURfVU5LTk9XTiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvLyBjaGVjayBhbmQgZ2V0IGd0aWQgd2hlbiBuZWVkZWQKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMb2NrIHZhcmlhYmxlcyB1c2VkIGZvciBjcml0aWNhbCBzZWN0aW9ucyBmb3IgdmFyaW91cyBzaXplIG9wZXJhbmRzCisjZGVmaW5lIEFUT01JQ19MT0NLMCAgIF9fa21wX2F0b21pY19sb2NrICAgICAgIC8vIGFsbCB0eXBlcywgZm9yIEdudSBjb21wYXQKKyNkZWZpbmUgQVRPTUlDX0xPQ0sxaSAgX19rbXBfYXRvbWljX2xvY2tfMWkgICAgLy8gY2hhcgorI2RlZmluZSBBVE9NSUNfTE9DSzJpICBfX2ttcF9hdG9taWNfbG9ja18yaSAgICAvLyBzaG9ydAorI2RlZmluZSBBVE9NSUNfTE9DSzRpICBfX2ttcF9hdG9taWNfbG9ja180aSAgICAvLyBsb25nIGludAorI2RlZmluZSBBVE9NSUNfTE9DSzRyICBfX2ttcF9hdG9taWNfbG9ja180ciAgICAvLyBmbG9hdAorI2RlZmluZSBBVE9NSUNfTE9DSzhpICBfX2ttcF9hdG9taWNfbG9ja184aSAgICAvLyBsb25nIGxvbmcgaW50CisjZGVmaW5lIEFUT01JQ19MT0NLOHIgIF9fa21wX2F0b21pY19sb2NrXzhyICAgIC8vIGRvdWJsZQorI2RlZmluZSBBVE9NSUNfTE9DSzhjICBfX2ttcF9hdG9taWNfbG9ja184YyAgICAvLyBmbG9hdCBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMTByIF9fa21wX2F0b21pY19sb2NrXzEwciAgIC8vIGxvbmcgZG91YmxlCisjZGVmaW5lIEFUT01JQ19MT0NLMTZyIF9fa21wX2F0b21pY19sb2NrXzE2ciAgIC8vIF9RdWFkCisjZGVmaW5lIEFUT01JQ19MT0NLMTZjIF9fa21wX2F0b21pY19sb2NrXzE2YyAgIC8vIGRvdWJsZSBjb21wbGV4CisjZGVmaW5lIEFUT01JQ19MT0NLMjBjIF9fa21wX2F0b21pY19sb2NrXzIwYyAgIC8vIGxvbmcgZG91YmxlIGNvbXBsZXgKKyNkZWZpbmUgQVRPTUlDX0xPQ0szMmMgX19rbXBfYXRvbWljX2xvY2tfMzJjICAgLy8gX1F1YWQgY29tcGxleAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTChPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSBPUCAocmhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBGb3IgR05VIGNvbXBhdGliaWxpdHksIHdlIG1heSBuZWVkIHRvIHVzZSBhIGNyaXRpY2FsIHNlY3Rpb24sCisvLyBldmVuIHRob3VnaCBpdCBpcyBub3QgcmVxdWlyZWQgYnkgdGhlIElTQS4KKy8vCisvLyBPbiBJQS0zMiBhcmNoaXRlY3R1cmUsIGFsbCBhdG9taWMgb3BlcmF0aW9ucyBleGNlcHQgZm9yIGZpeGVkIDQgYnl0ZSBhZGQsCisvLyBzdWIsIGFuZCBiaXR3aXNlIGxvZ2ljYWwgb3BzLCBhbmQgMSAmIDIgYnl0ZSBsb2dpY2FsIG9wcyB1c2UgYSBjb21tb24KKy8vIGNyaXRpY2FsIHNlY3Rpb24uICBPbiBJbnRlbChSKSA2NCwgYWxsIGF0b21pYyBvcGVyYXRpb25zIGFyZSBkb25lIHdpdGggZmV0Y2gKKy8vIGFuZCBhZGQgb3IgY29tcGFyZSBhbmQgZXhjaGFuZ2UuICBUaGVyZWZvcmUsIHRoZSBGTEFHIHBhcmFtZXRlciB0byB0aGlzCisvLyBtYWNybyBpcyBlaXRoZXIgS01QX0FSQ0hfWDg2IG9yIDAgKG9yIDEsIGZvciBJbnRlbC1zcGVjaWZpYyBleHRlbnNpb24gd2hpY2gKKy8vIHJlcXVpcmUgYSBjcml0aWNhbCBzZWN0aW9uLCB3aGVyZSB3ZSBwcmVkaWN0IHRoYXQgdGhleSB3aWxsIGJlIGltcGxlbWVudGVkCisvLyBpbiB0aGUgR251IGNvZGVnZW4gYnkgY2FsbGluZyBHT01QX2F0b21pY19zdGFydCgpIC8gR09NUF9hdG9taWNfZW5kKCkpLgorLy8KKy8vIFdoZW4gdGhlIE9QX0dPTVBfQ1JJVElDQUwgbWFjcm8gaXMgdXNlZCBpbiBhICpDUklUSUNBTCogbWFjcm8gY29uc3RydWN0LAorLy8gdGhlIEZMQUcgcGFyYW1ldGVyIHNob3VsZCBhbHdheXMgYmUgMS4gIElmIHdlIGtub3cgdGhhdCB3ZSB3aWxsIGJlIHVzaW5nCisvLyBhIGNyaXRpY2FsIHNlY3Rpb24sIHRoZW4gd2Ugd2FudCB0byBtYWtlIGNlcnRhaW4gdGhhdCB3ZSB1c2UgdGhlIGdlbmVyaWMKKy8vIGxvY2sgX19rbXBfYXRvbWljX2xvY2sgdG8gcHJvdGVjdCB0aGUgYXRvbWljIHVwZGF0ZSwgYW5kIG5vdCBvZiBvZiB0aGUKKy8vIGxvY2tzIHRoYXQgYXJlIHNwZWNpYWxpemVkIGJhc2VkIHVwb24gdGhlIHNpemUgb3IgdHlwZSBvZiB0aGUgZGF0YS4KKy8vCisvLyBJZiBGTEFHIGlzIDAsIHRoZW4gd2UgYXJlIHJlbHlpbmcgb24gZGVhZCBjb2RlIGVsaW1pbmF0aW9uIGJ5IHRoZSBidWlsZAorLy8gY29tcGlsZXIgdG8gZ2V0IHJpZCBvZiB0aGUgdXNlbGVzcyBibG9jayBvZiBjb2RlLCBhbmQgc2F2ZSBhIG5lZWRsZXNzCisvLyBicmFuY2ggYXQgcnVudGltZS4KKy8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyMgZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUwoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorIyBlbHNlCisjIGRlZmluZSBPUF9HT01QX0NSSVRJQ0FMKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKyNpZiBLTVBfTUlDCisjIGRlZmluZSBLTVBfRE9fUEFVU0UgX21tX2RlbGF5XzMyKCAxICkKKyNlbHNlCisjIGRlZmluZSBLTVBfRE9fUEFVU0UgS01QX0NQVV9QQVVTRSgpCisjZW5kaWYgLyogS01QX01JQyAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKyNkZWZpbmUgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gKihUWVBFIHZvbGF0aWxlICopbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRE9fUEFVU0U7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSAqKFRZUEUgdm9sYXRpbGUgKilsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAyMDA3LTA2LTI1OgorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorLy8gbGluXzMyLCBsaW5fMzJlLCB3aW5fMzIgYW5kIHdpbl8zMmUgYXJlIGFmZmVjdGVkIChJIHZlcmlmaWVkIHRoZSBhc20pCisvLyBDb21waWxlciBpZ25vcmVzIHRoZSB2b2xhdGlsZSBxdWFsaWZpZXIgb2YgdGhlIHRlbXBfdmFsIGluIHRoZSBPUF9DTVBYQ0hHIG1hY3JvLgorLy8gVGhpcyBpcyBhIHByb2JsZW0gb2YgdGhlIGNvbXBpbGVyLgorLy8gUmVsYXRlZCB0cmFja2VyIGlzIEM3NjAwNSwgdGFyZ2V0ZWQgdG8gMTEuMC4KKy8vIEkgdmVyaWZpZWQgdGhlIGFzbSBvZiB0aGUgd29ya2Fyb3VuZC4KKyNkZWZpbmUgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJc3RydWN0IF9zc3MgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorCSAgICBUWVBFICAgICAgICAgICAgY21wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAga21wX2ludCMjQklUUyAgICp2dnY7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisJfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBzdHJ1Y3QgX3NzcyBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS52dnYgPSAoIGttcF9pbnQjI0JJVFMgKiApJm9sZF92YWx1ZS5jbXA7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlLnZ2diA9ICgga21wX2ludCMjQklUUyAqICkmbmV3X3ZhbHVlLmNtcDsgICAgICAgICAgICAgICAgXAorICAgICAgICAqb2xkX3ZhbHVlLnZ2diA9ICogKCB2b2xhdGlsZSBrbXBfaW50IyNCSVRTICogKSBsaHM7ICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgb2xkX3ZhbHVlLnZ2diwgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSBuZXdfdmFsdWUudnZ2ICkgKSAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKwkgICAgKm9sZF92YWx1ZS52dnYgPSAqICggdm9sYXRpbGUga21wX2ludCMjQklUUyAqICkgbGhzOyAgICAgICAgICBcCisJICAgIG5ld192YWx1ZS5jbXAgPSBvbGRfdmFsdWUuY21wIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorLy8gZW5kIG9mIHRoZSBmaXJzdCBwYXJ0IG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbmRpZiAvLyBVU0VfQ01QWENIR19GSVgKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisjZGVmaW5lIEFUT01JQ19GSVhFRF9BREQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjaWYgVVNFX0NNUFhDSEdfRklYCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB3b3JrYXJvdW5kIGZvciBDNzgyODcgKGNvbXBsZXgoa2luZD00KSBkYXRhIHR5cGUpCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dPUktBUk9VTkQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XT1JLQVJPVU5EKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmCisKKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX0FERChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gIFwKKyAgICAgICAgS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNpZiBVU0VfQ01QWENIR19GSVgKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHdvcmthcm91bmQgZm9yIEM3ODI4NyAoY29tcGxleChraW5kPTQpIGRhdGEgdHlwZSkKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiB1bmFsaWduZWQgYWRkcmVzcyAtIHVzZSBjcml0aWNhbCAqLyAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2VuZGlmIC8vIFVTRV9DTVBYQ0hHX0ZJWAorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA0LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIGFkZCwga21wX2ludDMyLCAgMzIsICssIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDQsIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sIDRpLCAzLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViCisKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBhZGQsIGttcF9yZWFsMzIsIDMyLCArLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIKKworLy8gUm91dGluZXMgZm9yIEFUT01JQyA4LWJ5dGUgb3BlcmFuZHMgYWRkaXRpb24gYW5kIHN1YnRyYWN0aW9uCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIGFkZCwga21wX2ludDY0LCAgNjQsICssIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkCitBVE9NSUNfRklYRURfQUREKCBmaXhlZDgsIHN1Yiwga21wX2ludDY0LCAgNjQsIC0sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViCisKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBhZGQsIGttcF9yZWFsNjQsIDY0LCArLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWIKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBFbnRyaWVzIGRlZmluaXRpb24gZm9yIGludGVnZXIgb3BlcmFuZHMKKy8vICAgICBUWVBFX0lEIC0gb3BlcmFuZHMgdHlwZSBhbmQgc2l6ZSAoZml4ZWQ0LCBmbG9hdDQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmQgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yICh1c2VkIGluIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisvLyAgICAgTUFTSyAgICAtIHVzZWQgZm9yIGFsaWdubWVudCBjaGVjaworCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBBVE9NSUMgaW50ZWdlciBvcGVyYW5kcywgb3RoZXIgb3BlcmF0b3JzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBhZGQsIGttcF9pbnQ4LCAgICA4LCArLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsIGFuZGIsIGttcF9pbnQ4LCAgICA4LCAmLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQxLCAgZGl2LCBrbXBfaW50OCwgICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQxdSwgZGl2LCBrbXBfdWludDgsICAgOCwgLywgIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG11bCwga21wX2ludDgsICAgIDgsICosICAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIG9yYiwga21wX2ludDgsICAgIDgsIHwsICAxaSwgMCwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMSwgIHNociwga21wX2ludDgsICAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMXUsIHNociwga21wX3VpbnQ4LCAgIDgsID4+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDEsICB4b3IsIGttcF9pbnQ4LCAgICA4LCBeLCAgMWksIDAsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBhZGQsIGttcF9pbnQxNiwgIDE2LCArLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsIGFuZGIsIGttcF9pbnQxNiwgIDE2LCAmLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQydSwgZGl2LCBrbXBfdWludDE2LCAxNiwgLywgIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG11bCwga21wX2ludDE2LCAgMTYsICosICAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIG9yYiwga21wX2ludDE2LCAgMTYsIHwsICAyaSwgMSwgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNobCwga21wX2ludDE2LCAgMTYsIDw8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkMnUsIHNociwga21wX3VpbnQxNiwgMTYsID4+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICBzdWIsIGttcF9pbnQxNiwgIDE2LCAtLCAgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDIsICB4b3IsIGttcF9pbnQxNiwgIDE2LCBeLCAgMmksIDEsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsIGFuZGIsIGttcF9pbnQzMiwgIDMyLCAmLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ0LCAgZGl2LCBrbXBfaW50MzIsICAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG11bCwga21wX2ludDMyLCAgMzIsICosICA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIG9yYiwga21wX2ludDMyLCAgMzIsIHwsICA0aSwgMywgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNobCwga21wX2ludDMyLCAgMzIsIDw8LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNCwgIHNociwga21wX2ludDMyLCAgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDQsICB4b3IsIGttcF9pbnQzMiwgIDMyLCBeLCAgNGksIDMsIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsIGFuZGIsIGttcF9pbnQ2NCwgIDY0LCAmLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiCitBVE9NSUNfQ01QWENIRyggZml4ZWQ4LCAgZGl2LCBrbXBfaW50NjQsICA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2CitBVE9NSUNfQ01QWENIRyggZml4ZWQ4dSwgZGl2LCBrbXBfdWludDY0LCA2NCwgLywgIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X2RpdgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG11bCwga21wX2ludDY0LCAgNjQsICosICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIG9yYiwga21wX2ludDY0LCAgNjQsIHwsICA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X29yYgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobAorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOCwgIHNociwga21wX2ludDY0LCAgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NocgorQVRPTUlDX0NNUFhDSEcoIGZpeGVkOHUsIHNociwga21wX3VpbnQ2NCwgNjQsID4+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9zaHIKK0FUT01JQ19DTVBYQ0hHKCBmaXhlZDgsICB4b3IsIGttcF9pbnQ2NCwgIDY0LCBeLCAgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF94b3IKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBkaXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDQsICBtdWwsIGttcF9yZWFsMzIsIDMyLCAqLCAgNHIsIDMsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWwKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBkaXYsIGttcF9yZWFsNjQsIDY0LCAvLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYKK0FUT01JQ19DTVBYQ0hHKCBmbG9hdDgsICBtdWwsIGttcF9yZWFsNjQsIDY0LCAqLCAgOHIsIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwKKy8vICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCBUWVBFLCAgICAgICAgICBPUCwgTENLX0lELCBHT01QX0ZMQUcKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFJvdXRpbmVzIGZvciBDL0MrKyBSZWR1Y3Rpb24gb3BlcmF0b3JzICYmIGFuZCB8fCAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gTmVlZCBzZXBhcmF0ZSBtYWNyb3MgZm9yICYmLCB8fCBiZWNhdXNlIHRoZXJlIGlzIG5vIGNvbWJpbmVkIGFzc2lnbm1lbnQKKy8vICAgVE9ETzogZWxpbWluYXRlIEFUT01JQ19DUklUX3tMLEVRVn0gbWFjcm9zIGFzIG5vdCB1c2VkCisjZGVmaW5lIEFUT01JQ19DUklUX0woVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoID0gKmxocyBPUCwgR09NUF9GTEFHICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoID0gKmxocyBPUCwgTENLX0lEICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBYODYgb3IgWDg2XzY0OiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhfTChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTCg9ICpsaHMgT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTCg9ICpsaHMgT1AsTENLX0lEKSAgLyogdW5hbGlnbmVkIC0gdXNlIGNyaXRpY2FsICovICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYX0woIGZpeGVkMSwgYW5kbCwgY2hhciwgICAgICAgOCwgJiYsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQxLCAgb3JsLCBjaGFyLCAgICAgICA4LCB8fCwgMWksIDAsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkMiwgYW5kbCwgc2hvcnQsICAgICAxNiwgJiYsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQyLCAgb3JsLCBzaG9ydCwgICAgIDE2LCB8fCwgMmksIDEsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkNCwgYW5kbCwga21wX2ludDMyLCAzMiwgJiYsIDRpLCAzLCAwICkgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ0LCAgb3JsLCBrbXBfaW50MzIsIDMyLCB8fCwgNGksIDMsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwKK0FUT01JQ19DTVBYX0woIGZpeGVkOCwgYW5kbCwga21wX2ludDY0LCA2NCwgJiYsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYW5kbAorQVRPTUlDX0NNUFhfTCggZml4ZWQ4LCAgb3JsLCBrbXBfaW50NjQsIDY0LCB8fCwgOGksIDcsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmwKKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBSb3V0aW5lcyBmb3IgRm9ydHJhbiBvcGVyYXRvcnMgdGhhdCBtYXRjaGVkIG5vIG9uZSBpbiBDOiAgICAgICAgICAgICAgICAgICovCisvKiBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBPcGVyYXRvcnMgLkFORC4sIC5PUi4gYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRsLG9ybH0gICAgICAgICAgICovCisvKiBJbnRyaW5zaWNzIElBTkQsIElPUiwgSUVPUiBhcmUgY292ZXJlZCBieSBfX2ttcGNfYXRvbWljXypfe2FuZGIsb3JiLHhvcn0gICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE1JTiBhbmQgTUFYIG5lZWQgc2VwYXJhdGUgbWFjcm9zCisvLyBPUCAtIG9wZXJhdG9yIHRvIGNoZWNrIGlmIHdlIG5lZWQgYW55IGFjdGlvbnM/CisjZGVmaW5lIE1JTl9NQVhfQ1JJVFNFQ1QoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAvKiBzdGlsbCBuZWVkIGFjdGlvbnM/ICovICAgICAgICAgXAorICAgICAgICAqbGhzID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCggRkxBRyApICYmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1JTl9NQVhfQ1JJVFNFQ1QoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlOX01BWF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCBvbGRfdmFsdWUgT1AgcmhzICYmICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZyaHMgKSApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgLyogbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1QoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIE1JTl9NQVhfQ09NUFhDSEcoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAqbGhzIE9QIHJocyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEdPTVBfTUlOX01BWF9DUklUU0VDVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBNSU5fTUFYX0NSSVRTRUNUKE9QLExDS19JRCkgICAvKiB1bmFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtYXgsIGNoYXIsICAgICAgICA4LCA8LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDEsICBtaW4sIGNoYXIsICAgICAgICA4LCA+LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtYXgsIHNob3J0LCAgICAgIDE2LCA8LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDIsICBtaW4sIHNob3J0LCAgICAgIDE2LCA+LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtYXgsIGttcF9pbnQzMiwgIDMyLCA8LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDQsICBtaW4sIGttcF9pbnQzMiwgIDMyLCA+LCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtYXgsIGttcF9pbnQ2NCwgIDY0LCA8LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmaXhlZDgsICBtaW4sIGttcF9pbnQ2NCwgIDY0LCA+LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtYXgsIGttcF9yZWFsMzIsIDMyLCA8LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDQsICBtaW4sIGttcF9yZWFsMzIsIDMyLCA+LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWluCitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtYXgsIGttcF9yZWFsNjQsIDY0LCA8LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWF4CitNSU5fTUFYX0NPTVBYQ0hHKCBmbG9hdDgsICBtaW4sIGttcF9yZWFsNjQsIDY0LCA+LCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfbWluCisjaWYgS01QX0hBVkVfUVVBRAorTUlOX01BWF9DUklUSUNBTCggZmxvYXQxNiwgbWF4LCAgICAgUVVBRF9MRUdBQ1ksICAgICAgPCwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgKK01JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1pbiwgICAgIFFVQURfTEVHQUNZLCAgICAgID4sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIE1JTl9NQVhfQ1JJVElDQUwoIGZsb2F0MTYsIG1heF9hMTYsIFF1YWRfYTE2X3QsICAgICA8LCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTYKKyAgICBNSU5fTUFYX0NSSVRJQ0FMKCBmbG9hdDE2LCBtaW5fYTE2LCBRdWFkX2ExNl90LCAgICAgPiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZWVkIHNlcGFyYXRlIG1hY3JvcyBmb3IgLkVRVi4gYmVjYXVzZSBvZiB0aGUgbmVlZCBvZiBjb21wbGVtZW50ICh+KQorLy8gT1AgaWdub3JlZCBmb3IgY3JpdGljYWwgc2VjdGlvbnMsIF49fiB1c2VkIGluc3RlYWQKKyNkZWZpbmUgQVRPTUlDX0NSSVRfRVFWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChePX4sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChePX4sTENLX0lEKSAgICAvKiBzZW5kIGFzc2lnbm1lbnQgYW5kIGNvbXBsZW1lbnQgKi8gICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbHNlCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIENvZGUgZm9yIG90aGVyIGFyY2hpdGVjdHVyZXMgdGhhdCBkb24ndCBoYW5kbGUgdW5hbGlnbmVkIGFjY2Vzc2VzLgorI2RlZmluZSBBVE9NSUNfQ01QWF9FUVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKF49fixHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweCMjTUFTSykgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgIC8qIGFsaWduZWQgYWRkcmVzcyAqLyAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKF49fixMQ0tfSUQpICAgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworQVRPTUlDX0NNUFhDSEcoICBmaXhlZDEsIG5lcXYsIGttcF9pbnQ4LCAgIDgsICAgXiwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXYKK0FUT01JQ19DTVBYQ0hHKCAgZml4ZWQyLCBuZXF2LCBrbXBfaW50MTYsIDE2LCAgIF4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2CitBVE9NSUNfQ01QWENIRyggIGZpeGVkNCwgbmVxdiwga21wX2ludDMyLCAzMiwgICBeLCA0aSwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbmVxdgorQVRPTUlDX0NNUFhDSEcoICBmaXhlZDgsIG5lcXYsIGttcF9pbnQ2NCwgNjQsICAgXiwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQxLCBlcXYsICBrbXBfaW50OCwgICA4LCAgXn4sIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQyLCBlcXYsICBrbXBfaW50MTYsIDE2LCAgXn4sIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ0LCBlcXYsICBrbXBfaW50MzIsIDMyLCAgXn4sIDRpLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXYKK0FUT01JQ19DTVBYX0VRViggZml4ZWQ4LCBlcXYsICBrbXBfaW50NjQsIDY0LCAgXn4sIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXYKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgICBcCisgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgYWRkLCBsb25nIGRvdWJsZSwgICAgICssIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDEwLCBtdWwsIGxvbmcgZG91YmxlLCAgICAgKiwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxMCwgZGl2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkLCBRVUFEX0xFR0FDWSwgICAgICssIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIHN1YiwgUVVBRF9MRUdBQ1ksICAgICAtLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBtdWwsIFFVQURfTEVHQUNZLCAgICAgKiwgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWwKK0FUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgYWRkX2ExNiwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGZsb2F0MTYsIG11bF9hMTYsIFF1YWRfYTE2X3QsICosIDE2ciwgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKKworI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBhZGQsIGttcF9jbXBseDMyLCA2NCwgKywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBzdWIsIGttcF9jbXBseDMyLCA2NCwgLSwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1YgorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBtdWwsIGttcF9jbXBseDMyLCA2NCwgKiwgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bAorQVRPTUlDX0NNUFhDSEdfV09SS0FST1VORCggY21wbHg0LCBkaXYsIGttcF9jbXBseDMyLCA2NCwgLywgOGMsIDcsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2RpdgorLy8gZW5kIG9mIHRoZSB3b3JrYXJvdW5kIGZvciBDNzgyODcKKyNlbHNlCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGFkZCwga21wX2NtcGx4MzIsICAgICArLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIG11bCwga21wX2NtcGx4MzIsICAgICAqLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfbXVsCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4NCwgIGRpdiwga21wX2NtcGx4MzIsICAgICAvLCAgOGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfZGl2CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgYWRkLCBrbXBfY21wbHg2NCwgICAgICssIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgc3ViLCBrbXBfY21wbHg2NCwgICAgIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWIKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgbXVsLCBrbXBfY21wbHg2NCwgICAgICosIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHg4LCAgZGl2LCBrbXBfY21wbHg2NCwgICAgIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgYWRkLCBrbXBfY21wbHg4MCwgICAgICssIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTAsIHN1Yiwga21wX2NtcGx4ODAsICAgICAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1YgorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDEwLCBtdWwsIGttcF9jbXBseDgwLCAgICAgKiwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWwKK0FUT01JQ19DUklUSUNBTCggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGQsIENQTFgxMjhfTEVHLCAgICAgKywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQKK0FUT01JQ19DUklUSUNBTCggY21wbHgxNiwgc3ViLCBDUExYMTI4X0xFRywgICAgIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViCitBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIG11bCwgQ1BMWDEyOF9MRUcsICAgICAqLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X211bAorQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXYsIENQTFgxMjhfTEVHLCAgICAgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBhZGRfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsICssIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTYKKyAgICBBVE9NSUNfQ1JJVElDQUwoIGNtcGx4MTYsIHN1Yl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNgorICAgIEFUT01JQ19DUklUSUNBTCggY21wbHgxNiwgbXVsX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAqLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9tdWxfYTE2CisgICAgQVRPTUlDX0NSSVRJQ0FMKCBjbXBseDE2LCBkaXZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC8sIDMyYywgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTYKKyNlbmRpZgorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCisvLyBPcGVuTVAgNC4wOiB4ID0gZXhwciBiaW5vcCB4IGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKy8vIFN1cHBvcnRlZCBvbmx5IG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyBib3VuZCBieSBjcml0aWNhbCBzZWN0aW9uCisvLyAgICAgT1AgICAgIC0gb3BlcmF0b3IgKGl0J3Mgc3VwcG9zZWQgdG8gY29udGFpbiBhbiBhc3NpZ25tZW50KQorLy8gICAgIExDS19JRCAtIGxvY2sgaWRlbnRpZmllcgorLy8gTm90ZTogZG9uJ3QgY2hlY2sgZ3RpZCBhcyBpdCBzaG91bGQgYWx3YXlzIGJlIHZhbGlkCisvLyAxLCAyLWJ5dGUgLSBleHBlY3QgdmFsaWQgcGFyYW1ldGVyLCBvdGhlciAtIGNoZWNrIGJlZm9yZSB0aGlzIG1hY3JvCisjZGVmaW5lIE9QX0NSSVRJQ0FMX1JFVihPUCxMQ0tfSUQpIFwKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gKHJocykgT1AgKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFViggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVWKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworLy8gQmVnaW5uaW5nIG9mIGEgZGVmaW5pdGlvbiAocHJvdmlkZXMgbmFtZSwgcGFyYW1ldGVycywgZ2VidWcgdHJhY2UpCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkKiwgZml4ZWQqdSBmb3Igc2lnbmVkLCB1bnNpZ25lZCBmaXhlZCkKKy8vICAgICBPUF9JRCAgIC0gb3BlcmF0aW9uIGlkZW50aWZpZXIgKGFkZCwgc3ViLCBtdWwsIC4uLikKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFVihUWVBFX0lELE9QX0lELFRZUEUsIFJFVF9UWVBFKSBcCitSRVRfVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQjI19yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsaHMsIFRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICJfcmV2OiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlIiByb3V0aW5lCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisvLyAgICAgQklUUyAgICAtIHNpemUgaW4gYml0cywgdXNlZCB0byBkaXN0aW5ndWlzaCBsb3cgbGV2ZWwgY2FsbHMKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vIE5vdGU6IHRlbXBfdmFsIGludHJvZHVjZWQgaW4gb3JkZXIgdG8gZm9yY2UgdGhlIGNvbXBpbGVyIHRvIHJlYWQKKy8vICAgICAgICpsaHMgb25seSBvbmNlICh3L28gaXQgdGhlIGNvbXBpbGVyIHJlYWRzICpsaHMgdHdpY2UpCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EjI0JJVFMoIChrbXBfaW50IyNCSVRTICopIGxocywgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm9sZF92YWx1ZSwgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmbmV3X3ZhbHVlICkgKSAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RPX1BBVVNFOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBuZXdfdmFsdWUgPSByaHMgT1Agb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRykgICBcCitBVE9NSUNfQkVHSU5fUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorCisvLyAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsICBUWVBFLCAgIEJJVFMsT1AsTENLX0lELEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgIEJJVFMsIE9QLCBMQ0tfSUQsIEdPTVBfRkxBRworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBkaXYsIGttcF9pbnQ4LCAgICA4LCAvLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMXUsIGRpdiwga21wX3VpbnQ4LCAgIDgsIC8sICAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMSwgIHNobCwga21wX2ludDgsICAgIDgsIDw8LCAxaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQxLCAgc2hyLCBrbXBfaW50OCwgICAgOCwgPj4sIDFpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDF1LCBzaHIsIGttcF91aW50OCwgICA4LCA+PiwgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDEsICBzdWIsIGttcF9pbnQ4LCAgICA4LCAtLCAgMWksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgZGl2LCBrbXBfaW50MTYsICAxNiwgLywgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDJ1LCBkaXYsIGttcF91aW50MTYsIDE2LCAvLCAgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDIsICBzaGwsIGttcF9pbnQxNiwgIDE2LCA8PCwgMmksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkMiwgIHNociwga21wX2ludDE2LCAgMTYsID4+LCAyaSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQydSwgc2hyLCBrbXBfdWludDE2LCAxNiwgPj4sIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQyLCAgc3ViLCBrbXBfaW50MTYsICAxNiwgLSwgIDJpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX3JldgorCitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIGRpdiwga21wX2ludDMyLCAgMzIsIC8sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0dSwgZGl2LCBrbXBfdWludDMyLCAzMiwgLywgIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ0LCAgc2hsLCBrbXBfaW50MzIsICAzMiwgPDwsIDRpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDQsICBzaHIsIGttcF9pbnQzMiwgIDMyLCA+PiwgNGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNHUsIHNociwga21wX3VpbnQzMiwgMzIsID4+LCA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkNCwgIHN1Yiwga21wX2ludDMyLCAgMzIsIC0sICA0aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYKKworQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBkaXYsIGttcF9pbnQ2NCwgIDY0LCAvLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOHUsIGRpdiwga21wX3VpbnQ2NCwgNjQsIC8sICA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfcmV2CitBVE9NSUNfQ01QWENIR19SRVYoIGZpeGVkOCwgIHNobCwga21wX2ludDY0LCAgNjQsIDw8LCA4aSwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYKK0FUT01JQ19DTVBYQ0hHX1JFViggZml4ZWQ4LCAgc2hyLCBrbXBfaW50NjQsICA2NCwgPj4sIDhpLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDh1LCBzaHIsIGttcF91aW50NjQsIDY0LCA+PiwgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmaXhlZDgsICBzdWIsIGttcF9pbnQ2NCwgIDY0LCAtLCAgOGksIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ0LCAgZGl2LCBrbXBfcmVhbDMyLCAzMiwgLywgIDRyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDQsICBzdWIsIGttcF9yZWFsMzIsIDMyLCAtLCAgNHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfcmV2CisKK0FUT01JQ19DTVBYQ0hHX1JFViggZmxvYXQ4LCAgZGl2LCBrbXBfcmVhbDY0LCA2NCwgLywgIDhyLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X3JldgorQVRPTUlDX0NNUFhDSEdfUkVWKCBmbG9hdDgsICBzdWIsIGttcF9yZWFsNjQsIDY0LCAtLCAgOHIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfcmV2CisvLyAgICAgICAgICAgICAgICAgIFRZUEVfSUQsT1BfSUQsIFRZUEUsICAgICBCSVRTLE9QLExDS19JRCwgR09NUF9GTEFHCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1JFVihUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9SRVYoVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIHN1YiwgbG9uZyBkb3VibGUsICAgICAtLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGZsb2F0MTAsIGRpdiwgbG9uZyBkb3VibGUsICAgICAvLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgc3ViLCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2LCBRVUFEX0xFR0FDWSwgICAgIC8sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfUkVWKCBmbG9hdDE2LCBzdWJfYTE2LCBRdWFkX2ExNl90LCAtLCAxNnIsIDEgKSAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggZmxvYXQxNiwgZGl2X2ExNiwgUXVhZF9hMTZfdCwgLywgMTZyLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4NCwgIHN1Yiwga21wX2NtcGx4MzIsICAgICAtLCA4YywgICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHg0LCAgZGl2LCBrbXBfY21wbHgzMiwgICAgIC8sIDhjLCAgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfcmV2CitBVE9NSUNfQ1JJVElDQUxfUkVWKCBjbXBseDgsICBzdWIsIGttcF9jbXBseDY0LCAgICAgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4OCwgIGRpdiwga21wX2NtcGx4NjQsICAgICAvLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfZGl2X3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgc3ViLCBrbXBfY21wbHg4MCwgICAgIC0sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3ViX3JldgorQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxMCwgZGl2LCBrbXBfY21wbHg4MCwgICAgIC8sIDIwYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X3JldgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIHN1YiwgQ1BMWDEyOF9MRUcsICAgICAtLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X3N1Yl9yZXYKK0FUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdiwgQ1BMWDEyOF9MRUcsICAgICAvLCAzMmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9yZXYKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFViggY21wbHgxNiwgc3ViX2ExNiwga21wX2NtcGx4MTI4X2ExNl90LCAtLCAzMmMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X3JldgorICAgIEFUT01JQ19DUklUSUNBTF9SRVYoIGNtcGx4MTYsIGRpdl9hMTYsIGttcF9jbXBseDEyOF9hMTZfdCwgLywgMzJjLCAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2ExNl9yZXYKKyNlbmRpZgorI2VuZGlmCisKKworI2VuZGlmIC8vS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorLy8gRW5kIG9mIE9wZW5NUCA0LjA6IHggPSBleHByIGJpbm9wIHggZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorCisjZW5kaWYgLy9PTVBfNDBfRU5BQkxFRAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogUm91dGluZXMgZm9yIG1peGVkIHR5cGVzIG9mIExIUyBhbmQgUkhTLCB3aGVuIFJIUyBpcyAibGFyZ2VyIiAgICAgICAgICAgICovCisvKiBOb3RlOiBpbiBvcmRlciB0byByZWR1Y2UgdGhlIHRvdGFsIG51bWJlciBvZiB0eXBlcyBjb21iaW5hdGlvbnMgICAgICAgICAgKi8KKy8qICAgICAgIGl0IGlzIHN1cHBvc2VkIHRoYXQgY29tcGlsZXIgY29udmVydHMgUkhTIHRvIGxvbmdlc3QgZmxvYXRpbmcgdHlwZSwqLworLyogICAgICAgdGhhdCBpcyBfUXVhZCwgYmVmb3JlIGNhbGwgdG8gYW55IG9mIHRoZXNlIHJvdXRpbmVzICAgICAgICAgICAgICAgICovCisvKiBDb252ZXJzaW9uIHRvIF9RdWFkIHdpbGwgYmUgZG9uZSBieSB0aGUgY29tcGlsZXIgZHVyaW5nIGNhbGN1bGF0aW9uLCAgICAgKi8KKy8qICAgIGNvbnZlcnNpb24gYmFjayB0byBUWVBFIC0gYmVmb3JlIHRoZSBhc3NpZ25tZW50LCBsaWtlOiAgICAgICAgICAgICAgICAqLworLyogICAgKmxocyA9IChUWVBFKSggKF9RdWFkKSgqbGhzKSBPUCByaHMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKiBQZXJmb3JtYW5jZSBwZW5hbHR5IGV4cGVjdGVkIGJlY2F1c2Ugb2YgU1cgZW11bGF0aW9uIHVzZSAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEFUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK3ZvaWQgX19rbXBjX2F0b21pY18jI1RZUEVfSUQjI18jI09QX0lEIyNfIyNSVFlQRV9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgUlRZUEUgcmhzICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiXyIgI1JUWVBFX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0ZQKFRZUEVfSUQsVFlQRSxPUF9JRCxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTChPUCMjPSxMQ0tfSUQpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFg4NiBvciBYODZfNjQ6IG5vIGFsaWdubWVudCBwcm9ibGVtcyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxCSVRTLE9QLFJUWVBFX0lELFJUWVBFLExDS19JRCxNQVNLLEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX01JWChUWVBFX0lELFRZUEUsT1BfSUQsUlRZUEVfSUQsUlRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2Vsc2UKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQ29kZSBmb3Igb3RoZXIgYXJjaGl0ZWN0dXJlcyB0aGF0IGRvbid0IGhhbmRsZSB1bmFsaWduZWQgYWNjZXNzZXMuCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX01JWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAhICggKGttcF91aW50cHRyX3QpIGxocyAmIDB4IyNNQVNLKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ01QWENIRyhUWVBFLEJJVFMsT1ApICAgICAvKiBhbGlnbmVkIGFkZHJlc3MgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUwoT1AjIz0sTENLX0lEKSAgLyogdW5hbGlnbmVkIGFkZHJlc3MgLSB1c2UgY3JpdGljYWwgKi8gICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyBSSFM9ZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgY2hhciwgICAgICAgbXVsLCAgOCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsIGNoYXIsICAgICAgIGRpdiwgIDgsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCBzaG9ydCwgICAgICBtdWwsIDE2LCAqLCBmbG9hdDgsIGttcF9yZWFsNjQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgc2hvcnQsICAgICAgZGl2LCAxNiwgLywgZmxvYXQ4LCBrbXBfcmVhbDY0LCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsIGttcF9pbnQzMiwgIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCBrbXBfaW50MzIsICBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwga21wX2ludDY0LCAgbXVsLCA2NCwgKiwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbXVsX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsIGttcF9pbnQ2NCwgIGRpdiwgNjQsIC8sIGZsb2F0OCwga21wX3JlYWw2NCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4CitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZmxvYXQ4LCBrbXBfcmVhbDY0LCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2Zsb2F0OAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZsb2F0OCwga21wX3JlYWw2NCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mbG9hdDgKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmbG9hdDgsIGttcF9yZWFsNjQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4CisKKy8vIFJIUz1mbG9hdDE2IChkZXByZWNhdGVkLCB0byBiZSByZW1vdmVkIHdoZW4gd2UgYXJlIHN1cmUgdGhlIGNvbXBpbGVyIGRvZXMgbm90IHVzZSB0aGVtKQorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgYWRkLCAgOCwgKywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMSwgIGNoYXIsICAgICAgIHN1YiwgIDgsIC0sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDEsICBjaGFyLCAgICAgICBtdWwsICA4LCAqLCBmcCwgX1F1YWQsIDFpLCAwLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQxLCAgY2hhciwgICAgICAgZGl2LCAgOCwgLywgZnAsIF9RdWFkLCAxaSwgMCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMXUsIHVjaGFyLCAgICAgIGRpdiwgIDgsIC8sIGZwLCBfUXVhZCwgMWksIDAsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBhZGQsIDE2LCArLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQyLCAgc2hvcnQsICAgICAgc3ViLCAxNiwgLSwgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkMiwgIHNob3J0LCAgICAgIG11bCwgMTYsICosIGZwLCBfUXVhZCwgMmksIDEsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDIsICBzaG9ydCwgICAgICBkaXYsIDE2LCAvLCBmcCwgX1F1YWQsIDJpLCAxLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQydSwgdXNob3J0LCAgICAgZGl2LCAxNiwgLywgZnAsIF9RdWFkLCAyaSwgMSwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9mcAorCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGFkZCwgMzIsICssIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDQsICBrbXBfaW50MzIsICBzdWIsIDMyLCAtLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ0LCAga21wX2ludDMyLCAgbXVsLCAzMiwgKiwgZnAsIF9RdWFkLCA0aSwgMywgMCApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkNCwgIGttcF9pbnQzMiwgIGRpdiwgMzIsIC8sIGZwLCBfUXVhZCwgNGksIDMsIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDR1LCBrbXBfdWludDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRpLCAzLCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwCisKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgYWRkLCA2NCwgKywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfYWRkX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOCwgIGttcF9pbnQ2NCwgIHN1YiwgNjQsIC0sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmaXhlZDgsICBrbXBfaW50NjQsICBtdWwsIDY0LCAqLCBmcCwgX1F1YWQsIDhpLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZml4ZWQ4LCAga21wX2ludDY0LCAgZGl2LCA2NCwgLywgZnAsIF9RdWFkLCA4aSwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZpeGVkOHUsIGttcF91aW50NjQsIGRpdiwgNjQsIC8sIGZwLCBfUXVhZCwgOGksIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBhZGQsIDMyLCArLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ0LCAga21wX3JlYWwzMiwgc3ViLCAzMiwgLSwgZnAsIF9RdWFkLCA0ciwgMywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0NCwgIGttcF9yZWFsMzIsIG11bCwgMzIsICosIGZwLCBfUXVhZCwgNHIsIDMsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDQsICBrbXBfcmVhbDMyLCBkaXYsIDMyLCAvLCBmcCwgX1F1YWQsIDRyLCAzLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAKKworQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBhZGQsIDY0LCArLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAKK0FUT01JQ19DTVBYQ0hHX01JWCggZmxvYXQ4LCAga21wX3JlYWw2NCwgc3ViLCA2NCwgLSwgZnAsIF9RdWFkLCA4ciwgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwCitBVE9NSUNfQ01QWENIR19NSVgoIGZsb2F0OCwgIGttcF9yZWFsNjQsIG11bCwgNjQsICosIGZwLCBfUXVhZCwgOHIsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcAorQVRPTUlDX0NNUFhDSEdfTUlYKCBmbG9hdDgsICBrbXBfcmVhbDY0LCBkaXYsIDY0LCAvLCBmcCwgX1F1YWQsIDhyLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAKKworQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgYWRkLCArLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwCitBVE9NSUNfQ1JJVElDQUxfRlAoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAgICBzdWIsIC0sIGZwLCBfUXVhZCwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAKK0FUT01JQ19DUklUSUNBTF9GUCggZmxvYXQxMCwgbG9uZyBkb3VibGUsICAgIG11bCwgKiwgZnAsIF9RdWFkLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcAorQVRPTUlDX0NSSVRJQ0FMX0ZQKCBmbG9hdDEwLCBsb25nIGRvdWJsZSwgICAgZGl2LCAvLCBmcCwgX1F1YWQsIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwCisjZW5kaWYKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gWDg2IG9yIFg4Nl82NDogbm8gYWxpZ25tZW50IHByb2JsZW1zID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorI2lmIFVTRV9DTVBYQ0hHX0ZJWAorLy8gd29ya2Fyb3VuZCBmb3IgQzc4Mjg3IChjb21wbGV4KGtpbmQ9NCkgZGF0YSB0eXBlKQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DTVBMWChUWVBFX0lELFRZUEUsT1BfSUQsQklUUyxPUCxSVFlQRV9JRCxSVFlQRSxMQ0tfSUQsTUFTSyxHT01QX0ZMQUcpIFwKK0FUT01JQ19CRUdJTl9NSVgoVFlQRV9JRCxUWVBFLE9QX0lELFJUWVBFX0lELFJUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCMjPSxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfV09SS0FST1VORChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIGVuZCBvZiB0aGUgc2Vjb25kIHBhcnQgb2YgdGhlIHdvcmthcm91bmQgZm9yIEM3ODI4NworI2Vsc2UKKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisjZW5kaWYgLy8gVVNFX0NNUFhDSEdfRklYCisjZWxzZQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBDb2RlIGZvciBvdGhlciBhcmNoaXRlY3R1cmVzIHRoYXQgZG9uJ3QgaGFuZGxlIHVuYWxpZ25lZCBhY2Nlc3Nlcy4KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ01QTFgoVFlQRV9JRCxUWVBFLE9QX0lELEJJVFMsT1AsUlRZUEVfSUQsUlRZUEUsTENLX0lELE1BU0ssR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fTUlYKFRZUEVfSUQsVFlQRSxPUF9JRCxSVFlQRV9JRCxSVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgjI01BU0spICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NNUFhDSEcoVFlQRSxCSVRTLE9QKSAgICAgLyogYWxpZ25lZCBhZGRyZXNzICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMKE9QIyM9LExDS19JRCkgIC8qIHVuYWxpZ25lZCBhZGRyZXNzIC0gdXNlIGNyaXRpY2FsICovICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBhZGQsIDY0LCArLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9hZGRfY21wbHg4CitBVE9NSUNfQ01QWENIR19DTVBMWCggY21wbHg0LCBrbXBfY21wbHgzMiwgc3ViLCA2NCwgLSwgY21wbHg4LCAga21wX2NtcGx4NjQsICA4YywgNywgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OAorQVRPTUlDX0NNUFhDSEdfQ01QTFgoIGNtcGx4NCwga21wX2NtcGx4MzIsIG11bCwgNjQsICosIGNtcGx4OCwgIGttcF9jbXBseDY0LCAgOGMsIDcsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jbXBseDgKK0FUT01JQ19DTVBYQ0hHX0NNUExYKCBjbXBseDQsIGttcF9jbXBseDMyLCBkaXYsIDY0LCAvLCBjbXBseDgsICBrbXBfY21wbHg2NCwgIDhjLCA3LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9kaXZfY21wbHg4CisKKy8vIFJFQUQsIFdSSVRFLCBDQVBUVVJFIGFyZSBzdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisvLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8vLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFJFQUQgcm91dGluZXMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSwgUkVUX1RZUEUpIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxvYyApIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgdXNpbmcgImNvbXBhcmVfYW5kX3N0b3JlX3JldCIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgc3RpbGwgbmVjZXNzYXJ5CisvLyBSZXR1cm4gb2xkIHZhbHVlIHJlZ2FyZGxlc3Mgb2YgdGhlIHJlc3VsdCBvZiAiY29tcGFyZSAmIHN3YXAjIG9wZXJhdGlvbgorCisjZGVmaW5lIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIEtNUF9BVE9NSUNfVk9MQVRJTEUgdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHVuaW9uIGZfaV91bmlvbiB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIFRZUEUgZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAga21wX2ludCMjQklUUyBpX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5pb24gZl9pX3VuaW9uIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsb2M7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZS5mX3ZhbCA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlLmlfdmFsID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVCMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbG9jLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLmlfdmFsLCAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUuaV92YWwgKTsgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUuZl92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBuZXdfdmFsdWUgPSAoKmxvYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfUkVBRCggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0ZJWEVEX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG5ld192YWx1ZSA9IEtNUF9URVNUX1RIRU5fQUREIyNCSVRTKCBsb2MsIE9QIDAgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfUkVBRChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1JFQUQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX1JFQUQoT1AjIz0sR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfUkVBRChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgICAgIFwKK0FUT01JQ19CRUdJTl9SRUFEKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEKE9QIyM9LEdPTVBfRkxBRykgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9SRUFEKE9QLExDS19JRCkgICAgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRml4IGZvciBjbXBseDQgcmVhZCAoQ1EyMjAzNjEpIG9uIFdpbmRvd3MqIE9TLiBSZWd1bGFyIHJvdXRpbmUgd2l0aCByZXR1cm4gdmFsdWUgZG9lc24ndCB3b3JrLgorLy8gTGV0J3MgcmV0dXJuIHRoZSByZWFkIHZhbHVlIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjaWYgKCBLTVBfT1NfV0lORE9XUyApCisKKyNkZWZpbmUgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gKCpsb2MpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfUkVBRF9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE9QX0NSSVRJQ0FMX1JFQURfV1JLKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX1JFQURfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0JFR0lOX1JFQURfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgXAordm9pZCBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjXyMjT1BfSUQoIFRZUEUgKiBvdXQsIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFRZUEUgKiBsb2MgKSBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfIiAjT1BfSUQgIjogVCMlZFxuIiwgZ3RpZCApKTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyhUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgICAgICBcCitBVE9NSUNfQkVHSU5fUkVBRF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9SRUFEX1dSSyhPUCMjPSxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICBcCisgICAgT1BfQ1JJVElDQUxfUkVBRF9XUksoT1AsTENLX0lEKSAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICAgICAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICBPUCwgR09NUF9GTEFHCitBVE9NSUNfRklYRURfUkVBRCggZml4ZWQ0LCByZCwga21wX2ludDMyLCAgMzIsICssIDAgICAgICAgICAgICApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfcmQKK0FUT01JQ19GSVhFRF9SRUFEKCBmaXhlZDgsIHJkLCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9yZAorQVRPTUlDX0NNUFhDSEdfUkVBRCggZmxvYXQ0LCByZCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3JkCitBVE9NSUNfQ01QWENIR19SRUFEKCBmbG9hdDgsIHJkLCBrbXBfcmVhbDY0LCA2NCwgKywgS01QX0FSQ0hfWDg2ICkgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfcmQKKworLy8gISEhIFRPRE86IFJlbW92ZSBsb2NrIG9wZXJhdGlvbnMgZm9yICJjaGFyIiBzaW5jZSBpdCBjYW4ndCBiZSBub24tYXRvbWljCitBVE9NSUNfQ01QWENIR19SRUFEKCBmaXhlZDEsICByZCwga21wX2ludDgsICAgIDgsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfcmQKK0FUT01JQ19DTVBYQ0hHX1JFQUQoIGZpeGVkMiwgIHJkLCBrbXBfaW50MTYsICAxNiwgKywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZAorCitBVE9NSUNfQ1JJVElDQUxfUkVBRCggZmxvYXQxMCwgcmQsIGxvbmcgZG91YmxlLCArLCAxMHIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX3JkCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIHJkLCBRVUFEX0xFR0FDWSwgKywgMTZyLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9yZAorI2VuZGlmIC8vIEtNUF9IQVZFX1FVQUQKKworLy8gRml4IGZvciBDUTIyMDM2MSBvbiBXaW5kb3dzKiBPUworI2lmICggS01QX09TX1dJTkRPV1MgKQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEX1dSSyggY21wbHg0LCAgcmQsIGttcF9jbXBseDMyLCArLCAgOGMsIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZWxzZQorICAgIEFUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDQsICByZCwga21wX2NtcGx4MzIsICssICA4YywgMSApICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3JkCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDgsICByZCwga21wX2NtcGx4NjQsICssIDE2YywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9yZAorQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTAsIHJkLCBrbXBfY21wbHg4MCwgKywgMjBjLCAxICkgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9yZAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9SRUFEKCBjbXBseDE2LCByZCwgQ1BMWDEyOF9MRUcsICssIDMyYywgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfcmQKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGZsb2F0MTYsIGExNl9yZCwgUXVhZF9hMTZfdCwgKywgMTZyLCAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkCisgICAgQVRPTUlDX0NSSVRJQ0FMX1JFQUQoIGNtcGx4MTYsIGExNl9yZCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsIDEgKSAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3JkCisjZW5kaWYKKyNlbmRpZgorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXRvbWljIFdSSVRFIHJvdXRpbmVzCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfWENIR19XUihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9YQ0hHX0ZJWEVEIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX1hDSEdfRkxPQVRfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgXAorQVRPTUlDX0JFR0lOKFRZUEVfSUQsT1BfSUQsVFlQRSx2b2lkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWENIR19SRUFMIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYQ0hHX1dSKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTihUWVBFX0lELE9QX0lELFRZUEUsdm9pZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUwoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfQ01QWENIR19XUihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgRXh0ZW5kZWQgdHlwZXM6IGxvbmcgZG91YmxlLCBfUXVhZCwgY29tcGxleCBmbGF2b3VycyAodXNlIGNyaXRpY2FsIHNlY3Rpb24pCisvLyAgICAgVFlQRV9JRCwgT1BfSUQsIFRZUEUgLSBkZXRhaWxlZCBhYm92ZQorLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gICAgIExDS19JRCAgLSBsb2NrIGlkZW50aWZpZXIsIHVzZWQgdG8gcG9zc2libHkgZGlzdGluZ3Vpc2ggbG9jayB2YXJpYWJsZQorI2RlZmluZSBBVE9NSUNfQ1JJVElDQUxfV1IoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgICBcCitBVE9NSUNfQkVHSU4oVFlQRV9JRCxPUF9JRCxUWVBFLHZvaWQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMKE9QLEdPTVBfRkxBRykgICAgICAgLyogc2VuZCBhc3NpZ25tZW50ICovICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMKE9QLExDS19JRCkgICAgICAgICAgICAgICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDEsICB3ciwga21wX2ludDgsICAgIDgsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDIsICB3ciwga21wX2ludDE2LCAgMTYsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfd3IKK0FUT01JQ19YQ0hHX1dSKCBmaXhlZDQsICB3ciwga21wX2ludDMyLCAgMzIsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfV1IoIGZpeGVkOCwgIHdyLCBrbXBfaW50NjQsICA2NCwgPSwgIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfd3IKKyNlbmRpZgorCitBVE9NSUNfWENIR19GTE9BVF9XUiggZmxvYXQ0LCB3ciwga21wX3JlYWwzMiwgMzIsID0sIEtNUF9BUkNIX1g4NiApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NNUFhDSEdfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbHNlCisgICAgQVRPTUlDX1hDSEdfRkxPQVRfV1IoIGZsb2F0OCwgIHdyLCBrbXBfcmVhbDY0LCAgNjQsID0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfd3IKKyNlbmRpZgorCitBVE9NSUNfQ1JJVElDQUxfV1IoIGZsb2F0MTAsIHdyLCBsb25nIGRvdWJsZSwgPSwgMTByLCAgIDEgKSAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF93cgorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9XUiggZmxvYXQxNiwgd3IsIFFVQURfTEVHQUNZLCA9LCAxNnIsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X3dyCisjZW5kaWYKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg0LCAgd3IsIGttcF9jbXBseDMyLCA9LCAgOGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDRfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHg4LCAgd3IsIGttcF9jbXBseDY0LCA9LCAxNmMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfd3IKK0FUT01JQ19DUklUSUNBTF9XUiggY21wbHgxMCwgd3IsIGttcF9jbXBseDgwLCA9LCAyMGMsICAgMSApICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3dyCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1dSKCBjbXBseDE2LCB3ciwgQ1BMWDEyOF9MRUcsID0sIDMyYywgICAxICkgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfd3IKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgQVRPTUlDX0NSSVRJQ0FMX1dSKCBmbG9hdDE2LCBhMTZfd3IsIFF1YWRfYTE2X3QsICAgICAgICAgPSwgMTZyLCAxICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl93cgorICAgIEFUT01JQ19DUklUSUNBTF9XUiggY21wbHgxNiwgYTE2X3dyLCBrbXBfY21wbHgxMjhfYTE2X3QsID0sIDMyYywgMSApIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfd3IKKyNlbmRpZgorI2VuZGlmCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBdG9taWMgQ0FQVFVSRSByb3V0aW5lcworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJlZ2lubmluZyBvZiBhIGRlZmluaXRpb24gKHByb3ZpZGVzIG5hbWUsIHBhcmFtZXRlcnMsIGdlYnVnIHRyYWNlKQorLy8gICAgIFRZUEVfSUQgLSBvcGVyYW5kcyB0eXBlIGFuZCBzaXplIChmaXhlZCosIGZpeGVkKnUgZm9yIHNpZ25lZCwgdW5zaWduZWQgZml4ZWQpCisvLyAgICAgT1BfSUQgICAtIG9wZXJhdGlvbiBpZGVudGlmaWVyIChhZGQsIHN1YiwgbXVsLCAuLi4pCisvLyAgICAgVFlQRSAgICAtIG9wZXJhbmRzJyB0eXBlCisjZGVmaW5lIEFUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFJFVF9UWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK1JFVF9UWVBFIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiXyIgI09QX0lEICI6IFQjJWRcbiIsIGd0aWQgKSk7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZXJhdGlvbiBvbiAqbGhzLCByaHMgYm91bmQgYnkgY3JpdGljYWwgc2VjdGlvbgorLy8gICAgIE9QICAgICAtIG9wZXJhdG9yIChpdCdzIHN1cHBvc2VkIHRvIGNvbnRhaW4gYW4gYXNzaWdubWVudCkKKy8vICAgICBMQ0tfSUQgLSBsb2NrIGlkZW50aWZpZXIKKy8vIE5vdGU6IGRvbid0IGNoZWNrIGd0aWQgYXMgaXQgc2hvdWxkIGFsd2F5cyBiZSB2YWxpZAorLy8gMSwgMi1ieXRlIC0gZXhwZWN0IHZhbGlkIHBhcmFtZXRlciwgb3RoZXIgLSBjaGVjayBiZWZvcmUgdGhpcyBtYWNybworI2RlZmluZSBPUF9DUklUSUNBTF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gKCpsaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKCpsaHMpIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFQoIE9QIyM9LCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsRkxBRykKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIHVzaW5nICJjb21wYXJlX2FuZF9zdG9yZSIgcm91dGluZQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kcycgdHlwZQorLy8gICAgIEJJVFMgICAgLSBzaXplIGluIGJpdHMsIHVzZWQgdG8gZGlzdGluZ3Vpc2ggbG93IGxldmVsIGNhbGxzCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyBOb3RlOiB0ZW1wX3ZhbCBpbnRyb2R1Y2VkIGluIG9yZGVyIHRvIGZvcmNlIHRoZSBjb21waWxlciB0byByZWFkCisvLyAgICAgICAqbGhzIG9ubHkgb25jZSAody9vIGl0IHRoZSBjb21waWxlciByZWFkcyAqbGhzIHR3aWNlKQorI2RlZmluZSBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBUWVBFIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRIyNCSVRTKCAoa21wX2ludCMjQklUUyAqKSBsaHMsIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICpWT0xBVElMRV9DQVNUKGttcF9pbnQjI0JJVFMgKikgJm5ld192YWx1ZSApICkgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfQ01QWENIR19DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19GSVhFRF9BRERfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFQoT1AsR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgLyogT1AgdXNlZCBhcyBhIHNpZ24gZm9yIHN1YnRyYWN0aW9uOiAobGhzLXJocykgLS0+IChsaHMrLXJocykgKi8gICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1RFU1RfVEhFTl9BREQjI0JJVFMoIGxocywgT1AgcmhzICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWUgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDQsIGFkZF9jcHQsIGttcF9pbnQzMiwgIDMyLCArLCAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdAorQVRPTUlDX0ZJWEVEX0FERF9DUFQoIGZpeGVkNCwgc3ViX2NwdCwga21wX2ludDMyLCAgMzIsIC0sIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0CitBVE9NSUNfRklYRURfQUREX0NQVCggZml4ZWQ4LCBhZGRfY3B0LCBrbXBfaW50NjQsICA2NCwgKywgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X2FkZF9jcHQKK0FUT01JQ19GSVhFRF9BRERfQ1BUKCBmaXhlZDgsIHN1Yl9jcHQsIGttcF9pbnQ2NCwgIDY0LCAtLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc3ViX2NwdAorCitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgYWRkX2NwdCwga21wX3JlYWwzMiwgMzIsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgc3ViX2NwdCwga21wX3JlYWwzMiwgMzIsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgYWRkX2NwdCwga21wX3JlYWw2NCwgNjQsICssIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0OCwgc3ViX2NwdCwga21wX3JlYWw2NCwgNjQsIC0sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zdWJfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gRW50cmllcyBkZWZpbml0aW9uIGZvciBpbnRlZ2VyIG9wZXJhbmRzCisvLyAgICAgVFlQRV9JRCAtIG9wZXJhbmRzIHR5cGUgYW5kIHNpemUgKGZpeGVkNCwgZmxvYXQ0KQorLy8gICAgIE9QX0lEICAgLSBvcGVyYXRpb24gaWRlbnRpZmllciAoYWRkLCBzdWIsIG11bCwgLi4uKQorLy8gICAgIFRZUEUgICAgLSBvcGVyYW5kIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvciAodXNlZCBpbiBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgICAgICAgICAgICBUWVBFX0lELE9QX0lELCAgVFlQRSwgICBCSVRTLE9QLEdPTVBfRkxBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQVRPTUlDIGludGVnZXIgb3BlcmFuZHMsIG90aGVyIG9wZXJhdG9ycworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgYWRkX2NwdCwga21wX2ludDgsICAgIDgsICssICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsIGFuZGJfY3B0LCBrbXBfaW50OCwgICAgOCwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBkaXZfY3B0LCBrbXBfaW50OCwgICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMXUsIGRpdl9jcHQsIGttcF91aW50OCwgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIG11bF9jcHQsIGttcF9pbnQ4LCAgICA4LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgb3JiX2NwdCwga21wX2ludDgsICAgIDgsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICBzaGxfY3B0LCBrbXBfaW50OCwgICAgOCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMSwgIHNocl9jcHQsIGttcF9pbnQ4LCAgICA4LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxdSwgc2hyX2NwdCwga21wX3VpbnQ4LCAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQxLCAgc3ViX2NwdCwga21wX2ludDgsICAgIDgsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDEsICB4b3JfY3B0LCBrbXBfaW50OCwgICAgOCwgXiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV94b3JfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIGFkZF9jcHQsIGttcF9pbnQxNiwgIDE2LCArLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2FkZF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCBhbmRiX2NwdCwga21wX2ludDE2LCAgMTYsICYsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgZGl2X2NwdCwga21wX2ludDE2LCAgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDJ1LCBkaXZfY3B0LCBrbXBfdWludDE2LCAxNiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBtdWxfY3B0LCBrbXBfaW50MTYsICAxNiwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9tdWxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIG9yYl9jcHQsIGttcF9pbnQxNiwgIDE2LCB8LCAgMCAgICAgICAgICAgICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgc2hsX2NwdCwga21wX2ludDE2LCAgMTYsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDIsICBzaHJfY3B0LCBrbXBfaW50MTYsICAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMnUsIHNocl9jcHQsIGttcF91aW50MTYsIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkMiwgIHN1Yl9jcHQsIGttcF9pbnQxNiwgIDE2LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQyLCAgeG9yX2NwdCwga21wX2ludDE2LCAgMTYsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsIGFuZGJfY3B0LCBrbXBfaW50MzIsICAzMiwgJiwgIDAgICAgICAgICAgICApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBkaXZfY3B0LCBrbXBfaW50MzIsICAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNHUsIGRpdl9jcHQsIGttcF91aW50MzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0dV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIG11bF9jcHQsIGttcF9pbnQzMiwgIDMyLCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgb3JiX2NwdCwga21wX2ludDMyLCAgMzIsIHwsICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDQsICBzaGxfY3B0LCBrbXBfaW50MzIsICAzMiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkNCwgIHNocl9jcHQsIGttcF9pbnQzMiwgIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0dSwgc2hyX2NwdCwga21wX3VpbnQzMiwgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ0LCAgeG9yX2NwdCwga21wX2ludDMyLCAgMzIsIF4sICAwICAgICAgICAgICAgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsIGFuZGJfY3B0LCBrbXBfaW50NjQsICA2NCwgJiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBkaXZfY3B0LCBrbXBfaW50NjQsICA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOHUsIGRpdl9jcHQsIGttcF91aW50NjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIG11bF9jcHQsIGttcF9pbnQ2NCwgIDY0LCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgb3JiX2NwdCwga21wX2ludDY0LCAgNjQsIHwsICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmaXhlZDgsICBzaGxfY3B0LCBrbXBfaW50NjQsICA2NCwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaGxfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZpeGVkOCwgIHNocl9jcHQsIGttcF9pbnQ2NCwgIDY0LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4dSwgc2hyX2NwdCwga21wX3VpbnQ2NCwgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZml4ZWQ4LCAgeG9yX2NwdCwga21wX2ludDY0LCAgNjQsIF4sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfeG9yX2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDQsICBkaXZfY3B0LCBrbXBfcmVhbDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfY3B0CitBVE9NSUNfQ01QWENIR19DUFQoIGZsb2F0NCwgIG11bF9jcHQsIGttcF9yZWFsMzIsIDMyLCAqLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9jcHQKK0FUT01JQ19DTVBYQ0hHX0NQVCggZmxvYXQ4LCAgZGl2X2NwdCwga21wX3JlYWw2NCwgNjQsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCBmbG9hdDgsICBtdWxfY3B0LCBrbXBfcmVhbDY0LCA2NCwgKiwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWxfY3B0CisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBSb3V0aW5lcyBmb3IgQy9DKysgUmVkdWN0aW9uIG9wZXJhdG9ycyAmJiBhbmQgfHwKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfTF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYoIGZsYWcgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlIE9QIHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9MX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfTF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9MX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE5lZWQgc2VwYXJhdGUgbWFjcm9zIGZvciAmJiwgfHwgYmVjYXVzZSB0aGVyZSBpcyBubyBjb21iaW5lZCBhc3NpZ25tZW50CisjZGVmaW5lIEFUT01JQ19DTVBYX0xfQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxCSVRTLE9QLEdPTVBfRkxBRykgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9MX0NQVCggPSAqbGhzIE9QLCBHT01QX0ZMQUcgKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQxLCBhbmRsX2NwdCwgY2hhciwgICAgICAgOCwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMSwgIG9ybF9jcHQsIGNoYXIsICAgICAgIDgsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfb3JsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkMiwgYW5kbF9jcHQsIHNob3J0LCAgICAgMTYsICYmLCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDIsICBvcmxfY3B0LCBzaG9ydCwgICAgIDE2LCB8fCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQKK0FUT01JQ19DTVBYX0xfQ1BUKCBmaXhlZDQsIGFuZGxfY3B0LCBrbXBfaW50MzIsIDMyLCAmJiwgMCApICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ0LCAgb3JsX2NwdCwga21wX2ludDMyLCAzMiwgfHwsIDAgKSAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmxfY3B0CitBVE9NSUNfQ01QWF9MX0NQVCggZml4ZWQ4LCBhbmRsX2NwdCwga21wX2ludDY0LCA2NCwgJiYsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRsX2NwdAorQVRPTUlDX0NNUFhfTF9DUFQoIGZpeGVkOCwgIG9ybF9jcHQsIGttcF9pbnQ2NCwgNjQsIHx8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfb3JsX2NwdAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBGb3J0cmFuIG9wZXJhdG9ycyB0aGF0IG1hdGNoZWQgbm8gb25lIGluIEM6CisvLyBNQVgsIE1JTiwgLkVRVi4sIC5ORVFWLgorLy8gT3BlcmF0b3JzIC5BTkQuLCAuT1IuIGFyZSBjb3ZlcmVkIGJ5IF9fa21wY19hdG9taWNfKl97YW5kbCxvcmx9X2NwdAorLy8gSW50cmluc2ljcyBJQU5ELCBJT1IsIElFT1IgYXJlIGNvdmVyZWQgYnkgX19rbXBjX2F0b21pY18qX3thbmRiLG9yYix4b3J9X2NwdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBNSU4gYW5kIE1BWCBuZWVkIHNlcGFyYXRlIG1hY3JvcworLy8gT1AgLSBvcGVyYXRvciB0byBjaGVjayBpZiB3ZSBuZWVkIGFueSBhY3Rpb25zPworI2RlZmluZSBNSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgICAgICAgICAgICAgLyogc3RpbGwgbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKmxocyA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBmbGFnICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxGTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoKCBGTEFHICkgJiYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkpIHsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVF9DUFQoIE9QLCAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgTUlOX01BWF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgLypUWVBFIG9sZF92YWx1ZTsgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgb2xkX3ZhbHVlID0gdGVtcF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgd2hpbGUgKCBvbGRfdmFsdWUgT1AgcmhzICYmICAgICAgICAgIC8qIHN0aWxsIG5lZWQgYWN0aW9ucz8gKi8gICAgIFwKKyAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZvbGRfdmFsdWUsICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZyaHMgKSApICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHRlbXBfdmFsID0gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYoIGZsYWcgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIDEtYnl0ZSwgMi1ieXRlIG9wZXJhbmRzIC0gdXNlIGNyaXRpY2FsIHNlY3Rpb24KKyNkZWZpbmUgTUlOX01BWF9DUklUSUNBTF9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZSwgb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoICpsaHMgT1AgcmhzICkgeyAgICAgLyogbmVlZCBhY3Rpb25zPyAqLyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgR09NUF9NSU5fTUFYX0NSSVRTRUNUX0NQVChPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUlOX01BWF9DUklUU0VDVF9DUFQoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gKmxoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2RlZmluZSBNSU5fTUFYX0NPTVBYQ0hHX0NQVChUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgICAgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlLCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKmxocyBPUCByaHMgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBHT01QX01JTl9NQVhfQ1JJVFNFQ1RfQ1BUKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNSU5fTUFYX0NNUFhDSEdfQ1BUKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHJldHVybiAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDEsICBtYXhfY3B0LCBjaGFyLCAgICAgICAgOCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDFfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkMSwgIG1pbl9jcHQsIGNoYXIsICAgICAgICA4LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQyLCAgbWF4X2NwdCwgc2hvcnQsICAgICAgMTYsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDIsICBtaW5fY3B0LCBzaG9ydCwgICAgICAxNiwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDJfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkNCwgIG1heF9jcHQsIGttcF9pbnQzMiwgIDMyLCA8LCAwICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZml4ZWQ0LCAgbWluX2NwdCwga21wX2ludDMyLCAgMzIsID4sIDAgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmaXhlZDgsICBtYXhfY3B0LCBrbXBfaW50NjQsICA2NCwgPCwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDhfbWF4X2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZpeGVkOCwgIG1pbl9jcHQsIGttcF9pbnQ2NCwgIDY0LCA+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW5fY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ0LCAgbWF4X2NwdCwga21wX3JlYWwzMiwgMzIsIDwsIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQKK01JTl9NQVhfQ09NUFhDSEdfQ1BUKCBmbG9hdDQsICBtaW5fY3B0LCBrbXBfcmVhbDMyLCAzMiwgPiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdAorTUlOX01BWF9DT01QWENIR19DUFQoIGZsb2F0OCwgIG1heF9jcHQsIGttcF9yZWFsNjQsIDY0LCA8LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0CitNSU5fTUFYX0NPTVBYQ0hHX0NQVCggZmxvYXQ4LCAgbWluX2NwdCwga21wX3JlYWw2NCwgNjQsID4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQKKyNpZiBLTVBfSEFWRV9RVUFECitNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWF4X2NwdCwgUVVBRF9MRUdBQ1ksICAgIDwsIDE2ciwgICAxICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0CitNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWluX2NwdCwgUVVBRF9MRUdBQ1ksICAgID4sIDE2ciwgICAxICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIE1JTl9NQVhfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtYXhfYTE2X2NwdCwgUXVhZF9hMTZfdCwgPCwgMTZyLCAgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWF4X2ExNl9jcHQKKyAgICBNSU5fTUFYX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbWluX2ExNl9jcHQsIFF1YWRfYTE2X3QsID4sIDE2ciwgIDEgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X21peF9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgT1BfQ1JJVElDQUxfQ1BUKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9QX0dPTVBfQ1JJVElDQUxfRVFWX0NQVChPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjZGVmaW5lIEFUT01JQ19DTVBYX0VRVl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLEJJVFMsT1AsR09NUF9GTEFHKSAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRZUEUgbmV3X3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9FUVZfQ1BUKF49fixHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgIFwKKyAgICBPUF9DTVBYQ0hHX0NQVChUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQxLCBuZXF2X2NwdCwga21wX2ludDgsICAgOCwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQyLCBuZXF2X2NwdCwga21wX2ludDE2LCAxNiwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQ0LCBuZXF2X2NwdCwga21wX2ludDMyLCAzMiwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9uZXF2X2NwdAorQVRPTUlDX0NNUFhDSEdfQ1BUKCAgZml4ZWQ4LCBuZXF2X2NwdCwga21wX2ludDY0LCA2NCwgICBeLCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQxLCBlcXZfY3B0LCAga21wX2ludDgsICAgOCwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9lcXZfY3B0CitBVE9NSUNfQ01QWF9FUVZfQ1BUKCBmaXhlZDIsIGVxdl9jcHQsICBrbXBfaW50MTYsIDE2LCAgXn4sIEtNUF9BUkNIX1g4NiApIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQKK0FUT01JQ19DTVBYX0VRVl9DUFQoIGZpeGVkNCwgZXF2X2NwdCwgIGttcF9pbnQzMiwgMzIsICBefiwgS01QX0FSQ0hfWDg2ICkgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZXF2X2NwdAorQVRPTUlDX0NNUFhfRVFWX0NQVCggZml4ZWQ4LCBlcXZfY3B0LCAga21wX2ludDY0LCA2NCwgIF5+LCBLTVBfQVJDSF9YODYgKSAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9lcXZfY3B0CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gUm91dGluZXMgZm9yIEV4dGVuZGVkIHR5cGVzOiBsb25nIGRvdWJsZSwgX1F1YWQsIGNvbXBsZXggZmxhdm91cnMgKHVzZSBjcml0aWNhbCBzZWN0aW9uKQorLy8gICAgIFRZUEVfSUQsIE9QX0lELCBUWVBFIC0gZGV0YWlsZWQgYWJvdmUKKy8vICAgICBPUCAgICAgIC0gb3BlcmF0b3IKKy8vICAgICBMQ0tfSUQgIC0gbG9jayBpZGVudGlmaWVyLCB1c2VkIHRvIHBvc3NpYmx5IGRpc3Rpbmd1aXNoIGxvY2sgdmFyaWFibGUKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVChUWVBFX0lELE9QX0lELFRZUEUsT1AsTENLX0lELEdPTVBfRkxBRykgXAorQVRPTUlDX0JFR0lOX0NQVChUWVBFX0lELE9QX0lELFRZUEUsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVChPUCxHT01QX0ZMQUcpICAvKiBzZW5kIGFzc2lnbm1lbnQgKi8gICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVChPUCMjPSxMQ0tfSUQpICAgICAgICAgIC8qIHNlbmQgYXNzaWdubWVudCAqLyAgICBcCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgT1AgcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSBPUCByaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9XUksoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfV1JLKCBPUCMjPSwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfIyNPUF9JRCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMsIFRZUEUgKiBvdXQsIGludCBmbGFnICkgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLQV9UUkFDRSgxMDAsKCJfX2ttcGNfYXRvbWljXyIgI1RZUEVfSUQgIl8iICNPUF9JRCAiOiBUIyVkXG4iLCBndGlkICkpOworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9XUksoVFlQRV9JRCxPUF9JRCxUWVBFLE9QLExDS19JRCxHT01QX0ZMQUcpICAgXAorQVRPTUlDX0JFR0lOX1dSSyhUWVBFX0lELE9QX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgT1BfR09NUF9DUklUSUNBTF9DUFRfV1JLKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfV1JLKE9QIyM9LExDS19JRCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorLy8gVGhlIGVuZCBvZiB3b3JrYXJvdW5kIGZvciBjbXBseDQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLy8gcm91dGluZXMgZm9yIGxvbmcgZG91YmxlIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIGFkZF9jcHQsIGxvbmcgZG91YmxlLCAgICAgKywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDEwLCBzdWJfY3B0LCBsb25nIGRvdWJsZSwgICAgIC0sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxMCwgbXVsX2NwdCwgbG9uZyBkb3VibGUsICAgICAqLCAxMHIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTAsIGRpdl9jcHQsIGxvbmcgZG91YmxlLCAgICAgLywgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0CisjaWYgS01QX0hBVkVfUVVBRAorLy8gcm91dGluZXMgZm9yIF9RdWFkIHR5cGUKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGFkZF9jcHQsIFFVQURfTEVHQUNZLCAgICAgKywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBzdWJfY3B0LCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgbXVsX2NwdCwgUVVBRF9MRUdBQ1ksICAgICAqLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGRpdl9jcHQsIFFVQURfTEVHQUNZLCAgICAgLywgMTZyLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfY3B0CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGFkZF9hMTZfY3B0LCBRdWFkX2ExNl90LCArLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2FkZF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggZmxvYXQxNiwgc3ViX2ExNl9jcHQsIFF1YWRfYTE2X3QsIC0sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBmbG9hdDE2LCBtdWxfYTE2X2NwdCwgUXVhZF9hMTZfdCwgKiwgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGZsb2F0MTYsIGRpdl9hMTZfY3B0LCBRdWFkX2ExNl90LCAvLCAxNnIsICAxICkgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworCisvLyBjbXBseDQgcm91dGluZXMgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBhZGRfY3B0LCBrbXBfY21wbHgzMiwgKywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBzdWJfY3B0LCBrbXBfY21wbHgzMiwgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBtdWxfY3B0LCBrbXBfY21wbHgzMiwgKiwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X211bF9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFRfV1JLKCBjbXBseDQsICBkaXZfY3B0LCBrbXBfY21wbHgzMiwgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHQKKworQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgYWRkX2NwdCwga21wX2NtcGx4NjQsICssIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDgsICBzdWJfY3B0LCBrbXBfY21wbHg2NCwgLSwgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9jcHQKK0FUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4OCwgIG11bF9jcHQsIGttcF9jbXBseDY0LCAqLCAxNmMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHg4LCAgZGl2X2NwdCwga21wX2NtcGx4NjQsIC8sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXZfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBhZGRfY3B0LCBrbXBfY21wbHg4MCwgKywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGRfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBzdWJfY3B0LCBrbXBfY21wbHg4MCwgLSwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBtdWxfY3B0LCBrbXBfY21wbHg4MCwgKiwgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0CitBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDEwLCBkaXZfY3B0LCBrbXBfY21wbHg4MCwgLywgMjBjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfY3B0CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgYWRkX2NwdCwgQ1BMWDEyOF9MRUcsICssIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYWRkX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgc3ViX2NwdCwgQ1BMWDEyOF9MRUcsIC0sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgbXVsX2NwdCwgQ1BMWDEyOF9MRUcsICosIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2NwdAorQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgZGl2X2NwdCwgQ1BMWDEyOF9MRUcsIC8sIDMyYywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X2NwdAorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBhZGRfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCArLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2FkZF9hMTZfY3B0CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVCggY21wbHgxNiwgc3ViX2ExNl9jcHQsIGttcF9jbXBseDEyOF9hMTZfdCwgLSwgMzJjLCAgIDEgKSAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfYTE2X2NwdAorICAgIEFUT01JQ19DUklUSUNBTF9DUFQoIGNtcGx4MTYsIG11bF9hMTZfY3B0LCBrbXBfY21wbHgxMjhfYTE2X3QsICosIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsX2ExNl9jcHQKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUKCBjbXBseDE2LCBkaXZfYTE2X2NwdCwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogdiA9IHggPSBleHByIGJpbm9wIHg7IHsgdiA9IHg7IHggPSBleHByIGJpbm9wIHg7IH0geyB4ID0gZXhwciBiaW5vcCB4OyB2ID0geDsgfSAgZm9yIG5vbi1jb21tdXRhdGl2ZSBvcGVyYXRpb25zLgorLy8gU3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVyYXRpb24gb24gKmxocywgcmhzIGJvdW5kIGJ5IGNyaXRpY2FsIHNlY3Rpb24KKy8vICAgICBPUCAgICAgLSBvcGVyYXRvciAoaXQncyBzdXBwb3NlZCB0byBjb250YWluIGFuIGFzc2lnbm1lbnQpCisvLyAgICAgTENLX0lEIC0gbG9jayBpZGVudGlmaWVyCisvLyBOb3RlOiBkb24ndCBjaGVjayBndGlkIGFzIGl0IHNob3VsZCBhbHdheXMgYmUgdmFsaWQKKy8vIDEsIDItYnl0ZSAtIGV4cGVjdCB2YWxpZCBwYXJhbWV0ZXIsIG90aGVyIC0gY2hlY2sgYmVmb3JlIHRoaXMgbWFjcm8KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1JFVihPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAvKnRlbXBfdmFsID0gKCpsaHMpOyovXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG5ld192YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBuZXdfdmFsdWUgPSAoKmxocyk7XAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybiBuZXdfdmFsdWU7CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfUkVWKCBPUCwgMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWKE9QLEZMQUcpCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gT3BlcmF0aW9uIG9uICpsaHMsIHJocyB1c2luZyAiY29tcGFyZV9hbmRfc3RvcmUiIHJvdXRpbmUKKy8vICAgICBUWVBFICAgIC0gb3BlcmFuZHMnIHR5cGUKKy8vICAgICBCSVRTICAgIC0gc2l6ZSBpbiBiaXRzLCB1c2VkIHRvIGRpc3Rpbmd1aXNoIGxvdyBsZXZlbCBjYWxscworLy8gICAgIE9QICAgICAgLSBvcGVyYXRvcgorLy8gTm90ZTogdGVtcF92YWwgaW50cm9kdWNlZCBpbiBvcmRlciB0byBmb3JjZSB0aGUgY29tcGlsZXIgdG8gcmVhZAorLy8gICAgICAgKmxocyBvbmx5IG9uY2UgKHcvbyBpdCB0aGUgY29tcGlsZXIgcmVhZHMgKmxocyB0d2ljZSkKKyNkZWZpbmUgT1BfQ01QWENIR19DUFRfUkVWKFRZUEUsQklUUyxPUCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzIE9QIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJocyBPUCBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmKCBmbGFnICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHJldHVybiBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfQ1BUX1JFVihUWVBFX0lELE9QX0lELFRZUEUsQklUUyxPUCxHT01QX0ZMQUcpICAgICAgIFwKK0FUT01JQ19CRUdJTl9DUFQoVFlQRV9JRCxPUF9JRCxUWVBFLFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBLTVBfQVRPTUlDX1ZPTEFUSUxFIHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NNUFhDSEdfQ1BUX1JFVihUWVBFLEJJVFMsT1ApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIGRpdl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxdSwgZGl2X2NwdF9yZXYsIGttcF91aW50OCwgICA4LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxdV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQxLCAgc2hsX2NwdF9yZXYsIGttcF9pbnQ4LCAgICA4LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDEsICBzaHJfY3B0X3Jldiwga21wX2ludDgsICAgIDgsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMXUsIHNocl9jcHRfcmV2LCBrbXBfdWludDgsICAgOCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMSwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50OCwgICAgOCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgZGl2X2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDJ1LCBkaXZfY3B0X3Jldiwga21wX3VpbnQxNiwgMTYsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJ1X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDIsICBzaGxfY3B0X3Jldiwga21wX2ludDE2LCAgMTYsIDw8LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkMiwgIHNocl9jcHRfcmV2LCBrbXBfaW50MTYsICAxNiwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQydSwgc2hyX2NwdF9yZXYsIGttcF91aW50MTYsIDE2LCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQyLCAgc3ViX2NwdF9yZXYsIGttcF9pbnQxNiwgIDE2LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBkaXZfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIC8sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNHUsIGRpdl9jcHRfcmV2LCBrbXBfdWludDMyLCAzMiwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkNCwgIHNobF9jcHRfcmV2LCBrbXBfaW50MzIsICAzMiwgPDwsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ0LCAgc2hyX2NwdF9yZXYsIGttcF9pbnQzMiwgIDMyLCA+PiwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ0X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDR1LCBzaHJfY3B0X3Jldiwga21wX3VpbnQzMiwgMzIsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDR1X3Nocl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDQsICBzdWJfY3B0X3Jldiwga21wX2ludDMyLCAgMzIsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIGRpdl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4dSwgZGl2X2NwdF9yZXYsIGttcF91aW50NjQsIDY0LCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZml4ZWQ4LCAgc2hsX2NwdF9yZXYsIGttcF9pbnQ2NCwgIDY0LCA8PCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmaXhlZDgsICBzaHJfY3B0X3Jldiwga21wX2ludDY0LCAgNjQsID4+LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOHUsIHNocl9jcHRfcmV2LCBrbXBfdWludDY0LCA2NCwgPj4sIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZpeGVkOCwgIHN1Yl9jcHRfcmV2LCBrbXBfaW50NjQsICA2NCwgLSwgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ0LCAgZGl2X2NwdF9yZXYsIGttcF9yZWFsMzIsIDMyLCAvLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ01QWENIR19DUFRfUkVWKCBmbG9hdDQsICBzdWJfY3B0X3Jldiwga21wX3JlYWwzMiwgMzIsIC0sICBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2NwdF9yZXYKK0FUT01JQ19DTVBYQ0hHX0NQVF9SRVYoIGZsb2F0OCwgIGRpdl9jcHRfcmV2LCBrbXBfcmVhbDY0LCA2NCwgLywgIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0X3JldgorQVRPTUlDX0NNUFhDSEdfQ1BUX1JFViggZmxvYXQ4LCAgc3ViX2NwdF9yZXYsIGttcF9yZWFsNjQsIDY0LCAtLCAgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2CisvLyAgICAgICAgICAgICAgVFlQRV9JRCxPUF9JRCwgVFlQRSwgICAgICAgICAgT1AsICBHT01QX0ZMQUcKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKy8vICAgICBUWVBFX0lELCBPUF9JRCwgVFlQRSAtIGRldGFpbGVkIGFib3ZlCisvLyAgICAgT1AgICAgICAtIG9wZXJhdG9yCisvLyAgICAgTENLX0lEICAtIGxvY2sgaWRlbnRpZmllciwgdXNlZCB0byBwb3NzaWJseSBkaXN0aW5ndWlzaCBsb2NrIHZhcmlhYmxlCisjZGVmaW5lIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSBcCitBVE9NSUNfQkVHSU5fQ1BUKFRZUEVfSUQsT1BfSUQsVFlQRSxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBuZXdfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAvKnByaW50ZigiX19rbXBfYXRvbWljX21vZGUgPSAlZFxuIiwgX19rbXBfYXRvbWljX21vZGUpOyovXAorICAgIE9QX0dPTVBfQ1JJVElDQUxfQ1BUX1JFVihPUCxHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIE9QX0NSSVRJQ0FMX0NQVF9SRVYoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vIHJvdXRpbmVzIGZvciBsb25nIGRvdWJsZSB0eXBlCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggZmxvYXQxMCwgc3ViX2NwdF9yZXYsIGxvbmcgZG91YmxlLCAgICAgLSwgMTByLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTAsIGRpdl9jcHRfcmV2LCBsb25nIGRvdWJsZSwgICAgIC8sIDEwciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2NwdF9yZXYKKyNpZiBLTVBfSEFWRV9RVUFECisvLyByb3V0aW5lcyBmb3IgX1F1YWQgdHlwZQorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIHN1Yl9jcHRfcmV2LCBRVUFEX0xFR0FDWSwgICAgIC0sIDE2ciwgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBkaXZfY3B0X3JldiwgUVVBRF9MRUdBQ1ksICAgICAvLCAxNnIsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19mbG9hdDE2X2Rpdl9jcHRfcmV2CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBmbG9hdDE2LCBzdWJfYTE2X2NwdF9yZXYsIFF1YWRfYTE2X3QsIC0sIDE2ciwgIDEgKSAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNl9jcHRfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGZsb2F0MTYsIGRpdl9hMTZfY3B0X3JldiwgUXVhZF9hMTZfdCwgLywgMTZyLCAgMSApICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X2NwdF9yZXYKKyNlbmRpZgorI2VuZGlmCisKKy8vIHJvdXRpbmVzIGZvciBjb21wbGV4IHR5cGVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBXb3JrYXJvdW5kIGZvciBjbXBseDQuIFJlZ3VsYXIgcm91dGluZXMgd2l0aCByZXR1cm4gdmFsdWUgZG9uJ3Qgd29yaworLy8gb24gV2luXzMyZS4gTGV0J3MgcmV0dXJuIGNhcHR1cmVkIHZhbHVlcyB0aHJvdWdoIHRoZSBhZGRpdGlvbmFsIHBhcmFtZXRlci4KKyNkZWZpbmUgT1BfQ1JJVElDQUxfQ1BUX1JFVl9XUksoT1AsTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiggZmxhZyApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKmxocykgPSAocmhzKSBPUCAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqb3V0KSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAoKm91dCkgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICgqbGhzKSA9IChyaHMpIE9QICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICByZXR1cm47CisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorI2RlZmluZSBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKCAoRkxBRykgJiYgKF9fa21wX2F0b21pY19tb2RlID09IDIpICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0NIRUNLX0dUSUQ7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyggT1AsIDAgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorI2Vsc2UKKyNkZWZpbmUgT1BfR09NUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKFRZUEVfSUQsT1BfSUQsVFlQRSxPUCxMQ0tfSUQsR09NUF9GTEFHKSAgIFwKK0FUT01JQ19CRUdJTl9XUksoVFlQRV9JRCxPUF9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9HT01QX0NSSVRJQ0FMX0NQVF9SRVZfV1JLKE9QLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBPUF9DUklUSUNBTF9DUFRfUkVWX1dSSyhPUCxMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIFRoZSBlbmQgb2Ygd29ya2Fyb3VuZCBmb3IgY21wbHg0CisKKworLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgdG8gcmV0dXJuIHZvaWQgZm9yIGNtcGx4NCByb3V0aW5lcworLy8gY21wbHg0IHJvdXRpbmVzIHRvIHJldHVybiB2b2lkCitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIGNtcGx4NCwgIHN1Yl9jcHRfcmV2LCBrbXBfY21wbHgzMiwgLSwgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFVl9XUksoIGNtcGx4NCwgIGRpdl9jcHRfcmV2LCBrbXBfY21wbHgzMiwgLywgOGMsICAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jcHRfcmV2CisKK0FUT01JQ19DUklUSUNBTF9DUFRfUkVWKCBjbXBseDgsICBzdWJfY3B0X3Jldiwga21wX2NtcGx4NjQsIC0sIDE2YywgICAxICkgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4OCwgIGRpdl9jcHRfcmV2LCBrbXBfY21wbHg2NCwgLywgMTZjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxMCwgc3ViX2NwdF9yZXYsIGttcF9jbXBseDgwLCAtLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHRfcmV2CitBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxMCwgZGl2X2NwdF9yZXYsIGttcF9jbXBseDgwLCAvLCAyMGMsICAgMSApICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX2Rpdl9jcHRfcmV2CisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIHN1Yl9jcHRfcmV2LCBDUExYMTI4X0xFRywgLSwgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9zdWJfY3B0X3JldgorQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIGRpdl9jcHRfcmV2LCBDUExYMTI4X0xFRywgLywgMzJjLCAgIDEgKSAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldgorI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICBBVE9NSUNfQ1JJVElDQUxfQ1BUX1JFViggY21wbHgxNiwgc3ViX2ExNl9jcHRfcmV2LCBrbXBfY21wbHgxMjhfYTE2X3QsIC0sIDMyYywgICAxICkgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2CisgICAgQVRPTUlDX0NSSVRJQ0FMX0NQVF9SRVYoIGNtcGx4MTYsIGRpdl9hMTZfY3B0X3Jldiwga21wX2NtcGx4MTI4X2ExNl90LCAvLCAzMmMsICAgMSApICAgLy8gX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldgorI2VuZGlmCisjZW5kaWYKKworLy8gICBPcGVuTVAgNC4wIENhcHR1cmUtd3JpdGUgKHN3YXApOiB7diA9IHg7IHggPSBleHByO30KKworI2RlZmluZSBBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorVFlQRSBfX2ttcGNfYXRvbWljXyMjVFlQRV9JRCMjX3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgVFlQRSAqIGxocywgVFlQRSByaHMgKSAgICAgXAoreyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtBX1RSQUNFKDEwMCwoIl9fa21wY19hdG9taWNfIiAjVFlQRV9JRCAiX3N3cDogVCMlZFxuIiwgZ3RpZCApKTsKKworI2RlZmluZSBDUklUSUNBTF9TV1AoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBBVE9NSUNfTE9DSyMjTENLX0lELCBndGlkICk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9ICgqbGhzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpsaHMpID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQKEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoIChGTEFHKSAmJiAoX19rbXBfYXRvbWljX21vZGUgPT0gMikgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfQ0hFQ0tfR1RJRDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIENSSVRJQ0FMX1NXUCggMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisjZWxzZQorI2RlZmluZSBHT01QX0NSSVRJQ0FMX1NXUChGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCisKKyNkZWZpbmUgQVRPTUlDX1hDSEdfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG9sZF92YWx1ZSA9IEtNUF9YQ0hHX0ZJWEVEIyNCSVRTKCBsaHMsIHJocyApOyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmV0dXJuIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2RlZmluZSBBVE9NSUNfWENIR19GTE9BVF9TV1AoVFlQRV9JRCxUWVBFLEJJVFMsR09NUF9GTEFHKSAgICAgICAgICAgICAgICBcCitBVE9NSUNfQkVHSU5fU1dQKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEdPTVBfQ1JJVElDQUxfU1dQKEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgb2xkX3ZhbHVlID0gS01QX1hDSEdfUkVBTCMjQklUUyggbGhzLCByaHMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICByZXR1cm4gb2xkX3ZhbHVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQ01QWENIR19TV1AoVFlQRSxCSVRTKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFRZUEUgS01QX0FUT01JQ19WT0xBVElMRSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgVFlQRSBvbGRfdmFsdWUsIG5ld192YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0ZW1wX3ZhbCA9ICpsaHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9sZF92YWx1ZSA9IHRlbXBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbmV3X3ZhbHVlID0gcmhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUSMjQklUUyggKGttcF9pbnQjI0JJVFMgKikgbGhzLCBcCisgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludCMjQklUUyAqKSAmb2xkX3ZhbHVlLCAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50IyNCSVRTICopICZuZXdfdmFsdWUgKSApICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgdGVtcF92YWwgPSAqbGhzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbGRfdmFsdWUgPSB0ZW1wX3ZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG5ld192YWx1ZSA9IHJoczsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNkZWZpbmUgQVRPTUlDX0NNUFhDSEdfU1dQKFRZUEVfSUQsVFlQRSxCSVRTLEdPTVBfRkxBRykgICAgICAgICAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUChUWVBFX0lELFRZUEUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSBvbGRfdmFsdWU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENNUFhDSEdfU1dQKFRZUEUsQklUUykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKK0FUT01JQ19YQ0hHX1NXUCggZml4ZWQxLCBrbXBfaW50OCwgICAgOCwgS01QX0FSQ0hfWDg2ICkgIC8vIF9fa21wY19hdG9taWNfZml4ZWQxX3N3cAorQVRPTUlDX1hDSEdfU1dQKCBmaXhlZDIsIGttcF9pbnQxNiwgIDE2LCBLTVBfQVJDSF9YODYgKSAgLy8gX19rbXBjX2F0b21pY19maXhlZDJfc3dwCitBVE9NSUNfWENIR19TV1AoIGZpeGVkNCwga21wX2ludDMyLCAgMzIsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AKKworQVRPTUlDX1hDSEdfRkxPQVRfU1dQKCBmbG9hdDQsIGttcF9yZWFsMzIsIDMyLCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ0X3N3cAorCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DTVBYQ0hHX1NXUCggZml4ZWQ4LCBrbXBfaW50NjQsIDY0LCBLTVBfQVJDSF9YODYgKSAgICAgIC8vIF9fa21wY19hdG9taWNfZml4ZWQ4X3N3cAorICAgIEFUT01JQ19DTVBYQ0hHX1NXUCggZmxvYXQ4LCBrbXBfcmVhbDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQ4X3N3cAorI2Vsc2UKKyAgICBBVE9NSUNfWENIR19TV1AoICAgICAgIGZpeGVkOCwga21wX2ludDY0LCA2NCwgS01QX0FSQ0hfWDg2ICkgICAvLyBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zd3AKKyAgICBBVE9NSUNfWENIR19GTE9BVF9TV1AoIGZsb2F0OCwga21wX3JlYWw2NCwgNjQsIEtNUF9BUkNIX1g4NiApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0OF9zd3AKKyNlbmRpZgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJvdXRpbmVzIGZvciBFeHRlbmRlZCB0eXBlczogbG9uZyBkb3VibGUsIF9RdWFkLCBjb21wbGV4IGZsYXZvdXJzICh1c2UgY3JpdGljYWwgc2VjdGlvbikKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1NXUChUWVBFX0lELFRZUEUsTENLX0lELEdPTVBfRkxBRykgICAgICAgICAgICAgIFwKK0FUT01JQ19CRUdJTl9TV1AoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBUWVBFIG9sZF92YWx1ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUChHT01QX0ZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBDUklUSUNBTF9TV1AoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vICEhISBUT0RPOiBjaGVjayBpZiB3ZSBuZWVkIHRvIHJldHVybiB2b2lkIGZvciBjbXBseDQgcm91dGluZXMKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NC4gUmVndWxhciByb3V0aW5lcyB3aXRoIHJldHVybiB2YWx1ZSBkb24ndCB3b3JrCisvLyBvbiBXaW5fMzJlLiBMZXQncyByZXR1cm4gY2FwdHVyZWQgdmFsdWVzIHRocm91Z2ggdGhlIGFkZGl0aW9uYWwgcGFyYW1ldGVyLgorCisjZGVmaW5lIEFUT01JQ19CRUdJTl9TV1BfV1JLKFRZUEVfSUQsVFlQRSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit2b2lkIF9fa21wY19hdG9taWNfIyNUWVBFX0lEIyNfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBUWVBFICogbGhzLCBUWVBFIHJocywgVFlQRSAqIG91dCApICAgICBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS0FfVFJBQ0UoMTAwLCgiX19rbXBjX2F0b21pY18iICNUWVBFX0lEICJfc3dwOiBUIyVkXG4iLCBndGlkICkpOworCisKKyNkZWZpbmUgQ1JJVElDQUxfU1dQX1dSSyhMQ0tfSUQpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgQVRPTUlDX0xPQ0sjI0xDS19JRCwgZ3RpZCApOyAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0bXAgPSAoKmxocyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICgqbGhzKSA9IChyaHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgKCpvdXQpID0gdG1wOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIEFUT01JQ19MT0NLIyNMQ0tfSUQsIGd0aWQgKTsgICAgICAgICAgICAgXAorICAgIHJldHVybjsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyNkZWZpbmUgR09NUF9DUklUSUNBTF9TV1BfV1JLKEZMQUcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmICggKEZMQUcpICYmIChfX2ttcF9hdG9taWNfbW9kZSA9PSAyKSApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9DSEVDS19HVElEOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgQ1JJVElDQUxfU1dQX1dSSyggMCApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIEdPTVBfQ1JJVElDQUxfU1dQX1dSSyhGTEFHKQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNkZWZpbmUgQVRPTUlDX0NSSVRJQ0FMX1NXUF9XUksoVFlQRV9JRCwgVFlQRSxMQ0tfSUQsR09NUF9GTEFHKSAgICAgICAgICAgXAorQVRPTUlDX0JFR0lOX1NXUF9XUksoVFlQRV9JRCxUWVBFKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgVFlQRSB0bXA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBHT01QX0NSSVRJQ0FMX1NXUF9XUksoR09NUF9GTEFHKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIENSSVRJQ0FMX1NXUF9XUksoTENLX0lEKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisvLyBUaGUgZW5kIG9mIHdvcmthcm91bmQgZm9yIGNtcGx4NAorCisKK0FUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTAsIGxvbmcgZG91YmxlLCAxMHIsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwCisjaWYgS01QX0hBVkVfUVVBRAorQVRPTUlDX0NSSVRJQ0FMX1NXUCggZmxvYXQxNiwgUVVBRF9MRUdBQ1ksIDE2ciwgICAxICkgICAgICAgICAgICAgIC8vIF9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AKKyNlbmRpZgorLy8gY21wbHg0IHJvdXRpbmUgdG8gcmV0dXJuIHZvaWQKK0FUT01JQ19DUklUSUNBTF9TV1BfV1JLKCBjbXBseDQsIGttcF9jbXBseDMyLCAgOGMsICAgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKworLy9BVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDQsIGttcF9jbXBseDMyLCAgOGMsICAgMSApICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AKKworCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDgsICBrbXBfY21wbHg2NCwgMTZjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDhfc3dwCitBVE9NSUNfQ1JJVElDQUxfU1dQKCBjbXBseDEwLCBrbXBfY21wbHg4MCwgMjBjLCAgIDEgKSAgICAgICAgICAgICAgLy8gX19rbXBjX2F0b21pY19jbXBseDEwX3N3cAorI2lmIEtNUF9IQVZFX1FVQUQKK0FUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTYsIENQTFgxMjhfTEVHLCAzMmMsICAgMSApICAgICAgICAgICAgICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3dwCisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIEFUT01JQ19DUklUSUNBTF9TV1AoIGZsb2F0MTZfYTE2LCBRdWFkX2ExNl90LCAgICAgICAgIDE2ciwgMSApICAvLyBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3N3cAorICAgIEFUT01JQ19DUklUSUNBTF9TV1AoIGNtcGx4MTZfYTE2LCBrbXBfY21wbHgxMjhfYTE2X3QsIDMyYywgMSApICAvLyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cAorI2VuZGlmCisjZW5kaWYKKworCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBDYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworCisjdW5kZWYgT1BfQ1JJVElDQUwKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBHZW5lcmljIGF0b21pYyByb3V0aW5lcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcGNfYXRvbWljXzEoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICgKKyNpZiBLTVBfQVJDSF9YODYgJiYgZGVmaW5lZChLTVBfR09NUF9DT01QQVQpCisgICAgICAgIEZBTFNFICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXN0IHVzZSBsb2NrICovCisjZWxzZQorICAgICAgICBUUlVFCisjZW5kaWYKKwkpCisgICAgeworCWttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50OCAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNROCAoIChrbXBfaW50OCAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDggKikgJm9sZF92YWx1ZSwgKihrbXBfaW50OCAqKSAmbmV3X3ZhbHVlICkgKQorCXsKKwkgICAgS01QX0NQVV9QQVVTRSgpOworCisJICAgIG9sZF92YWx1ZSA9ICooa21wX2ludDggKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBBbGwgMS1ieXRlIGRhdGEgaXMgb2YgaW50ZWdlciBkYXRhIHR5cGUuCisgICAgICAgIC8vCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpLCBndGlkICk7CisKKwkoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKwlfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpLCBndGlkICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgaWYgKAorI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDEpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyAyLWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50MTYgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisKKwkvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisJd2hpbGUgKCAhICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYgKCAoa21wX2ludDE2ICopIGxocywKKwkJICAgIAkJKihrbXBfaW50MTYgKikgJm9sZF92YWx1ZSwgKihrbXBfaW50MTYgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQxNiAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEFsbCAyLWJ5dGUgZGF0YSBpcyBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfNCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKAorICAgICAgICAvLworICAgICAgICAvLyBGSVhNRTogT24gSUEtMzIgYXJjaGl0ZWN0dXJlLCBnY2MgdXNlcyBjbXB4Y2hnIG9ubHkgZm9yIDQtYnl0ZSBpbnRzLgorICAgICAgICAvLyBHb21wIGNvbXBhdGliaWxpdHkgaXMgYnJva2VuIGlmIHRoaXMgcm91dGluZSBpcyBjYWxsZWQgZm9yIGZsb2F0cy4KKyAgICAgICAgLy8KKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisJVFJVRQkJCQkJLyogbm8gYWxpZ25tZW50IHByb2JsZW1zICovCisjZWxzZQorCSEgKCAoa21wX3VpbnRwdHJfdCkgbGhzICYgMHgzKQkJLyogbWFrZSBzdXJlIGFkZHJlc3MgaXMgNC1ieXRlIGFsaWduZWQgKi8KKyNlbmRpZgorCSkKKyAgICB7CisJa21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisJb2xkX3ZhbHVlID0gKihrbXBfaW50MzIgKikgbGhzOworCSgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyICggKGttcF9pbnQzMiAqKSBsaHMsCisJCSAgICAJCSooa21wX2ludDMyICopICZvbGRfdmFsdWUsICooa21wX2ludDMyICopICZuZXdfdmFsdWUgKSApCisJeworCSAgICBLTVBfQ1BVX1BBVVNFKCk7CisKKwkgICAgb2xkX3ZhbHVlID0gKihrbXBfaW50MzIgKikgbGhzOworCSAgICAoKmYpKCAmbmV3X3ZhbHVlLCAmb2xkX3ZhbHVlLCByaHMgKTsKKwl9CisKKwlyZXR1cm47CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBVc2UgX19rbXBfYXRvbWljX2xvY2tfNGkgZm9yIGFsbCA0LWJ5dGUgZGF0YSwKKyAgICAgICAgLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfNGksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfOCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIGlmICgKKworI2lmIEtNUF9BUkNIX1g4NiAmJiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgRkFMU0UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11c3QgdXNlIGxvY2sgKi8KKyNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKwlUUlVFCQkJCQkvKiBubyBhbGlnbm1lbnQgcHJvYmxlbXMgKi8KKyNlbHNlCisJISAoIChrbXBfdWludHB0cl90KSBsaHMgJiAweDcpCQkvKiBtYWtlIHN1cmUgYWRkcmVzcyBpcyA4LWJ5dGUgYWxpZ25lZCAqLworI2VuZGlmCisJKQorICAgIHsKKwlrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKwlvbGRfdmFsdWUgPSAqKGttcF9pbnQ2NCAqKSBsaHM7CisJKCpmKSggJm5ld192YWx1ZSwgJm9sZF92YWx1ZSwgcmhzICk7CisJLyogVE9ETzogU2hvdWxkIHRoaXMgYmUgYWNxdWlyZSBvciByZWxlYXNlPyAqLworCXdoaWxlICggISAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0ICggKGttcF9pbnQ2NCAqKSBsaHMsCisJCQkJCSAgICAgICAqKGttcF9pbnQ2NCAqKSAmb2xkX3ZhbHVlLAorCQkJCQkgICAgICAgKihrbXBfaW50NjQgKikgJm5ld192YWx1ZSApICkKKwl7CisJICAgIEtNUF9DUFVfUEFVU0UoKTsKKworCSAgICBvbGRfdmFsdWUgPSAqKGttcF9pbnQ2NCAqKSBsaHM7CisJICAgICgqZikoICZuZXdfdmFsdWUsICZvbGRfdmFsdWUsIHJocyApOworCX0KKworCXJldHVybjsKKyAgICB9IGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBVc2UgX19rbXBfYXRvbWljX2xvY2tfOGkgZm9yIGFsbCA4LWJ5dGUgZGF0YSwKKyAgICAgICAgLy8gZXZlbiBpZiBpdCBpc24ndCBvZiBpbnRlZ2VyIGRhdGEgdHlwZS4KKyAgICAgICAgLy8KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGksIGd0aWQgKTsKKworCSgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworCV9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGksIGd0aWQgKTsKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xMHIsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xMHIsIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBjX2F0b21pY18xNiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YywgZ3RpZCApOworCisgICAgKCpmKSggbGhzLCBsaHMsIHJocyApOworCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgaWYgKCBfX2ttcF9hdG9taWNfbW9kZSA9PSAyICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrLCBndGlkICk7CisgICAgfQorICAgIGVsc2UKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcGNfYXRvbWljXzIwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX2FjcXVpcmVfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjLCBndGlkICk7CisKKyAgICAoKmYpKCBsaHMsIGxocywgcmhzICk7CisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICBpZiAoIF9fa21wX2F0b21pY19tb2RlID09IDIgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2ssIGd0aWQgKTsKKyAgICB9CisgICAgZWxzZQorI2VuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworICAgIF9fa21wX3JlbGVhc2VfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjLCBndGlkICk7Cit9CisKK3ZvaWQKK19fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMsIGd0aWQgKTsKKworICAgICgqZikoIGxocywgbGhzLCByaHMgKTsKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgIGlmICggX19rbXBfYXRvbWljX21vZGUgPT0gMiApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCApOworICAgIH0KKyAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgX19rbXBfcmVsZWFzZV9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMsIGd0aWQgKTsKK30KKworLy8gQUM6IHNhbWUgdHdvIHJvdXRpbmVzIGFzIEdPTVBfYXRvbWljX3N0YXJ0L2VuZCwgYnV0IHdpbGwgYmUgY2FsbGVkIGJ5IG91ciBjb21waWxlcgorLy8gICAgIGR1cGxpY2F0ZWQgaW4gb3JkZXIgdG8gbm90IHVzZSAzLXBhcnR5IG5hbWVzIGluIHB1cmUgSW50ZWwgY29kZQorLy8gVE9ETzogY29uc2lkZXIgYWRkaW5nIEdUSUQgcGFyYW1ldGVyIGFmdGVyIGNvbnN1bHRhdGlvbiB3aXRoIEVybmVzdG8vWGlubWluLgordm9pZAorX19rbXBjX2F0b21pY19zdGFydCh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY19hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9hY3F1aXJlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKwordm9pZAorX19rbXBjX2F0b21pY19lbmQodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX2F0b21pY19lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiEKK0B9CisqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9hdG9taWMuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzdiNjJiNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYXRvbWljLmgKQEAgLTAsMCArMSwxMDQ1IEBACisvKgorICoga21wX2F0b21pYy5oIC0gQVRPTUlDIGhlYWRlciBmaWxlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0FUT01JQ19ICisjZGVmaW5lIEtNUF9BVE9NSUNfSAorCisjaW5jbHVkZSAia21wX29zLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvLyBDKysgYnVpbGQgcG9ydC4KKy8vIEludGVsIGNvbXBpbGVyIGRvZXMgbm90IHN1cHBvcnQgX0NvbXBsZXggZGF0YXR5cGUgb24gd2luLgorLy8gSW50ZWwgY29tcGlsZXIgc3VwcG9ydHMgX0NvbXBsZXggZGF0YXR5cGUgb24gbGluIGFuZCBtYWMuCisvLyBPbiB0aGUgb3RoZXIgc2lkZSwgdGhlcmUgaXMgYSBwcm9ibGVtIG9mIHN0YWNrIGFsaWdubWVudCBvbiBsaW5fMzIgYW5kIG1hY18zMgorLy8gaWYgdGhlIHJocyBpcyBjbXBseDgwIG9yIGNtcGx4MTI4IHR5cGVkZWYnZWQgZGF0YXR5cGUuCisvLyBUaGUgZGVjaXNpb24gaXM6IHRvIHVzZSBjb21waWxlciBzdXBwb3J0ZWQgX0NvbXBsZXggdHlwZSBvbiBsaW4gYW5kIG1hYywKKy8vICAgICAgICAgICAgICAgICAgdG8gdXNlIHR5cGVkZWYnZWQgdHlwZXMgb24gd2luLgorLy8gQ29uZGl0aW9uIGZvciBXSU42NCB3YXMgbW9kaWZpZWQgaW4gYW50aWNpcGF0aW9uIG9mIDEwLjEgYnVpbGQgY29tcGlsZXIuCisKKyNpZiBkZWZpbmVkKCBfX2NwbHVzcGx1cyApICYmICggS01QX09TX1dJTkRPV1MgKQorICAgIC8vIGNyZWF0ZSBzaG9ydGN1dHMgZm9yIGM5OSBjb21wbGV4IHR5cGVzCisKKyAgICAvLyBWaXN1YWwgU3R1ZGlvIGNhbm5vdCBoYXZlIGZ1bmN0aW9uIHBhcmFtZXRlcnMgdGhhdCBoYXZlIHRoZQorICAgIC8vIGFsaWduIF9fZGVjbHNwZWMgYXR0cmlidXRlLCBzbyB3ZSBtdXN0IHJlbW92ZSBpdC4gKENvbXBpbGVyIEVycm9yIEMyNzE5KQorICAgICNpZiBLTVBfQ09NUElMRVJfTVNWQworICAgICMgdW5kZWYgS01QX0RPX0FMSUdOCisgICAgIyBkZWZpbmUgS01QX0RPX0FMSUdOKGFsaWdubWVudCkgLyogTm90aGluZyAqLworICAgICNlbmRpZgorCisgICAgI2lmIChfTVNDX1ZFUiA8IDE2MDApICYmIGRlZmluZWQoX0RFQlVHKQorICAgICAgICAvLyBXb3JrYXJvdW5kIGZvciB0aGUgcHJvYmxlbSBvZiBfRGVidWdIZWFwVGFnIHVucmVzb2x2ZWQgZXh0ZXJuYWwuCisgICAgICAgIC8vIFRoaXMgcHJvYmxlbSBwcmV2ZW50ZWQgdG8gdXNlIG91ciBzdGF0aWMgZGVidWcgbGlicmFyeSBmb3IgQyB0ZXN0cworICAgICAgICAvLyBjb21waWxlZCB3aXRoIC9NRGQgb3B0aW9uICh0aGUgbGlicmFyeSBpdHNlbGYgYnVpbHQgd2l0aCAvTVRkKSwKKyAgICAgICAgI3VuZGVmIF9ERUJVRworICAgICAgICAjZGVmaW5lIF9ERUJVR19URU1QT1JBUklMWV9VTlNFVF8KKyAgICAjZW5kaWYKKworICAgICNpbmNsdWRlIDxjb21wbGV4PgorCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIHR5cGVfbGhzLCB0eXBlbmFtZSB0eXBlX3JocyA+CisgICAgc3RkOjpjb21wbGV4PCB0eXBlX2xocyA+IF9fa21wX2xoc19kaXZfcmhzKAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y29tcGxleDwgdHlwZV9saHMgPiYgbGhzLAorICAgICAgICAgICAgICAgIGNvbnN0IHN0ZDo6Y29tcGxleDwgdHlwZV9yaHMgPiYgcmhzICkgeworICAgIHR5cGVfbGhzIGEgPSBsaHMucmVhbCgpOworICAgIHR5cGVfbGhzIGIgPSBsaHMuaW1hZygpOworICAgIHR5cGVfcmhzIGMgPSByaHMucmVhbCgpOworICAgIHR5cGVfcmhzIGQgPSByaHMuaW1hZygpOworICAgIHR5cGVfcmhzIGRlbiA9IGMqYyArIGQqZDsKKyAgICB0eXBlX3JocyByID0gKCBhKmMgKyBiKmQgKTsKKyAgICB0eXBlX3JocyBpID0gKCBiKmMgLSBhKmQgKTsKKyAgICBzdGQ6OmNvbXBsZXg8IHR5cGVfbGhzID4gcmV0KCByL2RlbiwgaS9kZW4gKTsKKyAgICByZXR1cm4gcmV0OworICAgIH0KKworICAgIC8vIGNvbXBsZXg4CisgICAgc3RydWN0IF9fa21wX2NtcGx4NjRfdCA6IHN0ZDo6Y29tcGxleDwgZG91YmxlID4geworCisgICAgX19rbXBfY21wbHg2NF90KCkgOiBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+ICgpIHt9CisKKyAgICBfX2ttcF9jbXBseDY0X3QoIGNvbnN0IHN0ZDo6Y29tcGxleDwgZG91YmxlID4mIGNkICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgZG91YmxlID4gKCBjZCApIHt9CisKKyAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHg2NF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gbGhzID0gKnRoaXM7CisgICAgICAgICp0aGlzID0gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHg2NF90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDY0X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgcmV0dXJuIF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIH07CisgICAgdHlwZWRlZiBzdHJ1Y3QgX19rbXBfY21wbHg2NF90IGttcF9jbXBseDY0OworCisgICAgLy8gY29tcGxleDQKKyAgICBzdHJ1Y3QgX19rbXBfY21wbHgzMl90IDogc3RkOjpjb21wbGV4PCBmbG9hdCA+IHsKKworICAgIF9fa21wX2NtcGx4MzJfdCgpIDogc3RkOjpjb21wbGV4PCBmbG9hdCA+ICgpIHt9CisKKyAgICBfX2ttcF9jbXBseDMyX3QoIGNvbnN0IHN0ZDo6Y29tcGxleDxmbG9hdD4mIGNmICkKKyAgICAgICAgICAgICAgICA6IHN0ZDo6Y29tcGxleDwgZmxvYXQgPiAoIGNmICkge30KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciArICggY29uc3QgX19rbXBfY21wbHgzMl90JiBiICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiByaHMgPSBiOworICAgICAgICByZXR1cm4gKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yIC0gKCBjb25zdCBfX2ttcF9jbXBseDMyX3QmIGIgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IHJocyA9IGI7CisgICAgICAgIHJldHVybiAoIGxocyAtIHJocyApOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgKiAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgYiApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gcmhzID0gYjsKKyAgICAgICAgcmV0dXJuICggbGhzICogcmhzICk7CisgICAgfQorCisgICAgX19rbXBfY21wbHgzMl90IG9wZXJhdG9yICsgKCBjb25zdCBrbXBfY21wbHg2NCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4NjQgdCA9IGttcF9jbXBseDY0KCAqdGhpcyApICsgYjsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBkb3VibGUgPiBkKCB0ICk7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBmKCBkICk7CisgICAgICAgIF9fa21wX2NtcGx4MzJfdCByKCBmICk7CisgICAgICAgIHJldHVybiByOworICAgIH0KKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLSAoIGNvbnN0IGttcF9jbXBseDY0JiBiICkgeworICAgICAgICBrbXBfY21wbHg2NCB0ID0ga21wX2NtcGx4NjQoICp0aGlzICkgLSBiOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGRvdWJsZSA+IGQoIHQgKTsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGYoIGQgKTsKKyAgICAgICAgX19rbXBfY21wbHgzMl90IHIoIGYgKTsKKyAgICAgICAgcmV0dXJuIHI7CisgICAgfQorICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4NjQmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDY0IHQgPSBrbXBfY21wbHg2NCggKnRoaXMgKSAqIGI7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZG91YmxlID4gZCggdCApOworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gZiggZCApOworICAgICAgICBfX2ttcF9jbXBseDMyX3QgciggZiApOworICAgICAgICByZXR1cm4gcjsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3QgX19rbXBfY21wbHgzMl90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgZmxvYXQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9jbXBseDMyX3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4MzJfdCYgcmhzICkgeworICAgICAgICBzdGQ6OmNvbXBsZXg8IGZsb2F0ID4gbGhzID0gKnRoaXM7CisgICAgICAgIHJldHVybiBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICB9CisKKyAgICB2b2lkIG9wZXJhdG9yIC89ICggY29uc3Qga21wX2NtcGx4NjQmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgIH0KKworICAgIF9fa21wX2NtcGx4MzJfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4NjQmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBmbG9hdCA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgfQorICAgIH07CisgICAgdHlwZWRlZiBzdHJ1Y3QgX19rbXBfY21wbHgzMl90IGttcF9jbXBseDMyOworCisgICAgLy8gY29tcGxleDEwCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggMTYgKSAgX19rbXBfY21wbHg4MF90IDogc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+IHsKKworICAgICAgICAgICAgX19rbXBfY21wbHg4MF90KCkgOiBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gKCkge30KKworICAgICAgICAgICAgX19rbXBfY21wbHg4MF90KCBjb25zdCBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4mIGNsZCApCisgICAgICAgICAgICAgICAgOiBzdGQ6OmNvbXBsZXg8IGxvbmcgZG91YmxlID4gKCBjbGQgKSB7fQorCisgICAgICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDgwX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICAqdGhpcyA9IF9fa21wX2xoc19kaXZfcmhzKCBsaHMsIHJocyApOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfY21wbHg4MF90IG9wZXJhdG9yIC8gKCBjb25zdCBfX2ttcF9jbXBseDgwX3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBsb25nIGRvdWJsZSA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgIH07CisgICAgdHlwZWRlZiBLTVBfRE9fQUxJR04oIDE2ICkgIHN0cnVjdCBfX2ttcF9jbXBseDgwX3Qga21wX2NtcGx4ODA7CisKKyAgICAvLyBjb21wbGV4MTYKKyAgICAjaWYgS01QX0hBVkVfUVVBRAorICAgIHN0cnVjdCBfX2ttcF9jbXBseDEyOF90IDogc3RkOjpjb21wbGV4PCBfUXVhZCA+IHsKKworICAgICAgICAgICAgX19rbXBfY21wbHgxMjhfdCgpIDogc3RkOjpjb21wbGV4PCBfUXVhZCA+ICgpIHt9CisKKyAgICAgICAgICAgIF9fa21wX2NtcGx4MTI4X3QoIGNvbnN0IHN0ZDo6Y29tcGxleDwgX1F1YWQgPiYgY3EgKQorICAgICAgICAgICAgICAgIDogc3RkOjpjb21wbGV4PCBfUXVhZCA+ICggY3EgKSB7fQorCisgICAgICAgIHZvaWQgb3BlcmF0b3IgLz0gKCBjb25zdCBfX2ttcF9jbXBseDEyOF90JiByaHMgKSB7CisgICAgICAgIHN0ZDo6Y29tcGxleDwgX1F1YWQgPiBsaHMgPSAqdGhpczsKKyAgICAgICAgKnRoaXMgPSBfX2ttcF9saHNfZGl2X3JocyggbGhzLCByaHMgKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX2NtcGx4MTI4X3Qgb3BlcmF0b3IgLyAoIGNvbnN0IF9fa21wX2NtcGx4MTI4X3QmIHJocyApIHsKKyAgICAgICAgc3RkOjpjb21wbGV4PCBfUXVhZCA+IGxocyA9ICp0aGlzOworICAgICAgICByZXR1cm4gX19rbXBfbGhzX2Rpdl9yaHMoIGxocywgcmhzICk7CisgICAgICAgIH0KKworICAgIH07CisgICAgdHlwZWRlZiBzdHJ1Y3QgX19rbXBfY21wbHgxMjhfdCBrbXBfY21wbHgxMjg7CisgICAgI2VuZGlmIC8qIEtNUF9IQVZFX1FVQUQgKi8KKworICAgICNpZmRlZiBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisgICAgICAgICN1bmRlZiBfREVCVUdfVEVNUE9SQVJJTFlfVU5TRVRfCisgICAgICAgIC8vIFNldCBpdCBiYWNrIG5vdworICAgICAgICAjZGVmaW5lIF9ERUJVRyAxCisgICAgI2VuZGlmCisKKyNlbHNlCisgICAgLy8gY3JlYXRlIHNob3J0Y3V0cyBmb3IgYzk5IGNvbXBsZXggdHlwZXMKKyAgICB0eXBlZGVmIGZsb2F0IF9Db21wbGV4ICAgICAgIGttcF9jbXBseDMyOworICAgIHR5cGVkZWYgZG91YmxlIF9Db21wbGV4ICAgICAga21wX2NtcGx4NjQ7CisgICAgdHlwZWRlZiBsb25nIGRvdWJsZSBfQ29tcGxleCBrbXBfY21wbHg4MDsKKyAgICAjaWYgS01QX0hBVkVfUVVBRAorICAgIHR5cGVkZWYgX1F1YWQgX0NvbXBsZXggICAgICAga21wX2NtcGx4MTI4OworICAgICNlbmRpZgorI2VuZGlmCisKKy8vIENvbXBpbGVyIDEyLjAgY2hhbmdlZCBhbGlnbm1lbnQgb2YgMTYgYW5kIDMyLWJ5dGUgYXJndW1lbnRzIChsaWtlIF9RdWFkCisvLyBhbmQga21wX2NtcGx4MTI4KSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIFRoZSBmb2xsb3dpbmcgYWxpZ25lZCBzdHJ1Y3R1cmVzCisvLyBhcmUgaW1wbGVtZW50ZWQgdG8gc3VwcG9ydCB0aGUgb2xkIGFsaWdubWVudCBpbiAxMC4xLCAxMS4wLCAxMS4xIGFuZAorLy8gaW50cm9kdWNlIHRoZSBuZXcgYWxpZ25tZW50IGluIDEyLjAuIFNlZSBDUTg4NDA1LgorI2lmIEtNUF9BUkNIX1g4NiAmJiBLTVBfSEFWRV9RVUFECisKKyAgICAvLyA0LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5LgorCisgICAgI3ByYWdtYSBwYWNrKCBwdXNoLCA0ICkKKworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIFF1YWRfYTRfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hNF90KCAgKSA6IHEoICApIHt9CisgICAgICAgIFF1YWRfYTRfdCggY29uc3QgX1F1YWQgJiBjcSApIDogcSAoIGNxICkge30KKworICAgICAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICsgcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBRdWFkX2E0X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTRfdCYgYiApIHsKKyAgICAgICAgX1F1YWQgbGhzID0gKCp0aGlzKS5xOworICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hNF90KSggbGhzICogcmhzICk7CisgICAgfQorCisgICAgUXVhZF9hNF90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2E0X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggNCApIGttcF9jbXBseDEyOF9hNF90IHsKKyAgICAgICAga21wX2NtcGx4MTI4IHE7CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2E0X3QoIGNvbnN0IGttcF9jbXBseDEyOCAmIGMxMjggKSA6IHEgKCBjMTI4ICkge30KKworICAgICAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciArICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAgIGttcF9jbXBseDEyOF9hNF90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTRfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTRfdCkoIGxocyAtIHJocyApOworICAgIH0KKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBrbXBfY21wbHgxMjhfYTRfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2E0X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2E0X3QpKCBsaHMgLyByaHMgKTsKKyAgICB9CisKKyAgICB9OworCisgICAgI3ByYWdtYSBwYWNrKCBwb3AgKQorCisgICAgLy8gTmV3IDE2LWJ5dGUgYWxpZ25lZCBzdHJ1Y3R1cmVzIGZvciAxMi4wIGNvbXBpbGVyLgorICAgIHN0cnVjdCBLTVBfRE9fQUxJR04oIDE2ICkgUXVhZF9hMTZfdCB7CisgICAgICAgIF9RdWFkIHE7CisKKyAgICAgICAgUXVhZF9hMTZfdCggICkgOiBxKCAgKSB7fQorICAgICAgICBRdWFkX2ExNl90KCBjb25zdCBfUXVhZCAmIGNxICkgOiBxICggY3EgKSB7fQorCisgICAgICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIF9RdWFkIHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChRdWFkX2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIFF1YWRfYTE2X3Qgb3BlcmF0b3IgKiAoIGNvbnN0IFF1YWRfYTE2X3QmIGIgKSB7CisgICAgICAgIF9RdWFkIGxocyA9ICgqdGhpcykucTsKKyAgICAgICAgX1F1YWQgcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKFF1YWRfYTE2X3QpKCBsaHMgKiByaHMgKTsKKyAgICB9CisKKyAgICBRdWFkX2ExNl90IG9wZXJhdG9yIC8gKCBjb25zdCBRdWFkX2ExNl90JiBiICkgeworICAgICAgICBfUXVhZCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgICAgICBfUXVhZCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoUXVhZF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisgICAgc3RydWN0IEtNUF9ET19BTElHTiggMTYgKSBrbXBfY21wbHgxMjhfYTE2X3QgeworICAgICAgICBrbXBfY21wbHgxMjggcTsKKworICAgIGttcF9jbXBseDEyOF9hMTZfdCgpIDogcSAoKSB7fQorCisgICAga21wX2NtcGx4MTI4X2ExNl90KCBjb25zdCBrbXBfY21wbHgxMjggJiBjMTI4ICkgOiBxICggYzEyOCApIHt9CisKKyAgICAgICBrbXBfY21wbHgxMjhfYTE2X3Qgb3BlcmF0b3IgKyAoIGNvbnN0IGttcF9jbXBseDEyOF9hMTZfdCYgYiApIHsKKyAgICAgICAga21wX2NtcGx4MTI4IGxocyA9ICgqdGhpcykucTsKKyAgICAgICAga21wX2NtcGx4MTI4IHJocyA9IGIucTsKKyAgICAgICAgcmV0dXJuIChrbXBfY21wbHgxMjhfYTE2X3QpKCBsaHMgKyByaHMgKTsKKyAgICB9CisgICAgICAga21wX2NtcGx4MTI4X2ExNl90IG9wZXJhdG9yIC0gKCBjb25zdCBrbXBfY21wbHgxMjhfYTE2X3QmIGIgKSB7CisgICAgICAgIGttcF9jbXBseDEyOCBsaHMgPSAoKnRoaXMpLnE7CisgICAgICAgIGttcF9jbXBseDEyOCByaHMgPSBiLnE7CisgICAgICAgIHJldHVybiAoa21wX2NtcGx4MTI4X2ExNl90KSggbGhzIC0gcmhzICk7CisgICAgfQorICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAqICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAqIHJocyApOworICAgIH0KKworICAgIGttcF9jbXBseDEyOF9hMTZfdCBvcGVyYXRvciAvICggY29uc3Qga21wX2NtcGx4MTI4X2ExNl90JiBiICkgeworICAgICAgICBrbXBfY21wbHgxMjggbGhzID0gKCp0aGlzKS5xOworICAgICAgICBrbXBfY21wbHgxMjggcmhzID0gYi5xOworICAgICAgICByZXR1cm4gKGttcF9jbXBseDEyOF9hMTZfdCkoIGxocyAvIHJocyApOworICAgIH0KKyAgICB9OworCisjZW5kaWYKKworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAjZGVmaW5lIFFVQURfTEVHQUNZIFF1YWRfYTRfdAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4X2E0X3QKKyNlbHNlCisgICAgI2RlZmluZSBRVUFEX0xFR0FDWSBfUXVhZAorICAgICNkZWZpbmUgQ1BMWDEyOF9MRUcga21wX2NtcGx4MTI4CisjZW5kaWYKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYKKworZXh0ZXJuIGludCBfX2ttcF9hdG9taWNfbW9kZTsKKworLy8KKy8vIEF0b21pYyBsb2NrcyBjYW4gZWFzaWx5IGJlY29tZSBjb250ZW5kZWQsIHNvIHdlIHVzZSBxdWV1aW5nIGxvY2tzIGZvciB0aGVtLgorLy8KKwordHlwZWRlZiBrbXBfcXVldWluZ19sb2NrX3Qga21wX2F0b21pY19sb2NrX3Q7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygga21wX2F0b21pY19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9hdG9taWMpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgICAgfQorI2VuZGlmCisKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgICAgfQorI2VuZGlmCit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWMpKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2F0b21pYykoCisgICAgICAgICAgICAob21wdF93YWl0X2lkX3QpIGxjayk7CisgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfYXRvbWljX2xvY2soIGttcF9hdG9taWNfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2F0b21pY19sb2NrKCBrbXBfYXRvbWljX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKy8vIEdsb2JhbCBMb2NrcworCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2s7ICAgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgaW4gR251IGNvbXBhdCBtb2RlICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xaTsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIDEtYnl0ZSBmaXhlZCBkYXRhIHR5cGVzICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMmk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciAyLWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzRpOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgNC1ieXRlIGZpeGVkIGRhdGEgdHlwZXMgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja180cjsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGttcF9yZWFsMzIgZGF0YSB0eXBlICAgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfOGk7ICAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciA4LWJ5dGUgZml4ZWQgZGF0YSB0eXBlcyAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzhyOyAgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3Iga21wX3JlYWw2NCBkYXRhIHR5cGUgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja184YzsgIC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGNvbXBsZXggYnl0ZSBkYXRhIHR5cGUgICovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMTByOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBkYXRhIHR5cGUgICAqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzE2cjsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgZGF0YSB0eXBlICAgICAgICAgKi8KK2V4dGVybiBrbXBfYXRvbWljX2xvY2tfdCBfX2ttcF9hdG9taWNfbG9ja18xNmM7IC8qIENvbnRyb2wgYWNjZXNzIHRvIGFsbCB1c2VyIGNvZGVkIGF0b21pY3MgZm9yIGRvdWJsZSBjb21wbGV4IGRhdGEgdHlwZSovCitleHRlcm4ga21wX2F0b21pY19sb2NrX3QgX19rbXBfYXRvbWljX2xvY2tfMjBjOyAvKiBDb250cm9sIGFjY2VzcyB0byBhbGwgdXNlciBjb2RlZCBhdG9taWNzIGZvciBsb25nIGRvdWJsZSBjb21wbGV4IHR5cGUqLworZXh0ZXJuIGttcF9hdG9taWNfbG9ja190IF9fa21wX2F0b21pY19sb2NrXzMyYzsgLyogQ29udHJvbCBhY2Nlc3MgdG8gYWxsIHVzZXIgY29kZWQgYXRvbWljcyBmb3IgX1F1YWQgY29tcGxleCBkYXRhIHR5cGUgKi8KKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFVQREFURSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2RpdiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc2hyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKKy8vIDItYnl0ZQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2FuZGIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NociggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJ1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3hvciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOworLy8gNC1ieXRlIGFkZCAvIHN1YiBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocyApOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc3ViKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA4LWJ5dGUgYWRkIC8gc3ViIGZsb2F0Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X2FkZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7CisvLyA0LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDR1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7CisvLyA4LWJ5dGUgZml4ZWQKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kYiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2RpdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfb3JiKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X3NociggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfeG9yKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7CisvLyA0LWJ5dGUgZmxvYXQKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKKy8vIDgtYnl0ZSBmbG9hdAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tdWwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworLy8gMS0sIDItLCA0LSwgOC1ieXRlIGxvZ2ljYWwgKCYmLCB8fCkKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfb3JsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X2FuZGwoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9vcmwoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfYW5kbCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X29ybCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gTUlOIC8gTUFYCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX21pbiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tYXgoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X21heCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9taW4oICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWF4KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfbWluKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X21pbiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeTsgSUEtMzIgYXJjaGl0ZWN0dXJlIG9ubHkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyNlbmRpZgorI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X25lcXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9uZXF2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZXF2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2VxdiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOworLy8gbG9uZyBkb3VibGUgdHlwZQordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisvLyBfUXVhZCB0eXBlCisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9zdWIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X211bCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbXVsX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorLy8gcm91dGluZXMgZm9yIGNvbXBsZXggdHlwZXMKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9zdWIoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X211bCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9hZGQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1YiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4OF9kaXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDEwX3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMgKTsKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3N1YiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfbXVsKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgLy8gUm91dGluZXMgd2l0aCAxNi1ieXRlIGFyZ3VtZW50cyBhbGlnbmVkIHRvIDE2LWJ5dGUgYm91bmRhcnkKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworICAgIHZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLy8gT3Blbk1QIDQuMDogeCA9IGV4cHIgYmlub3AgeCBmb3Igbm9uLWNvbW11dGF0aXZlIG9wZXJhdGlvbnMuCisvLyBTdXBwb3J0ZWQgb25seSBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDF1X3Nocl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3Nocl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfc2hsX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaHJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfc2hyX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQ2NCAqIGxocywga21wX3VpbnQ2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfZGl2X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGRvdWJsZSAqIGxocywgZG91YmxlIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocyApOworI2VuZGlmCit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X3N1Yl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF9kaXZfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfZGl2X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIHZvaWQgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMgKTsKKyAgICB2b2lkIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocyApOworI2VuZGlmCisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisjZW5kaWYgLy9LTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKy8vIHJvdXRpbmVzIGZvciBtaXhlZCB0eXBlcworCisvLyBSSFM9ZmxvYXQ4Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9yZWFsNjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQ4X211bF9mbG9hdDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX3JlYWw2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2Zsb2F0OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZmxvYXQ4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDY0IHJocyApOworCisvLyBSSFM9ZmxvYXQxNiAoZGVwcmVjYXRlZCwgdG8gYmUgcmVtb3ZlZCB3aGVuIHdlIGFyZSBzdXJlIHRoZSBjb21waWxlciBkb2VzIG5vdCB1c2UgdGhlbSkKKyNpZiBLTVBfSEFWRV9RVUFECit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2FkZF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMV9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQxX2Rpdl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIHNob3J0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDRfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0NF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2ZwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ4X211bF9mcCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfZnAoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBfUXVhZCByaHMgKTsKKwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfYWRkX2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfZnAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBfUXVhZCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX211bF9mcCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIF9RdWFkIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfZGl2X2ZwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgX1F1YWQgcmhzICk7CisjZW5kaWYgLy8gS01QX0hBVkVfUVVBRAorCisvLyBSSFM9Y21wbHg4Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2FkZF9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NtcGx4OCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDY0IHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY21wbHg4KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X2Rpdl9jbXBseDgoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHg2NCByaHMgKTsKKworLy8gZ2VuZXJpYyBhdG9taWMgcm91dGluZXMKK3ZvaWQgX19rbXBjX2F0b21pY18xKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY184KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMTAoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOwordm9pZCBfX2ttcGNfYXRvbWljXzE2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB2b2lkKiBsaHMsIHZvaWQqIHJocywgdm9pZCAoKmYpKCB2b2lkICosIHZvaWQgKiwgdm9pZCAqICkgKTsKK3ZvaWQgX19rbXBjX2F0b21pY18yMCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdm9pZCogbGhzLCB2b2lkKiByaHMsIHZvaWQgKCpmKSggdm9pZCAqLCB2b2lkICosIHZvaWQgKiApICk7Cit2b2lkIF9fa21wY19hdG9taWNfMzIoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHZvaWQqIGxocywgdm9pZCogcmhzLCB2b2lkICgqZikoIHZvaWQgKiwgdm9pZCAqLCB2b2lkICogKSApOworCisvLyBSRUFELCBXUklURSwgQ0FQVFVSRSBhcmUgc3VwcG9ydGVkIG9ubHkgb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZCBJbnRlbChSKSA2NAorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFJFQUQgYXJlIGxpc3RlZAorLy8KKworY2hhciAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsb2MgKTsKK3Nob3J0ICAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbG9jICk7CitrbXBfaW50MzIgICAgX19rbXBjX2F0b21pY19maXhlZDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxvYyApOwora21wX2ludDY0ICAgIF9fa21wY19hdG9taWNfZml4ZWQ4X3JkKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAgKiBsb2MgKTsKK2ttcF9yZWFsMzIgICBfX2ttcGNfYXRvbWljX2Zsb2F0NF9yZCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgICogbG9jICk7CitrbXBfcmVhbDY0ICAgX19rbXBjX2F0b21pY19mbG9hdDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICAqIGxvYyApOworbG9uZyBkb3VibGUgIF9fa21wY19hdG9taWNfZmxvYXQxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWSAgX19rbXBjX2F0b21pY19mbG9hdDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxvYyApOworI2VuZGlmCisvLyBGaXggZm9yIENRMjIwMzYxOiBjbXBseDQgUkVBRCB3aWxsIHJldHVybiB2b2lkIG9uIFdpbmRvd3MqIE9TOyByZWFkIHZhbHVlIHdpbGwgYmUKKy8vIHJldHVybmVkIHRocm91Z2ggYW4gYWRkaXRpb25hbCBwYXJhbWV0ZXIKKyNpZiAoIEtNUF9PU19XSU5ET1dTICkKKyAgICB2b2lkICBfX2ttcGNfYXRvbWljX2NtcGx4NF9yZCggIGttcF9jbXBseDMyICogb3V0LCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2Vsc2UKKyAgICBrbXBfY21wbHgzMiAgX19rbXBjX2F0b21pY19jbXBseDRfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxvYyApOworI2VuZGlmCitrbXBfY21wbHg2NCAgX19rbXBjX2F0b21pY19jbXBseDhfcmQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxvYyApOwora21wX2NtcGx4ODAgIF9fa21wY19hdG9taWNfY21wbHgxMF9yZCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsb2MgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitDUExYMTI4X0xFRyAgX19rbXBjX2F0b21pY19jbXBseDE2X3JkKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxvYyApOworI2lmICggS01QX0FSQ0hfWDg2ICkKKyAgICAvLyBSb3V0aW5lcyB3aXRoIDE2LWJ5dGUgYXJndW1lbnRzIGFsaWduZWQgdG8gMTYtYnl0ZSBib3VuZGFyeQorICAgIFF1YWRfYTE2X3QgICAgICAgICBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3JkKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbG9jICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hMTZfcmQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsb2MgKTsKKyNlbmRpZgorI2VuZGlmCisKKworLy8KKy8vICBCZWxvdyByb3V0aW5lcyBmb3IgYXRvbWljIFdSSVRFIGFyZSBsaXN0ZWQKKy8vCisKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDFfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgICAqIGxocywgY2hhciAgICAgICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZml4ZWQyX3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICAgKiBsaHMsIHNob3J0ICAgICAgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgICogbGhzLCBrbXBfaW50MzIgICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19maXhlZDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICAqIGxocywga21wX2ludDY0ICAgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfZmxvYXQ0X3dyKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAgKiBsaHMsIGttcF9yZWFsMzIgIHJocyApOwordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0OF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgICogbGhzLCBrbXBfcmVhbDY0ICByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19mbG9hdDEwX3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAordm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfd3IoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF93ciggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMgKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDhfd3IoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHgxMF93ciggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocyApOworI2lmIEtNUF9IQVZFX1FVQUQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDE2X3dyKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzICk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAgICAgICAgICogbGhzLCBRdWFkX2ExNl90ICAgICAgICAgcmhzICk7CisgICAgdm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3dyKCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLworLy8gIEJlbG93IHJvdXRpbmVzIGZvciBhdG9taWMgQ0FQVFVSRSBhcmUgbGlzdGVkCisvLworCisvLyAxLWJ5dGUKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIGNoYXIgX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHVuc2lnbmVkIGNoYXIgKiBsaHMsIHVuc2lnbmVkIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX211bF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc2hsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3Nocl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOwordW5zaWduZWQgY2hhciBfX2ttcGNfYXRvbWljX2ZpeGVkMXVfc2hyX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnKTsKK2NoYXIgX19rbXBjX2F0b21pY19maXhlZDFfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyk7CitjaGFyIF9fa21wY19hdG9taWNfZml4ZWQxX3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcpOworLy8gMi1ieXRlCitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7Cit1bnNpZ25lZCBzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMnVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Nob3J0IF9fa21wY19hdG9taWNfZml4ZWQyX29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKK3Vuc2lnbmVkIHNob3J0IF9fa21wY19hdG9taWNfZml4ZWQydV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCBfX2ttcGNfYXRvbWljX2ZpeGVkMl9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcpOworc2hvcnQgX19rbXBjX2F0b21pY19maXhlZDJfeG9yX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKKy8vIDQtYnl0ZSBhZGQgLyBzdWIgZmxvYXQKK2ttcF9yZWFsMzIgX19rbXBjX2F0b21pY19mbG9hdDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gOC1ieXRlIGFkZCAvIHN1YiBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9hZGRfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfc3ViX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyA0LWJ5dGUgZml4ZWQKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfYW5kYl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX3VpbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNHVfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgIF9fa21wY19hdG9taWNfZml4ZWQ0X29yYl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zaGxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDMyIF9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDMyICBfX2ttcGNfYXRvbWljX2ZpeGVkNF94b3JfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICAqIGxocywga21wX2ludDMyICByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmaXhlZAora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9hbmRiX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfdWludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4dV9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgX19rbXBjX2F0b21pY19maXhlZDhfb3JiX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgKiBsaHMsIGttcF9pbnQ2NCAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3NobF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOwora21wX2ludDY0ICBfX2ttcGNfYXRvbWljX2ZpeGVkOF9zaHJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnKTsKK2ttcF91aW50NjQgX19rbXBjX2F0b21pY19maXhlZDh1X3Nocl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgIF9fa21wY19hdG9taWNfZml4ZWQ4X3hvcl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcpOworLy8gNC1ieXRlIGZsb2F0CitrbXBfcmVhbDMyIF9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiBfX2ttcGNfYXRvbWljX2Zsb2F0NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWwzMiAqIGxocywga21wX3JlYWwzMiByaHMsIGludCBmbGFnKTsKKy8vIDgtYnl0ZSBmbG9hdAora21wX3JlYWw2NCBfX2ttcGNfYXRvbWljX2Zsb2F0OF9kaXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgX19rbXBjX2F0b21pY19mbG9hdDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsNjQgKiBsaHMsIGttcF9yZWFsNjQgcmhzLCBpbnQgZmxhZyk7CisvLyAxLSwgMi0sIDQtLCA4LWJ5dGUgbG9naWNhbCAoJiYsIHx8KQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMV9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICogbGhzLCBjaGFyICAgICAgcmhzLCBpbnQgZmxhZyk7CitzaG9ydCAgICAgX19rbXBjX2F0b21pY19maXhlZDJfYW5kbF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAqIGxocywgc2hvcnQgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX29ybF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hbmRsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfb3JsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X2FuZGxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCBfX2ttcGNfYXRvbWljX2ZpeGVkOF9vcmxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICogbGhzLCBrbXBfaW50NjQgcmhzLCBpbnQgZmxhZyk7CisvLyBNSU4gLyBNQVgKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK2NoYXIgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiAgIF9fa21wY19hdG9taWNfZml4ZWQ0X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgKiBsaHMsIGttcF9pbnQzMiByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQ2NCAgIF9fa21wY19hdG9taWNfZml4ZWQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsMzIgIF9fa21wY19hdG9taWNfZmxvYXQ0X21heF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDMyICogbGhzLCBrbXBfcmVhbDMyIHJocywgaW50IGZsYWcpOwora21wX3JlYWwzMiAgX19rbXBjX2F0b21pY19mbG9hdDRfbWluX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9yZWFsMzIgKiBsaHMsIGttcF9yZWFsMzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfcmVhbDY0ICBfX2ttcGNfYXRvbWljX2Zsb2F0OF9tYXhfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3JlYWw2NCAqIGxocywga21wX3JlYWw2NCByaHMsIGludCBmbGFnKTsKK2ttcF9yZWFsNjQgIF9fa21wY19hdG9taWNfZmxvYXQ4X21pbl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfcmVhbDY0ICogbGhzLCBrbXBfcmVhbDY0IHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tYXhfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfbWluX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyAuTkVRVi4gKHNhbWUgYXMgeG9yKQorY2hhciAgICAgIF9fa21wY19hdG9taWNfZml4ZWQxX25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICAgICAgKiBsaHMsIGNoYXIgICAgICByaHMsIGludCBmbGFnKTsKK3Nob3J0ICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkMl9uZXF2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgICAgICogbGhzLCBzaG9ydCAgICAgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50MzIgX19rbXBjX2F0b21pY19maXhlZDRfbmVxdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAqIGxocywga21wX2ludDMyIHJocywgaW50IGZsYWcpOwora21wX2ludDY0IF9fa21wY19hdG9taWNfZml4ZWQ4X25lcXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgKiBsaHMsIGttcF9pbnQ2NCByaHMsIGludCBmbGFnKTsKKy8vIC5FUVYuIChzYW1lIGFzIH54b3IpCitjaGFyICAgICAgX19rbXBjX2F0b21pY19maXhlZDFfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgICAgICAqIGxocywgY2hhciAgICAgIHJocywgaW50IGZsYWcpOworc2hvcnQgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX2Vxdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAgICAgKiBsaHMsIHNob3J0ICAgICByaHMsIGludCBmbGFnKTsKK2ttcF9pbnQzMiBfX2ttcGNfYXRvbWljX2ZpeGVkNF9lcXZfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDMyICogbGhzLCBrbXBfaW50MzIgcmhzLCBpbnQgZmxhZyk7CitrbXBfaW50NjQgX19rbXBjX2F0b21pY19maXhlZDhfZXF2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAqIGxocywga21wX2ludDY0IHJocywgaW50IGZsYWcpOworLy8gbG9uZyBkb3VibGUgdHlwZQorbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2FkZF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKK2xvbmcgZG91YmxlIF9fa21wY19hdG9taWNfZmxvYXQxMF9zdWJfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyk7Citsb25nIGRvdWJsZSBfX2ttcGNfYXRvbWljX2Zsb2F0MTBfbXVsX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcpOworbG9uZyBkb3VibGUgX19rbXBjX2F0b21pY19mbG9hdDEwX2Rpdl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGxvbmcgZG91YmxlICogbGhzLCBsb25nIGRvdWJsZSByaHMsIGludCBmbGFnKTsKKyNpZiBLTVBfSEFWRV9RVUFECisvLyBfUXVhZCB0eXBlCitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworUVVBRF9MRUdBQ1kgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnKTsKK1FVQURfTEVHQUNZIF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBRVUFEX0xFR0FDWSAqIGxocywgUVVBRF9MRUdBQ1kgcmhzLCBpbnQgZmxhZyk7CitRVUFEX0xFR0FDWSBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgUVVBRF9MRUdBQ1kgKiBsaHMsIFFVQURfTEVHQUNZIHJocywgaW50IGZsYWcpOworI2VuZGlmCisvLyByb3V0aW5lcyBmb3IgY29tcGxleCB0eXBlcworLy8gV29ya2Fyb3VuZCBmb3IgY21wbHg0IHJvdXRpbmVzIC0gcmV0dXJuIHZvaWQ7IGNhcHR1cmVkIHZhbHVlIGlzIHJldHVybmVkIHZpYSB0aGUgYXJndW1lbnQKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfYWRkX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7Cit2b2lkIF9fa21wY19hdG9taWNfY21wbHg0X3N1Yl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcpOwordm9pZCBfX2ttcGNfYXRvbWljX2NtcGx4NF9tdWxfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MzIgKiBsaHMsIGttcF9jbXBseDMyIHJocywga21wX2NtcGx4MzIgKiBvdXQsIGludCBmbGFnKTsKK3ZvaWQgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDMyICogbGhzLCBrbXBfY21wbHgzMiByaHMsIGttcF9jbXBseDMyICogb3V0LCBpbnQgZmxhZyk7CisKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2FkZF9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg2NCBfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4NjQgKiBsaHMsIGttcF9jbXBseDY0IHJocywgaW50IGZsYWcpOwora21wX2NtcGx4NjQgX19rbXBjX2F0b21pY19jbXBseDhfbXVsX2NwdCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDY0IF9fa21wY19hdG9taWNfY21wbHg4X2Rpdl9jcHQoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfYWRkX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOwora21wX2NtcGx4ODAgX19rbXBjX2F0b21pY19jbXBseDEwX3N1Yl9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnKTsKK2ttcF9jbXBseDgwIF9fa21wY19hdG9taWNfY21wbHgxMF9tdWxfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzLCBpbnQgZmxhZyk7CitrbXBfY21wbHg4MCBfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcpOworI2lmIEtNUF9IQVZFX1FVQUQKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CitDUExYMTI4X0xFRyBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcpOworQ1BMWDEyOF9MRUcgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9jcHQoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnKTsKK0NQTFgxMjhfTEVHIF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBDUExYMTI4X0xFRyAqIGxocywgQ1BMWDEyOF9MRUcgcmhzLCBpbnQgZmxhZyk7CisjaWYgKCBLTVBfQVJDSF9YODYgKQorICAgIC8vIFJvdXRpbmVzIHdpdGggMTYtYnl0ZSBhcmd1bWVudHMgYWxpZ25lZCB0byAxNi1ieXRlIGJvdW5kYXJ5CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfYWRkX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X3N1Yl9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9tdWxfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAgUXVhZF9hMTZfdCBfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcpOworICAgIFF1YWRfYTE2X3QgX19rbXBjX2F0b21pY19mbG9hdDE2X21heF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBRdWFkX2ExNl90IF9fa21wY19hdG9taWNfZmxvYXQxNl9taW5fYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9hZGRfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworICAgIGttcF9jbXBseDEyOF9hMTZfdCBfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHQoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgxMjhfYTE2X3QgKiBsaHMsIGttcF9jbXBseDEyOF9hMTZfdCByaHMsIGludCBmbGFnKTsKKyAgICBrbXBfY21wbHgxMjhfYTE2X3QgX19rbXBjX2F0b21pY19jbXBseDE2X211bF9hMTZfY3B0KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IF9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfYTE2X2NwdCggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcpOworI2VuZGlmCisjZW5kaWYKKwordm9pZCBfX2ttcGNfYXRvbWljX3N0YXJ0KHZvaWQpOwordm9pZCBfX2ttcGNfYXRvbWljX2VuZCh2b2lkKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vIE9wZW5NUCA0LjA6IHYgPSB4ID0gZXhwciBiaW5vcCB4OyB7IHYgPSB4OyB4ID0gZXhwciBiaW5vcCB4OyB9IHsgeCA9IGV4cHIgYmlub3AgeDsgdiA9IHg7IH0gIGZvciBub24tY29tbXV0YXRpdmUgb3BlcmF0aW9ucy4KKworY2hhcgkgICAgICAgCV9fa21wY19hdG9taWNfZml4ZWQxX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAqIGxocywgY2hhciByaHMsIGludCBmbGFnICk7CitjaGFyCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgY2hhciAJX19rbXBjX2F0b21pY19maXhlZDF1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBjaGFyICogbGhzLCB1bnNpZ25lZCBjaGFyIHJocywgaW50IGZsYWcgKTsKK2NoYXIgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMV9zaGxfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGNoYXIgKiBsaHMsIGNoYXIgcmhzICwgaW50IGZsYWcpOworY2hhcgkJX19rbXBjX2F0b21pY19maXhlZDFfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBjaGFyICogbGhzLCBjaGFyIHJocywgaW50IGZsYWcgKTsKK3Vuc2lnbmVkIGNoYXIgCV9fa21wY19hdG9taWNfZml4ZWQxdV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgY2hhciAqIGxocywgdW5zaWduZWQgY2hhciByaHMsIGludCBmbGFnICk7CitzaG9ydCAJCV9fa21wY19hdG9taWNfZml4ZWQyX3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgc2hvcnQgKiBsaHMsIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwordW5zaWduZWQgc2hvcnQgCV9fa21wY19hdG9taWNfZml4ZWQydV9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgdW5zaWduZWQgc2hvcnQgKiBsaHMsIHVuc2lnbmVkIHNob3J0IHJocywgaW50IGZsYWcgKTsKK3Nob3J0IAkJX19rbXBjX2F0b21pY19maXhlZDJfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBzaG9ydCAqIGxocywgc2hvcnQgcmhzLCBpbnQgZmxhZyApOworc2hvcnQgCQlfX2ttcGNfYXRvbWljX2ZpeGVkMl9zaHJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICogbGhzLCBzaG9ydCByaHMsIGludCBmbGFnICk7Cit1bnNpZ25lZCBzaG9ydCAJX19rbXBjX2F0b21pY19maXhlZDJ1X3Nocl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCB1bnNpZ25lZCBzaG9ydCAqIGxocywgdW5zaWduZWQgc2hvcnQgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX2ludDMyIAlfX2ttcGNfYXRvbWljX2ZpeGVkNF9kaXZfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQzMiAgKiBsaHMsIGttcF9pbnQzMiAgcmhzLCBpbnQgZmxhZyApOwora21wX3VpbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDR1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDMyICogbGhzLCBrbXBfdWludDMyIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQzMiAJX19rbXBjX2F0b21pY19maXhlZDRfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICogbGhzLCBrbXBfaW50MzIgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50MzIgCV9fa21wY19hdG9taWNfZml4ZWQ0dV9zaHJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX3VpbnQzMiAqIGxocywga21wX3VpbnQzMiByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2ludDY0ICAqIGxocywga21wX2ludDY0ICByaHMsIGludCBmbGFnICk7CitrbXBfdWludDY0ICAgICAgX19rbXBjX2F0b21pY19maXhlZDh1X2Rpdl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfdWludDY0ICogbGhzLCBrbXBfdWludDY0IHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hsX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF9pbnQ2NCAJX19rbXBjX2F0b21pY19maXhlZDhfc2hyX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50NjQgICogbGhzLCBrbXBfaW50NjQgIHJocywgaW50IGZsYWcgKTsKK2ttcF91aW50NjQgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkOHVfc2hyX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF91aW50NjQgKiBsaHMsIGttcF91aW50NjQgcmhzLCBpbnQgZmxhZyApOworZmxvYXQgCQlfX2ttcGNfYXRvbWljX2Zsb2F0NF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGZsb2F0ICogbGhzLCBmbG9hdCByaHMsIGludCBmbGFnICk7CitmbG9hdCAJCV9fa21wY19hdG9taWNfZmxvYXQ0X2Rpdl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgKiBsaHMsIGZsb2F0IHJocywgaW50IGZsYWcgKTsKK2RvdWJsZSAJCV9fa21wY19hdG9taWNfZmxvYXQ4X3N1Yl9jcHRfcmV2KCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICogbGhzLCBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworZG91YmxlIAkJX19rbXBjX2F0b21pY19mbG9hdDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBkb3VibGUgKiBsaHMsIGRvdWJsZSByaHMsIGludCBmbGFnICk7Citsb25nIGRvdWJsZSAJX19rbXBjX2F0b21pY19mbG9hdDEwX3N1Yl9jcHRfcmV2KCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzLCBpbnQgZmxhZyApOworbG9uZyBkb3VibGUgCV9fa21wY19hdG9taWNfZmxvYXQxMF9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgbG9uZyBkb3VibGUgKiBsaHMsIGxvbmcgZG91YmxlIHJocywgaW50IGZsYWcgKTsKKyNpZiBLTVBfSEFWRV9RVUFECitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CitRVUFEX0xFR0FDWQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMsIGludCBmbGFnICk7CisjZW5kaWYKKy8vIFdvcmthcm91bmQgZm9yIGNtcGx4NCByb3V0aW5lcyAtIHJldHVybiB2b2lkOyBjYXB0dXJlZCB2YWx1ZSBpcyByZXR1cm5lZCB2aWEgdGhlIGFyZ3VtZW50Cit2b2lkICAgICAJX19rbXBjX2F0b21pY19jbXBseDRfc3ViX2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK3ZvaWQgCSAgICAgICAgX19rbXBjX2F0b21pY19jbXBseDRfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCwgaW50IGZsYWcgKTsKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zdWJfY3B0X3JldiggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDY0ICogbGhzLCBrbXBfY21wbHg2NCByaHMsIGludCBmbGFnICk7CitrbXBfY21wbHg2NCAJX19rbXBjX2F0b21pY19jbXBseDhfZGl2X2NwdF9yZXYoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzLCBpbnQgZmxhZyApOwora21wX2NtcGx4ODAgCV9fa21wY19hdG9taWNfY21wbHgxMF9zdWJfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4ODAgKiBsaHMsIGttcF9jbXBseDgwIHJocywgaW50IGZsYWcgKTsKK2ttcF9jbXBseDgwIAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfZGl2X2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDgwICogbGhzLCBrbXBfY21wbHg4MCByaHMsIGludCBmbGFnICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgIAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2NwdF9yZXYoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMsIGludCBmbGFnICk7CitDUExYMTI4X0xFRyAgCV9fa21wY19hdG9taWNfY21wbHgxNl9kaXZfY3B0X3JldiggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgQ1BMWDEyOF9MRUcgKiBsaHMsIENQTFgxMjhfTEVHIHJocywgaW50IGZsYWcgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdCAJCV9fa21wY19hdG9taWNfZmxvYXQxNl9zdWJfYTE2X2NwdF9yZXYoIGlkZW50X3QgKiBpZF9yZWYsIGludCBndGlkLCBRdWFkX2ExNl90ICogbGhzLCBRdWFkX2ExNl90IHJocywgaW50IGZsYWcgKTsKKyAgICBRdWFkX2ExNl90CQlfX2ttcGNfYXRvbWljX2Zsb2F0MTZfZGl2X2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwgUXVhZF9hMTZfdCAqIGxocywgUXVhZF9hMTZfdCByaHMsIGludCBmbGFnICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfc3ViX2ExNl9jcHRfcmV2KCBpZGVudF90ICogaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzLCBpbnQgZmxhZyApOworICAgIGttcF9jbXBseDEyOF9hMTZfdCAJX19rbXBjX2F0b21pY19jbXBseDE2X2Rpdl9hMTZfY3B0X3JldiggaWRlbnRfdCAqIGlkX3JlZiwgaW50IGd0aWQsIGttcF9jbXBseDEyOF9hMTZfdCAqIGxocywga21wX2NtcGx4MTI4X2ExNl90IHJocywgaW50IGZsYWcgKTsKKyNlbmRpZgorI2VuZGlmCisKKy8vICAgT3Blbk1QIDQuMCBDYXB0dXJlLXdyaXRlIChzd2FwKToge3YgPSB4OyB4ID0gZXhwcjt9CitjaGFyIAkJX19rbXBjX2F0b21pY19maXhlZDFfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgY2hhciAgICAgICAgKiBsaHMsIGNoYXIgICAgICAgIHJocyApOworc2hvcnQgICAgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQyX3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIHNob3J0ICAgICAgICogbGhzLCBzaG9ydCAgICAgICByaHMgKTsKK2ttcF9pbnQzMiAgICAgICBfX2ttcGNfYXRvbWljX2ZpeGVkNF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfaW50MzIgICAqIGxocywga21wX2ludDMyICAgcmhzICk7CitrbXBfaW50NjQgCV9fa21wY19hdG9taWNfZml4ZWQ4X3N3cCggIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIGttcF9pbnQ2NCAgICogbGhzLCBrbXBfaW50NjQgICByaHMgKTsKK2Zsb2F0IAkJX19rbXBjX2F0b21pY19mbG9hdDRfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZmxvYXQgICAgICAgKiBsaHMsIGZsb2F0ICByaHMgKTsKK2RvdWJsZQkJX19rbXBjX2F0b21pY19mbG9hdDhfc3dwKCAgaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwgZG91YmxlICAgICAgKiBsaHMsIGRvdWJsZSAgcmhzICk7Citsb25nIGRvdWJsZQlfX2ttcGNfYXRvbWljX2Zsb2F0MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBsb25nIGRvdWJsZSAqIGxocywgbG9uZyBkb3VibGUgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorUVVBRF9MRUdBQ1kgICAgCV9fa21wY19hdG9taWNfZmxvYXQxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFFVQURfTEVHQUNZICogbGhzLCBRVUFEX0xFR0FDWSByaHMgKTsKKyNlbmRpZgorLy8gISEhIFRPRE86IGNoZWNrIGlmIHdlIG5lZWQgYSB3b3JrYXJvdW5kIGhlcmUKK3ZvaWQgICAgICAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzLCBrbXBfY21wbHgzMiAqIG91dCApOworLy9rbXBfY21wbHgzMiAgIAlfX2ttcGNfYXRvbWljX2NtcGx4NF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHgzMiAqIGxocywga21wX2NtcGx4MzIgcmhzICk7CisKK2ttcF9jbXBseDY0IAlfX2ttcGNfYXRvbWljX2NtcGx4OF9zd3AoICBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg2NCAqIGxocywga21wX2NtcGx4NjQgcmhzICk7CitrbXBfY21wbHg4MAlfX2ttcGNfYXRvbWljX2NtcGx4MTBfc3dwKCBpZGVudF90ICppZF9yZWYsIGludCBndGlkLCBrbXBfY21wbHg4MCAqIGxocywga21wX2NtcGx4ODAgcmhzICk7CisjaWYgS01QX0hBVkVfUVVBRAorQ1BMWDEyOF9MRUcgCV9fa21wY19hdG9taWNfY21wbHgxNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIENQTFgxMjhfTEVHICogbGhzLCBDUExYMTI4X0xFRyByaHMgKTsKKyNpZiAoIEtNUF9BUkNIX1g4NiApCisgICAgUXVhZF9hMTZfdAkJX19rbXBjX2F0b21pY19mbG9hdDE2X2ExNl9zd3AoIGlkZW50X3QgKmlkX3JlZiwgaW50IGd0aWQsIFF1YWRfYTE2X3QgKiBsaHMsIFF1YWRfYTE2X3QgcmhzICk7CisgICAga21wX2NtcGx4MTI4X2ExNl90IAlfX2ttcGNfYXRvbWljX2NtcGx4MTZfYTE2X3N3cCggaWRlbnRfdCAqaWRfcmVmLCBpbnQgZ3RpZCwga21wX2NtcGx4MTI4X2ExNl90ICogbGhzLCBrbXBfY21wbHgxMjhfYTE2X3QgcmhzICk7CisjZW5kaWYKKyNlbmRpZgorCisvLyBFbmQgb2YgT3Blbk1QIDQuMCBjYXB0dXJlCisKKyNlbmRpZiAvL09NUF80MF9FTkFCTEVECisKKyNlbmRpZiAvL0tNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9BVE9NSUNfSCAqLworCisvLyBlbmQgb2YgZmlsZQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9iYXJyaWVyLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTUxMjViMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfYmFycmllci5jcHAKQEAgLTAsMCArMSwxNzY0IEBACisvKgorICoga21wX2JhcnJpZXIuY3BwCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisjaW5jbHVkZSAia21wX2l0dC5oIgorI2luY2x1ZGUgImttcF9vcy5oIgorCisKKyNpZiBLTVBfTUlDCisjaW5jbHVkZSA8aW1taW50cmluLmg+CisjZGVmaW5lIFVTRV9OR09fU1RPUkVTIDEKKyNlbmRpZiAvLyBLTVBfTUlDCisKKyNpZiBLTVBfTUlDICYmIFVTRV9OR09fU1RPUkVTCisvLyBJQ1YgY29weWluZworI2RlZmluZSBuZ29fbG9hZChzcmMpICAgICAgICAgICAgX19tNTEyZCBWdCA9IF9tbTUxMl9sb2FkX3BkKCh2b2lkICopKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9pY3ZzKGRzdCwgc3JjKSBfbW01MTJfc3RvcmVucm5nb19wZCgodm9pZCAqKShkc3QpLCBWdCkKKyNkZWZpbmUgbmdvX3N0b3JlX2dvKGRzdCwgc3JjKSAgIF9tbTUxMl9zdG9yZW5ybmdvX3BkKCh2b2lkICopKGRzdCksIFZ0KQorI2RlZmluZSBuZ29fc3luYygpICAgICAgICAgICAgICAgX19hc21fXyB2b2xhdGlsZSAoImxvY2s7IGFkZGwgJDAsMCglJXJzcCkiIDo6OiAibWVtb3J5IikKKyNlbHNlCisjZGVmaW5lIG5nb19sb2FkKHNyYykgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgbmdvX3N0b3JlX2ljdnMoZHN0LCBzcmMpIGNvcHlfaWN2cygoZHN0KSwgKHNyYykpCisjZGVmaW5lIG5nb19zdG9yZV9nbyhkc3QsIHNyYykgICBLTVBfTUVNQ1BZKChkc3QpLCAoc3JjKSwgQ0FDSEVfTElORSkKKyNkZWZpbmUgbmdvX3N5bmMoKSAgICAgICAgICAgICAgICgodm9pZCkwKQorI2VuZGlmIC8qIEtNUF9NSUMgJiYgVVNFX05HT19TVE9SRVMgKi8KKwordm9pZCBfX2ttcF9wcmludF9zdHJ1Y3R1cmUodm9pZCk7IC8vIEZvcndhcmQgZGVjbGFyYXRpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBCYXJyaWVyIEFsZ29yaXRobXMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBMaW5lYXIgQmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcihlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2xpbmVhcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyID09IG90aGVyX3RocmVhZHNbdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkXSk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBzYXZlIGFycml2ZSB0aW1lIHRvIHRoZSB0aHJlYWQKKyAgICBpZihfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzIHx8IF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgfQorI2VuZGlmCisgICAgLy8gV2Ugbm93IHBlcmZvcm0gYSBsaW5lYXIgcmVkdWN0aW9uIHRvIHNpZ25hbCB0aGF0IGFsbCBvZiB0aGUgdGhyZWFkcyBoYXZlIGFycml2ZWQuCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKDAsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIDAsICZ0aHJfYmFyLT5iX2Fycml2ZWQsCisgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkLCB0aHJfYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIC8vIE1hcmsgYXJyaXZhbCB0byBtYXN0ZXIgdGhyZWFkCisgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSwgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQKKyAgICAgICAgICAgYW55IG1vcmUgLSBpdCBjb3VsZCBiZSBkZWFsbG9jYXRlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBhdCBhbnkgdGltZS4gKi8KKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkLCBvdGhlcl90aHJlYWRzWzBdKTsKKyAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmVnaXN0ZXIga21wX2JhbGlnbl90ZWFtX3QgKnRlYW1fYmFyID0gJnRlYW0tPnQudF9iYXJbYnRdOworICAgICAgICByZWdpc3RlciBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgICAgIC8vIERvbid0IGhhdmUgdG8gd29ycnkgYWJvdXQgc2xlZXAgYml0IGhlcmUgb3IgYXRvbWljIHNpbmNlIHRlYW0gc2V0dGluZworICAgICAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IHRlYW1fYmFyLT5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworCisgICAgICAgIC8vIENvbGxlY3QgYWxsIHRoZSB3b3JrZXIgdGVhbSBtZW1iZXIgdGhyZWFkcy4KKyAgICAgICAgZm9yIChpPTE7IGk8bnByb2M7ICsraSkgeworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgYXJyaXZlZCBjb3VudAorICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tpKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApID09ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQoaSwgdGVhbSksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworCisgICAgICAgICAgICAvLyBXYWl0IGZvciB3b3JrZXIgdGhyZWFkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2J0XS5iYi5iX2Fycml2ZWQsIG5ld19zdGF0ZSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgdGhlIG90aGVyIHRocmVhZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGksIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGkpKTsKKyAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gRG9uJ3QgaGF2ZSB0byB3b3JyeSBhYm91dCBzbGVlcCBiaXQgaGVyZSBvciBhdG9taWMgc2luY2UgdGVhbSBzZXR0aW5nCisgICAgICAgIHRlYW1fYmFyLT5iX2Fycml2ZWQgPSBuZXdfc3RhdGU7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsICZ0ZWFtX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IHByb3BhZ2F0ZV9pY3ZzCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfbGluZWFyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqdGhyX2JhciA9ICZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgcmVnaXN0ZXIgdW5zaWduZWQgaW50IGk7CisgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHM7CisKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIG1hc3RlciBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgICAgIGlmIChucHJvYyA+IDEpIHsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX2ljdl9jb3B5KTsKKyAgICAgICAgICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tpXSwgdGVhbSwgaSwgRkFMU0UpOworICAgICAgICAgICAgICAgICAgICAgICAgbmdvX3N0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2ldLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbMF0udGRfaWN2cyk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbmdvX3N5bmMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKworICAgICAgICAgICAgLy8gTm93LCByZWxlYXNlIGFsbCBvZiB0aGUgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAgICAgLy8gUHJlZmV0Y2ggbmV4dCB0aHJlYWQncyBnbyBmbGFnCisgICAgICAgICAgICAgICAgaWYgKGkrMSA8IG5wcm9jKQorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbaSsxXS0+dGgudGhfYmFyW2J0XS5iYi5iX2dvKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJnbyglcCk6ICV1ID0+ICV1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGVhbS0+dC50X2lkLCBpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2JhcltidF0uYmIuYl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJbYnRdLmJiLmJfZ28sIG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsgLy8gV2FpdCBmb3IgdGhlIE1BU1RFUiB0aHJlYWQgdG8gcmVsZWFzZSB1cworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlOiBUIyVkIHdhaXQgZ28oJXApID09ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKSk7CisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBhIGZvcmsgYmFycmllcjsgY2Fubm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5IChvciBJVFROT1RJRlkgaXMgZGlzYWJsZWQpCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmICggYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisjZW5kaWYKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRyZWUgYmFycmllcgorc3RhdGljIHZvaWQKK19fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdm9pZCAoKnJlZHVjZSkodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfdHJlZV9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBjaGlsZF90aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQ2NCBuZXdfc3RhdGU7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBlbnRlciBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8vIFBlcmZvcm0gdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgdGhyZWFkcyBoYXZlIGFycml2ZWQ7IHJlZHVjZSBhbnkgcmVxdWlyZWQgZGF0YSBhcyB3ZSBnbworICAgIGNoaWxkX3RpZCA9ICh0aWQgPDwgYnJhbmNoX2JpdHMpICsgMTsKKyAgICBpZiAoY2hpbGRfdGlkIDwgbnByb2MpIHsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgd2FpdCBmb3IgYWxsIHRoZWlyIGNoaWxkcmVuIHRvIGFycml2ZQorICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBjaGlsZCA9IDE7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyNpZiBLTVBfQ0FDSEVfTUFOQUdFCisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfYXJyaXZlZCk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAvLyBXYWl0IGZvciBjaGlsZCB0byBhcnJpdmUKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgICAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHdyaXRlIG1pbiBvZiB0aGUgdGhyZWFkIHRpbWUgYW5kIGEgY2hpbGQgdGltZSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgaWYgKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDIpIHsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gS01QX01JTih0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3Roci0+dGgudGhfYmFyX21pbl90aW1lKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjaGlsZCsrOworICAgICAgICAgICAgY2hpbGRfdGlkKys7CisgICAgICAgIH0KKyAgICAgICAgd2hpbGUgKGNoaWxkIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkIDwgbnByb2MpOworICAgIH0KKworICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgcGFyZW50X3RpZCA9ICh0aWQgLSAxKSA+PiBicmFuY2hfYml0czsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKTogJWxsdSA9PiAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKworICAgICAgICAvLyBNYXJrIGFycml2YWwgdG8gcGFyZW50IHRocmVhZAorICAgICAgICAvKiBBZnRlciBwZXJmb3JtaW5nIHRoaXMgd3JpdGUsIGEgd29ya2VyIHRocmVhZCBtYXkgbm90IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkCisgICAgICAgICAgIGFueSBtb3JlIC0gaXQgY291bGQgYmUgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2Fycml2ZWQsIG90aGVyX3RocmVhZHNbcGFyZW50X3RpZF0pOworICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChucHJvYyA+IDEpIC8vIE5ldyB2YWx1ZSB3YXMgYWxyZWFkeSBjb21wdXRlZCBhYm92ZQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkID0gbmV3X3N0YXRlOworICAgICAgICBlbHNlCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKz0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgc2V0IHRlYW0gJWQgYXJyaXZlZCglcCkgPSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCB0ZWFtLT50LnRfaWQsCisgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIGV4aXQgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF90cmVlX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1tidF07CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfZmFjdG9yID0gMSA8PCBicmFuY2hfYml0czsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgY2hpbGRfdGlkOworCisgICAgLy8gUGVyZm9ybSBhIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkCisgICAgaWYgKCFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCB3YWl0IGdvKCVwKSA9PSAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgdXMKKyAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmdGhyX2Jhci0+Yl9nbywgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCk7CisgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgJiYgaXR0X3N5bmNfb2JqID09IE5VTEwpIHx8IEtNUF9JVFRfREVCVUcpIHsKKyAgICAgICAgICAgIC8vIEluIGZvcmsgYmFycmllciB3aGVyZSB3ZSBjb3VsZCBub3QgZ2V0IHRoZSBvYmplY3QgcmVsaWFibHkgKG9yIElUVE5PVElGWSBpcyBkaXNhYmxlZCkKKyAgICAgICAgICAgIGl0dF9zeW5jX29iaiA9IF9fa21wX2l0dF9iYXJyaWVyX29iamVjdChndGlkLCBic19mb3Jram9pbl9iYXJyaWVyLCAwLCAtMSk7CisgICAgICAgICAgICAvLyBDYW5jZWwgd2FpdCBvbiBwcmV2aW91cyBwYXJhbGxlbCByZWdpb24uLi4KKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX3N0YXJ0aW5nKGl0dF9zeW5jX29iaik7CisKKyAgICAgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBpZiAoaXR0X3N5bmNfb2JqICE9IE5VTEwpCisgICAgICAgICAgICAgICAgLy8gQ2FsbCBwcmVwYXJlIGFzIGVhcmx5IGFzIHBvc3NpYmxlIGZvciAibmV3IiBiYXJyaWVyCisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgfSBlbHNlCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAvLyBUaGUgd29ya2VyIHRocmVhZCBtYXkgbm93IGFzc3VtZSB0aGF0IHRoZSB0ZWFtIGlzIHZhbGlkLgorICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgICAgIFRDV180KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgc2V0IGdvKCVwKSA9ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCAmdGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSkpOworICAgICAgICBLTVBfTUIoKTsgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9IGVsc2UgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgbWFzdGVyIGVudGVyIGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgY2hpbGRfdGlkID0gKHRpZCA8PCBicmFuY2hfYml0cykgKyAxOworCisgICAgaWYgKGNoaWxkX3RpZCA8IG5wcm9jKSB7CisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgIGNoaWxkID0gMTsKKyAgICAgICAgLy8gUGFyZW50IHRocmVhZHMgcmVsZWFzZSBhbGwgdGhlaXIgY2hpbGRyZW4KKyAgICAgICAgZG8geworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDw9IGJyYW5jaF9mYWN0b3IgJiYgY2hpbGRfdGlkKzEgPCBucHJvYykKKyAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbY2hpbGRfdGlkKzFdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICAgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cykgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2sodGVhbS0+dC50X2lkZW50LCB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbSwgY2hpbGRfdGlkLCBGQUxTRSk7CisgICAgICAgICAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbY2hpbGRfdGlkXS50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhWzBdLnRkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiV1KSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImdvKCVwKTogJXUgPT4gJXVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF9iYXItPmJfZ28sCisgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgICAgIGNoaWxkKys7CisgICAgICAgICAgICBjaGlsZF90aWQrKzsKKyAgICAgICAgfQorICAgICAgICB3aGlsZSAoY2hpbGQgPD0gYnJhbmNoX2ZhY3RvciAmJiBjaGlsZF90aWQgPCBucHJvYyk7CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworCisvLyBIeXBlciBCYXJyaWVyCitzdGF0aWMgdm9pZAorX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZ3RpZCwgaW50IHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHZvaWQgKCpyZWR1Y2UpKHZvaWQgKiwgdm9pZCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oeXBlcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmdGhpc190aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDY0IG5ld19zdGF0ZSA9IEtNUF9CQVJSSUVSX1VOVVNFRF9TVEFURTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIG51bV90aHJlYWRzID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBicmFuY2hfYml0cyA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2J0XTsKKyAgICByZWdpc3RlciBrbXBfdWludDMyIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgb2Zmc2V0OworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbGV2ZWw7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3RociA9PSBvdGhlcl90aHJlYWRzW3RoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZF0pOworCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gc2F2ZSBhcnJpdmUgdGltZSB0byB0aGUgdGhyZWFkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAyKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgPSB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorICAgIC8qIFBlcmZvcm0gYSBoeXBlcmN1YmUtZW1iZWRkZWQgdHJlZSBnYXRoZXIgdG8gd2FpdCB1bnRpbCBhbGwgb2YgdGhlIHRocmVhZHMgaGF2ZQorICAgICAgIGFycml2ZWQsIGFuZCByZWR1Y2UgYW55IHJlcXVpcmVkIGRhdGEgYXMgd2UgZ28uICAqLworICAgIGttcF9mbGFnXzY0IHBfZmxhZygmdGhyX2Jhci0+Yl9hcnJpdmVkKTsKKyAgICBmb3IgKGxldmVsPTAsIG9mZnNldD0xOyBvZmZzZXQ8bnVtX3RocmVhZHM7IGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpCisgICAgeworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkOworICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIGNoaWxkX3RpZDsKKworICAgICAgICBpZiAoKCh0aWQgPj4gbGV2ZWwpICYgKGJyYW5jaF9mYWN0b3IgLSAxKSkgIT0gMCkgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2ludDMyIHBhcmVudF90aWQgPSB0aWQgJiB+KCgxIDw8IChsZXZlbCArIGJyYW5jaF9iaXRzKSkgLTEpOworCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgImFycml2ZWQoJXApOiAlbGx1ID0+ICVsbHVcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKHBhcmVudF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIHBhcmVudF90aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgLy8gTWFyayBhcnJpdmFsIHRvIHBhcmVudCB0aHJlYWQKKyAgICAgICAgICAgIC8qIEFmdGVyIHBlcmZvcm1pbmcgdGhpcyB3cml0ZSAoaW4gdGhlIGxhc3QgaXRlcmF0aW9uIG9mIHRoZSBlbmNsb3NpbmcgZm9yIGxvb3ApLAorICAgICAgICAgICAgICAgYSB3b3JrZXIgdGhyZWFkIG1heSBub3QgYXNzdW1lIHRoYXQgdGhlIHRlYW0gaXMgdmFsaWQgYW55IG1vcmUgLSBpdCBjb3VsZCBiZQorICAgICAgICAgICAgICAgZGVhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciB0aHJlYWQgYXQgYW55IHRpbWUuICAqLworICAgICAgICAgICAgcF9mbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1twYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBwX2ZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICAvLyBQYXJlbnQgdGhyZWFkcyB3YWl0IGZvciBjaGlsZHJlbiB0byBhcnJpdmUKKyAgICAgICAgaWYgKG5ld19zdGF0ZSA9PSBLTVBfQkFSUklFUl9VTlVTRURfU1RBVEUpCisgICAgICAgICAgICBuZXdfc3RhdGUgPSB0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQgKyBLTVBfQkFSUklFUl9TVEFURV9CVU1QOworICAgICAgICBmb3IgKGNoaWxkPTEsIGNoaWxkX3RpZD10aWQrKDEgPDwgbGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxIDw8IGxldmVsKSkKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqY2hpbGRfdGhyID0gb3RoZXJfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbmV4dF9jaGlsZF90aWQgPSBjaGlsZF90aWQgKyAoMSA8PCBsZXZlbCk7CisgICAgICAgICAgICAvLyBQcmVmZXRjaCBuZXh0IHRocmVhZCdzIGFycml2ZWQgY291bnQKKyAgICAgICAgICAgIGlmIChjaGlsZCsxIDwgYnJhbmNoX2ZhY3RvciAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorICAgICAgICAgICAgICAgIEtNUF9DQUNIRV9QUkVGRVRDSCgmb3RoZXJfdGhyZWFkc1tuZXh0X2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmIuYl9hcnJpdmVkKTsKKyNlbmRpZiAvKiBLTVBfQ0FDSEVfTUFOQUdFICovCisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgd2FpdCBUIyVkKCVkOiV1KSAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLCBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLCB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpKTsKKyAgICAgICAgICAgIC8vIFdhaXQgZm9yIGNoaWxkIHRvIGFycml2ZQorICAgICAgICAgICAga21wX2ZsYWdfNjQgY19mbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgIGNfZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgICAgIC8vIEJhcnJpZXIgaW1iYWxhbmNlIC0gd3JpdGUgbWluIG9mIHRoZSB0aHJlYWQgdGltZSBhbmQgYSBjaGlsZCB0aW1lIHRvIHRoZSB0aHJlYWQuCisgICAgICAgICAgICBpZiAoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUgPSBLTVBfTUlOKHRoaXNfdGhyLT50aC50aF9iYXJfbWluX3RpbWUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfdGhyLT50aC50aF9iYXJfbWluX3RpbWUpOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiV1KVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICAvLyBOZWVkIHRvIHVwZGF0ZSB0aGUgdGVhbSBhcnJpdmVkIHBvaW50ZXIgaWYgd2UgYXJlIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIGlmIChuZXdfc3RhdGUgPT0gS01QX0JBUlJJRVJfVU5VU0VEX1NUQVRFKQorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICs9IEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHNldCB0ZWFtICVkIGFycml2ZWQoJXApID0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgdGVhbS0+dC50X2lkLAorICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfYmFyW2J0XS5iX2Fycml2ZWQsIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCkpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIFRoZSByZXZlcnNlIHZlcnNpb25zIHNlZW0gdG8gYmVhdCB0aGUgZm9yd2FyZCB2ZXJzaW9ucyBvdmVyYWxsCisjZGVmaW5lIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorc3RhdGljIHZvaWQKK19fa21wX2h5cGVyX2JhcnJpZXJfcmVsZWFzZShlbnVtIGJhcnJpZXJfdHlwZSBidCwga21wX2luZm9fdCAqdGhpc190aHIsIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKml0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaHlwZXJfcmVsZWFzZSk7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAgICAqdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgICp0aHJfYmFyICAgICAgID0gJiB0aGlzX3RociAtPiB0aC50aF9iYXJbIGJ0IF0uYmI7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBudW1fdGhyZWFkczsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBicmFuY2hfYml0cyAgID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBidCBdOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGJyYW5jaF9mYWN0b3IgPSAxIDw8IGJyYW5jaF9iaXRzOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgIGNoaWxkX3RpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICAgICBvZmZzZXQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgICAgbGV2ZWw7CisKKyAgICAvKiBQZXJmb3JtIGEgaHlwZXJjdWJlLWVtYmVkZGVkIHRyZWUgcmVsZWFzZSBmb3IgYWxsIG9mIHRoZSB0aHJlYWRzIHRoYXQgaGF2ZSBiZWVuIGdhdGhlcmVkLgorICAgICAgIElmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUiBpcyBkZWZpbmVkIChkZWZhdWx0KSB0aGUgdGhyZWFkcyBhcmUgcmVsZWFzZWQgaW4gdGhlIHJldmVyc2UKKyAgICAgICBvcmRlciBvZiB0aGUgY29ycmVzcG9uZGluZyBnYXRoZXIsIG90aGVyd2lzZSB0aHJlYWRzIGFyZSByZWxlYXNlZCBpbiB0aGUgc2FtZSBvcmRlci4gKi8KKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBtYXN0ZXIKKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKKyNpZiBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorICAgICAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsgLy8gbWFzdGVyIGFscmVhZHkgaGFzIElDVnMgaW4gZmluYWwgZGVzdGluYXRpb247IGNvcHkKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cyk7CisgICAgICAgIH0KKyNlbmRpZgorICAgIH0KKyAgICBlbHNlICB7IC8vIEhhbmRsZSBmb3JrIGJhcnJpZXIgd29ya2VycyB3aG8gYXJlbid0IHBhcnQgb2YgYSB0ZWFtIHlldAorICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2U6IFQjJWQgd2FpdCBnbyglcCkgPT0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLy8gV2FpdCBmb3IgcGFyZW50IHRocmVhZCB0byByZWxlYXNlIHVzCisgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfZ28sIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApOworICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICgoX19pdHRfc3luY19jcmVhdGVfcHRyICYmIGl0dF9zeW5jX29iaiA9PSBOVUxMKSB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBJbiBmb3JrIGJhcnJpZXIgd2hlcmUgd2UgY291bGQgbm90IGdldCB0aGUgb2JqZWN0IHJlbGlhYmx5CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllciwgMCwgLTEpOworICAgICAgICAgICAgLy8gQ2FuY2VsIHdhaXQgb24gcHJldmlvdXMgcGFyYWxsZWwgcmVnaW9uLi4uCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza19zdGFydGluZyhpdHRfc3luY19vYmopOworCisgICAgICAgICAgICBpZiAoYnQgPT0gYnNfZm9ya2pvaW5fYmFycmllciAmJiBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKQorICAgICAgICAgICAgICAgIHJldHVybjsKKworICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIpOworICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaiAhPSBOVUxMKQorICAgICAgICAgICAgICAgIC8vIENhbGwgcHJlcGFyZSBhcyBlYXJseSBhcyBwb3NzaWJsZSBmb3IgIm5ldyIgYmFycmllcgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkKGl0dF9zeW5jX29iaik7CisgICAgICAgIH0gZWxzZQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgLy8gRWFybHkgZXhpdCBmb3IgcmVhcGluZyB0aHJlYWRzIHJlbGVhc2luZyBmb3Jram9pbiBiYXJyaWVyCisgICAgICAgIGlmIChidCA9PSBic19mb3Jram9pbl9iYXJyaWVyICYmIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpCisgICAgICAgICAgICByZXR1cm47CisKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBUQ1dfNCh0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKyAgICBudW1fdGhyZWFkcyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIG90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKworI2lmZGVmIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgIC8vIENvdW50IHVwIHRvIGNvcnJlY3QgbGV2ZWwgZm9yIHBhcmVudAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkcyAmJiAoKCh0aWQ+PmxldmVsKSAmIChicmFuY2hfZmFjdG9yLTEpKSA9PSAwKTsKKyAgICAgICAgIGxldmVsKz1icmFuY2hfYml0cywgb2Zmc2V0PDw9YnJhbmNoX2JpdHMpOworCisgICAgLy8gTm93IGdvIGRvd24gZnJvbSB0aGVyZQorICAgIGZvciAobGV2ZWwtPWJyYW5jaF9iaXRzLCBvZmZzZXQ+Pj1icmFuY2hfYml0czsgb2Zmc2V0ICE9IDA7CisgICAgICAgICBsZXZlbC09YnJhbmNoX2JpdHMsIG9mZnNldD4+PWJyYW5jaF9iaXRzKQorI2Vsc2UKKyAgICAvLyBHbyBkb3duIHRoZSB0cmVlLCBsZXZlbCBieSBsZXZlbAorICAgIGZvciAobGV2ZWw9MCwgb2Zmc2V0PTE7IG9mZnNldDxudW1fdGhyZWFkczsgbGV2ZWwrPWJyYW5jaF9iaXRzLCBvZmZzZXQ8PD1icmFuY2hfYml0cykKKyNlbmRpZiAvLyBLTVBfUkVWRVJTRV9IWVBFUl9CQVIKKyAgICB7CisjaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIC8qIE5vdyBnbyBpbiByZXZlcnNlIG9yZGVyIHRocm91Z2ggdGhlIGNoaWxkcmVuLCBoaWdoZXN0IHRvIGxvd2VzdC4KKyAgICAgICAgICAgSW5pdGlhbCBzZXR0aW5nIG9mIGNoaWxkIGlzIGNvbnNlcnZhdGl2ZSBoZXJlLiAqLworICAgICAgICBjaGlsZCA9IG51bV90aHJlYWRzID4+ICgobGV2ZWw9PTApP2xldmVsOmxldmVsLTEpOworICAgICAgICBmb3IgKGNoaWxkPShjaGlsZDxicmFuY2hfZmFjdG9yLTEpID8gY2hpbGQgOiBicmFuY2hfZmFjdG9yLTEsIGNoaWxkX3RpZD10aWQrKGNoaWxkPDxsZXZlbCk7CisgICAgICAgICAgICAgY2hpbGQ+PTE7IGNoaWxkLS0sIGNoaWxkX3RpZC09KDE8PGxldmVsKSkKKyNlbHNlCisgICAgICAgIGlmICgoKHRpZCA+PiBsZXZlbCkgJiAoYnJhbmNoX2ZhY3RvciAtIDEpKSAhPSAwKQorICAgICAgICAgICAgLy8gTm8gbmVlZCB0byBnbyBsb3dlciB0aGFuIHRoaXMsIHNpbmNlIHRoaXMgaXMgdGhlIGxldmVsIHBhcmVudCB3b3VsZCBiZSBub3RpZmllZAorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIC8vIEl0ZXJhdGUgdGhyb3VnaCBjaGlsZHJlbiBvbiB0aGlzIGxldmVsIG9mIHRoZSB0cmVlCisgICAgICAgIGZvciAoY2hpbGQ9MSwgY2hpbGRfdGlkPXRpZCsoMTw8bGV2ZWwpOyBjaGlsZDxicmFuY2hfZmFjdG9yICYmIGNoaWxkX3RpZDxudW1fdGhyZWFkczsKKyAgICAgICAgICAgICBjaGlsZCsrLCBjaGlsZF90aWQrPSgxPDxsZXZlbCkpCisjZW5kaWYgLy8gS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmIChjaGlsZF90aWQgPj0gbnVtX3RocmVhZHMpIGNvbnRpbnVlOyAgLy8gQ2hpbGQgZG9lc24ndCBleGlzdCBzbyBrZWVwIGdvaW5nCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfdWludDMyIG5leHRfY2hpbGRfdGlkID0gY2hpbGRfdGlkIC0gKDEgPDwgbGV2ZWwpOworICAgICAgICAgICAgICAgIC8vIFByZWZldGNoIG5leHQgdGhyZWFkJ3MgZ28gY291bnQKKyMgaWZkZWYgS01QX1JFVkVSU0VfSFlQRVJfQkFSCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkLTEgPj0gMSAmJiBuZXh0X2NoaWxkX3RpZCA8IG51bV90aHJlYWRzKQorIyBlbHNlCisgICAgICAgICAgICAgICAgaWYgKGNoaWxkKzEgPCBicmFuY2hfZmFjdG9yICYmIG5leHRfY2hpbGRfdGlkIDwgbnVtX3RocmVhZHMpCisjIGVuZGlmIC8vIEtNUF9SRVZFUlNFX0hZUEVSX0JBUgorICAgICAgICAgICAgICAgICAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goJm90aGVyX3RocmVhZHNbbmV4dF9jaGlsZF90aWRdLT50aC50aF9iYXJbYnRdLmJiLmJfZ28pOworI2VuZGlmIC8qIEtNUF9DQUNIRV9NQU5BR0UgKi8KKworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgICAgICAgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzKSAvLyBwdXNoIG15IGZpeGVkIElDVnMgdG8gbXkgY2hpbGQKKyAgICAgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZjaGlsZF9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVTSAorCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmcgVCMlZCglZDoldSkiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiZ28oJXApOiAldSA9PiAldVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksIHRlYW0tPnQudF9pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgIC8vIFJlbGVhc2UgY2hpbGQgZnJvbSBiYXJyaWVyCisgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgaWYgKHByb3BhZ2F0ZV9pY3ZzICYmICFLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGNvcHkgSUNWcyBsb2NhbGx5IHRvIGZpbmFsIGRlc3QKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisgICAgfQorI2VuZGlmCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBleGl0IGZvciBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgYnQpKTsKK30KKworLy8gSGllcmFyY2hpY2FsIEJhcnJpZXIKKworLy8gSW5pdGlhbGl6ZSB0aHJlYWQgYmFycmllciBkYXRhCisvKiBJbml0aWFsaXplcy9yZS1pbml0aWFsaXplcyB0aGUgaGllcmFyY2hpY2FsIGJhcnJpZXIgZGF0YSBzdG9yZWQgb24gYSB0aHJlYWQuICBQZXJmb3JtcyB0aGUKKyAgIG1pbmltdW0gYW1vdW50IG9mIGluaXRpYWxpemF0aW9uIHJlcXVpcmVkIGJhc2VkIG9uIGhvdyB0aGUgdGVhbSBoYXMgY2hhbmdlZC4gIFJldHVybnMgdHJ1ZSBpZgorICAgbGVhZiBjaGlsZHJlbiB3aWxsIHJlcXVpcmUgYm90aCBvbi1jb3JlIGFuZCB0cmFkaXRpb25hbCB3YWtlLXVwIG1lY2hhbmlzbXMuICBGb3IgZXhhbXBsZSwgaWYgdGhlCisgICB0ZWFtIHNpemUgaW5jcmVhc2VzLCB0aHJlYWRzIGFscmVhZHkgaW4gdGhlIHRlYW0gd2lsbCByZXNwb25kIHRvIG9uLWNvcmUgd2FrZXVwIG9uIHRoZWlyIHBhcmVudAorICAgdGhyZWFkLCBidXQgdGhyZWFkcyBuZXdseSBhZGRlZCB0byB0aGUgdGVhbSB3aWxsIG9ubHkgYmUgbGlzdGVuaW5nIG9uIHRoZSB0aGVpciBsb2NhbCBiX2dvLiAqLworc3RhdGljIGJvb2wKK19fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfYnN0YXRlX3QgKnRocl9iYXIsIGttcF91aW50MzIgbnByb2MsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwga21wX3RlYW1fdCAqdGVhbSkKK3sKKyAgICAvLyBDaGVja3MgdG8gZGV0ZXJtaW5lIGlmIChyZS0paW5pdGlhbGl6YXRpb24gaXMgbmVlZGVkCisgICAgYm9vbCB1bmluaXRpYWxpemVkID0gdGhyX2Jhci0+dGVhbSA9PSBOVUxMOworICAgIGJvb2wgdGVhbV9jaGFuZ2VkID0gdGVhbSAhPSB0aHJfYmFyLT50ZWFtOworICAgIGJvb2wgdGVhbV9zel9jaGFuZ2VkID0gbnByb2MgIT0gdGhyX2Jhci0+bnByb2M7CisgICAgYm9vbCB0aWRfY2hhbmdlZCA9IHRpZCAhPSB0aHJfYmFyLT5vbGRfdGlkOworICAgIGJvb2wgcmV0dmFsID0gZmFsc2U7CisKKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQpIHsKKyAgICAgICAgX19rbXBfZ2V0X2hpZXJhcmNoeShucHJvYywgdGhyX2Jhcik7CisgICAgfQorCisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9zel9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gdGhyX2Jhci0+ZGVwdGgtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIHRocl9iYXItPnBhcmVudF90aWQgPSAtMTsgLy8gZGVmYXVsdCBmb3IgbWFzdGVyCisgICAgICAgIGlmICghS01QX01BU1RFUl9USUQodGlkKSkgeyAvLyBpZiBub3QgbWFzdGVyLCBmaW5kIHBhcmVudCB0aHJlYWQgaW4gaGllcmFyY2h5CisgICAgICAgICAgICBrbXBfdWludDMyIGQ9MDsKKyAgICAgICAgICAgIHdoaWxlIChkPHRocl9iYXItPmRlcHRoKSB7IC8vIGZpbmQgcGFyZW50IGJhc2VkIG9uIGxldmVsIG9mIHRocmVhZCBpbiBoaWVyYXJjaHksIGFuZCBub3RlIGxldmVsCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiByZW07CisgICAgICAgICAgICAgICAgaWYgKGQgPT0gdGhyX2Jhci0+ZGVwdGgtMikgeyAvLyByZWFjaGVkIGxldmVsIHJpZ2h0IGJlbG93IHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+cGFyZW50X3RpZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIHRocl9iYXItPm15X2xldmVsID0gZDsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKChyZW0gPSB0aWQldGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSkgIT0gMCkgeyAvLyBUT0RPOiBjYW4gd2UgbWFrZSB0aGlzIG9wIGZhc3Rlcj8KKyAgICAgICAgICAgICAgICAgICAgLy8gdGhyZWFkIGlzIG5vdCBhIHN1YnRyZWUgcm9vdCBhdCBuZXh0IGxldmVsLCBzbyB0aGlzIGlzIG1heAorICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5wYXJlbnRfdGlkID0gdGlkIC0gcmVtOworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5teV9sZXZlbCA9IGQ7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICArK2Q7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgdGhyX2Jhci0+b2Zmc2V0ID0gNy0odGlkLXRocl9iYXItPnBhcmVudF90aWQtMSk7CisgICAgICAgIHRocl9iYXItPm9sZF90aWQgPSB0aWQ7CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICB0aHJfYmFyLT50ZWFtID0gdGVhbTsKKyAgICAgICAgdGhyX2Jhci0+cGFyZW50X2JhciA9ICZ0ZWFtLT50LnRfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXS0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICB9CisgICAgaWYgKHVuaW5pdGlhbGl6ZWQgfHwgdGVhbV9jaGFuZ2VkIHx8IHRpZF9jaGFuZ2VkKSB7CisgICAgICAgIHRocl9iYXItPnRlYW0gPSB0ZWFtOworICAgICAgICB0aHJfYmFyLT5wYXJlbnRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW3Rocl9iYXItPnBhcmVudF90aWRdLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICByZXR2YWwgPSB0cnVlOworICAgIH0KKyAgICBpZiAodW5pbml0aWFsaXplZCB8fCB0ZWFtX3N6X2NoYW5nZWQgfHwgdGlkX2NoYW5nZWQpIHsKKyAgICAgICAgdGhyX2Jhci0+bnByb2MgPSBucHJvYzsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9raWRzID0gdGhyX2Jhci0+YmFzZV9sZWFmX2tpZHM7CisgICAgICAgIGlmICh0aHJfYmFyLT5teV9sZXZlbCA9PSAwKSB0aHJfYmFyLT5sZWFmX2tpZHM9MDsKKyAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcyAmJiAoa21wX3VpbnQzMil0aWQrdGhyX2Jhci0+bGVhZl9raWRzKzEgPiBucHJvYykKKyAgICAgICAgICAgIHRocl9iYXItPmxlYWZfa2lkcyA9IG5wcm9jIC0gdGlkIC0gMTsKKyAgICAgICAgdGhyX2Jhci0+bGVhZl9zdGF0ZSA9IDA7CisgICAgICAgIGZvciAoaW50IGk9MDsgaTx0aHJfYmFyLT5sZWFmX2tpZHM7ICsraSkgKChjaGFyICopJih0aHJfYmFyLT5sZWFmX3N0YXRlKSlbNy1pXSA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoZW51bSBiYXJyaWVyX3R5cGUgYnQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLCB2b2lkICgqcmVkdWNlKSAodm9pZCAqLCB2b2lkICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfaGllcl9nYXRoZXIpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKnRocl9iYXIgPSAmIHRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgIHJlZ2lzdGVyIGttcF91aW50NjQgbmV3X3N0YXRlOworCisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKG90aGVyX3RocmVhZHNbMF0tPnRoLnRoX3RlYW1zX21pY3JvdGFzaykgICAgLy8gYXJlIHdlIGluc2lkZSB0aGUgdGVhbXMgY29uc3RydWN0PworICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSkKKyAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZW50ZXIgZm9yIGJhcnJpZXIgdHlwZSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBidCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gb3RoZXJfdGhyZWFkc1t0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWRdKTsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBCYXJyaWVyIGltYmFsYW5jZSAtIHNhdmUgYXJyaXZlIHRpbWUgdG8gdGhlIHRocmVhZAorICAgIGlmKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgfHwgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMikgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgIH0KKyNlbmRpZgorCisgICAgKHZvaWQpX19rbXBfaW5pdF9oaWVyYXJjaGljYWxfYmFycmllcl90aHJlYWQoYnQsIHRocl9iYXIsIG5wcm9jLCBndGlkLCB0aWQsIHRlYW0pOworCisgICAgaWYgKHRocl9iYXItPm15X2xldmVsKSB7IC8vIG5vdCBhIGxlYWYgKG15X2xldmVsPT0wIG1lYW5zIGxlYWYpCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbnQzMiBjaGlsZF90aWQ7CisgICAgICAgIG5ld19zdGF0ZSA9IChrbXBfdWludDY0KXRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVA7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmICh0aHJfYmFyLT5sZWFmX2tpZHMpIHsgLy8gRmlyc3QsIHdhaXQgZm9yIGxlYWYgY2hpbGRyZW4gdG8gY2hlY2staW4gb24gbXkgYl9hcnJpdmVkIGZsYWcKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxlYWZfc3RhdGUgPSBLTVBfTUFTVEVSX1RJRCh0aWQpID8gdGhyX2Jhci0+Yl9hcnJpdmVkIHwgdGhyX2Jhci0+bGVhZl9zdGF0ZSA6IHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCB8IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0aW5nIGZvciBsZWFmIGtpZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCkpOworICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgbGVhZl9zdGF0ZSk7CisgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgaWYgKHJlZHVjZSkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMTsgY2hpbGRfdGlkPD10aWQrdGhyX2Jhci0+bGVhZl9raWRzOyArK2NoaWxkX3RpZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgKz0gVCMlZCglZDolZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICgqcmVkdWNlKSh0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEsIG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXS0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICh2b2lkKSBLTVBfVEVTVF9USEVOX0FORDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKikmdGhyX2Jhci0+Yl9hcnJpdmVkLCB+KHRocl9iYXItPmxlYWZfc3RhdGUpKTsgLy8gY2xlYXIgbGVhZl9zdGF0ZSBiaXRzCisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBOZXh0LCB3YWl0IGZvciBoaWdoZXIgbGV2ZWwgY2hpbGRyZW4gb24gZWFjaCBjaGlsZCdzIGJfYXJyaXZlZCBmbGFnCisgICAgICAgICAgICBmb3IgKGttcF91aW50MzIgZD0xOyBkPHRocl9iYXItPm15X2xldmVsOyArK2QpIHsgLy8gZ2F0aGVyIGxvd2VzdCBsZXZlbCB0aHJlYWRzIGZpcnN0LCBidXQgc2tpcCAwCisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV0sIHNraXAgPSB0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFtkXTsKKyAgICAgICAgICAgICAgICBpZiAobGFzdCA+IG5wcm9jKSBsYXN0ID0gbnByb2M7CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGlkK3NraXA7IGNoaWxkX3RpZDwoaW50KWxhc3Q7IGNoaWxkX3RpZCs9c2tpcCkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICpjaGlsZF90aHIgPSBvdGhlcl90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJmNoaWxkX3Roci0+dGgudGhfYmFyW2J0XS5iYjsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSB3YWl0IFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCkgPT0gJWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZChjaGlsZF90aWQsIHRlYW0pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkLCAmY2hpbGRfYmFyLT5iX2Fycml2ZWQsIG5ld19zdGF0ZSkpOworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKTsKKyAgICAgICAgICAgICAgICAgICAgZmxhZy53YWl0KHRoaXNfdGhyLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgICAgICBpZiAocmVkdWNlKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMDAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSArPSBUIyVkKCVkOiVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCkpOworICAgICAgICAgICAgICAgICAgICAgICAgKCpyZWR1Y2UpKHRoaXNfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSwgY2hpbGRfdGhyLT50aC50aF9sb2NhbC5yZWR1Y2VfZGF0YSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7IC8vIEJsb2NrdGltZSBpcyBub3QgaW5maW5pdGUKKyAgICAgICAgICAgIGZvciAoa21wX3VpbnQzMiBkPTA7IGQ8dGhyX2Jhci0+bXlfbGV2ZWw7ICsrZCkgeyAvLyBHYXRoZXIgbG93ZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxhc3QgPSB0aWQrdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZCsxXSwgc2tpcCA9IHRocl9iYXItPnNraXBfcGVyX2xldmVsW2RdOworICAgICAgICAgICAgICAgIGlmIChsYXN0ID4gbnByb2MpIGxhc3QgPSBucHJvYzsKKyAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrc2tpcDsgY2hpbGRfdGlkPChpbnQpbGFzdDsgY2hpbGRfdGlkKz1za2lwKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKmNoaWxkX3RociA9IG90aGVyX3RocmVhZHNbY2hpbGRfdGlkXTsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICpjaGlsZF9iYXIgPSAmY2hpbGRfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpIHdhaXQgVCMlZCglZDolZCkgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJhcnJpdmVkKCVwKSA9PSAlbGx1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBfX2ttcF9ndGlkX2Zyb21fdGlkKGNoaWxkX3RpZCwgdGVhbSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfYXJyaXZlZCwgbmV3X3N0YXRlKSk7CisgICAgICAgICAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJmNoaWxkX2Jhci0+Yl9hcnJpdmVkLCBuZXdfc3RhdGUpOworICAgICAgICAgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgICAgIGlmIChyZWR1Y2UpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXI6IFQjJWQoJWQ6JWQpICs9IFQjJWQoJWQ6JWQpXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgY2hpbGRfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAoKnJlZHVjZSkodGhpc190aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhLCBjaGlsZF90aHItPnRoLnRoX2xvY2FsLnJlZHVjZV9kYXRhKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBBbGwgc3Vib3JkaW5hdGVzIGFyZSBnYXRoZXJlZDsgbm93IHJlbGVhc2UgcGFyZW50IGlmIG5vdCBtYXN0ZXIgdGhyZWFkCisKKyAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gd29ya2VyIHRocmVhZHMgcmVsZWFzZSBwYXJlbnQgaW4gaGllcmFyY2h5CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgcmVsZWFzaW5nIFQjJWQoJWQ6JWQpICIKKyAgICAgICAgICAgICAgICAgICAgICAiYXJyaXZlZCglcCk6ICVsbHUgPT4gJWxsdVxuIiwgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RpZCh0aHJfYmFyLT5wYXJlbnRfdGlkLCB0ZWFtKSwgdGVhbS0+dC50X2lkLCB0aHJfYmFyLT5wYXJlbnRfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPmJfYXJyaXZlZCwgdGhyX2Jhci0+Yl9hcnJpdmVkK0tNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgLyogTWFyayBhcnJpdmFsIHRvIHBhcmVudDogQWZ0ZXIgcGVyZm9ybWluZyB0aGlzIHdyaXRlLCBhIHdvcmtlciB0aHJlYWQgbWF5IG5vdCBhc3N1bWUgdGhhdAorICAgICAgICAgICB0aGUgdGVhbSBpcyB2YWxpZCBhbnkgbW9yZSAtIGl0IGNvdWxkIGJlIGRlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGF0IGFueSB0aW1lLiAqLworICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8ICF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsgLy8gUGFyZW50IGlzIHdhaXRpbmcgb24gbXkgYl9hcnJpdmVkIGZsYWc7IHJlbGVhc2UgaXQKKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocl9iYXItPmJfYXJyaXZlZCwgb3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsgLy8gTGVhZiBkb2VzIHNwZWNpYWwgcmVsZWFzZSBvbiB0aGUgIm9mZnNldCIgYml0cyBvZiBwYXJlbnQncyBiX2Fycml2ZWQgZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+Yl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2Fycml2ZWQsIHRocl9iYXItPm9mZnNldCk7CisgICAgICAgICAgICBmbGFnLnNldF93YWl0ZXIob3RoZXJfdGhyZWFkc1t0aHJfYmFyLT5wYXJlbnRfdGlkXSk7CisgICAgICAgICAgICBmbGFnLnJlbGVhc2UoKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7IC8vIE1hc3RlciB0aHJlYWQgbmVlZHMgdG8gdXBkYXRlIHRoZSB0ZWFtJ3MgYl9hcnJpdmVkIHZhbHVlCisgICAgICAgIHRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCA9IG5ld19zdGF0ZTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyOiBUIyVkKCVkOiVkKSBzZXQgdGVhbSAlZCBhcnJpdmVkKCVwKSA9ICVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIHRlYW0tPnQudF9pZCwgJnRlYW0tPnQudF9iYXJbYnRdLmJfYXJyaXZlZCwgdGVhbS0+dC50X2JhcltidF0uYl9hcnJpdmVkKSk7CisgICAgfQorICAgIC8vIElzIHRoZSB0ZWFtIGFjY2VzcyBiZWxvdyB1bnNhZmUgb3IganVzdCB0ZWNobmljYWxseSBpbnZhbGlkPworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX2dhdGhlcjogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGVudW0gYmFycmllcl90eXBlIGJ0LCBrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGd0aWQsIGludCB0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBwcm9wYWdhdGVfaWN2cworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9oaWVyX3JlbGVhc2UpOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW07CisgICAgcmVnaXN0ZXIga21wX2JzdGF0ZV90ICp0aHJfYmFyID0gJnRoaXNfdGhyLT50aC50aF9iYXJbYnRdLmJiOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgbnByb2M7CisgICAgYm9vbCB0ZWFtX2NoYW5nZSA9IGZhbHNlOyAvLyBpbmRpY2F0ZXMgb24tY29yZSBiYXJyaWVyIHNob3VsZG4ndCBiZSB1c2VkCisKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICB0ZWFtID0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtICE9IE5VTEwpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBtYXN0ZXIgZW50ZXJlZCBiYXJyaWVyIHR5cGUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7CisgICAgfQorICAgIGVsc2UgeyAvLyBXb3JrZXIgdGhyZWFkcworICAgICAgICAvLyBXYWl0IGZvciBwYXJlbnQgdGhyZWFkIHRvIHJlbGVhc2UgbWUKKyAgICAgICAgaWYgKCF0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIgfHwgX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUKKyAgICAgICAgICAgIHx8IHRocl9iYXItPm15X2xldmVsICE9IDAgfHwgdGhyX2Jhci0+dGVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAvLyBVc2UgdHJhZGl0aW9uYWwgbWV0aG9kIG9mIHdhaXRpbmcgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgdGhyX2Jhci0+d2FpdF9mbGFnID0gS01QX0JBUlJJRVJfT1dOX0ZMQUc7CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aHJfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIFRDV184KHRocl9iYXItPmJfZ28sIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUpOyAvLyBSZXNldCBteSBiX2dvIGZsYWcgZm9yIG5leHQgdGltZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBUaHJlYWQgYmFycmllciBkYXRhIGlzIGluaXRpYWxpemVkLCB0aGlzIGlzIGEgbGVhZiwgYmxvY2t0aW1lIGlzIGluZmluaXRlLCBub3QgbmVzdGVkCisgICAgICAgICAgICAvLyBXYWl0IG9uIG15ICJvZmZzZXQiIGJpdHMgb24gcGFyZW50J3MgYl9nbyBmbGFnCisgICAgICAgICAgICB0aHJfYmFyLT53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRzsKKyAgICAgICAgICAgIGttcF9mbGFnX29uY29yZSBmbGFnKCZ0aHJfYmFyLT5wYXJlbnRfYmFyLT5iX2dvLCBLTVBfQkFSUklFUl9TVEFURV9CVU1QLCB0aHJfYmFyLT5vZmZzZXQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidCwgdGhpc190aHIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGZsYWcud2FpdCh0aGlzX3RociwgVFJVRSk7CisgICAgICAgICAgICBpZiAodGhyX2Jhci0+d2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1NXSVRDSElORykgeyAvLyBUaHJlYWQgd2FzIHN3aXRjaGVkIHRvIG93biBiX2dvCisgICAgICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsgLy8gUmVzZXQgbXkgYml0cyBvbiBwYXJlbnQncyBiX2dvIGZsYWcKKyAgICAgICAgICAgICAgICAoKGNoYXIqKSYodGhyX2Jhci0+cGFyZW50X2Jhci0+Yl9nbykpW3Rocl9iYXItPm9mZnNldF0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHRocl9iYXItPndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICAgICAgaWYgKGJ0ID09IGJzX2Zvcmtqb2luX2JhcnJpZXIgJiYgVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWQgbWF5IG5vdyBhc3N1bWUgdGhhdCB0aGUgdGVhbSBpcyB2YWxpZC4KKyAgICAgICAgdGVhbSA9IF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW07CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbSAhPSBOVUxMKTsKKyAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSBzZXQgZ28oJXApID0gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsICZ0aHJfYmFyLT5iX2dvLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFKSk7CisgICAgICAgIEtNUF9NQigpOyAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgIH0KKworICAgIG5wcm9jID0gdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2M7CisgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgIC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgaWYgKHRlYW0tPnQudF9wa2ZuICE9IChtaWNyb3Rhc2tfdClfX2ttcF90ZWFtc19tYXN0ZXIgJiYgdGhpc190aHItPnRoLnRoX3RlYW1zX2xldmVsID09IGxldmVsKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX3dvcmtlcnMKKyAgICAgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+IDEgKQorICAgICAgICAgICAgKytsZXZlbDsgLy8gbGV2ZWwgd2FzIG5vdCBpbmNyZWFzZWQgaW4gdGVhbXMgY29uc3RydWN0IGZvciB0ZWFtX29mX21hc3RlcnMKKyAgICB9CisjZW5kaWYKKyAgICBpZiAobGV2ZWwgPT0gMSkgdGhyX2Jhci0+dXNlX29uY29yZV9iYXJyaWVyID0gMTsKKyAgICBlbHNlIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllciA9IDA7IC8vIERvIG5vdCB1c2Ugb25jb3JlIGJhcnJpZXIgd2hlbiBuZXN0ZWQKKworICAgIC8vIElmIHRoZSB0ZWFtIHNpemUgaGFzIGluY3JlYXNlZCwgd2Ugc3RpbGwgY29tbXVuaWNhdGUgd2l0aCBvbGQgbGVhdmVzIHZpYSBvbmNvcmUgYmFycmllci4KKyAgICB1bnNpZ25lZCBzaG9ydCBpbnQgb2xkX2xlYWZfa2lkcyA9IHRocl9iYXItPmxlYWZfa2lkczsKKyAgICBrbXBfdWludDY0IG9sZF9sZWFmX3N0YXRlID0gdGhyX2Jhci0+bGVhZl9zdGF0ZTsKKyAgICB0ZWFtX2NoYW5nZSA9IF9fa21wX2luaXRfaGllcmFyY2hpY2FsX2JhcnJpZXJfdGhyZWFkKGJ0LCB0aHJfYmFyLCBucHJvYywgZ3RpZCwgdGlkLCB0ZWFtKTsKKyAgICAvLyBCdXQgaWYgdGhlIGVudGlyZSB0ZWFtIGNoYW5nZXMsIHdlIHdvbid0IHVzZSBvbmNvcmUgYmFycmllciBhdCBhbGwKKyAgICBpZiAodGVhbV9jaGFuZ2UpIG9sZF9sZWFmX2tpZHMgPSAwOworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICBpZiAocHJvcGFnYXRlX2ljdnMpIHsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIG1hc3RlciBhbHJlYWR5IGhhcyBjb3B5IGluIGZpbmFsIGRlc3RpbmF0aW9uOyBjb3B5CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRocl9iYXItPnVzZV9vbmNvcmVfYmFycmllcikgeyAvLyBvcHRpbWl6YXRpb24gZm9yIGluZiBibG9ja3RpbWUKKyAgICAgICAgICAgIGlmICghdGhyX2Jhci0+bXlfbGV2ZWwpIC8vIEknbSBhIGxlYWYgaW4gdGhlIGhpZXJhcmNoeSAobXlfbGV2ZWw9PTApCisgICAgICAgICAgICAgICAgLy8gbGVhdmVzIChvbi1jb3JlIGNoaWxkcmVuKSBwdWxsIHBhcmVudCdzIGZpeGVkIElDVnMgZGlyZWN0bHkgdG8gbG9jYWwgSUNWIHN0b3JlCisgICAgICAgICAgICAgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIC8vIG5vbi1sZWF2ZXMgd2lsbCBnZXQgSUNWcyBwaWdneWJhY2tlZCB3aXRoIGJfZ28gdmlhIE5HTyBzdG9yZQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBibG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBwdWxsIElDVnMgZnJvbSBwYXJlbnQncyBmaXhlZCBJQ1ZzCisgICAgICAgICAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIC8vIG5vdCBhIGxlYWY7IGNvcHkgSUNWcyB0byBteSBmaXhlZCBJQ1ZzIGNoaWxkIGNhbiBhY2Nlc3MKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMsICZ0aHJfYmFyLT5wYXJlbnRfYmFyLT50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgICAgIGVsc2UgLy8gbGVhdmVzIGNvcHkgcGFyZW50J3MgZml4ZWQgSUNWcyBkaXJlY3RseSB0byBsb2NhbCBJQ1Ygc3RvcmUKKyAgICAgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgJnRocl9iYXItPnBhcmVudF9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8vIEtNUF9CQVJSSUVSX0lDVl9QVVNICisKKyAgICAvLyBOb3csIHJlbGVhc2UgbXkgY2hpbGRyZW4KKyAgICBpZiAodGhyX2Jhci0+bXlfbGV2ZWwpIHsgLy8gbm90IGEgbGVhZgorICAgICAgICByZWdpc3RlciBrbXBfaW50MzIgY2hpbGRfdGlkOworICAgICAgICBrbXBfdWludDMyIGxhc3Q7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSAmJiB0aHJfYmFyLT51c2Vfb25jb3JlX2JhcnJpZXIpIHsKKyAgICAgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpKSB7IC8vIGRvIGEgZmxhdCByZWxlYXNlCisgICAgICAgICAgICAgICAgLy8gU2V0IGxvY2FsIGJfZ28gdG8gYnVtcCBjaGlsZHJlbiB2aWEgTkdPIHN0b3JlIG9mIHRoZSBjYWNoZSBsaW5lIGNvbnRhaW5pbmcgSVZDcyBhbmQgYl9nby4KKyAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvID0gS01QX0JBUlJJRVJfU1RBVEVfQlVNUDsKKyAgICAgICAgICAgICAgICAvLyBVc2UgbmdvIHN0b3JlcyBpZiBhdmFpbGFibGU7IGJfZ28gcGlnZ3liYWNrcyBpbiB0aGUgbGFzdCA4IGJ5dGVzIG9mIHRoZSBjYWNoZSBsaW5lCisgICAgICAgICAgICAgICAgbmdvX2xvYWQoJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIC8vIFRoaXMgbG9vcHMgb3ZlciBhbGwgdGhlIHRocmVhZHMgc2tpcHBpbmcgb25seSB0aGUgbGVhZiBub2RlcyBpbiB0aGUgaGllcmFyY2h5CisgICAgICAgICAgICAgICAgZm9yIChjaGlsZF90aWQ9dGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbMV07IGNoaWxkX3RpZDwoaW50KW5wcm9jOyBjaGlsZF90aWQrPXRocl9iYXItPnNraXBfcGVyX2xldmVsWzFdKSB7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIGttcF9ic3RhdGVfdCAqY2hpbGRfYmFyID0gJnRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF0tPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVXNlIG5nbyBzdG9yZSAoaWYgYXZhaWxhYmxlKSB0byBib3RoIHN0b3JlIElDVnMgYW5kIHJlbGVhc2UgY2hpbGQgdmlhIGNoaWxkJ3MgYl9nbworICAgICAgICAgICAgICAgICAgICBuZ29fc3RvcmVfZ28oJmNoaWxkX2Jhci0+dGhfZml4ZWRfaWN2cywgJnRocl9iYXItPnRoX2ZpeGVkX2ljdnMpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBuZ29fc3luYygpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgVENXXzgodGhyX2Jhci0+Yl9nbywgS01QX0lOSVRfQkFSUklFUl9TVEFURSk7IC8vIFJlc2V0IG15IGJfZ28gZmxhZyBmb3IgbmV4dCB0aW1lCisgICAgICAgICAgICAvLyBOb3csIHJlbGVhc2UgbGVhZiBjaGlsZHJlbgorICAgICAgICAgICAgaWYgKHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBpZiB0aGVyZSBhcmUgYW55CisgICAgICAgICAgICAgICAgLy8gV2UgdGVzdCB0ZWFtX2NoYW5nZSBvbiB0aGUgb2ZmLWNoYW5jZSB0aGF0IHRoZSBsZXZlbCAxIHRlYW0gY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBpZiAodGVhbV9jaGFuZ2UgfHwgb2xkX2xlYWZfa2lkcyA8IHRocl9iYXItPmxlYWZfa2lkcykgeyAvLyBzb21lIG9sZCBsZWFmX2tpZHMsIHNvbWUgbmV3CisgICAgICAgICAgICAgICAgICAgIGlmIChvbGRfbGVhZl9raWRzKSB7IC8vIHJlbGVhc2Ugb2xkIGxlYWYga2lkcworICAgICAgICAgICAgICAgICAgICAgICAgdGhyX2Jhci0+Yl9nbyB8PSBvbGRfbGVhZl9zdGF0ZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvLyBSZWxlYXNlIG5ldyBsZWFmIGtpZHMKKyAgICAgICAgICAgICAgICAgICAgbGFzdCA9IHRpZCt0aHJfYmFyLT5za2lwX3Blcl9sZXZlbFsxXTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgICAgICBmb3IgKGNoaWxkX3RpZD10aWQrMStvbGRfbGVhZl9raWRzOyBjaGlsZF90aWQ8KGludClsYXN0OyArK2NoaWxkX3RpZCkgeyAvLyBza2lwX3Blcl9sZXZlbFswXT0xCisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfaW5mb190ICAgKmNoaWxkX3RociA9IHRlYW0tPnQudF90aHJlYWRzW2NoaWxkX3RpZF07CisgICAgICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlOiBUIyVkKCVkOiVkKSByZWxlYXNpbmciCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgVCMlZCglZDolZCkgZ28oJXApOiAldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBjaGlsZF90aWQsICZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX2Jhci0+Yl9nbywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hpbGRfYmFyLT5iX2dvICsgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCkpOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZsYWdfNjQgZmxhZygmY2hpbGRfYmFyLT5iX2dvLCBjaGlsZF90aHIpOworICAgICAgICAgICAgICAgICAgICAgICAgZmxhZy5yZWxlYXNlKCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7IC8vIFJlbGVhc2UgYWxsIGNoaWxkcmVuIGF0IG9uY2Ugd2l0aCBsZWFmX3N0YXRlIGJpdHMgb24gbXkgb3duIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICB0aHJfYmFyLT5iX2dvIHw9IHRocl9iYXItPmxlYWZfc3RhdGU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBCbG9ja3RpbWUgaXMgbm90IGluZmluaXRlOyBkbyBhIHNpbXBsZSBoaWVyYXJjaGljYWwgcmVsZWFzZQorICAgICAgICAgICAgZm9yIChpbnQgZD10aHJfYmFyLT5teV9sZXZlbC0xOyBkPj0wOyAtLWQpIHsgLy8gUmVsZWFzZSBoaWdoZXN0IGxldmVsIHRocmVhZHMgZmlyc3QKKyAgICAgICAgICAgICAgICBsYXN0ID0gdGlkK3Rocl9iYXItPnNraXBfcGVyX2xldmVsW2QrMV07CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBza2lwID0gdGhyX2Jhci0+c2tpcF9wZXJfbGV2ZWxbZF07CisgICAgICAgICAgICAgICAgaWYgKGxhc3QgPiBucHJvYykgbGFzdCA9IG5wcm9jOworICAgICAgICAgICAgICAgIGZvciAoY2hpbGRfdGlkPXRpZCtza2lwOyBjaGlsZF90aWQ8KGludClsYXN0OyBjaGlsZF90aWQrPXNraXApIHsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIga21wX2luZm9fdCAgICpjaGlsZF90aHIgPSB0ZWFtLT50LnRfdGhyZWFkc1tjaGlsZF90aWRdOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBrbXBfYnN0YXRlX3QgKmNoaWxkX2JhciA9ICZjaGlsZF90aHItPnRoLnRoX2JhcltidF0uYmI7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2U6IFQjJWQoJWQ6JWQpIHJlbGVhc2luZyBUIyVkKCVkOiVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIGdvKCVwKTogJXUgPT4gJXVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIF9fa21wX2d0aWRfZnJvbV90aWQoY2hpbGRfdGlkLCB0ZWFtKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIGNoaWxkX3RpZCwgJmNoaWxkX2Jhci0+Yl9nbywgY2hpbGRfYmFyLT5iX2dvLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoaWxkX2Jhci0+Yl9nbyArIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVApKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gUmVsZWFzZSBjaGlsZCB1c2luZyBjaGlsZCdzIGJfZ28gZmxhZworICAgICAgICAgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZjaGlsZF9iYXItPmJfZ28sIGNoaWxkX3Rocik7CisgICAgICAgICAgICAgICAgICAgIGZsYWcucmVsZWFzZSgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIEtNUF9CQVJSSUVSX0lDVl9QVVNICisgICAgICAgIGlmIChwcm9wYWdhdGVfaWN2cyAmJiAhS01QX01BU1RFUl9USUQodGlkKSkgLy8gbm9uLWxlYXZlcyBjb3B5IElDVnMgZnJvbSBmaXhlZCBJQ1ZzIHRvIGxvY2FsIGRlc3QKKyAgICAgICAgICAgIGNvcHlfaWN2cygmdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLCAmdGhyX2Jhci0+dGhfZml4ZWRfaWN2cyk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICB9CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfcmVsZWFzZTogVCMlZCglZDolZCkgZXhpdCBmb3IgYmFycmllciB0eXBlICVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIGJ0KSk7Cit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRW5kIG9mIEJhcnJpZXIgQWxnb3JpdGhtcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGRvIGEgYmFycmllci4KKy8qIElmIGlzX3NwbGl0IGlzIHRydWUsIGRvIGEgc3BsaXQgYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHBsYWluIGJhcnJpZXIKKyAgIElmIHJlZHVjZSBpcyBub24tTlVMTCwgZG8gYSBzcGxpdCByZWR1Y3Rpb24gYmFycmllciwgb3RoZXJ3aXNlLCBkbyBhIHNwbGl0IGJhcnJpZXIKKyAgIFJldHVybnMgMCBpZiBtYXN0ZXIgdGhyZWFkLCAxIGlmIHdvcmtlciB0aHJlYWQuICAqLworaW50CitfX2ttcF9iYXJyaWVyKGVudW0gYmFycmllcl90eXBlIGJ0LCBpbnQgZ3RpZCwgaW50IGlzX3NwbGl0LCBzaXplX3QgcmVkdWNlX3NpemUsCisgICAgICAgICAgICAgIHZvaWQgKnJlZHVjZV9kYXRhLCB2b2lkICgqcmVkdWNlKSh2b2lkICosIHZvaWQgKikpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9iYXJyaWVyKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhQTEFJTl9CQVJSSUVSKTsKKyAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGxhaW5fYmFycmllcik7CisgICAgcmVnaXN0ZXIgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgcmVnaXN0ZXIga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIHJlZ2lzdGVyIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICByZWdpc3RlciBpbnQgc3RhdHVzID0gMDsKKyAgICBpZGVudF90ICpsb2MgPSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9pZGVudDsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3Rhc2tfaWRfdCBteV90YXNrX2lkOworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgaGFzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisjaWYgT01QVF9CTEFNRQorICAgICAgICBteV90YXNrX2lkID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICBteV9wYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgIGlmICh0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfc2luZ2xlKSB7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9vdGhlcnNfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2VuZCkoCisgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKSgKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAvLyBJdCBpcyBPSyB0byByZXBvcnQgdGhlIGJhcnJpZXIgc3RhdGUgYWZ0ZXIgdGhlIGJhcnJpZXIgYmVnaW4gY2FsbGJhY2suCisgICAgICAgIC8vIEFjY29yZGluZyB0byB0aGUgT01QVCBzcGVjaWZpY2F0aW9uLCBhIGNvbXBsaWFudCBpbXBsZW1lbnRhdGlvbiBtYXkKKyAgICAgICAgLy8gZXZlbiBkZWxheSByZXBvcnRpbmcgdGhpcyBzdGF0ZSB1bnRpbCB0aGUgYmFycmllciBiZWdpbnMgdG8gd2FpdC4KKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcjsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICghIHRlYW0tPnQudF9zZXJpYWxpemVkKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBUaGlzIHZhbHVlIHdpbGwgYmUgdXNlZCBpbiBpdHQgbm90aWZ5IGV2ZW50cyBiZWxvdy4KKyAgICAgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gTlVMTDsKKyMgaWYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJ0LCAxKTsKKyMgZW5kaWYKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9leHRyYV9iYXJyaWVyKSB7CisgICAgICAgICAgICBfX2ttcF90YXNraW5nX2JhcnJpZXIodGVhbSwgdGhpc190aHIsIGd0aWQpOworICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfYmFycmllcjogVCMlZCglZDolZCkgcGFzdCB0YXNraW5nIGJhcnJpZXJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIF9fa21wX3RlYW1fZnJvbV9ndGlkKGd0aWQpLT50LnRfaWQsIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIENvcHkgdGhlIGJsb2NrdGltZSBpbmZvIHRvIHRoZSB0aHJlYWQsIHdoZXJlIF9fa21wX3dhaXRfdGVtcGxhdGUoKSBjYW4gYWNjZXNzIGl0IHdoZW4KKyAgICAgICAgICAgdGhlIHRlYW0gc3RydWN0IGlzIG5vdCBndWFyYW50ZWVkIHRvIGV4aXN0LiAqLworICAgICAgICAvLyBTZWUgbm90ZSBhYm91dCB0aGUgY29ycmVzcG9uZGluZyBjb2RlIGluIF9fa21wX2pvaW5fYmFycmllcigpIGJlaW5nIHBlcmZvcm1hbmNlLWNyaXRpY2FsLgorICAgICAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFscyA9IHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cy5idF9pbnRlcnZhbHM7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9zZXQgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfc2V0OworICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKGd0aWQsIGl0dF9zeW5jX29iaik7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAvLyBMZXQgdGhlIGRlYnVnZ2VyIGtub3c6IHRoZSB0aHJlYWQgYXJyaXZlZCB0byB0aGUgYmFycmllciBhbmQgd2FpdGluZy4KKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsgLy8gTWFzdGVyIGNvdW50ZXIgaXMgc3RvcmVkIGluIHRlYW0gc3RydWN0dXJlLgorICAgICAgICAgICAgdGVhbS0+dC50X2JhcltidF0uYl9tYXN0ZXJfYXJyaXZlZCArPSAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2JhcltidF0uYmIuYl93b3JrZXJfYXJyaXZlZCArPSAxOworICAgICAgICB9IC8vIGlmCisjZW5kaWYgLyogVVNFX0RFQlVHR0VSICovCisgICAgICAgIGlmIChyZWR1Y2UgIT0gTlVMTCkgeworICAgICAgICAgICAgLy9LTVBfREVCVUdfQVNTRVJUKCBpc19zcGxpdCA9PSBUUlVFICk7ICAvLyAjQzY5OTU2CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwucmVkdWNlX2RhdGEgPSByZWR1Y2VfZGF0YTsKKyAgICAgICAgfQorCisgICAgICAgIGlmIChLTVBfTUFTVEVSX1RJRCh0aWQpICYmIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKQorICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRoaXNfdGhyLCB0ZWFtLCAwKTsgLy8gdXNlIDAgdG8gb25seSBzZXR1cCB0aGUgY3VycmVudCB0ZWFtIGlmIG50aHJlYWRzID4gMQorCisgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybltidF0pIHsKKyAgICAgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdKTsgLy8gZG9uJ3Qgc2V0IGJyYW5jaCBiaXRzIHRvIDA7IHVzZSBsaW5lYXIKKyAgICAgICAgICAgIF9fa21wX2h5cGVyX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICAgICAgX19rbXBfaGllcmFyY2hpY2FsX2JhcnJpZXJfZ2F0aGVyKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCByZWR1Y2UKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnRdKTsgLy8gZG9uJ3Qgc2V0IGJyYW5jaCBiaXRzIHRvIDA7IHVzZSBsaW5lYXIKKyAgICAgICAgICAgIF9fa21wX3RyZWVfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBkZWZhdWx0OiB7CisgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIHJlZHVjZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgICAgIH0KKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgIC8vIExldCB0aGUgZGVidWdnZXIga25vdzogQWxsIHRocmVhZHMgYXJlIGFycml2ZWQgYW5kIHN0YXJ0aW5nIGxlYXZpbmcgdGhlIGJhcnJpZXIuCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2J0XS5iX3RlYW1fYXJyaXZlZCArPSAxOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAvKiBUT0RPOiBJbiBjYXNlIG9mIHNwbGl0IHJlZHVjdGlvbiBiYXJyaWVyLCBtYXN0ZXIgdGhyZWFkIG1heSBzZW5kIGFjcXVpcmVkIGV2ZW50IGVhcmx5LAorICAgICAgICAgICAgICAgYmVmb3JlIHRoZSBmaW5hbCBzdW1tYXRpb24gaW50byB0aGUgc2hhcmVkIHZhcmlhYmxlIGlzIGRvbmUgKGZpbmFsIHN1bW1hdGlvbiBjYW4gYmUgYQorICAgICAgICAgICAgICAgbG9uZyBvcGVyYXRpb24gZm9yIGFycmF5IHJlZHVjdGlvbnMpLiAgKi8KKyAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgLy8gQmFycmllciAtIHJlcG9ydCBmcmFtZSBlbmQgKG9ubHkgaWYgYWN0aXZlX2xldmVsID09IDEpCisgICAgICAgICAgICBpZiAoKF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgfHwgS01QX0lUVF9ERUJVRykgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgJiYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPT0gTlVMTCAmJgorI2VuZGlmCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF91aW50NjQgY3VyX3RpbWUgPSBfX2l0dF9nZXRfdGltZXN0YW1wKCk7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgICAgICBpbnQgaTsKKyAgICAgICAgICAgICAgICBzd2l0Y2goX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUpIHsKKyAgICAgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUsIGN1cl90aW1lLCAwLCBsb2MsIG5wcm9jKTsKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2ZyYW1lX3RpbWUgPSBjdXJfdGltZTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgY2FzZSAyOiAvLyBBQyAyMDE1LTAxLTE5OiBjdXJyZW50bHkgZG9lcyBub3Qgd29yayBmb3IgaGllcmFyY2hpY2FsICh0byBiZSBmaXhlZCkKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfYmFyX21pbl90aW1lLCBjdXJfdGltZSwgMSwgbG9jLCBucHJvYyk7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIGNhc2UgMzoKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9faXR0X21ldGFkYXRhX2FkZF9wdHIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGRlbHRhID0gY3VyX3RpbWUgLSB0aGlzX3Roci0+dGgudGhfYmFyX2Fycml2ZV90aW1lOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2V0IGFycml2ZSB0aW1lIHRvIHplcm8gdG8gYmUgYWJsZSB0byBjaGVjayBpdCBpbiBfX2ttcF9pbnZva2VfdGFzaygpOyB0aGUgc2FtZSBpcyBkb25lIGluc2lkZSB0aGUgbG9vcCBiZWxvdworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBmb3IgKGk9MTsgaTxucHJvYzsgKytpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVsdGEgKz0gKCBjdXJfdGltZSAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfaW1iYWxhbmNlKGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgZGVsdGEsIChrbXBfdWludDY0KSggcmVkdWNlICE9IE5VTEwpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KGd0aWQsIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lLCBjdXJfdGltZSwgMCwgbG9jLCBucHJvYyk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gY3VyX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGF0dXMgPSAxOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIH0KKyAgICAgICAgaWYgKHN0YXR1cyA9PSAxIHx8ICEgaXNfc3BsaXQpIHsKKyAgICAgICAgICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bYnRdKSB7CisgICAgICAgICAgICBjYXNlIGJwX2h5cGVyX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfaHlwZXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVmYXVsdDogeworICAgICAgICAgICAgICAgIF9fa21wX2xpbmVhcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc3luYyh0aGlzX3RociwgdGVhbSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLyogR0VIOiBUT0RPOiBNb3ZlIHRoaXMgdW5kZXIgaWYtY29uZGl0aW9uIGFib3ZlIGFuZCBhbHNvIGluY2x1ZGUgaW4KKyAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoKS4gVGhpcyB3aWxsIG1vcmUgYWNjdXJhdGVseSByZXByZXNlbnQgdGhlIGFjdHVhbCByZWxlYXNlIHRpbWUKKyAgICAgICAgICAgb2YgdGhlIHRocmVhZHMgZm9yIHNwbGl0IGJhcnJpZXJzLiAgKi8KKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfSBlbHNlIHsgLy8gVGVhbSBpcyBzZXJpYWxpemVkLgorICAgICAgICBzdGF0dXMgPSAwOworICAgICAgICBpZiAoX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICAgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gTlVMTDsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnQsIDEpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyhndGlkLCBpdHRfc3luY19vYmopOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyA9PSBUUlVFKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhpc190aHIsIHRlYW0sIDApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgICAgICB9CisjZWxzZQorICAgICAgICAgICAgLy8gVGhlIHRhc2sgdGVhbSBzaG91bGQgYmUgTlVMTCBmb3Igc2VyaWFsaXplZCBjb2RlICh0YXNrcyB3aWxsIGJlIGV4ZWN1dGVkIGltbWVkaWF0ZWx5KQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9PSBOVUxMKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmcgd2l0aCByZXR1cm4gdmFsdWUgJWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2lkLCBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpLCBzdGF0dXMpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX0JMQU1FCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKAorICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIHN0YXR1czsKK30KKworCit2b2lkCitfX2ttcF9lbmRfc3BsaXRfYmFycmllcihlbnVtIGJhcnJpZXJfdHlwZSBidCwgaW50IGd0aWQpCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9lbmRfc3BsaXRfYmFycmllcik7CisgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIGlmICghdGVhbS0+dC50X3NlcmlhbGl6ZWQpIHsKKyAgICAgICAgaWYgKEtNUF9NQVNURVJfR1RJRChndGlkKSkgeworICAgICAgICAgICAgc3dpdGNoIChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVybltidF0pIHsKKyAgICAgICAgICAgIGNhc2UgYnBfaHlwZXJfYmFyOiB7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnRdKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjYXNlIGJwX2hpZXJhcmNoaWNhbF9iYXI6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzW2J0XSk7CisgICAgICAgICAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX3JlbGVhc2UoYnQsIHRoaXNfdGhyLCBndGlkLCB0aWQsIEZBTFNFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlKGJ0LCB0aGlzX3RociwgZ3RpZCwgdGlkLCBGQUxTRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKHRoaXNfdGhyLCB0ZWFtKTsKKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfQorICAgIH0KK30KKworCit2b2lkCitfX2ttcF9qb2luX2JhcnJpZXIoaW50IGd0aWQpCit7CisgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX2Zvcmtfam9pbl9iYXJyaWVyKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhGT1JLX0pPSU5fQkFSUklFUik7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9qb2luX2JhcnJpZXIpOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF91aW50IG5wcm9jOworICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aHJlYWQ7CisgICAgaW50IHRpZDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgdGVhbV9pZDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgdm9pZCAqaXR0X3N5bmNfb2JqID0gTlVMTDsKKyMgaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpIC8vIERvbid0IGNhbGwgcm91dGluZSB3aXRob3V0IG5lZWQKKyAgICAgICAgLy8gR2V0IG9iamVjdCBjcmVhdGVkIGF0IGZvcmtfYmFycmllcgorICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisjIGVuZGlmCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIEtNUF9NQigpOworCisgICAgLy8gR2V0IGN1cnJlbnQgaW5mbworICAgIHRlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICBucHJvYyA9IHRoaXNfdGhyLT50aC50aF90ZWFtX25wcm9jOworICAgIEtNUF9ERUJVR19BU1NFUlQoKGludClucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MpOworICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9pZDsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICBtYXN0ZXJfdGhyZWFkID0gdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyOworI2lmZGVmIEtNUF9ERUJVRworICAgIGlmIChtYXN0ZXJfdGhyZWFkICE9IHRlYW0tPnQudF90aHJlYWRzWzBdKSB7CisgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZSgpOworICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aHJlYWQgPT0gdGVhbS0+dC50X3RocmVhZHNbMF0pOworICAgIEtNUF9NQigpOworCisgICAgLy8gVmVyaWZ5IHN0YXRlCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF90aHJlYWRzICYmIF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgIEtNUF9ERUJVR19BU1NFUlQoVENSX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoVENSX1BUUih0aGlzX3Roci0+dGgudGhfcm9vdCkpOworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHIgPT0gdGVhbS0+dC50X3RocmVhZHNbdGlkXSk7CisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBhcnJpdmVkIGF0IGpvaW4gYmFycmllclxuIiwgZ3RpZCwgdGVhbV9pZCwgdGlkKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpZiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbikpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pKAorICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgfQorI2VuZGlmCisgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcjsKKyNlbmRpZgorCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIpIHsKKyAgICAgICAgX19rbXBfdGFza2luZ19iYXJyaWVyKHRlYW0sIHRoaXNfdGhyLCBndGlkKTsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBwYXN0IHRha2luZyBiYXJyaWVyXG4iLCBndGlkLCB0ZWFtX2lkLCB0aWQpKTsKKyAgICB9CisjIGlmZGVmIEtNUF9ERUJVRworICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkLCBvbGQgdGVhbSA9ICVkLCBvbGQgdGFza190ZWFtID0gJXAsIHRoX3Rhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGVhbV9pZCwgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0sCisgICAgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0pKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRlYW0tPnQudF90YXNrX3RlYW1bdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGVdKTsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgLyogQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGNhbiBhY2Nlc3MgaXQgd2hlbiB0aGUKKyAgICAgICB0ZWFtIHN0cnVjdCBpcyBub3QgZ3VhcmFudGVlZCB0byBleGlzdC4gRG9pbmcgdGhlc2UgbG9hZHMgY2F1c2VzIGEgY2FjaGUgbWlzcyBzbG93cworICAgICAgIGRvd24gRVBDQyBwYXJhbGxlbCBieSAyeC4gQXMgYSB3b3JrYXJvdW5kLCB3ZSBkbyBub3QgcGVyZm9ybSB0aGUgY29weSBpZiBibG9ja3RpbWU9aW5maW5pdGUsCisgICAgICAgc2luY2UgdGhlIHZhbHVlcyBhcmUgbm90IHVzZWQgYnkgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGluIHRoYXQgY2FzZS4gKi8KKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfaW50ZXJ2YWxzID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X2ludGVydmFsczsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKQorICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9zdGFydGluZyhndGlkLCBpdHRfc3luY19vYmopOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIHN3aXRjaCAoX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybltic19mb3Jram9pbl9iYXJyaWVyXSkgeworICAgIGNhc2UgYnBfaHlwZXJfYmFyOiB7CisgICAgICAgIEtNUF9BU1NFUlQoX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfaGllcmFyY2hpY2FsX2JhcjogeworICAgICAgICBfX2ttcF9oaWVyYXJjaGljYWxfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF90cmVlX2JhcjogeworICAgICAgICBLTVBfQVNTRVJUKF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzW2JzX2Zvcmtqb2luX2JhcnJpZXJdKTsKKyAgICAgICAgX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcihic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBOVUxMCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgZGVmYXVsdDogeworICAgICAgICBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgTlVMTAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgIH0KKyAgICB9CisKKyAgICAvKiBGcm9tIHRoaXMgcG9pbnQgb24sIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlIG1heSBiZSBkZWFsbG9jYXRlZCBhdCBhbnkgdGltZSBieSB0aGUKKyAgICAgICBtYXN0ZXIgdGhyZWFkIC0gaXQgaXMgdW5zYWZlIHRvIHJlZmVyZW5jZSBpdCBpbiBhbnkgb2YgdGhlIHdvcmtlciB0aHJlYWRzLiBBbnkgcGVyLXRlYW0KKyAgICAgICBkYXRhIGl0ZW1zIHRoYXQgbmVlZCB0byBiZSByZWZlcmVuY2VkIGJlZm9yZSB0aGUgZW5kIG9mIHRoZSBiYXJyaWVyIHNob3VsZCBiZSBtb3ZlZCB0bworICAgICAgIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0cy4gICovCisgICAgaWYgKEtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3RociwgdGVhbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICB9CisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICAgICAgLy8gSGF2ZSBtYXN0ZXIgdGhyZWFkIGZsYWcgdGhlIHdvcmtlcnMgdG8gaW5kaWNhdGUgdGhleSBhcmUgbm93IHdhaXRpbmcgZm9yCisgICAgICAgIC8vIG5leHQgcGFyYWxsZWwgcmVnaW9uLCBBbHNvIHdha2UgdGhlbSB1cCBzbyB0aGV5IHN3aXRjaCB0aGVpciB0aW1lcnMgdG8gaWRsZS4KKyAgICAgICAgZm9yIChpbnQgaT0wOyBpPHRlYW0tPnQudF9ucHJvYzsgKytpKSB7CisgICAgICAgICAgICBrbXBfaW5mb190KiB0ZWFtX3RocmVhZCA9IHRlYW0tPnQudF90aHJlYWRzW2ldOworICAgICAgICAgICAgaWYgKHRlYW1fdGhyZWFkID09IHRoaXNfdGhyKQorICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgdGVhbV90aHJlYWQtPnRoLnRoX3N0YXRzLT5zZXRJZGxlRmxhZygpOworICAgICAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICYmIHRlYW1fdGhyZWFkLT50aC50aF9zbGVlcF9sb2MgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyKF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGVhbV90aHJlYWQpLCB0ZWFtX3RocmVhZC0+dGgudGhfc2xlZXBfbG9jKTsKKyAgICAgICAgfQorI2VuZGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoX19pdHRfc3luY19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcpCisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyMgaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAvLyBKb2luIGJhcnJpZXIgLSByZXBvcnQgZnJhbWUgZW5kCisgICAgICAgIGlmICgoX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IGN1cl90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgaWRlbnRfdCAqIGxvYyA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBpbnQgbnByb2MgPSB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIGludCBpOworICAgICAgICAgICAgc3dpdGNoKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlKSB7CisgICAgICAgICAgICBjYXNlIDE6CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAyOgorICAgICAgICAgICAgICAgIF9fa21wX2l0dF9mcmFtZV9zdWJtaXQoZ3RpZCwgdGhpc190aHItPnRoLnRoX2Jhcl9taW5fdGltZSwgY3VyX3RpbWUsIDEsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSAzOgorICAgICAgICAgICAgICAgIGlmKCBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJbml0aWFsaXplIHdpdGggbWFzdGVyJ3Mgd2FpdCB0aW1lCisgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgZGVsdGEgPSBjdXJfdGltZSAtIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWU7CisgICAgICAgICAgICAgICAgICAgIC8vIFNldCBhcnJpdmUgdGltZSB0byB6ZXJvIHRvIGJlIGFibGUgdG8gY2hlY2sgaXQgaW4gX19rbXBfaW52b2tlX3Rhc2soKTsgdGhlIHNhbWUgaXMgZG9uZSBpbnNpZGUgdGhlIGxvb3AgYmVsb3cKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIGZvciAoaT0xOyBpPG5wcm9jOyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGRlbHRhICs9ICggY3VyX3RpbWUgLSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcl9hcnJpdmVfdGltZSA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZShndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIGRlbHRhLCAwKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdChndGlkLCB0aGlzX3Roci0+dGgudGhfZnJhbWVfdGltZSwgY3VyX3RpbWUsIDAsIGxvYywgbnByb2MpOworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9mcmFtZV90aW1lID0gY3VyX3RpbWU7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyMgZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgZWxzZSB7CisgICAgICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykKKyAgICAgICAgICAgIF9fa21wX2l0dF9iYXJyaWVyX21pZGRsZShndGlkLCBpdHRfc3luY19vYmopOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9qb2luX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIHNheXMgYWxsICVkIHRlYW0gdGhyZWFkcyBhcnJpdmVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRlYW1faWQsIHRpZCwgbnByb2MpKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvLyBUT0RPIG5vdywgbWFyayB3b3JrZXIgdGhyZWFkcyBhcyBkb25lIHNvIHRoZXkgbWF5IGJlIGRpc2JhbmRlZAorICAgIEtNUF9NQigpOyAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfam9pbl9iYXJyaWVyOiBUIyVkKCVkOiVkKSBsZWF2aW5nXG4iLCBndGlkLCB0ZWFtX2lkLCB0aWQpKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX0JMQU1FCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYmFycmllcl9lbmQpKAorICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gcmV0dXJuIHRvIGRlZmF1bHQgc3RhdGUKKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgIH0KKyNlbmRpZgorfQorCisKKy8vIFRPRE8gcmVsZWFzZSB3b3JrZXIgdGhyZWFkcycgZm9yayBiYXJyaWVycyBhcyB3ZSBhcmUgcmVhZHkgaW5zdGVhZCBvZiBhbGwgYXQgb25jZQordm9pZAorX19rbXBfZm9ya19iYXJyaWVyKGludCBndGlkLCBpbnQgdGlkKQoreworICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9mb3JrX2pvaW5fYmFycmllcik7CisgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soRk9SS19KT0lOX0JBUlJJRVIpOworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfZm9ya19iYXJyaWVyKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9ICh0aWQgPT0gMCkgPyB0aGlzX3Roci0+dGgudGhfdGVhbSA6IE5VTEw7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIHZvaWQgKiBpdHRfc3luY19vYmogPSBOVUxMOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCglZDolZCkgaGFzIGFycml2ZWRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCAodGVhbSAhPSBOVUxMKSA/IHRlYW0tPnQudF9pZCA6IC0xLCB0aWQpKTsKKworICAgIC8vIHRoX3RlYW0gcG9pbnRlciBvbmx5IHZhbGlkIGZvciBtYXN0ZXIgdGhyZWFkIGhlcmUKKyAgICBpZiAoS01QX01BU1RFUl9USUQodGlkKSkgeworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICAvLyBDcmVhdGUgaXR0IGJhcnJpZXIgb2JqZWN0CisgICAgICAgICAgICBpdHRfc3luY19vYmogID0gX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIsIDEpOworICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKGd0aWQsIGl0dF9zeW5jX29iaik7ICAvLyBDYWxsIGFjcXVpcmVkL3JlbGVhc2luZworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWSAqLworCisjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgIHJlZ2lzdGVyIGludCBpOworCisgICAgICAgIC8vIFZlcmlmeSBzdGF0ZQorICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICBmb3IoaT0xOyBpPHRlYW0tPnQudF9ucHJvYzsgKytpKSB7CisgICAgICAgICAgICBLQV9UUkFDRSg1MDAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkOjApIGNoZWNraW5nIFQjJWQoJWQ6JWQpIGZvcmsgZ28gPT0gJXUuXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLmJiLmJfZ28pKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKFRDUl80KG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi5iX2dvKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJiB+KEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFKSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPT0gS01QX0lOSVRfQkFSUklFUl9TVEFURSk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3RlYW0gPT0gdGVhbSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgX19rbXBfdGFza190ZWFtX3NldHVwKHRoaXNfdGhyLCB0ZWFtLCAwKTsgIC8vIDAgaW5kaWNhdGVzIHNldHVwIGN1cnJlbnQgdGFzayB0ZWFtIGlmIG50aHJlYWRzID4gMQorICAgICAgICB9CisKKyAgICAgICAgLyogVGhlIG1hc3RlciB0aHJlYWQgbWF5IGhhdmUgY2hhbmdlZCBpdHMgYmxvY2t0aW1lIGJldHdlZW4gdGhlIGpvaW4gYmFycmllciBhbmQgdGhlCisgICAgICAgICAgIGZvcmsgYmFycmllci4gQ29weSB0aGUgYmxvY2t0aW1lIGluZm8gdG8gdGhlIHRocmVhZCwgd2hlcmUgX19rbXBfd2FpdF90ZW1wbGF0ZSgpIGNhbgorICAgICAgICAgICBhY2Nlc3MgaXQgd2hlbiB0aGUgdGVhbSBzdHJ1Y3QgaXMgbm90IGd1YXJhbnRlZWQgdG8gZXhpc3QuICovCisgICAgICAgIC8vIFNlZSBub3RlIGFib3V0IHRoZSBjb3JyZXNwb25kaW5nIGNvZGUgaW4gX19rbXBfam9pbl9iYXJyaWVyKCkgYmVpbmcgcGVyZm9ybWFuY2UtY3JpdGljYWwKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9idF9pbnRlcnZhbHMgPSB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX2ljdnMuYnRfaW50ZXJ2YWxzOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0ID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9pY3ZzLmJ0X3NldDsKKyAgICAgICAgfQorICAgIH0gLy8gbWFzdGVyCisKKyAgICBzd2l0Y2ggKF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuW2JzX2Zvcmtqb2luX2JhcnJpZXJdKSB7CisgICAgY2FzZSBicF9oeXBlcl9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgICAgICBicmVhazsKKyAgICB9CisgICAgY2FzZSBicF9oaWVyYXJjaGljYWxfYmFyOiB7CisgICAgICAgIF9fa21wX2hpZXJhcmNoaWNhbF9iYXJyaWVyX3JlbGVhc2UoYnNfZm9ya2pvaW5fYmFycmllciwgdGhpc190aHIsIGd0aWQsIHRpZCwgVFJVRQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGNhc2UgYnBfdHJlZV9iYXI6IHsKKyAgICAgICAgS01QX0FTU0VSVChfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbYnNfZm9ya2pvaW5fYmFycmllcl0pOworICAgICAgICBfX2ttcF90cmVlX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKKyAgICAgICAgYnJlYWs7CisgICAgfQorICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgX19rbXBfbGluZWFyX2JhcnJpZXJfcmVsZWFzZShic19mb3Jram9pbl9iYXJyaWVyLCB0aGlzX3RociwgZ3RpZCwgdGlkLCBUUlVFCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSApOworICAgIH0KKyAgICB9CisKKyAgICAvLyBFYXJseSBleGl0IGZvciByZWFwaW5nIHRocmVhZHMgcmVsZWFzaW5nIGZvcmtqb2luIGJhcnJpZXIKKyAgICBpZiAoVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSkgeworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKworI2lmIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAgICAgaWYgKF9faXR0X3N5bmNfY3JlYXRlX3B0ciB8fCBLTVBfSVRUX0RFQlVHKSB7CisgICAgICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICAgICAgaWYgKGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoZ3RpZCwgaXR0X3N5bmNfb2JqKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkIGlzIGxlYXZpbmcgZWFybHlcbiIsIGd0aWQpKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIGNhbiBub3cgYXNzdW1lIHRoYXQgYSB2YWxpZCB0ZWFtIHN0cnVjdHVyZSBoYXMgYmVlbiBhbGxvY2F0ZWQgYnkgdGhlIG1hc3RlciBhbmQKKyAgICAgICBwcm9wYWdhdGVkIHRvIGFsbCB3b3JrZXIgdGhyZWFkcy4gVGhlIGN1cnJlbnQgdGhyZWFkLCBob3dldmVyLCBtYXkgbm90IGJlIHBhcnQgb2YgdGhlCisgICAgICAgdGVhbSwgc28gd2UgY2FuJ3QgYmxpbmRseSBhc3N1bWUgdGhhdCB0aGUgdGVhbSBwb2ludGVyIGlzIG5vbi1udWxsLiAgKi8KKyAgICB0ZWFtID0gKGttcF90ZWFtX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF90ZWFtKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gIT0gTlVMTCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworCisjaWYgS01QX0JBUlJJRVJfSUNWX1BVTEwKKyAgICAvKiBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbgorICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLiBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMKKyAgICAgICB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiBXZSBjYW5ub3QgbW9kaWZ5IF9fa21wX2ZvcmtfY2FsbCgpIHRvIGxvb2sgYXQKKyAgICAgICB0aGUgZml4ZWQgSUNWcyBpbiB0aGUgbWFzdGVyJ3MgdGhyZWFkIHN0cnVjdCwgYmVjYXVzZSBpdCBpcyBub3QgYWx3YXlzIHRoZSBjYXNlIHRoYXQgdGhlCisgICAgICAgdGhyZWFkcyBhcnJheXMgaGF2ZSBiZWVuIGFsbG9jYXRlZCB3aGVuIF9fa21wX2ZvcmtfY2FsbCgpIGlzIGV4ZWN1dGVkLiAqLworICAgIHsKKyAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfaWN2X2NvcHkpOworICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsgIC8vIG1hc3RlciB0aHJlYWQgYWxyZWFkeSBoYXMgSUNWcworICAgICAgICAgICAgLy8gQ29weSB0aGUgaW5pdGlhbCBJQ1ZzIGZyb20gdGhlIG1hc3RlcidzIHRocmVhZCBzdHJ1Y3QgdG8gdGhlIGltcGxpY2l0IHRhc2sgZm9yIHRoaXMgdGlkLgorICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfZm9ya19iYXJyaWVyOiBUIyVkKCVkKSBpcyBQVUxMaW5nIElDVnNcbiIsIGd0aWQsIHRpZCkpOworICAgICAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKHRlYW0tPnQudF9pZGVudCwgdGVhbS0+dC50X3RocmVhZHNbdGlkXSwgdGVhbSwgdGlkLCBGQUxTRSk7CisgICAgICAgICAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfaWN2cywKKyAgICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3RocmVhZHNbMF0tPnRoLnRoX2Jhcltic19mb3Jram9pbl9iYXJyaWVyXS5iYi50aF9maXhlZF9pY3ZzKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfQkFSUklFUl9JQ1ZfUFVMTAorCisgICAgaWYgKF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjKSB7CisgICAgICAgIF9fa21wX3Rhc2tfdGVhbV9zeW5jKHRoaXNfdGhyLCB0ZWFtKTsKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IHRlYW0tPnQudF9wcm9jX2JpbmQ7CisgICAgaWYgKHByb2NfYmluZCA9PSBwcm9jX2JpbmRfaW50ZWwpIHsKKyNlbmRpZgorI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgLy8gQ2FsbCBkeW5hbWljIGFmZmluaXR5IHNldHRpbmdzCisgICAgICAgIGlmKF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfYmFsYW5jZWQgJiYgdGVhbS0+dC50X3NpemVfY2hhbmdlZCkgeworICAgICAgICAgICAgX19rbXBfYmFsYW5jZWRfYWZmaW5pdHkodGlkLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICB9CisjZW5kaWYgLy8gS01QX0FGRklOSVRZX1NVUFBPUlRFRAorI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICB9CisgICAgZWxzZSBpZiAocHJvY19iaW5kICE9IHByb2NfYmluZF9mYWxzZSkgeworICAgICAgICBpZiAodGhpc190aHItPnRoLnRoX25ld19wbGFjZSA9PSB0aGlzX3Roci0+dGgudGhfY3VycmVudF9wbGFjZSkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTAwLCAoIl9fa21wX2ZvcmtfYmFycmllcjogVCMlZCBhbHJlYWR5IGluIGNvcnJlY3QgcGxhY2UgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UpKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9wbGFjZShndGlkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmIChfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRykgeworICAgICAgICBpZiAoIUtNUF9NQVNURVJfVElEKHRpZCkpIHsKKyAgICAgICAgICAgIC8vIEdldCBjb3JyZWN0IGJhcnJpZXIgb2JqZWN0CisgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoZ3RpZCwgYnNfZm9ya2pvaW5fYmFycmllcik7CisgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZChndGlkLCBpdHRfc3luY19vYmopOyAgLy8gV29ya2VycyBjYWxsIGFjcXVpcmVkCisgICAgICAgIH0gLy8gKHByZXBhcmUgY2FsbGVkIGluc2lkZSBiYXJyaWVyX3JlbGVhc2UpCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9mb3JrX2JhcnJpZXI6IFQjJWQoJWQ6JWQpIGlzIGxlYXZpbmdcbiIsIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkKSk7Cit9CisKKwordm9pZAorX19rbXBfc2V0dXBfaWN2X2NvcHkoa21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsIGlkZW50X3QgKmxvYyApCit7CisgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKEtNUF9zZXR1cF9pY3ZfY29weSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0gJiYgbmV3X25wcm9jICYmIG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCghVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpIHx8IG5ld19pY3ZzLT5ucHJvYyk7CisKKyAgICAvKiBNYXN0ZXIgdGhyZWFkJ3MgY29weSBvZiB0aGUgSUNWcyB3YXMgc2V0IHVwIG9uIHRoZSBpbXBsaWNpdCB0YXNrZGF0YSBpbgorICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtLiBfX2ttcF9mb3JrX2NhbGwoKSBhc3N1bWVzIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFzayBoYXMKKyAgICAgICB0aGlzIGRhdGEgYmVmb3JlIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkLiAqLworI2lmIEtNUF9CQVJSSUVSX0lDVl9QVUxMCisgICAgLyogQ29weSBJQ1ZzIHRvIG1hc3RlcidzIHRocmVhZCBzdHJ1Y3R1cmUgaW50byB0aF9maXhlZF9pY3ZzICh3aGljaCByZW1haW5zIHVudG91Y2hlZCksIHdoZXJlCisgICAgICAgYWxsIG9mIHRoZSB3b3JrZXIgdGhyZWFkcyBjYW4gYWNjZXNzIHRoZW0gYW5kIG1ha2UgdGhlaXIgb3duIGNvcGllcyBhZnRlciB0aGUgYmFycmllci4gKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIFRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBjb3B5X2ljdnMoJnRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYmIudGhfZml4ZWRfaWN2cywgbmV3X2ljdnMpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX3NldHVwX2ljdl9jb3B5OiBQVUxMOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSkpOworI2VsaWYgS01QX0JBUlJJRVJfSUNWX1BVU0gKKyAgICAvLyBUaGUgSUNWcyB3aWxsIGJlIHByb3BhZ2F0ZWQgaW4gdGhlIGZvcmsgYmFycmllciwgc28gbm90aGluZyBuZWVkcyB0byBiZSBkb25lIGhlcmUuCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IFBVU0g6IFQjJWQgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIDAsIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtKSk7CisjZWxzZQorICAgIC8vIENvcHkgdGhlIElDVnMgdG8gZWFjaCBvZiB0aGUgbm9uLW1hc3RlciB0aHJlYWRzLiAgVGhpcyB0YWtlcyBPKG50aHJlYWRzKSB0aW1lLgorICAgIG5nb19sb2FkKG5ld19pY3ZzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRlYW0tPnQudF90aHJlYWRzWzBdKTsgIC8vIFRoZSB0aHJlYWRzIGFycmF5cyBzaG91bGQgYmUgYWxsb2NhdGVkIGF0IHRoaXMgcG9pbnQKKyAgICBmb3IgKGludCBmPTE7IGY8bmV3X25wcm9jOyArK2YpIHsgLy8gU2tpcCB0aGUgbWFzdGVyIHRocmVhZAorICAgICAgICAvLyBUT0RPOiBHRUggLSBwYXNzIGluIGJldHRlciBzb3VyY2UgbG9jYXRpb24gaW5mbyBzaW5jZSB1c3VhbGx5IE5VTEwgaGVyZQorICAgICAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9zZXR1cF9pY3ZfY29weTogTElORUFSOiBUIyVkIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZiwgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0pKTsKKyAgICAgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGxvYywgdGVhbS0+dC50X3RocmVhZHNbZl0sIHRlYW0sIGYsIEZBTFNFKTsKKyAgICAgICAgbmdvX3N0b3JlX2ljdnMoJnRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW2ZdLnRkX2ljdnMsIG5ld19pY3ZzKTsKKyAgICAgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfc2V0dXBfaWN2X2NvcHk6IExJTkVBUjogVCMlZCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGYsIHRlYW0tPnQudF90aHJlYWRzW2ZdLCB0ZWFtKSk7CisgICAgfQorICAgIG5nb19zeW5jKCk7CisjZW5kaWYgLy8gS01QX0JBUlJJRVJfSUNWX1BVTEwKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfY2FuY2VsLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDE2MDQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jYW5jZWwuY3BwCkBAIC0wLDAgKzEsMjgyIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gY25jbF9raW5kIENhbmNlbGxhdGlvbiBraW5kIChwYXJhbGxlbCwgZm9yLCBzZWN0aW9ucywgdGFza2dyb3VwKQorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiB0aGUgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaGFzIGJlZW4gYWN0aXZhdGVkIGFuZCB0aGUgZXhlY3V0aW9uIHRocmVhZAorbmVlZHMgdG8gcHJvY2VlZCB0byB0aGUgZW5kIG9mIHRoZSBjYW5jZWxlZCByZWdpb24uCisKK1JlcXVlc3QgY2FuY2VsbGF0aW9uIG9mIHRoZSBiaW5kaW5nIE9wZW5NUCByZWdpb24uCisqLwora21wX2ludDMyIF9fa21wY19jYW5jZWwoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpIHsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbDogVCMlZCByZXF1ZXN0ICVkIE9NUF9DQU5DRUxMQVRJT049JWRcbiIsIGd0aWQsIGNuY2xfa2luZCwgX19rbXBfb21wX2NhbmNlbGxhdGlvbikgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoY25jbF9raW5kICE9IGNhbmNlbF9ub3JlcSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgPT0gY2FuY2VsX3BhcmFsbGVsIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfbG9vcCB8fAorICAgICAgICAgICAgICAgICAgICAgY25jbF9raW5kID09IGNhbmNlbF9zZWN0aW9ucyB8fCBjbmNsX2tpbmQgPT0gY2FuY2VsX3Rhc2tncm91cCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgc3dpdGNoIChjbmNsX2tpbmQpIHsKKyAgICAgICAgY2FzZSBjYW5jZWxfcGFyYWxsZWw6CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBwYXJhbGxlbCBhbmQgd29ya3NoYXJpbmcgY29uc3RydWN0cworICAgICAgICAgICAgLy8gYXJlIGhhbmRsZWQgdGhyb3VnaCB0aGUgdGVhbSBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGVhbV90ICp0aGlzX3RlYW0gPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGVhbSk7CisgICAgICAgICAgICAgICAga21wX2ludDMyIG9sZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSwgY2FuY2VsX25vcmVxLCBjbmNsX2tpbmQpOworICAgICAgICAgICAgICAgIGlmIChvbGQgPT0gY2FuY2VsX25vcmVxIHx8IG9sZCA9PSBjbmNsX2tpbmQpIHsKKyAgICAgICAgICAgICAgICAgICAgLy9wcmludGYoIl9fa21wY19jYW5jZWw6IHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0PSVkIEAgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCAmKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSk7CisgICAgICAgICAgICAgICAgICAgIC8vIHdlIGRvIG5vdCBoYXZlIGEgY2FuY2VsbGF0aW9uIHJlcXVlc3QgaW4gdGhpcyB0ZWFtIG9yIHdlIGRvIGhhdmUgb25lCisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgbWF0Y2hlcyB0aGUgY3VycmVudCByZXF1ZXN0IC0+IGNhbmNlbAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgLy8gY2FuY2VsbGF0aW9uIHJlcXVlc3RzIGZvciBhIHRhc2sgZ3JvdXAKKyAgICAgICAgICAgIC8vIGFyZSBoYW5kbGVkIHRocm91Z2ggdGhlIHRhc2tncm91cCBzdHJ1Y3R1cmUKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2RhdGFfdCogIHRhc2s7CisgICAgICAgICAgICAgICAga21wX3Rhc2tncm91cF90KiB0YXNrZ3JvdXA7CisKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICk7CisKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tncm91cCkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgb2xkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKCYodGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdCksIGNhbmNlbF9ub3JlcSwgY25jbF9raW5kKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9sZCA9PSBjYW5jZWxfbm9yZXEgfHwgb2xkID09IGNuY2xfa2luZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBpbiB0aGlzIHRhc2tncm91cCBvciB3ZSBkbyBoYXZlIG9uZQorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhhdCBtYXRjaGVzIHRoZSBjdXJyZW50IHJlcXVlc3QgLT4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiB3aGF0IG5lZWRzIHRvIGhhcHBlbiBoZXJlPworICAgICAgICAgICAgICAgICAgICAvLyB0aGUgc3BlY2lmaWNhdGlvbiBkaXNhbGxvd3MgY2FuY2VsbGF0aW9uIHcvbyB0YXNrZ3JvdXBzCisgICAgICAgICAgICAgICAgICAgIC8vIHNvIHdlIG1pZ2h0IGRvIGFueXRoaW5nIGhlcmUsIGxldCdzIGFib3J0IGZvciBub3cKKyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggMCAvKiBmYWxzZSAqLyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIElDViBPTVBfQ0FOQ0VMTEFUSU9OPWZhbHNlLCBzbyB3ZSBpZ25vcmVkIHRoaXMgY2FuY2VsIHJlcXVlc3QKKyAgICBLTVBfREVCVUdfQVNTRVJUKCFfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKTsKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKK30KKworLyohCitAaW5ncm91cCBDQU5DRUxMQVRJT04KK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gY25jbF9raW5kIENhbmNlbGxhdGlvbiBraW5kIChwYXJhbGxlbCwgZm9yLCBzZWN0aW9ucywgdGFza2dyb3VwKQorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitDYW5jZWxsYXRpb24gcG9pbnQgZm9yIHRoZSBlbmNvdW50ZXJpbmcgdGhyZWFkLgorKi8KK2ttcF9pbnQzMiBfX2ttcGNfY2FuY2VsbGF0aW9ucG9pbnQoaWRlbnRfdCogbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBjbmNsX2tpbmQpIHsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2NhbmNlbGxhdGlvbnBvaW50OiBUIyVkIHJlcXVlc3QgJWQgT01QX0NBTkNFTExBVElPTj0lZFxuIiwgZ3RpZCwgY25jbF9raW5kLCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVChjbmNsX2tpbmQgIT0gY2FuY2VsX25vcmVxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKGNuY2xfa2luZCA9PSBjYW5jZWxfcGFyYWxsZWwgfHwgY25jbF9raW5kID09IGNhbmNlbF9sb29wIHx8CisgICAgICAgICAgICAgICAgICAgICBjbmNsX2tpbmQgPT0gY2FuY2VsX3NlY3Rpb25zIHx8IGNuY2xfa2luZCA9PSBjYW5jZWxfdGFza2dyb3VwKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2dldF9ndGlkKCkgPT0gZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBzd2l0Y2ggKGNuY2xfa2luZCkgeworICAgICAgICBjYXNlIGNhbmNlbF9wYXJhbGxlbDoKKyAgICAgICAgY2FzZSBjYW5jZWxfbG9vcDoKKyAgICAgICAgY2FzZSBjYW5jZWxfc2VjdGlvbnM6CisgICAgICAgICAgICAvLyBjYW5jZWxsYXRpb24gcmVxdWVzdHMgZm9yIHBhcmFsbGVsIGFuZCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0ZWFtIHN0cnVjdHVyZQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190ZWFtKTsKKyAgICAgICAgICAgICAgICBpZiAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGNuY2xfa2luZCA9PSB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gdGhlIHJlcXVlc3QgaW4gdGhlIHRlYW0gc3RydWN0dXJlIG1hdGNoZXMgdGhlIHR5cGUgb2YKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiBwb2ludCBzbyB3ZSBjYW4gY2FuY2VsCisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gMSAvKiB0cnVlICovOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgLyogZmFsc2UgKi8pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gd2UgZG8gbm90IGhhdmUgYSBjYW5jZWxsYXRpb24gcmVxdWVzdCBwZW5kaW5nLCBzbyB3ZSBqdXN0CisgICAgICAgICAgICAgICAgICAgIC8vIGlnbm9yZSB0aGlzIGNhbmNlbGxhdGlvbiBwb2ludAorICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIGNhbmNlbGxhdGlvbiByZXF1ZXN0cyBmb3IgYSB0YXNrIGdyb3VwCisgICAgICAgICAgICAvLyBhcmUgaGFuZGxlZCB0aHJvdWdoIHRoZSB0YXNrZ3JvdXAgc3RydWN0dXJlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAga21wX3Rhc2tkYXRhX3QqICB0YXNrOworICAgICAgICAgICAgICAgIGttcF90YXNrZ3JvdXBfdCogdGFza2dyb3VwOworCisgICAgICAgICAgICAgICAgdGFzayA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGFzayApOworCisgICAgICAgICAgICAgICAgdGFza2dyb3VwID0gdGFzay0+dGRfdGFza2dyb3VwOworICAgICAgICAgICAgICAgIGlmICh0YXNrZ3JvdXApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gcmV0dXJuIHRoZSBjdXJyZW50IHN0YXR1cyBvZiBjYW5jZWxsYXRpb24gZm9yIHRoZQorICAgICAgICAgICAgICAgICAgICAvLyB0YXNrZ3JvdXAKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuICEhdGFza2dyb3VwLT5jYW5jZWxfcmVxdWVzdDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGlmIGEgY2FuY2VsbGF0aW9uIHBvaW50IGlzIGVuY291bnRlcmVkIGJ5IGEgdGFzaworICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IGRvZXMgbm90IGJlbG9uZyB0byBhIHRhc2tncm91cCwgaXQgaXMgT0sKKyAgICAgICAgICAgICAgICAgICAgLy8gdG8gaWdub3JlIGl0CisgICAgICAgICAgICAgICAgICAgIHJldHVybiAwIC8qIGZhbHNlICovOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKDAgLyogZmFsc2UgKi8pOworICAgICAgICB9CisgICAgfQorCisgICAgLy8gSUNWIE9NUF9DQU5DRUxMQVRJT049ZmFsc2UsIHNvIHdlIGlnbm9yZSB0aGUgY2FuY2VsbGF0aW9uIHBvaW50CisgICAgS01QX0RFQlVHX0FTU0VSVCghX19rbXBfb21wX2NhbmNlbGxhdGlvbik7CisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitCYXJyaWVyIHdpdGggY2FuY2VsbGF0aW9uIHBvaW50IHRvIHNlbmQgdGhyZWFkcyBmcm9tIHRoZSBiYXJyaWVyIHRvIHRoZQorZW5kIG9mIHRoZSBwYXJhbGxlbCByZWdpb24uICBOZWVkcyBhIHNwZWNpYWwgY29kZSBwYXR0ZXJuIGFzIGRvY3VtZW50ZWQKK2luIHRoZSBkZXNpZ24gZG9jdW1lbnQgZm9yIHRoZSBjYW5jZWxsYXRpb24gZmVhdHVyZS4KKyovCitrbXBfaW50MzIKK19fa21wY19jYW5jZWxfYmFycmllcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkKSB7CisgICAgaW50IHJldCA9IDAgLyogZmFsc2UgKi87CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzIFsgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9nZXRfZ3RpZCgpID09IGd0aWQpOworCisgICAgLy8gY2FsbCBpbnRvIHRoZSBzdGFuZGFyZCBiYXJyaWVyCisgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKworICAgIC8vIGlmIGNhbmNlbGxhdGlvbiBpcyBhY3RpdmUsIGNoZWNrIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgaWYgKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgLy8gZGVwZW5kaW5nIG9uIHdoaWNoIGNvbnN0cnVjdCB0byBjYW5jZWwsIGNoZWNrIHRoZSBmbGFnIGFuZAorICAgICAgICAvLyByZXNldCB0aGUgZmxhZworICAgICAgICBzd2l0Y2ggKHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0KSB7CisgICAgICAgIGNhc2UgY2FuY2VsX3BhcmFsbGVsOgorICAgICAgICAgICAgcmV0ID0gMTsKKyAgICAgICAgICAgIC8vIGVuc3VyZSB0aGF0IHRocmVhZHMgaGF2ZSBjaGVja2VkIHRoZSBmbGFnLCB3aGVuCisgICAgICAgICAgICAvLyBsZWF2aW5nIHRoZSBhYm92ZSBiYXJyaWVyCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgdGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPSBjYW5jZWxfbm9yZXE7CisgICAgICAgICAgICAvLyB0aGUgbmV4dCBiYXJyaWVyIGlzIHRoZSBmb3JrL2pvaW4gYmFycmllciwgd2hpY2gKKyAgICAgICAgICAgIC8vIHN5bmNocm9uaXplcyB0aGUgdGhyZWFkcyBsZWF2aW5nIGhlcmUKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGNhbmNlbF9sb29wOgorICAgICAgICBjYXNlIGNhbmNlbF9zZWN0aW9uczoKKyAgICAgICAgICAgIHJldCA9IDE7CisgICAgICAgICAgICAvLyBlbnN1cmUgdGhhdCB0aHJlYWRzIGhhdmUgY2hlY2tlZCB0aGUgZmxhZywgd2hlbgorICAgICAgICAgICAgLy8gbGVhdmluZyB0aGUgYWJvdmUgYmFycmllcgorICAgICAgICAgICAgX19rbXBjX2JhcnJpZXIobG9jLCBndGlkKTsKKyAgICAgICAgICAgIHRoaXNfdGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgICAgICAgICAgLy8gc3luY2hyb25pemUgdGhlIHRocmVhZHMgYWdhaW4gdG8gbWFrZSBzdXJlIHdlCisgICAgICAgICAgICAvLyBkbyBub3QgaGF2ZSBhbnkgcnVuLWF3YXkgdGhyZWFkcyB0aGF0IGNhdXNlIGEgcmFjZQorICAgICAgICAgICAgLy8gb24gdGhlIGNhbmNlbGxhdGlvbiBmbGFnCisgICAgICAgICAgICBfX2ttcGNfYmFycmllcihsb2MsIGd0aWQpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgY2FuY2VsX3Rhc2tncm91cDoKKyAgICAgICAgICAgIC8vIHRoaXMgY2FzZSBzaG91bGQgbm90IG9jY3VyCisgICAgICAgICAgICBLTVBfQVNTRVJUICgwIC8qIGZhbHNlICovICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBjYW5jZWxfbm9yZXE6CisgICAgICAgICAgICAvLyBkbyBub3RoaW5nCisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIEtNUF9BU1NFUlQgKCAwIC8qIGZhbHNlICovKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qIQorQGluZ3JvdXAgQ0FOQ0VMTEFUSU9OCitAcGFyYW0gbG9jX3JlZiBsb2NhdGlvbiBvZiB0aGUgb3JpZ2luYWwgdGFzayBkaXJlY3RpdmUKK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorCitAcmV0dXJuIHJldHVybnMgdHJ1ZSBpZiBhIG1hdGNoaW5nIGNhbmNlbGxhdGlvbiByZXF1ZXN0IGhhcyBiZWVuIGZsYWdnZWQgaW4gdGhlIFJUTCBhbmQgdGhlCitlbmNvdW50ZXJpbmcgdGhyZWFkIGhhcyB0byBjYW5jZWwuLgorCitRdWVyeSBmdW5jdGlvbiB0byBxdWVyeSB0aGUgY3VycmVudCBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uIHJlcXVlc3RzLgorQ2FuIGJlIHVzZWQgdG8gaW1wbGVtZW50IHRoZSBmb2xsb3dpbmcgcGF0dGVybjoKKworaWYgKGttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhrbXBfY2FuY2VsX3BhcmFsbGVsKSkgeworICAgIHBlcmZvcm1fY2xlYW51cCgpOworICAgICNwcmFnbWEgb21wIGNhbmNlbGxhdGlvbiBwb2ludCBwYXJhbGxlbAorfQorKi8KK2ludCBfX2ttcF9nZXRfY2FuY2VsbGF0aW9uX3N0YXR1cyhpbnQgY2FuY2VsX2tpbmQpIHsKKyAgICBpZiAoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworCisgICAgICAgIHN3aXRjaCAoY2FuY2VsX2tpbmQpIHsKKyAgICAgICAgY2FzZSBjYW5jZWxfcGFyYWxsZWw6CisgICAgICAgIGNhc2UgY2FuY2VsX2xvb3A6CisgICAgICAgIGNhc2UgY2FuY2VsX3NlY3Rpb25zOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90ZWFtX3QgKnRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICAgICAgICAgIHJldHVybiB0aGlzX3RlYW0tPnQudF9jYW5jZWxfcmVxdWVzdCA9PSBjYW5jZWxfa2luZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgY2FzZSBjYW5jZWxfdGFza2dyb3VwOgorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGttcF90YXNrZGF0YV90KiAgdGFzazsKKyAgICAgICAgICAgICAgICBrbXBfdGFza2dyb3VwX3QqIHRhc2tncm91cDsKKyAgICAgICAgICAgICAgICB0YXNrID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgICAgICAgICB0YXNrZ3JvdXAgPSB0YXNrLT50ZF90YXNrZ3JvdXA7CisgICAgICAgICAgICAgICAgcmV0dXJuIHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIDAgLyogZmFsc2UgKi87Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9jb25maWcuaC5jbWFrZSBiL3JjMy9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGViM2U1NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfY29uZmlnLmguY21ha2UKQEAgLTAsMCArMSwxMTAgQEAKKy8qCisgKiBrbXBfY29uZmlnLmggLS0gRmVhdHVyZSBtYWNyb3MKKyAqLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyNpZm5kZWYgS01QX0NPTkZJR19ICisjZGVmaW5lIEtNUF9DT05GSUdfSAorCisjaW5jbHVkZSAia21wX3BsYXRmb3JtLmgiCisKKy8vIGNtYWtlZGVmaW5lMDEgTUFDUk8gd2lsbCBkZWZpbmUgTUFDUk8gYXMgZWl0aGVyIDAgb3IgMQorLy8gY21ha2VkZWZpbmUgTUFDUk8gMSB3aWxsIGRlZmluZSBNQUNSTyBhcyAxIG9yIGxlYXZlIHVuZGVmaW5lZAorI2NtYWtlZGVmaW5lMDEgREVCVUdfQlVJTEQKKyNjbWFrZWRlZmluZTAxIFJFTFdJVEhERUJJTkZPX0JVSUxECisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNkZWZpbmUgVVNFX0lUVF9OT1RJRlkgTElCT01QX1VTRV9JVFRfTk9USUZZCisjaWYgISBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyMgZGVmaW5lIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNlbmRpZgorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKyNpZiBMSUJPTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworIyBkZWZpbmUgS01QX1VTRV9WRVJTSU9OX1NZTUJPTFMKKyNlbmRpZgorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUKKyNkZWZpbmUgS01QX0hBVkVfV0VBS19BVFRSSUJVVEUgTElCT01QX0hBVkVfV0VBS19BVFRSSUJVVEUKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX1BTQVBJCisjZGVmaW5lIEtNUF9IQVZFX1BTQVBJIExJQk9NUF9IQVZFX1BTQVBJCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfU1RBVFMKKyNkZWZpbmUgS01QX1NUQVRTX0VOQUJMRUQgTElCT01QX1NUQVRTCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSAorI2RlZmluZSBLTVBfSEFWRV9YODZJTlRSSU5fSCBMSUJPTVBfSEFWRV9YODZJTlRSSU5fSAorI2NtYWtlZGVmaW5lMDEgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIKKyNkZWZpbmUgS01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIgTElCT01QX0hBVkVfX19CVUlMVElOX1JFQURDWUNMRUNPVU5URVIKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9IQVZFX19fUkRUU0MKKyNkZWZpbmUgS01QX0hBVkVfX19SRFRTQyBMSUJPTVBfSEFWRV9fX1JEVFNDCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0RFQlVHR0VSCisjZGVmaW5lIFVTRV9ERUJVR0dFUiBMSUJPTVBfVVNFX0RFQlVHR0VSCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfT01QVF9ERUJVRworI2RlZmluZSBPTVBUX0RFQlVHIExJQk9NUF9PTVBUX0RFQlVHCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfT01QVF9TVVBQT1JUCisjZGVmaW5lIE9NUFRfU1VQUE9SVCBMSUJPTVBfT01QVF9TVVBQT1JUCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfT01QVF9CTEFNRQorI2RlZmluZSBPTVBUX0JMQU1FIExJQk9NUF9PTVBUX0JMQU1FCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfT01QVF9UUkFDRQorI2RlZmluZSBPTVBUX1RSQUNFIExJQk9NUF9PTVBUX1RSQUNFCisjY21ha2VkZWZpbmUwMSBMSUJPTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjZGVmaW5lIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MgTElCT01QX1VTRV9BREFQVElWRV9MT0NLUworI2RlZmluZSBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MgMAorI2NtYWtlZGVmaW5lMDEgTElCT01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisjZGVmaW5lIEtNUF9VU0VfSU5URVJOT0RFX0FMSUdOTUVOVCBMSUJPTVBfVVNFX0lOVEVSTk9ERV9BTElHTk1FTlQKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9FTkFCTEVfQVNTRVJUSU9OUworI2RlZmluZSBLTVBfVVNFX0FTU0VSVCBMSUJPTVBfRU5BQkxFX0FTU0VSVElPTlMKKyNjbWFrZWRlZmluZTAxIFNUVUJTX0xJQlJBUlkKKyNjbWFrZWRlZmluZTAxIExJQk9NUF9VU0VfSFdMT0MKKyNkZWZpbmUgS01QX1VTRV9IV0xPQyBMSUJPTVBfVVNFX0hXTE9DCisjZGVmaW5lIEtNUF9BUkNIX1NUUiAiQExJQk9NUF9MRUdBTF9BUkNIQCIKKyNkZWZpbmUgS01QX0xJQlJBUllfRklMRSAiQExJQk9NUF9MSUJfRklMRUAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BSk9SIEBMSUJPTVBfVkVSU0lPTl9NQUpPUkAKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgQExJQk9NUF9WRVJTSU9OX01JTk9SQAorI2RlZmluZSBMSUJPTVBfT01QX1ZFUlNJT04gQExJQk9NUF9PTVBfVkVSU0lPTkAKKyNkZWZpbmUgT01QXzUwX0VOQUJMRUQgKExJQk9NUF9PTVBfVkVSU0lPTiA+PSA1MCkKKyNkZWZpbmUgT01QXzQ1X0VOQUJMRUQgKExJQk9NUF9PTVBfVkVSU0lPTiA+PSA0NSkKKyNkZWZpbmUgT01QXzQwX0VOQUJMRUQgKExJQk9NUF9PTVBfVkVSU0lPTiA+PSA0MCkKKyNkZWZpbmUgT01QXzMwX0VOQUJMRUQgKExJQk9NUF9PTVBfVkVSU0lPTiA+PSAzMCkKKworLy8gQ29uZmlndXJlZCBjYWNoZSBsaW5lIGJhc2VkIG9uIGFyY2hpdGVjdHVyZQorI2lmIEtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBDQUNIRV9MSU5FIDEyOAorI2Vsc2UKKyMgZGVmaW5lIENBQ0hFX0xJTkUgNjQKKyNlbmRpZgorCisjaWYgISBLTVBfMzJfQklUX0FSQ0gKKyMgZGVmaW5lIEJVSUxEX0k4IDEKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9EWU5BTUlDX0xJQiAxCisjZGVmaW5lIEtNUF9ORVNURURfSE9UX1RFQU1TIDEKKyNkZWZpbmUgS01QX0FESlVTVF9CTE9DS1RJTUUgMQorI2RlZmluZSBCVUlMRF9QQVJBTExFTF9PUkRFUkVEIDEKKyNkZWZpbmUgS01QX0FTTV9JTlRSSU5TIDEKKyNkZWZpbmUgVVNFX0lUVF9CVUlMRCBMSUJPTVBfVVNFX0lUVF9OT1RJRlkKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2ttcF9pdHRfCisjaWYgISBLTVBfTUlDCisjIGRlZmluZSBVU0VfTE9BRF9CQUxBTkNFIDEKKyNlbmRpZgorI2lmICEgKEtNUF9PU19XSU5ET1dTIHx8IEtNUF9PU19EQVJXSU4pCisjIGRlZmluZSBLTVBfVERBVEFfR1RJRCAxCisjZW5kaWYKKyNpZiBTVFVCU19MSUJSQVJZCisjIGRlZmluZSBLTVBfU1RVQiAxCisjZW5kaWYKKyNpZiBERUJVR19CVUlMRCB8fCBSRUxXSVRIREVCSU5GT19CVUlMRAorIyBkZWZpbmUgS01QX0RFQlVHIDEKKyNlbmRpZgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgZGVmaW5lIEtNUF9XSU5fQ0RFQ0wKKyNlbHNlCisjIGRlZmluZSBCVUlMRF9UVgorIyBkZWZpbmUgS01QX0dPTVBfQ09NUEFUCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9DT05GSUdfSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9jc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRjMWQyMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2NzdXBwb3J0LmMKQEAgLTAsMCArMSwzMzI5IEBACisvKgorICoga21wX2NzdXBwb3J0LmMgLS0ga2Zyb250IGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAib21wLmgiICAgICAgICAvKiBleHRlcm4gIkMiIGRlY2xhcmF0aW9ucyBvZiB1c2VyLXZpc2libGUgcm91dGluZXMgKi8KKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorCisjaWYgT01QVF9TVVBQT1JUCisjaW5jbHVkZSAib21wdC1pbnRlcm5hbC5oIgorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgZmxhZ3Mgd2lsbCBiZSB1c2VkIGluIGZ1dHVyZSwgZS5nLiwgdG8gaW1wbGVtZW50ICovCisvKiAgb3Blbm1wX3N0cmljdCBsaWJyYXJ5IHJlc3RyaWN0aW9ucyAgICAgICAgICAgICAgICovCisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyAgIGluICAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgKiBAcGFyYW0gZmxhZ3MgaW4gICBmb3IgZnV0dXJlIHVzZSAoY3VycmVudGx5IGlnbm9yZWQpCisgKgorICogSW5pdGlhbGl6ZSB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGNhbGwgaXMgb3B0aW9uYWw7IGlmIGl0IGlzIG5vdCBtYWRlIHRoZW4KKyAqIGl0IHdpbGwgYmUgaW1wbGljaXRseSBjYWxsZWQgYnkgYXR0ZW1wdHMgdG8gdXNlIG90aGVyIGxpYnJhcnkgZnVuY3Rpb25zLgorICoKKyAqLwordm9pZAorX19rbXBjX2JlZ2luKGlkZW50X3QgKmxvYywga21wX2ludDMyIGZsYWdzKQoreworICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBfaWdub3JlX21wcGJlZygpIHJldHVybnMgVFJVRS4KKyAgICBpZiAoX19rbXBfaWdub3JlX21wcGJlZygpID09IEZBTFNFKSB7CisgICAgICAgIF9fa21wX2ludGVybmFsX2JlZ2luKCk7CisKKyAgICAgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iZWdpbjogY2FsbGVkXG4iICkgKTsKKyAgICB9Cit9CisKKy8qIQorICogQGluZ3JvdXAgU1RBUlRVUF9TSFVURE9XTgorICogQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KKyAqCisgKiBTaHV0ZG93biB0aGUgcnVudGltZSBsaWJyYXJ5LiBUaGlzIGlzIGFsc28gb3B0aW9uYWwsIGFuZCBldmVuIGlmIGNhbGxlZCB3aWxsIG5vdAorICogZG8gYW55dGhpbmcgdW5sZXNzIHRoZSBgS01QX0lHTk9SRV9NUFBFTkRgIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHNldCB0byB6ZXJvLgorICAqLwordm9pZAorX19rbXBjX2VuZChpZGVudF90ICpsb2MpCit7CisgICAgLy8gQnkgZGVmYXVsdCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgVFJVRSB3aGljaCBtYWtlcyBfX2ttcGNfZW5kKCkgY2FsbCBuby1vcC4KKyAgICAvLyBIb3dldmVyLCB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIHdpdGggS01QX0lHTk9SRV9NUFBFTkQgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgLy8gSWYgS01QX0lHTk9SRV9NUFBFTkQgaXMgMCwgX19rbXBfaWdub3JlX21wcGVuZCgpIHJldHVybnMgRkFMU0UgYW5kIF9fa21wY19lbmQoKQorICAgIC8vIHdpbGwgdW5yZWdpc3RlciB0aGlzIHJvb3QgKGl0IGNhbiBjYXVzZSBsaWJyYXJ5IHNodXQgZG93bikuCisgICAgaWYgKF9fa21wX2lnbm9yZV9tcHBlbmQoKSA9PSBGQUxTRSkgeworICAgICAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZDogY2FsbGVkXG4iICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDMwLCAoIl9fa21wY19lbmRcbiIgKSk7CisKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggLTEgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIFRoZSBnbG9iYWwgdGhyZWFkIGluZGV4IG9mIHRoZSBhY3RpdmUgdGhyZWFkLgorCitUaGlzIGZ1bmN0aW9uIGNhbiBiZSBjYWxsZWQgaW4gYW55IGNvbnRleHQuCisKK0lmIHRoZSBydW50aW1lIGhhcyBvbnkgYmVlbiBlbnRlcmVkIGF0IHRoZSBvdXRlcm1vc3QgbGV2ZWwgZnJvbSBhCitzaW5nbGUgKG5lY2Vzc2FyaWx5IG5vbi1PcGVuTVA8c3VwPio8L3N1cD4pIHRocmVhZCwgdGhlbiB0aGUgdGhyZWFkIG51bWJlciBpcyB0aGF0Cit3aGljaCB3b3VsZCBiZSByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSBpbiB0aGUgb3V0ZXJtb3N0CithY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LiAoT3IgemVybyBpZiB0aGVyZSBpcyBubyBhY3RpdmUgcGFyYWxsZWwKK2NvbnN0cnVjdCwgc2luY2UgdGhlIG1hc3RlciB0aHJlYWQgaXMgbmVjZXNzYXJpbHkgdGhyZWFkIHplcm8pLgorCitJZiBtdWx0aXBsZSBub24tT3Blbk1QIHRocmVhZHMgYWxsIGVudGVyIGFuIE9wZW5NUCBjb25zdHJ1Y3QgdGhlbiB0aGlzCit3aWxsIGJlIGEgdW5pcXVlIHRocmVhZCBpZGVudGlmaWVyIGFtb25nIGFsbCB0aGUgdGhyZWFkcyBjcmVhdGVkIGJ5Cit0aGUgT3Blbk1QIHJ1bnRpbWUgKGJ1dCB0aGUgdmFsdWUgY2Fubm90ZSBiZSBkZWZpbmVkIGluIHRlcm1zIG9mCitPcGVuTVAgdGhyZWFkIGlkcyByZXR1cm5lZCBieSBvbXBfZ2V0X3RocmVhZF9udW0oKSkuCisKKyovCitrbXBfaW50MzIKK19fa21wY19nbG9iYWxfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAga21wX2ludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtOiBUIyVkXG4iLCBndGlkICkgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgY29udHJvbCBvZiB0aGUgT3Blbk1QPHN1cD4qPC9zdXA+IHJ1bnRpbWUKKworVGhpcyBmdW5jdGlvbiBjYW4gYmUgY2FsbGVkIGluIGFueSBjb250ZXh0LgorSXQgcmV0dXJucyB0aGUgdG90YWwgbnVtYmVyIG9mIHRocmVhZHMgdW5kZXIgdGhlIGNvbnRyb2wgb2YgdGhlIE9wZW5NUCBydW50aW1lLiBUaGF0IGlzCitub3QgYSBudW1iZXIgdGhhdCBjYW4gYmUgZGV0ZXJtaW5lZCBieSBhbnkgT3Blbk1QIHN0YW5kYXJkIGNhbGxzLCBzaW5jZSB0aGUgbGlicmFyeSBtYXkgYmUKK2NhbGxlZCBmcm9tIG1vcmUgdGhhbiBvbmUgbm9uLU9wZW5NUCB0aHJlYWQsIGFuZCB0aGlzIHJlZmxlY3RzIHRoZSB0b3RhbCBvdmVyIGFsbCBzdWNoIGNhbGxzLgorU2ltaWxhcmx5IHRoZSBydW50aW1lIG1haW50YWlucyB1bmRlcmx5aW5nIHRocmVhZHMgZXZlbiB3aGVuIHRoZXkgYXJlIG5vdCBhY3RpdmUgKHNpbmNlIHRoZSBjb3N0CitvZiBjcmVhdGluZyBhbmQgZGVzdHJveWluZyBPUyB0aHJlYWRzIGlzIGhpZ2gpLCB0aGlzIGNhbGwgY291bnRzIGFsbCBzdWNoIHRocmVhZHMgZXZlbiBpZiB0aGV5IGFyZSBub3QKK3dhaXRpbmcgZm9yIHdvcmsuCisqLwora21wX2ludDMyCitfX2ttcGNfZ2xvYmFsX251bV90aHJlYWRzKGlkZW50X3QgKmxvYykKK3sKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2dsb2JhbF9udW1fdGhyZWFkczogbnVtX3RocmVhZHMgPSAlZFxuIiwgX19rbXBfbnRoICkgKTsKKworICAgIHJldHVybiBUQ1JfNChfX2ttcF9udGgpOworfQorCisvKiEKK0Bpbmdyb3VwIFRIUkVBRF9TVEFURVMKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHJldHVybiBUaGUgdGhyZWFkIG51bWJlciBvZiB0aGUgY2FsbGluZyB0aHJlYWQgaW4gdGhlIGlubmVybW9zdCBhY3RpdmUgcGFyYWxsZWwgY29uc3RydWN0LgorCisqLwora21wX2ludDMyCitfX2ttcGNfYm91bmRfdGhyZWFkX251bShpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF90aHJlYWRfbnVtOiBjYWxsZWRcbiIgKSApOworICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKworLyohCitAaW5ncm91cCBUSFJFQURfU1RBVEVTCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0ByZXR1cm4gVGhlIG51bWJlciBvZiB0aHJlYWRzIGluIHRoZSBpbm5lcm1vc3QgYWN0aXZlIHBhcmFsbGVsIGNvbnN0cnVjdC4KKyovCitrbXBfaW50MzIKK19fa21wY19ib3VuZF9udW1fdGhyZWFkcyhpZGVudF90ICpsb2MpCit7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19ib3VuZF9udW1fdGhyZWFkczogY2FsbGVkXG4iICkgKTsKKworICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKK30KKworLyohCisgKiBAaW5ncm91cCBERVBSRUNBVEVECisgKiBAcGFyYW0gbG9jIGxvY2F0aW9uIGRlc2NyaXB0aW9uCisgKgorICogVGhpcyBmdW5jdGlvbiBuZWVkIG5vdCBiZSBjYWxsZWQuIEl0IGFsd2F5cyByZXR1cm5zIFRSVUUuCisgKi8KK2ttcF9pbnQzMgorX19rbXBjX29rX3RvX2ZvcmsoaWRlbnRfdCAqbG9jKQoreworI2lmbmRlZiBLTVBfREVCVUcKKworICAgIHJldHVybiBUUlVFOworCisjZWxzZQorCisgICAgY29uc3QgY2hhciAqc2VtaTI7CisgICAgY29uc3QgY2hhciAqc2VtaTM7CisgICAgaW50IGxpbmVfbm87CisKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlID09IDApIHsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHNlbWkyID0gbG9jLT5wc291cmNlOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBzZW1pMiA9IHN0cmNocihzZW1pMiwgJzsnKTsKKyAgICBpZiAoc2VtaTIgPT0gTlVMTCkgeworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgc2VtaTIgPSBzdHJjaHIoc2VtaTIgKyAxLCAnOycpOworICAgIGlmIChzZW1pMiA9PSBOVUxMKSB7CisgICAgICAgIHJldHVybiBUUlVFOworICAgIH0KKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lWzBdKSB7CisgICAgICAgIGNvbnN0IGNoYXIgKm5hbWUgPSBzZW1pMiAtIDE7CisgICAgICAgIHdoaWxlICgobmFtZSA+IGxvYy0+cHNvdXJjZSkgJiYgKCpuYW1lICE9ICcvJykgJiYgKCpuYW1lICE9ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUtLTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCpuYW1lID09ICcvJykgfHwgKCpuYW1lID09ICc7JykpIHsKKyAgICAgICAgICAgIG5hbWUrKzsKKyAgICAgICAgfQorICAgICAgICBpZiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2VfZmlsZW5hbWUsIG5hbWUsIHNlbWkyIC0gbmFtZSkpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgICAgICB9CisgICAgfQorICAgIHNlbWkzID0gc3RyY2hyKHNlbWkyICsgMSwgJzsnKTsKKyAgICBpZiAoX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbMF0pIHsKKyAgICAgICAgaWYgKChzZW1pMyAhPSBOVUxMKSAmJiAoc2VtaTMgPiBzZW1pMikKKyAgICAgICAgICAmJiAoc3RybmNtcChfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwgc2VtaTIgKyAxLCBzZW1pMyAtIHNlbWkyIC0gMSkpKSB7CisgICAgICAgICAgICByZXR1cm4gX19rbXBfcGFyX3JhbmdlIDwgMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBpZiAoS01QX1NTQ0FORihzZW1pMyArIDEsICIlZCIsICZsaW5lX25vKSA9PSAxKSB7CisgICAgICAgIGlmICgobGluZV9ubyA+PSBfX2ttcF9wYXJfcmFuZ2VfbGIpICYmIChsaW5lX25vIDw9IF9fa21wX3Bhcl9yYW5nZV91YikpIHsKKyAgICAgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9wYXJfcmFuZ2UgPCAwOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKKworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCit9CisKKy8qIQorQGluZ3JvdXAgVEhSRUFEX1NUQVRFUworQHBhcmFtIGxvYyBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgaXMgZXhlY3V0aW5nIGluc2lkZSBhbiBhY3RpdmUgcGFyYWxsZWwgcmVnaW9uLCB6ZXJvIGlmIG5vdC4KKyovCitrbXBfaW50MzIKK19fa21wY19pbl9wYXJhbGxlbCggaWRlbnRfdCAqbG9jICkKK3sKKyAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlOworfQorCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdGhyZWFkcyBudW1iZXIgb2YgdGhyZWFkcyByZXF1ZXN0ZWQgZm9yIHRoaXMgcGFyYWxsZWwgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gYmUgdXNlZCBieSB0aGUgbmV4dCBmb3JrIHNwYXduZWQgYnkgdGhpcyB0aHJlYWQuCitUaGlzIGNhbGwgaXMgb25seSByZXF1aXJlZCBpZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0IGhhcyBhIGBudW1fdGhyZWFkc2AgY2xhdXNlLgorKi8KK3ZvaWQKK19fa21wY19wdXNoX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90aHJlYWRzOiBlbnRlciBUIyVkIG51bV90aHJlYWRzPSVkXG4iLAorICAgICAgZ2xvYmFsX3RpZCwgbnVtX3RocmVhZHMgKSApOworCisgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcyggbG9jLCBnbG9iYWxfdGlkLCBudW1fdGhyZWFkcyApOworfQorCit2b2lkCitfX2ttcGNfcG9wX251bV90aHJlYWRzKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcGNfcG9wX251bV90aHJlYWRzOiBlbnRlclxuIiApICk7CisKKyAgICAvKiB0aGUgbnVtX3RocmVhZHMgYXJlIGF1dG9tYXRpY2FsbHkgcG9wcGVkICovCit9CisKKworI2lmIE9NUF80MF9FTkFCTEVECisKK3ZvaWQKK19fa21wY19wdXNoX3Byb2NfYmluZChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfaW50MzIgcHJvY19iaW5kICkKK3sKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBjX3B1c2hfcHJvY19iaW5kOiBlbnRlciBUIyVkIHByb2NfYmluZD0lZFxuIiwKKyAgICAgIGdsb2JhbF90aWQsIHByb2NfYmluZCApICk7CisKKyAgICBfX2ttcF9wdXNoX3Byb2NfYmluZCggbG9jLCBnbG9iYWxfdGlkLCAoa21wX3Byb2NfYmluZF90KXByb2NfYmluZCApOworfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvKiEKK0Bpbmdyb3VwIFBBUkFMTEVMCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBhcmdjICB0b3RhbCBudW1iZXIgb2YgYXJndW1lbnRzIGluIHRoZSBlbGxpcHNpcworQHBhcmFtIG1pY3JvdGFzayAgcG9pbnRlciB0byBjYWxsYmFjayByb3V0aW5lIGNvbnNpc3Rpbmcgb2Ygb3V0bGluZWQgcGFyYWxsZWwgY29uc3RydWN0CitAcGFyYW0gLi4uICBwb2ludGVycyB0byBzaGFyZWQgdmFyaWFibGVzIHRoYXQgYXJlbid0IGdsb2JhbAorCitEbyB0aGUgYWN0dWFsIGZvcmsgYW5kIGNhbGwgdGhlIG1pY3JvdGFzayBpbiB0aGUgcmVsZXZhbnQgbnVtYmVyIG9mIHRocmVhZHMuCisqLwordm9pZAorX19rbXBjX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBhcmdjLCBrbXBjX21pY3JvIG1pY3JvdGFzaywgLi4uKQoreworICBpbnQgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworCisjaWYgKEtNUF9TVEFUU19FTkFCTEVEKQorICBpbnQgaW5QYXJhbGxlbCA9IF9fa21wY19pbl9wYXJhbGxlbChsb2MpOworICBpZiAoaW5QYXJhbGxlbCkKKyAgeworICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9ORVNURURfUEFSQUxMRUwpOworICB9CisgIGVsc2UKKyAgeworICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9QQVJBTExFTCk7CisgIH0KKyNlbmRpZgorCisgIC8vIG1heWJlIHRvIHNhdmUgdGhyX3N0YXRlIGlzIGVub3VnaCBoZXJlCisgIHsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF9pbmZvX3QgKm1hc3Rlcl90aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICpwYXJlbnRfdGVhbSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgcGFyZW50X3RlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0uCisgICAgICAgICAgIG9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2ludGVsLAorICAgICAgICAgICAgYXJnYywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1Qodm9pZCAqKSBtaWNyb3Rhc2ssICAgICAgLy8gInVud3JhcHBlZCIgdGFzaworI2VuZGlmCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKG1pY3JvdGFza190KSBtaWNyb3Rhc2ssIC8vICJ3cmFwcGVkIiB0YXNrCisgICAgICAgICAgICBWT0xBVElMRV9DQVNUKGxhdW5jaF90KSAgICBfX2ttcF9pbnZva2VfdGFza19mdW5jLAorLyogVE9ETzogcmV2ZXJ0IHdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IHRyYWNrZXIgIzk2ICovCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfSk9JTklORygpOworI2VuZGlmCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLCBmb3JrX2NvbnRleHRfaW50ZWwKKyNlbmRpZgorICAgICk7CisKKyAgICB2YV9lbmQoIGFwICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICAgb21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICB9CisjZW5kaWYKKyAgfQorfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIG51bWJlcgorQHBhcmFtIG51bV90ZWFtcyBudW1iZXIgb2YgdGVhbXMgcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CitAcGFyYW0gbnVtX3RocmVhZHMgbnVtYmVyIG9mIHRocmVhZHMgcGVyIHRlYW0gcmVxdWVzdGVkIGZvciB0aGUgdGVhbXMgY29uc3RydWN0CisKK1NldCB0aGUgbnVtYmVyIG9mIHRlYW1zIHRvIGJlIHVzZWQgYnkgdGhlIHRlYW1zIGNvbnN0cnVjdC4KK1RoaXMgY2FsbCBpcyBvbmx5IHJlcXVpcmVkIGlmIHRoZSB0ZWFtcyBjb25zdHJ1Y3QgaGFzIGEgYG51bV90ZWFtc2AgY2xhdXNlCitvciBhIGB0aHJlYWRfbGltaXRgIGNsYXVzZSAob3IgYm90aCkuCisqLwordm9pZAorX19rbXBjX3B1c2hfbnVtX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9pbnQzMiBudW1fdGVhbXMsIGttcF9pbnQzMiBudW1fdGhyZWFkcyApCit7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wY19wdXNoX251bV90ZWFtczogZW50ZXIgVCMlZCBudW1fdGVhbXM9JWQgbnVtX3RocmVhZHM9JWRcbiIsCisgICAgICBnbG9iYWxfdGlkLCBudW1fdGVhbXMsIG51bV90aHJlYWRzICkgKTsKKworICAgIF9fa21wX3B1c2hfbnVtX3RlYW1zKCBsb2MsIGdsb2JhbF90aWQsIG51bV90ZWFtcywgbnVtX3RocmVhZHMgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gYXJnYyAgdG90YWwgbnVtYmVyIG9mIGFyZ3VtZW50cyBpbiB0aGUgZWxsaXBzaXMKK0BwYXJhbSBtaWNyb3Rhc2sgIHBvaW50ZXIgdG8gY2FsbGJhY2sgcm91dGluZSBjb25zaXN0aW5nIG9mIG91dGxpbmVkIHRlYW1zIGNvbnN0cnVjdAorQHBhcmFtIC4uLiAgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcmlhYmxlcyB0aGF0IGFyZW4ndCBnbG9iYWwKKworRG8gdGhlIGFjdHVhbCBmb3JrIGFuZCBjYWxsIHRoZSBtaWNyb3Rhc2sgaW4gdGhlIHJlbGV2YW50IG51bWJlciBvZiB0aHJlYWRzLgorKi8KK3ZvaWQKK19fa21wY19mb3JrX3RlYW1zKGlkZW50X3QgKmxvYywga21wX2ludDMyIGFyZ2MsIGttcGNfbWljcm8gbWljcm90YXNrLCAuLi4pCit7CisgICAgaW50ICAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB2YV9saXN0ICAgICBhcDsKKyAgICB2YV9zdGFydCggICBhcCwgbWljcm90YXNrICk7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RFQU1TKTsKKworICAgIC8vIHJlbWVtYmVyIHRlYW1zIGVudHJ5IHBvaW50IGFuZCBuZXN0aW5nIGxldmVsCisgICAgdGhpc190aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1pY3JvdGFzazsKKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbXNfbGV2ZWwgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X2xldmVsOyAvLyBBQzogY2FuIGJlID4wIG9uIGhvc3QKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF90ZWFtX3QgKnBhcmVudF90ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgaW50IHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLgorICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIGNoZWNrIGlmIF9fa21wY19wdXNoX251bV90ZWFtcyBjYWxsZWQsIHNldCBkZWZhdWx0IG51bWJlciBvZiB0ZWFtcyBvdGhlcndpc2UKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9PSAwICkgeworICAgICAgICBfX2ttcF9wdXNoX251bV90ZWFtcyggbG9jLCBndGlkLCAwLCAwICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpc190aHItPnRoLnRoX3NldF9ucHJvYyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA+PSAxKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHRoaXNfdGhyLT50aC50aF90ZWFtc19zaXplLm50aCA+PSAxKTsKKworICAgIF9fa21wX2ZvcmtfY2FsbCggbG9jLCBndGlkLCBmb3JrX2NvbnRleHRfaW50ZWwsCisgICAgICAgICAgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVCh2b2lkICopIG1pY3JvdGFzaywgICAgICAgICAgICAgICAvLyAidW53cmFwcGVkIiB0YXNrCisjZW5kaWYKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobWljcm90YXNrX3QpIF9fa21wX3RlYW1zX21hc3RlciwgLy8gIndyYXBwZWQiIHRhc2sKKyAgICAgICAgICAgIFZPTEFUSUxFX0NBU1QobGF1bmNoX3QpICAgIF9fa21wX2ludm9rZV90ZWFtc19tYXN0ZXIsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAgICAgICAmYXAKKyNlbHNlCisgICAgICAgICAgICBhcAorI2VuZGlmCisgICAgICAgICAgICApOworICAgIF9fa21wX2pvaW5fY2FsbCggbG9jLCBndGlkCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICwgZm9ya19jb250ZXh0X2ludGVsCisjZW5kaWYKKyAgICApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS4KKyAgICAgICAgICAgb21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKyAgICB9CisjZW5kaWYKKworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBOVUxMOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtc19sZXZlbCA9IDA7CisgICAgKihrbXBfaW50NjQqKSgmdGhpc190aHItPnRoLnRoX3RlYW1zX3NpemUpID0gMEw7CisgICAgdmFfZW5kKCBhcCApOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKworLy8KKy8vIEkgZG9uJ3QgdGhpbmsgdGhpcyBmdW5jdGlvbiBzaG91bGQgZXZlciBoYXZlIGJlZW4gZXhwb3J0ZWQuCisvLyBUaGUgX19rbXBjXyBwcmVmaXggd2FzIG1pc2FwcGxpZWQuICBJJ20gZmFpcmx5IGNlcnRhaW4gdGhhdCBubyBnZW5lcmF0ZWQKKy8vIG9wZW5tcCBjb2RlIGV2ZXIgY2FsbGVkIGl0LCBidXQgaXQncyBiZWVuIGV4cG9ydGVkIGZyb20gdGhlIFJUTCBmb3Igc28KKy8vIGxvbmcgdGhhdCBJJ20gYWZyYWlkIHRvIHJlbW92ZSB0aGUgZGVmaW5pdGlvbi4KKy8vCitpbnQKK19fa21wY19pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2ludm9rZV90YXNrX2Z1bmMoIGd0aWQgKTsKK30KKworLyohCitAaW5ncm91cCBQQVJBTExFTAorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIKKworRW50ZXIgYSBzZXJpYWxpemVkIHBhcmFsbGVsIGNvbnN0cnVjdC4gVGhpcyBpbnRlcmZhY2UgaXMgdXNlZCB0byBoYW5kbGUgYQorY29uZGl0aW9uYWwgcGFyYWxsZWwgcmVnaW9uLCBsaWtlIHRoaXMsCitAY29kZQorI3ByYWdtYSBvbXAgcGFyYWxsZWwgaWYgKGNvbmRpdGlvbikKK0BlbmRjb2RlCit3aGVuIHRoZSBjb25kaXRpb24gaXMgZmFsc2UuCisqLwordm9pZAorX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcF9zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ2xvYmFsX3RpZCk7IC8qIFRoZSBpbXBsZW1lbnRhdGlvbiBpcyBub3cgaW4ga21wX3J1bnRpbWUuYyBzbyB0aGF0IGl0IGNhbiBzaGFyZSBzdGF0aWMgZnVuY3Rpb25zIHdpdGgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqIGttcF9mb3JrX2NhbGwgc2luY2UgdGhlIHRhc2tzIHRvIGJlIGRvbmUgYXJlIHNpbWlsYXIgaW4gZWFjaCBjYXNlLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCit9CisKKy8qIQorQGluZ3JvdXAgUEFSQUxMRUwKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK0xlYXZlIGEgc2VyaWFsaXplZCBwYXJhbGxlbCBjb25zdHJ1Y3QuCisqLwordm9pZAorX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqdG9wOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbDogY2FsbGVkIGJ5IFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLyogc2tpcCBhbGwgdGhpcyBjb2RlIGZvciBhdXRvcGFyIHNlcmlhbGl6ZWQgbG9vcHMgc2luY2UgaXQgcmVzdWx0cyBpbgorICAgICAgIHVuYWNjZXB0YWJsZSBvdmVyaGVhZCAqLworICAgIGlmKCBsb2MgIT0gTlVMTCAmJiAobG9jLT5mbGFncyAmIEtNUF9JREVOVF9BVVRPUEFSICkgKQorICAgICAgICByZXR1cm47CisKKyAgICAvLyBOb3QgYXV0b3BhciBjb2RlCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIHRoaXNfdGhyICAgID0gX19rbXBfdGhyZWFkc1sgZ2xvYmFsX3RpZCBdOworICAgIHNlcmlhbF90ZWFtID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAjaWYgT01QXzQ1X0VOQUJMRUQKKyAgIGttcF90YXNrX3RlYW1fdCAqICAgdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbTsKKworICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJveHkgdGFza3MgYmVmb3JlIGZpbmlzaGluZyB0aGUgdGhyZWFkCisgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgKQorICAgICAgICBfX2ttcF90YXNrX3RlYW1fd2FpdCh0aGlzX3Rociwgc2VyaWFsX3RlYW0gVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCkgKTsgLy8gaXMgYW4gSVRUIG9iamVjdCBuZWVkZWQgaGVyZT8KKyAgICNlbmRpZgorCisgICAgS01QX01CKCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gPT0gc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSAhPSB0aGlzX3Roci0+dGgudGhfcm9vdC0+ci5yX3Jvb3RfdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtIC0+IHQudF90aHJlYWRzICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0gLT4gdC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKworICAgIC8qIElmIG5lY2Vzc2FyeSwgcG9wIHRoZSBpbnRlcm5hbCBjb250cm9sIHN0YWNrIHZhbHVlcyBhbmQgcmVwbGFjZSB0aGUgdGVhbSB2YWx1ZXMgKi8KKyAgICB0b3AgPSBzZXJpYWxfdGVhbSAtPiB0LnRfY29udHJvbF9zdGFja190b3A7CisgICAgaWYgKCB0b3AgJiYgdG9wIC0+IHNlcmlhbF9uZXN0aW5nX2xldmVsID09IHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBjb3B5X2ljdnMoICZzZXJpYWxfdGVhbSAtPiB0LnRfdGhyZWFkc1swXSAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cywgdG9wICk7CisgICAgICAgIHNlcmlhbF90ZWFtIC0+IHQudF9jb250cm9sX3N0YWNrX3RvcCA9IHRvcCAtPiBuZXh0OworICAgICAgICBfX2ttcF9mcmVlKHRvcCk7CisgICAgfQorCisgICAgLy9pZiggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPiAxICkKKyAgICBzZXJpYWxfdGVhbSAtPiB0LnRfbGV2ZWwtLTsKKworICAgIC8qIHBvcCBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlcik7CisgICAgeworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqIGRpc3BfYnVmZmVyID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyID0KKyAgICAgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyLT5uZXh0OworICAgICAgICBfX2ttcF9mcmVlKCBkaXNwX2J1ZmZlciApOworICAgIH0KKworICAgIC0tIHNlcmlhbF90ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIGlmICggc2VyaWFsX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgPT0gMCApIHsKKworICAgICAgICAvKiByZXR1cm4gdG8gdGhlIHBhcmFsbGVsIHNlY3Rpb24gKi8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICAgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgc2VyaWFsX3RlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkICkgeworICAgICAgICAgICAgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworICAgICAgICAgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJnNlcmlhbF90ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfbXhjc3IoICZzZXJpYWxfdGVhbS0+dC50X214Y3NyICk7CisgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50OworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3RpZCA9IHNlcmlhbF90ZWFtIC0+IHQudF9tYXN0ZXJfdGlkOworCisgICAgICAgIC8qIHJlc3RvcmUgdmFsdWVzIGNhY2hlZCBpbiB0aGUgdGhyZWFkICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fbnByb2MgICAgID0gc2VyaWFsX3RlYW0gLT4gdC50X3BhcmVudCAtPiB0LnRfbnByb2M7ICAgICAgICAgIC8qICBKUEggKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfdGVhbV9tYXN0ZXIgICAgPSBzZXJpYWxfdGVhbSAtPiB0LnRfcGFyZW50IC0+IHQudF90aHJlYWRzWzBdOyAgICAgLyogSlBIICovCisgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgLyogVE9ETyB0aGUgYmVsb3cgc2hvdWxkbid0IG5lZWQgdG8gYmUgYWRqdXN0ZWQgZm9yIHNlcmlhbGl6ZWQgdGVhbXMgKi8KKyAgICAgICAgdGhpc190aHIgLT4gdGgudGhfZGlzcGF0Y2ggICAgICAgPSAmIHRoaXNfdGhyIC0+IHRoLnRoX3RlYW0gLT4KKyAgICAgICAgICAgIHQudF9kaXNwYXRjaFsgc2VyaWFsX3RlYW0gLT4gdC50X21hc3Rlcl90aWQgXTsKKworICAgICAgICBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKCB0aGlzX3RociApOworCisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMCApOworICAgICAgICB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMTsKKworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgLy8gQ29weSB0aGUgdGFzayB0ZWFtIGZyb20gdGhlIG5ldyBjaGlsZCAvIG9sZCBwYXJlbnQgdGVhbSB0byB0aGUgdGhyZWFkLgorICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIHJlc3RvcmluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyIC0+IHRoLnRoX3Rhc2tfdGVhbSwgdGhpc190aHIgLT4gdGgudGhfdGVhbSApICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgZGVjcmVhc2luZyBuZXN0aW5nIGRlcHRoIG9mIHNlcmlhbCB0ZWFtICVwIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF9wYXJhbGxlbCggZ2xvYmFsX3RpZCwgTlVMTCApOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitFeGVjdXRlIDx0dD5mbHVzaDwvdHQ+LiBUaGlzIGlzIGltcGxlbWVudGVkIGFzIGEgZnVsbCBtZW1vcnkgZmVuY2UuIChUaG91Z2gKK2RlcGVuZGluZyBvbiB0aGUgbWVtb3J5IG9yZGVyaW5nIGNvbnZlbnRpb24gb2JleWVkIGJ5IHRoZSBjb21waWxlcgorZXZlbiB0aGF0IG1heSBub3QgYmUgbmVjZXNzYXJ5KS4KKyovCit2b2lkCitfX2ttcGNfZmx1c2goaWRlbnRfdCAqbG9jKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZmx1c2g6IGNhbGxlZFxuIiApICk7CisKKyAgICAvKiBuZWVkIGV4cGxpY2l0IF9fbWYoKSBoZXJlIHNpbmNlIHVzZSB2b2xhdGlsZSBpbnN0ZWFkIGluIGxpYnJhcnkgKi8KKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICNpZiAoIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKQorICAgICAgICAjaWYgS01QX01JQworICAgICAgICAgICAgLy8gZmVuY2Utc3R5bGUgaW5zdHJ1Y3Rpb25zIGRvIG5vdCBleGlzdCwgYnV0IGxvY2s7IHhhZGRsICQwLCglcnNwKSBjYW4gYmUgdXNlZC4KKyAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBuZWVkIGl0LCB0aG91Z2gsIHNpbmNlIHRoZSBBQkkgcnVsZXMgcmVxdWlyZSB0aGF0CisgICAgICAgICAgICAvLyAqIElmIHRoZSBjb21waWxlciBnZW5lcmF0ZXMgTkdPIHN0b3JlcyBpdCBhbHNvIGdlbmVyYXRlcyB0aGUgZmVuY2UKKyAgICAgICAgICAgIC8vICogSWYgdXNlcnMgaGFuZC1jb2RlIE5HTyBzdG9yZXMgdGhleSBzaG91bGQgaW5zZXJ0IHRoZSBmZW5jZQorICAgICAgICAgICAgLy8gdGhlcmVmb3JlIG5vIGluY29tcGxldGUgdW5vcmRlcmVkIHN0b3JlcyBzaG91bGQgYmUgdmlzaWJsZS4KKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIC8vIEM3NDQwNAorICAgICAgICAgICAgLy8gVGhpcyBpcyB0byBhZGRyZXNzIG5vbi10ZW1wb3JhbCBzdG9yZSBpbnN0cnVjdGlvbnMgKHNmZW5jZSBuZWVkZWQpLgorICAgICAgICAgICAgLy8gVGhlIGNsZmx1c2ggaW5zdHJ1Y3Rpb24gaXMgYWRkcmVzc2VkIGVpdGhlciAobWZlbmNlIG5lZWRlZCkuCisgICAgICAgICAgICAvLyBQcm9iYWJseSB0aGUgbm9uLXRlbXBvcmFsIGxvYWQgbW9udnRkcWEgaW5zdHJ1Y3Rpb24gc2hvdWxkIGFsc28gYmUgYWRkcmVzc2VkLgorICAgICAgICAgICAgLy8gbWZlbmNlIGlzIGEgU1NFMiBpbnN0cnVjdGlvbi4gRG8gbm90IGV4ZWN1dGUgaXQgaWYgQ1BVIGlzIG5vdCBTU0UyLgorICAgICAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICYgX19rbXBfY3B1aW5mbyApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLnNzZTIgKSB7CisgICAgICAgICAgICAgICAgLy8gQ1BVIGNhbm5vdCBleGVjdXRlIFNTRTIgaW5zdHJ1Y3Rpb25zLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAgICAgICAgIF9tbV9tZmVuY2UoKTsKKyAgICAgICAgICAgICAgICAjZWxpZiBLTVBfQ09NUElMRVJfTVNWQworICAgICAgICAgICAgICAgIE1lbW9yeUJhcnJpZXIoKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgIF9fc3luY19zeW5jaHJvbml6ZSgpOworICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAjZW5kaWYgLy8gS01QX01JQworICAgICNlbGlmIChLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkKKyAgICAgICAgLy8gTm90aGluZyB0byBzZWUgaGVyZSBtb3ZlIGFsb25nCisgICAgI2VsaWYgS01QX0FSQ0hfUFBDNjQKKyAgICAgICAgLy8gTm90aGluZyBuZWVkZWQgaGVyZSAod2UgaGF2ZSBhIHJlYWwgTUIgYWJvdmUpLgorICAgICAgICAjaWYgS01QX09TX0NOSworICAgICAgICAvLyBUaGUgZmx1c2hpbmcgdGhyZWFkIG5lZWRzIHRvIHlpZWxkIGhlcmU7IHRoaXMgcHJldmVudHMgYQorICAgICAgIC8vIGJ1c3ktd2FpdGluZyB0aHJlYWQgZnJvbSBzYXR1cmF0aW5nIHRoZSBwaXBlbGluZS4gZmx1c2ggaXMKKyAgICAgICAgICAvLyBvZnRlbiB1c2VkIGluIGxvb3BzIGxpa2UgdGhpczoKKyAgICAgICAgICAgLy8gd2hpbGUgKCFmbGFnKSB7CisgICAgICAgICAgIC8vICAgI3ByYWdtYSBvbXAgZmx1c2goZmxhZykKKyAgICAgICAgICAgLy8gfQorICAgICAgIC8vIGFuZCBhZGRpbmcgdGhlIHlpZWxkIGhlcmUgaXMgZ29vZCBmb3IgYXQgbGVhc3QgYSAxMHggc3BlZWR1cAorICAgICAgICAgIC8vIHdoZW4gcnVubmluZyA+MiB0aHJlYWRzIHBlciBjb3JlIChvbiB0aGUgTkFTIExVIGJlbmNobWFyaykuCisgICAgICAgICAgICBfX2ttcF95aWVsZChUUlVFKTsKKyAgICAgICAgI2VuZGlmCisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlCisgICAgI2VuZGlmCisKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCisKK0V4ZWN1dGUgYSBiYXJyaWVyLgorKi8KK3ZvaWQKK19fa21wY19iYXJyaWVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9CQVJSSUVSKTsKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2JhcnJpZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsgLy8gPz8/IFdoYXQgZG9lcyBpdCBtZWFuIGZvciB0aGUgdXNlcj8KKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICBfX2ttcF9jaGVja19iYXJyaWVyKCBnbG9iYWxfdGlkLCBjdF9iYXJyaWVyLCBsb2MgKTsKKyAgICB9CisKKyAgICBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF0tPnRoLnRoX2lkZW50ID0gbG9jOworICAgIC8vIFRPRE86IGV4cGxpY2l0IGJhcnJpZXJfd2FpdF9pZDoKKyAgICAvLyAgIHRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIHdoZW4gJ2JhcnJpZXInIGRpcmVjdGl2ZSBpcyBwcmVzZW50IG9yCisgICAgLy8gICBpbXBsaWNpdCBiYXJyaWVyIGF0IHRoZSBlbmQgb2YgYSB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QuCisgICAgLy8gMSkgYmV0dGVyIHRvIGFkZCBhIHBlci10aHJlYWQgYmFycmllciBjb3VudGVyIHRvIGEgdGhyZWFkIGRhdGEgc3RydWN0dXJlCisgICAgLy8gMikgc2V0IHRvIDAgd2hlbiBhIG5ldyB0ZWFtIGlzIGNyZWF0ZWQKKyAgICAvLyA0KSBubyBzeW5jIGlzIHJlcXVpcmVkCisKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworfQorCisvKiBUaGUgQkFSUklFUiBmb3IgYSBNQVNURVIgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlciAuCitAcmV0dXJuIDEgaWYgdGhpcyB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIDx0dD5tYXN0ZXI8L3R0PiBibG9jaywgMCBvdGhlcndpc2UuCisqLwora21wX2ludDMyCitfX2ttcGNfbWFzdGVyKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAgaW50IHN0YXR1cyA9IDA7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmKCBLTVBfTUFTVEVSX0dUSUQoIGdsb2JhbF90aWQgKSkgeworICAgICAgICBLTVBfQ09VTlRfQkxPQ0soT01QX01BU1RFUik7CisgICAgICAgIEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF9tYXN0ZXIpOworICAgICAgICBzdGF0dXMgPSAxOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKHN0YXR1cykgeworICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbWFzdGVyX2JlZ2luKSkgeworICAgICAgICAgICAga21wX2luZm9fdCAgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgICp0ZWFtICAgICAgICAgICAgPSB0aGlzX3RociAtPiB0aC50aF90ZWFtOworCisgICAgICAgICAgICBpbnQgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfYmVnaW4pKAorICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgaWYgKHN0YXR1cykKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwsIDAgKTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgX19rbXBfY2hlY2tfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgIGlmIChzdGF0dXMpCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jLCBOVUxMICk7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3N5bmMoIGdsb2JhbF90aWQsIGN0X21hc3RlciwgbG9jLCBOVUxMICk7CisjZW5kaWYKKyAgICB9CisKKyAgICByZXR1cm4gc3RhdHVzOworfQorCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KKworTWFyayB0aGUgZW5kIG9mIGEgPHR0Pm1hc3RlcjwvdHQ+IHJlZ2lvbi4gVGhpcyBzaG91bGQgb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZAordGhhdCBleGVjdXRlcyB0aGUgPHR0Pm1hc3RlcjwvdHQ+IHJlZ2lvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX21hc3RlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggS01QX01BU1RFUl9HVElEKCBnbG9iYWxfdGlkICkpOworICAgIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAga21wX2luZm9fdCAgKnRoaXNfdGhyICAgICAgICA9IF9fa21wX3RocmVhZHNbIGdsb2JhbF90aWQgXTsKKyAgICBrbXBfdGVhbV90ICAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9tYXN0ZXJfZW5kKSkgeworICAgICAgICBpbnQgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X21hc3Rlcl9lbmQpKAorICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGdsb2JhbF90aWQgPCAwICkKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBUaHJlYWRJZGVudEludmFsaWQgKTsKKworICAgICAgICBpZiggS01QX01BU1RFUl9HVElEKCBnbG9iYWxfdGlkICkpCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MgKTsKKyAgICB9Cit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIuCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhbiA8dHQ+b3JkZXJlZDwvdHQ+IGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfb3JkZXJlZCggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCBjaWQgPSAwOworICAgIGttcF9pbmZvX3QgKnRoOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX29yZGVyZWQ6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9wcmVwKCBndGlkICk7CisgICAgLy8gVE9ETzogb3JkZXJlZF93YWl0X2lkCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLyogT01QVCBzdGF0ZSB1cGRhdGUgKi8KKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9ICh1aW50NjRfdCkgbG9jOworICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9vcmRlcmVkOworCisgICAgICAgIC8qIE9NUFQgZXZlbnQgY2FsbGJhY2sgKi8KKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X29yZGVyZWQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfd2FpdF9vcmRlcmVkKSgKKyAgICAgICAgICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kZW9fZmNuICE9IDAgKQorICAgICAgICAoKnRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbikoICYgZ3RpZCwgJiBjaWQsIGxvYyApOworICAgIGVsc2UKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfZGVvKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvKiBPTVBUIHN0YXRlIHVwZGF0ZSAqLworICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisKKyAgICAgICAgLyogT01QVCBldmVudCBjYWxsYmFjayAqLworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX29yZGVyZWQpKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZCkoCisgICAgICAgICAgICAgICAgdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBndGlkICBnbG9iYWwgdGhyZWFkIG51bWJlci4KKworRW5kIGV4ZWN1dGlvbiBvZiBhbiA8dHQ+b3JkZXJlZDwvdHQ+IGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX29yZGVyZWQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgY2lkID0gMDsKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX29yZGVyZWQ6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9lbmQoIGd0aWQgKTsKKyAgICAvLyBUT0RPOiBvcmRlcmVkX3dhaXRfaWQKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICB0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIGlmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZHhvX2ZjbiAhPSAwICkKKyAgICAgICAgKCp0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24pKCAmIGd0aWQsICYgY2lkLCBsb2MgKTsKKyAgICBlbHNlCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2R4byggJiBndGlkLCAmIGNpZCwgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZCkoCisgICAgICAgICAgICB0aC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICB9CisjZW5kaWYKK30KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2luaXRfaW5kaXJlY3RfY3NwdHIoa21wX2NyaXRpY2FsX25hbWUgKiBjcml0LCBpZGVudF90IGNvbnN0ICogbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcpCit7CisgICAgLy8gUG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGluZGlyZWN0IGxvY2sgaXMgd3JpdHRlbiB0byBjcml0LCB3aGlsZSBpbmRleGluZyBpcyBpZ25vcmVkLgorICAgIHZvaWQgKmlkeDsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICoqbGNrOworICAgIGxjayA9IChrbXBfaW5kaXJlY3RfbG9ja190ICoqKWNyaXQ7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jaygmaWR4LCBndGlkLCB0YWcpOworICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIGluaXQpKGlsay0+bG9jayk7CisgICAgS01QX1NFVF9JX0xPQ0tfTE9DQVRJT04oaWxrLCBsb2MpOworICAgIEtNUF9TRVRfSV9MT0NLX0ZMQUdTKGlsaywga21wX2xmX2NyaXRpY2FsX3NlY3Rpb24pOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2luaXRfaW5kaXJlY3RfY3NwdHI6IGluaXRpYWxpemVkIGluZGlyZWN0IGxvY2sgIyVkXG4iLCB0YWcpKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKGlsay0+bG9jaywgbG9jKTsKKyNlbmRpZgorICAgIGludCBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKGxjaywgMCwgaWxrKTsKKyAgICBpZiAoc3RhdHVzID09IDApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9kZXN0cm95ZWQoaWxrLT5sb2NrKTsKKyNlbmRpZgorICAgICAgICAvLyBXZSBkb24ndCByZWFsbHkgbmVlZCB0byBkZXN0cm95IHRoZSB1bmNsYWltZWQgbG9jayBoZXJlIHNpbmNlIGl0IHdpbGwgYmUgY2xlYW5lZCB1cCBhdCBwcm9ncmFtIGV4aXQuCisgICAgICAgIC8vS01QX0RfTE9DS19GVU5DKCZpZHgsIGRlc3Ryb3kpKChrbXBfZHluYV9sb2NrX3QgKikmaWR4KTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCgqbGNrICE9IE5VTEwpOworfQorCisvLyBGYXN0LXBhdGggYWNxdWlyZSB0YXMgbG9jaworI2RlZmluZSBLTVBfQUNRVUlSRV9UQVNfTE9DSyhsb2NrLCBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX3Rhc19sb2NrX3QgKmwgPSAoa21wX3Rhc19sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAobC0+bGsucG9sbCAhPSBLTVBfTE9DS19GUkVFKHRhcykgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJihsLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSkpIHsgICAgICBcCisgICAgICAgIGttcF91aW50MzIgc3BpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9ZSUVMRChUUlVFKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfYmFja29mZl90IGJhY2tvZmYgPSBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHdoaWxlIChsLT5say5wb2xsICE9IEtNUF9MT0NLX0ZSRUUodGFzKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpKSB7ICAgXAorICAgICAgICAgICAgX19rbXBfc3Bpbl9iYWNrb2ZmKCZiYWNrb2ZmKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oc3BpbnMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQobCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorfQorCisvLyBGYXN0LXBhdGggdGVzdCB0YXMgbG9jaworI2RlZmluZSBLTVBfVEVTVF9UQVNfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfdGFzX2xvY2tfdCAqbCA9IChrbXBfdGFzX2xvY2tfdCAqKWxvY2s7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgcmMgPSBsLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSAmJiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCYobC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykpOyAgIFwKK30KKworLy8gRmFzdC1wYXRoIHJlbGVhc2UgdGFzIGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfVEFTX0xPQ0sobG9jaywgZ3RpZCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIFRDV180KCgoa21wX3Rhc19sb2NrX3QgKilsb2NrKS0+bGsucG9sbCwgS01QX0xPQ0tfRlJFRSh0YXMpKTsgICBcCisgICAgS01QX01CKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI2lmIEtNUF9VU0VfRlVURVgKKworIyBpbmNsdWRlIDx1bmlzdGQuaD4KKyMgaW5jbHVkZSA8c3lzL3N5c2NhbGwuaD4KKyMgaWZuZGVmIEZVVEVYX1dBSVQKKyMgIGRlZmluZSBGVVRFWF9XQUlUIDAKKyMgZW5kaWYKKyMgaWZuZGVmIEZVVEVYX1dBS0UKKyMgIGRlZmluZSBGVVRFWF9XQUtFIDEKKyMgZW5kaWYKKworLy8gRmFzdC1wYXRoIGFjcXVpcmUgZnV0ZXggbG9jaworI2RlZmluZSBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKGxvY2ssIGd0aWQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgZ3RpZF9jb2RlID0gKGd0aWQrMSkgPDwgMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoZnR4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHdoaWxlICgocG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoJihmdHgtPmxrLnBvbGwpLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTE9DS19CVVNZKGd0aWRfY29kZSwgZnV0ZXgpKSkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkpIHsgICAgIFwKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIWNvbmQpIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMigmKGZ0eC0+bGsucG9sbCksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpKSkgeyAgICAgIFwKKyAgICAgICAgICAgICAgICBjb250aW51ZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBwb2xsX3ZhbCB8PSBLTVBfTE9DS19CVVNZKDEsIGZ1dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBrbXBfaW50MzIgcmM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICgocmMgPSBzeXNjYWxsKF9fTlJfZnV0ZXgsICYoZnR4LT5say5wb2xsKSwgRlVURVhfV0FJVCwgcG9sbF92YWwsIE5VTEwsIE5VTEwsIDApKSAhPSAwKSB7ICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGNvbnRpbnVlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGd0aWRfY29kZSB8PSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChmdHgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCB0ZXN0IGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1RFU1RfRlVURVhfTE9DSyhsb2NrLCBndGlkLCByYykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGttcF9mdXRleF9sb2NrX3QgKmZ0eCA9IChrbXBfZnV0ZXhfbG9ja190ICopbG9jazsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSA8PCAxLCBmdXRleCkpKSB7ICAgIFwKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByYyA9IFRSVUU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmMgPSBGQUxTRTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKy8vIEZhc3QtcGF0aCByZWxlYXNlIGZ1dGV4IGxvY2sKKyNkZWZpbmUgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsb2NrLCBndGlkKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2Z1dGV4X2xvY2tfdCAqZnR4ID0gKGttcF9mdXRleF9sb2NrX3QgKilsb2NrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKGZ0eCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAga21wX2ludDMyIHBvbGxfdmFsID0gS01QX1hDSEdfRklYRUQzMigmKGZ0eC0+bGsucG9sbCksIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc3lzY2FsbChfX05SX2Z1dGV4LCAmKGZ0eC0+bGsucG9sbCksIEZVVEVYX1dBS0UsIEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpLCBOVUxMLCBOVUxMLCAwKTsgICBcCisgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIEtNUF9NQigpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBLTVBfWUlFTEQoVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7ICAgICAgICAgICAgICBcCit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0ZVVEVYCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKK3N0YXRpYyBrbXBfdXNlcl9sb2NrX3AKK19fa21wX2dldF9jcml0aWNhbF9zZWN0aW9uX3B0cigga21wX2NyaXRpY2FsX25hbWUgKiBjcml0LCBpZGVudF90IGNvbnN0ICogbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VzZXJfbG9ja19wICpsY2tfcHAgPSAoa21wX3VzZXJfbG9ja19wICopY3JpdDsKKworICAgIC8vCisgICAgLy8gQmVjYXVzZSBvZiB0aGUgZG91YmxlLWNoZWNrLCB0aGUgZm9sbG93aW5nIGxvYWQKKyAgICAvLyBkb2Vzbid0IG5lZWQgdG8gYmUgdm9sYXRpbGUuCisgICAgLy8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisKKyAgICBpZiAoIGxjayA9PSBOVUxMICkgeworICAgICAgICB2b2lkICogaWR4OworCisgICAgICAgIC8vIEFsbG9jYXRlICYgaW5pdGlhbGl6ZSB0aGUgbG9jay4KKyAgICAgICAgLy8gUmVtZW1iZXIgYWxsb2NhdGVkIGxvY2tzIGluIHRhYmxlIGluIG9yZGVyIHRvIGZyZWUgdGhlbSBpbiBfX2ttcF9jbGVhbnVwKCkKKyAgICAgICAgbGNrID0gX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCAmaWR4LCBndGlkLCBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApOworICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcyggbGNrICk7CisgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGxjayApOworICAgICAgICAgICAgLy8gX19rbXBfaXR0X2NyaXRpY2FsX2NyZWF0aW5nKCkgc2hvdWxkIGJlIGNhbGxlZCAqYmVmb3JlKiB0aGUgZmlyc3QgdXNhZ2Ugb2YgdW5kZXJseWluZworICAgICAgICAgICAgLy8gbG9jay4gSXQgaXMgdGhlIG9ubHkgcGxhY2Ugd2hlcmUgd2UgY2FuIGd1YXJhbnRlZSBpdC4gVGhlcmUgYXJlIGNoYW5jZXMgdGhlIGxvY2sgd2lsbAorICAgICAgICAgICAgLy8gZGVzdHJveWVkIHdpdGggbm8gdXNhZ2UsIGJ1dCBpdCBpcyBub3QgYSBwcm9ibGVtLCBiZWNhdXNlIHRoaXMgaXMgbm90IHJlYWwgZXZlbnQgc2VlbgorICAgICAgICAgICAgLy8gYnkgdXNlciBidXQgcmF0aGVyIHNldHRpbmcgbmFtZSBmb3Igb2JqZWN0IChsb2NrKS4gU2VlIG1vcmUgZGV0YWlscyBpbiBrbXBfaXR0LmguCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVzZSBhIGNtcHhjaGcgaW5zdHJ1Y3Rpb24gdG8gc2xhbSB0aGUgc3RhcnQgb2YgdGhlIGNyaXRpY2FsCisgICAgICAgIC8vIHNlY3Rpb24gd2l0aCB0aGUgbG9jayBwb2ludGVyLiAgSWYgYW5vdGhlciB0aHJlYWQgYmVhdCB1cworICAgICAgICAvLyB0byBpdCwgZGVhbGxvY2F0ZSB0aGUgbG9jaywgYW5kIHVzZSB0aGUgbG9jayB0aGF0IHRoZSBvdGhlcgorICAgICAgICAvLyB0aHJlYWQgYWxsb2NhdGVkLgorICAgICAgICAvLworICAgICAgICBpbnQgc3RhdHVzID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUiggbGNrX3BwLCAwLCBsY2sgKTsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgLy8gRGVhbGxvY2F0ZSB0aGUgbG9jayBhbmQgcmVsb2FkIHRoZSB2YWx1ZS4KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAvLyBMZXQgSVRUIGtub3cgdGhlIGxvY2sgaXMgZGVzdHJveWVkIGFuZCB0aGUgc2FtZSBtZW1vcnkgbG9jYXRpb24gbWF5IGJlIHJldXNlZCBmb3IKKyAgICAgICAgICAgICAgICAvLyBhbm90aGVyIHB1cnBvc2UuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjayApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2ZyZWUoICZpZHgsIGd0aWQsIGxjayApOworICAgICAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcClUQ1JfUFRSKCAqbGNrX3BwICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiBsY2s7Cit9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyIC4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLCBvcgorc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCisKK0VudGVyIGNvZGUgcHJvdGVjdGVkIGJ5IGEgYGNyaXRpY2FsYCBjb25zdHJ1Y3QuCitUaGlzIGZ1bmN0aW9uIGJsb2NrcyB1bnRpbCB0aGUgZXhlY3V0aW5nIHRocmVhZCBjYW4gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24uCisqLwordm9pZAorX19rbXBjX2NyaXRpY2FsKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkKK3sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQobG9jLCBnbG9iYWxfdGlkLCBjcml0LCBvbXBfbG9ja19oaW50X25vbmUpOworI2Vsc2UKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0NSSVRJQ0FMKTsKKyAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfY3JpdGljYWxfd2FpdCk7ICAgICAgICAvKiBUaW1lIHNwZW50IHdhaXRpbmcgdG8gZW50ZXIgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLy9UT0RPOiBhZGQgVEhSX09WSERfU1RBVEUKKworICAgIEtNUF9DSEVDS19VU0VSX0xPQ0tfSU5JVCgpOworCisgICAgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfQ1JJVElDQUxfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7IC8vIHRpY2tldCwgcXVldWluZyBvciBkcmRwYQorICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2sgKTsKKworICAgIC8qIHNpbmNlIHRoZSBjcml0aWNhbCBkaXJlY3RpdmUgYmluZHMgdG8gYWxsIHRocmVhZHMsIG5vdCBqdXN0CisgICAgICogdGhlIGN1cnJlbnQgdGVhbSB3ZSBoYXZlIHRvIGNoZWNrIHRoaXMgZXZlbiBpZiB3ZSBhcmUgaW4gYQorICAgICAqIHNlcmlhbGl6ZWQgdGVhbSAqLworICAgIC8qIGFsc28sIGV2ZW4gaWYgd2UgYXJlIHRoZSB1YmVyIHRocmVhZCwgd2Ugc3RpbGwgaGF2ZSB0byBjb25kdWN0IHRoZSBsb2NrLAorICAgICAqIGFzIHdlIGhhdmUgdG8gY29udGVuZCB3aXRoIHNpYmxpbmcgdGhyZWFkcyAqLworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfY3JpdGljYWwpOworICAgIEtBX1RSQUNFKCAxNSwgKCJfX2ttcGNfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gQ29udmVydHMgdGhlIGdpdmVuIGhpbnQgdG8gYW4gaW50ZXJuYWwgbG9jayBpbXBsZW1lbnRhdGlvbgorc3RhdGljIF9fZm9yY2VpbmxpbmUga21wX2R5bmFfbG9ja3NlcV90CitfX2ttcF9tYXBfaGludF90b19sb2NrKHVpbnRwdHJfdCBoaW50KQoreworI2lmIEtNUF9VU0VfVFNYCisjIGRlZmluZSBLTVBfVFNYX0xPQ0soc2VxKSBsb2Nrc2VxXyMjc2VxCisjZWxzZQorIyBkZWZpbmUgS01QX1RTWF9MT0NLKHNlcSkgX19rbXBfdXNlcl9sb2NrX3NlcQorI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGRlZmluZSBLTVBfQ1BVSU5GT19SVE0gKF9fa21wX2NwdWluZm8ucnRtKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9DUFVJTkZPX1JUTSAwCisjZW5kaWYKKworICAgIC8vIEhpbnRzIHRoYXQgZG8gbm90IHJlcXVpcmUgZnVydGhlciBsb2dpYworICAgIGlmIChoaW50ICYga21wX2xvY2tfaGludF9obGUpCisgICAgICAgIHJldHVybiBLTVBfVFNYX0xPQ0soaGxlKTsKKyAgICBpZiAoaGludCAmIGttcF9sb2NrX2hpbnRfcnRtKQorICAgICAgICByZXR1cm4gS01QX0NQVUlORk9fUlRNID8gS01QX1RTWF9MT0NLKHJ0bSk6IF9fa21wX3VzZXJfbG9ja19zZXE7CisgICAgaWYgKGhpbnQgJiBrbXBfbG9ja19oaW50X2FkYXB0aXZlKQorICAgICAgICByZXR1cm4gS01QX0NQVUlORk9fUlRNID8gS01QX1RTWF9MT0NLKGFkYXB0aXZlKTogX19rbXBfdXNlcl9sb2NrX3NlcTsKKworICAgIC8vIFJ1bGUgb3V0IGNvbmZsaWN0aW5nIGhpbnRzIGZpcnN0IGJ5IHJldHVybmluZyB0aGUgZGVmYXVsdCBsb2NrCisgICAgaWYgKChoaW50ICYgb21wX2xvY2tfaGludF9jb250ZW5kZWQpICYmIChoaW50ICYgb21wX2xvY2tfaGludF91bmNvbnRlbmRlZCkpCisgICAgICAgIHJldHVybiBfX2ttcF91c2VyX2xvY2tfc2VxOworICAgIGlmICgoaGludCAmIG9tcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUpICYmIChoaW50ICYgb21wX2xvY2tfaGludF9ub25zcGVjdWxhdGl2ZSkpCisgICAgICAgIHJldHVybiBfX2ttcF91c2VyX2xvY2tfc2VxOworCisgICAgLy8gRG8gbm90IGV2ZW4gY29uc2lkZXIgc3BlY3VsYXRpb24gd2hlbiBpdCBhcHBlYXJzIHRvIGJlIGNvbnRlbmRlZAorICAgIGlmIChoaW50ICYgb21wX2xvY2tfaGludF9jb250ZW5kZWQpCisgICAgICAgIHJldHVybiBsb2Nrc2VxX3F1ZXVpbmc7CisKKyAgICAvLyBVbmNvbnRlbmRlZCBsb2NrIHdpdGhvdXQgc3BlY3VsYXRpb24KKyAgICBpZiAoKGhpbnQgJiBvbXBfbG9ja19oaW50X3VuY29udGVuZGVkKSAmJiAhKGhpbnQgJiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlKSkKKyAgICAgICAgcmV0dXJuIGxvY2tzZXFfdGFzOworCisgICAgLy8gSExFIGxvY2sgZm9yIHNwZWN1bGF0aW9uCisgICAgaWYgKGhpbnQgJiBvbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlKQorICAgICAgICByZXR1cm4gS01QX1RTWF9MT0NLKGhsZSk7CisKKyAgICByZXR1cm4gX19rbXBfdXNlcl9sb2NrX3NlcTsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbi4KK0BwYXJhbSBnbG9iYWxfdGlkICBnbG9iYWwgdGhyZWFkIG51bWJlci4KK0BwYXJhbSBjcml0IGlkZW50aXR5IG9mIHRoZSBjcml0aWNhbCBzZWN0aW9uLiBUaGlzIGNvdWxkIGJlIGEgcG9pbnRlciB0byBhIGxvY2sgYXNzb2NpYXRlZCB3aXRoIHRoZSBjcml0aWNhbCBzZWN0aW9uLAorb3Igc29tZSBvdGhlciBzdWl0YWJseSB1bmlxdWUgdmFsdWUuCitAcGFyYW0gaGludCB0aGUgbG9jayBoaW50LgorCitFbnRlciBjb2RlIHByb3RlY3RlZCBieSBhIGBjcml0aWNhbGAgY29uc3RydWN0IHdpdGggYSBoaW50LiBUaGUgaGludCB2YWx1ZSBpcyB1c2VkIHRvIHN1Z2dlc3QgYSBsb2NrIGltcGxlbWVudGF0aW9uLgorVGhpcyBmdW5jdGlvbiBibG9ja3MgdW50aWwgdGhlIGV4ZWN1dGluZyB0aHJlYWQgY2FuIGVudGVyIHRoZSBjcml0aWNhbCBzZWN0aW9uIHVubGVzcyB0aGUgaGludCBzdWdnZXN0cyB1c2Ugb2YKK3NwZWN1bGF0aXZlIGV4ZWN1dGlvbiBhbmQgdGhlIGhhcmR3YXJlIHN1cHBvcnRzIGl0LgorKi8KK3ZvaWQKK19fa21wY19jcml0aWNhbF93aXRoX2hpbnQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQsIHVpbnRwdHJfdCBoaW50ICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0NSSVRJQ0FMKTsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAga21wX2R5bmFfbG9ja190ICpsayA9IChrbXBfZHluYV9sb2NrX3QgKiljcml0OworICAgIC8vIENoZWNrIGlmIGl0IGlzIGluaXRpYWxpemVkLgorICAgIGlmICgqbGsgPT0gMCkgeworICAgICAgICBrbXBfZHluYV9sb2Nrc2VxX3QgbGNrc2VxID0gX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KTsKKyAgICAgICAgaWYgKEtNUF9JU19EX0xPQ0sobGNrc2VxKSkgeworICAgICAgICAgICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKiljcml0LCAwLCBLTVBfR0VUX0RfVEFHKGxja3NlcSkpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfaW5pdF9pbmRpcmVjdF9jc3B0cihjcml0LCBsb2MsIGdsb2JhbF90aWQsIEtNUF9HRVRfSV9UQUcobGNrc2VxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQnJhbmNoIGZvciBhY2Nlc3NpbmcgdGhlIGFjdHVhbCBsb2NrIG9iamVjdCBhbmQgc2V0IG9wZXJhdGlvbi4gVGhpcyBicmFuY2hpbmcgaXMgaW5ldml0YWJsZSBzaW5jZQorICAgIC8vIHRoaXMgbG9jayBpbml0aWFsaXphdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIG5vcm1hbCBkaXNwYXRjaCBwYXRoIChsb2NrIHRhYmxlIGlzIG5vdCB1c2VkKS4KKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcobGspICE9IDApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcClsazsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgX19rbXBfcHVzaF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7CisgICAgICAgIH0KKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nKGxjayk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV90YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX0FDUVVJUkVfVEFTX0xPQ0sobGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfSBlbHNlCisjIGVsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgICAgIGlmIChfX2ttcF91c2VyX2xvY2tfc2VxID09IGxvY2tzZXFfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX0FDUVVJUkVfRlVURVhfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0RfTE9DS19GVU5DKGxrLCBzZXQpKGxrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmlsayA9ICooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopbGspOworICAgICAgICBsY2sgPSBpbGstPmxvY2s7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2ssIF9fa21wX21hcF9oaW50X3RvX2xvY2soaGludCkpOworICAgICAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZyhsY2spOworIyBlbmRpZgorICAgICAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCBzZXQpKGxjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX2NyaXRpY2FsKTsKKyAgICBLQV9UUkFDRSggMTUsICgiX19rbXBjX2NyaXRpY2FsOiBkb25lIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7Cit9IC8vIF9fa21wY19jcml0aWNhbF93aXRoX2hpbnQKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24uCitAcGFyYW0gZ2xvYmFsX3RpZCAgZ2xvYmFsIHRocmVhZCBudW1iZXIgLgorQHBhcmFtIGNyaXQgaWRlbnRpdHkgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24uIFRoaXMgY291bGQgYmUgYSBwb2ludGVyIHRvIGEgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGNyaXRpY2FsIHNlY3Rpb24sIG9yCitzb21lIG90aGVyIHN1aXRhYmx5IHVuaXF1ZSB2YWx1ZS4KKworTGVhdmUgYSBjcml0aWNhbCBzZWN0aW9uLCByZWxlYXNpbmcgYW55IGxvY2sgdGhhdCB3YXMgaGVsZCBkdXJpbmcgaXRzIGV4ZWN1dGlvbi4KKyovCit2b2lkCitfX2ttcGNfZW5kX2NyaXRpY2FsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpjcml0KQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX2VuZF9jcml0aWNhbDogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSk7CisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmIChLTVBfSVNfRF9MT0NLKF9fa21wX3VzZXJfbG9ja19zZXEpKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICAgICAgS01QX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgICAgICB9CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZyggbGNrICk7CisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICAgICAgaWYgKF9fa21wX3VzZXJfbG9ja19zZXEgPT0gbG9ja3NlcV90YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfVEFTX0xPQ0sobGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfSBlbHNlCisjIGVsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgICAgIGlmIChfX2ttcF91c2VyX2xvY2tfc2VxID09IGxvY2tzZXFfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICAgICAgS01QX1JFTEVBU0VfRlVURVhfTE9DSyhsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9IGVsc2UKKyMgZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0RfTE9DS19GVU5DKGxjaywgdW5zZXQpKChrbXBfZHluYV9sb2NrX3QgKilsY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilUQ1JfUFRSKCooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdCkpOworICAgICAgICBLTVBfQVNTRVJUKGlsayAhPSBOVUxMKTsKKyAgICAgICAgbGNrID0gaWxrLT5sb2NrOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jKTsKKyAgICAgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworIyBlbmRpZgorICAgICAgICBLTVBfSV9MT0NLX0ZVTkMoaWxrLCB1bnNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0NSSVRJQ0FMX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCljcml0OworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9DUklUSUNBTF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsgLy8gdGlja2V0LCBxdWV1aW5nIG9yIGRyZHBhCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIFRDUl9QVFIoKigoa21wX3VzZXJfbG9ja19wICopY3JpdCkpOworICAgIH0KKworICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9jcml0aWNhbF9yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAvLyBWYWx1ZSBvZiAnY3JpdCcgc2hvdWxkIGJlIGdvb2QgZm9yIHVzaW5nIGFzIGEgY3JpdGljYWxfaWQgb2YgdGhlIGNyaXRpY2FsIHNlY3Rpb24gZGlyZWN0aXZlLgorICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9jcml0aWNhbCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3JlbGVhc2VfY3JpdGljYWwpKAorICAgICAgICAgICAgKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCk7CisgICAgS0FfVFJBQ0UoIDE1LCAoIl9fa21wY19lbmRfY3JpdGljYWw6IGRvbmUgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCitAcmV0dXJuIG9uZSBpZiB0aGUgdGhyZWFkIHNob3VsZCBleGVjdXRlIHRoZSBtYXN0ZXIgYmxvY2ssIHplcm8gb3RoZXJ3aXNlCisKK1N0YXJ0IGV4ZWN1dGlvbiBvZiBhIGNvbWJpbmVkIGJhcnJpZXIgYW5kIG1hc3Rlci4gVGhlIGJhcnJpZXIgaXMgZXhlY3V0ZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCisqLwora21wX2ludDMyCitfX2ttcGNfYmFycmllcl9tYXN0ZXIoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iYXJyaWVyX21hc3RlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfY2hlY2tfYmFycmllciggZ2xvYmFsX3RpZCwgY3RfYmFycmllciwgbG9jICk7CisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgc3RhdHVzID0gX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCwgVFJVRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgcmV0dXJuIChzdGF0dXMgIT0gMCkgPyAwIDogMTsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCB0aHJlYWQgaWQuCisKK0NvbXBsZXRlIHRoZSBleGVjdXRpb24gb2YgYSBjb21iaW5lZCBiYXJyaWVyIGFuZCBtYXN0ZXIuIFRoaXMgZnVuY3Rpb24gc2hvdWxkCitvbmx5IGJlIGNhbGxlZCBhdCB0aGUgY29tcGxldGlvbiBvZiB0aGUgPHR0Pm1hc3RlcjwvdHQ+IGNvZGUuIE90aGVyIHRocmVhZHMgd2lsbAorc3RpbGwgYmUgd2FpdGluZyBhdCB0aGUgYmFycmllciBhbmQgdGhpcyBjYWxsIHJlbGVhc2VzIHRoZW0uCisqLwordm9pZAorX19rbXBjX2VuZF9iYXJyaWVyX21hc3RlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX2JhcnJpZXJfbWFzdGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApKTsKKworICAgIF9fa21wX2VuZF9zcGxpdF9iYXJyaWVyICggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCApOworfQorCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIHRocmVhZCBpZC4KK0ByZXR1cm4gb25lIGlmIHRoZSB0aHJlYWQgc2hvdWxkIGV4ZWN1dGUgdGhlIG1hc3RlciBibG9jaywgemVybyBvdGhlcndpc2UKKworU3RhcnQgZXhlY3V0aW9uIG9mIGEgY29tYmluZWQgYmFycmllciBhbmQgbWFzdGVyKG5vd2FpdCkgY29uc3RydWN0LgorVGhlIGJhcnJpZXIgaXMgZXhlY3V0ZWQgaW5zaWRlIHRoaXMgZnVuY3Rpb24uCitUaGVyZSBpcyBubyBlcXVpdmFsZW50ICJlbmQiIGZ1bmN0aW9uLCBzaW5jZSB0aGUKKyovCitrbXBfaW50MzIKK19fa21wY19iYXJyaWVyX21hc3Rlcl9ub3dhaXQoIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBrbXBfaW50MzIgcmV0OworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19iYXJyaWVyX21hc3Rlcl9ub3dhaXQ6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkpOworCisgICAgaWYgKCEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkpCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIGxvYyA9PSAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIENvbnN0cnVjdElkZW50SW52YWxpZCApOyAvLyA/Pz8gV2hhdCBkb2VzIGl0IG1lYW4gZm9yIHRoZSB1c2VyPworICAgICAgICB9CisgICAgICAgIF9fa21wX2NoZWNrX2JhcnJpZXIoIGdsb2JhbF90aWQsIGN0X2JhcnJpZXIsIGxvYyApOworICAgIH0KKworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXS0+dGgudGhfaWRlbnQgPSBsb2M7CisjZW5kaWYKKyAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgcmV0ID0gX19rbXBjX21hc3RlciAobG9jLCBnbG9iYWxfdGlkKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAvKiAgdGhlcmUncyBubyBfX2ttcGNfZW5kX21hc3RlciBjYWxsZWQ7IHNvIHRoZSAoc3RhdHMpICovCisgICAgICAgIC8qICBhY3Rpb25zIG9mIF9fa21wY19lbmRfbWFzdGVyIGFyZSBkb25lIGhlcmUgICAgICAgICAgKi8KKworICAgICAgICBpZiAoIGdsb2JhbF90aWQgPCAwICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFRocmVhZElkZW50SW52YWxpZCApOworICAgICAgICB9CisgICAgICAgIGlmIChyZXQpIHsKKyAgICAgICAgICAgIC8qIG9ubHkgb25lIHRocmVhZCBzaG91bGQgZG8gdGhlIHBvcCBzaW5jZSBvbmx5ICovCisgICAgICAgICAgICAvKiBvbmUgZGlkIHRoZSBwdXNoIChzZWUgX19rbXBjX21hc3RlcigpKSAgICAgICAqLworCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfbWFzdGVyLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAocmV0KTsKK30KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcmV0dXJuIE9uZSBpZiB0aGlzIHRocmVhZCBzaG91bGQgZXhlY3V0ZSB0aGUgc2luZ2xlIGNvbnN0cnVjdCwgemVybyBvdGhlcndpc2UuCisKK1Rlc3Qgd2hldGhlciB0byBleGVjdXRlIGEgPHR0PnNpbmdsZTwvdHQ+IGNvbnN0cnVjdC4KK1RoZXJlIGFyZSBubyBpbXBsaWNpdCBiYXJyaWVycyBpbiB0aGUgdHdvICJzaW5nbGUiIGNhbGxzLCByYXRoZXIgdGhlIGNvbXBpbGVyIHNob3VsZAoraW50cm9kdWNlIGFuIGV4cGxpY2l0IGJhcnJpZXIgaWYgaXQgaXMgcmVxdWlyZWQuCisqLworCitrbXBfaW50MzIKK19fa21wY19zaW5nbGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBrbXBfaW50MzIgcmMgPSBfX2ttcF9lbnRlcl9zaW5nbGUoIGdsb2JhbF90aWQsIGxvYywgVFJVRSApOworCisgICAgaWYgKHJjKSB7CisgICAgICAgIC8vIFdlIGFyZSBnb2luZyB0byBleGVjdXRlIHRoZSBzaW5nbGUgc3RhdGVtZW50LCBzbyB3ZSBzaG91bGQgY291bnQgaXQuCisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfU0lOR0xFKTsKKyAgICAgICAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3NpbmdsZSk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAocmMpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9zaW5nbGVfaW5fYmxvY2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19iZWdpbikoCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0aGlzX3Roci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd2FpdF9zaW5nbGU7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiByYzsKK30KKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0BwYXJhbSBsb2MgIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisKK01hcmsgdGhlIGVuZCBvZiBhIDx0dD5zaW5nbGU8L3R0PiBjb25zdHJ1Y3QuICBUaGlzIGZ1bmN0aW9uIHNob3VsZAorb25seSBiZSBjYWxsZWQgYnkgdGhlIHRocmVhZCB0aGF0IGV4ZWN1dGVkIHRoZSBibG9jayBvZiBjb2RlIHByb3RlY3RlZAorYnkgdGhlIGBzaW5nbGVgIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfZW5kX3NpbmdsZShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIF9fa21wX2V4aXRfc2luZ2xlKCBnbG9iYWxfdGlkICk7CisgICAgS01QX1BPUF9QQVJUSVRJT05FRF9USU1FUigpOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociAgICAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgICAgICAgID0gdGhpc190aHIgLT4gdGgudGhfdGVhbTsKKyAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2VuZCkpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmQpKAorICAgICAgICAgICAgdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0ub21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgfQorI2VuZGlmCit9CisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgR2xvYmFsIHRocmVhZCBpZAorCitNYXJrIHRoZSBlbmQgb2YgYSBzdGF0aWNhbGx5IHNjaGVkdWxlZCBsb29wLgorKi8KK3ZvaWQKK19fa21wY19mb3Jfc3RhdGljX2ZpbmkoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQgKQoreworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19maW5pIGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSkgeworICAgICAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9lbmQpKAorICAgICAgICAgICAgdGVhbV9pbmZvLT5wYXJhbGxlbF9pZCwgdGFza19pbmZvLT50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfcGRvLCBsb2MgKTsKK30KKworLyoKKyAqIFVzZXIgcm91dGluZXMgd2hpY2ggdGFrZSBDLXN0eWxlIGFyZ3VtZW50cyAoY2FsbCBieSB2YWx1ZSkKKyAqIGRpZmZlcmVudCBmcm9tIHRoZSBGb3J0cmFuIGVxdWl2YWxlbnQgcm91dGluZXMKKyAqLworCit2b2lkCitvbXBjX3NldF9udW1fdGhyZWFkcyggaW50IGFyZyApCit7CisvLyAhISEhISBUT0RPOiBjaGVjayB0aGUgcGVyLXRhc2sgYmluZGluZworICAgIF9fa21wX3NldF9udW1fdGhyZWFkcyggYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKK30KKwordm9pZAorb21wY19zZXRfZHluYW1pYyggaW50IGZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgdGhyZWFkID0gX19rbXBfZW50cnlfdGhyZWFkKCk7CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fZHluYW1pYyggdGhyZWFkLCBmbGFnID8gVFJVRSA6IEZBTFNFICk7Cit9CisKK3ZvaWQKK29tcGNfc2V0X25lc3RlZCggaW50IGZsYWcgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIC8qIEZvciB0aGUgdGhyZWFkLXByaXZhdGUgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgc2V0X19uZXN0ZWQoIHRocmVhZCwgZmxhZyA/IFRSVUUgOiBGQUxTRSApOworfQorCit2b2lkCitvbXBjX3NldF9tYXhfYWN0aXZlX2xldmVscyggaW50IG1heF9hY3RpdmVfbGV2ZWxzICkKK3sKKyAgICAvKiBUTyBETyAqLworICAgIC8qIHdlIHdhbnQgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhpcyBpbnRlcm5hbCBjb250cm9sICovCisKKyAgICAvKiBGb3IgdGhlIHBlci10aHJlYWQgaW50ZXJuYWwgY29udHJvbHMgaW1wbGVtZW50YXRpb24gKi8KKyAgICBfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKK30KKwordm9pZAorb21wY19zZXRfc2NoZWR1bGUoIG9tcF9zY2hlZF90IGtpbmQsIGludCBtb2RpZmllciApCit7CisvLyAhISEhISBUT0RPOiBjaGVjayB0aGUgcGVyLXRhc2sgYmluZGluZworICAgIF9fa21wX3NldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCAoIGttcF9zY2hlZF90ICkga2luZCwgbW9kaWZpZXIgKTsKK30KKworaW50CitvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgbGV2ZWwgKQoreworICAgIHJldHVybiBfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCitpbnQKK29tcGNfZ2V0X3RlYW1fc2l6ZSggaW50IGxldmVsICkKK3sKKyAgICByZXR1cm4gX19rbXBfZ2V0X3RlYW1fc2l6ZSggX19rbXBfZW50cnlfZ3RpZCgpLCBsZXZlbCApOworfQorCit2b2lkCitrbXBjX3NldF9zdGFja3NpemUoIGludCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfc3RhY2tzaXplX3MoIHNpemVfdCBhcmcgKQoreworICAgIC8vIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBhcmcgKTsKK30KKwordm9pZAora21wY19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkKK3sKKyAgICBpbnQgZ3RpZCwgdGlkOworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIGFyZywgdGhyZWFkLCB0aWQgKTsKK30KKwordm9pZAora21wY19zZXRfbGlicmFyeSggaW50IGFyZyApCit7CisgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCAoZW51bSBsaWJyYXJ5X3R5cGUpYXJnICk7Cit9CisKK3ZvaWQKK2ttcGNfc2V0X2RlZmF1bHRzKCBjaGFyIGNvbnN0ICogc3RyICkKK3sKKyAgICAvLyBfX2ttcF9hdXhfc2V0X2RlZmF1bHRzIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIF9fa21wX2F1eF9zZXRfZGVmYXVsdHMoIHN0ciwgS01QX1NUUkxFTiggc3RyICkgKTsKK30KKwordm9pZAora21wY19zZXRfZGlzcF9udW1fYnVmZmVycyggaW50IGFyZyApCit7CisgICAgLy8gaWdub3JlIGFmdGVyIGluaXRpYWxpemF0aW9uIGJlY2F1c2Ugc29tZSB0ZWFtcyBoYXZlIGFscmVhZHkKKyAgICAvLyBhbGxvY2F0ZWQgZGlzcGF0Y2ggYnVmZmVycworICAgIGlmKCBfX2ttcF9pbml0X3NlcmlhbCA9PSAwICYmIGFyZyA+IDAgKQorICAgICAgICBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyA9IGFyZzsKK30KKworaW50CitrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfc2V0X2FmZmluaXR5X21hc2tfcHJvYyggcHJvYywgbWFzayApOworI2VuZGlmCit9CisKK2ludAora21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfdW5zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBwcm9jLCBtYXNrICk7CisjZW5kaWYKK30KKworaW50CitrbXBjX2dldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApCit7CisjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICByZXR1cm4gLTE7CisjZWxzZQorICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5X21hc2tfcHJvYyggcHJvYywgbWFzayApOworI2VuZGlmCit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIQorQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorQHBhcmFtIGxvYyAgICAgICBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBndGlkICAgICAgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBjcHlfc2l6ZSAgc2l6ZSBvZiB0aGUgY3B5X2RhdGEgYnVmZmVyCitAcGFyYW0gY3B5X2RhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBiZSBjb3BpZWQKK0BwYXJhbSBjcHlfZnVuYyAgaGVscGVyIGZ1bmN0aW9uIHRvIGNhbGwgZm9yIGNvcHlpbmcgZGF0YQorQHBhcmFtIGRpZGl0ICAgICBmbGFnIHZhcmlhYmxlOiAxPXNpbmdsZSB0aHJlYWQ7IDA9bm90IHNpbmdsZSB0aHJlYWQKKworX19rbXBjX2NvcHlwcml2YXRlIGltcGxlbWVudHMgdGhlIGludGVyZmFjZSBmb3IgdGhlIHByaXZhdGUgZGF0YSBicm9hZGNhc3QgbmVlZGVkIGZvcgordGhlIGNvcHlwcml2YXRlIGNsYXVzZSBhc3NvY2lhdGVkIHdpdGggYSBzaW5nbGUgcmVnaW9uIGluIGFuIE9wZW5NUDxzdXA+Kjwvc3VwPiBwcm9ncmFtIChib3RoIEMgYW5kIEZvcnRyYW4pLgorQWxsIHRocmVhZHMgcGFydGljaXBhdGluZyBpbiB0aGUgcGFyYWxsZWwgcmVnaW9uIGNhbGwgdGhpcyByb3V0aW5lLgorT25lIG9mIHRoZSB0aHJlYWRzIChjYWxsZWQgdGhlIHNpbmdsZSB0aHJlYWQpIHNob3VsZCBoYXZlIHRoZSA8dHQ+ZGlkaXQ8L3R0PiB2YXJpYWJsZSBzZXQgdG8gMQorYW5kIGFsbCBvdGhlciB0aHJlYWRzIHNob3VsZCBoYXZlIHRoYXQgdmFyaWFibGUgc2V0IHRvIDAuCitBbGwgdGhyZWFkcyBwYXNzIGEgcG9pbnRlciB0byBhIGRhdGEgYnVmZmVyIChjcHlfZGF0YSkgdGhhdCB0aGV5IGhhdmUgYnVpbHQuCisKK1RoZSBPcGVuTVAgc3BlY2lmaWNhdGlvbiBmb3JiaWRzIHRoZSB1c2Ugb2Ygbm93YWl0IG9uIHRoZSBzaW5nbGUgcmVnaW9uIHdoZW4gYSBjb3B5cHJpdmF0ZQorY2xhdXNlIGlzIHByZXNlbnQuIEhvd2V2ZXIsIEByZWYgX19rbXBjX2NvcHlwcml2YXRlIGltcGxlbWVudHMgYSBiYXJyaWVyIGludGVybmFsbHkgdG8gYXZvaWQKK3JhY2UgY29uZGl0aW9ucywgc28gdGhlIGNvZGUgZ2VuZXJhdGlvbiBmb3IgdGhlIHNpbmdsZSByZWdpb24gc2hvdWxkIGF2b2lkIGdlbmVyYXRpbmcgYSBiYXJyaWVyCithZnRlciB0aGUgY2FsbCB0byBAcmVmIF9fa21wY19jb3B5cHJpdmF0ZS4KKworVGhlIDx0dD5ndGlkPC90dD4gcGFyYW1ldGVyIGlzIHRoZSBnbG9iYWwgdGhyZWFkIGlkIGZvciB0aGUgY3VycmVudCB0aHJlYWQuCitUaGUgPHR0PmxvYzwvdHQ+IHBhcmFtZXRlciBpcyBhIHBvaW50ZXIgdG8gc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorCitJbnRlcm5hbCBpbXBsZW1lbnRhdGlvbjogVGhlIHNpbmdsZSB0aHJlYWQgd2lsbCBmaXJzdCBjb3B5IGl0cyBkZXNjcmlwdG9yIGFkZHJlc3MgKGNweV9kYXRhKQordG8gYSB0ZWFtLXByaXZhdGUgbG9jYXRpb24sIHRoZW4gdGhlIG90aGVyIHRocmVhZHMgd2lsbCBlYWNoIGNhbGwgdGhlIGZ1bmN0aW9uIHBvaW50ZWQgdG8gYnkKK3RoZSBwYXJhbWV0ZXIgY3B5X2Z1bmMsIHdoaWNoIGNhcnJpZXMgb3V0IHRoZSBjb3B5IGJ5IGNvcHlpbmcgdGhlIGRhdGEgdXNpbmcgdGhlIGNweV9kYXRhIGJ1ZmZlci4KKworVGhlIGNweV9mdW5jIHJvdXRpbmUgdXNlZCBmb3IgdGhlIGNvcHkgYW5kIHRoZSBjb250ZW50cyBvZiB0aGUgZGF0YSBhcmVhIGRlZmluZWQgYnkgY3B5X2RhdGEKK2FuZCBjcHlfc2l6ZSBtYXkgYmUgYnVpbHQgaW4gYW55IGZhc2hpb24gdGhhdCB3aWxsIGFsbG93IHRoZSBjb3B5IHRvIGJlIGRvbmUuIEZvciBpbnN0YW5jZSwKK3RoZSBjcHlfZGF0YSBidWZmZXIgY2FuIGhvbGQgdGhlIGFjdHVhbCBkYXRhIHRvIGJlIGNvcGllZCBvciBpdCBtYXkgaG9sZCBhIGxpc3Qgb2YgcG9pbnRlcnMKK3RvIHRoZSBkYXRhLiBUaGUgY3B5X2Z1bmMgcm91dGluZSBtdXN0IGludGVycHJldCB0aGUgY3B5X2RhdGEgYnVmZmVyIGFwcHJvcHJpYXRlbHkuCisKK1RoZSBpbnRlcmZhY2UgdG8gY3B5X2Z1bmMgaXMgYXMgZm9sbG93czoKK0Bjb2RlCit2b2lkIGNweV9mdW5jKCB2b2lkICpkZXN0aW5hdGlvbiwgdm9pZCAqc291cmNlICkKK0BlbmRjb2RlCit3aGVyZSB2b2lkICpkZXN0aW5hdGlvbiBpcyB0aGUgY3B5X2RhdGEgcG9pbnRlciBmb3IgdGhlIHRocmVhZCBiZWluZyBjb3BpZWQgdG8KK2FuZCB2b2lkICpzb3VyY2UgaXMgdGhlIGNweV9kYXRhIHBvaW50ZXIgZm9yIHRoZSB0aHJlYWQgYmVpbmcgY29waWVkIGZyb20uCisqLwordm9pZAorX19rbXBjX2NvcHlwcml2YXRlKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBzaXplX3QgY3B5X3NpemUsIHZvaWQgKmNweV9kYXRhLCB2b2lkKCpjcHlfZnVuYykodm9pZCosdm9pZCopLCBrbXBfaW50MzIgZGlkaXQgKQoreworICAgIHZvaWQgKipkYXRhX3B0cjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfY29weXByaXZhdGU6IGNhbGxlZCBUIyVkXG4iLCBndGlkICkpOworCisgICAgS01QX01CKCk7CisKKyAgICBkYXRhX3B0ciA9ICYgX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKS0+dC50X2NvcHlwcml2X2RhdGE7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBsb2MgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBDb25zdHJ1Y3RJZGVudEludmFsaWQgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFRvRG86IE9wdGltaXplIHRoZSBmb2xsb3dpbmcgdHdvIGJhcnJpZXJzIGludG8gc29tZSBraW5kIG9mIHNwbGl0IGJhcnJpZXIgKi8KKworICAgIGlmIChkaWRpdCkgKmRhdGFfcHRyID0gY3B5X2RhdGE7CisKKyAgICAvKiBUaGlzIGJhcnJpZXIgaXMgbm90IGEgYmFycmllciByZWdpb24gYm91bmRhcnkgKi8KKyNpZiBVU0VfSVRUX05PVElGWQorICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UgLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICBpZiAoISBkaWRpdCkgKCpjcHlfZnVuYykoIGNweV9kYXRhLCAqZGF0YV9wdHIgKTsKKworICAgIC8qIENvbnNpZGVyIG5leHQgYmFycmllciB0aGUgdXNlci12aXNpYmxlIGJhcnJpZXIgZm9yIGJhcnJpZXIgcmVnaW9uIGJvdW5kYXJpZXMgKi8KKyAgICAvKiBOZXN0aW5nIGNoZWNrcyBhcmUgYWxyZWFkeSBoYW5kbGVkIGJ5IHRoZSBzaW5nbGUgY29uc3RydWN0IGNoZWNrcyAqLworCisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9pZGVudCA9IGxvYzsgLy8gVE9ETzogY2hlY2sgaWYgaXQgaXMgbmVlZGVkIChlLmcuIHRhc2tzIGNhbiBvdmVyd3JpdGUgdGhlIGxvY2F0aW9uKQorI2VuZGlmCisgICAgX19rbXBfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UgLCAwLCBOVUxMLCBOVUxMICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgSU5JVF9MT0NLICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBJTklUX05FU1RFRF9MT0NLICAgICAgICAgIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBBQ1FVSVJFX0xPQ0sgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIEFDUVVJUkVfTE9DS19USU1FRCAgICAgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfdGltZWQKKyNkZWZpbmUgQUNRVUlSRV9ORVNURURfTE9DSyAgICAgICBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgQUNRVUlSRV9ORVNURURfTE9DS19USU1FRCBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfdGltZWQKKyNkZWZpbmUgUkVMRUFTRV9MT0NLICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBSRUxFQVNFX05FU1RFRF9MT0NLICAgICAgIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcworI2RlZmluZSBURVNUX0xPQ0sgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIFRFU1RfTkVTVEVEX0xPQ0sgICAgICAgICAgX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzCisjZGVmaW5lIERFU1RST1lfTE9DSyAgICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MKKyNkZWZpbmUgREVTVFJPWV9ORVNURURfTE9DSyAgICAgICBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MKKworCisvKgorICogVE9ETzogTWFrZSBjaGVjayBhYm9ydCBtZXNzYWdlcyB1c2UgbG9jYXRpb24gaW5mbyAmIHBhc3MgaXQKKyAqIGludG8gd2l0aF9jaGVja3Mgcm91dGluZXMKKyAqLworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gaW50ZXJuYWwgbG9jayBpbml0aWFsaXplcgorc3RhdGljIF9fZm9yY2VpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIHZvaWQgKipsb2NrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworICAgIGlmIChLTVBfSVNfRF9MT0NLKHNlcSkpIHsKKyAgICAgICAgS01QX0lOSVRfRF9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZygoa21wX3VzZXJfbG9ja19wKWxvY2ssIE5VTEwpOworI2VuZGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0lOSVRfSV9MT0NLKGxvY2ssIHNlcSk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoaWxrLT5sb2NrLCBsb2MpOworI2VuZGlmCisgICAgfQorfQorCisvLyBpbnRlcm5hbCBuZXN0IGxvY2sgaW5pdGlhbGl6ZXIKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChpZGVudF90ICpsb2MsIHZvaWQgKipsb2NrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworI2lmIEtNUF9VU0VfVFNYCisgICAgLy8gRG9uJ3QgaGF2ZSBuZXN0ZWQgbG9jayBpbXBsZW1lbnRhdGlvbiBmb3Igc3BlY3VsYXRpdmUgbG9ja3MKKyAgICBpZiAoc2VxID09IGxvY2tzZXFfaGxlIHx8IHNlcSA9PSBsb2Nrc2VxX3J0bSB8fCBzZXEgPT0gbG9ja3NlcV9hZGFwdGl2ZSkKKyAgICAgICAgc2VxID0gX19rbXBfdXNlcl9sb2NrX3NlcTsKKyNlbmRpZgorICAgIHN3aXRjaCAoc2VxKSB7CisgICAgICAgIGNhc2UgbG9ja3NlcV90YXM6CisgICAgICAgICAgICBzZXEgPSBsb2Nrc2VxX25lc3RlZF90YXM7CisgICAgICAgICAgICBicmVhazsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgICAgIGNhc2UgbG9ja3NlcV9mdXRleDoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX2Z1dGV4OworICAgICAgICAgICAgYnJlYWs7CisjZW5kaWYKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RpY2tldDoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3RpY2tldDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGxvY2tzZXFfcXVldWluZzoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3F1ZXVpbmc7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2RyZHBhOgorICAgICAgICAgICAgc2VxID0gbG9ja3NlcV9uZXN0ZWRfZHJkcGE7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHNlcSA9IGxvY2tzZXFfbmVzdGVkX3F1ZXVpbmc7CisgICAgfQorICAgIEtNUF9JTklUX0lfTE9DSyhsb2NrLCBzZXEpOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICBfX2ttcF9pdHRfbG9ja19jcmVhdGluZyhpbGstPmxvY2ssIGxvYyk7CisjZW5kaWYKK30KKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayB3aXRoIGEgaGludCAqLwordm9pZAorX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X2xvY2tfd2l0aF9oaW50Iik7CisgICAgfQorCisgICAgX19rbXBfaW5pdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfbWFwX2hpbnRfdG9fbG9jayhoaW50KSk7Cit9CisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgd2l0aCBhIGhpbnQgKi8KK3ZvaWQKK19fa21wY19pbml0X25lc3RfbG9ja193aXRoX2hpbnQoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgdm9pZCAqKnVzZXJfbG9jaywgdWludHB0cl90IGhpbnQpCit7CisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X3NlcmlhbCk7CisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayAmJiB1c2VyX2xvY2sgPT0gTlVMTCkgeworICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgIm9tcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQiKTsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X25lc3RfbG9ja193aXRoX2hpbnQobG9jLCB1c2VyX2xvY2ssIF9fa21wX21hcF9oaW50X3RvX2xvY2soaGludCkpOworfQorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZAorX19rbXBjX2luaXRfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsICB2b2lkICoqIHVzZXJfbG9jayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaW5pdF9zZXJpYWwpOworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgJiYgdXNlcl9sb2NrID09IE5VTEwpIHsKKyAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsICJvbXBfaW5pdF9sb2NrIik7CisgICAgfQorICAgIF9fa21wX2luaXRfbG9ja193aXRoX2hpbnQobG9jLCB1c2VyX2xvY2ssIF9fa21wX3VzZXJfbG9ja19zZXEpOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgc3RhdGljIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9pbml0X2xvY2siOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHVzZXJfbG9jayA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLTVBfQ0hFQ0tfVVNFUl9MT0NLX0lOSVQoKTsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHVzZXJfbG9jaywgZ3RpZCwgMCApOworICAgIH0KKyAgICBJTklUX0xPQ0soIGxjayApOworICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGxjaywgbG9jICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2luaXRfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfaW5pdF9sb2NrCisKKy8qIGluaXRpYWxpemUgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY19pbml0X25lc3RfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKF9fa21wX2luaXRfc2VyaWFsKTsKKyAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmIHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgIEtNUF9GQVRBTChMb2NrSXNVbmluaXRpYWxpemVkLCAib21wX2luaXRfbmVzdF9sb2NrIik7CisgICAgfQorICAgIF9fa21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludChsb2MsIHVzZXJfbG9jaywgX19rbXBfdXNlcl9sb2NrX3NlcSk7CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2luaXRfbmVzdF9sb2NrIjsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCB1c2VyX2xvY2sgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgICAgICB9CisgICAgfQorCisgICAgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja19hbGxvY2F0ZSggdXNlcl9sb2NrLCBndGlkLCAwICk7CisgICAgfQorCisgICAgSU5JVF9ORVNURURfTE9DSyggbGNrICk7CisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW5pdF9uZXN0X2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbml0X25lc3RfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworfSAvLyBfX2ttcGNfaW5pdF9uZXN0X2xvY2sKKwordm9pZAorX19rbXBjX2Rlc3Ryb3lfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisgICAgaWYgKEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jaykgPT0gMCkgeworICAgICAgICBsY2sgPSAoKGttcF9pbmRpcmVjdF9sb2NrX3QgKilLTVBfTE9PS1VQX0lfTE9DSyh1c2VyX2xvY2spKS0+bG9jazsKKyAgICB9IGVsc2UgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKGxjayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgZGVzdHJveSkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jayk7CisjZWxzZQorICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX2Rlc3Ryb3lfbG9jayIgKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaykpIHsKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIERFU1RST1lfTE9DSyggbGNrICk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIDsKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggdXNlcl9sb2NrLCBndGlkLCBsY2sgKTsKKyAgICB9CisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBjX2Rlc3Ryb3lfbG9jaworCisvKiBkZXN0cm95IHRoZSBsb2NrICovCit2b2lkCitfX2ttcGNfZGVzdHJveV9uZXN0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyh1c2VyX2xvY2spOworICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZChpbGstPmxvY2spOworIyBlbmRpZgorICAgIEtNUF9EX0xPQ0tfRlVOQyh1c2VyX2xvY2ssIGRlc3Ryb3kpKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2spOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICYmICggc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLnBvbGwgKSArIHNpemVvZiggbGNrLT5mdXRleC5say5kZXB0aF9sb2NrZWQgKQorICAgICA8PSBPTVBfTkVTVF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfZGVzdHJveV9uZXN0X2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgREVTVFJPWV9ORVNURURfTE9DSyggbGNrICk7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfZnJlZSggdXNlcl9sb2NrLCBndGlkLCBsY2sgKTsKKyAgICB9CisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30gLy8gX19rbXBjX2Rlc3Ryb3lfbmVzdF9sb2NrCisKK3ZvaWQKK19fa21wY19zZXRfbG9jayggaWRlbnRfdCAqIGxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKiogdXNlcl9sb2NrICkgeworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfc2V0X2xvY2spOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7IC8vIGl0dCBmdW5jdGlvbiB3aWxsIGdldCB0byB0aGUgcmlnaHQgbG9jayBvYmplY3QuCisjIGVuZGlmCisjIGlmIEtNUF9VU0VfSU5MSU5FRF9UQVMKKyAgICBpZiAodGFnID09IGxvY2t0YWdfdGFzICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgS01QX0FDUVVJUkVfVEFTX0xPQ0sodXNlcl9sb2NrLCBndGlkKTsKKyAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfQUNRVUlSRV9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjIGVuZGlmCisgICAgeworICAgICAgICBfX2ttcF9kaXJlY3Rfc2V0W3RhZ10oKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisgICAgfQorIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfc2V0X2xvY2siICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZyggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgQUNRVUlSRV9MT0NLKCBsY2ssIGd0aWQgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9sb2NrKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfYWNxdWlyZWRfbG9jaykoKHVpbnQ2NF90KSBsY2spOworICAgIH0KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKwordm9pZAorX19rbXBjX3NldF9uZXN0X2xvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqIHVzZXJfbG9jayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorICAgIEtNUF9EX0xPQ0tfRlVOQyh1c2VyX2xvY2ssIHNldCkoKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBtaXNzaW5nIHN1cHBvcnQgaGVyZTogbmVlZCB0byBrbm93IHdoZXRoZXIgYWNxdWlyZWQgZmlyc3Qgb3Igbm90CisgICAgfQorI2VuZGlmCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IGFjcXVpcmVfc3RhdHVzOworICAgIGttcF91c2VyX2xvY2tfcCBsY2s7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF9zZXRfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIEFDUVVJUkVfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCwgJmFjcXVpcmVfc3RhdHVzICk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAoYWNxdWlyZV9zdGF0dXMgPT0gS01QX0xPQ0tfQUNRVUlSRURfRklSU1QpIHsKKyAgICAgICAgICAgaWYob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19maXJzdCkpCisgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3QpKCh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgaWYob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0KSkKKyAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2FjcXVpcmVkX25lc3RfbG9ja19uZXh0KSgodWludDY0X3QpIGxjayk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKK3ZvaWQKK19fa21wY191bnNldF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAgaW50IHRhZyA9IEtNUF9FWFRSQUNUX0RfVEFHKHVzZXJfbG9jayk7CisjIGlmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2spOworIyBlbmRpZgorIyBpZiBLTVBfVVNFX0lOTElORURfVEFTCisgICAgaWYgKHRhZyA9PSBsb2NrdGFnX3RhcyAmJiAhX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKSB7CisgICAgICAgIEtNUF9SRUxFQVNFX1RBU19MT0NLKHVzZXJfbG9jaywgZ3RpZCk7CisgICAgfSBlbHNlCisjIGVsaWYgS01QX1VTRV9JTkxJTkVEX0ZVVEVYCisgICAgaWYgKHRhZyA9PSBsb2NrdGFnX2Z1dGV4ICYmICFfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgS01QX1JFTEVBU0VfRlVURVhfTE9DSyh1c2VyX2xvY2ssIGd0aWQpOworICAgIH0gZWxzZQorIyBlbmRpZgorICAgIHsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Vuc2V0W3RhZ10oKGttcF9keW5hX2xvY2tfdCAqKXVzZXJfbG9jaywgZ3RpZCk7CisgICAgfQorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKyAgICAvKiByZWxlYXNlIHRoZSBsb2NrICovCisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgICAgICAvLyAiZmFzdCIgcGF0aCBpbXBsZW1lbnRlZCB0byBmaXggY3VzdG9tZXIgcGVyZm9ybWFuY2UgaXNzdWUKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIFRDV180KCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayktPnRhcy5say5wb2xsLCAwKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybjsKKyNlbHNlCisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworI2VuZGlmCisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19mdXRleCApCisgICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdW5zZXRfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBSRUxFQVNFX0xPQ0soIGxjaywgZ3RpZCApOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2xvY2spKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX2xvY2spKCh1aW50NjRfdCkgbGNrKTsKKyAgICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8qIHJlbGVhc2UgdGhlIGxvY2sgKi8KK3ZvaWQKK19fa21wY191bnNldF9uZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgS01QX0RfTE9DS19GVU5DKHVzZXJfbG9jaywgdW5zZXQpKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKworICAgIGlmICggKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSAmJiAoIHNpemVvZiggbGNrLT50YXMubGsucG9sbCApCisgICAgICArIHNpemVvZiggbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisgICAgICAgIC8vICJmYXN0IiBwYXRoIGltcGxlbWVudGVkIHRvIGZpeCBjdXN0b21lciBwZXJmb3JtYW5jZSBpc3N1ZQorICAgICAgICBrbXBfdGFzX2xvY2tfdCAqdGwgPSAoa21wX3Rhc19sb2NrX3QqKXVzZXJfbG9jazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX3JlbGVhc2luZyggKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIGlmICggLS0odGwtPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgICAgIFRDV180KHRsLT5say5wb2xsLCAwKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuOworI2Vsc2UKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisjZW5kaWYKKyAgICB9CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGVsc2UgaWYgKCAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX2Z1dGV4ICkKKyAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApICsgc2l6ZW9mKCBsY2stPmZ1dGV4LmxrLmRlcHRoX2xvY2tlZCApCisgICAgIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9sb29rdXBfdXNlcl9sb2NrKCB1c2VyX2xvY2ssICJvbXBfdW5zZXRfbmVzdF9sb2NrIiApOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGxjayApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIGludCByZWxlYXNlX3N0YXR1czsKKyAgICByZWxlYXNlX3N0YXR1cyA9IFJFTEVBU0VfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCApOworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAocmVsZWFzZV9zdGF0dXMgPT0gS01QX0xPQ0tfUkVMRUFTRUQpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCkpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfbGFzdCkoCisgICAgICAgICAgICAgICAgICAgICh1aW50NjRfdCkgbGNrKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9uZXN0X2xvY2tfcHJldikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2KSgKKyAgICAgICAgICAgICAgICAodWludDY0X3QpIGxjayk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKy8qIHRyeSB0byBhY3F1aXJlIHRoZSBsb2NrICovCitpbnQKK19fa21wY190ZXN0X2xvY2soIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfdGVzdF9sb2NrKTsKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgaW50IHJjOworICAgIGludCB0YWcgPSBLTVBfRVhUUkFDVF9EX1RBRyh1c2VyX2xvY2spOworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyMgZW5kaWYKKyMgaWYgS01QX1VTRV9JTkxJTkVEX1RBUworICAgIGlmICh0YWcgPT0gbG9ja3RhZ190YXMgJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfVEVTVF9UQVNfTE9DSyh1c2VyX2xvY2ssIGd0aWQsIHJjKTsKKyAgICB9IGVsc2UKKyMgZWxpZiBLTVBfVVNFX0lOTElORURfRlVURVgKKyAgICBpZiAodGFnID09IGxvY2t0YWdfZnV0ZXggJiYgIV9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBLTVBfVEVTVF9GVVRFWF9MT0NLKHVzZXJfbG9jaywgZ3RpZCwgcmMpOworICAgIH0gZWxzZQorIyBlbmRpZgorICAgIHsKKyAgICAgICAgcmMgPSBfX2ttcF9kaXJlY3RfdGVzdFt0YWddKChrbXBfZHluYV9sb2NrX3QgKil1c2VyX2xvY2ssIGd0aWQpOworICAgIH0KKyAgICBpZiAocmMpIHsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgICAgIHJldHVybiBGVE5fVFJVRTsKKyAgICB9IGVsc2UgeworIyBpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgICAgIHJldHVybiBGVE5fRkFMU0U7CisgICAgfQorCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpbnQgICAgICAgICAgcmM7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkKKyAgICAgICYmICggc2l6ZW9mKCBsY2stPnRhcy5say5wb2xsICkgPD0gT01QX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAgJiYgKCBzaXplb2YoIGxjay0+ZnV0ZXgubGsucG9sbCApIDw9IE9NUF9MT0NLX1RfU0laRSApICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jazsKKyAgICB9CisjZW5kaWYKKyAgICBlbHNlIHsKKyAgICAgICAgbGNrID0gX19rbXBfbG9va3VwX3VzZXJfbG9jayggdXNlcl9sb2NrLCAib21wX3Rlc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICByYyA9IFRFU1RfTE9DSyggbGNrLCBndGlkICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggcmMgKSB7CisgICAgICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCBsY2sgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19jYW5jZWxsZWQoIGxjayApOworICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgcmV0dXJuICggcmMgPyBGVE5fVFJVRSA6IEZUTl9GQUxTRSApOworCisgICAgLyogQ2FuJ3QgdXNlIHNlcmlhbCBpbnRlcnZhbCBzaW5jZSBub3QgYmxvY2sgc3RydWN0dXJlZCAqLworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLyogdHJ5IHRvIGFjcXVpcmUgdGhlIGxvY2sgKi8KK2ludAorX19rbXBjX3Rlc3RfbmVzdF9sb2NrKCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGludCByYzsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisjIGVuZGlmCisgICAgcmMgPSBLTVBfRF9MT0NLX0ZVTkModXNlcl9sb2NrLCB0ZXN0KSgoa21wX2R5bmFfbG9ja190ICopdXNlcl9sb2NrLCBndGlkKTsKKyMgaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmIChyYykgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgoa21wX3VzZXJfbG9ja19wKXVzZXJfbG9jayk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrKTsKKyAgICB9CisjIGVuZGlmCisgICAgcmV0dXJuIHJjOworCisjZWxzZSAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBpbnQgICAgICAgICAgcmM7CisKKyAgICBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzICkgJiYgKCBzaXplb2YoIGxjay0+dGFzLmxrLnBvbGwgKQorICAgICAgKyBzaXplb2YoIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApdXNlcl9sb2NrOworICAgIH0KKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgZWxzZSBpZiAoICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZnV0ZXggKQorICAgICAmJiAoIHNpemVvZiggbGNrLT5mdXRleC5say5wb2xsICkgKyBzaXplb2YoIGxjay0+ZnV0ZXgubGsuZGVwdGhfbG9ja2VkICkKKyAgICAgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKSApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcCl1c2VyX2xvY2s7CisgICAgfQorI2VuZGlmCisgICAgZWxzZSB7CisgICAgICAgIGxjayA9IF9fa21wX2xvb2t1cF91c2VyX2xvY2soIHVzZXJfbG9jaywgIm9tcF90ZXN0X25lc3RfbG9jayIgKTsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBsY2sgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICByYyA9IFRFU1RfTkVTVEVEX0xPQ0soIGxjaywgZ3RpZCApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHJjICkgeworICAgICAgICBfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCggbGNrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfaXR0X2xvY2tfY2FuY2VsbGVkKCBsY2sgKTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIHJldHVybiByYzsKKworICAgIC8qIENhbid0IHVzZSBzZXJpYWwgaW50ZXJ2YWwgc2luY2Ugbm90IGJsb2NrIHN0cnVjdHVyZWQgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9CisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKy8qCisgKiBJbnRlcmZhY2UgdG8gZmFzdCBzY2FsYWJsZSByZWR1Y2UgbWV0aG9kcyByb3V0aW5lcworICovCisKKy8vIGtlZXAgdGhlIHNlbGVjdGVkIG1ldGhvZCBpbiBhIHRocmVhZCBsb2NhbCBzdHJ1Y3R1cmUgZm9yIGNyb3NzLWZ1bmN0aW9uIHVzYWdlOiB3aWxsIGJlIHVzZWQgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uczsKKy8vIGFub3RoZXIgc29sdXRpb246IHRvIHJlLWRldGVybWluZSB0aGUgbWV0aG9kIG9uZSBtb3JlIHRpbWUgaW4gX19rbXBjX2VuZF9yZWR1Y2UqIGZ1bmN0aW9ucyAobmV3IHByb3RvdHlwZSByZXF1aXJlZCB0aGVuKQorLy8gQVQ6IHdoaWNoIHNvbHV0aW9uIGlzIGJldHRlcj8KKyNkZWZpbmUgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoZ3RpZCxybWV0aG9kKSBcCisgICAgICAgICAgICAgICAgICAgKCAoIF9fa21wX3RocmVhZHNbICggZ3RpZCApIF0gLT4gdGgudGhfbG9jYWwucGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSA9ICggcm1ldGhvZCApICkKKworI2RlZmluZSBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRChndGlkKSBcCisgICAgICAgICAgICAgICAgICAgKCBfX2ttcF90aHJlYWRzWyAoIGd0aWQgKSBdIC0+IHRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkKKworLy8gZGVzY3JpcHRpb24gb2YgdGhlIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhcmlhYmxlOiBsb29rIGF0IHRoZSBtYWNyb3MgaW4ga21wLmgKKworCisvLyB1c2VkIGluIGEgY3JpdGljYWwgc2VjdGlvbiByZWR1Y2UgYmxvY2sKK3N0YXRpYyBfX2ZvcmNlaW5saW5lIHZvaWQKK19fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBpZGVudF90ICogbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wX2NyaXRpY2FsX25hbWUgKiBjcml0ICkgeworCisgICAgLy8gdGhpcyBsb2NrIHdhcyB2aXNpYmxlIHRvIGEgY3VzdG9tZXIgYW5kIHRvIHRoZSB0aHJlYWRpbmcgcHJvZmlsZSB0b29sIGFzIGEgc2VyaWFsIG92ZXJoZWFkIHNwYW4KKyAgICAvLyAgICAgICAgICAgIChhbHRob3VnaCBpdCdzIHVzZWQgZm9yIGFuIGludGVybmFsIHB1cnBvc2Ugb25seSkKKyAgICAvLyAgICAgICAgICAgIHdoeSB3YXMgaXQgdmlzaWJsZSBpbiBwcmV2aW91cyBpbXBsZW1lbnRhdGlvbj8KKyAgICAvLyAgICAgICAgICAgIHNob3VsZCB3ZSBrZWVwIGl0IHZpc2libGUgaW4gbmV3IHJlZHVjZSBibG9jaz8KKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIGttcF9keW5hX2xvY2tfdCAqbGsgPSAoa21wX2R5bmFfbG9ja190ICopY3JpdDsKKyAgICAvLyBDaGVjayBpZiBpdCBpcyBpbml0aWFsaXplZC4KKyAgICBpZiAoKmxrID09IDApIHsKKyAgICAgICAgaWYgKEtNUF9JU19EX0xPQ0soX19rbXBfdXNlcl9sb2NrX3NlcSkpIHsKKyAgICAgICAgICAgIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMigodm9sYXRpbGUga21wX2ludDMyICopY3JpdCwgMCwgS01QX0dFVF9EX1RBRyhfX2ttcF91c2VyX2xvY2tfc2VxKSk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9pbml0X2luZGlyZWN0X2NzcHRyKGNyaXQsIGxvYywgZ2xvYmFsX3RpZCwgS01QX0dFVF9JX1RBRyhfX2ttcF91c2VyX2xvY2tfc2VxKSk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gQnJhbmNoIGZvciBhY2Nlc3NpbmcgdGhlIGFjdHVhbCBsb2NrIG9iamVjdCBhbmQgc2V0IG9wZXJhdGlvbi4gVGhpcyBicmFuY2hpbmcgaXMgaW5ldml0YWJsZSBzaW5jZQorICAgIC8vIHRoaXMgbG9jayBpbml0aWFsaXphdGlvbiBkb2VzIG5vdCBmb2xsb3cgdGhlIG5vcm1hbCBkaXNwYXRjaCBwYXRoIChsb2NrIHRhYmxlIGlzIG5vdCB1c2VkKS4KKyAgICBpZiAoS01QX0VYVFJBQ1RfRF9UQUcobGspICE9IDApIHsKKyAgICAgICAgbGNrID0gKGttcF91c2VyX2xvY2tfcClsazsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2ssIF9fa21wX3VzZXJfbG9ja19zZXEpOworICAgICAgICB9CisgICAgICAgIEtNUF9EX0xPQ0tfRlVOQyhsaywgc2V0KShsaywgZ2xvYmFsX3RpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKilsayk7CisgICAgICAgIGxjayA9IGlsay0+bG9jazsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChsY2sgIT0gTlVMTCk7CisgICAgICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyhnbG9iYWxfdGlkLCBjdF9jcml0aWNhbCwgbG9jLCBsY2ssIF9fa21wX3VzZXJfbG9ja19zZXEpOworICAgICAgICB9CisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHNldCkobGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9CisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKyAgICAvLyBXZSBrbm93IHRoYXQgdGhlIGZhc3QgcmVkdWN0aW9uIGNvZGUgaXMgb25seSBlbWl0dGVkIGJ5IEludGVsIGNvbXBpbGVycworICAgIC8vIHdpdGggMzIgYnl0ZSBjcml0aWNhbCBzZWN0aW9ucy4gSWYgdGhlcmUgaXNuJ3QgZW5vdWdoIHNwYWNlLCB0aGVuIHdlCisgICAgLy8gaGF2ZSB0byB1c2UgYSBwb2ludGVyLgorICAgIGlmICggX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA8PSBJTlRFTF9DUklUSUNBTF9TSVpFICkgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKWNyaXQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSBfX2ttcF9nZXRfY3JpdGljYWxfc2VjdGlvbl9wdHIoIGNyaXQsIGxvYywgZ2xvYmFsX3RpZCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MsIGxjayApOworCisgICAgX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGxjaywgZ2xvYmFsX3RpZCApOworCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKK30KKworLy8gdXNlZCBpbiBhIGNyaXRpY2FsIHNlY3Rpb24gcmVkdWNlIGJsb2NrCitzdGF0aWMgX19mb3JjZWlubGluZSB2b2lkCitfX2ttcF9lbmRfY3JpdGljYWxfc2VjdGlvbl9yZWR1Y2VfYmxvY2soIGlkZW50X3QgKiBsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqIGNyaXQgKSB7CisKKyAgICBrbXBfdXNlcl9sb2NrX3AgbGNrOworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIGlmIChLTVBfSVNfRF9MT0NLKF9fa21wX3VzZXJfbG9ja19zZXEpKSB7CisgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApY3JpdDsKKyAgICAgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MpOworICAgICAgICBLTVBfRF9MT0NLX0ZVTkMobGNrLCB1bnNldCkoKGttcF9keW5hX2xvY2tfdCAqKWxjaywgZ2xvYmFsX3RpZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilUQ1JfUFRSKCooKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopY3JpdCkpOworICAgICAgICBpZiAoX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrKQorICAgICAgICAgICAgX19rbXBfcG9wX3N5bmMoZ2xvYmFsX3RpZCwgY3RfY3JpdGljYWwsIGxvYyk7CisgICAgICAgIEtNUF9JX0xPQ0tfRlVOQyhpbGssIHVuc2V0KShpbGstPmxvY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworICAgIC8vIFdlIGtub3cgdGhhdCB0aGUgZmFzdCByZWR1Y3Rpb24gY29kZSBpcyBvbmx5IGVtaXR0ZWQgYnkgSW50ZWwgY29tcGlsZXJzIHdpdGggMzIgYnl0ZSBjcml0aWNhbAorICAgIC8vIHNlY3Rpb25zLiBJZiB0aGVyZSBpc24ndCBlbm91Z2ggc3BhY2UsIHRoZW4gd2UgaGF2ZSB0byB1c2UgYSBwb2ludGVyLgorICAgIGlmICggX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA+IDMyICkgeworICAgICAgICBsY2sgPSAqKCAoa21wX3VzZXJfbG9ja19wICopIGNyaXQgKTsKKyAgICAgICAgS01QX0FTU0VSVCggbGNrICE9IE5VTEwgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBsY2sgPSAoa21wX3VzZXJfbG9ja19wKSBjcml0OworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X2NyaXRpY2FsLCBsb2MgKTsKKworICAgIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBsY2ssIGdsb2JhbF90aWQgKTsKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit9IC8vIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jaworCisKKy8qIDIuYS5pLiBSZWR1Y2UgQmxvY2sgd2l0aG91dCBhIHRlcm1pbmF0aW5nIGJhcnJpZXIgKi8KKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBudW1iZXIKK0BwYXJhbSBudW1fdmFycyBudW1iZXIgb2YgaXRlbXMgKHZhcmlhYmxlcykgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9zaXplIHNpemUgb2YgZGF0YSBpbiBieXRlcyB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2RhdGEgcG9pbnRlciB0byBkYXRhIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2VfZnVuYyBjYWxsYmFjayBmdW5jdGlvbiBwcm92aWRpbmcgcmVkdWN0aW9uIG9wZXJhdGlvbiBvbiB0d28gb3BlcmFuZHMgYW5kIHJldHVybmluZyByZXN1bHQgb2YgcmVkdWN0aW9uIGluIGxoc19kYXRhCitAcGFyYW0gbGNrIHBvaW50ZXIgdG8gdGhlIHVuaXF1ZSBsb2NrIGRhdGEgc3RydWN0dXJlCitAcmVzdWx0IDEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkLCAwIGZvciBhbGwgb3RoZXIgdGVhbSB0aHJlYWRzLCAyIGZvciBhbGwgdGVhbSB0aHJlYWRzIGlmIGF0b21pYyByZWR1Y3Rpb24gbmVlZGVkCisKK1RoZSBub3dhaXQgdmVyc2lvbiBpcyB1c2VkIGZvciBhIHJlZHVjZSBjbGF1c2Ugd2l0aCB0aGUgbm93YWl0IGFyZ3VtZW50LgorKi8KK2ttcF9pbnQzMgorX19rbXBjX3JlZHVjZV9ub3dhaXQoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwKKyAgICBrbXBfaW50MzIgbnVtX3ZhcnMsIHNpemVfdCByZWR1Y2Vfc2l6ZSwgdm9pZCAqcmVkdWNlX2RhdGEsIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkgeworCisgICAgS01QX0NPVU5UX0JMT0NLKFJFRFVDRV9ub3dhaXQpOworICAgIGludCByZXR2YWwgPSAwOworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRoOworICAgIGludCB0ZWFtc19zd2FwcGVkID0gMCwgdGFza19zdGF0ZTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZV9ub3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLy8gd2h5IGRvIHdlIG5lZWQgdGhpcyBpbml0aWFsaXphdGlvbiBoZXJlIGF0IGFsbD8KKyAgICAvLyBSZWR1Y3Rpb24gY2xhdXNlIGNhbiBub3QgYmUgdXNlZCBhcyBhIHN0YW5kLWFsb25lIGRpcmVjdGl2ZS4KKworICAgIC8vIGRvIG5vdCBjYWxsIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCksIGl0IHdpbGwgYmUgY2FsbGVkIGJ5IF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKSBpZiBuZWVkZWQKKyAgICAvLyBwb3NzaWJsZSBkZXRlY3Rpb24gb2YgZmFsc2UtcG9zaXRpdmUgcmFjZSBieSB0aGUgdGhyZWFkY2hlY2tlciA/Pz8KKyAgICBpZiggISBUQ1JfNCggX19rbXBfaW5pdF9wYXJhbGxlbCApICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8gY2hlY2sgY29ycmVjdG5lc3Mgb2YgcmVkdWNlIGJsb2NrIG5lc3RpbmcKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBnbG9iYWxfdGlkLCBjdF9yZWR1Y2UsIGxvYywgTlVMTCwgMCApOworI2Vsc2UKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwgKTsKKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0aCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ2xvYmFsX3RpZCk7CisgICAgaWYoIHRoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgLy8gQUM6IGNoZWNrIGlmIHdlIGFyZSBpbnNpZGUgdGhlIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICAgICBpZiggdGVhbS0+dC50X2xldmVsID09IHRoLT50aC50aF90ZWFtc19sZXZlbCApIHsKKyAgICAgICAgICAgIC8vIHRoaXMgaXMgcmVkdWN0aW9uIGF0IHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkKTsgIC8vIEFDOiBjaGVjayB0aGF0IHRpZCA9PSAwCisgICAgICAgICAgICAvLyBMZXQncyBzd2FwIHRlYW1zIHRlbXBvcmFyaWx5IGZvciB0aGUgcmVkdWN0aW9uIGJhcnJpZXIKKyAgICAgICAgICAgIHRlYW1zX3N3YXBwZWQgPSAxOworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgICAgICB0aC0+dGgudGhfdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICB0aC0+dGgudGhfdGVhbV9ucHJvYyA9IHRoLT50aC50aF90ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICB0aC0+dGgudGhfdGFza190ZWFtID0gdGgtPnRoLnRoX3RlYW0tPnQudF90YXNrX3RlYW1bMF07CisgICAgICAgICAgICB0YXNrX3N0YXRlID0gdGgtPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgICAgICB0aC0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworICAgIC8vIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kIHZhbHVlIHdpbGwgYmUgcmV1c2VkIGJ5IF9fa21wX2VuZF9yZWR1Y2UqIGZ1bmN0aW9uLCB0aGUgdmFsdWUgc2hvdWxkIGJlIGtlcHQgaW4gYSB2YXJpYWJsZQorICAgIC8vIHRoZSB2YXJpYWJsZSBzaG91bGQgYmUgZWl0aGVyIGEgY29uc3RydWN0LXNwZWNpZmljIG9yIHRocmVhZC1zcGVjaWZpYyBwcm9wZXJ0eSwgbm90IGEgdGVhbSBzcGVjaWZpYyBwcm9wZXJ0eQorICAgIC8vICAgICAoYSB0aHJlYWQgY2FuIHJlYWNoIHRoZSBuZXh0IHJlZHVjZSBibG9jayBvbiB0aGUgbmV4dCBjb25zdHJ1Y3QsIHJlZHVjZSBtZXRob2QgbWF5IGRpZmZlciBvbiB0aGUgbmV4dCBjb25zdHJ1Y3QpCisgICAgLy8gYW4gaWRlbnRfdCAibG9jIiBwYXJhbWV0ZXIgY291bGQgYmUgdXNlZCBhcyBhIGNvbnN0cnVjdC1zcGVjaWZpYyBwcm9wZXJ0eSAod2hhdCBpZiBsb2MgPT0gMD8pCisgICAgLy8gICAgIChpZiBib3RoIGNvbnN0cnVjdC1zcGVjaWZpYyBhbmQgdGVhbS1zcGVjaWZpYyB2YXJpYWJsZXMgd2VyZSBzaGFyZWQsIHRoZW4gdW5uZXNzIGV4dHJhIHN5bmNzIHNob3VsZCBiZSBuZWVkZWQpCisgICAgLy8gYSB0aHJlYWQtc3BlY2lmaWMgdmFyaWFibGUgaXMgYmV0dGVyIHJlZ2FyZGluZyB0d28gaXNzdWVzIGFib3ZlIChuZXh0IGNvbnN0cnVjdCBhbmQgZXh0cmEgc3luY3MpCisgICAgLy8gYSB0aHJlYWQtc3BlY2lmaWMgInRoX2xvY2FsLnJlZHVjdGlvbl9tZXRob2QiIHZhcmlhYmxlIGlzIHVzZWQgY3VycmVudGx5CisgICAgLy8gZWFjaCB0aHJlYWQgZXhlY3V0ZXMgJ2RldGVybWluZScgYW5kICdzZXQnIGxpbmVzIChubyBuZWVkIHRvIGV4ZWN1dGUgYnkgb25lIHRocmVhZCwgdG8gYXZvaWQgdW5uZXNzIGV4dHJhIHN5bmNzKQorCisgICAgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPSBfX2ttcF9kZXRlcm1pbmVfcmVkdWN0aW9uX21ldGhvZCggbG9jLCBnbG9iYWxfdGlkLCBudW1fdmFycywgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYywgbGNrICk7CisgICAgX19LTVBfU0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICk7CisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VudGVyX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisgICAgICAgIHJldHZhbCA9IDE7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgcmV0dmFsID0gMjsKKworICAgICAgICAvLyBhbGwgdGhyZWFkcyBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZSAoYmVjYXVzZSBfX2ttcGNfZW5kX3JlZHVjZV9ub3dhaXQoKSB3b24ndCBiZSBjYWxsZWQgYnkgdGhlIGNvZGUgZ2VuKQorICAgICAgICAvLyAgICAgKGl0J3Mgbm90IHF1aXRlIGdvb2QsIGJlY2F1c2UgdGhlIGNoZWNraW5nIGJsb2NrIGhhcyBiZWVuIGNsb3NlZCBieSB0aGlzICdwb3AnLAorICAgICAgICAvLyAgICAgIGJ1dCBhdG9taWMgb3BlcmF0aW9uIGhhcyBub3QgYmVlbiBleGVjdXRlZCB5ZXQsIHdpbGwgYmUgZXhlY3V0ZWQgc2xpZ2h0bHkgbGF0ZXIsIGxpdGVyYWxseSBvbiBuZXh0IGluc3RydWN0aW9uKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKworICAgIH0gZWxzZSBpZiggVEVTVF9SRURVQ1RJT05fTUVUSE9EKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgdHJlZV9yZWR1Y2VfYmxvY2sgKSApIHsKKworICAgICAgICAvL0FUOiBwZXJmb3JtYW5jZSBpc3N1ZTogYSByZWFsIGJhcnJpZXIgaGVyZQorICAgICAgICAvL0FUOiAgICAgKGlmIG1hc3RlciBnb2VzIHNsb3csIG90aGVyIHRocmVhZHMgYXJlIGJsb2NrZWQgaGVyZSB3YWl0aW5nIGZvciB0aGUgbWFzdGVyIHRvIGNvbWUgYW5kIHJlbGVhc2UgdGhlbSkKKyAgICAgICAgLy9BVDogICAgIChpdCdzIG5vdCB3aGF0IGEgY3VzdG9tZXIgbWlnaHQgZXhwZWN0IHNwZWNpZnlpbmcgTk9XQUlUIGNsYXVzZSkKKyAgICAgICAgLy9BVDogICAgIChzcGVjaWZ5aW5nIE5PV0FJVCB3b24ndCByZXN1bHQgaW4gaW1wcm92ZW1lbnQgb2YgcGVyZm9ybWFuY2UsIGl0J2xsIGJlIGNvbmZ1c2luZyB0byBhIGN1c3RvbWVyKQorICAgICAgICAvL0FUOiBhbm90aGVyIGltcGxlbWVudGF0aW9uIG9mICpiYXJyaWVyX2dhdGhlcipub3dhaXQoKSAob3Igc29tZSBvdGhlciBkZXNpZ24pIG1pZ2h0IGdvIGZhc3RlcgorICAgICAgICAvLyAgICAgICAgYW5kIGJlIG1vcmUgaW4gbGluZSB3aXRoIHNlbnNlIG9mIE5PV0FJVAorICAgICAgICAvL0FUOiBUTyBETzogZG8gZXBjYyB0ZXN0IGFuZCBjb21wYXJlIHRpbWVzCisKKyAgICAgICAgLy8gdGhpcyBiYXJyaWVyIHNob3VsZCBiZSBpbnZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wKKyAgICAgICAgLy8gICAgICAgICAgICAgIChpdCdzIG5laXRoZXIgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG5vciBjdXN0b21lcidzIGNvZGUsIGl0J3MgdXNlZCBmb3IgYW4gaW50ZXJuYWwgcHVycG9zZSkKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgICAgICByZXR2YWwgPSBfX2ttcF9iYXJyaWVyKCBVTlBBQ0tfUkVEVUNUSU9OX0JBUlJJRVIoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICksIGdsb2JhbF90aWQsIEZBTFNFLCByZWR1Y2Vfc2l6ZSwgcmVkdWNlX2RhdGEsIHJlZHVjZV9mdW5jICk7CisgICAgICAgIHJldHZhbCA9ICggcmV0dmFsICE9IDAgKSA/ICggMCApIDogKCAxICk7CisKKyAgICAgICAgLy8gYWxsIG90aGVyIHdvcmtlcnMgZXhjZXB0IG1hc3RlciBzaG91bGQgZG8gdGhpcyBwb3AgaGVyZQorICAgICAgICAvLyAgICAgKCBub25lIG9mIG90aGVyIHdvcmtlcnMgd2lsbCBnZXQgdG8gX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgKQorICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmKCByZXR2YWwgPT0gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0ZWFtc19zd2FwcGVkICkgeworICAgICAgICAvLyBSZXN0b3JlIHRocmVhZCBzdHJ1Y3R1cmUKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID0gMDsKKyAgICAgICAgdGgtPnRoLnRoX3RlYW0gPSB0ZWFtOworICAgICAgICB0aC0+dGgudGhfdGVhbV9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdGFza19zdGF0ZV07CisgICAgICAgIHRoLT50aC50aF90YXNrX3N0YXRlID0gdGFza19zdGF0ZTsKKyAgICB9CisjZW5kaWYKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2Vfbm93YWl0KCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4LCByZXR1cm5zICUwOHhcbiIsIGdsb2JhbF90aWQsIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCByZXR2YWwgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLyohCitAaW5ncm91cCBTWU5DSFJPTklaQVRJT04KK0BwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCitAcGFyYW0gZ2xvYmFsX3RpZCBnbG9iYWwgdGhyZWFkIGlkLgorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorCitGaW5pc2ggdGhlIGV4ZWN1dGlvbiBvZiBhIHJlZHVjZSBub3dhaXQuCisqLwordm9pZAorX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkgeworCisgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZDsKKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX2VuZF9yZWR1Y2Vfbm93YWl0KCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19LTVBfR0VUX1JFRFVDVElPTl9NRVRIT0QoIGdsb2JhbF90aWQgKTsKKworICAgIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBjcml0aWNhbF9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgX19rbXBfZW5kX2NyaXRpY2FsX3NlY3Rpb25fcmVkdWNlX2Jsb2NrKCBsb2MsIGdsb2JhbF90aWQsIGxjayApOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBlbXB0eV9yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gdXNhZ2U6IGlmIHRlYW0gc2l6ZSA9PSAxLCBubyBzeW5jaHJvbml6YXRpb24gaXMgcmVxdWlyZWQgKCBvbiBJbnRlbCBwbGF0Zm9ybXMgb25seSApCisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gbmVpdGhlciBtYXN0ZXIgbm9yIG90aGVyIHdvcmtlcnMgc2hvdWxkIGdldCBoZXJlCisgICAgICAgIC8vICAgICAoY29kZSBnZW4gZG9lcyBub3QgZ2VuZXJhdGUgdGhpcyBjYWxsIGluIGNhc2UgMjogYXRvbWljIHJlZHVjZSBibG9jaykKKyAgICAgICAgLy8gYWN0dWFsbHkgaXQncyBiZXR0ZXIgdG8gcmVtb3ZlIHRoaXMgZWxzZWlmIGF0IGFsbDsKKyAgICAgICAgLy8gYWZ0ZXIgcmVtb3ZhbCB0aGlzIHZhbHVlIHdpbGwgY2hlY2tlZCBieSB0aGUgJ2Vsc2UnIGFuZCB3aWxsIGFzc2VydAorCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vIG9ubHkgbWFzdGVyIGdldHMgaGVyZQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlX25vd2FpdCgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eFxuIiwgZ2xvYmFsX3RpZCwgcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSApOworCisgICAgcmV0dXJuOworfQorCisvKiAyLmEuaWkuIFJlZHVjZSBCbG9jayB3aXRoIGEgdGVybWluYXRpbmcgYmFycmllciAqLworCisvKiEKK0Bpbmdyb3VwIFNZTkNIUk9OSVpBVElPTgorQHBhcmFtIGxvYyBzb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBnbG9iYWxfdGlkIGdsb2JhbCB0aHJlYWQgbnVtYmVyCitAcGFyYW0gbnVtX3ZhcnMgbnVtYmVyIG9mIGl0ZW1zICh2YXJpYWJsZXMpIHRvIGJlIHJlZHVjZWQKK0BwYXJhbSByZWR1Y2Vfc2l6ZSBzaXplIG9mIGRhdGEgaW4gYnl0ZXMgdG8gYmUgcmVkdWNlZAorQHBhcmFtIHJlZHVjZV9kYXRhIHBvaW50ZXIgdG8gZGF0YSB0byBiZSByZWR1Y2VkCitAcGFyYW0gcmVkdWNlX2Z1bmMgY2FsbGJhY2sgZnVuY3Rpb24gcHJvdmlkaW5nIHJlZHVjdGlvbiBvcGVyYXRpb24gb24gdHdvIG9wZXJhbmRzIGFuZCByZXR1cm5pbmcgcmVzdWx0IG9mIHJlZHVjdGlvbiBpbiBsaHNfZGF0YQorQHBhcmFtIGxjayBwb2ludGVyIHRvIHRoZSB1bmlxdWUgbG9jayBkYXRhIHN0cnVjdHVyZQorQHJlc3VsdCAxIGZvciB0aGUgbWFzdGVyIHRocmVhZCwgMCBmb3IgYWxsIG90aGVyIHRlYW0gdGhyZWFkcywgMiBmb3IgYWxsIHRlYW0gdGhyZWFkcyBpZiBhdG9taWMgcmVkdWN0aW9uIG5lZWRlZAorCitBIGJsb2NraW5nIHJlZHVjZSB0aGF0IGluY2x1ZGVzIGFuIGltcGxpY2l0IGJhcnJpZXIuCisqLwora21wX2ludDMyCitfX2ttcGNfcmVkdWNlKAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAga21wX2ludDMyIG51bV92YXJzLCBzaXplX3QgcmVkdWNlX3NpemUsIHZvaWQgKnJlZHVjZV9kYXRhLAorICAgIHZvaWQgKCpyZWR1Y2VfZnVuYykodm9pZCAqbGhzX2RhdGEsIHZvaWQgKnJoc19kYXRhKSwKKyAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkKK3sKKyAgICBLTVBfQ09VTlRfQkxPQ0soUkVEVUNFX3dhaXQpOworICAgIGludCByZXR2YWwgPSAwOworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcGFja2VkX3JlZHVjdGlvbl9tZXRob2Q7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19yZWR1Y2UoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGdsb2JhbF90aWQgKSApOworCisgICAgLy8gd2h5IGRvIHdlIG5lZWQgdGhpcyBpbml0aWFsaXphdGlvbiBoZXJlIGF0IGFsbD8KKyAgICAvLyBSZWR1Y3Rpb24gY2xhdXNlIGNhbiBub3QgYmUgYSBzdGFuZC1hbG9uZSBkaXJlY3RpdmUuCisKKyAgICAvLyBkbyBub3QgY2FsbCBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpLCBpdCB3aWxsIGJlIGNhbGxlZCBieSBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCkgaWYgbmVlZGVkCisgICAgLy8gcG9zc2libGUgZGV0ZWN0aW9uIG9mIGZhbHNlLXBvc2l0aXZlIHJhY2UgYnkgdGhlIHRocmVhZGNoZWNrZXIgPz8/CisgICAgaWYoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworICAgIC8vIGNoZWNrIGNvcnJlY3RuZXNzIG9mIHJlZHVjZSBibG9jayBuZXN0aW5nCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jLCBOVUxMICk7CisjZW5kaWYKKworICAgIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID0gX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGxvYywgZ2xvYmFsX3RpZCwgbnVtX3ZhcnMsIHJlZHVjZV9zaXplLCByZWR1Y2VfZGF0YSwgcmVkdWNlX2Z1bmMsIGxjayApOworICAgIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApOworCisgICAgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGNyaXRpY2FsX3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICBfX2ttcF9lbnRlcl9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKyAgICAgICAgcmV0dmFsID0gMTsKKworICAgIH0gZWxzZSBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gZW1wdHlfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIC8vIHVzYWdlOiBpZiB0ZWFtIHNpemUgPT0gMSwgbm8gc3luY2hyb25pemF0aW9uIGlzIHJlcXVpcmVkICggSW50ZWwgcGxhdGZvcm1zIG9ubHkgKQorICAgICAgICByZXR2YWwgPSAxOworCisgICAgfSBlbHNlIGlmKCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9PSBhdG9taWNfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIHJldHZhbCA9IDI7CisKKyAgICB9IGVsc2UgaWYoIFRFU1RfUkVEVUNUSU9OX01FVEhPRCggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QsIHRyZWVfcmVkdWNlX2Jsb2NrICkgKSB7CisKKyAgICAgICAgLy9jYXNlIHRyZWVfcmVkdWNlX2Jsb2NrOgorICAgICAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wKKyAgICAgICAgLy8gICAgICAgICAgICAgIChpdCdzIGEgdGVybWluYXRpbmcgYmFycmllciBvbiBjb25zdHJ1Y3RzIGlmIE5PV0FJVCBub3Qgc3BlY2lmaWVkKQorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOyAvLyBuZWVkZWQgZm9yIGNvcnJlY3Qgbm90aWZpY2F0aW9uIG9mIGZyYW1lcworI2VuZGlmCisgICAgICAgIHJldHZhbCA9IF9fa21wX2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCwgVFJVRSwgcmVkdWNlX3NpemUsIHJlZHVjZV9kYXRhLCByZWR1Y2VfZnVuYyApOworICAgICAgICByZXR2YWwgPSAoIHJldHZhbCAhPSAwICkgPyAoIDAgKSA6ICggMSApOworCisgICAgICAgIC8vIGFsbCBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgc2hvdWxkIGRvIHRoaXMgcG9wIGhlcmUKKyAgICAgICAgLy8gICAgICggbm9uZSBvZiBvdGhlciB3b3JrZXJzIGV4Y2VwdCBtYXN0ZXIgd2lsbCBlbnRlciBfX2ttcGNfZW5kX3JlZHVjZSgpICkKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBpZiggcmV0dmFsID09IDAgKSB7IC8vIDA6IGFsbCBvdGhlciB3b3JrZXJzOyAxOiBtYXN0ZXIKKyAgICAgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ2xvYmFsX3RpZCwgY3RfcmVkdWNlLCBsb2MgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBjX3JlZHVjZSgpIGV4aXQ6IGNhbGxlZCBUIyVkOiBtZXRob2QgJTA4eCwgcmV0dXJucyAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCwgcmV0dmFsICkgKTsKKworICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8qIQorQGluZ3JvdXAgU1lOQ0hST05JWkFUSU9OCitAcGFyYW0gbG9jIHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorQHBhcmFtIGdsb2JhbF90aWQgZ2xvYmFsIHRocmVhZCBpZC4KK0BwYXJhbSBsY2sgcG9pbnRlciB0byB0aGUgdW5pcXVlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUKKworRmluaXNoIHRoZSBleGVjdXRpb24gb2YgYSBibG9ja2luZyByZWR1Y2UuCitUaGUgPHR0PmxjazwvdHQ+IHBvaW50ZXIgbXVzdCBiZSB0aGUgc2FtZSBhcyB0aGF0IHVzZWQgaW4gdGhlIGNvcnJlc3BvbmRpbmcgc3RhcnQgZnVuY3Rpb24uCisqLwordm9pZAorX19rbXBjX2VuZF9yZWR1Y2UoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcF9jcml0aWNhbF9uYW1lICpsY2sgKSB7CisKKyAgICBQQUNLRURfUkVEVUNUSU9OX01FVEhPRF9UIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcGNfZW5kX3JlZHVjZSgpIGVudGVyOiBjYWxsZWQgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCA9IF9fS01QX0dFVF9SRURVQ1RJT05fTUVUSE9EKCBnbG9iYWxfdGlkICk7CisKKyAgICAvLyB0aGlzIGJhcnJpZXIgc2hvdWxkIGJlIHZpc2libGUgdG8gYSBjdXN0b21lciBhbmQgdG8gdGhlIHRocmVhZGluZyBwcm9maWxlIHRvb2wKKyAgICAvLyAgICAgICAgICAgICAgKGl0J3MgYSB0ZXJtaW5hdGluZyBiYXJyaWVyIG9uIGNvbnN0cnVjdHMgaWYgTk9XQUlUIG5vdCBzcGVjaWZpZWQpCisKKyAgICBpZiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrICkgeworCisgICAgICAgIF9fa21wX2VuZF9jcml0aWNhbF9zZWN0aW9uX3JlZHVjZV9ibG9jayggbG9jLCBnbG9iYWxfdGlkLCBsY2sgKTsKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGVtcHR5X3JlZHVjZV9ibG9jayApIHsKKworICAgICAgICAvLyB1c2FnZTogaWYgdGVhbSBzaXplID09IDEsIG5vIHN5bmNocm9uaXphdGlvbiBpcyByZXF1aXJlZCAoIEludGVsIHBsYXRmb3JtcyBvbmx5ICkKKworICAgICAgICAvLyBUT0RPOiBpbXBsaWNpdCBiYXJyaWVyOiBzaG91bGQgYmUgZXhwb3NlZAorI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0tPnRoLnRoX2lkZW50ID0gbG9jOworI2VuZGlmCisgICAgICAgIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMICk7CisKKyAgICB9IGVsc2UgaWYoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisKKyAgICAgICAgLy8gVE9ETzogaW1wbGljaXQgYmFycmllcjogc2hvdWxkIGJlIGV4cG9zZWQKKyNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdLT50aC50aF9pZGVudCA9IGxvYzsKKyNlbmRpZgorICAgICAgICBfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCApOworCisgICAgfSBlbHNlIGlmKCBURVNUX1JFRFVDVElPTl9NRVRIT0QoIHBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kLCB0cmVlX3JlZHVjZV9ibG9jayApICkgeworCisgICAgICAgIC8vIG9ubHkgbWFzdGVyIGV4ZWN1dGVzIGhlcmUgKG1hc3RlciByZWxlYXNlcyBhbGwgb3RoZXIgd29ya2VycykKKyAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIFVOUEFDS19SRURVQ1RJT05fQkFSUklFUiggcGFja2VkX3JlZHVjdGlvbl9tZXRob2QgKSwgZ2xvYmFsX3RpZCApOworCisgICAgfSBlbHNlIHsKKworICAgICAgICAvLyBzaG91bGQgbmV2ZXIgcmVhY2ggdGhpcyBibG9jaworICAgICAgICBLTVBfQVNTRVJUKCAwICk7IC8vICJ1bmV4cGVjdGVkIG1ldGhvZCIKKworICAgIH0KKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3N5bmMoIGdsb2JhbF90aWQsIGN0X3JlZHVjZSwgbG9jICk7CisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wY19lbmRfcmVkdWNlKCkgZXhpdDogY2FsbGVkIFQjJWQ6IG1ldGhvZCAlMDh4XG4iLCBnbG9iYWxfdGlkLCBwYWNrZWRfcmVkdWN0aW9uX21ldGhvZCApICk7CisKKyAgICByZXR1cm47Cit9CisKKyN1bmRlZiBfX0tNUF9HRVRfUkVEVUNUSU9OX01FVEhPRAorI3VuZGVmIF9fS01QX1NFVF9SRURVQ1RJT05fTUVUSE9ECisKKy8qLS0gZW5kIG9mIGludGVyZmFjZSB0byBmYXN0IHNjYWxhYmxlIHJlZHVjZSByb3V0aW5lcyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitrbXBfdWludDY0CitfX2ttcGNfZ2V0X3Rhc2tpZCgpIHsKKworICAgIGttcF9pbnQzMiAgICBndGlkOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisKKyAgICBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBpZiAoIGd0aWQgPCAwICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9OyAvLyBpZgorICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICByZXR1cm4gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX3Rhc2tfaWQ7CisKK30gLy8gX19rbXBjX2dldF90YXNraWQKKworCitrbXBfdWludDY0CitfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQoKSB7CisKKyAgICBrbXBfaW50MzIgICAgICAgIGd0aWQ7CisgICAga21wX2luZm9fdCAqICAgICB0aHJlYWQ7CisgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnRfdGFzazsKKworICAgIGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07IC8vIGlmCisgICAgdGhyZWFkICAgICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgcGFyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfcGFyZW50OworICAgIHJldHVybiAoIHBhcmVudF90YXNrID09IE5VTEwgPyAwIDogcGFyZW50X3Rhc2stPnRkX3Rhc2tfaWQgKTsKKworfSAvLyBfX2ttcGNfZ2V0X3BhcmVudF90YXNraWQKKwordm9pZCBfX2ttcGNfcGxhY2VfdGhyZWFkcyhpbnQgblMsIGludCBzTywgaW50IG5DLCBpbnQgY08sIGludCBuVCkKK3sKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfQorICAgIF9fa21wX3BsYWNlX251bV9zb2NrZXRzID0gblM7CisgICAgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IHNPOworICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG5DOworICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gY087CisgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBuVDsKK30KKworI2lmIE9NUF80NV9FTkFCTEVECisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtIGxvYyAgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uLgorQHBhcmFtIGd0aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyLgorQHBhcmFtIG51bV9kaW1zICBudW1iZXIgb2YgYXNzb2NpYXRlZCBkb2Fjcm9zcyBsb29wcy4KK0BwYXJhbSBkaW1zICBpbmZvIG9uIGxvb3BzIGJvdW5kcy4KKworSW5pdGlhbGl6ZSBkb2Fjcm9zcyBsb29wIGluZm9ybWF0aW9uLgorRXhwZWN0IGNvbXBpbGVyIHNlbmQgdXMgaW5jbHVzaXZlIGJvdW5kcywKK2UuZy4gZm9yKGk9MjtpPDk7aSs9MikgbG89MiwgdXA9OCwgc3Q9Mi4KKyovCit2b2lkCitfX2ttcGNfZG9hY3Jvc3NfaW5pdChpZGVudF90ICpsb2MsIGludCBndGlkLCBpbnQgbnVtX2RpbXMsIHN0cnVjdCBrbXBfZGltICogZGltcykKK3sKKyAgICBpbnQgaiwgaWR4OworICAgIGttcF9pbnQ2NCBsYXN0LCB0cmFjZV9jb3VudDsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIGttcF91aW50MzIgKmZsYWdzOworICAgIGttcF9kaXNwX3QgKnByX2J1ZiA9IHRoLT50aC50aF9kaXNwYXRjaDsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ICpzaF9idWY7CisKKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19pbml0KCkgZW50ZXI6IGNhbGxlZCBUIyVkLCBudW0gZGltcyAlZCwgYWN0aXZlICVkXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCBudW1fZGltcywgIXRlYW0tPnQudF9zZXJpYWxpemVkKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zICE9IE5VTEwpOworICAgIEtNUF9ERUJVR19BU1NFUlQobnVtX2RpbXMgPiAwKTsKKworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3NfaW5pdCgpIGV4aXQ6IHNlcmlhbGl6ZWQgdGVhbVxuIikpOworICAgICAgICByZXR1cm47IC8vIG5vIGRlcGVuZGVuY2llcyBpZiB0ZWFtIGlzIHNlcmlhbGl6ZWQKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfbnByb2MgPiAxKTsKKyAgICBpZHggPSBwcl9idWYtPnRoX2RvYWNyb3NzX2J1Zl9pZHgrKzsgLy8gSW5jcmVtZW50IGluZGV4IG9mIHNoYXJlZCBidWZmZXIgZm9yIHRoZSBuZXh0IGxvb3AKKyAgICBzaF9idWYgPSAmdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2lkeCAlIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzXTsKKworICAgIC8vIFNhdmUgYm91bmRzIGluZm8gaW50byBhbGxvY2F0ZWQgcHJpdmF0ZSBidWZmZXIKKyAgICBLTVBfREVCVUdfQVNTRVJUKHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyA9PSBOVUxMKTsKKyAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8gPQorICAgICAgICAoa21wX2ludDY0KilfX2ttcF90aHJlYWRfbWFsbG9jKHRoLCBzaXplb2Yoa21wX2ludDY0KSooNCAqIG51bV9kaW1zICsgMSkpOworICAgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvICE9IE5VTEwpOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1swXSA9IChrbXBfaW50NjQpbnVtX2RpbXM7IC8vIGZpcnN0IGVsZW1lbnQgaXMgbnVtYmVyIG9mIGRpbWVuc2lvbnMKKyAgICAvLyBTYXZlIGFsc28gYWRkcmVzcyBvZiBudW1fZG9uZSBpbiBvcmRlciB0byBhY2Nlc3MgaXQgbGF0ZXIgd2l0aG91dCBrbm93aW5nIHRoZSBidWZmZXIgaW5kZXgKKyAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMV0gPSAoa21wX2ludDY0KSZzaF9idWYtPmRvYWNyb3NzX251bV9kb25lOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1syXSA9IGRpbXNbMF0ubG87CisgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzNdID0gZGltc1swXS51cDsKKyAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bNF0gPSBkaW1zWzBdLnN0OworICAgIGxhc3QgPSA1OworICAgIGZvciggaiA9IDE7IGogPCBudW1fZGltczsgKytqICkgeworICAgICAgICBrbXBfaW50NjQgcmFuZ2VfbGVuZ3RoOyAvLyBUbyBrZWVwIHJhbmdlcyBvZiBhbGwgZGltZW5zaW9ucyBidXQgdGhlIGZpcnN0IGRpbXNbMF0KKyAgICAgICAgaWYoIGRpbXNbal0uc3QgPT0gMSApIHsgLy8gbW9zdCBjb21tb24gY2FzZQorICAgICAgICAgICAgLy8gQUM6IHNob3VsZCB3ZSBjYXJlIG9mIHJhbmdlcyBiaWdnZXIgdGhhbiBMTE9OR19NQVg/IChub3QgZm9yIG5vdykKKyAgICAgICAgICAgIHJhbmdlX2xlbmd0aCA9IGRpbXNbal0udXAgLSBkaW1zW2pdLmxvICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKCBkaW1zW2pdLnN0ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGRpbXNbal0udXAgPiBkaW1zW2pdLmxvKTsKKyAgICAgICAgICAgICAgICByYW5nZV9sZW5ndGggPSAoa21wX3VpbnQ2NCkoZGltc1tqXS51cCAtIGRpbXNbal0ubG8pIC8gZGltc1tqXS5zdCArIDE7CisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgIC8vIG5lZ2F0aXZlIGluY3JlbWVudAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGltc1tqXS5sbyA+IGRpbXNbal0udXApOworICAgICAgICAgICAgICAgIHJhbmdlX2xlbmd0aCA9IChrbXBfdWludDY0KShkaW1zW2pdLmxvIC0gZGltc1tqXS51cCkgLyAoLWRpbXNbal0uc3QpICsgMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bbGFzdCsrXSA9IHJhbmdlX2xlbmd0aDsKKyAgICAgICAgcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2xhc3QrK10gPSBkaW1zW2pdLmxvOworICAgICAgICBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bbGFzdCsrXSA9IGRpbXNbal0udXA7CisgICAgICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tsYXN0KytdID0gZGltc1tqXS5zdDsKKyAgICB9CisKKyAgICAvLyBDb21wdXRlIHRvdGFsIHRyaXAgY291bnQuCisgICAgLy8gU3RhcnQgd2l0aCByYW5nZSBvZiBkaW1zWzBdIHdoaWNoIHdlIGRvbid0IG5lZWQgdG8ga2VlcCBpbiB0aGUgYnVmZmVyLgorICAgIGlmKCBkaW1zWzBdLnN0ID09IDEgKSB7IC8vIG1vc3QgY29tbW9uIGNhc2UKKyAgICAgICAgdHJhY2VfY291bnQgPSBkaW1zWzBdLnVwIC0gZGltc1swXS5sbyArIDE7CisgICAgfSBlbHNlIGlmKCBkaW1zWzBdLnN0ID4gMCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChkaW1zWzBdLnVwID4gZGltc1swXS5sbyk7CisgICAgICAgIHRyYWNlX2NvdW50ID0gKGttcF91aW50NjQpKGRpbXNbMF0udXAgLSBkaW1zWzBdLmxvKSAvIGRpbXNbMF0uc3QgKyAxOworICAgIH0gZWxzZSB7ICAgLy8gbmVnYXRpdmUgaW5jcmVtZW50CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGltc1swXS5sbyA+IGRpbXNbMF0udXApOworICAgICAgICB0cmFjZV9jb3VudCA9IChrbXBfdWludDY0KShkaW1zWzBdLmxvIC0gZGltc1swXS51cCkgLyAoLWRpbXNbMF0uc3QpICsgMTsKKyAgICB9CisgICAgZm9yKCBqID0gMTsgaiA8IG51bV9kaW1zOyArK2ogKSB7CisgICAgICAgIHRyYWNlX2NvdW50ICo9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1s0ICogaiArIDFdOyAvLyB1c2Uga2VwdCByYW5nZXMKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCh0cmFjZV9jb3VudCA+IDApOworCisgICAgLy8gQ2hlY2sgaWYgc2hhcmVkIGJ1ZmZlciBpcyBub3Qgb2NjdXBpZWQgYnkgb3RoZXIgbG9vcCAoaWR4IC0gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMpCisgICAgaWYoIGlkeCAhPSBzaF9idWYtPmRvYWNyb3NzX2J1Zl9pZHggKSB7CisgICAgICAgIC8vIFNoYXJlZCBidWZmZXIgaXMgb2NjdXBpZWQsIHdhaXQgZm9yIGl0IHRvIGJlIGZyZWUKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80KCAoa21wX3VpbnQzMiopJnNoX2J1Zi0+ZG9hY3Jvc3NfYnVmX2lkeCwgaWR4LCBfX2ttcF9lcV80LCBOVUxMICk7CisgICAgfQorICAgIC8vIENoZWNrIGlmIHdlIGFyZSB0aGUgZmlyc3QgdGhyZWFkLiBBZnRlciB0aGUgQ0FTIHRoZSBmaXJzdCB0aHJlYWQgZ2V0cyAwLAorICAgIC8vIG90aGVycyBnZXQgMSBpZiBpbml0aWFsaXphdGlvbiBpcyBpbiBwcm9ncmVzcywgYWxsb2NhdGVkIHBvaW50ZXIgb3RoZXJ3aXNlLgorICAgIGZsYWdzID0gKGttcF91aW50MzIqKUtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NCgKKyAgICAgICAgKGttcF9pbnQ2NCopJnNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MsTlVMTCwoa21wX2ludDY0KTEpOworICAgIGlmKCBmbGFncyA9PSBOVUxMICkgeworICAgICAgICAvLyB3ZSBhcmUgdGhlIGZpcnN0IHRocmVhZCwgYWxsb2NhdGUgdGhlIGFycmF5IG9mIGZsYWdzCisgICAgICAgIGttcF9pbnQ2NCBzaXplID0gdHJhY2VfY291bnQgLyA4ICsgODsgLy8gaW4gYnl0ZXMsIHVzZSBzaW5nbGUgYml0IHBlciBpdGVyYXRpb24KKyAgICAgICAgc2hfYnVmLT5kb2Fjcm9zc19mbGFncyA9IChrbXBfdWludDMyKilfX2ttcF90aHJlYWRfY2FsbG9jKHRoLCBzaXplLCAxKTsKKyAgICB9IGVsc2UgaWYoIChrbXBfaW50NjQpZmxhZ3MgPT0gMSApIHsKKyAgICAgICAgLy8gaW5pdGlhbGl6YXRpb24gaXMgc3RpbGwgaW4gcHJvZ3Jlc3MsIG5lZWQgdG8gd2FpdAorICAgICAgICB3aGlsZSggKHZvbGF0aWxlIGttcF9pbnQ2NClzaF9idWYtPmRvYWNyb3NzX2ZsYWdzID09IDEgKSB7CisgICAgICAgICAgICBLTVBfWUlFTEQoVFJVRSk7CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCgoa21wX2ludDY0KXNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPiAxKTsgLy8gY2hlY2sgdmFsdWUgb2YgcG9pbnRlcgorICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3MgPSBzaF9idWYtPmRvYWNyb3NzX2ZsYWdzOyAgICAgIC8vIHNhdmUgcHJpdmF0ZSBjb3B5IGluIG9yZGVyIHRvIG5vdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRvdWNoIHNoYXJlZCBidWZmZXIgb24gZWFjaCBpdGVyYXRpb24KKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19pbml0KCkgZXhpdDogVCMlZFxuIiwgZ3RpZCkpOworfQorCit2b2lkCitfX2ttcGNfZG9hY3Jvc3Nfd2FpdChpZGVudF90ICpsb2MsIGludCBndGlkLCBsb25nIGxvbmcgKnZlYykKK3sKKyAgICBrbXBfaW50MzIgc2hmdCwgbnVtX2RpbXMsIGk7CisgICAga21wX3VpbnQzMiBmbGFnOworICAgIGttcF9pbnQ2NCBpdGVyX251bWJlcjsgLy8gaXRlcmF0aW9uIG51bWJlciBvZiAiY29sbGFwc2VkIiBsb29wIG5lc3QKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAga21wX3RlYW1fdCAqdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgIGttcF9kaXNwX3QgKnByX2J1ZjsKKyAgICBrbXBfaW50NjQgbG8sIHVwLCBzdDsKKworICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3dhaXQoKSBleGl0OiBzZXJpYWxpemVkIHRlYW1cbiIpKTsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBkZXBlbmRlbmNpZXMgaWYgdGVhbSBpcyBzZXJpYWxpemVkCisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHNlcXVlbnRpYWwgaXRlcmF0aW9uIG51bWJlciBhbmQgY2hlY2sgb3V0LW9mLWJvdW5kcyBjb25kaXRpb24KKyAgICBwcl9idWYgPSB0aC0+dGgudGhfZGlzcGF0Y2g7CisgICAgS01QX0RFQlVHX0FTU0VSVChwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8gIT0gTlVMTCk7CisgICAgbnVtX2RpbXMgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMF07CisgICAgbG8gPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bMl07CisgICAgdXAgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bM107CisgICAgc3QgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9bNF07CisgICAgaWYoIHN0ID09IDEgKSB7IC8vIG1vc3QgY29tbW9uIGNhc2UKKyAgICAgICAgaWYoIHZlY1swXSA8IGxvIHx8IHZlY1swXSA+IHVwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsKAorICAgICAgICAgICAgICAgICJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiBib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdmVjWzBdLCBsbywgdXApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdGVyX251bWJlciA9IHZlY1swXSAtIGxvOworICAgIH0gZWxzZSBpZiggc3QgPiAwICkgeworICAgICAgICBpZiggdmVjWzBdIDwgbG8gfHwgdmVjWzBdID4gdXAgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgaXMgb3V0IG9mIGJvdW5kcyBbJWxsZCwlbGxkXVxuIiwKKyAgICAgICAgICAgICAgICBndGlkLCB2ZWNbMF0sIGxvLCB1cCkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKHZlY1swXSAtIGxvKSAvIHN0OworICAgIH0gZWxzZSB7ICAgICAgICAvLyBuZWdhdGl2ZSBpbmNyZW1lbnQKKyAgICAgICAgaWYoIHZlY1swXSA+IGxvIHx8IHZlY1swXSA8IHVwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsKAorICAgICAgICAgICAgICAgICJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiBib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdmVjWzBdLCBsbywgdXApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICBpdGVyX251bWJlciA9IChrbXBfdWludDY0KShsbyAtIHZlY1swXSkgLyAoLXN0KTsKKyAgICB9CisgICAgZm9yKCBpID0gMTsgaSA8IG51bV9kaW1zOyArK2kgKSB7CisgICAgICAgIGttcF9pbnQ2NCBpdGVyLCBsbjsKKyAgICAgICAga21wX2ludDMyIGogPSBpICogNDsKKyAgICAgICAgbG4gPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDFdOworICAgICAgICBsbyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgMl07CisgICAgICAgIHVwID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAzXTsKKyAgICAgICAgc3QgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDRdOworICAgICAgICBpZiggc3QgPT0gMSApIHsKKyAgICAgICAgICAgIGlmKCB2ZWNbaV0gPCBsbyB8fCB2ZWNbaV0gPiB1cCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiBib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1tpXSwgbG8sIHVwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlciA9IHZlY1tpXSAtIGxvOworICAgICAgICB9IGVsc2UgaWYoIHN0ID4gMCApIHsKKyAgICAgICAgICAgIGlmKCB2ZWNbaV0gPCBsbyB8fCB2ZWNbaV0gPiB1cCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiBib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1tpXSwgbG8sIHVwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlciA9IChrbXBfdWludDY0KSh2ZWNbaV0gLSBsbykgLyBzdDsKKyAgICAgICAgfSBlbHNlIHsgICAvLyBzdCA8IDAKKyAgICAgICAgICAgIGlmKCB2ZWNbaV0gPiBsbyB8fCB2ZWNbaV0gPCB1cCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcGNfZG9hY3Jvc3Nfd2FpdCgpIGV4aXQ6IFQjJWQgaXRlciAlbGxkIGlzIG91dCBvZiBib3VuZHMgWyVsbGQsJWxsZF1cbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHZlY1tpXSwgbG8sIHVwKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaXRlciA9IChrbXBfdWludDY0KShsbyAtIHZlY1tpXSkgLyAoLXN0KTsKKyAgICAgICAgfQorICAgICAgICBpdGVyX251bWJlciA9IGl0ZXIgKyBsbiAqIGl0ZXJfbnVtYmVyOworICAgIH0KKyAgICBzaGZ0ID0gaXRlcl9udW1iZXIgJSAzMjsgLy8gdXNlIDMyLWJpdCBncmFudWxhcml0eQorICAgIGl0ZXJfbnVtYmVyID4+PSA1OyAgICAgICAvLyBkaXZpZGVkIGJ5IDMyCisgICAgZmxhZyA9IDEgPDwgc2hmdDsKKyAgICB3aGlsZSggKGZsYWcgJiBwcl9idWYtPnRoX2RvYWNyb3NzX2ZsYWdzW2l0ZXJfbnVtYmVyXSkgPT0gMCApIHsKKyAgICAgICAgS01QX1lJRUxEKFRSVUUpOworICAgIH0KKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc193YWl0KCkgZXhpdDogVCMlZCB3YWl0IGZvciBpdGVyICVsbGQgY29tcGxldGVkXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCAoaXRlcl9udW1iZXI8PDUpK3NoZnQpKTsKK30KKwordm9pZAorX19rbXBjX2RvYWNyb3NzX3Bvc3QoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgbG9uZyBsb25nICp2ZWMpCit7CisgICAga21wX2ludDMyIHNoZnQsIG51bV9kaW1zLCBpOworICAgIGttcF91aW50MzIgZmxhZzsKKyAgICBrbXBfaW50NjQgaXRlcl9udW1iZXI7IC8vIGl0ZXJhdGlvbiBudW1iZXIgb2YgImNvbGxhcHNlZCIgbG9vcCBuZXN0CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICBrbXBfZGlzcF90ICpwcl9idWY7CisgICAga21wX2ludDY0IGxvLCBzdDsKKworICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3Bvc3QoKSBlbnRlcjogY2FsbGVkIFQjJWRcbiIsIGd0aWQpKTsKKyAgICBpZiggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCgiX19rbXBjX2RvYWNyb3NzX3Bvc3QoKSBleGl0OiBzZXJpYWxpemVkIHRlYW1cbiIpKTsKKyAgICAgICAgcmV0dXJuOyAvLyBubyBkZXBlbmRlbmNpZXMgaWYgdGVhbSBpcyBzZXJpYWxpemVkCisgICAgfQorCisgICAgLy8gY2FsY3VsYXRlIHNlcXVlbnRpYWwgaXRlcmF0aW9uIG51bWJlciAoc2FtZSBhcyBpbiAid2FpdCIgYnV0IG5vIG91dC1vZi1ib3VuZHMgY2hlY2tzKQorICAgIHByX2J1ZiA9IHRoLT50aC50aF9kaXNwYXRjaDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyAhPSBOVUxMKTsKKyAgICBudW1fZGltcyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1swXTsKKyAgICBsbyA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1syXTsKKyAgICBzdCA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1s0XTsKKyAgICBpZiggc3QgPT0gMSApIHsgLy8gbW9zdCBjb21tb24gY2FzZQorICAgICAgICBpdGVyX251bWJlciA9IHZlY1swXSAtIGxvOworICAgIH0gZWxzZSBpZiggc3QgPiAwICkgeworICAgICAgICBpdGVyX251bWJlciA9IChrbXBfdWludDY0KSh2ZWNbMF0gLSBsbykgLyBzdDsKKyAgICB9IGVsc2UgeyAgICAgICAgLy8gbmVnYXRpdmUgaW5jcmVtZW50CisgICAgICAgIGl0ZXJfbnVtYmVyID0gKGttcF91aW50NjQpKGxvIC0gdmVjWzBdKSAvICgtc3QpOworICAgIH0KKyAgICBmb3IoIGkgPSAxOyBpIDwgbnVtX2RpbXM7ICsraSApIHsKKyAgICAgICAga21wX2ludDY0IGl0ZXIsIGxuOworICAgICAgICBrbXBfaW50MzIgaiA9IGkgKiA0OworICAgICAgICBsbiA9IHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mb1tqICsgMV07CisgICAgICAgIGxvID0gcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvW2ogKyAyXTsKKyAgICAgICAgc3QgPSBwcl9idWYtPnRoX2RvYWNyb3NzX2luZm9baiArIDRdOworICAgICAgICBpZiggc3QgPT0gMSApIHsKKyAgICAgICAgICAgIGl0ZXIgPSB2ZWNbaV0gLSBsbzsKKyAgICAgICAgfSBlbHNlIGlmKCBzdCA+IDAgKSB7CisgICAgICAgICAgICBpdGVyID0gKGttcF91aW50NjQpKHZlY1tpXSAtIGxvKSAvIHN0OworICAgICAgICB9IGVsc2UgeyAgIC8vIHN0IDwgMAorICAgICAgICAgICAgaXRlciA9IChrbXBfdWludDY0KShsbyAtIHZlY1tpXSkgLyAoLXN0KTsKKyAgICAgICAgfQorICAgICAgICBpdGVyX251bWJlciA9IGl0ZXIgKyBsbiAqIGl0ZXJfbnVtYmVyOworICAgIH0KKyAgICBzaGZ0ID0gaXRlcl9udW1iZXIgJSAzMjsgLy8gdXNlIDMyLWJpdCBncmFudWxhcml0eQorICAgIGl0ZXJfbnVtYmVyID4+PSA1OyAgICAgICAvLyBkaXZpZGVkIGJ5IDMyCisgICAgZmxhZyA9IDEgPDwgc2hmdDsKKyAgICBpZiggKGZsYWcgJiBwcl9idWYtPnRoX2RvYWNyb3NzX2ZsYWdzW2l0ZXJfbnVtYmVyXSkgPT0gMCApCisgICAgICAgIEtNUF9URVNUX1RIRU5fT1IzMiggKGttcF9pbnQzMiopJnByX2J1Zi0+dGhfZG9hY3Jvc3NfZmxhZ3NbaXRlcl9udW1iZXJdLCAoa21wX2ludDMyKWZsYWcgKTsKKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19wb3N0KCkgZXhpdDogVCMlZCBpdGVyICVsbGQgcG9zdGVkXG4iLAorICAgICAgICAgICAgICAgICBndGlkLCAoaXRlcl9udW1iZXI8PDUpK3NoZnQpKTsKK30KKwordm9pZAorX19rbXBjX2RvYWNyb3NzX2ZpbmkoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCkKK3sKKyAgICBrbXBfaW50NjQgbnVtX2RvbmU7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW2d0aWRdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aC0+dGgudGhfdGVhbTsKKyAgICBrbXBfZGlzcF90ICpwcl9idWYgPSB0aC0+dGgudGhfZGlzcGF0Y2g7CisKKyAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19maW5pKCkgZW50ZXI6IGNhbGxlZCBUIyVkXG4iLCBndGlkKSk7CisgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLQV9UUkFDRSgyMCwoIl9fa21wY19kb2Fjcm9zc19maW5pKCkgZXhpdDogc2VyaWFsaXplZCB0ZWFtICVwXG4iLCB0ZWFtKSk7CisgICAgICAgIHJldHVybjsgLy8gbm90aGluZyB0byBkbworICAgIH0KKyAgICBudW1fZG9uZSA9IEtNUF9URVNUX1RIRU5fSU5DNjQoKGttcF9pbnQ2NCopcHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzFdKSArIDE7CisgICAgaWYoIG51bV9kb25lID09IHRoLT50aC50aF90ZWFtX25wcm9jICkgeworICAgICAgICAvLyB3ZSBhcmUgdGhlIGxhc3QgdGhyZWFkLCBuZWVkIHRvIGZyZWUgc2hhcmVkIHJlc291cmNlcworICAgICAgICBpbnQgaWR4ID0gcHJfYnVmLT50aF9kb2Fjcm9zc19idWZfaWR4IC0gMTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdCAqc2hfYnVmID0gJnRlYW0tPnQudF9kaXNwX2J1ZmZlcltpZHggJSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVyc107CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocHJfYnVmLT50aF9kb2Fjcm9zc19pbmZvWzFdID09IChrbXBfaW50NjQpJnNoX2J1Zi0+ZG9hY3Jvc3NfbnVtX2RvbmUpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG51bV9kb25lID09IChrbXBfaW50NjQpc2hfYnVmLT5kb2Fjcm9zc19udW1fZG9uZSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaWR4ID09IHNoX2J1Zi0+ZG9hY3Jvc3NfYnVmX2lkeCk7CisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRoLCAodm9pZCopc2hfYnVmLT5kb2Fjcm9zc19mbGFncyk7CisgICAgICAgIHNoX2J1Zi0+ZG9hY3Jvc3NfZmxhZ3MgPSBOVUxMOworICAgICAgICBzaF9idWYtPmRvYWNyb3NzX251bV9kb25lID0gMDsKKyAgICAgICAgc2hfYnVmLT5kb2Fjcm9zc19idWZfaWR4ICs9IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzOyAvLyBmcmVlIGJ1ZmZlciBmb3IgZnV0dXJlIHJlLXVzZQorICAgIH0KKyAgICAvLyBmcmVlIHByaXZhdGUgcmVzb3VyY2VzIChuZWVkIHRvIGtlZXAgYnVmZmVyIGluZGV4IGZvcmV2ZXIpCisgICAgX19rbXBfdGhyZWFkX2ZyZWUodGgsICh2b2lkKilwcl9idWYtPnRoX2RvYWNyb3NzX2luZm8pOworICAgIHByX2J1Zi0+dGhfZG9hY3Jvc3NfaW5mbyA9IE5VTEw7CisgICAgS0FfVFJBQ0UoMjAsKCJfX2ttcGNfZG9hY3Jvc3NfZmluaSgpIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnLmMgYi9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2JiZmZhNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuYwpAQCAtMCwwICsxLDE0MiBAQAorLyoKKyAqIGttcF9kZWJ1Zy5jIC0tIGRlYnVnIHV0aWxpdGllcyBmb3IgdGhlIEd1aWRlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIiAvKiByZWFsbHkgbmVjZXNzYXJ5PyAqLworI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZmRlZiBLTVBfREVCVUcKK3ZvaWQKK19fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX291dCwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKGFwKTsKK30KKyNlbmRpZgorCit2b2lkCitfX2ttcF9kZWJ1Z19wcmludGYoIGNoYXIgY29uc3QgKiBmb3JtYXQsIC4uLiApCit7CisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCApOworCisgICAgX19rbXBfdnByaW50Zigga21wX2VyciwgZm9ybWF0LCBhcCApOworCisgICAgdmFfZW5kKCBhcCApOworfQorCisjaWZkZWYgS01QX1VTRV9BU1NFUlQKKyAgICBpbnQKKyAgICBfX2ttcF9kZWJ1Z19hc3NlcnQoCisgICAgICAgIGNoYXIgY29uc3QgKiAgbXNnLAorICAgICAgICBjaGFyIGNvbnN0ICogIGZpbGUsCisgICAgICAgIGludCAgICAgICAgICAgbGluZQorICAgICkgeworCisgICAgICAgIGlmICggZmlsZSA9PSBOVUxMICkgeworICAgICAgICAgICAgZmlsZSA9IEtNUF9JMThOX1NUUiggVW5rbm93bkZpbGUgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlbW92ZSBkaXJlY3RvcmllcyBmcm9tIHBhdGgsIGxlYXZlIG9ubHkgZmlsZSBuYW1lLiBGaWxlIG5hbWUgaXMgZW5vdWdoLCB0aGVyZSBpcyBubyBuZWVkCisgICAgICAgICAgICAvLyBpbiBib3RoZXJpbmcgZGV2ZWxvcGVycyBhbmQgY3VzdG9tZXJzIHdpdGggZnVsbCBwYXRocy4KKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzbGFzaCA9IHN0cnJjaHIoIGZpbGUsICcvJyApOworICAgICAgICAgICAgaWYgKCBzbGFzaCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIGZpbGUgPSBzbGFzaCArIDE7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgICAgICAgICAgX19rbXBfZGVidWdfcHJpbnRmKCAiQXNzZXJ0aW9uIGZhaWx1cmUgYXQgJXMoJWQpOiAlcy5cbiIsIGZpbGUsIGxpbmUsIG1zZyApOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEZWJ1Z0JyZWFrKCk7CisgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9CUkVBSworICAgICAgICAgICAgI2lmZGVmIFVTRV9BU1NFUlRfU1RBTEwKKyAgICAgICAgICAgICAgICAvKiAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7ICovCisgICAgICAgICAgICAgICAgZm9yKDs7KTsKKyAgICAgICAgICAgICNlbmRpZiAvLyBVU0VfQVNTRVJUX1NUQUxMCisgICAgICAgICAgICAjaWZkZWYgVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGludCB2b2xhdGlsZSAqIFpFUk8gPSAoaW50KikgMDsKKyAgICAgICAgICAgICAgICAgICAgKysgKCpaRVJPKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYgLy8gVVNFX0FTU0VSVF9TRUcKKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQXNzZXJ0aW9uRmFpbHVyZSwgZmlsZSwgbGluZSApLAorICAgICAgICAgICAgS01QX0hOVCggU3VibWl0QnVnUmVwb3J0ICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworCisgICAgICAgIHJldHVybiAwOworCisgICAgfSAvLyBfX2ttcF9kZWJ1Z19hc3NlcnQKKworI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKy8qIER1bXAgZGVidWdnaW5nIGJ1ZmZlciB0byBzdGRlcnIgKi8KK3ZvaWQKK19fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IGRjID0gX19rbXBfZGVidWdfY291bnQ7CisgICAgICAgIGNoYXIgKmRiID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIChkYyAlIF9fa21wX2RlYnVnX2J1Zl9saW5lcykgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgY2hhciAqZGJfZW5kID0gJiBfX2ttcF9kZWJ1Z19idWZmZXJbIF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFycyBdOworICAgICAgICBjaGFyICpkYjI7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5TdGFydCBkdW1wIG9mIGRlYnVnZ2luZyBidWZmZXIgKGVudHJ5PSVkKTpcbiIsCisgICAgICAgICAgICAgICAgIGRjICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF9kZWJ1Z19idWZfbGluZXM7IGkrKyApIHsKKworICAgICAgICAgICAgaWYgKCAqZGIgIT0gJ1wwJyApIHsKKyAgICAgICAgICAgICAgICAvKiBGaXggdXAgd2hlcmUgbm8gY2FycmlhZ2UgcmV0dXJuIGJlZm9yZSBzdHJpbmcgdGVybWluYXRpb24gY2hhciAqLworICAgICAgICAgICAgICAgIGZvciAoIGRiMiA9IGRiICsgMTsgZGIyIDwgZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxOyBkYjIgKyspIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAqZGIyID09ICdcMCcgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICooZGIyLTEpICE9ICdcbicgKSB7ICpkYjIgPSAnXG4nOyAqKGRiMisxKSA9ICdcMCc7IH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8qIEhhbmRsZSBjYXNlIGF0IGVuZCBieSBzaG9ydGVuaW5nIHRoZSBwcmludGVkIG1lc3NhZ2UgYnkgb25lIGNoYXIgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgICAgICAgICAgaWYgKCBkYjIgPT0gZGIgKyBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgLSAxICYmCisgICAgICAgICAgICAgICAgICAgICAqZGIyID09ICdcMCcgJiYgKihkYjItMSkgIT0gJ1xuJyApIHsKKyAgICAgICAgICAgICAgICAgICAgKihkYjItMSkgPSAnXG4nOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJTRkOiAlLipzIiwgaSwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBkYiApOworICAgICAgICAgICAgICAgICpkYiA9ICdcMCc7IC8qIG9ubHkgbGV0IGl0IHByaW50IG9uY2UhICovCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGRiICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKyAgICAgICAgICAgIGlmICggZGIgPj0gZGJfZW5kICkKKyAgICAgICAgICAgICAgICBkYiA9IF9fa21wX2RlYnVnX2J1ZmZlcjsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiRW5kIGR1bXAgb2YgZGVidWdnaW5nIGJ1ZmZlciAoZW50cnk9JWQpLlxuXG4iLAorICAgICAgICAgICAgICAgICAoIGRjK2ktMSApICUgX19rbXBfZGVidWdfYnVmX2xpbmVzICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIH0KK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWcuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40ZDk4N2Y1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Zy5oCkBAIC0wLDAgKzEsMTMxIEBACisvKgorICoga21wX2RlYnVnLmggLS0gZGVidWcgLyBhc3NlcnRpb24gY29kZSBmb3IgQXNzdXJlIGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfREVCVUdfSAorI2RlZmluZSBLTVBfREVCVUdfSAorCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIEJ1aWxkLXRpbWUgYXNzZXJ0aW9uIGNhbiBkbyBjb21waWxlLXRpbWUgY2hlY2tpbmcgb2YgZGF0YSBzdHJ1Y3R1cmUgc2l6ZXMsIGV0Yy4gVGhpcyB3b3JrcyBieQorICAgIGRlY2xhcmluZyBhIG5lZ2F0aXZlLWxlbmd0aCBhcnJheSBpZiB0aGUgY29uZGl0aW9uYWwgZXhwcmVzc2lvbiBldmFsdWF0ZXMgdG8gZmFsc2UuICBJbiB0aGF0CisgICAgY2FzZSwgdGhlIGNvbXBpbGVyIGlzc3VlcyBhIHN5bnRheCBlcnJvciBhbmQgc3RvcHMgdGhlIGNvbXBpbGF0aW9uLiBJZiB0aGUgZXhwcmVzc2lvbiBpcworICAgIHRydWUsIHdlIGdldCBhbiBleHRyYW5lb3VzIHN0YXRpYyBzaW5nbGUgY2hhcmFjdGVyIGFycmF5IGluIHRoZSBzY29wZSBvZiB0aGUgbWFjcm8uCisKKyAgICBVc2FnZToKKworICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIHNvbWVfdCApIDw9IDMyICk7CisgICAgICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBzb21lX3QsIGZpZWxkICkgJSA4ID09IDAgKTsKKworICAgIERvIG5vdCB1c2UgX0tNUF9CVUlMRF9BU1NFUlQgYW5kIF9fS01QX0JVSUxEX0FTU0VSVCBkaXJlY3RseSwgaXQgaXMgd29ya2luZyBndXRzLgorKi8KKworI2RlZmluZSBfX0tNUF9CVUlMRF9BU1NFUlQoIGV4cHIsIHN1ZmZpeCApICB0eXBlZGVmIGNoYXIgX19rbXBfYnVpbGRfY2hlY2tfIyNzdWZmaXhbIChleHByKSA/IDEgOiAtMSBdCisjZGVmaW5lIF9LTVBfQlVJTERfQVNTRVJUKCBleHByLCBzdWZmaXggKSAgIF9fS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBzdWZmaXggKQorI2lmZGVmIEtNUF9VU0VfQVNTRVJUCisgICAgI2RlZmluZSBLTVBfQlVJTERfQVNTRVJUKCBleHByICkgICAgICAgICAgICBfS01QX0JVSUxEX0FTU0VSVCggKGV4cHIpLCBfX0xJTkVfXyApCisjZWxzZQorICAgICNkZWZpbmUgS01QX0JVSUxEX0FTU0VSVCggZXhwciApICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAqLworI2VuZGlmCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFJ1bi10aW1lIGFzc2VydGlvbnMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2V4dGVybiB2b2lkIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCB2b2lkICk7CisKKyNpZmRlZiBLTVBfVVNFX0FTU0VSVAorICAgIGV4dGVybiBpbnQgX19rbXBfZGVidWdfYXNzZXJ0KCBjaGFyIGNvbnN0ICogZXhwciwgY2hhciBjb25zdCAqIGZpbGUsIGludCBsaW5lICk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICNjb25kLCBfX0ZJTEVfXywgX19MSU5FX18gKSApCisgICAgICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgICggKGNvbmQpID8gMCA6IF9fa21wX2RlYnVnX2Fzc2VydCggKG1zZyksIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUKCBjb25kICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVDIoIGNvbmQsIG1zZyApIEtNUF9BU1NFUlQyKCBjb25kLCBtc2cgKQorICAgICNlbHNlCisgICAgICAgIC8vIERvIG5vdCBleHBvc2UgY29uZGl0aW9uIGluIHJlbGVhc2UgYnVpbGQuIFVzZSAiYXNzZXJ0aW9uIGZhaWx1cmUiLgorICAgICAgICAjZGVmaW5lIEtNUF9BU1NFUlQoIGNvbmQgKSAgICAgICAgICAgICAoIChjb25kKSA/IDAgOiBfX2ttcF9kZWJ1Z19hc3NlcnQoICJhc3NlcnRpb24gZmFpbHVyZSIsIF9fRklMRV9fLCBfX0xJTkVfXyApICkKKyAgICAgICAgI2RlZmluZSBLTVBfQVNTRVJUMiggY29uZCwgbXNnICkgICAgICAgS01QX0FTU0VSVCggY29uZCApCisgICAgICAgICNkZWZpbmUgS01QX0RFQlVHX0FTU0VSVCggY29uZCApICAgICAgIDAKKyAgICAgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorICAgICNlbmRpZiAvLyBLTVBfREVCVUcKKyNlbHNlCisgICAgI2RlZmluZSBLTVBfQVNTRVJUKCBjb25kICkgICAgICAgICAgICAgMAorICAgICNkZWZpbmUgS01QX0FTU0VSVDIoIGNvbmQsIG1zZyApICAgICAgIDAKKyAgICAjZGVmaW5lIEtNUF9ERUJVR19BU1NFUlQoIGNvbmQgKSAgICAgICAwCisgICAgI2RlZmluZSBLTVBfREVCVUdfQVNTRVJUMiggY29uZCwgbXNnICkgMAorI2VuZGlmIC8vIEtNUF9VU0VfQVNTRVJUCisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9kZWJ1Z19wcmludGZfc3Rkb3V0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKyNlbmRpZgorZXh0ZXJuIHZvaWQgX19rbXBfZGVidWdfcHJpbnRmKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgZXh0ZXJuIGludCBrbXBfYV9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9iX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2NfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZF9kZWJ1ZzsKKyAgICBleHRlcm4gaW50IGttcF9lX2RlYnVnOworICAgIGV4dGVybiBpbnQga21wX2ZfZGVidWc7CisgICAgZXh0ZXJuIGludCBrbXBfZGlhZzsKKworICAgICNkZWZpbmUgS0FfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9hX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLQl9UUkFDRShkLHgpICAgICBpZiAoa21wX2JfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS0RfVFJBQ0UoZCx4KSAgICAgaWYgKGttcF9kX2RlYnVnID49IGQpIHsgX19rbXBfZGVidWdfcHJpbnRmIHggOyB9CisgICAgI2RlZmluZSBLRV9UUkFDRShkLHgpICAgICBpZiAoa21wX2VfZGVidWcgPj0gZCkgeyBfX2ttcF9kZWJ1Z19wcmludGYgeCA7IH0KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50ZiB4IDsgfQorICAgICNkZWZpbmUgS19ESUFHKGQseCkgICAgICAge2lmIChrbXBfZGlhZyA9PSBkKSB7IF9fa21wX2RlYnVnX3ByaW50Zl9zdGRvdXQgeCA7IH0gfQorCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIGlmIChrbXBfYV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQl9EVU1QKGQseCkgICAgIGlmIChrbXBfYl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLQ19EVU1QKGQseCkgICAgIGlmIChrbXBfY19kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIGlmIChrbXBfZF9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRV9EVU1QKGQseCkgICAgIGlmIChrbXBfZV9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisgICAgI2RlZmluZSBLRl9EVU1QKGQseCkgICAgIGlmIChrbXBfZl9kZWJ1ZyA+PSBkKSB7IGludCBrczsgX19rbXBfZGlzYWJsZSgma3MpOyAoeCkgOyBfX2ttcF9lbmFibGUoa3MpOyB9CisKKyNlbHNlCisKKyAgICAjZGVmaW5lIEtBX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtDX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtEX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtGX1RSQUNFKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtfRElBRyhkLHgpICAgICAgIHt9Lyogbm90aGluZyB0byBkbyAqLworCisgICAgI2RlZmluZSBLQV9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtCX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0NfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisgICAgI2RlZmluZSBLRF9EVU1QKGQseCkgICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KKyAgICAjZGVmaW5lIEtFX0RVTVAoZCx4KSAgICAgLyogbm90aGluZyB0byBkbyAqLworICAgICNkZWZpbmUgS0ZfRFVNUChkLHgpICAgICAvKiBub3RoaW5nIHRvIGRvICovCisKKyNlbmRpZiAvLyBLTVBfREVCVUcKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9ERUJVR19IICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMgYi9yYzMvcnVudGltZS9zcmMva21wX2RlYnVnZ2VyLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzZmZTFlMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuYwpAQCAtMCwwICsxLDMxNSBAQAorI2lmIFVTRV9ERUJVR0dFUgorLyoKKyAqIGttcF9kZWJ1Z2dlci5jIC0tIGRlYnVnZ2VyIHN1cHBvcnQuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9vbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKy8qCisgICAgTk9URTogQWxsIHZhcmlhYmxlIG5hbWVzIGFyZSBrbm93biB0byB0aGUgZGVidWdnZXIsIGRvIG5vdCBjaGFuZ2UhCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyAgICAgICAgZXh0ZXJuIGttcF9vbXBfc3RydWN0X2luZm9fdCBfX2ttcF9vbXBfZGVidWdfc3RydWN0X2luZm87CisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworaW50IF9fa21wX2RlYnVnZ2luZyAgICAgICAgICA9IEZBTFNFOyAgICAvLyBCb29sZWFuIHdoZXRoZXIgY3VycmVudGx5IGRlYnVnZ2luZyBPcGVuTVAgUlRMLgorCisjZGVmaW5lIG9mZnNldF9hbmRfc2l6ZV9vZiggc3RydWN0dXJlLCBmaWVsZCApICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9mZnNldG9mKCBzdHJ1Y3R1cmUsICAgICAgICAgICBmaWVsZCApLCAgICBcCisgICAgICAgIHNpemVvZiggKCAoc3RydWN0dXJlICopIE5VTEwpLT5maWVsZCApICAgICBcCisgICAgfQorCisjZGVmaW5lIG9mZnNldF9hbmRfc2l6ZV9ub3RfYXZhaWxhYmxlIFwKKyAgICB7IC0xLCAtMSB9CisKKyNkZWZpbmUgYWRkcl9hbmRfc2l6ZV9vZiggdmFyICkgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgKGttcF91aW50NjQpKCAmIHZhciApLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgc2l6ZW9mKCB2YXIgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKyNkZWZpbmUgbnRocl9idWZmZXJfc2l6ZSAxMDI0CitzdGF0aWMga21wX2ludDMyCitrbXBfb21wX250aHJfaW5mb19idWZmZXJbIG50aHJfYnVmZmVyX3NpemUgXSA9CisgICAgeyBudGhyX2J1ZmZlcl9zaXplICogc2l6ZW9mKCBrbXBfaW50MzIgKSB9OworCisvKiBUT0RPOiBDaGVjayBwdW5jdHVhdGlvbiBmb3IgdmFyaW91cyBwbGF0Zm9ybXMgaGVyZSAqLworc3RhdGljIGNoYXIgZnVuY19taWNyb3Rhc2tbXSAgICA9ICJfX2ttcF9pbnZva2VfbWljcm90YXNrIjsKK3N0YXRpYyBjaGFyIGZ1bmNfZm9ya1tdICAgICAgICAgPSAiX19rbXBjX2ZvcmtfY2FsbCI7CitzdGF0aWMgY2hhciBmdW5jX2ZvcmtfdGVhbXNbXSAgID0gIl9fa21wY19mb3JrX3RlYW1zIjsKKworCisvLyBWYXJpb3VzIGluZm8gYWJvdXQgcnVudGltZSBzdHJ1Y3R1cmVzOiBhZGRyZXNzZXMsIGZpZWxkIG9mZnNldHMsIHNpemVzLCBldGMuCitrbXBfb21wX3N0cnVjdF9pbmZvX3QKK19fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbyA9IHsKKworICAgIC8qIENoYW5nZSB0aGlzIG9ubHkgaWYgeW91IG1ha2UgYSBmdW5kYW1lbnRhbCBkYXRhIHN0cnVjdHVyZSBjaGFuZ2UgaGVyZSAqLworICAgIEtNUF9PTVBfVkVSU0lPTiwKKworICAgIC8qIHNhbml0eSBjaGVjay4gIE9ubHkgc2hvdWxkIGJlIGNoZWNrZWQgaWYgdmVyc2lvbnMgYXJlIGlkZW50aWNhbAorICAgICAqIFRoaXMgaXMgYWxzbyB1c2VkIGZvciBiYWNrd2FyZCBjb21wYXRpYmlsaXR5IHRvIGdldCB0aGUgcnVudGltZQorICAgICAqIHN0cnVjdHVyZSBzaXplIGlmIGl0IHRoZSBydW50aW1lIGlzIG9sZGVyIHRoYW4gdGhlIGludGVyZmFjZSAqLworICAgIHNpemVvZigga21wX29tcF9zdHJ1Y3RfaW5mb190ICksCisKKyAgICAvKiBPcGVuTVAgUlRMIHZlcnNpb24gaW5mby4gKi8KKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF92ZXJzaW9uX21ham9yICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdmVyc2lvbl9taW5vciApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3ZlcnNpb25fYnVpbGQgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF9vcGVubXBfdmVyc2lvbiApLAorICAgIHsgKGttcF91aW50NjQpKCBfX2ttcF9jb3B5cmlnaHQgKSArIEtNUF9WRVJTSU9OX01BR0lDX0xFTiwgMCB9LCAgICAgICAgLy8gU2tpcCBtYWdpYyBwcmVmaXguCisKKyAgICAvKiBWYXJpb3VzIGdsb2JhbHMuICovCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGhyZWFkcyApLAorICAgIGFkZHJfYW5kX3NpemVfb2YoIF9fa21wX3Jvb3QgKSwKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfbW9uaXRvciApLAorI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICBhZGRyX2FuZF9zaXplX29mKCBfX2ttcF91c2VyX2xvY2tfdGFibGUgKSwKKyNlbmRpZgorICAgIGFkZHJfYW5kX3NpemVfb2YoIGZ1bmNfbWljcm90YXNrICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggZnVuY19mb3JrICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggZnVuY19mb3JrX3RlYW1zICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGVhbV9jb3VudGVyICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZiggX19rbXBfdGFza19jb3VudGVyICksCisgICAgYWRkcl9hbmRfc2l6ZV9vZigga21wX29tcF9udGhyX2luZm9fYnVmZmVyICksCisgICAgc2l6ZW9mKCB2b2lkICogKSwKKyAgICBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSwKKyAgICBic19sYXN0X2JhcnJpZXIsCisgICAgSU5JVElBTF9UQVNLX0RFUVVFX1NJWkUsCisKKyAgICAvLyB0aHJlYWQgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV9pbmZvX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfaW5mbyApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90ZWFtICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3Jvb3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfc2VyaWFsX3RlYW0gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfaWRlbnQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfc3Bpbl9oZXJlICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX25leHRfd2FpdGluZyApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCB0aF90YXNrX3RlYW0gICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfY3VycmVudF90YXNrICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9pbmZvX3QsIHRoX3Rhc2tfc3RhdGUgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfaW5mb190LCAgIHRoX2JhciApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2JzdGF0ZV90LCAgICAgIGJfd29ya2VyX2Fycml2ZWQgKSwKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gdGVhbXMgaW5mb3JtYXRpb24KKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGVhbXNfbWljcm90YXNrKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2luZm9fdCwgdGhfdGVhbXNfbGV2ZWwpLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3RlYW1zX3NpemVfdCwgbnRlYW1zICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGVhbXNfc2l6ZV90LCBudGggKSwKKyNlbmRpZgorCisgICAgLy8ga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkKKyAgICBzaXplb2YoIGttcF9kZXNjX2Jhc2VfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Rlc2NfYmFzZV90LCBkc190aWQgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXNjX2Jhc2VfdCwgZHNfZ3RpZCAgICksCisgICAgLy8gT24gV2luZG93cyogT1MsIGRzX3RocmVhZCBjb250YWlucyBhIHRocmVhZCAvaGFuZGxlLywgd2hpY2ggaXMgbm90IHVzYWJsZSwgd2hpbGUgdGhyZWFkIC9pZC8KKyAgICAvLyBpcyBpbiBkc190aHJlYWRfaWQuCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfZGVzY19iYXNlX3QsIGRzX3RocmVhZF9pZCksCisgICAgI2Vsc2UKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXNjX2Jhc2VfdCwgZHNfdGhyZWFkKSwKKyAgICAjZW5kaWYKKworICAgIC8vIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV90ZWFtX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X21hc3Rlcl90aWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2lkZW50ICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X3BhcmVudCAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X25wcm9jICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X3RocmVhZHMgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X3NlcmlhbGl6ZWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X2lkICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X3BrZm4gICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RlYW1fdCwgICB0X3Rhc2tfdGVhbSApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGVhbV90LCAgIHRfaW1wbGljaXRfdGFza190YXNrZGF0YSApLAorI2lmIE9NUF80MF9FTkFCTEVECisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9jYW5jZWxfcmVxdWVzdCApLAorI2VuZGlmCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90ZWFtX3QsICAgdF9iYXIgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYWxpZ25fdGVhbV90LCBiX21hc3Rlcl9hcnJpdmVkICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFsaWduX3RlYW1fdCwgYl90ZWFtX2Fycml2ZWQgKSwKKworICAgIC8vIHJvb3Qgc3RydWN0dXJlIGluZm9ybWF0aW9uCisgICAgc2l6ZW9mKCBrbXBfYmFzZV9yb290X3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Jvb3RfdCwgcl9yb290X3RlYW0gICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2Vfcm9vdF90LCByX2hvdF90ZWFtICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9yb290X3QsIHJfdWJlcl90aHJlYWQgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfbm90X2F2YWlsYWJsZSwKKworICAgIC8vIGlkZW50IHN0cnVjdHVyZSBpbmZvcm1hdGlvbgorICAgIHNpemVvZiggaWRlbnRfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZiggaWRlbnRfdCwgcHNvdXJjZSApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZiggaWRlbnRfdCwgZmxhZ3MgICApLAorCisgICAgLy8gbG9jayBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24KKyAgICBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgaW5pdGlhbGl6ZWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgbG9jYXRpb24gKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190LCB0YWlsX2lkICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIGhlYWRfaWQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgbmV4dF90aWNrZXQgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgbm93X3NlcnZpbmcgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgb3duZXJfaWQgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgZGVwdGhfbG9ja2VkICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9xdWV1aW5nX2xvY2tfdCwgZmxhZ3MgKSwKKworI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAvKiBMb2NrIHRhYmxlLiAqLworICAgIHNpemVvZigga21wX2xvY2tfdGFibGVfdCApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2xvY2tfdGFibGVfdCwgdXNlZCAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2xvY2tfdGFibGVfdCwgYWxsb2NhdGVkICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2xvY2tfdGFibGVfdCwgdGFibGUgICAgICApLAorI2VuZGlmCisKKyAgICAvLyBUYXNrIHRlYW0gc3RydWN0dXJlIGluZm9ybWF0aW9uLgorICAgIHNpemVvZigga21wX2Jhc2VfdGFza190ZWFtX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF90aHJlYWRzX2RhdGEgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF9mb3VuZF90YXNrcyAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF9ucHJvYyAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF91bmZpbmlzaGVkX3RocmVhZHMgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3Rhc2tfdGVhbV90LCB0dF9hY3RpdmUgICAgICAgICAgICAgKSwKKworICAgIC8vIHRhc2tfZGF0YV90LgorICAgIHNpemVvZigga21wX3Rhc2tkYXRhX3QgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrX2lkICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfZmxhZ3MgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3RlYW0gICAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9wYXJlbnQgICAgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfbGV2ZWwgICAgICAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX2lkZW50ICAgICAgICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyApLAorCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfdGFza3dhaXRfaWRlbnQgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2t3YWl0X2NvdW50ZXIgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZGF0YV90LCB0ZF90YXNrd2FpdF90aHJlYWQgICksCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX3Rhc2tkYXRhX3QsIHRkX3Rhc2tncm91cCAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF90YXNrZ3JvdXBfdCwgY291bnQgICAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2dyb3VwX3QsIGNhbmNlbF9yZXF1ZXN0ICAgICApLAorCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza2RhdGFfdCwgdGRfZGVwbm9kZSAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2RlcG5vZGVfbGlzdF90LCBub2RlICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9kZXBub2RlX2xpc3RfdCwgbmV4dCAgICAgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9kZXBub2RlX3QsIHN1Y2Nlc3NvcnMgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfZGVwbm9kZV90LCB0YXNrICAgICAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX2RlcG5vZGVfdCwgbnByZWRlY2Vzc29ycyAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV9kZXBub2RlX3QsIG5yZWZzICAgICAgICAgICApLAorI2VuZGlmCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfdGFza190LCByb3V0aW5lICAgICAgICAgICAgICAgICApLAorCisgICAgLy8gdGhyZWFkX2RhdGFfdC4KKyAgICBzaXplb2YoIGttcF90aHJlYWRfZGF0YV90ICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZSAgICAgICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfc2l6ZSAgICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX2hlYWQgICAgICAgICksCisgICAgb2Zmc2V0X2FuZF9zaXplX29mKCBrbXBfYmFzZV90aHJlYWRfZGF0YV90LCB0ZF9kZXF1ZV90YWlsICAgICAgICApLAorICAgIG9mZnNldF9hbmRfc2l6ZV9vZigga21wX2Jhc2VfdGhyZWFkX2RhdGFfdCwgdGRfZGVxdWVfbnRhc2tzICAgICAgKSwKKyAgICBvZmZzZXRfYW5kX3NpemVfb2YoIGttcF9iYXNlX3RocmVhZF9kYXRhX3QsIHRkX2RlcXVlX2xhc3Rfc3RvbGVuICksCisKKyAgICAvLyBUaGUgbGFzdCBmaWVsZC4KKyAgICBLTVBfT01QX1ZFUlNJT04sCisKK307IC8vIF9fa21wX29tcF9kZWJ1Z19zdHJ1Y3RfaW5mbworCisjdW5kZWYgb2Zmc2V0X2FuZF9zaXplX29mCisjdW5kZWYgYWRkcl9hbmRfc2l6ZV9vZgorCisvKgorICBJbnRlbCBjb21waWxlciBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgaXNzdWVzIGEgd2FybmluZyAiY29udmVyc2lvbgorICBmcm9tICJ1bnNpZ25lZCBsb25nIGxvbmciIHRvICJjaGFyICoiIG1heSBsb3NlIHNpZ25pZmljYW50IGJpdHMiCisgIHdoZW4gNjQtYml0IHZhbHVlIGlzIGFzc2lnbmVkIHRvIDMyLWJpdCBwb2ludGVyLiBVc2UgdGhpcyBmdW5jdGlvbgorICB0byBzdXBwcmVzcyB0aGUgd2FybmluZy4KKyovCitzdGF0aWMgaW5saW5lCit2b2lkICoKK19fa21wX2NvbnZlcnRfdG9fcHRyKAorICAgIGttcF91aW50NjQgICAgYWRkcgorKSB7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwdXNoICkKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAgODEwICkgLy8gY29udmVyc2lvbiBmcm9tICJ1bnNpZ25lZCBsb25nIGxvbmciIHRvICJjaGFyICoiIG1heSBsb3NlIHNpZ25pZmljYW50IGJpdHMKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBkaXNhYmxlOiAxMTk1ICkgLy8gY29udmVyc2lvbiBmcm9tIGludGVnZXIgdG8gc21hbGxlciBwb2ludGVyCisgICAgI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKKyAgICByZXR1cm4gKHZvaWQgKikgYWRkcjsKKyAgICAjaWYgS01QX0NPTVBJTEVSX0lDQworICAgICAgICAjcHJhZ21hIHdhcm5pbmcoIHBvcCApCisgICAgI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MKK30gLy8gX19rbXBfY29udmVydF90b19wdHIKKworCitzdGF0aWMgaW50CitrbXBfbG9jYXRpb25fbWF0Y2goCisgICAga21wX3N0cl9sb2NfdCAqICAgICAgICBsb2MsCisgICAga21wX29tcF9udGhyX2l0ZW1fdCAqICBpdGVtCispIHsKKworICAgIGludCBmaWxlX21hdGNoID0gMDsKKyAgICBpbnQgZnVuY19tYXRjaCA9IDA7CisgICAgaW50IGxpbmVfbWF0Y2ggPSAwOworCisgICAgY2hhciAqIGZpbGUgPSAoY2hhciAqKSBfX2ttcF9jb252ZXJ0X3RvX3B0ciggaXRlbS0+ZmlsZSApOworICAgIGNoYXIgKiBmdW5jID0gKGNoYXIgKikgX19rbXBfY29udmVydF90b19wdHIoIGl0ZW0tPmZ1bmMgKTsKKyAgICBmaWxlX21hdGNoID0gX19rbXBfc3RyX2ZuYW1lX21hdGNoKCAmIGxvYy0+Zm5hbWUsIGZpbGUgKTsKKyAgICBmdW5jX21hdGNoID0KKyAgICAgICAgaXRlbS0+ZnVuYyA9PSAwICAvLyBJZiBpdGVtLT5mdW5jIGlzIE5VTEwsIGl0IGFsbG93cyBhbnkgZnVuYyBuYW1lLgorICAgICAgICB8fAorICAgICAgICBzdHJjbXAoIGZ1bmMsICIqIiApID09IDAKKyAgICAgICAgfHwKKyAgICAgICAgKCBsb2MtPmZ1bmMgIT0gTlVMTCAmJiBzdHJjbXAoIGxvYy0+ZnVuYywgZnVuYyApID09IDAgKTsKKyAgICBsaW5lX21hdGNoID0KKyAgICAgICAgaXRlbS0+YmVnaW4gPD0gbG9jLT5saW5lCisgICAgICAgICYmCisgICAgICAgICggaXRlbS0+ZW5kIDw9IDAgfHwgbG9jLT5saW5lIDw9IGl0ZW0tPmVuZCApOyAvLyBpZiBpdGVtLT5lbmQgPD0gMCwgaXQgbWVhbnMgImVuZCBvZiBmaWxlIi4KKworICAgIHJldHVybiAoIGZpbGVfbWF0Y2ggJiYgZnVuY19tYXRjaCAmJiBsaW5lX21hdGNoICk7CisKK30gLy8ga21wX2xvY2F0aW9uX21hdGNoCisKKworaW50CitfX2ttcF9vbXBfbnVtX3RocmVhZHMoCisgICAgaWRlbnRfdCBjb25zdCAqIGlkZW50CispIHsKKworICAgIGludCBudW1fdGhyZWFkcyA9IDA7CisKKyAgICBrbXBfb21wX250aHJfaW5mb190ICogaW5mbyA9CisgICAgICAgIChrbXBfb21wX250aHJfaW5mb190ICopIF9fa21wX2NvbnZlcnRfdG9fcHRyKCAgX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvLm50aHJfaW5mby5hZGRyICk7CisgICAgaWYgKCBpbmZvLT5udW0gPiAwICYmIGluZm8tPmFycmF5ICE9IDAgKSB7CisgICAgICAgIGttcF9vbXBfbnRocl9pdGVtX3QgKiBpdGVtcyA9IChrbXBfb21wX250aHJfaXRlbV90ICopIF9fa21wX2NvbnZlcnRfdG9fcHRyKCBpbmZvLT5hcnJheSApOworICAgICAgICBrbXBfc3RyX2xvY190ICAgICAgICAgbG9jICAgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGlkZW50LT5wc291cmNlLCAxICk7CisgICAgICAgIGludCBpOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IGluZm8tPm51bTsgKysgaSApIHsKKyAgICAgICAgICAgIGlmICgga21wX2xvY2F0aW9uX21hdGNoKCAmIGxvYywgJiBpdGVtc1sgaSBdICkgKSB7CisgICAgICAgICAgICAgICAgbnVtX3RocmVhZHMgPSBpdGVtc1sgaSBdLm51bV90aHJlYWRzOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJiBsb2MgKTsKKyAgICB9OyAvLyBpZgorCisgICAgcmV0dXJuIG51bV90aHJlYWRzOzsKKworfSAvLyBfX2ttcF9vbXBfbnVtX3RocmVhZHMKKyNlbmRpZiAvKiBVU0VfREVCVUdHRVIgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGVidWdnZXIuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZjBhZDk2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9kZWJ1Z2dlci5oCkBAIC0wLDAgKzEsNTEgQEAKKyNpZiBVU0VfREVCVUdHRVIKKy8qCisgKiBrbXBfZGVidWdnZXIuaCAtLSBkZWJ1Z2dlciBzdXBwb3J0LgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9ERUJVR0dFUl9ICisjZGVmaW5lIEtNUF9ERUJVR0dFUl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8qICogVGhpcyBleHRlcm5hbCB2YXJpYWJsZSBjYW4gYmUgc2V0IGJ5IGFueSBkZWJ1Z2dlciB0byBmbGFnIHRvIHRoZSBydW50aW1lIHRoYXQgd2UKKyAgIGFyZSBjdXJyZW50bHkgZXhlY3V0aW5nIGluc2lkZSBhIGRlYnVnZ2VyLiAgVGhpcyB3aWxsIGFsbG93IHRoZSBkZWJ1Z2dlciB0byBvdmVycmlkZQorICAgdGhlIG51bWJlciBvZiB0aHJlYWRzIHNwYXduZWQgaW4gYSBwYXJhbGxlbCByZWdpb24gYnkgdXNpbmcgX19rbXBfb21wX251bV90aHJlYWRzKCkgKGJlbG93KS4KKyAgICogV2hlbiBfX2ttcF9kZWJ1Z2dpbmcgaXMgVFJVRSwgZWFjaCB0ZWFtIGFuZCBlYWNoIHRhc2sgZ2V0cyBhIHVuaXF1ZSBpbnRlZ2VyIGlkZW50aWZpZXIKKyAgIHRoYXQgY2FuIGJlIHVzZWQgYnkgZGVidWdnZXIgdG8gY29udmVuaWVudGx5IGlkZW50aWZ5IHRlYW1zIGFuZCB0YXNrcy4KKyAgICogVGhlIGRlYnVnZ2VyIGhhcyBhY2Nlc3MgdG8gX19rbXBfb21wX2RlYnVnX3N0cnVjdF9pbmZvIHdoaWNoIGNvbnRhaW5zIGluZm9ybWF0aW9uCisgICBhYm91dCB0aGUgT3Blbk1QIGxpYnJhcnkncyBpbXBvcnRhbnQgaW50ZXJuYWwgc3RydWN0dXJlcy4gIFRoaXMgYWNjZXNzIHdpbGwgYWxsb3cgdGhlIGRlYnVnZ2VyCisgICB0byByZWFkIGRldGFpbGVkIGluZm9ybWF0aW9uIGZyb20gdGhlIHR5cGljYWwgT3Blbk1QIGNvbnN0cnVjdHMgKHRlYW1zLCB0aHJlYWRzLCB0YXNraW5nLCBldGMuICkKKyAgIGR1cmluZyBhIGRlYnVnZ2luZyBzZXNzaW9uIGFuZCBvZmZlciBkZXRhaWxlZCBhbmQgdXNlZnVsIGluZm9ybWF0aW9uIHdoaWNoIHRoZSB1c2VyIGNhbiBwcm9iZQorICAgYWJvdXQgdGhlIE9wZW5NUCBwb3J0aW9uIG9mIHRoZWlyIGNvZGUuCisgICAqLworZXh0ZXJuIGludCBfX2ttcF9kZWJ1Z2dpbmc7ICAgICAgICAgICAgIC8qIEJvb2xlYW4gd2hldGhlciBjdXJyZW50bHkgZGVidWdnaW5nIE9wZW5NUCBSVEwgKi8KKy8vIFJldHVybiBudW1iZXIgb2YgdGhyZWFkcyBzcGVjaWZpZWQgYnkgdGhlIGRlYnVnZ2VyIGZvciBnaXZlbiBwYXJhbGxlbCByZWdpb24uCisvKiBUaGUgaWRlbnQgZmllbGQsIHdoaWNoIHJlcHJlc2VudHMgYSBzb3VyY2UgZmlsZSBsb2NhdGlvbiwgaXMgdXNlZCB0byBjaGVjayBpZiB0aGUKKyAgIGRlYnVnZ2VyIGhhcyBjaGFuZ2VkIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgdGhlIHBhcmFsbGVsIHJlZ2lvbiBhdCBzb3VyY2UgZmlsZQorICAgbG9jYXRpb24gaWRlbnQuICBUaGlzIHdheSwgc3BlY2lmaWMgcGFyYWxsZWwgcmVnaW9ucycgbnVtYmVyIG9mIHRocmVhZHMgY2FuIGJlIGNoYW5nZWQKKyAgIGF0IHRoZSBkZWJ1Z2dlcidzIHJlcXVlc3QuCisgKi8KK2ludCBfX2ttcF9vbXBfbnVtX3RocmVhZHMoIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisKKyNlbmRpZiAvLyBLTVBfREVCVUdHRVJfSAorCisjZW5kaWYgLy8gVVNFX0RFQlVHR0VSCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZGlzcGF0Y2guY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkZjIyZWQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Rpc3BhdGNoLmNwcApAQCAtMCwwICsxLDI3NjggQEAKKy8qCisgKiBrbXBfZGlzcGF0Y2guY3BwOiBkeW5hbWljIHNjaGVkdWxpbmcgLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24gYW5kIGRpc3BhdGNoLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvKgorICogRHluYW1pYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uIGFuZCBkaXNwYXRjaC4KKyAqCisgKiBOT1RFOiBfX2ttcF9udGggaXMgYSBjb25zdGFudCBpbnNpZGUgb2YgYW55IGRpc3BhdGNoIGxvb3AsIGhvd2V2ZXIKKyAqICAgICAgIGl0IG1heSBjaGFuZ2UgdmFsdWVzIGJldHdlZW4gcGFyYWxsZWwgcmVnaW9ucy4gIF9fa21wX21heF9udGgKKyAqICAgICAgIGlzIHRoZSBsYXJnZXN0IHZhbHVlIF9fa21wX250aCBtYXkgdGFrZSwgMSBpcyB0aGUgc21hbGxlc3QuCisgKgorICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIE5lZWQgdG8gcmFpc2UgV2luIHZlcnNpb24gZnJvbSBYUCB0byBWaXN0YSBoZXJlIGZvciBzdXBwb3J0IG9mIEludGVybG9ja2VkRXhjaGFuZ2U2NAorI2lmIGRlZmluZWQoX1dJTjMyX1dJTk5UKSAmJiBkZWZpbmVkKF9NX0lYODYpCisjdW5kZWYgX1dJTjMyX1dJTk5UCisjZGVmaW5lIF9XSU4zMl9XSU5OVCAweDA1MDIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICNpbmNsdWRlIDxmbG9hdC5oPgorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8vIHRlbXBsYXRlIGZvciB0eXBlIGxpbWl0cwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RydWN0IGlfbWF4bWluIHsKKyAgICBzdGF0aWMgY29uc3QgVCBteDsKKyAgICBzdGF0aWMgY29uc3QgVCBtbjsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgaW50IG14ID0gMHg3ZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgaW50IG1uID0gMHg4MDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGludCA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG14ID0gMHhmZmZmZmZmZjsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgaW50IG1uID0gMHgwMDAwMDAwMDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgbG9uZyBsb25nIG14ID0gMHg3ZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBtbiA9IDB4ODAwMDAwMDAwMDAwMDAwMExMOworfTsKK3RlbXBsYXRlPD4KK3N0cnVjdCBpX21heG1pbjwgdW5zaWduZWQgbG9uZyBsb25nID4geworICAgIHN0YXRpYyBjb25zdCB1bnNpZ25lZCBsb25nIGxvbmcgbXggPSAweGZmZmZmZmZmZmZmZmZmZmZMTDsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG1uID0gMHgwMDAwMDAwMDAwMDAwMDAwTEw7Cit9OworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQKKworICAgIC8vIHJlcGxhY2VzIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fV90IHR5cGVzCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgICAgIFVUIGNvdW50OyAgICAgICAgICAgICAgICAvLyB1bnNpZ25lZAorICAgICAgICBUICB1YjsKKyAgICAgICAgLyogQWRkaW5nIEtNUF9BTElHTl9DQUNIRSBoZXJlIGRvZXNuJ3QgaGVscCAvIGNhbiBodXJ0IHBlcmZvcm1hbmNlICovCisgICAgICAgIFQgIGxiOworICAgICAgICBTVCBzdDsgICAgICAgICAgICAgICAgICAgLy8gc2lnbmVkCisgICAgICAgIFVUIHRjOyAgICAgICAgICAgICAgICAgICAvLyB1bnNpZ25lZAorICAgICAgICBUICBzdGF0aWNfc3RlYWxfY291bnRlcjsgLy8gZm9yIHN0YXRpY19zdGVhbCBvbmx5OyBtYXliZSBiZXR0ZXIgdG8gcHV0IGFmdGVyIHViCisKKyAgICAgICAgLyogcGFybVsxLTRdIGFyZSB1c2VkIGluIGRpZmZlcmVudCB3YXlzIGJ5IGRpZmZlcmVudCBzY2hlZHVsaW5nIGFsZ29yaXRobXMgKi8KKworICAgICAgICAvLyBLTVBfQUxJR04oIDMyICkgZW5zdXJlcyAoIGlmIHRoZSBLTVBfQUxJR04gbWFjcm8gaXMgdHVybmVkIG9uICkKKyAgICAgICAgLy8gICAgYSkgcGFybTMgaXMgcHJvcGVybHkgYWxpZ25lZCBhbmQKKyAgICAgICAgLy8gICAgYikgYWxsIHBhcm0xLTQgYXJlIGluIHRoZSBzYW1lIGNhY2hlIGxpbmUuCisgICAgICAgIC8vIEJlY2F1c2Ugb2YgcGFybTEtNCBhcmUgdXNlZCB0b2dldGhlciwgcGVyZm9ybWFuY2Ugc2VlbXMgdG8gYmUgYmV0dGVyCisgICAgICAgIC8vIGlmIHRoZXkgYXJlIGluIHRoZSBzYW1lIGxpbmUgKG5vdCBtZWFzdXJlZCB0aG91Z2gpLgorCisgICAgICAgIHN0cnVjdCBLTVBfQUxJR04oIDMyICkgeyAvLyBjb21waWxlciBkb2VzIG5vdCBhY2NlcHQgc2l6ZW9mKFQpKjQKKyAgICAgICAgICAgIFQgIHBhcm0xOworICAgICAgICAgICAgVCAgcGFybTI7CisgICAgICAgICAgICBUICBwYXJtMzsKKyAgICAgICAgICAgIFQgIHBhcm00OworICAgICAgICB9OworCisgICAgICAgIFVUIG9yZGVyZWRfbG93ZXI7IC8vIHVuc2lnbmVkCisgICAgICAgIFVUIG9yZGVyZWRfdXBwZXI7IC8vIHVuc2lnbmVkCisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBUICBsYXN0X3VwcGVyOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICB9OworCisjZWxzZSAvKiBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKi8KKworICAgIC8vIHJlcGxhY2VzIGRpc3BhdGNoX3ByaXZhdGVfaW5mb3szMiw2NH0gc3RydWN0dXJlcyBhbmQgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvezMyLDY0fV90IHR5cGVzCisgICAgdGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorICAgIHN0cnVjdCBkaXNwYXRjaF9wcml2YXRlX2luZm9YWF90ZW1wbGF0ZSB7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgICAgIFQgIGxiOworICAgICAgICBUICB1YjsKKyAgICAgICAgU1Qgc3Q7ICAgICAgICAgICAgLy8gc2lnbmVkCisgICAgICAgIFVUIHRjOyAgICAgICAgICAgIC8vIHVuc2lnbmVkCisKKyAgICAgICAgVCAgcGFybTE7CisgICAgICAgIFQgIHBhcm0yOworICAgICAgICBUICBwYXJtMzsKKyAgICAgICAgVCAgcGFybTQ7CisKKyAgICAgICAgVVQgY291bnQ7ICAgICAgICAgLy8gdW5zaWduZWQKKworICAgICAgICBVVCBvcmRlcmVkX2xvd2VyOyAvLyB1bnNpZ25lZAorICAgICAgICBVVCBvcmRlcmVkX3VwcGVyOyAvLyB1bnNpZ25lZAorICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKwlUICBsYXN0X3VwcGVyOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICB9OworCisjZW5kaWYgLyogS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICovCisKKy8vIHJlcGxhY2VzIGRpc3BhdGNoX3ByaXZhdGVfaW5mbyBzdHJ1Y3R1cmUgYW5kIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190IHR5cGUKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0cnVjdCBLTVBfQUxJR05fQ0FDSEUgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlIHsKKyAgICAvLyBkdXBsaWNhdGUgYWxpZ25tZW50IGhlcmUsIG90aGVyd2lzZSBzaXplIG9mIHN0cnVjdHVyZSBpcyBub3QgY29ycmVjdCBpbiBvdXIgY29tcGlsZXIKKyAgICB1bmlvbiBLTVBfQUxJR05fQ0FDSEUgcHJpdmF0ZV9pbmZvX3RtcGwgeworICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9YWF90ZW1wbGF0ZTwgVCA+IHA7CisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mbzY0X3QgICAgICAgICAgICAgcDY0OworICAgIH0gdTsKKyAgICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGU7ICAvKiBzY2hlZHVsaW5nIGFsZ29yaXRobSAqLworICAgIGttcF91aW50MzIgICAgICBvcmRlcmVkOyAgIC8qIG9yZGVyZWQgY2xhdXNlIHNwZWNpZmllZCAqLworICAgIGttcF91aW50MzIgICAgICBvcmRlcmVkX2J1bXBlZDsKKyAgICBrbXBfaW50MzIgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0zXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBhZnRlciBtYWtpbmcgb3JkZXIKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm8gKiBuZXh0OyAvKiBzdGFjayBvZiBidWZmZXJzIGZvciBuZXN0IG9mIHNlcmlhbCByZWdpb25zICovCisgICAga21wX3VpbnQzMiAgICAgIG5vbWVyZ2U7ICAgLyogZG9uJ3QgbWVyZ2UgaXRlcnMgaWYgc2VyaWFsaXplZCAqLworICAgIGttcF91aW50MzIgICAgICB0eXBlX3NpemU7CisgICAgZW51bSBjb25zX3R5cGUgIHB1c2hlZF93czsKK307CisKKworLy8gcmVwbGFjZXMgZGlzcGF0Y2hfc2hhcmVkX2luZm97MzIsNjR9IHN0cnVjdHVyZXMgYW5kIGRpc3BhdGNoX3NoYXJlZF9pbmZvezMyLDY0fV90IHR5cGVzCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RydWN0IGRpc3BhdGNoX3NoYXJlZF9pbmZvWFhfdGVtcGxhdGUgeworICAgIC8qIGNodW5rIGluZGV4IHVuZGVyIGR5bmFtaWMsIG51bWJlciBvZiBpZGxlIHRocmVhZHMgdW5kZXIgc3RhdGljLXN0ZWFsOworICAgICAgIGl0ZXJhdGlvbiBpbmRleCBvdGhlcndpc2UgKi8KKyAgICB2b2xhdGlsZSBVVCAgICAgaXRlcmF0aW9uOworICAgIHZvbGF0aWxlIFVUICAgICBudW1fZG9uZTsKKyAgICB2b2xhdGlsZSBVVCAgICAgb3JkZXJlZF9pdGVyYXRpb247CisgICAgVVQgICBvcmRlcmVkX2R1bW15W0tNUF9NQVhfT1JERVJFRC0zXTsgLy8gdG8gcmV0YWluIHRoZSBzdHJ1Y3R1cmUgc2l6ZSBtYWtpbmcgb3JkZXJlZF9pdGVyYXRpb24gc2NhbGFyCit9OworCisvLyByZXBsYWNlcyBkaXNwYXRjaF9zaGFyZWRfaW5mbyBzdHJ1Y3R1cmUgYW5kIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QgdHlwZQordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0cnVjdCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZSB7CisgICAgLy8gd2UgbmVlZCB1bmlvbiBoZXJlIHRvIGtlZXAgdGhlIHN0cnVjdHVyZSBzaXplCisgICAgdW5pb24gc2hhcmVkX2luZm9fdG1wbCB7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvWFhfdGVtcGxhdGU8IFVUID4gIHM7CisgICAgICAgIGRpc3BhdGNoX3NoYXJlZF9pbmZvNjRfdCAgICAgICAgICAgICAgIHM2NDsKKyAgICB9IHU7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAgICAgYnVmZmVyX2luZGV4OworI2lmIE9NUF80NV9FTkFCTEVECisgICAgdm9sYXRpbGUga21wX2ludDMyICAgICAgZG9hY3Jvc3NfYnVmX2lkeDsgIC8vIHRlYW13aXNlIGluZGV4CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAqZG9hY3Jvc3NfZmxhZ3M7ICAgIC8vIGFycmF5IG9mIGl0ZXJhdGlvbiBmbGFncyAoMC8xKQorICAgIGttcF9pbnQzMiAgICAgICAgICAgICAgIGRvYWNyb3NzX251bV9kb25lOyAvLyBjb3VudCBmaW5pc2hlZCB0aHJlYWRzCisjZW5kaWYKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgLy8gV2hlbiBsaW5raW5nIHdpdGggbGliaHdsb2MsIHRoZSBPUkRFUkVEIEVQQ0MgdGVzdCBzbG93c2Rvd24gb24gYmlnCisgICAgLy8gbWFjaGluZXMgKD4gNDggY29yZXMpLiBQZXJmb3JtYW5jZSBhbmFseXNpcyBzaG93ZWQgdGhhdCBhIGNhY2hlIHRocmFzaAorICAgIC8vIHdhcyBvY2N1cnJpbmcgYW5kIHRoaXMgcGFkZGluZyBoZWxwcyBhbGxldmlhdGUgdGhlIHByb2JsZW0uCisgICAgY2hhciBwYWRkaW5nWzY0XTsKKyNlbmRpZgorfTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI3VuZGVmIFVTRV9URVNUX0xPQ0tTCisKKy8vIHRlc3RfdGhlbl9hZGQgdGVtcGxhdGUgKGdlbmVyYWwgdGVtcGxhdGUgc2hvdWxkIE5PVCBiZSB1c2VkKQordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9fZm9yY2VpbmxpbmUgVAordGVzdF90aGVuX2FkZCggdm9sYXRpbGUgVCAqcCwgVCBkICk7CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDMyCit0ZXN0X3RoZW5fYWRkPCBrbXBfaW50MzIgPiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIHI7CisgICAgciA9IEtNUF9URVNUX1RIRU5fQUREMzIoIHAsIGQgKTsKKyAgICByZXR1cm4gcjsKK30KKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50NjQKK3Rlc3RfdGhlbl9hZGQ8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9BREQ2NCggcCwgZCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jX2FjcSB0ZW1wbGF0ZSAoZ2VuZXJhbCB0ZW1wbGF0ZSBzaG91bGQgTk9UIGJlIHVzZWQpCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBUCit0ZXN0X3RoZW5faW5jX2FjcSggdm9sYXRpbGUgVCAqcCApOworCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgordGVzdF90aGVuX2luY19hY3E8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAgKQoreworICAgIGttcF9pbnQzMiByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMiggcCApOworICAgIHJldHVybiByOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQ2NAordGVzdF90aGVuX2luY19hY3E8IGttcF9pbnQ2NCA+KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAgKQoreworICAgIGttcF9pbnQ2NCByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQ19BQ1E2NCggcCApOworICAgIHJldHVybiByOworfQorCisvLyB0ZXN0X3RoZW5faW5jIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIFQKK3Rlc3RfdGhlbl9pbmMoIHZvbGF0aWxlIFQgKnAgKTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK3Rlc3RfdGhlbl9pbmM8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAgKQoreworICAgIGttcF9pbnQzMiByOworICAgIHIgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCBwICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPD4KK19fZm9yY2VpbmxpbmUga21wX2ludDY0Cit0ZXN0X3RoZW5faW5jPCBrbXBfaW50NjQgPiggdm9sYXRpbGUga21wX2ludDY0ICpwICkKK3sKKyAgICBrbXBfaW50NjQgcjsKKyAgICByID0gS01QX1RFU1RfVEhFTl9JTkM2NCggcCApOworICAgIHJldHVybiByOworfQorCisvLyBjb21wYXJlX2FuZF9zd2FwIHRlbXBsYXRlIChnZW5lcmFsIHRlbXBsYXRlIHNob3VsZCBOT1QgYmUgdXNlZCkKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyBfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcCggdm9sYXRpbGUgVCAqcCwgVCBjLCBUIHMgKTsKKwordGVtcGxhdGU8PgorX19mb3JjZWlubGluZSBrbXBfaW50MzIKK2NvbXBhcmVfYW5kX3N3YXA8IGttcF9pbnQzMiA+KCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjLCBrbXBfaW50MzIgcyApCit7CisgICAgcmV0dXJuIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggcCwgYywgcyApOworfQorCit0ZW1wbGF0ZTw+CitfX2ZvcmNlaW5saW5lIGttcF9pbnQzMgorY29tcGFyZV9hbmRfc3dhcDwga21wX2ludDY0ID4oIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGMsIGttcF9pbnQ2NCBzICkKK3sKKyAgICByZXR1cm4gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCBwLCBjLCBzICk7Cit9CisKKy8qCisgICAgU3BpbiB3YWl0IGxvb3AgdGhhdCBmaXJzdCBkb2VzIHBhdXNlLCB0aGVuIHlpZWxkLgorICAgIFdhaXRzIHVudGlsIGZ1bmN0aW9uIHJldHVybnMgbm9uLXplcm8gd2hlbiBjYWxsZWQgd2l0aCAqc3Bpbm5lciBhbmQgY2hlY2suCisgICAgRG9lcyBOT1QgcHV0IHRocmVhZHMgdG8gc2xlZXAuCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIEFyZ3VtZW50czoKKyAgICAgICAgb2JqIC0tIGlzIGhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0IHRvIHJlcG9ydCB0byBpdHRub3RpZnkuIEl0IGlzIHVzZWQgdG8gcmVwb3J0CisgICAgICAgICAgICBsb2NrcyBjb25zaXN0ZW50bHkuIEZvciBleGFtcGxlLCBpZiBsb2NrIGlzIGFjcXVpcmVkIGltbWVkaWF0ZWx5LCBpdHMgYWRkcmVzcyBpcworICAgICAgICAgICAgcmVwb3J0ZWQgdG8gaXR0bm90aWZ5IHZpYSBLTVBfRlNZTkNfQUNRVUlSRUQoKS4gSG93ZXZlciwgaXQgbG9jayBjYW5ub3QgYmUgYWNxdWlyZWQKKyAgICAgICAgICAgIGltbWVkaWF0ZWx5IGFuZCBsb2NrIHJvdXRpbmUgY2FsbHMgdG8gS01QX1dBSVRfWUlFTEQoKSwgdGhlIGxhdGVyIHNob3VsZCByZXBvcnQgdGhlIHNhbWUKKyAgICAgICAgICAgIGFkZHJlc3MsIG5vdCBhbiBhZGRyZXNzIG9mIGxvdy1sZXZlbCBzcGlubmVyLgorI2VuZGlmIC8vIFVTRV9JVFRfQlVJTEQKKyovCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorLy8gVG9EbzogbWFrZSBpbmxpbmUgZnVuY3Rpb24gKG1vdmUgdG8gaGVhZGVyIGZpbGUgZm9yIGljbCkKK3N0YXRpYyBVVCAgLy8gdW5zaWduZWQgNC0gb3IgOC1ieXRlIHR5cGUKK19fa21wX3dhaXRfeWllbGQoIHZvbGF0aWxlIFVUICogc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgIFVUICAgICAgICAgICAgY2hlY2tlciwKKyAgICAgICAgICAgICAgICAgIGttcF91aW50MzIgKCogcHJlZCkoIFVULCBVVCApCisgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICAgICAgICAqIG9iaikgICAgLy8gSGlnaGVyLWxldmVsIHN5bmNocm9uaXphdGlvbiBvYmplY3QsIG9yIE5VTEwuCisgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBVVCAgICAgICAgICogc3BpbiAgICAgICAgICA9IHNwaW5uZXI7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyICAgICAgICAgIGttcF91aW50MzIgICBzcGluczsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICgqZikgKCBVVCwgVVQgKSA9IHByZWQ7CisgICAgcmVnaXN0ZXIgICAgICAgICAgVVQgICAgICAgICAgIHI7CisKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosICh2b2lkKikgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSghZihyID0gKnNwaW4sIGNoZWNrKSkKKyAgICB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8vIGlmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBLTVBfTElCUkFSWT10aHJvdWdocHV0LCB0aGVuIHlpZWxkCisgICAgICAgIC8vIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZQorICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX25lcSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2x0KCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8IGNoZWNrZXI7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMga21wX3VpbnQzMiBfX2ttcF9nZSggVVQgdmFsdWUsIFVUIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPj0gY2hlY2tlcjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyBrbXBfdWludDMyIF9fa21wX2xlKCBVVCB2YWx1ZSwgVVQgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9kZW9fZXJyb3IoIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAga21wX2luZm9fdCAqdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkX3JlZiApOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZQorICAgICAgICAgICYmICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCAtPiBwdXNoZWRfd3MgIT0gY3Rfbm9uZSApICkgeworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoICpndGlkX3JlZiwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwgKTsKKyNlbmRpZgorICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2RlbyggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsIE5VTEwsIDAgKTsKKyNlbHNlCisgICAgICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLCBOVUxMICk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgVVQgIGxvd2VyOworCisgICAgICAgIGlmICggISBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIH0KKyAgICAgICAgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisKKyAgICAgICAgI2lmICEgZGVmaW5lZCggS01QX0dPTVBfQ09NUEFUICkKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICkgeworICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zTXVsdGlwbGVOZXN0aW5nLAorICAgICAgICAgICAgICAgICAgICAgICAgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICNlbmRpZiAvKiAhZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJSVkIGJlZm9yZSB3YWl0OiBvcmRlcmVkX2l0ZXI6JSUlcyBsb3dlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgfQorICAgICAgICAjZW5kaWYKKworICAgICAgICBfX2ttcF93YWl0X3lpZWxkPCBVVCA+KCAmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIF9fa21wX2dlPCBVVCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgS01QX01CKCk7ICAvKiBpcyB0aGlzIG5lY2Vzc2FyeT8gKi8KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2RlbzogVCMlJWQgYWZ0ZXIgd2FpdDogb3JkZXJlZF9pdGVyOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgfQorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9kZW86IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGlzcGF0Y2hfZHhvX2Vycm9yKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGttcF9pbmZvX3QgKnRoOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoID0gX19rbXBfdGhyZWFkc1sqZ3RpZF9yZWZdOworICAgICAgICBpZiAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggKmd0aWRfcmVmLCBjdF9vcmRlcmVkX2luX3BkbywgbG9jX3JlZiApOworICAgICAgICB9CisgICAgfQorfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2R4byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBVVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4gKiBwcjsKKworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworLy8gICAgaW50ICBjaWQgPSAqY2lkX3JlZjsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAtPiB0aC50aF9kaXNwYXRjaCApOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2R4bzogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBwciA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIGlmICggcHIgLT4gcHVzaGVkX3dzICE9IGN0X25vbmUgKSB7CisgICAgICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wZG8sIGxvY19yZWYgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiAgKiBzaCA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKworICAgICAgICBpZiAoICEgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICAgICAoIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworICAgICAgICAjaWYgISBkZWZpbmVkKCBLTVBfR09NUF9DT01QQVQgKQorICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgICAgICAgICAgICAgICAgICAvKiBIb3cgdG8gdGVzdCBpdD8gLSBPTSAqLworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc011bHRpcGxlTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0X29yZGVyZWRfaW5fcGRvLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYgLyogIWRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIHByLT5vcmRlcmVkX2J1bXBlZCArPSAxOworCisgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIGJ1bXBpbmcgb3JkZXJlZCBvcmRlcmVkX2J1bXBlZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHByLT5vcmRlcmVkX2J1bXBlZCApICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogVE9ETyB1c2UgZ2VuZXJhbCByZWxlYXNlIHByb2NlZHVyZT8gKi8KKyAgICAgICAgdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiApOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZHhvOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworLyogQ29tcHV0ZXMgYW5kIHJldHVybnMgeCB0byB0aGUgcG93ZXIgb2YgeSwgd2hlcmUgeSBtdXN0IGEgbm9uLW5lZ2F0aXZlIGludGVnZXIgKi8KK3RlbXBsYXRlPCB0eXBlbmFtZSBVVCA+CitzdGF0aWMgX19mb3JjZWlubGluZSBsb25nIGRvdWJsZQorX19rbXBfcG93KGxvbmcgZG91YmxlIHgsIFVUIHkpIHsKKyAgICBsb25nIGRvdWJsZSBzPTEuMEw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKHggPiAwLjAgJiYgeCA8IDEuMCk7CisgICAgLy9LTVBfREVCVUdfQVNTRVJUKHkgPj0gMCk7IC8vIHkgaXMgdW5zaWduZWQKKyAgICB3aGlsZSh5KSB7CisgICAgICAgIGlmICggeSAmIDEgKQorICAgICAgICAgICAgcyAqPSB4OworICAgICAgICB4ICo9IHg7CisgICAgICAgIHkgPj49IDE7CisgICAgfQorICAgIHJldHVybiBzOworfQorCisvKiBDb21wdXRlcyBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mIHVuYXNzaWduZWQgaXRlcmF0aW9ucyBhZnRlciBpZHggY2h1bmtzIGhhdmUgYmVlbiBhc3NpZ25lZAorICAgKHRoZSB0b3RhbCBudW1iZXIgb2YgdW5hc3NpZ25lZCBpdGVyYXRpb25zIGluIGNodW5rcyB3aXRoIGluZGV4IGdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBpZHgpLgorICAgX19mb3JjZWlubGluZSBzZWVtcyB0byBiZSBicm9rZW4gc28gdGhhdCBpZiB3ZSBfX2ZvcmNlaW5saW5lIHRoaXMgZnVuY3Rpb24sIHRoZSBiZWhhdmlvciBpcyB3cm9uZworICAgKG9uZSBvZiB0aGUgdW5pdCB0ZXN0cywgc2NoX2d1aWRlZF9hbmFseXRpY2FsX2Jhc2ljLmNwcCwgZmFpbHMpCisqLwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIF9faW5saW5lIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QKK19fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcoCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YywKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190IGJhc2UsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCBpZHgKKykgeworICAgIC8qIE5vdGU6IE9uIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGF0CisgICAgICAgbGVhc3QgZm9yIElDTCA4LjEsIGxvbmcgZG91YmxlIGFyaXRobWV0aWMgbWF5IG5vdCByZWFsbHkgaGF2ZQorICAgICAgIGxvbmcgZG91YmxlIHByZWNpc2lvbiwgZXZlbiB3aXRoIC9RbG9uZ19kb3VibGUuICBDdXJyZW50bHksIHdlCisgICAgICAgd29ya2Fyb3VuZCB0aGF0IGluIHRoZSBjYWxsZXIgY29kZSwgYnkgbWFuaXB1bGF0aW5nIHRoZSBGUENXIGZvcgorICAgICAgIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIFRoZSBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QKKyAgICAgICBleHBlY3RlZCB0byBiZSBhIGNvcnJlY3RuZXNzIGlzc3VlLCB0aG91Z2guCisgICAgKi8KKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworCisgICAgbG9uZyBkb3VibGUgeCA9IHRjICogX19rbXBfcG93PCBVVCA+KGJhc2UsIGlkeCk7CisgICAgVVQgciA9IChVVCkgeDsKKyAgICBpZiAoIHggPT0gciApCisgICAgICAgIHJldHVybiByOworICAgIHJldHVybiByICsgMTsKK30KKworLy8gUGFyYW1ldGVycyBvZiB0aGUgZ3VpZGVkLWl0ZXJhdGl2ZSBhbGdvcml0aG06CisvLyAgIHAyID0gbiAqIG5wcm9jICogKCBjaHVuayArIDEgKSAgLy8gcG9pbnQgb2Ygc3dpdGNoaW5nIHRvIGR5bmFtaWMKKy8vICAgcDMgPSAxIC8gKCBuICogbnByb2MgKSAgICAgICAgICAvLyByZW1haW5pbmcgaXRlcmF0aW9ucyBtdWx0aXBsaWVyCisvLyBieSBkZWZhdWx0IG4gPSAyLiBGb3IgZXhhbXBsZSB3aXRoIG4gPSAzIHRoZSBjaHVua3MgZGlzdHJpYnV0aW9uIHdpbGwgYmUgbW9yZSBmbGF0LgorLy8gV2l0aCBuID0gMSBmaXJzdCBjaHVuayBpcyB0aGUgc2FtZSBhcyBmb3Igc3RhdGljIHNjaGVkdWxlLCBlLmcuIHRyaXAgLyBucHJvYy4KK3N0YXRpYyBpbnQgZ3VpZGVkX2ludF9wYXJhbSA9IDI7CitzdGF0aWMgZG91YmxlIGd1aWRlZF9mbHRfcGFyYW0gPSAwLjU7Ly8gPSAxLjAgLyBndWlkZWRfaW50X3BhcmFtOworCisvLyBVVCAtIHVuc2lnbmVkIGZsYXZvciBvZiBULCBTVCAtIHNpZ25lZCBmbGF2b3Igb2YgVCwKKy8vIERCTCAtIGRvdWJsZSBpZiBzaXplb2YoVCk9PTQsIG9yIGxvbmcgZG91YmxlIGlmIHNpemVvZihUKT09OAordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICogbG9jLAorICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsCisgICAgZW51bSBzY2hlZF90eXBlICAgICAgICAgICAgICAgICAgc2NoZWR1bGUsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdWIsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3Qgc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgY2h1bmssCisgICAgaW50ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHVzaF93cworKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6ZmxvYXRpbmdfdCAgREJMOworICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKworICAgIGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYWN0aXZlOworICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGM7CisgICAga21wX2luZm9fdCAqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aDsKKyAgICBrbXBfdGVhbV90ICogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW07CisgICAga21wX3VpbnQzMiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9idWZmZXJfaW5kZXg7CisgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICAgICAgICAgKiBwcjsKKyAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoOworCisgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiApID09IHNpemVvZiggZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvICkgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+ICkgPT0gc2l6ZW9mKCBkaXNwYXRjaF9zaGFyZWRfaW5mbyApICk7CisKKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfcGFyYWxsZWwgKSApCisgICAgICAgIF9fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoKTsKKworI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgU1NDX01BUktfRElTUEFUQ0hfSU5JVCgpOworI2VuZGlmCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCBjYWxsZWQ6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzIGxiOiUlJXMgdWI6JSUlcyBzdDolJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuaywgbGIsIHViLCBzdCApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKyAgICAvKiBzZXR1cCBkYXRhICovCisgICAgdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gICA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgYWN0aXZlID0gISB0ZWFtIC0+IHQudF9zZXJpYWxpemVkOworICAgIHRoLT50aC50aF9pZGVudCA9IGxvYzsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBrbXBfdWludDY0IGN1cl9jaHVuayA9IGNodW5rOworICAgIGludCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgPSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMgJiYKKyAgICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxOworI2VuZGlmCisgICAgaWYgKCAhIGFjdGl2ZSApIHsKKyAgICAgICAgcHIgPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgKCB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9kaXNwX2J1ZmZlciApOyAvKiB0b3Agb2YgdGhlIHN0YWNrICovCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIG15X2J1ZmZlcl9pbmRleCA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcF9pbmRleCArKzsKKworICAgICAgICAvKiBXaGF0IGhhcHBlbnMgd2hlbiBudW1iZXIgb2YgdGhyZWFkcyBjaGFuZ2VzLCBuZWVkIHRvIHJlc2l6ZSBidWZmZXI/ICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gICogPgorICAgICAgICAgICAgKCAmdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXJbIG15X2J1ZmZlcl9pbmRleCAlIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzIF0gKTsKKyAgICAgICAgc2ggPSByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqID4KKyAgICAgICAgICAgICggJnRlYW0gLT4gdC50X2Rpc3BfYnVmZmVyWyBteV9idWZmZXJfaW5kZXggJSBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyBdICk7CisgICAgfQorCisgICAgI2lmICAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgaWYgKCBTQ0hFRFVMRV9IQVNfTk9OTU9OT1RPTklDKHNjaGVkdWxlKSApCisgICAgICAgIC8vIEFDOiB3ZSBub3cgaGF2ZSBvbmx5IG9uZSBpbXBsZW1lbnRhdGlvbiBvZiBzdGVhbGluZywgc28gdXNlIGl0CisgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfc3RlYWw7CisgICAgZWxzZQorICAgICNlbmRpZgorICAgICAgICBzY2hlZHVsZSA9IFNDSEVEVUxFX1dJVEhPVVRfTU9ESUZJRVJTKHNjaGVkdWxlKTsKKworICAgIC8qIFBpY2sgdXAgdGhlIG5vbWVyZ2Uvb3JkZXJlZCBiaXRzIGZyb20gdGhlIHNjaGVkdWxpbmcgdHlwZSAqLworICAgIGlmICggKHNjaGVkdWxlID49IGttcF9ubV9sb3dlcikgJiYgKHNjaGVkdWxlIDwga21wX25tX3VwcGVyKSApIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBUUlVFOworICAgICAgICBzY2hlZHVsZSA9IChlbnVtIHNjaGVkX3R5cGUpKCgoaW50KXNjaGVkdWxlKSAtIChrbXBfbm1fbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm5vbWVyZ2UgPSBGQUxTRTsKKyAgICB9CisgICAgcHItPnR5cGVfc2l6ZSA9IF9fX2ttcF9zaXplX3R5cGU7IC8vIHJlbWVtYmVyIHRoZSBzaXplIG9mIHZhcmlhYmxlcworICAgIGlmICgga21wX29yZF9sb3dlciAmIHNjaGVkdWxlICkgeworICAgICAgICBwci0+b3JkZXJlZCA9IFRSVUU7CisgICAgICAgIHNjaGVkdWxlID0gKGVudW0gc2NoZWRfdHlwZSkoKChpbnQpc2NoZWR1bGUpIC0gKGttcF9vcmRfbG93ZXIgLSBrbXBfc2NoX2xvd2VyKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHItPm9yZGVyZWQgPSBGQUxTRTsKKyAgICB9CisKKyAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfc3RhdGljICkgeworICAgICAgICBzY2hlZHVsZSA9IF9fa21wX3N0YXRpYzsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfcnVudGltZSApIHsKKyAgICAgICAgICAgIC8vIFVzZSB0aGUgc2NoZWR1bGluZyBzcGVjaWZpZWQgYnkgT01QX1NDSEVEVUxFIChvciBfX2ttcF9zY2hfZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgc2NoZWR1bGUgPSB0ZWFtIC0+IHQudF9zY2hlZC5yX3NjaGVkX3R5cGU7CisgICAgICAgICAgICAvLyBEZXRhaWwgdGhlIHNjaGVkdWxlIGlmIG5lZWRlZCAoZ2xvYmFsIGNvbnRyb2xzIGFyZSBkaWZmZXJlbnRpYXRlZCBhcHByb3ByaWF0ZWx5KQorICAgICAgICAgICAgaWYgKCBzY2hlZHVsZSA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0gX19rbXBfZ3VpZGVkOworICAgICAgICAgICAgfSBlbHNlIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9zdGF0aWM7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBVc2UgdGhlIGNodW5rIHNpemUgc3BlY2lmaWVkIGJ5IE9NUF9TQ0hFRFVMRSAob3IgZGVmYXVsdCBpZiBub3Qgc3BlY2lmaWVkKQorICAgICAgICAgICAgY2h1bmsgPSB0ZWFtIC0+IHQudF9zY2hlZC5jaHVuazsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBjdXJfY2h1bmsgPSBjaHVuazsKKyNlbmRpZgorICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlJWQgbmV3OiBzY2hlZHVsZTolJWQgY2h1bms6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCBzY2hlZHVsZSwgY2h1bmsgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHNjaGVkdWxlID09IGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgKSB7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9ndWlkZWQ7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNodW5rIDw9IDAgKSB7CisgICAgICAgICAgICAgICAgY2h1bmsgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9hdXRvICkgeworICAgICAgICAgICAgLy8gbWFwcGluZyBhbmQgZGlmZmVyZW50aWF0aW9uOiBpbiB0aGUgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKQorICAgICAgICAgICAgc2NoZWR1bGUgPSBfX2ttcF9hdXRvOworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfaW5pdDoga21wX3NjaF9hdXRvOiBUIyUlZCBuZXc6IHNjaGVkdWxlOiUlZCBjaHVuazolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCBjaHVuayApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgfQorCisgICAgICAgIC8qIGd1aWRlZCBhbmFseXRpY2FsIG5vdCBzYWZlIGZvciB0b28gbWFueSB0aHJlYWRzICovCisgICAgICAgIGlmICggc2NoZWR1bGUgPT0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkICYmIHRoLT50aC50aF90ZWFtX25wcm9jID4gMTw8MjAgKSB7CisgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIERpc3BhdGNoTWFueVRocmVhZHMgKTsKKyAgICAgICAgfQorICAgICAgICBwci0+dS5wLnBhcm0xID0gY2h1bms7CisgICAgfQorICAgIEtNUF9BU1NFUlQyKCAoa21wX3NjaF9sb3dlciA8IHNjaGVkdWxlICYmIHNjaGVkdWxlIDwga21wX3NjaF91cHBlciksCisgICAgICAgICAgICAgICAgInVua25vd24gc2NoZWR1bGluZyB0eXBlIiApOworCisgICAgcHItPnUucC5jb3VudCA9IDA7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYgKCBzdCA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KAorICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLAorICAgICAgICAgICAgICAgICggcHItPm9yZGVyZWQgPyBjdF9wZG9fb3JkZXJlZCA6IGN0X3BkbyApLCBsb2MKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICB9CisgICAgLy8gY29tcHV0ZSB0cmlwIGNvdW50CisgICAgaWYgKCBzdCA9PSAxICkgeyAgIC8vIG1vc3QgY29tbW9uIGNhc2UKKyAgICAgICAgaWYgKCB1YiA+PSBsYiApIHsKKyAgICAgICAgICAgIHRjID0gdWIgLSBsYiArIDE7CisgICAgICAgIH0gZWxzZSB7ICAgLy8gdWIgPCBsYgorICAgICAgICAgICAgdGMgPSAwOyAgICAgICAgICAgIC8vIHplcm8tdHJpcAorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggc3QgPCAwICkgeworICAgICAgICBpZiAoIGxiID49IHViICkgeworICAgICAgICAgICAgLy8gQUM6IGNhc3QgdG8gdW5zaWduZWQgaXMgbmVlZGVkIGZvciBsb29wcyBsaWtlIChpPTJCOyBpPi0yQjsgaS09MUIpLAorICAgICAgICAgICAgLy8gICAgIHdoZXJlIHRoZSBkaXZpc2lvbiBuZWVkcyB0byBiZSB1bnNpZ25lZCByZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQgdHlwZQorICAgICAgICAgICAgdGMgPSAoVVQpKGxiIC0gdWIpIC8gKC1zdCkgKyAxOworICAgICAgICB9IGVsc2UgeyAgIC8vIGxiIDwgdWIKKyAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgfQorICAgIH0gZWxzZSB7ICAgICAgIC8vIHN0ID4gMAorICAgICAgICBpZiAoIHViID49IGxiICkgeworICAgICAgICAgICAgLy8gQUM6IGNhc3QgdG8gdW5zaWduZWQgaXMgbmVlZGVkIGZvciBsb29wcyBsaWtlIChpPS0yQjsgaTwyQjsgaSs9MUIpLAorICAgICAgICAgICAgLy8gICAgIHdoZXJlIHRoZSBkaXZpc2lvbiBuZWVkcyB0byBiZSB1bnNpZ25lZCByZWdhcmRsZXNzIG9mIHRoZSByZXN1bHQgdHlwZQorICAgICAgICAgICAgdGMgPSAoVVQpKHViIC0gbGIpIC8gc3QgKyAxOworICAgICAgICB9IGVsc2UgeyAgIC8vIHViIDwgbGIKKyAgICAgICAgICAgIHRjID0gMDsgICAgICAgICAgICAvLyB6ZXJvLXRyaXAKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIEFueSBoYWxmLWRlY2VudCBvcHRpbWl6ZXIgd2lsbCByZW1vdmUgdGhpcyB0ZXN0IHdoZW4gdGhlIGJsb2NrcyBhcmUgZW1wdHkgc2luY2UgdGhlIG1hY3JvcyBleHBhbmQgdG8gbm90aGluZworICAgIC8vIHdoZW4gc3RhdGlzdGljcyBhcmUgZGlzYWJsZWQuCisgICAgaWYgKHNjaGVkdWxlID09IF9fa21wX3N0YXRpYykKKyAgICB7CisgICAgICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX3N0YXRpYyk7CisgICAgICAgIEtNUF9DT1VOVF9WQUxVRShGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsIHRjKTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9GT1JfZHluYW1pYyk7CisgICAgICAgIEtNUF9DT1VOVF9WQUxVRShGT1JfZHluYW1pY19pdGVyYXRpb25zLCB0Yyk7CisgICAgfQorCisgICAgcHItPnUucC5sYiA9IGxiOworICAgIHByLT51LnAudWIgPSB1YjsKKyAgICBwci0+dS5wLnN0ID0gc3Q7CisgICAgcHItPnUucC50YyA9IHRjOworCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgcHItPnUucC5sYXN0X3VwcGVyID0gdWIgKyBzdDsKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIC8qIE5PVEU6IG9ubHkgdGhlIGFjdGl2ZSBwYXJhbGxlbCByZWdpb24ocykgaGFzIGFjdGl2ZSBvcmRlcmVkIHNlY3Rpb25zICovCisKKyAgICBpZiAoIGFjdGl2ZSApIHsKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCA9PSAwICkgeworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2Rlb19lcnJvcjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG9fZXJyb3I7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworCisgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSAxOworICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gMDsKKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IF9fa21wX2Rpc3BhdGNoX2RlbzwgVVQgPjsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2R4b19mY24gPSBfX2ttcF9kaXNwYXRjaF9keG88IFVUID47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgZW51bSBjb25zX3R5cGUgd3MgPSBwci0+b3JkZXJlZCA/IGN0X3Bkb19vcmRlcmVkIDogY3RfcGRvOworICAgICAgICBpZiAoIHB1c2hfd3MgKSB7CisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ3RpZCwgd3MsIGxvYyApOworICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IHdzOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfY2hlY2tfd29ya3NoYXJlKCBndGlkLCB3cywgbG9jICk7CisgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gY3Rfbm9uZTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHN3aXRjaCAoIHNjaGVkdWxlICkgeworICAgICNpZiAgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgIHsKKyAgICAgICAgICAgIFQgbnByb2MgPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIFQgbnRjLCBpbml0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19zdGVhbCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgbnRjID0gKHRjICUgY2h1bmsgPyAxIDogMCkgKyB0YyAvIGNodW5rOworICAgICAgICAgICAgaWYgKCBucHJvYyA+IDEgJiYgbnRjID49IG5wcm9jICkgeworICAgICAgICAgICAgICAgIFQgaWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICAgICAgICAgIFQgc21hbGxfY2h1bmssIGV4dHJhczsKKworICAgICAgICAgICAgICAgIHNtYWxsX2NodW5rID0gbnRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgZXh0cmFzID0gbnRjICUgbnByb2M7CisKKyAgICAgICAgICAgICAgICBpbml0ID0gaWQgKiBzbWFsbF9jaHVuayArICggaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyApOworICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAudWIgPSBpbml0ICsgc21hbGxfY2h1bmsgKyAoIGlkIDwgZXh0cmFzID8gMSA6IDAgKTsKKworICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBsYjsKKyAgICAgICAgICAgICAgICAvL3ByLT5wZmllbGRzLnBhcm0zID0gMDsgLy8gaXQncyBub3QgdXNlZCBpbiBzdGF0aWNfc3RlYWwKKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm00ID0gKGlkICsgMSkgJSBucHJvYzsgLy8gcmVtZW1iZXIgbmVpZ2hib3VyIHRpZAorICAgICAgICAgICAgICAgIHByLT51LnAuc3QgPSBzdDsKKyAgICAgICAgICAgICAgICBpZiAoIF9fX2ttcF9zaXplX3R5cGUgPiA0ICkgeworICAgICAgICAgICAgICAgICAgICAvLyBBQzogVE9ETzogY2hlY2sgaWYgMTYtYnl0ZSBDQVMgYXZhaWxhYmxlIGFuZCB1c2UgaXQgdG8KKyAgICAgICAgICAgICAgICAgICAgLy8gaW1wcm92ZSBwZXJmb3JtYW5jZSAocHJvYmFibHkgd2FpdCBmb3IgZXhwbGljaXQgcmVxdWVzdAorICAgICAgICAgICAgICAgICAgICAvLyBiZWZvcmUgc3BlbmRpbmcgdGltZSBvbiB0aGlzKS4KKyAgICAgICAgICAgICAgICAgICAgLy8gRm9yIG5vdyB1c2UgZHluYW1pY2FsbHkgYWxsb2NhdGVkIHBlci10aHJlYWQgbG9jaywKKyAgICAgICAgICAgICAgICAgICAgLy8gZnJlZSBtZW1vcnkgaW4gX19rbXBfZGlzcGF0Y2hfbmV4dCB3aGVuIHN0YXR1cz09MC4KKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2sgPT0gTlVMTCk7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jayA9CisgICAgICAgICAgICAgICAgICAgICAgICAoa21wX2xvY2tfdCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9sb2NrX3QpKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF9sb2NrKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jayk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBmYWxsaW5nLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAgICAgICAgICAgICAvKiB0b28gZmV3IGl0ZXJhdGlvbnM6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCAqLworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgLyogRkFMTC1USFJPVUdIIHRvIHN0YXRpYyBiYWxhbmNlZCAqLworICAgICAgICB9IC8vIGNhc2UKKyAgICAjZW5kaWYKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBUIGluaXQsIGxpbWl0OworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSApIHsKKyAgICAgICAgICAgICAgICBUIGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKworICAgICAgICAgICAgICAgIGlmICggdGMgPCBucHJvYyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBpZCA8IHRjICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkOworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpZDsKKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSAoaWQgPT0gdGMgLSAxKTsgIC8qIHBhcm0xIHN0b3JlcyAqcGxhc3RpdGVyICovCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsgIC8qIG1lYW5zIG5vIG1vcmUgY2h1bmtzIHRvIGV4ZWN1dGUgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgVCBzbWFsbF9jaHVuayA9IHRjIC8gbnByb2M7CisgICAgICAgICAgICAgICAgICAgIFQgZXh0cmFzID0gdGMgJSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IGlkICogc21hbGxfY2h1bmsgKyAoaWQgPCBleHRyYXMgPyBpZCA6IGV4dHJhcyk7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIHNtYWxsX2NodW5rIC0gKGlkIDwgZXh0cmFzID8gMCA6IDEpOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKGlkID09IG5wcm9jIC0gMSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRjID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5pdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdGMgLSAxOworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gVFJVRTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAvLyB6ZXJvIHRyaXAgY291bnQKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC5jb3VudCA9IDE7ICAvKiBtZWFucyBubyBtb3JlIGNodW5rcyB0byBleGVjdXRlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIC8vIENhbGN1bGF0ZSBjaHVuayBmb3IgbWV0YWRhdGEgcmVwb3J0CisgICAgICAgICAgICBpZiAoIGl0dF9uZWVkX21ldGFkYXRhX3JlcG9ydGluZyApCisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gbGltaXQgLSBpbml0ICsgMTsKKyNlbmRpZgorICAgICAgICAgICAgaWYgKCBzdCA9PSAxICkgeworICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBsYiArIGluaXQ7CisgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGxiICsgbGltaXQ7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIFQgdWJfdG1wID0gbGIgKyBsaW1pdCAqIHN0OyAgIC8vIGNhbGN1bGF0ZWQgdXBwZXIgYm91bmQsICJ1YiIgaXMgdXNlci1kZWZpbmVkIHVwcGVyIGJvdW5kCisgICAgICAgICAgICAgICAgcHItPnUucC5sYiA9IGxiICsgaW5pdCAqIHN0OworICAgICAgICAgICAgICAgIC8vIGFkanVzdCB1cHBlciBib3VuZCB0byAidWIiIGlmIG5lZWRlZCwgc28gdGhhdCBNUyBsYXN0cHJpdmF0ZSB3aWxsIG1hdGNoIGl0IGV4YWN0bHkKKyAgICAgICAgICAgICAgICBpZiAoIHN0ID4gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPiB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9ICggdWJfdG1wICsgc3QgPCB1YiA/IHViIDogdWJfdG1wICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0gLy8gY2FzZQorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQgOgorICAgICAgICB7CisgICAgICAgICAgICBUIG5wcm9jID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkIGNhc2VcbiIsZ3RpZCkpOworCisgICAgICAgICAgICBpZiAoIG5wcm9jID4gMSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICgyTCAqIGNodW5rICsgMSApICogbnByb2MgPj0gdGMgKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNodW5rIHNpemUgdG9vIGxhcmdlLCBzd2l0Y2ggdG8gZHluYW1pYyAqLworICAgICAgICAgICAgICAgICAgICBzY2hlZHVsZSA9IGttcF9zY2hfZHluYW1pY19jaHVua2VkOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIC8vIHdoZW4gcmVtYWluaW5nIGl0ZXJzIGJlY29tZSBsZXNzIHRoYW4gcGFybTIgLSBzd2l0Y2ggdG8gZHluYW1pYworICAgICAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0yID0gZ3VpZGVkX2ludF9wYXJhbSAqIG5wcm9jICogKCBjaHVuayArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgKihkb3VibGUqKSZwci0+dS5wLnBhcm0zID0gZ3VpZGVkX2ZsdF9wYXJhbSAvIG5wcm9jOyAgIC8vIG1heSBvY2N1cHkgcGFybTMgYW5kIHBhcm00CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHlcbiIsZ3RpZCkpOworICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5OworICAgICAgICAgICAgICAgIC8qIHRlYW0tPnQudF9ucHJvYyA9PSAxOiBmYWxsLXRocm91Z2ggdG8ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICovCisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19ncmVlZHkgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHRjOworICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIFQgbnByb2MgPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZCBjYXNlXG4iLCBndGlkKSk7CisKKyAgICAgICAgICAgIGlmICggbnByb2MgPiAxICkgeworICAgICAgICAgICAgICAgIGlmICggKDJMICogY2h1bmsgKyAxICkgKiBucHJvYyA+PSB0YyApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY2h1bmsgc2l6ZSB0b28gbGFyZ2UsIHN3aXRjaCB0byBkeW5hbWljICovCisgICAgICAgICAgICAgICAgICAgIHNjaGVkdWxlID0ga21wX3NjaF9keW5hbWljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgLyogY29tbW9ubHkgdXNlZCB0ZXJtOiAoMiBucHJvYyAtIDEpLygyIG5wcm9jKSAqLworICAgICAgICAgICAgICAgICAgICBEQkwgeDsKKworICAgICAgICAgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIExpbnV4KiBPUyBhbHJlYWR5IGhhcyA2NC1iaXQgY29tcHV0YXRpb24gYnkgZGVmYXVsdCBmb3IKKwkJICAgICAgIGxvbmcgZG91YmxlLCBhbmQgb24gV2luZG93cyogT1Mgb24gSW50ZWwoUikgNjQsCisJCSAgICAgICAvUWxvbmdfZG91YmxlIGRvZXNuJ3Qgd29yay4gIE9uIFdpbmRvd3MqIE9TCisJCSAgICAgICBvbiBJQS0zMiBhcmNoaXRlY3R1cmUsIHdlIG5lZWQgdG8gc2V0IHByZWNpc2lvbiB0bworCQkgICAgICAgNjQtYml0IGluc3RlYWQgb2YgdGhlIGRlZmF1bHQgNTMtYml0LiBFdmVuIHRob3VnaCBsb25nCisJCSAgICAgICBkb3VibGUgZG9lc24ndCB3b3JrIG9uIFdpbmRvd3MqIE9TIG9uIEludGVsKFIpIDY0LCB0aGUKKwkJICAgICAgIHJlc3VsdGluZyBsYWNrIG9mIHByZWNpc2lvbiBpcyBub3QgZXhwZWN0ZWQgdG8gaW1wYWN0CisJCSAgICAgICB0aGUgY29ycmVjdG5lc3Mgb2YgdGhlIGFsZ29yaXRobSwgYnV0IHRoaXMgaGFzIG5vdCBiZWVuCisJCSAgICAgICBtYXRoZW1hdGljYWxseSBwcm92ZW4uCisgICAgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgICAgIC8vIHNhdmUgb3JpZ2luYWwgRlBDVyBhbmQgc2V0IHByZWNpc2lvbiB0byA2NC1iaXQsIGFzCisgICAgICAgICAgICAgICAgICAgIC8vIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQKKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3cgPSBfY29udHJvbDg3KDAsMCk7CisgICAgICAgICAgICAgICAgICAgIF9jb250cm9sODcoX1BDXzY0LF9NQ1dfUEMpOyAvLyAwLDB4MzAwMDAKKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIC8qIHZhbHVlIHVzZWQgZm9yIGNvbXBhcmlzb24gaW4gc29sdmVyIGZvciBjcm9zcy1vdmVyIHBvaW50ICovCisgICAgICAgICAgICAgICAgICAgIGxvbmcgZG91YmxlIHRhcmdldCA9ICgobG9uZyBkb3VibGUpY2h1bmsgKiAyICsgMSkgKiBucHJvYyAvIHRjOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNyb3Nzb3ZlciBwb2ludC0tY2h1bmsgaW5kZXhlcyBlcXVhbCB0byBvciBncmVhdGVyIHRoYW4KKwkJICAgICAgIHRoaXMgcG9pbnQgc3dpdGNoIHRvIGR5bmFtaWMtc3R5bGUgc2NoZWR1bGluZyAqLworICAgICAgICAgICAgICAgICAgICBVVCAgIGNyb3NzOworCisgICAgICAgICAgICAgICAgICAgIC8qIGNvbW1vbmx5IHVzZWQgdGVybTogKDIgbnByb2MgLSAxKS8oMiBucHJvYykgKi8KKyAgICAgICAgICAgICAgICAgICAgeCA9IChsb25nIGRvdWJsZSkxLjAgLSAobG9uZyBkb3VibGUpMC41IC8gbnByb2M7CisKKyAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICB7IC8vIHRlc3QgbmF0dXJhbCBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0cnVjdCBfdGVzdF9hIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdW5pb24geworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjaGFyIGI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERCTCAgZDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgICAgICAgICAgICAgfSB0OworICAgICAgICAgICAgICAgICAgICAgICAgcHRyZGlmZl90IG5hdHVyYWxfYWxpZ25tZW50ID0gKHB0cmRpZmZfdCkmdC5iIC0gKHB0cmRpZmZfdCkmdCAtIChwdHJkaWZmX3QpMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vX19rbXBfd2FybiggIiAlbGx4ICVsbHggJWxsZCIsIChsb25nIGxvbmcpJnQuZCwgKGxvbmcgbG9uZykmdCwgKGxvbmcgbG9uZyluYXR1cmFsX2FsaWdubWVudCApOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoIChwdHJkaWZmX3QpJnByLT51LnAucGFybTMgKSAmICggbmF0dXJhbF9hbGlnbm1lbnQgKSApID09IDAgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgICAgICAgICAgLyogc2F2ZSB0aGUgdGVybSBpbiB0aHJlYWQgcHJpdmF0ZSBkaXNwYXRjaCBzdHJ1Y3R1cmUgKi8KKyAgICAgICAgICAgICAgICAgICAgKihEQkwqKSZwci0+dS5wLnBhcm0zID0geDsKKworICAgICAgICAgICAgICAgICAgICAvKiBzb2x2ZSBmb3IgdGhlIGNyb3Nzb3ZlciBwb2ludCB0byB0aGUgbmVhcmVzdCBpbnRlZ2VyIGkgZm9yIHdoaWNoIENfaSA8PSBjaHVuayAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBVVCAgICAgICAgICBsZWZ0LCByaWdodCwgbWlkOworICAgICAgICAgICAgICAgICAgICAgICAgbG9uZyBkb3VibGUgcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZXN0aW1hdGUgaW5pdGlhbCB1cHBlciBhbmQgbG93ZXIgYm91bmQgKi8KKworICAgICAgICAgICAgICAgICAgICAgICAgLyogZG9lc24ndCBtYXR0ZXIgd2hhdCB2YWx1ZSByaWdodCBpcyBhcyBsb25nIGFzIGl0IGlzIHBvc2l0aXZlLCBidXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGl0IGFmZmVjdHMgcGVyZm9ybWFuY2Ugb2YgdGhlIHNvbHZlcgorICAgICAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJpZ2h0ID0gMjI5OworICAgICAgICAgICAgICAgICAgICAgICAgcCA9IF9fa21wX3BvdzwgVVQgPih4LHJpZ2h0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcCA+IHRhcmdldCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkb3sKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcCAqPSBwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByaWdodCA8PD0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHA+dGFyZ2V0ICYmIHJpZ2h0IDwgKDE8PDI3KSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVmdCA9IHJpZ2h0ID4+IDE7IC8qIGxvd2VyIGJvdW5kIGlzIHByZXZpb3VzIChmYWlsZWQpIGVzdGltYXRlIG9mIHVwcGVyIGJvdW5kICovCisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAvKiBiaXNlY3Rpb24gcm9vdC1maW5kaW5nIG1ldGhvZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBsZWZ0ICsgMSA8IHJpZ2h0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIG1pZCA9IChsZWZ0ICsgcmlnaHQpIC8gMjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3BvdzwgVVQgPih4LG1pZCkgPiB0YXJnZXQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxlZnQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmlnaHQgPSBtaWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZQorICAgICAgICAgICAgICAgICAgICAgICAgY3Jvc3MgPSByaWdodDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBhc3NlcnQgc2FuaXR5IG9mIGNvbXB1dGVkIGNyb3Nzb3ZlciBwb2ludCAqLworICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGNyb3NzICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcyAtIDEpID4gdGFyZ2V0ICYmIF9fa21wX3BvdzwgVVQgPih4LCBjcm9zcykgPD0gdGFyZ2V0KTsKKworICAgICAgICAgICAgICAgICAgICAvKiBzYXZlIHRoZSBjcm9zc292ZXIgcG9pbnQgaW4gdGhyZWFkIHByaXZhdGUgZGlzcGF0Y2ggc3RydWN0dXJlICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTIgPSBjcm9zczsKKworICAgICAgICAgICAgICAgICAgICAvLyBDNzU4MDMKKyAgICAgICAgICAgICAgICAgICAgI2lmICggKCBLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MgKSAmJiBLTVBfQVJDSF9YODYgKSAmJiAoICEgZGVmaW5lZCggS01QX0k4ICkgKQorICAgICAgICAgICAgICAgICAgICAgICAgI2RlZmluZSBHVUlERURfQU5BTFlUSUNBTF9XT1JLQVJPVU5EICgqKCBEQkwgKiApJnByLT51LnAucGFybTMpCisgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAjZGVmaW5lIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQgKHgpCisgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgb2Zmc2V0ICovCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSB0YyAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmcodGMsIEdVSURFRF9BTkFMWVRJQ0FMX1dPUktBUk9VTkQsIGNyb3NzKSAtIGNyb3NzICogY2h1bms7CisgICAgICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHJlc3RvcmUgRlBDVworICAgICAgICAgICAgICAgICAgICAgICAgX2NvbnRyb2w4NyhvbGRGcGN3LF9NQ1dfUEMpOworICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGZhbGxpbmctdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgc2NoZWR1bGUgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7CisgICAgICAgICAgICAgICAgLyogdGVhbS0+dC50X25wcm9jID09IDE6IGZhbGwtdGhyb3VnaCB0byBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKi8KKyAgICAgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gdGM7CisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgIH0gLy8gY2FzZQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2dyZWVkeToKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCgiX19rbXBfZGlzcGF0Y2hfaW5pdDogVCMlZCBrbXBfc2NoX3N0YXRpY19ncmVlZHkgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICBwci0+dS5wLnBhcm0xID0gKCB0aC0+dGgudGhfdGVhbV9ucHJvYyA+IDEgKSA/CisgICAgICAgICAgICAgICAgKCB0YyArIHRoLT50aC50aF90ZWFtX25wcm9jIC0gMSApIC8gdGgtPnRoLnRoX3RlYW1fbnByb2MgOgorICAgICAgICAgICAgICAgIHRjOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQgOgorICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQgOgorICAgICAgICBpZiAoIHByLT51LnAucGFybTEgPD0gMCApIHsKKyAgICAgICAgICAgIHByLT51LnAucGFybTEgPSBLTVBfREVGQVVMVF9DSFVOSzsKKyAgICAgICAgfQorICAgICAgICBLRF9UUkFDRSgxMDAsKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGttcF9zY2hfc3RhdGljX2NodW5rZWQva21wX3NjaF9keW5hbWljX2NodW5rZWQgY2FzZXNcbiIsIGd0aWQpKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX3RyYXBlem9pZGFsIDoKKyAgICAgICAgeworICAgICAgICAgICAgLyogVFNTOiB0cmFwZXpvaWQgc2VsZi1zY2hlZHVsaW5nLCBtaW5pbXVtIGNodW5rX3NpemUgPSBwYXJtMSAqLworCisgICAgICAgICAgICBUIHBhcm0xLCBwYXJtMiwgcGFybTMsIHBhcm00OworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2luaXQ6IFQjJWQga21wX3NjaF90cmFwZXpvaWRhbCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgcGFybTEgPSBjaHVuazsKKworICAgICAgICAgICAgLyogRiA6IHNpemUgb2YgdGhlIGZpcnN0IGN5Y2xlICovCisgICAgICAgICAgICBwYXJtMiA9ICggdGMgLyAoMiAqIHRoLT50aC50aF90ZWFtX25wcm9jKSApOworCisgICAgICAgICAgICBpZiAoIHBhcm0yIDwgMSApIHsKKyAgICAgICAgICAgICAgICBwYXJtMiA9IDE7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIEwgOiBzaXplIG9mIHRoZSBsYXN0IGN5Y2xlLiAgTWFrZSBzdXJlIHRoZSBsYXN0IGN5Y2xlCisgICAgICAgICAgICAgKiAgICAgaXMgbm90IGxhcmdlciB0aGFuIHRoZSBmaXJzdCBjeWNsZS4KKyAgICAgICAgICAgICAqLworICAgICAgICAgICAgaWYgKCBwYXJtMSA8IDEgKSB7CisgICAgICAgICAgICAgICAgcGFybTEgPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggcGFybTEgPiBwYXJtMiApIHsKKyAgICAgICAgICAgICAgICBwYXJtMSA9IHBhcm0yOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBOIDogbnVtYmVyIG9mIGN5Y2xlcyAqLworICAgICAgICAgICAgcGFybTMgPSAoIHBhcm0yICsgcGFybTEgKTsKKyAgICAgICAgICAgIHBhcm0zID0gKCAyICogdGMgKyBwYXJtMyAtIDEpIC8gcGFybTM7CisKKyAgICAgICAgICAgIGlmICggcGFybTMgPCAyICkgeworICAgICAgICAgICAgICAgIHBhcm0zID0gMjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgLyogc2lnbWEgOiBkZWNyZWFzaW5nIGluY3Igb2YgdGhlIHRyYXBlem9pZCAqLworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0zIC0gMSApOworICAgICAgICAgICAgcGFybTQgPSAoIHBhcm0yIC0gcGFybTEgKSAvIHBhcm00OworCisgICAgICAgICAgICAvLyBwb2ludGxlc3MgY2hlY2ssIGJlY2F1c2UgcGFybTQgPj0gMCBhbHdheXMKKyAgICAgICAgICAgIC8vaWYgKCBwYXJtNCA8IDAgKSB7CisgICAgICAgICAgICAvLyAgICBwYXJtNCA9IDA7CisgICAgICAgICAgICAvL30KKworICAgICAgICAgICAgcHItPnUucC5wYXJtMSA9IHBhcm0xOworICAgICAgICAgICAgcHItPnUucC5wYXJtMiA9IHBhcm0yOworICAgICAgICAgICAgcHItPnUucC5wYXJtMyA9IHBhcm0zOworICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHBhcm00OworICAgICAgICB9IC8vIGNhc2UKKyAgICAgICAgYnJlYWs7CisKKyAgICBkZWZhdWx0OgorICAgICAgICB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgS01QX01TRyggVW5rbm93blNjaGVkVHlwZURldGVjdGVkICksIC8vIFByaW1hcnkgbWVzc2FnZQorICAgICAgICAgICAgICAgIEtNUF9ITlQoIEdldE5ld2VyTGlicmFyeSApLCAgICAgICAgICAvLyBIaW50CisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICB9IC8vIHN3aXRjaAorICAgIHByLT5zY2hlZHVsZSA9IHNjaGVkdWxlOworICAgIGlmICggYWN0aXZlICkgeworICAgICAgICAvKiBUaGUgbmFtZSBvZiB0aGlzIGJ1ZmZlciBzaG91bGQgYmUgbXlfYnVmZmVyX2luZGV4IHdoZW4gaXQncyBmcmVlIHRvIHVzZSBpdCAqLworCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGJlZm9yZSB3YWl0OiBteV9idWZmZXJfaW5kZXg6JWQgc2gtPmJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG15X2J1ZmZlcl9pbmRleCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZDwga21wX3VpbnQzMiA+KCAmIHNoLT5idWZmZXJfaW5kZXgsIG15X2J1ZmZlcl9pbmRleCwgX19rbXBfZXE8IGttcF91aW50MzIgPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKCBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm90ZTogS01QX1dBSVRfWUlFTEQoKSBjYW5ub3QgYmUgdXNlZCB0aGVyZTogYnVmZmVyIGluZGV4IGFuZCBteV9idWZmZXJfaW5kZXggYXJlCisgICAgICAgICAgICAvLyAqYWx3YXlzKiAzMi1iaXQgaW50ZWdlcnMuCisgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyVkIGFmdGVyIHdhaXQ6IG15X2J1ZmZlcl9pbmRleDolZCBzaC0+YnVmZmVyX2luZGV4OiVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbXlfYnVmZmVyX2luZGV4LCBzaC0+YnVmZmVyX2luZGV4KSApOworCisgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QqKSBwcjsKKyAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfc2hfY3VycmVudCA9IChkaXNwYXRjaF9zaGFyZWRfaW5mb190KikgIHNoOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgIF9fa21wX2l0dF9vcmRlcmVkX2luaXQoIGd0aWQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgLy8gUmVwb3J0IGxvb3AgbWV0YWRhdGEKKyAgICAgICAgaWYgKCBpdHRfbmVlZF9tZXRhZGF0YV9yZXBvcnRpbmcgKSB7CisgICAgICAgICAgICAvLyBPbmx5IHJlcG9ydCBtZXRhZGF0YSBieSBtYXN0ZXIgb2YgYWN0aXZlIHRlYW0gYXQgbGV2ZWwgMQorICAgICAgICAgICAga21wX3VpbnQ2NCBzY2hlZHR5cGUgPSAwOworICAgICAgICAgICAgc3dpdGNoICggc2NoZWR1bGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOi8vIENodW5rIGlzIGNhbGN1bGF0ZWQgaW4gdGhlIHN3aXRjaCBhYm92ZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgY3VyX2NodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBzY2hlZHR5cGUgPSAyOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKy8vICAgICAgICAgICAgU2hvdWxkIHdlIHB1dCB0aGlzIGNhc2UgdW5kZXIgInN0YXRpYyI/CisvLyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgc2NoZWR0eXBlID0gMzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wKGxvYywgc2NoZWR0eXBlLCB0YywgY3VyX2NodW5rKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9OyAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9pbml0OiBUIyUlZCByZXR1cm5pbmc6IHNjaGVkdWxlOiUlZCBvcmRlcmVkOiUlJXMgbGI6JSUlcyB1YjolJSVzIiBcCisgICAgICAgICAgICAiIHN0OiUlJXMgdGM6JSUlcyBjb3VudDolJSVzXG5cdG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXMiIFwKKyAgICAgICAgICAgICIgcGFybTE6JSUlcyBwYXJtMjolJSVzIHBhcm0zOiUlJXMgcGFybTQ6JSUlc1xuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAsICggYnVmZiwKKyAgICAgICAgICAgIGd0aWQsIHByLT5zY2hlZHVsZSwgcHItPm9yZGVyZWQsIHByLT51LnAubGIsIHByLT51LnAudWIsCisgICAgICAgICAgICBwci0+dS5wLnN0LCBwci0+dS5wLnRjLCBwci0+dS5wLmNvdW50LAorICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIsIHByLT51LnAucGFybTEsCisgICAgICAgICAgICBwci0+dS5wLnBhcm0yLCBwci0+dS5wLnBhcm0zLCBwci0+dS5wLnBhcm00ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgICAvLyBJdCBjYW5ub3QgYmUgZ3VhcmFudGVlZCB0aGF0IGFmdGVyIGV4ZWN1dGlvbiBvZiBhIGxvb3Agd2l0aCBzb21lIG90aGVyIHNjaGVkdWxlIGtpbmQKKyAgICAgIC8vIGFsbCB0aGUgcGFybTMgdmFyaWFibGVzIHdpbGwgY29udGFpbiB0aGUgc2FtZSB2YWx1ZS4KKyAgICAgIC8vIEV2ZW4gaWYgYWxsIHBhcm0zIHdpbGwgYmUgdGhlIHNhbWUsIGl0IHN0aWxsIGV4aXN0cyBhIGJhZCBjYXNlIGxpa2UgdXNpbmcgMCBhbmQgMQorICAgICAgLy8gcmF0aGVyIHRoYW4gcHJvZ3JhbSBsaWZlLXRpbWUgaW5jcmVtZW50LgorICAgICAgLy8gU28gdGhlIGRlZGljYXRlZCB2YXJpYWJsZSBpcyByZXF1aXJlZC4gVGhlICdzdGF0aWNfc3RlYWxfY291bnRlcicgaXMgdXNlZC4KKyAgICAgIGlmKCBzY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpY19zdGVhbCApIHsKKyAgICAgICAgLy8gT3RoZXIgdGhyZWFkcyB3aWxsIGluc3BlY3QgdGhpcyB2YXJpYWJsZSB3aGVuIHNlYXJjaGluZyBmb3IgYSB2aWN0aW0uCisgICAgICAgIC8vIFRoaXMgaXMgYSBmbGFnIHNob3dpbmcgdGhhdCBvdGhlciB0aHJlYWRzIG1heSBzdGVhbCBmcm9tIHRoaXMgdGhyZWFkIHNpbmNlIHRoZW4uCisgICAgICAgIHZvbGF0aWxlIFQgKiBwID0gJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXI7CisgICAgICAgICpwID0gKnAgKyAxOworICAgICAgfQorICAgICNlbmRpZiAvLyAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgIG9tcHRfdGVhbV9pbmZvX3QgKnRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7CisgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgIH0KKyNlbmRpZgorfQorCisvKgorICogRm9yIG9yZGVyZWQgbG9vcHMsIGVpdGhlciBfX2ttcF9kaXNwYXRjaF9maW5pc2goKSBzaG91bGQgYmUgY2FsbGVkIGFmdGVyCisgKiBldmVyeSBpdGVyYXRpb24sIG9yIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuaygpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIKKyAqIGV2ZXJ5IGNodW5rIG9mIGl0ZXJhdGlvbnMuICBJZiB0aGUgb3JkZXJlZCBzZWN0aW9uKHMpIHdlcmUgbm90IGV4ZWN1dGVkCisgKiBmb3IgdGhpcyBpdGVyYXRpb24gKG9yIGV2ZXJ5IGl0ZXJhdGlvbiBpbiB0aGlzIGNodW5rKSwgd2UgbmVlZCB0byBzZXQgdGhlCisgKiBvcmRlcmVkIGl0ZXJhdGlvbiBjb3VudGVycyBzbyB0aGF0IHRoZSBuZXh0IHRocmVhZCBjYW4gcHJvY2VlZC4KKyAqLwordGVtcGxhdGU8IHR5cGVuYW1lIFVUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXNwYXRjaF9maW5pc2goIGludCBndGlkLCBpZGVudF90ICpsb2MgKQoreworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFVUID46OnNpZ25lZF90IFNUOworICAgIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlZCBjYWxsZWRcbiIsIGd0aWQgKSApOworICAgIGlmICggISB0aCAtPiB0aC50aF90ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworCisgICAgICAgIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiAqIHByID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVVQgPiogPgorICAgICAgICAgICAgKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQgKTsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gdm9sYXRpbGUgKiBzaCA9CisgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPnZvbGF0aWxlKiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aC0+dGgudGhfZGlzcGF0Y2ggPT0KKyAgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIGlmICggcHItPm9yZGVyZWRfYnVtcGVkICkgeworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2g6IFQjJWQgcmVzZXR0aW5nIG9yZGVyZWRfYnVtcGVkIHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgVVQgbG93ZXIgPSBwci0+dS5wLm9yZGVyZWRfbG93ZXI7CisKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaDogVCMlJWQgYmVmb3JlIHdhaXQ6IG9yZGVyZWRfaXRlcmF0aW9uOiUlJXMgbG93ZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBzaC0+dS5zLm9yZGVyZWRfaXRlcmF0aW9uLCBsb3dlciApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgX19rbXBfd2FpdF95aWVsZDwgVVQgPigmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIF9fa21wX2dlPCBVVCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIGlzIHRoaXMgbmVjZXNzYXJ5PyAqLworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyUlZCBhZnRlciB3YWl0OiBvcmRlcmVkX2l0ZXJhdGlvbjolJSVzIGxvd2VyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIgKSApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgI2VuZGlmCisKKyAgICAgICAgICAgIHRlc3RfdGhlbl9pbmM8IFNUID4oICh2b2xhdGlsZSBTVCAqKSAmIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24gKTsKKyAgICAgICAgfSAvLyBpZgorICAgIH0gLy8gaWYKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJldHVybmVkXG4iLCBndGlkICkgKTsKK30KKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVVQgPgorc3RhdGljIHZvaWQKK19fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuayggaW50IGd0aWQsIGlkZW50X3QgKmxvYyApCit7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVVQgPjo6c2lnbmVkX3QgU1Q7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyVkIGNhbGxlZFxuIiwgZ3RpZCApICk7CisgICAgaWYgKCAhIHRoIC0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisvLyAgICAgICAgaW50IGNpZDsKKyAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+ICogcHIgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBVVCA+KiA+CisgICAgICAgICAgICAoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCApOworICAgICAgICBkaXNwYXRjaF9zaGFyZWRfaW5mb190ZW1wbGF0ZTwgVVQgPiB2b2xhdGlsZSAqIHNoID0KKyAgICAgICAgICAgIHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3NoYXJlZF9pbmZvX3RlbXBsYXRlPCBVVCA+dm9sYXRpbGUqID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9kaXNwYXRjaCA9PQorICAgICAgICAgICAgICAgICAmdGgtPnRoLnRoX3RlYW0tPnQudF9kaXNwYXRjaFt0aC0+dGgudGhfaW5mby5kcy5kc190aWRdICk7CisKKy8vICAgICAgICBmb3IgKGNpZCA9IDA7IGNpZCA8IEtNUF9NQVhfT1JERVJFRDsgKytjaWQpIHsKKyAgICAgICAgICAgIFVUIGxvd2VyID0gcHItPnUucC5vcmRlcmVkX2xvd2VyOworICAgICAgICAgICAgVVQgdXBwZXIgPSBwci0+dS5wLm9yZGVyZWRfdXBwZXI7CisgICAgICAgICAgICBVVCBpbmMgPSB1cHBlciAtIGxvd2VyICsgMTsKKworICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZF9idW1wZWQgPT0gaW5jICkgeworICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICgiX19rbXBfZGlzcGF0Y2hfZmluaXNoOiBUIyVkIHJlc2V0dGluZyBvcmRlcmVkX2J1bXBlZCB0byB6ZXJvXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgICAgICAgICAgcHItPm9yZGVyZWRfYnVtcGVkID0gMDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaW5jIC09IHByLT5vcmRlcmVkX2J1bXBlZDsKKworICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rOiBUIyUlZCBiZWZvcmUgd2FpdDogIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9pdGVyYXRpb246JSUlcyBsb3dlcjolJSVzIHVwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIHVwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgX19rbXBfd2FpdF95aWVsZDwgVVQgPigmc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgbG93ZXIsIF9fa21wX2dlPCBVVCA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhOVUxMKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogaXMgdGhpcyBuZWNlc3Nhcnk/ICovCisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJWQgcmVzZXR0aW5nIG9yZGVyZWRfYnVtcGVkIHRvIHplcm9cbiIsCisgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICBwci0+b3JkZXJlZF9idW1wZWQgPSAwOworLy8hISEhISBUT0RPIGNoZWNrIGlmIHRoZSBpbmMgc2hvdWxkIGJlIHVuc2lnbmVkLCBvciBzaWduZWQ/Pz8KKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX2ZpbmlzaF9jaHVuazogVCMlJWQgYWZ0ZXIgd2FpdDogIiBcCisgICAgICAgICAgICAgICAgICAgICAgICAib3JkZXJlZF9pdGVyYXRpb246JSUlcyBpbmM6JSUlcyBsb3dlcjolJSVzIHVwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHNoLT51LnMub3JkZXJlZF9pdGVyYXRpb24sIGluYywgbG93ZXIsIHVwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorCisgICAgICAgICAgICAgICAgdGVzdF90aGVuX2FkZDwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiwgaW5jKTsKKyAgICAgICAgICAgIH0KKy8vICAgICAgICB9CisgICAgfQorICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms6IFQjJWQgcmV0dXJuZWRcbiIsIGd0aWQgKSApOworfQorCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKy8qIERlZmluZSBhIG1hY3JvIGZvciBleGl0aW5nIF9fa21wX2Rpc3BhdGNoX25leHQoKS4gSWYgc3RhdHVzIGlzIDAKKyAqIChubyBtb3JlIHdvcmspLCB0aGVuIHRlbGwgT01QVCB0aGUgbG9vcCBpcyBvdmVyLiBJbiBzb21lIGNhc2VzCisgKiBrbXBfZGlzcGF0Y2hfZmluaSgpIGlzIG5vdCBjYWxsZWQuICovCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyNkZWZpbmUgT01QVF9MT09QX0VORCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKHN0YXR1cyA9PSAwKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSkgeyAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIG9tcHRfdGVhbV9pbmZvX3QgKnRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7ICAgICAgICBcCisgICAgICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOyAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfZW5kKSggICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOyAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKyNlbHNlCisjZGVmaW5lIE9NUFRfTE9PUF9FTkQgLy8gbm8tb3AKKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgaW50CitfX2ttcF9kaXNwYXRjaF9uZXh0KAorICAgIGlkZW50X3QgKmxvYywgaW50IGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LCBUICpwX2xiLCBUICpwX3ViLCB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcF9zdAorKSB7CisKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnVuc2lnbmVkX3QgIFVUOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgICAgU1Q7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpmbG9hdGluZ190ICBEQkw7CisjaWYgKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgIHN0YXRpYyBjb25zdCBpbnQgX19fa21wX3NpemVfdHlwZSA9IHNpemVvZiggVVQgKTsKKyNlbmRpZgorCisgICAgLy8gVGhpcyBpcyBwb3RlbnRpYWxseSBzbGlnaHRseSBtaXNsZWFkaW5nLCBzY2hlZHVsZShydW50aW1lKSB3aWxsIGFwcGVhciBoZXJlIGV2ZW4gaWYgdGhlIGFjdHVhbCBydW50bWUgc2NoZWR1bGUKKyAgICAvLyBpcyBzdGF0aWMuIChXaGljaCBwb2ludHMgb3V0IGEgZGlzYWRhdmFudGFnZSBvZiBzY2hlZHVsZShydW50aW1lKTogZXZlbiB3aGVuIHN0YXRpYyBzY2hlZHVsaW5nIGlzIHVzZWQgaXQgY29zdHMKKyAgICAvLyBtb3JlIHRoYW4gYSBjb21waWxlIHRpbWUgY2hvaWNlIHRvIHVzZSBzdGF0aWMgc2NoZWR1bGluZyB3b3VsZC4pCisgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soRk9SX2R5bmFtaWNfc2NoZWR1bGluZyk7CisKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1czsKKyAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiAqIHByOworICAgIGttcF9pbmZvX3QgICAgICAgICAgICAgICAgICAgICAgICAgICogdGggICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICAgICAgICAgICAgICAgICAgICAgICAgICAqIHRlYW0gPSB0aCAtPiB0aC50aF90ZWFtOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggcF9sYiAmJiBwX3ViICYmIHBfc3QgKTsgLy8gQUM6IHRoZXNlIGNhbm5vdCBiZSBOVUxMCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBjYWxsZWQgcF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiAlJXBcbiIsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0ICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYgKCB0ZWFtIC0+IHQudF9zZXJpYWxpemVkICkgeworICAgICAgICAvKiBOT1RFOiBzZXJpYWxpemUgdGhpcyBkaXNwYXRjaCBiZWNhc2Ugd2UgYXJlIG5vdCBhdCB0aGUgYWN0aXZlIGxldmVsICovCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcF9idWZmZXIgKTsgLyogdG9wIG9mIHRoZSBzdGFjayAqLworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBwciApOworCisgICAgICAgIGlmICggKHN0YXR1cyA9IChwci0+dS5wLnRjICE9IDApKSA9PSAwICkgeworICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgKnBfdWIgPSAwOworLy8gICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKy8vICAgICAgICAgICAgICAgICpwX2xhc3QgPSAwOworICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIGlmICggcHItPnB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgICAgICAgICBwci0+cHVzaGVkX3dzID0gX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgcHItPnB1c2hlZF93cywgbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKCBwci0+bm9tZXJnZSApIHsKKyAgICAgICAgICAgIGttcF9pbnQzMiBsYXN0OworICAgICAgICAgICAgVCAgICAgICAgIHN0YXJ0OworICAgICAgICAgICAgVVQgICAgICAgIGxpbWl0LCB0cmlwLCBpbml0OworICAgICAgICAgICAgU1QgICAgICAgIGluY3I7CisgICAgICAgICAgICBUICAgICAgICAgY2h1bmsgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLCBndGlkICkgKTsKKworICAgICAgICAgICAgaW5pdCA9IGNodW5rICogcHItPnUucC5jb3VudCsrOworICAgICAgICAgICAgdHJpcCA9IHByLT51LnAudGMgLSAxOworCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoaW5pdCA8PSB0cmlwKSkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworLy8gICAgICAgICAgICAgICAgaWYgKCBwX2xhc3QgIT0gTlVMTCApCisvLyAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggcHItPnB1c2hlZF93cyAhPSBjdF9ub25lICkgeworICAgICAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgbGltaXQgPSBjaHVuayArIGluaXQgLSAxOworICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9IHByLT51LnAudWI7CisgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcHItPnUucC50YyA9IDA7CisgICAgICAgICAgICAqcF9sYiA9IHByLT51LnAubGI7CisgICAgICAgICAgICAqcF91YiA9IHByLT51LnAudWI7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIHByLT51LnAubGFzdF91cHBlciA9ICpwX3ViOworICAgICAgICAgICAgI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgICAgICBpZiAoIHBfbGFzdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcF9sYXN0ID0gVFJVRTsKKyAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcF9zdCA9IHByLT51LnAuc3Q7CisgICAgICAgIH0gLy8gaWYKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICB7CisgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIHNlcmlhbGl6ZWQgY2FzZTogcF9sYjolJSVzICIgXAorICAgICAgICAgICAgICAgICJwX3ViOiUlJXMgcF9zdDolJSVzIHBfbGFzdDolJXAgJSVkICByZXR1cm5pbmc6JSVkXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMCwgKCBidWZmLCBndGlkLCAqcF9sYiwgKnBfdWIsICpwX3N0LCBwX2xhc3QsICpwX2xhc3QsIHN0YXR1cykgKTsKKyAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICB9CisgICAgICAgICNlbmRpZgorI2lmIElOQ0xVREVfU1NDX01BUktTCisgICAgICAgIFNTQ19NQVJLX0RJU1BBVENIX05FWFQoKTsKKyNlbmRpZgorICAgICAgICBPTVBUX0xPT1BfRU5EOworICAgICAgICByZXR1cm4gc3RhdHVzOworICAgIH0gZWxzZSB7CisgICAgICAgIGttcF9pbnQzMiBsYXN0ID0gMDsKKyAgICAgICAgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4gKnNoOworICAgICAgICBUICAgICAgICAgc3RhcnQ7CisgICAgICAgIFNUICAgICAgICBpbmNyOworICAgICAgICBVVCAgICAgICAgbGltaXQsIHRyaXAsIGluaXQ7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2Rpc3BhdGNoID09CisgICAgICAgICAgICAgICAgJnRoLT50aC50aF90ZWFtLT50LnRfZGlzcGF0Y2hbdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkXSApOworCisgICAgICAgIHByID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHByICk7CisgICAgICAgIHNoID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfc2hhcmVkX2luZm9fdGVtcGxhdGU8IFVUID4qID4KKyAgICAgICAgICAgICggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNoICk7CisKKyAgICAgICAgaWYgKCBwci0+dS5wLnRjID09IDAgKSB7CisgICAgICAgICAgICAvLyB6ZXJvIHRyaXAgY291bnQKKyAgICAgICAgICAgIHN0YXR1cyA9IDA7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzd2l0Y2ggKHByLT5zY2hlZHVsZSkgeworICAgICAgICAgICAgI2lmICggS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVEICkKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKyAgICAgICAgICAgICAgICAgICAgaW50IG5wcm9jID0gdGgtPnRoLnRoX3RlYW1fbnByb2M7CisKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9zdGF0aWNfc3RlYWwgY2FzZVxuIiwgZ3RpZCkgKTsKKworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX19rbXBfc2l6ZV90eXBlID4gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBsb2NrIGZvciA4LWJ5dGUgYW5kIENBUyBmb3IgNC1ieXRlIGluZHVjdGlvbgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gdmFyaWFibGUuIFRPRE8gKG9wdGlvbmFsKTogY2hlY2sgYW5kIHVzZSAxNi1ieXRlIENBUworICAgICAgICAgICAgICAgICAgICAgICAga21wX2xvY2tfdCAqIGxjayA9IHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobGNrICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHByLT51LnAuY291bnQgPCAoVVQpcHItPnUucC51YiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2sobGNrLCBndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0cnkgdG8gZ2V0IG93biBjaHVuayBvZiBpdGVyYXRpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCAgID0gKCBwci0+dS5wLmNvdW50ICkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAoIGluaXQgPCAoVVQpcHItPnUucC51YiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayhsY2ssIGd0aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAvLyBubyBvd24gY2h1bmtzCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggIXN0YXR1cyApIHsgLy8gdHJ5IHRvIHN0ZWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9saW1pdCA9IG5wcm9jOyAvLyBucHJvYyBhdHRlbXB0cyB0byBmaW5kIGEgdmljdGltCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICAgICAgICAgIHdoaWxlX2luZGV4ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbGdvcml0aG0gb2Ygc2VhcmNoaW5nIGZvciBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCAhc3RhdHVzICkgJiYgKCB3aGlsZV9saW1pdCAhPSArK3doaWxlX2luZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUIHZpY3RpbUlkeCAgICA9IHByLT51LnAucGFybTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgb2xkVmljdGltSWR4ID0gdmljdGltSWR4ID8gdmljdGltSWR4IC0gMSA6IG5wcm9jIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4gKiB2aWN0aW0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0tPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICggdmljdGltID09IE5VTEwgfHwgdmljdGltID09IHByIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICoodm9sYXRpbGUgVCopJnZpY3RpbS0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIFQqKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICkgKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb2xkVmljdGltSWR4ICE9IHZpY3RpbUlkeCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbUlkeCA9ICh2aWN0aW1JZHggKyAxKSAlIG5wcm9jOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdmljdGltID0gcmVpbnRlcnByZXRfY2FzdDwgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3RlbXBsYXRlPCBUID4qID4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAob3RoZXJfdGhyZWFkc1t2aWN0aW1JZHhdLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfcHJfY3VycmVudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhdmljdGltIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICoodm9sYXRpbGUgVCAqKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBUICopJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB0cnkgb25jZSBtb3JlIChucHJvYyBhdHRlbXB0cyBpbiB0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHZpY3RpbSBpcyByZWFkeSB5ZXQgdG8gcGFydGljaXBhdGUgaW4gc3RlYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgYWxsIHZpY3RpbXMgYXJlIHN0aWxsIGluIGttcF9pbml0X2Rpc3BhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHZpY3RpbS0+dS5wLmNvdW50ICsgMiA+IChVVCl2aWN0aW0tPnUucC51YiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAucGFybTQgPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsgLy8gc2hpZnQgc3RhcnQgdGlkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsgLy8gbm90IGVub3VnaCBjaHVua3MgdG8gc3RlYWwsIGdvdG8gbmV4dCB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxjayA9IG90aGVyX3RocmVhZHNbdmljdGltSWR4XS0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2s7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2sobGNrLCBndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB2aWN0aW0tPnUucC51YjsgLy8ga2VlcCBpbml0aWFsIHViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCB2aWN0aW0tPnUucC5jb3VudCA+PSBsaW1pdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHJlbWFpbmluZyA9IGxpbWl0IC0gdmljdGltLT51LnAuY291bnQpIDwgMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayhsY2ssIGd0aWQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9ICh2aWN0aW1JZHggKyAxKSAlIG5wcm9jOyAvLyBuZXh0IHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8vIG5vdCBlbm91Z2ggY2h1bmtzIHRvIHN0ZWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlYWxpbmcgc3VjY2VkZWQsIHJlZHVjZSB2aWN0aW0ncyB1YiBieSAxLzQgb2YgdW5kb25lIGNodW5rcyBvciBieSAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPiAzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9ICggdmljdGltLT51LnAudWIgLT0gKHJlbWFpbmluZz4+MikgKTsgLy8gc3RlYWwgMS80IG9mIHJlbWFpbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9ICggdmljdGltLT51LnAudWIgLT0gMSApOyAvLyBzdGVhbCAxIGNodW5rIG9mIDIgb3IgMyByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sobGNrLCBndGlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQgKyAxIDw9IGxpbWl0KTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHZpY3RpbUlkeDsgLy8gcmVtZW1iZXIgdmljdGltIHRvIHN0ZWFsIGZyb20KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGVfaW5kZXggPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3cgdXBkYXRlIG93biBjb3VudCBhbmQgdWIgd2l0aCBzdG9sZW4gcmFuZ2UgYnV0IGluaXQgY2h1bmsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKHRoLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jaywgZ3RpZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC51YiA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2sodGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9zdGVhbF9sb2NrLCBndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlIChzZWFyY2ggZm9yIHZpY3RpbSkKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYgKHRyeSB0byBmaW5kIHZpY3RpbSBhbmQgc3RlYWwpCisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyA0LWJ5dGUgaW5kdWN0aW9uIHZhcmlhYmxlLCB1c2UgOC1ieXRlIENBUyBmb3IgcGFpciAoY291bnQsIHViKQorICAgICAgICAgICAgICAgICAgICAgICAgdHlwZWRlZiB1bmlvbiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVQgY291bnQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFQgIHViOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gdW5pb25faTQ7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBBbGwgb3BlcmF0aW9ucyBvbiAnY291bnQnIG9yICd1YicgbXVzdCBiZSBjb21iaW5lZCBhdG9taWNhbGx5IHRvZ2V0aGVyLgorICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0IHZvbGQsIHZuZXc7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLmNvdW50Kys7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdm9sYXRpbGUga21wX2ludDY0KiApJnByLT51LnAuY291bnQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKlZPTEFUSUxFX0NBU1Qoa21wX2ludDY0ICopJnZvbGQuYiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm9sZC5iID0gKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2bmV3LnAuY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldyA9IHZvbGQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCAgID0gdm5ldy5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9ICggaW5pdCA8IChVVCl2bmV3LnAudWIgKSA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhc3RhdHVzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgICAqKm90aGVyX3RocmVhZHMgPSB0ZWFtLT50LnRfdGhyZWFkczsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgICAgICAgICAgd2hpbGVfbGltaXQgPSBucHJvYzsgLy8gbnByb2MgYXR0ZW1wdHMgdG8gZmluZCBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBhbGdvcml0aG0gb2Ygc2VhcmNoaW5nIGZvciBhIHZpY3RpbQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHNob3VsZCBiZSBjbGVhbmVkIHVwIGFuZCBtZWFzdXJlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggKCAhc3RhdHVzICkgJiYgKCB3aGlsZV9saW1pdCAhPSArK3doaWxlX2luZGV4ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHVuaW9uX2k0ICB2b2xkLCB2bmV3OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgcmVtYWluaW5nOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUICAgICAgICAgdmljdGltSWR4ICAgID0gcHItPnUucC5wYXJtNDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVCBvbGRWaWN0aW1JZHggPSB2aWN0aW1JZHggPyB2aWN0aW1JZHggLSAxIDogbnByb2MgLSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiAqIHZpY3RpbSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZWludGVycHJldF9jYXN0PCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdGVtcGxhdGU8IFQgPiogPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKG90aGVyX3RocmVhZHNbdmljdGltSWR4XS0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3ByX2N1cnJlbnQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggKHZpY3RpbSA9PSBOVUxMIHx8IHZpY3RpbSA9PSBwciB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCoodm9sYXRpbGUgVCopJnZpY3RpbS0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyICE9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKHZvbGF0aWxlIFQqKSZwci0+dS5wLnN0YXRpY19zdGVhbF9jb3VudGVyKSkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9sZFZpY3RpbUlkeCAhPSB2aWN0aW1JZHggKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1JZHggPSAodmljdGltSWR4ICsgMSkgJSBucHJvYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZpY3RpbSA9IHJlaW50ZXJwcmV0X2Nhc3Q8IGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ZW1wbGF0ZTwgVCA+KiA+CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBvdGhlcl90aHJlYWRzW3ZpY3RpbUlkeF0tPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhdmljdGltIHx8CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoICoodm9sYXRpbGUgVCAqKSZ2aWN0aW0tPnUucC5zdGF0aWNfc3RlYWxfY291bnRlciAhPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKih2b2xhdGlsZSBUICopJnByLT51LnAuc3RhdGljX3N0ZWFsX2NvdW50ZXIgKSApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOyAvLyB0cnkgb25jZSBtb3JlIChucHJvYyBhdHRlbXB0cyBpbiB0b3RhbCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vIHZpY3RpbSBpcyByZWFkeSB5ZXQgdG8gcGFydGljaXBhdGUgaW4gc3RlYWxpbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlY2F1c2UgYWxsIHZpY3RpbXMgYXJlIHN0aWxsIGluIGttcF9pbml0X2Rpc3BhdGNoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9IHZpY3RpbUlkeDsgLy8gbmV3IHZpY3RpbSBmb3VuZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZSggMSApIHsgLy8gQ0FTIGxvb3AgaWYgdmljdGltIGhhcyBlbm91Z2ggY2h1bmtzIHRvIHN0ZWFsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLmIgPSAqKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApKCAmdmljdGltLT51LnAuY291bnQgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcgPSB2b2xkOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodm5ldy5wLnViIC0gMSkgKiAoVVQpY2h1bmsgPD0gdHJpcCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCB2bmV3LnAuY291bnQgPj0gKFVUKXZuZXcucC51YiB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChyZW1haW5pbmcgPSB2bmV3LnAudWIgLSB2bmV3LnAuY291bnQpIDwgMiApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5wYXJtNCA9ICh2aWN0aW1JZHggKyAxKSAlIG5wcm9jOyAvLyBzaGlmdCBzdGFydCB2aWN0aW0gaWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsgLy8gbm90IGVub3VnaCBjaHVua3MgdG8gc3RlYWwsIGdvdG8gbmV4dCB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCByZW1haW5pbmcgPiAzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHZuZXcucC51YiAtPSAocmVtYWluaW5nPj4yKTsgLy8gdHJ5IHRvIHN0ZWFsIDEvNCBvZiByZW1haW5pbmcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdm5ldy5wLnViIC09IDE7IC8vIHN0ZWFsIDEgY2h1bmsgb2YgMiBvciAzIHJlbWFpbmluZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgodm5ldy5wLnViIC0gMSkgKiAoVVQpY2h1bmsgPD0gdHJpcCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB2b2xhdGlsZSBrbXBfaW50NjQgKiApJnZpY3RpbS0+dS5wLmNvdW50LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm9sZC5iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqVk9MQVRJTEVfQ0FTVChrbXBfaW50NjQgKikmdm5ldy5iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RlYWxpbmcgc3VjY2VkZGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB3aGlsZV9pbmRleCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm93IHVwZGF0ZSBvd24gY291bnQgYW5kIHViCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHZuZXcucC51YjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB2b2xkLnAuY291bnQgPSBpbml0ICsgMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1hDSEdfRklYRUQ2NCgoIHZvbGF0aWxlIGttcF9pbnQ2NCAqICkoJnByLT51LnAuY291bnQpLCB2b2xkLmIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKiggdm9sYXRpbGUga21wX2ludDY0ICogKSgmcHItPnUucC5jb3VudCkgPSB2b2xkLmI7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmIChjaGVjayBDQVMgcmVzdWx0KQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0NQVV9QQVVTRSgpOyAvLyBDQVMgZmFpbGVkLCByZXBlYXRlIGF0dGVtcHQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAodHJ5IHRvIHN0ZWFsIGZyb20gcGFydGljdWxhciB2aWN0aW0pCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyB3aGlsZSAoc2VhcmNoIGZvciB2aWN0aW0pCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmICh0cnkgdG8gZmluZCB2aWN0aW0gYW5kIHN0ZWFsKQorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmICg0LWJ5dGUgaW5kdWN0aW9uIHZhcmlhYmxlKQorICAgICAgICAgICAgICAgICAgICBpZiAoICFzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgKj0gY2h1bms7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IGNodW5rICsgaW5pdCAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaW5pdCA8PSB0cmlwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF9sb3dlciA9IGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX3VwcGVyID0gbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBvcmRlcmVkX2xvd2VyOiUlJXMgb3JkZXJlZF91cHBlcjolJSVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMDAsICggYnVmZiwgZ3RpZCwgcHItPnUucC5vcmRlcmVkX2xvd2VyLCBwci0+dS5wLm9yZGVyZWRfdXBwZXIgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAjZW5kaWYgLy8gKCBLTVBfU1RBVElDX1NURUFMX0VOQUJMRUQgKQorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkIGNhc2VcbiIsIGd0aWQpICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9ICFwci0+dS5wLmNvdW50KSAhPSAwICkgeyAgLyogY2hlY2sgaWYgdGhyZWFkIGhhcyBhbnkgaXRlcmF0aW9uIHRvIGRvICovCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gcHItPnUucC51YjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxhc3QgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsgIC8qIG5vIGl0ZXJhdGlvbnMgdG8gZG8gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAubGIgPSBwci0+dS5wLnViICsgcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAoIHByLT5vcmRlcmVkICkgeworICAgICAgICAgICAgICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMsIHRyYWl0c190PCBVVCA+OjpzcGVjICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6ICAvKiBvcmlnaW5hbCBjb2RlIGZvciBrbXBfc2NoX3N0YXRpY19ncmVlZHkgd2FzIG1lcmdlZCBoZXJlICovCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIHBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIEtEX1RSQUNFKDEwMCwgKCJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyVkIGttcF9zY2hfc3RhdGljX1thZmZpbml0eXxjaHVua2VkXSBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKyAgICAgICAgICAgICAgICAgICAgcGFybTEgPSBwci0+dS5wLnBhcm0xOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YyAtIDE7CisgICAgICAgICAgICAgICAgICAgIGluaXQgID0gcGFybTEgKiAocHItPnUucC5jb3VudCArIF9fa21wX3RpZF9mcm9tX2d0aWQoZ3RpZCkpOworCisgICAgICAgICAgICAgICAgICAgIGlmICggKHN0YXR1cyA9IChpbml0IDw9IHRyaXApKSAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgc3RhcnQgPSBwci0+dS5wLmxiOworICAgICAgICAgICAgICAgICAgICAgICAgaW5jciAgPSBwci0+dS5wLnN0OworICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBwYXJtMSArIGluaXQgLSAxOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9IHRyaXA7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkgKnBfc3QgPSBpbmNyOworCisgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLmNvdW50ICs9IHRoLT50aC50aF90ZWFtX25wcm9jOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUIGNodW5rID0gcHItPnUucC5wYXJtMTsKKworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCBjYXNlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkICkgKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmsgKiB0ZXN0X3RoZW5faW5jX2FjcTwgU1QgPigodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLml0ZXJhdGlvbiApOworICAgICAgICAgICAgICAgICAgICB0cmlwID0gcHItPnUucC50YyAtIDE7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPD0gdHJpcCkpID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN0YXJ0ID0gcHItPnUucC5sYjsKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gY2h1bmsgKyBpbml0IC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGluY3IgID0gcHItPnUucC5zdDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAobGFzdCA9IChsaW1pdCA+PSB0cmlwKSkgIT0gMCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSB0cmlwOworCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBfc3QgIT0gTlVMTCApICpwX3N0ID0gaW5jcjsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBpbmNyID09IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSBzdGFydCArIGxpbWl0ICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgfSAvLyBjYXNlCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBUICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsCisgICAgICAgICAgICAgICAgICAgICAgICAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBpdGVyYXRpdmUgY2FzZVxuIixndGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3RhcnQgYXRvbWljIHBhcnQgb2YgY2FsY3VsYXRpb25zCisgICAgICAgICAgICAgICAgICAgIHdoaWxlKDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIFNUICByZW1haW5pbmc7ICAgICAgICAgICAgIC8vIHNpZ25lZCwgYmVjYXVzZSBjYW4gYmUgPCAwCisgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gc2gtPnUucy5pdGVyYXRpb247ICAvLyBzaGFyZWQgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCByZW1haW5pbmcgPD0gMCApIHsgICAgLy8gQUM6IG5lZWQgdG8gY29tcGFyZSB3aXRoIDAgZmlyc3QKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBub3RoaW5nIHRvIGRvLCBkb24ndCB0cnkgYXRvbWljIG9wCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKFQpcmVtYWluaW5nIDwgcHItPnUucC5wYXJtMiApIHsgLy8gY29tcGFyZSB3aXRoIEsqbnByb2MqKGNodW5rKzEpLCBLPTIgYnkgZGVmYXVsdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHVzZSBkeW5hbWljLXN0eWxlIHNoY2VkdWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXRvbWljYWxseSBpbnJlbWVudCBpdGVyYXRpb25zLCBnZXQgb2xkIHZhbHVlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW5pdCA9IHRlc3RfdGhlbl9hZGQ8U1Q+KCAoU1QqKSZzaC0+dS5zLml0ZXJhdGlvbiwgKFNUKWNodW5rc3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJlbWFpbmluZyA9IHRyaXAgLSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChyZW1haW5pbmcgPD0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAvLyBhbGwgaXRlcmF0aW9ucyBnb3QgYnkgb3RoZXIgdGhyZWFkcworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGdvdCBzb21lIGl0ZXJhdGlvbnMgdG8gd29yayBvbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChUKXJlbWFpbmluZyA+IGNodW5rc3BlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gMTsgICAvLyB0aGUgbGFzdCBjaHVuaworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGltaXQgPSBpbml0ICsgcmVtYWluaW5nIC0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIChVVCkoIHJlbWFpbmluZyAqICooZG91YmxlKikmcHItPnUucC5wYXJtMyApOyAvLyBkaXZpZGUgYnkgSypucHJvYworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBjb21wYXJlX2FuZF9zd2FwPFNUPiggKFNUKikmc2gtPnUucy5pdGVyYXRpb24sIChTVClpbml0LCAoU1QpbGltaXQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBDQVMgd2FzIHN1Y2Nlc3NmdWwsIGNodW5rIG9idGFpbmVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RhdHVzID0gMTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIFQgICBjaHVua3NwZWMgPSBwci0+dS5wLnBhcm0xOworICAgICAgICAgICAgICAgICAgICBVVCBjaHVua0lkeDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2CisgICAgICAgICAgICAgICAgICAgIC8qIGZvciBzdG9yaW5nIG9yaWdpbmFsIEZQQ1cgdmFsdWUgZm9yIFdpbmRvd3MqIE9TIG9uCisJCSAgICAgICBJQS0zMiBhcmNoaXRlY3R1cmUgOC1ieXRlIHZlcnNpb24gKi8KKyAgICAgICAgICAgICAgICAgICAgdW5zaWduZWQgaW50IG9sZEZwY3c7CisgICAgICAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCBmcGN3U2V0ID0gMDsKKyAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQga21wX3NjaF9ndWlkZWRfY2h1bmtlZCBhbmFseXRpY2FsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIHRyaXAgID0gcHItPnUucC50YzsKKworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF90ZWFtX25wcm9jID4gMSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoKDJVTCAqIGNodW5rc3BlYyArIDEpICogKFVUKXRoLT50aC50aF90ZWFtX25wcm9jIDwgdHJpcCk7CisKKyAgICAgICAgICAgICAgICAgICAgd2hpbGUoMSkgeyAvKiB0aGlzIHdoaWxlIGxvb3AgaXMgYSBzYWZlZ3VhcmQgYWdhaW5zdCB1bmV4cGVjdGVkIHplcm8gY2h1bmsgc2l6ZXMgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgIGNodW5rSWR4ID0gdGVzdF90aGVuX2luY19hY3E8IFNUID4oKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2h1bmtJZHggPj0gKFVUKXByLT51LnAucGFybTIgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS10cmlwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBkeW5hbWljLXN0eWxlIHNjaGVkdWxpbmcgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gY2h1bmtJZHggKiBjaHVua3NwZWMgKyBwci0+dS5wLmNvdW50OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG5lZWQgdG8gdmVyaWZ5IGluaXQgPiAwIGluIGNhc2Ugb2Ygb3ZlcmZsb3cgaW4gdGhlIGFib3ZlIGNhbGN1bGF0aW9uICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAoc3RhdHVzID0gKGluaXQgPiAwICYmIGluaXQgPD0gdHJpcCkpICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gaW5pdCArIGNodW5rc3BlYyAtMTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIChsYXN0ID0gKGxpbWl0ID49IHRyaXApKSAhPSAwICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHVzZSBleHBvbmVudGlhbC1zdHlsZSBzY2hlZHVsaW5nICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogVGhlIGZvbGxvd2luZyBjaGVjayBpcyB0byB3b3JrYXJvdW5kIHRoZSBsYWNrIG9mIGxvbmcgZG91YmxlIHByZWNpc2lvbiBvbiBXaW5kb3dzKiBPUy4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUaGlzIGNoZWNrIHdvcmtzIGFyb3VuZCB0aGUgcG9zc2libGUgZWZmZWN0IHRoYXQgaW5pdCAhPSAwIGZvciBjaHVua0lkeCA9PSAwLgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBLTVBfQVJDSF9YODYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBJZiB3ZSBoYXZlbid0IGFscmVhZHkgZG9uZSBzbywgc2F2ZSBvcmlnaW5hbAorCQkJICAgICAgIEZQQ1cgYW5kIHNldCBwcmVjaXNpb24gdG8gNjQtYml0LCBhcyBXaW5kb3dzKiBPUworCQkJICAgICAgIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBkZWZhdWx0cyB0byA1My1iaXQgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFmcGN3U2V0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbGRGcGN3ID0gX2NvbnRyb2w4NygwLDApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KF9QQ182NCxfTUNXX1BDKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnBjd1NldCA9IDB4MzAwMDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggY2h1bmtJZHggKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSBfX2ttcF9kaXNwYXRjaF9ndWlkZWRfcmVtYWluaW5nPCBUID4oCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcCwgKiggREJMICogKSZwci0+dS5wLnBhcm0zLCBjaHVua0lkeCApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGluaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpbml0ID0gdHJpcCAtIGluaXQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfSBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGluaXQgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcCAtIF9fa21wX2Rpc3BhdGNoX2d1aWRlZF9yZW1haW5pbmc8IFQgPigKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHJpcCwgKiggREJMICogKSZwci0+dS5wLnBhcm0zLCBjaHVua0lkeCArIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfQVNTRVJUKGluaXQgPD0gbGltaXQpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5pdCA8IGxpbWl0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxpbWl0IDw9IHRyaXApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAtLWxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0dXMgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH0gLy8gd2hpbGUgKDEpCisgICAgI2lmIEtNUF9PU19XSU5ET1dTICYmIEtNUF9BUkNIX1g4NgorICAgICAgICAgICAgICAgICAgICAvKiByZXN0b3JlIEZQQ1cgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICAgICAgICAgICAgIEFDOiBjaGVjayBmcGN3U2V0IGZsYWcgZmlyc3QgYmVjYXVzZSBvbGRGcGN3IGNhbiBiZSB1bmluaXRpYWxpemVkIGhlcmUKKyAgICAgICAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKCBmcGN3U2V0ICYmICggb2xkRnBjdyAmIGZwY3dTZXQgKSApCisgICAgICAgICAgICAgICAgICAgICAgICBfY29udHJvbDg3KG9sZEZwY3csX01DV19QQyk7CisgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyID0gcHItPnUucC5zdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcF9zdCAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcF9zdCA9IGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYiA9IHN0YXJ0ICsgaW5pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICAqcF91YiA9IHN0YXJ0ICsgbGltaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfbG93ZXIgPSBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByLT51LnAub3JkZXJlZF91cHBlciA9IGxpbWl0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlJWQgb3JkZXJlZF9sb3dlcjolJSVzIG9yZGVyZWRfdXBwZXI6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRyYWl0c190PCBVVCA+OjpzcGVjLCB0cmFpdHNfdDwgVVQgPjo6c3BlYyApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAwLCAoIGJ1ZmYsIGd0aWQsIHByLT51LnAub3JkZXJlZF9sb3dlciwgcHItPnUucC5vcmRlcmVkX3VwcGVyICkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBVVCAgIGluZGV4OworICAgICAgICAgICAgICAgICAgICBUICAgIHBhcm0yID0gcHItPnUucC5wYXJtMjsKKyAgICAgICAgICAgICAgICAgICAgVCAgICBwYXJtMyA9IHByLT51LnAucGFybTM7CisgICAgICAgICAgICAgICAgICAgIFQgICAgcGFybTQgPSBwci0+dS5wLnBhcm00OworICAgICAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICgiX19rbXBfZGlzcGF0Y2hfbmV4dDogVCMlZCBrbXBfc2NoX3RyYXBlem9pZGFsIGNhc2VcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQgKSApOworCisgICAgICAgICAgICAgICAgICAgIGluZGV4ID0gdGVzdF90aGVuX2luYzwgU1QgPiggKHZvbGF0aWxlIFNUICopICYgc2gtPnUucy5pdGVyYXRpb24gKTsKKworICAgICAgICAgICAgICAgICAgICBpbml0ID0gKCBpbmRleCAqICggKDIqcGFybTIpIC0gKGluZGV4LTEpKnBhcm00ICkgKSAvIDI7CisgICAgICAgICAgICAgICAgICAgIHRyaXAgPSBwci0+dS5wLnRjIC0gMTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzdGF0dXMgPSAoKFQpaW5kZXggPCBwYXJtMyAmJiBpbml0IDw9IHRyaXApKSA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgKnBfdWIgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBzdGFydCA9IHByLT51LnAubGI7CisgICAgICAgICAgICAgICAgICAgICAgICBsaW1pdCA9ICggKGluZGV4KzEpICogKCAyKnBhcm0yIC0gaW5kZXgqcGFybTQgKSApIC8gMiAtIDE7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmNyICA9IHByLT51LnAuc3Q7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKGxhc3QgPSAobGltaXQgPj0gdHJpcCkpICE9IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGxpbWl0ID0gdHJpcDsKKworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwX3N0ICE9IE5VTEwgKSAqcF9zdCA9IGluY3I7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiID0gc3RhcnQgKyBpbml0OworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBfbGIgPSBzdGFydCArIGluaXQgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViID0gc3RhcnQgKyBsaW1pdCAqIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcHItPm9yZGVyZWQgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHItPnUucC5vcmRlcmVkX2xvd2VyID0gaW5pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwci0+dS5wLm9yZGVyZWRfdXBwZXIgPSBsaW1pdDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJSVkIG9yZGVyZWRfbG93ZXI6JSUlcyBvcmRlcmVkX3VwcGVyOiUlJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVVQgPjo6c3BlYywgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwMCwgKCBidWZmLCBndGlkLCBwci0+dS5wLm9yZGVyZWRfbG93ZXIsIHByLT51LnAub3JkZXJlZF91cHBlciApICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgICAgIH0gLy8gY2FzZQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIHN0YXR1cyA9IDA7IC8vIHRvIGF2b2lkIGNvbXBsYWludHMgb24gdW5pbml0aWFsaXplZCB2YXJpYWJsZSB1c2UKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBVbmtub3duU2NoZWRUeXBlRGV0ZWN0ZWQgKSwgLy8gUHJpbWFyeSBtZXNzYWdlCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBHZXROZXdlckxpYnJhcnkgKSwgICAgICAgICAgLy8gSGludAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgIC8vIFZhcmlhZGljIGFyZ3VtZW50IGxpc3QgdGVybWluYXRvcgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0gLy8gc3dpdGNoCisgICAgICAgIH0gLy8gaWYgdGMgPT0gMDsKKworICAgICAgICBpZiAoIHN0YXR1cyA9PSAwICkgeworICAgICAgICAgICAgVVQgICBudW1fZG9uZTsKKworICAgICAgICAgICAgbnVtX2RvbmUgPSB0ZXN0X3RoZW5faW5jPCBTVCA+KCAodm9sYXRpbGUgU1QgKikgJiBzaC0+dS5zLm51bV9kb25lICk7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBpbmNyZW1lbnQgbnVtX2RvbmU6JSUlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgdHJhaXRzX3Q8IFVUID46OnNwZWMgKTsKKyAgICAgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgc2gtPnUucy5udW1fZG9uZSApICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAgICAgaWYgKCAoU1QpbnVtX2RvbmUgPT0gdGgtPnRoLnRoX3RlYW1fbnByb2MgLSAxICkgeworICAgICAgICAgICAgICAgICNpZiAoIEtNUF9TVEFUSUNfU1RFQUxfRU5BQkxFRCApCisgICAgICAgICAgICAgICAgaWYoIHByLT5zY2hlZHVsZSA9PSBrbXBfc2NoX3N0YXRpY19zdGVhbCAmJiBfX19rbXBfc2l6ZV90eXBlID4gNCApIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGk7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgIC8vIGxvb3AgY29tcGxldGUsIHNhZmUgdG8gZGVzdHJveSBsb2NrcyB1c2VkIGZvciBzdGVhbGluZworICAgICAgICAgICAgICAgICAgICBmb3IoIGkgPSAwOyBpIDwgdGgtPnRoLnRoX3RlYW1fbnByb2M7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9sb2NrX3QgKiBsY2sgPSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9kaXNwYXRjaC0+dGhfc3RlYWxfbG9jazsKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobGNrICE9IE5VTEwpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZGVzdHJveV9sb2NrKCBsY2sgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIGxjayApOworICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfZGlzcGF0Y2gtPnRoX3N0ZWFsX2xvY2sgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIC8qIE5PVEU6IHJlbGVhc2UgdGhpcyBidWZmZXIgdG8gYmUgcmV1c2VkICovCisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgICAgICAgICAgICAgIHNoLT51LnMubnVtX2RvbmUgPSAwOworICAgICAgICAgICAgICAgIHNoLT51LnMuaXRlcmF0aW9uID0gMDsKKworICAgICAgICAgICAgICAgIC8qIFRPRE8gcmVwbGFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmU/ICovCisgICAgICAgICAgICAgICAgaWYgKCBwci0+b3JkZXJlZCApIHsKKyAgICAgICAgICAgICAgICAgICAgc2gtPnUucy5vcmRlcmVkX2l0ZXJhdGlvbiA9IDA7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgICAgICAgICBzaCAtPiBidWZmZXJfaW5kZXggKz0gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnM7CisgICAgICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIl9fa21wX2Rpc3BhdGNoX25leHQ6IFQjJWQgY2hhbmdlIGJ1ZmZlcl9pbmRleDolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgc2gtPmJ1ZmZlcl9pbmRleCkgKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgICAgICB9IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHByLT5wdXNoZWRfd3MgIT0gY3Rfbm9uZSApIHsKKyAgICAgICAgICAgICAgICAgICAgcHItPnB1c2hlZF93cyA9IF9fa21wX3BvcF93b3Jrc2hhcmUoIGd0aWQsIHByLT5wdXNoZWRfd3MsIGxvYyApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGVvX2ZjbiA9IE5VTEw7CisgICAgICAgICAgICB0aCAtPiB0aC50aF9kaXNwYXRjaCAtPiB0aF9keG9fZmNuID0gTlVMTDsKKyAgICAgICAgICAgIHRoIC0+IHRoLnRoX2Rpc3BhdGNoIC0+IHRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSBOVUxMOworICAgICAgICAgICAgdGggLT4gdGgudGhfZGlzcGF0Y2ggLT4gdGhfZGlzcGF0Y2hfcHJfY3VycmVudCA9IE5VTEw7CisgICAgICAgIH0gLy8gaWYgKHN0YXR1cyA9PSAwKQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGVsc2UgaWYgKCBsYXN0ICkgeworICAgICAgICAgICAgcHItPnUucC5sYXN0X3VwcGVyID0gcHItPnUucC51YjsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9PU19XSU5ET1dTICovCisgICAgICAgIGlmICggcF9sYXN0ICE9IE5VTEwgJiYgc3RhdHVzICE9IDAgKQorICAgICAgICAgICAgKnBfbGFzdCA9IGxhc3Q7CisgICAgfSAvLyBpZgorCisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcF9kaXNwYXRjaF9uZXh0OiBUIyUlZCBub3JtYWwgY2FzZTogIiBcCisgICAgICAgICAgICAicF9sYjolJSVzIHBfdWI6JSUlcyBwX3N0OiUlJXMgcF9sYXN0OiUlcCAgcmV0dXJuaW5nOiUlZFxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwLCAoIGJ1ZmYsIGd0aWQsICpwX2xiLCAqcF91YiwgcF9zdCA/ICpwX3N0IDogMCwgcF9sYXN0LCBzdGF0dXMgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19ESVNQQVRDSF9ORVhUKCk7CisjZW5kaWYKKyAgICBPTVBUX0xPT1BfRU5EOworICAgIHJldHVybiBzdGF0dXM7Cit9CisKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0YXRpYyB2b2lkCitfX2ttcF9kaXN0X2dldF9ib3VuZHMoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jcgorKSB7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+Ojp1bnNpZ25lZF90ICBVVDsKKyAgICB0eXBlZGVmIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICAgIFNUOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRlYW1zOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICogdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZGlzdF9nZXRfYm91bmRzIGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCggIl9fa21wY19kaXN0X2dldF9ib3VuZHM6IFQjJSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCBndGlkLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCBpbmNyICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorCisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKCpwdXBwZXIgPCAqcGxvd2VyKSA6ICgqcGxvd2VyIDwgKnB1cHBlcikgKSB7CisgICAgICAgICAgICAvLyBUaGUgbG9vcCBpcyBpbGxlZ2FsLgorICAgICAgICAgICAgLy8gU29tZSB6ZXJvLXRyaXAgbG9vcHMgbWFpbnRhaW5lZCBieSBjb21waWxlciwgZS5nLjoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOysraSkgLy8gbG93ZXIgPj0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7LS1pKSAvLyBsb3dlciA8PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDsrK2kpIC8vIGluY3IgPiAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDstLWkpIC8vIGluY3IgPCAwICAgICAgIC0gY29tcGlsZS10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyBDb21waWxlciBkb2VzIG5vdCBjaGVjayB0aGUgZm9sbG93aW5nIGlsbGVnYWwgbG9vcHM6CisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aTwxMDtpKz1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aT4wO2ktPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JJbGxlZ2FsLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgZ2xvYmFsIHRyaXAgY291bnQKKyAgICBpZiggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgICAgfSBlbHNlIGlmICggaW5jciA+IDAgKSB7CisgICAgICAgIC8vIHVwcGVyLWxvd2VyIGNhbiBleGNlZWQgdGhlIGxpbWl0IG9mIHNpZ25lZCB0eXBlCisgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwbG93ZXIgLSAqcHVwcGVyKSAvICggLWluY3IgKSArIDE7CisgICAgfQorCisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IHNvbWUgdGVhbXMgZ2V0IHNpbmdsZSBpdGVyYXRpb24sIG90aGVycyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0ZWFtX2lkICogaW5jcjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gemVyby10cmlwIGxvb3AKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIGlmKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQgKSB7CisgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVuayA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmsgKyAoIHRlYW1faWQgPCBleHRyYXMgPyB0ZWFtX2lkIDogZXh0cmFzICkgKTsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmsgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgIC8vIENoZWNrL2NvcnJlY3QgYm91bmRzIGlmIG5lZWRlZAorICAgICAgICAgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyID4gdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSB1cHBlciAmJiAqcHVwcGVyIDwgdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyIDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIERpc3BhdGNoIHJvdXRpbmVzCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfZGlzcGF0Y2hfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgVCBsYiwgVCB1YiwgU1Qgc3QsIFNUIGNodW5rICkKK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHsKK0BwYXJhbSBsb2MgU291cmNlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCitAcGFyYW0gc2NoZWR1bGUgU2NoZWR1bGUgdHlwZQorQHBhcmFtIGxiICBMb3dlciBib3VuZAorQHBhcmFtIHViICBVcHBlciBib3VuZAorQHBhcmFtIHN0ICBTdGVwIChvciBpbmNyZW1lbnQgaWYgeW91IHByZWZlcikKK0BwYXJhbSBjaHVuayBUaGUgY2h1bmsgc2l6ZSB0byBibG9jayB3aXRoCisKK1RoaXMgZnVuY3Rpb24gcHJlcGFyZXMgdGhlIHJ1bnRpbWUgdG8gc3RhcnQgYSBkeW5hbWljYWxseSBzY2hlZHVsZWQgZm9yIGxvb3AsIHNhdmluZyB0aGUgbG9vcCBhcmd1bWVudHMuCitUaGVzZSBmdW5jdGlvbnMgYXJlIGFsbCBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgdHlwZXMgb2YgdGhlIGFyZ3VtZW50cy4KKyovCisKK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssIHRydWUgKTsKK30KKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGxiLCBrbXBfdWludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCBsYiwga21wX3VpbnQ2NCB1YiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgc3QsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDY0ID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2luaXRfNAorCitEaWZmZXJlbmNlIGZyb20gX19rbXBjX2Rpc3BhdGNoX2luaXQgc2V0IG9mIGZ1bmN0aW9ucyBpcyB0aGVzZSBmdW5jdGlvbnMKK2FyZSBjYWxsZWQgZm9yIGNvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGZvciBjb25zdHJ1Y3QuIFRodXMgYmVmb3JlCityZWd1bGFyIGl0ZXJhdGlvbnMgZGlzcGF0Y2hpbmcgd2UgbmVlZCB0byBjYWxjIHBlci10ZWFtIGl0ZXJhdGlvbiBzcGFjZS4KKworVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLwordm9pZAorX19rbXBjX2Rpc3RfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF9pbnQzMiBsYiwga21wX2ludDMyIHViLCBrbXBfaW50MzIgc3QsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF9kaXN0X2dldF9ib3VuZHM8IGttcF9pbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICBrbXBfaW50MzIgKnBfbGFzdCwga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCAmbGIsICZ1Yiwgc3QgKTsKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLCB0cnVlICk7Cit9CisKK3ZvaWQKK19fa21wY19kaXN0X2Rpc3BhdGNoX2luaXRfOCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwgZW51bSBzY2hlZF90eXBlIHNjaGVkdWxlLAorICAgIGttcF9pbnQzMiAqcF9sYXN0LCBrbXBfaW50NjQgbGIsIGttcF9pbnQ2NCB1Yiwga21wX2ludDY0IHN0LCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfZGlzdF9nZXRfYm91bmRzPCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsICZsYiwgJnViLCBzdCApOworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCit2b2lkCitfX2ttcGNfZGlzdF9kaXNwYXRjaF9pbml0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAga21wX2ludDMyICpwX2xhc3QsIGttcF91aW50NjQgbGIsIGttcF91aW50NjQgdWIsIGttcF9pbnQ2NCBzdCwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX2Rpc3RfZ2V0X2JvdW5kczwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgJmxiLCAmdWIsIHN0ICk7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywgdHJ1ZSApOworfQorCisvKiEKK0BwYXJhbSBsb2MgU291cmNlIGNvZGUgbG9jYXRpb24KK0BwYXJhbSBndGlkIEdsb2JhbCB0aHJlYWQgaWQKK0BwYXJhbSBwX2xhc3QgUG9pbnRlciB0byBhIGZsYWcgc2V0IHRvIG9uZSBpZiB0aGlzIGlzIHRoZSBsYXN0IGNodW5rIG9yIHplcm8gb3RoZXJ3aXNlCitAcGFyYW0gcF9sYiAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF91YiAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kIGZvciB0aGUgbmV4dCBjaHVuayBvZiB3b3JrCitAcGFyYW0gcF9zdCAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgdGhlIG5leHQgY2h1bmsgb2Ygd29yaworQHJldHVybiBvbmUgaWYgdGhlcmUgaXMgd29yayB0byBiZSBkb25lLCB6ZXJvIG90aGVyd2lzZQorCitHZXQgdGhlIG5leHQgZHluYW1pY2FsbHkgYWxsb2NhdGVkIGNodW5rIG9mIHdvcmsgZm9yIHRoaXMgdGhyZWFkLgorSWYgdGhlcmUgaXMgbm8gbW9yZSB3b3JrLCB0aGVuIHRoZSBsYix1YiBhbmQgc3RyaWRlIG5lZWQgbm90IGJlIG1vZGlmaWVkLgorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBfbGIsIGttcF9pbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0ICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX25leHRfNAorKi8KK2ludAorX19rbXBjX2Rpc3BhdGNoX25leHRfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAqcF9sYiwga21wX3VpbnQzMiAqcF91Yiwga21wX2ludDMyICpwX3N0ICkKK3sKKyAgICByZXR1cm4gX19rbXBfZGlzcGF0Y2hfbmV4dDwga21wX3VpbnQzMiA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF9pbnQ2NCA+KCBsb2MsIGd0aWQsIHBfbGFzdCwgcF9sYiwgcF91YiwgcF9zdCApOworfQorCisvKiEKK1NlZSBAcmVmIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyovCitpbnQKK19fa21wY19kaXNwYXRjaF9uZXh0Xzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgKnBfbGFzdCwKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF91aW50NjQgKnBfbGIsIGttcF91aW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCApCit7CisgICAgcmV0dXJuIF9fa21wX2Rpc3BhdGNoX25leHQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QgKTsKK30KKworLyohCitAcGFyYW0gbG9jIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gZ3RpZCBHbG9iYWwgdGhyZWFkIGlkCisKK01hcmsgdGhlIGVuZCBvZiBhIGR5bmFtaWMgbG9vcC4KKyovCit2b2lkCitfX2ttcGNfZGlzcGF0Y2hfZmluaV80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2g8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKKy8qIQorU2VlIEByZWYgX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNAorKi8KK3ZvaWQKK19fa21wY19kaXNwYXRjaF9maW5pXzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfNHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQzMiA+KCBndGlkLCBsb2MgKTsKK30KKworLyohCitTZWUgQHJlZiBfX2ttcGNfZGlzcGF0Y2hfZmluaV80CisqLwordm9pZAorX19rbXBjX2Rpc3BhdGNoX2ZpbmlfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2ZpbmlzaDwga21wX3VpbnQ2NCA+KCBndGlkLCBsb2MgKTsKK30KKy8qISBAfSAqLworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvL05vbi10ZW1wbGF0ZSByb3V0aW5lcyBmcm9tIGttcF9kaXNwYXRjaC5jIHVzZWQgaW4gb3RoZXIgc291cmNlcworCitrbXBfdWludDMyIF9fa21wX2VxXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA9PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX25lcV80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgIT0gY2hlY2tlcjsKK30KKwora21wX3VpbnQzMiBfX2ttcF9sdF80KCBrbXBfdWludDMyIHZhbHVlLCBrbXBfdWludDMyIGNoZWNrZXIpIHsKKyAgICByZXR1cm4gdmFsdWUgPCBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2dlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA+PSBjaGVja2VyOworfQorCitrbXBfdWludDMyIF9fa21wX2xlXzQoIGttcF91aW50MzIgdmFsdWUsIGttcF91aW50MzIgY2hlY2tlcikgeworICAgIHJldHVybiB2YWx1ZSA8PSBjaGVja2VyOworfQorCitrbXBfdWludDMyCitfX2ttcF93YWl0X3lpZWxkXzQodm9sYXRpbGUga21wX3VpbnQzMiAqIHNwaW5uZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAgICAgICAgICAgIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKiBwcmVkKSgga21wX3VpbnQzMiwga21wX3VpbnQzMiApCisgICAgICAgICAgICAgICAgICAgLCB2b2lkICAgICAgICAqIG9iaiAgICAvLyBIaWdoZXItbGV2ZWwgc3luY2hyb25pemF0aW9uIG9iamVjdCwgb3IgTlVMTC4KKyAgICAgICAgICAgICAgICAgICApCit7CisgICAgLy8gbm90ZTogd2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQKKyAgICByZWdpc3RlciB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgKiBzcGluICAgICAgICAgID0gc3Bpbm5lcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICBjaGVjayAgICAgICAgID0gY2hlY2tlcjsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgc3BpbnM7CisgICAgcmVnaXN0ZXIgICAgICAgICAga21wX3VpbnQzMiAoKmYpICgga21wX3VpbnQzMiwga21wX3VpbnQzMiApID0gcHJlZDsKKyAgICByZWdpc3RlciAgICAgICAgICBrbXBfdWludDMyICAgICAgICAgICByOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVCggb2JqLCAodm9pZCopIHNwaW4gKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAvLyBtYWluIHdhaXQgc3BpbiBsb29wCisgICAgd2hpbGUoIWYociA9IFRDUl80KCpzcGluKSwgY2hlY2spKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworICAgICAgICAvKiBHRUggLSByZW1vdmUgdGhpcyBzaW5jZSBpdCB3YXMgYWNjaWRlbnRhbGx5IGludHJvZHVjZWQgd2hlbiBrbXBfd2FpdCB3YXMgc3BsaXQuCisgICAgICAgICAgIEl0IGNhdXNlcyBwcm9ibGVtcyB3aXRoIGluZmluaXRlIHJlY3Vyc2lvbiBiZWNhdXNlIG9mIGV4aXQgbG9jayAqLworICAgICAgICAvKiBpZiAoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgJiYgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgIF9fa21wX2Fib3J0X3RocmVhZCgpOyAqLworCisgICAgICAgIC8qIGlmIHdlIGhhdmUgd2FpdGVkIGEgYml0LCBvciBhcmUgb3ZlcnN1YnNjcmliZWQsIHlpZWxkICovCisgICAgICAgIC8qIHBhdXNlIGlzIGluIHRoZSBmb2xsb3dpbmcgY29kZSAqLworICAgICAgICBLTVBfWUlFTEQoIFRDUl80KF9fa21wX250aCkgPiBfX2ttcF9hdmFpbF9wcm9jICk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOworICAgIH0KKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgcmV0dXJuIHI7Cit9CisKK3ZvaWQKK19fa21wX3dhaXRfeWllbGRfNF9wdHIodm9pZCAqc3Bpbm5lciwKKyAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyIGNoZWNrZXIsCisgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiAoKnByZWQpKCB2b2lkICosIGttcF91aW50MzIgKSwKKyAgICAgICAgICAgICAgICAgICB2b2lkICAgICAgICAqb2JqICAgIC8vIEhpZ2hlci1sZXZlbCBzeW5jaHJvbml6YXRpb24gb2JqZWN0LCBvciBOVUxMLgorICAgICAgICAgICAgICAgICAgICkKK3sKKyAgICAvLyBub3RlOiB3ZSBtYXkgbm90IGJlbG9uZyB0byBhIHRlYW0gYXQgdGhpcyBwb2ludAorICAgIHJlZ2lzdGVyIHZvaWQgICAgICAgICAgICAgICAgKnNwaW4gICAgICAgICAgPSBzcGlubmVyOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgICAgICAgIGNoZWNrICAgICAgICAgPSBjaGVja2VyOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgICAgICAgICAgIHNwaW5zOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgKCpmKSAoIHZvaWQgKiwga21wX3VpbnQzMiApID0gcHJlZDsKKworICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApOworICAgIEtNUF9JTklUX1lJRUxEKCBzcGlucyApOworICAgIC8vIG1haW4gd2FpdCBzcGluIGxvb3AKKyAgICB3aGlsZSAoICFmKCBzcGluLCBjaGVjayApICkgeworICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKTsKKyAgICAgICAgLyogaWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQsIG9yIGFyZSBvdmVyc3Vic2NyaWJlZCwgeWllbGQgKi8KKyAgICAgICAgLyogcGF1c2UgaXMgaW4gdGhlIGZvbGxvd2luZyBjb2RlICovCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoIF9fa21wX250aCApID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisgICAgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApOworfQorCit9IC8vIGV4dGVybiAiQyIKKworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbGIsIGttcF9pbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgc2NoZWR1bGUsIGxiLCB1Yiwgc3QsIGNodW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQzMiBsYiwga21wX3VpbnQzMiB1Yiwga21wX2ludDMyIHN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBjaHVuaywgaW50IHB1c2hfd3MgKQoreworICAgIF9fa21wX2Rpc3BhdGNoX2luaXQ8IGttcF91aW50MzIgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwdXNoX3dzICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9pbml0XzgoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQ2NCBsYiwga21wX2ludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgY2h1bmssIGludCBwdXNoX3dzICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBzY2hlZHVsZSwgbGIsIHViLCBzdCwgY2h1bmssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOHUoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGVudW0gc2NoZWRfdHlwZSBzY2hlZHVsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDY0IGxiLCBrbXBfdWludDY0IHViLCBrbXBfaW50NjQgc3QsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0IGNodW5rLCBpbnQgcHVzaF93cyApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfaW5pdDwga21wX3VpbnQ2NCA+KCBsb2MsIGd0aWQsIHNjaGVkdWxlLCBsYiwgdWIsIHN0LCBjaHVuaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1c2hfd3MgKTsKK30KKwordm9pZAorX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNCggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgX19rbXBfZGlzcGF0Y2hfZmluaXNoX2NodW5rPCBrbXBfdWludDMyID4oIGd0aWQsIGxvYyApOworfQorCit2b2lkCitfX2ttcF9hdXhfZGlzcGF0Y2hfZmluaV9jaHVua184KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50MzIgPiggZ3RpZCwgbG9jICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBfX2ttcF9kaXNwYXRjaF9maW5pc2hfY2h1bms8IGttcF91aW50NjQgPiggZ3RpZCwgbG9jICk7Cit9CisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRlN2NmOGMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmMKQEAgLTAsMCArMSw1OTYgQEAKKy8qCisgKiBrbXBfZW52aXJvbm1lbnQuYyAtLSBIYW5kbGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgV2UgdXNlIEdldEVudmlyb25tZW50VmFyaWFibGUgZm9yIFdpbmRvd3MqIE9TIGluc3RlYWQgb2YgZ2V0ZW52IGJlY2F1c2UgdGhlIGFjdCBvZgorICAgIGxvYWRpbmcgYSBETEwgb24gV2luZG93cyogT1MgbWFrZXMgYW55IHVzZXItc2V0IGVudmlyb25tZW50IHZhcmlhYmxlcyAoaS5lLiB3aXRoIHB1dGVudigpKQorICAgIHVuYXZhaWxhYmxlLiAgZ2V0ZW52KCkgYXBwYXJlbnRseSBnZXRzIGEgY2xlYW4gY29weSBvZiB0aGUgZW52IHZhcmlhYmxlcyBhcyB0aGV5IGV4aXN0ZWQKKyAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICBKSCAxMi8yMy8yMDAyCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT24gV2luZG93cyogT1MsIHRoZXJlIGFyZSB0d28gZW52aXJvbm1lbnRzIChhdCBsZWFzdCwgc2VlIGJlbG93KToKKworICAgICAgICAxLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4KKwkgICBBY2Nlc3NpYmxlIHRocm91Z2ggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpLAorICAgICAgICAgICBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCksIGFuZCBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKS4KKworICAgICAgICAyLiBFbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBBY2Nlc3NpYmxlIHRocm91Z2ggZ2V0ZW52KCksIHB1dGVudigpLgorCisgICAgcHV0ZW52KCkgZnVuY3Rpb24gdXBkYXRlcyBib3RoIEMgYW5kIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gZ2V0ZW52KCkgZnVuY3Rpb24KKyAgICBzZWFyY2ggZm9yIHZhcmlhYmxlcyBpbiBDIFJUTCBlbnZpcm9ubWVudCBvbmx5LiBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgZnVuY3Rpb25zIHdvcmsgKm9ubHkqCisgICAgd2l0aCBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuCisKKyAgICBXaW5kb3dzKiBPUyBvbiBJQS0zMiBhcmNoaXRlY3R1cmUgbWFpbnRhaW5lZCBieSBPUywgc28gdGhlcmUgaXMgYWx3YXlzIG9ubHkgb25lIFdpbmRvd3MqIE9TIG9uCisgICAgSUEtMzIgYXJjaGl0ZWN0dXJlIHBlciBwcm9jZXNzLiBDaGFuZ2VzIGluIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSBhcmUgcHJvY2Vzcy12aXNpYmxlLgorCisgICAgQyBlbnZpcm9ubWVudCBtYWludGFpbmVkIGJ5IEMgUlRMLiBNdWx0aXBsZSBjb3BpZXMgb2YgQyBSVEwgbWF5IGJlIHByZXNlbnQgaW4gdGhlIHByb2Nlc3MsIGFuZAorICAgIGVhY2ggQyBSVEwgbWFpbnRhaW5zIGl0cyBvd24gZW52aXJvbm1lbnQuIDotKAorCisgICAgVGh1cywgcHJvcGVyIHdheSB0byB3b3JrIHdpdGggZW52aXJvbm1lbnQgb24gV2luZG93cyogT1MgaXM6CisKKyAgICAgICAgMS4gU2V0IHZhcmlhYmxlcyB3aXRoIHB1dGVudigpIGZ1bmN0aW9uIC0tIGJvdGggQyBhbmQgV2luZG93cyogT1Mgb24KKwkgICBJQS0zMiBhcmNoaXRlY3R1cmUgYXJlIGJlaW5nIHVwZGF0ZWQuIFdpbmRvd3MqIE9TIG9uCisJICAgSUEtMzIgYXJjaGl0ZWN0dXJlIG1heSBiZSBjb25zaWRlcmVkIGFzIHByaW1hcnkgdGFyZ2V0LAorCSAgIHdoaWxlIHVwZGF0aW5nIEMgUlRMIGVudmlyb25tZW50IGlzIGEgZnJlZSBib251cy4KKworICAgICAgICAyLiBHZXQgdmFyaWFibGVzIHdpdGggR2V0RW52aXJvbm1lbnRWYXJpYWJsZSgpIC0tIGdldGVudigpIGRvZXMgbm90CisJICAgc2VhcmNoIFdpbmRvd3MqIE9TIG9uIElBLTMyIGFyY2hpdGVjdHVyZSwgYW5kIGNhbiBub3Qgc2VlIHZhcmlhYmxlcworCSAgIHNldCB3aXRoIFNldEVudmlyb25tZW50VmFyaWFibGUoKS4KKworICAgIDIwMDctMDQtMDUgLS0gbGV2CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaW5jbHVkZSAia21wX2Vudmlyb25tZW50LmgiCisKKyNpbmNsdWRlICJrbXBfb3MuaCIgICAgLy8gS01QX09TXyouCisjaW5jbHVkZSAia21wLmgiICAgICAgIC8vCisjaW5jbHVkZSAia21wX3N0ci5oIiAgIC8vIF9fa21wX3N0cl8qKCkuCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmIEtNUF9PU19VTklYCisgICAgI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAvLyBnZXRlbnYsIHNldGVudiwgdW5zZXRlbnYuCisgICAgI2luY2x1ZGUgPHN0cmluZy5oPiAgICAvLyBzdHJsZW4sIHN0cmNweS4KKyAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICAjaW5jbHVkZSA8Y3J0X2V4dGVybnMuaD4KKyAgICAgICAgI2RlZmluZSBlbnZpcm9uICgqX05TR2V0RW52aXJvbigpKQorICAgICNlbHNlCisgICAgICAgIGV4dGVybiBjaGFyICogKiBlbnZpcm9uOworICAgICNlbmRpZgorI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8d2luZG93cy5oPiAgIC8vIEdldEVudmlyb25tZW50VmFyaWFibGUsIFNldEVudmlyb25tZW50VmFyaWFibGUsIEdldExhc3RFcnJvci4KKyNlbHNlCisgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisjZW5kaWYKKworCisvLyBUT0RPOiBFbGltaW5hdGUgZGlyZWN0IG1lbW9yeSBhbGxvY2F0aW9ucywgdXNlIHN0cmluZyBvcGVyYXRpb25zIGluc3RlYWQuCisKK3N0YXRpYyBpbmxpbmUKK3ZvaWQgKgorYWxsb2NhdGUoCisgICAgc2l6ZV90IHNpemUKKykgeworICAgIHZvaWQgKiBwdHIgPSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKwlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gcHRyOworfSAvLyBhbGxvY2F0ZQorCisKK2NoYXIgKgorX19rbXBfZW52X2dldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICBjaGFyICogcmVzdWx0ID0gTlVMTDsKKworICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBnZXRlbnYoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IEtNUF9TVFJMRU4oIHZhbHVlICkgKyAxOworICAgICAgICAgICAgcmVzdWx0ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICk7CisgICAgICAgICAgICBpZiAoIHJlc3VsdCA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX1NUUk5DUFlfUyggcmVzdWx0LCBsZW4sIHZhbHVlLCBsZW4gKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKgorICAgICAgICAgICAgV2UgdXNlIEdldEVudmlyb25tZW50VmFyaWFibGUgZm9yIFdpbmRvd3MqIE9TIGluc3RlYWQgb2YgZ2V0ZW52IGJlY2F1c2UgdGhlIGFjdCBvZgorICAgICAgICAgICAgbG9hZGluZyBhIERMTCBvbiBXaW5kb3dzKiBPUyBtYWtlcyBhbnkgdXNlci1zZXQgZW52aXJvbm1lbnQgdmFyaWFibGVzIChpLmUuIHdpdGggcHV0ZW52KCkpCisgICAgICAgICAgICB1bmF2YWlsYWJsZS4gIGdldGVudigpIGFwcGFyZW50bHkgZ2V0cyBhIGNsZWFuIGNvcHkgb2YgdGhlIGVudiB2YXJpYWJsZXMgYXMgdGhleSBleGlzdGVkCisgICAgICAgICAgICBhdCB0aGUgc3RhcnQgb2YgdGhlIHJ1bi4KKyAgICAgICAgICAgIEpIIDEyLzIzLzIwMDIKKyAgICAgICAgKi8KKyAgICAgICAgRFdPUkQgcmM7CisgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKCBlcnJvciAhPSBFUlJPUl9FTlZWQVJfTk9UX0ZPVU5EICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAvLyBWYXJpYWJsZSBpcyBub3QgZm91bmQsIGl0J3Mgb2ssIGp1c3QgY29udGludWUuCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBEV09SRCBsZW4gPSByYzsKKyAgICAgICAgICAgIHJlc3VsdCA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGxlbiApOworICAgICAgICAgICAgaWYgKCByZXN1bHQgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgcmVzdWx0LCBsZW4gKTsKKyAgICAgICAgICAgIGlmICggISByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgbWF5IHJldHVybiAwIGlmIHZhcmlhYmxlIGlzIGVtcHR5LgorICAgICAgICAgICAgICAgIC8vIEluIHN1Y2ggYSBjYXNlIEdldExhc3RFcnJvcigpIHJldHVybnMgRVJST1JfU1VDQ0VTUy4KKyAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgIGlmICggZXJyb3IgIT0gRVJST1JfU1VDQ0VTUyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gVW5leHBlY3RlZCBlcnJvci4gVGhlIHZhcmlhYmxlIHNob3VsZCBiZSBpbiB0aGUgZW52aXJvbm1lbnQsCisgICAgICAgICAgICAgICAgICAgIC8vIGFuZCBidWZmZXIgc2hvdWxkIGJlIGxhcmdlIGVub3VnaC4KKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEdldEVudlZhciwgbmFtZSApLAorICAgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSByZXN1bHQgKTsKKyAgICAgICAgICAgICAgICAgICAgcmVzdWx0ID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworICAgIHJldHVybiByZXN1bHQ7CisKK30gLy8gZnVuYyBfX2ttcF9lbnZfZ2V0CisKKworLy8gVE9ETzogRmluZCBhbmQgcmVwbGFjZSBhbGwgcmVndWxhciBmcmVlKCkgd2l0aCBfX2ttcF9lbnZfZnJlZSgpLgorCit2b2lkCitfX2ttcF9lbnZfZnJlZSggY2hhciBjb25zdCAqICogdmFsdWUgKSB7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogdmFsdWUgKTsKKyAgICAqIHZhbHVlID0gTlVMTDsKKworfSAvLyBmdW5jIF9fa21wX2Vudl9mcmVlCisKKworCitpbnQKK19fa21wX2Vudl9leGlzdHMoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWx1ZSA9IGdldGVudiggbmFtZSApOworICAgICAgICByZXR1cm4gKCAoIHZhbHVlID09IE5VTEwgKSA/ICggMCApIDogKCAxICkgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBEV09SRCByYzsKKyAgICAgICAgcmMgPSBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCBOVUxMLCAwICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9leGlzdHMKKworCisKK3ZvaWQKK19fa21wX2Vudl9zZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIGludCBvdmVyd3JpdGUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgaW50IHJjID0gc2V0ZW52KCBuYW1lLCB2YWx1ZSwgb3ZlcndyaXRlICk7CisgICAgICAgIGlmICggcmMgIT0gMCApIHsKKyAgICAgICAgICAgIC8vIERlYWQgY29kZS4gSSB0cmllZCB0byBwdXQgdG9vIG1hbnkgdmFyaWFibGVzIGludG8gTGludXgqIE9TCisgICAgICAgICAgICAvLyBlbnZpcm9ubWVudCBvbiBJQS0zMiBhcmNoaXRlY3R1cmUuIFdoZW4gYXBwbGljYXRpb24gY29uc3VtZXMKKyAgICAgICAgICAgIC8vIG1vcmUgdGhhbiB+Mi41IEdCIG9mIG1lbW9yeSwgZW50aXJlIHN5c3RlbSBmZWVscyBiYWQuIFNvbWV0aW1lcworICAgICAgICAgICAgLy8gYXBwbGljYXRpb24gaXMga2lsbGVkIChieSBPUz8pLCBzb21ldGltZXMgc3lzdGVtIHN0b3BzCisgICAgICAgICAgICAvLyByZXNwb25kaW5nLi4uIEJ1dCB0aGlzIGVycm9yIG1lc3NhZ2UgbmV2ZXIgYXBwZWFycy4gLS1sbgorICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggTm90RW5vdWdoTWVtb3J5ICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VsaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgQk9PTCByYzsKKyAgICAgICAgaWYgKCAhIG92ZXJ3cml0ZSApIHsKKyAgICAgICAgICAgIHJjID0gR2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCwgMCApOworICAgICAgICAgICAgaWYgKCByYyApIHsKKyAgICAgICAgICAgICAgICAvLyBWYXJpYWJsZSBleGlzdHMsIGRvIG5vdCBvdmVyd3JpdGUuCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoIGVycm9yICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRHZXRFbnZWYXIsIG5hbWUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcmMgPSBTZXRFbnZpcm9ubWVudFZhcmlhYmxlKCBuYW1lLCB2YWx1ZSApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl9zZXQKKworCisKK3ZvaWQKK19fa21wX2Vudl91bnNldCggY2hhciBjb25zdCAqIG5hbWUgKSB7CisKKyAgICAjaWYgS01QX09TX1VOSVgKKyAgICAgICAgdW5zZXRlbnYoIG5hbWUgKTsKKyAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICBCT09MIHJjID0gU2V0RW52aXJvbm1lbnRWYXJpYWJsZSggbmFtZSwgTlVMTCApOworICAgICAgICBpZiAoICEgcmMgKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0RW52VmFyLCBuYW1lICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZWxzZQorICAgICAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyAgICAjZW5kaWYKKworfSAvLyBmdW5jIF9fa21wX2Vudl91bnNldAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgSW50ZWwgT3Blbk1QIFJUTCBzdHJpbmcgcmVwcmVzZW50YXRpb24gb2YgZW52aXJvbm1lbnQ6IGp1c3QgYSBzdHJpbmcgb2YgY2hhcmFjdGVycywgdmFyaWFibGVzCisgICAgYXJlIHNlcGFyYXRlZCB3aXRoIHZlcnRpY2FsIGJhcnMsIGUuIGcuOgorCisgICAgICAgICJLTVBfV0FSTklOR1M9MHxLTVBfQUZGSU5JVFk9Y29tcGFjdHwiCisKKyAgICBFbXB0eSB2YXJpYWJsZXMgYXJlIGFsbG93ZWQgYW5kIGlnbm9yZWQ6CisKKyAgICAgICAgInx8S01QX1dBUk5JTkdTPTF8fCIKKworKi8KKworc3RhdGljCit2b2lkCitfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBTdHJpbmcgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgY29uc3QgY2hyX2RlbGltaXRlciAgID0gJ3wnOworICAgIGNoYXIgY29uc3Qgc3RyX2RlbGltaXRlcltdID0geyBjaHJfZGVsaW1pdGVyLCAwIH07CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgICAgICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgICAgICAgPSBOVUxMOworICAgIGludCAgICAgICAgICAgICBjb3VudCAgICAgID0gMDsgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIGRlbGltaXRlcnMgPSAwOyAgLy8gTnVtYmVyIG9mIGRlbGltaXRlcnMgaW4gaW5wdXQgc3RyaW5nLgorCisgICAgLy8gQ29weSBvcmlnaW5hbCBzdHJpbmcsIHdlIHdpbGwgbW9kaWZ5IHRoZSBjb3B5LgorICAgIGJ1bGsgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBlbnYgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IGRlbGltaXRlcnMgKG1heGltdW0gbnVtYmVyIG9mIHZhcmlhYmxlcworICAgIC8vIGlzIG51bWJlciBvZiBkZWxpbWl0ZXJzIHBsdXMgb25lKS4KKyAgICB7CisgICAgICAgIGNoYXIgY29uc3QgKiBwdHIgPSBidWxrOworICAgICAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgICAgICBwdHIgPSBzdHJjaHIoIHB0ciwgY2hyX2RlbGltaXRlciApOworICAgICAgICAgICAgaWYgKCBwdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICArKyBkZWxpbWl0ZXJzOworICAgICAgICAgICAgcHRyICs9IDE7CisgICAgICAgIH07IC8vIGZvcmV2ZXIKKyAgICB9CisKKyAgICAvLyBBbGxvY2F0ZSB2YXJzIGFycmF5LgorICAgIHZhcnMgPSAoa21wX2Vudl92YXJfdCAqKSBhbGxvY2F0ZSggKCBkZWxpbWl0ZXJzICsgMSApICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcmlhYmxlcy4KKyAgICB7CisgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIHZhcmlhYmxlIChib3RoIG5hbWUgYW5kIHZhbHVlKS4KKyAgICAgICAgY2hhciAqIG5hbWU7ICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiB2YXJpYWJsZS4KKyAgICAgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisgICAgICAgIGNoYXIgKiBidWY7ICAgICAvLyBCdWZmZXIgZm9yIF9fa21wX3N0cl90b2tlbigpIGZ1bmN0aW9uLgorICAgICAgICB2YXIgPSBfX2ttcF9zdHJfdG9rZW4oIGJ1bGssIHN0cl9kZWxpbWl0ZXIsICYgYnVmICk7ICAgICAgLy8gR2V0IHRoZSBmaXJzdCB2YXIuCisgICAgICAgIHdoaWxlICggdmFyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNvdW50IDwgZGVsaW1pdGVycyArIDEgKTsKKyAgICAgICAgICAgIHZhcnNbIGNvdW50IF0ubmFtZSAgPSBuYW1lOworICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdmFyLgorICAgICAgICAgICAgdmFyID0gX19rbXBfc3RyX3Rva2VuKCBOVUxMLCBzdHJfZGVsaW1pdGVyLCAmIGJ1ZiApOworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEZpbGwgb3V0IHJlc3VsdC4KKyAgICBibG9jay0+YnVsayAgPSBidWxrOworICAgIGJsb2NrLT52YXJzICA9IHZhcnM7CisgICAgYmxvY2stPmNvdW50ID0gY291bnQ7CisKK307IC8vIF9fX2ttcF9lbnZfYmxrX3BhcnNlX3N0cmluZworCisKKworLyoKKyAgICBXaW5kb3dzKiBPUyAoYWN0dWFsbHksIERPUykgZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBwaWVjZSBvZiBtZW1vcnkgd2l0aCBlbnZpcm9ubWVudCB2YXJpYWJsZXMuIEVhY2gKKyAgICB2YXJpYWJsZSBpcyB0ZXJtaW5hdGVkIHdpdGggemVybyBieXRlLCBlbnRpcmUgYmxvY2sgaXMgdGVybWluYXRlZCB3aXRoIG9uZSBleHRyYSB6ZXJvIGJ5dGUsIHNvCisgICAgd2UgaGF2ZSB0d28gemVybyBieXRlcyBhdCB0aGUgZW5kIG9mIGVudmlyb25tZW50IGJsb2NrLCBlLiBnLjoKKworICAgICAgICAiSE9NRT1DOlxcdXNlcnNcXGxldlx4MDBPUz1XaW5kb3dzX05UXHgwMFx4MDAiCisKKyAgICBJdCBpcyBub3QgY2xlYXIgaG93IGVtcHR5IGVudmlyb25tZW50IGlzIHJlcHJlc2VudGVkLiAiXHgwMFx4MDAiPworKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCitzdGF0aWMKK3ZvaWQKK19fX2ttcF9lbnZfYmxrX3BhcnNlX3dpbmRvd3MoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgIC8vIE06IEVudiBibG9jayB0byBmaWxsLgorICAgIGNoYXIgY29uc3QgKiAgICBlbnYgICAgICAvLyBJOiBQb2ludGVyIHRvIFdpbmRvd3MqIE9TIChET1MpIGVudmlyb25tZW50IGJsb2NrLgorKSB7CisKKyAgICBjaGFyICogICAgICAgICAgYnVsayAgPSBOVUxMOworICAgIGttcF9lbnZfdmFyX3QgKiB2YXJzICA9IE5VTEw7CisgICAgaW50ICAgICAgICAgICAgIGNvdW50ID0gMDsgICAgIC8vIE51bWJlciBvZiB1c2VkIGVsZW1lbnRzIGluIHZhcnMgYXJyYXkuCisgICAgaW50ICAgICAgICAgICAgIHNpemUgID0gMDsgICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIGNoYXIgKiBuYW1lOyAgICAvLyBQb2ludGVyIHRvIG5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciAqIHZhbHVlOyAgIC8vIFBvaW50ZXIgdG8gdmFsdWUuCisKKyAgICBpZiAoIGVudiAhPSBOVUxMICkgeworCisgICAgICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMgaW4gZW52aXJvbm1lbnQgYmxvY2suIENvdW50IHZhcmlhYmxlcywgZmluZCBzaXplIG9mIGJsb2NrLgorICAgICAgICB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICAgICAgaW50ICAgICAgICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgICAgIGNvdW50ID0gMDsKKyAgICAgICAgICAgIHZhciA9IGVudjsgICAgICAgICAgICAvLyBUaGUgZmlyc3QgdmFyaWFibGUgc3RhcnRzIGFuZCBiZWdpbm5pbmcgb2YgZW52aXJvbm1lbnQgYmxvY2suCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIHdoaWxlICggbGVuICE9IDAgKSB7CisgICAgICAgICAgICAgICAgKysgY291bnQ7CisgICAgICAgICAgICAgICAgc2l6ZSA9IHNpemUgKyBsZW4gKyAxOworICAgICAgICAgICAgICAgIHZhciA9IHZhciArIGxlbiArIDE7IC8vIE1vdmUgcG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIHRoZSBuZXh0IHZhcmlhYmxlLgorICAgICAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIHNpemUgPSBzaXplICsgMTsgICAgICAgICAvLyBUb3RhbCBzaXplIG9mIGVudiBibG9jaywgaW5jbHVkaW5nIHRlcm1pbmF0aW5nIHplcm8gYnl0ZS4KKyAgICAgICAgfQorCisgICAgICAgIC8vIENvcHkgb3JpZ2luYWwgYmxvY2sgdG8gYnVsaywgd2Ugd2lsbCBtb2RpZnkgYnVsaywgbm90IG9yaWdpbmFsIGJsb2NrLgorICAgICAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICAgICAgS01QX01FTUNQWV9TKCBidWxrLCBzaXplLCBlbnYsIHNpemUgKTsKKyAgICAgICAgLy8gQWxsb2NhdGUgdmFycyBhcnJheS4KKyAgICAgICAgdmFycyA9IChrbXBfZW52X3Zhcl90ICopIGFsbG9jYXRlKCBjb3VudCAqIHNpemVvZigga21wX2Vudl92YXJfdCApICk7CisKKyAgICAgICAgLy8gTG9vcCB0aHJ1IGFsbCB0aGUgdmFycywgbm93IGluIGJ1bGsuCisgICAgICAgIHsKKyAgICAgICAgICAgIGNoYXIgKiB2YXI7ICAgICAvLyBQb2ludGVyIHRvIGJlZ2lubmluZyBvZiB2YXIuCisgICAgICAgICAgICBpbnQgICAgbGVuOyAgICAgLy8gTGVuZ3RoIG9mIHZhcmlhYmxlLgorICAgICAgICAgICAgY291bnQgPSAwOworICAgICAgICAgICAgdmFyID0gYnVsazsKKyAgICAgICAgICAgIGxlbiA9IEtNUF9TVFJMRU4oIHZhciApOworICAgICAgICAgICAgd2hpbGUgKCBsZW4gIT0gMCApIHsKKyAgICAgICAgICAgICAgICAvLyBTYXZlIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB2YXIsICc9JywgJiBuYW1lLCAmIHZhbHVlICk7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICAgICAgdmFyc1sgY291bnQgXS52YWx1ZSA9IHZhbHVlOworICAgICAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB2YXIuCisgICAgICAgICAgICAgICAgdmFyID0gdmFyICsgbGVuICsgMTsKKyAgICAgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCB2YXIgKTsKKyAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgIH0KKworICAgIH07IC8vIGlmCisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV93aW5kb3dzCisjZW5kaWYKKworCisvKgorICAgIFVuaXggZW52aXJvbm1lbnQgYmxvY2sgaXMgYSBhcnJheSBvZiBwb2ludGVycyB0byB2YXJpYWJsZXMsIGxhc3QgcG9pbnRlciBpbiBhcnJheSBpcyBOVUxMOgorCisgICAgICAgIHsgIkhPTUU9L2hvbWUvbGV2IiwgIlRFUk09eHRlcm0iLCBOVUxMIH0KKyovCisKK3N0YXRpYwordm9pZAorX19fa21wX2Vudl9ibGtfcGFyc2VfdW5peCgKKyAgICBrbXBfZW52X2Jsa190ICogYmxvY2ssICAgLy8gTTogRW52IGJsb2NrIHRvIGZpbGwuCisgICAgY2hhciAqICogICAgICAgIGVudiAgICAgIC8vIEk6IFVuaXggZW52aXJvbm1lbnQgdG8gcGFyc2UuCispIHsKKworICAgIGNoYXIgKiAgICAgICAgICBidWxrICA9IE5VTEw7CisgICAga21wX2Vudl92YXJfdCAqIHZhcnMgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgY291bnQgPSAwOworICAgIGludCAgICAgICAgICAgICBzaXplICA9IDA7ICAgIC8vIFNpemUgb2YgYnVsay4KKworICAgIC8vIENvdW50IG51bWJlciBvZiB2YXJpYWJsZXMgYW5kIGxlbmd0aCBvZiByZXF1aXJlZCBidWxrLgorICAgIHsKKyAgICAgICAgY291bnQgPSAwOworICAgICAgICBzaXplICA9IDA7CisgICAgICAgIHdoaWxlICggZW52WyBjb3VudCBdICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzaXplICs9IEtNUF9TVFJMRU4oIGVudlsgY291bnQgXSApICsgMTsKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9OyAvLyB3aGlsZQorICAgIH0KKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBidWxrID0gKGNoYXIgKikgYWxsb2NhdGUoIHNpemUgKTsKKyAgICB2YXJzID0gKGttcF9lbnZfdmFyX3QgKikgYWxsb2NhdGUoIGNvdW50ICogc2l6ZW9mKCBrbXBfZW52X3Zhcl90ICkgKTsKKworICAgIC8vIExvb3AgdGhydSBhbGwgdGhlIHZhcnMuCisgICAgeworICAgICAgICBjaGFyICogdmFyOyAgICAgLy8gUG9pbnRlciB0byBiZWdpbm5pbmcgb2YgdmFyLgorICAgICAgICBjaGFyICogbmFtZTsgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHZhcmlhYmxlLgorICAgICAgICBjaGFyICogdmFsdWU7ICAgLy8gUG9pbnRlciB0byB2YWx1ZS4KKyAgICAgICAgaW50ICAgIGxlbjsgICAgIC8vIExlbmd0aCBvZiB2YXJpYWJsZS4KKyAgICAgICAgaW50ICAgIGk7CisgICAgICAgIHZhciA9IGJ1bGs7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgY291bnQ7ICsrIGkgKSB7CisgICAgICAgICAgICAvLyBDb3B5IHZhcmlhYmxlIHRvIGJ1bGsuCisgICAgICAgICAgICBsZW4gPSBLTVBfU1RSTEVOKCBlbnZbIGkgXSApOworICAgICAgICAgICAgS01QX01FTUNQWV9TKCB2YXIsIHNpemUsIGVudlsgaSBdLCBsZW4gKyAxICk7CisgICAgICAgICAgICAvLyBTYXZlIGZvdW5kIHZhcmlhYmxlIGluIHZhcnMgYXJyYXkuCisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHZhciwgJz0nLCAmIG5hbWUsICYgdmFsdWUgKTsKKyAgICAgICAgICAgIHZhcnNbIGkgXS5uYW1lICA9IG5hbWU7CisgICAgICAgICAgICB2YXJzWyBpIF0udmFsdWUgPSB2YWx1ZTsKKyAgICAgICAgICAgIC8vIE1vdmUgcG9pbnRlci4KKyAgICAgICAgICAgIHZhciArPSBsZW4gKyAxOworICAgICAgICB9OyAvLyBmb3IKKyAgICB9CisKKyAgICAvLyBGaWxsIG91dCByZXN1bHQuCisgICAgYmxvY2stPmJ1bGsgID0gYnVsazsKKyAgICBibG9jay0+dmFycyAgPSB2YXJzOworICAgIGJsb2NrLT5jb3VudCA9IGNvdW50OworCit9OyAvLyBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4CisKKworCit2b2lkCitfX2ttcF9lbnZfYmxrX2luaXQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAgLy8gTTogQmxvY2sgdG8gaW5pdGlhbGl6ZS4KKyAgICBjaGFyIGNvbnN0ICogICAgYnVsayAgICAvLyBJOiBJbml0aWFsaXphdGlvbiBzdHJpbmcsIG9yIE5VTEwuCispIHsKKworICAgIGlmICggYnVsayAhPSBOVUxMICkgeworICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV9zdHJpbmcoIGJsb2NrLCBidWxrICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgICAgICBfX19rbXBfZW52X2Jsa19wYXJzZV91bml4KCBibG9jaywgZW52aXJvbiApOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGNoYXIgKiBtZW0gPSBHZXRFbnZpcm9ubWVudFN0cmluZ3MoKTsKKyAgICAgICAgICAgICAgICBpZiAoIG1lbSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50R2V0RW52aXJvbm1lbnQgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgX19fa21wX2Vudl9ibGtfcGFyc2Vfd2luZG93cyggYmxvY2ssIG1lbSApOworICAgICAgICAgICAgICAgIEZyZWVFbnZpcm9ubWVudFN0cmluZ3MoIG1lbSApOworICAgICAgICAgICAgfQorICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisgICAgICAgICNlbmRpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfZW52X2Jsa19pbml0CisKKworCitzdGF0aWMKK2ludAorX19fa21wX2Vudl92YXJfY21wKCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIENvbXBhcmlzb24gZnVuY3Rpb24gZm9yIHFzb3J0KCkuCisgICAga21wX2Vudl92YXJfdCBjb25zdCAqIGxocywKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogcmhzCispIHsKKyAgICByZXR1cm4gc3RyY21wKCBsaHMtPm5hbWUsIHJocy0+bmFtZSApOworfQorCit2b2lkCitfX2ttcF9lbnZfYmxrX3NvcnQoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrICAvLyBNOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMgdG8gc29ydC4KKykgeworCisgICAgcXNvcnQoCisgICAgICAgICh2b2lkICopIGJsb2NrLT52YXJzLAorICAgICAgICBibG9jay0+Y291bnQsCisgICAgICAgIHNpemVvZigga21wX2Vudl92YXJfdCApLAorICAgICAgICAoIGludCAoICogKSggdm9pZCBjb25zdCAqLCB2b2lkIGNvbnN0ICogKSApICYgX19fa21wX2Vudl92YXJfY21wCisgICAgKTsKKworfSAvLyBfX2ttcF9lbnZfYmxvY2tfc29ydAorCisKKwordm9pZAorX19rbXBfZW52X2Jsa19mcmVlKAorICAgIGttcF9lbnZfYmxrX3QgKiBibG9jayAgLy8gTTogQmxvY2sgb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIHRvIGZyZWUuCispIHsKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+dmFycyApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBibG9jay0+YnVsayApOworCisgICAgYmxvY2stPmNvdW50ID0gMDsKKyAgICBibG9jay0+dmFycyAgPSBOVUxMOworICAgIGJsb2NrLT5idWxrICA9IE5VTEw7CisKK30gLy8gX19rbXBfZW52X2Jsa19mcmVlCisKKworCitjaGFyIGNvbnN0ICogICAgICAgICAgICAgICAvLyBSOiBWYWx1ZSBvZiB2YXJpYWJsZSBvciBOVUxMIGlmIHZhcmlhYmxlIGRvZXMgbm90IGV4aXN0LgorX19rbXBfZW52X2Jsa192YXIoCisgICAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCAvLyBJOiBCbG9jayBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZXMuCisgICAgY2hhciBjb25zdCAqICAgIG5hbWUgICAvLyBJOiBOYW1lIG9mIHZhcmlhYmxlIHRvIGZpbmQuCispIHsKKworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2stPmNvdW50OyArKyBpICkgeworICAgICAgICBpZiAoIHN0cmNtcCggYmxvY2stPnZhcnNbIGkgXS5uYW1lLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiBibG9jay0+dmFyc1sgaSBdLnZhbHVlOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorICAgIHJldHVybiBOVUxMOworCit9IC8vIF9fa21wX2Vudl9ibG9ja192YXIKKworCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lbnZpcm9ubWVudC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI0M2I1NDcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Vudmlyb25tZW50LmgKQEAgLTAsMCArMSw4MSBAQAorLyoKKyAqIGttcF9lbnZpcm9ubWVudC5oIC0tIEhhbmRsZSBlbnZpcm9ubWVudCB2YXJvaWFibGVzIE9TLWluZGVwZW5kZW50bHkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0VOVklST05NRU5UX0gKKyNkZWZpbmUgS01QX0VOVklST05NRU5UX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvLyBSZXR1cm4gYSBjb3B5IG9mIHRoZSB2YWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSBvciBOVUxMIGlmIHRoZSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdC4KKy8vICpOb3RlKjogUmV0dXJuZWQgcG9pbnRlZCAqbXVzdCogYmUgZnJlZWQgYWZ0ZXIgdXNlIHdpdGggX19rbXBfZW52X2ZyZWUoKS4KK2NoYXIgKiBfX2ttcF9lbnZfZ2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOwordm9pZCAgIF9fa21wX2Vudl9mcmVlKCBjaGFyIGNvbnN0ICogKiB2YWx1ZSApOworCisvLyBSZXR1cm4gMSBpZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZXhpc3RzIG9yIDAgaWYgZG9lcyBub3QgZXhpc3QuCitpbnQgX19rbXBfZW52X2V4aXN0cyggY2hhciBjb25zdCAqIG5hbWUgKTsKKworLy8gU2V0IHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3NldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgaW50IG92ZXJ3cml0ZSApOworCisvLyBVbnNldCAocmVtb3ZlKSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KK3ZvaWQgX19rbXBfZW52X3Vuc2V0KCBjaGFyIGNvbnN0ICogbmFtZSApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBXb3JraW5nIHdpdGggZW52aXJvbm1lbnQgYmxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvKgorICAgIGttcF9lbnZfYmxrX3QgaXMgcmVhZC1vbmx5IGNvbGxlY3Rpb24gb2YgZW52aXJvbm1lbnQgdmFyaWFibGVzIChvciBlbnZpcm9ubWVudC1saWtlKS4gVXNhZ2U6CisKKyAgICAgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBOVUxMICk7IC8vIEluaXRpYWxpemUgYmxvY2sgZnJvbSBwcm9jZXNzIGVudmlyb25tZW50LgorICAgICAgICAvLyBvcgorICAgICAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssICJLTVBfV0FSTklORz0xfEtNUF9BRkZJTklUWT1ub25lIiApOyAvLyBmcm9tIHN0cmluZy4KKyAgICAgICAgX19rbXBfZW52X2Jsa19zb3J0KCAmIGJsb2NrICk7IC8vIE9wdGlvbmFsbHksIHNvcnQgbGlzdC4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgICAgIC8vIFByb2Nlc3MgYmxvY2sudmFyc1sgaSBdLm5hbWUgYW5kIGJsb2NrLnZhcnNbIGkgXS52YWx1ZS4uLgorICAgICAgICB9OyAvLyBmb3IgaQorICAgICAgICBfX2ttcF9lbnZfYmxvY2tfZnJlZSggJiBibG9jayApOworKi8KKworc3RydWN0IF9fa21wX2Vudl92YXIgeworICAgIGNoYXIgY29uc3QgKiBuYW1lOworICAgIGNoYXIgY29uc3QgKiB2YWx1ZTsKK307Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9lbnZfdmFyIGttcF9lbnZfdmFyX3Q7CisKK3N0cnVjdCBfX2ttcF9lbnZfYmxrIHsKKyAgICBjaGFyIGNvbnN0ICogICAgICAgICAgYnVsazsKKyAgICBrbXBfZW52X3Zhcl90IGNvbnN0ICogdmFyczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgY291bnQ7Cit9OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfZW52X2JsayBrbXBfZW52X2Jsa190OworCit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19pbml0KCBrbXBfZW52X2Jsa190ICogYmxvY2ssIGNoYXIgY29uc3QgKiBidWxrICk7Cit2b2lkICAgICAgICAgX19rbXBfZW52X2Jsa19mcmVlKCBrbXBfZW52X2Jsa190ICogYmxvY2sgKTsKK3ZvaWQgICAgICAgICBfX2ttcF9lbnZfYmxrX3NvcnQoIGttcF9lbnZfYmxrX3QgKiBibG9jayApOworY2hhciBjb25zdCAqIF9fa21wX2Vudl9ibGtfdmFyKCAga21wX2Vudl9ibGtfdCAqIGJsb2NrLCBjaGFyIGNvbnN0ICogbmFtZSApOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX0VOVklST05NRU5UX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9lcnJvci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjY4NjZkZjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Vycm9yLmMKQEAgLTAsMCArMSw1MjMgQEAKKy8qCisgKiBrbXBfZXJyb3IuYyAtLSBLUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2Vycm9yLmgiCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgTUlOX1NUQUNLICAgICAgIDEwMAorCisKK3N0YXRpYyBjaGFyIGNvbnN0ICogY29uc190ZXh0X2NbXSA9IHsKKyAgICAiKG5vbmUpIiwKKyAgICAiXCJwYXJhbGxlbFwiIiwKKyAgICAid29yay1zaGFyaW5nIiwgICAgICAgICAgICAgLyogdGhpcyBpcyBub3QgY2FsbGVkICJmb3IiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwib3JkZXJlZFwiIHdvcmstc2hhcmluZyIsIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAiZm9yIG9yZGVyZWQiIGJlY2F1c2Ugb2YgbG93ZXJpbmcgb2YgInNlY3Rpb25zIiBwcmFnbWFzICovCisgICAgIlwic2VjdGlvbnNcIiIsCisgICAgIndvcmstc2hhcmluZyIsICAgICAgICAgICAgIC8qIHRoaXMgaXMgbm90IGNhbGxlZCAic2luZ2xlIiBiZWNhdXNlIG9mIGxvd2VyaW5nIG9mICJzZWN0aW9ucyIgcHJhZ21hcyAqLworICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txXCIiLAorICAgICJcInRhc2txIG9yZGVyZWRcIiIsCisgICAgIlwiY3JpdGljYWxcIiIsCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBBUkFMTEVMICovCisgICAgIlwib3JkZXJlZFwiIiwgICAgICAgICAgICAgIC8qIGluIFBETyAqLworICAgICJcIm9yZGVyZWRcIiIsICAgICAgICAgICAgICAvKiBpbiBUQVNLUSAqLworICAgICJcIm1hc3RlclwiIiwKKyAgICAiXCJyZWR1Y2VcIiIsCisgICAgIlwiYmFycmllclwiIgorfTsKKworI2RlZmluZSBnZXRfc3JjKCBpZGVudCApICAgKCAoaWRlbnQpID09IE5VTEwgPyBOVUxMIDogKGlkZW50KS0+cHNvdXJjZSApCisKKyNkZWZpbmUgUFVTSF9NU0coIGN0LCBpZGVudCApIFwKKyAgICAiXHRwdXNoaW5nIG9uIHN0YWNrOiAlcyAoJXMpXG4iLCBjb25zX3RleHRfY1sgKGN0KSBdLCBnZXRfc3JjKCAoaWRlbnQpICkKKyNkZWZpbmUgUE9QX01TRyggcCApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAiXHRwb3BwaW5nIG9mZiBzdGFjazogJXMgKCVzKVxuIiwgICAgICAgICAgICAgICAgIFwKKyAgICBjb25zX3RleHRfY1sgKHApLT5zdGFja19kYXRhWyB0b3MgXS50eXBlIF0sICAgICAgIFwKKyAgICBnZXRfc3JjKCAocCktPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ICkKKworc3RhdGljIGludCBjb25zdCBjb25zX3RleHRfY19udW0gICAgPSBzaXplb2YoIGNvbnNfdGV4dF9jICAgICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLSBTVEFSVCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9jaGVja19udWxsX2Z1bmMoIHZvaWQgKQoreworICAgIC8qIG5vdGhpbmcgdG8gZG8gKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBpbnQgZ3RpZCwgc3RydWN0IGNvbnNfaGVhZGVyICpwICkKK3sKKyAgICBpbnQgICAgaTsKKyAgICBzdHJ1Y3QgY29uc19kYXRhICpkOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmIChndGlkIDwgMCkKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiZXhwYW5kIGNvbnNfc3RhY2sgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBkID0gcC0+c3RhY2tfZGF0YTsKKworICAgIHAtPnN0YWNrX3NpemUgPSAocC0+c3RhY2tfc2l6ZSAqIDIpICsgMTAwOworCisgICAgLyogVE9ETyBmcmVlIHRoZSBvbGQgZGF0YSAqLworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAocC0+c3RhY2tfc2l6ZSsxKSApOworCisgICAgZm9yIChpID0gcC0+c3RhY2tfdG9wOyBpID49IDA7IC0taSkKKyAgICAgICAgcC0+c3RhY2tfZGF0YVtpXSA9IGRbaV07CisKKyAgICAvKiBOT1RFOiB3ZSBkbyBub3QgZnJlZSB0aGUgb2xkIHN0YWNrX2RhdGEgKi8KK30KKworLy8gTk9URTogRnVuY3Rpb24gcmV0dXJucyBhbGxvY2F0ZWQgbWVtb3J5LCBjYWxsZXIgbXVzdCBmcmVlIGl0IQorc3RhdGljIGNoYXIgY29uc3QgKgorX19rbXBfcHJhZ21hKAorICAgIGludCAgICAgICAgICAgICAgY3QsCisgICAgaWRlbnRfdCBjb25zdCAqICBpZGVudAorKSB7CisgICAgY2hhciBjb25zdCAqIGNvbnMgPSBOVUxMOyAgLy8gQ29uc3RydWN0IG5hbWUuCisgICAgY2hhciAqIGZpbGUgPSBOVUxMOyAgLy8gRmlsZSBuYW1lLgorICAgIGNoYXIgKiBmdW5jID0gTlVMTDsgIC8vIEZ1bmN0aW9uIChyb3V0aW5lKSBuYW1lLgorICAgIGNoYXIgKiBsaW5lID0gTlVMTDsgIC8vIExpbmUgbnVtYmVyLgorICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworICAgIGttcF9tc2dfdCAgICAgcHJnbTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisgICAgaWYgKCAwIDwgY3QgJiYgY3QgPCBjb25zX3RleHRfY19udW0gKSB7CisgICAgICAgIGNvbnMgPSBjb25zX3RleHRfY1sgY3QgXTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgfTsKKyAgICBpZiAoIGlkZW50ICE9IE5VTEwgJiYgaWRlbnQtPnBzb3VyY2UgIT0gTlVMTCApIHsKKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzIiwgaWRlbnQtPnBzb3VyY2UgKTsgLy8gQ29weSBzb3VyY2UgdG8gYnVmZmVyLgorICAgICAgICAvLyBTcGxpdCBzdHJpbmcgaW4gYnVmZmVyIHRvIGZpbGUsIGZ1bmMsIGFuZCBsaW5lLgorICAgICAgICB0YWlsID0gYnVmZmVyLnN0cjsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsIE5VTEwsICAgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggdGFpbCwgJzsnLCAmIGZpbGUsICYgdGFpbCApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICc7JywgJiBmdW5jLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnOycsICYgbGluZSwgJiB0YWlsICk7CisgICAgfTsgLy8gaWYKKyAgICBwcmdtID0gX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fZm10X1ByYWdtYSwgY29ucywgZmlsZSwgZnVuYywgbGluZSApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKyAgICByZXR1cm4gcHJnbS5zdHI7Cit9IC8vIF9fa21wX3ByYWdtYQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tIEVORCBPRiBTVEFUSUMgTE9DQUwgUk9VVElORVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0KAorICAgIGttcF9pMThuX2lkX3QgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICBjdCwgICAgIC8vIENvbnN0cnVjdCB0eXBlLgorICAgIGlkZW50X3QgY29uc3QgKiAgaWRlbnQgICAvLyBDb25zdHJ1Y3QgaWRlbnQuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0ID0gX19rbXBfcHJhZ21hKCBjdCwgaWRlbnQgKTsKKyAgICBfX2ttcF9tc2coIGttcF9tc19mYXRhbCwgX19rbXBfbXNnX2Zvcm1hdCggaWQsIGNvbnN0cnVjdCApLCBfX2ttcF9tc2dfbnVsbCApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBjb25zdHJ1Y3QgKTsKK30KKwordm9pZAorX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICBrbXBfaTE4bl9pZF90ICAgICAgICAgICAgaWQsICAgICAvLyBNZXNzYWdlIGlkZW50aWZpZXIuCisgICAgZW51bSBjb25zX3R5cGUgICAgICAgICAgIGN0LCAgICAgLy8gRmlyc3QgY29uc3RydWN0IHR5cGUuCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgICAgIGlkZW50LCAgLy8gRmlyc3QgY29uc3RydWN0IGlkZW50LgorICAgIHN0cnVjdCBjb25zX2RhdGEgY29uc3QgKiBjb25zICAgIC8vIFNlY29uZCBjb25zdHJ1Y3QuCispIHsKKyAgICBjaGFyIGNvbnN0ICogY29uc3RydWN0MSA9IF9fa21wX3ByYWdtYSggY3QsIGlkZW50ICk7CisgICAgY2hhciBjb25zdCAqIGNvbnN0cnVjdDIgPSBfX2ttcF9wcmFnbWEoIGNvbnMtPnR5cGUsIGNvbnMtPmlkZW50ICk7CisgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIF9fa21wX21zZ19mb3JtYXQoIGlkLCBjb25zdHJ1Y3QxLCBjb25zdHJ1Y3QyICksIF9fa21wX21zZ19udWxsICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGNvbnN0cnVjdDEgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgY29uc3RydWN0MiApOworfQorCisKK3N0cnVjdCBjb25zX2hlYWRlciAqCitfX2ttcF9hbGxvY2F0ZV9jb25zX3N0YWNrKCBpbnQgZ3RpZCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwOworCisgICAgLyogVE9ETyBmb3IgbW9uaXRvciBwZXJoYXBzPyAqLworICAgIGlmICggZ3RpZCA8IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH07IC8vIGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoImFsbG9jYXRlIGNvbnNfc3RhY2sgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgcCA9IChzdHJ1Y3QgY29uc19oZWFkZXIgKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IGNvbnNfaGVhZGVyICkgKTsKKyAgICBwLT5wX3RvcCA9IHAtPndfdG9wID0gcC0+c190b3AgPSAwOworICAgIHAtPnN0YWNrX2RhdGEgPSAoc3RydWN0IGNvbnNfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgY29uc19kYXRhICkgKiAoTUlOX1NUQUNLKzEpICk7CisgICAgcC0+c3RhY2tfc2l6ZSA9IE1JTl9TVEFDSzsKKyAgICBwLT5zdGFja190b3AgID0gMDsKKyAgICBwLT5zdGFja19kYXRhWyAwIF0udHlwZSA9IGN0X25vbmU7CisgICAgcC0+c3RhY2tfZGF0YVsgMCBdLnByZXYgPSAwOworICAgIHAtPnN0YWNrX2RhdGFbIDAgXS5pZGVudCA9IE5VTEw7CisgICAgcmV0dXJuIHA7Cit9CisKK3ZvaWQKK19fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApIHsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwID0gKHN0cnVjdCBjb25zX2hlYWRlciAqKSBwdHI7CisgICAgaWYgKCBwICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggcC0+c3RhY2tfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggcC0+c3RhY2tfZGF0YSApOworICAgICAgICAgICAgcC0+c3RhY2tfZGF0YSA9IE5VTEw7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2ZyZWUoIHAgKTsKKyAgICB9OyAvLyBpZgorfQorCisKKyNpZiBLTVBfREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2NvbnNfc3RhY2soIGludCBndGlkLCBzdHJ1Y3QgY29uc19oZWFkZXIgKiBwICkgeworICAgIGludCBpOworICAgIGludCB0b3MgPSBwLT5zdGFja190b3A7CisgICAga21wX3N0cl9idWZfdCBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLVxuIiApOworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiQmVnaW4gY29uc3RydWN0IHN0YWNrIHdpdGggJWQgaXRlbXMgZm9yIHRocmVhZCAlZFxuIiwgdG9zLCBndGlkICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIgICAgIHN0YWNrX3RvcD0lZCB7IFA9JWQsIFc9JWQsIFM9JWQgfVxuIiwgdG9zLCBwLT5wX3RvcCwgcC0+d190b3AsIHAtPnNfdG9wICk7CisgICAgZm9yICggaSA9IHRvczsgaSA+IDA7IGktLSApIHsKKyAgICAgICAgc3RydWN0IGNvbnNfZGF0YSAqIGMgPSAmICggcC0+c3RhY2tfZGF0YVsgaSBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgICAgICBzdGFja19kYXRhWyUyZF0gPSB7ICVzICglcykgJWQgJXAgfVxuIiwgaSwgY29uc190ZXh0X2NbIGMtPnR5cGUgXSwgZ2V0X3NyYyggYy0+aWRlbnQgKSwgYy0+cHJldiwgYy0+bmFtZSApOworICAgIH07IC8vIGZvciBpCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJFbmQgY29uc3RydWN0IHN0YWNrIGZvciB0aHJlYWQgJWRcbiIsIGd0aWQgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIistKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy0rLSstKy1cbiIgKTsKKyAgICBfX2ttcF9kZWJ1Z19wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfcHVzaF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0tPiB0aC50aF9jb25zICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfcGFyYWxsZWwgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3RfcGFyYWxsZWwsIGlkZW50ICkgKSApOworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3RfcGFyYWxsZWw7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPnBfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+cF90b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorX19rbXBfY2hlY2tfd29ya3NoYXJlKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT4gdGgudGhfY29ucyApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja193b3Jrc2hhcmUgKCVkICVkKVxuIiwgZ3RpZCwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKworICAgIGlmICggcC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUgKSB7CisgICAgICAgIF9fa21wX2V4cGFuZF9jb25zX3N0YWNrKCBndGlkLCBwICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgJiYKKyAgICAgICAgIShJU19DT05TX1RZUEVfVEFTS1EocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSAmJiBJU19DT05TX1RZUEVfVEFTS1EoY3QpKSkgeworICAgICAgICAvLyBXZSBhcmUgYWxyZWFkeSBpbiBhIFdPUktTSEFSRSBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdICk7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHAtPnNfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8vIFdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uLgorICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsIGN0LCBpZGVudCwgJiBwLT5zdGFja19kYXRhWyBwLT5zX3RvcCBdICk7CisgICAgfTsgLy8gaWYKK30KKwordm9pZAorX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wdXNoX3dvcmtzaGFyZSAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGd0aWQsIGN0LCBpZGVudCApOworICAgIEtFX1RSQUNFKCAxMDAsICggUFVTSF9NU0coIGN0LCBpZGVudCApICkgKTsKKyAgICB0b3MgPSArK3AtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Q7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldiA9IHAtPndfdG9wOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gaWRlbnQ7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0ubmFtZSA9IE5VTEw7CisgICAgcC0+d190b3AgPSB0b3M7CisgICAgS0VfRFVNUCggMTAwMCwgZHVtcF9jb25zX3N0YWNrKCBndGlkLCBwICkgKTsKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjaywga21wX3VpbnQzMiBzZXEgKQorI2Vsc2UKK19fa21wX2NoZWNrX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKKyNlbmRpZgoreworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19zeW5jIChndGlkPSVkKVxuIiwgX19rbXBfZ2V0X2d0aWQoKSApICk7CisKKyAgICBpZiAocC0+c3RhY2tfdG9wID49IHAtPnN0YWNrX3NpemUpCisgICAgICAgX19rbXBfZXhwYW5kX2NvbnNfc3RhY2soIGd0aWQsIHAgKTsKKworICAgIGlmIChjdCA9PSBjdF9vcmRlcmVkX2luX3BhcmFsbGVsIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fcGRvIHx8IGN0ID09IGN0X29yZGVyZWRfaW5fdGFza3EgKSB7CisgICAgICAgIGlmIChwLT53X3RvcCA8PSBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogd2UgYXJlIG5vdCBpbiBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICAgICAgICAgICAgICAvKiBkbyBub3QgcmVwb3J0IGVycm9yIG1lc3NhZ2VzIGZvciBQQVJBTExFTCBPUkRFUkVEICovCisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggY3QgPT0gY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNCb3VuZFRvV29ya3NoYXJpbmcsIGN0LCBpZGVudCApOworICAgICAgICAgICAgI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIGlmICghSVNfQ09OU19UWVBFX09SREVSRUQocC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXS50eXBlKSkgeworICAgICAgICAgICAgICAgIGlmIChwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGUgPT0gY3RfdGFza3EpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNOb3RJblRhc2tDb25zdHJ1Y3QsCisgICAgICAgICAgICAgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPndfdG9wIF0KKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc05vT3JkZXJlZENsYXVzZSwKKyAgICAgICAgICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wICYmIHAtPnNfdG9wID4gcC0+d190b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIHN5bmMgY29uc3RydWN0IHdoaWNoIGlzIGluc2lkZSBhIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgaW50IGluZGV4ID0gcC0+c190b3A7CisgICAgICAgICAgICBlbnVtIGNvbnNfdHlwZSBzdGFja190eXBlOworCisgICAgICAgICAgICBzdGFja190eXBlID0gcC0+c3RhY2tfZGF0YVsgaW5kZXggXS50eXBlOworCisgICAgICAgICAgICBpZiAoc3RhY2tfdHlwZSA9PSBjdF9jcml0aWNhbCB8fAorICAgICAgICAgICAgICAgICggKCBzdGFja190eXBlID09IGN0X29yZGVyZWRfaW5fcGFyYWxsZWwgfHwKKyAgICAgICAgICAgICAgICAgICAgc3RhY2tfdHlwZSA9PSBjdF9vcmRlcmVkX2luX3BkbyAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN0YWNrX3R5cGUgPT0gY3Rfb3JkZXJlZF9pbl90YXNrcSAgKSAmJiAgICAgLyogQyBkb2Vzbid0IGFsbG93IG5hbWVkIG9yZGVyZWQ7IG9yZGVyZWQgaW4gb3JkZXJlZCBnZXRzIGVycm9yICovCisgICAgICAgICAgICAgICAgIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0uaWRlbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAgICAocC0+c3RhY2tfZGF0YVsgaW5kZXggXS5pZGVudC0+ZmxhZ3MgJiBLTVBfSURFTlRfS01QQyApKSkgeworICAgICAgICAgICAgICAgIC8qIHdlIGFyZSBpbiBPUkRFUkVEIHdoaWNoIGlzIGluc2lkZSBhbiBPUkRFUkVEIG9yIENSSVRJQ0FMIGNvbnN0cnVjdCAqLworICAgICAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0KKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfY3JpdGljYWwgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgaWYgKCBsY2sgIT0gTlVMTCAmJiBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBsY2ssIHNlcSApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZWxzZQorICAgICAgICBpZiAoIGxjayAhPSBOVUxMICYmIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7ICAgIC8qIHRoaXMgc2FtZSB0aHJlYWQgYWxyZWFkeSBoYXMgbG9jayBmb3IgdGhpcyBjcml0aWNhbCBzZWN0aW9uICovCisjZW5kaWYKKyAgICAgICAgICAgIGludCBpbmRleCA9IHAtPnNfdG9wOworICAgICAgICAgICAgc3RydWN0IGNvbnNfZGF0YSBjb25zID0geyBOVUxMLCBjdF9jcml0aWNhbCwgMCwgTlVMTCB9OworICAgICAgICAgICAgLyogd2FsayB1cCBjb25zdHJ1Y3Qgc3RhY2sgYW5kIHRyeSB0byBmaW5kIGNyaXRpY2FsIHdpdGggbWF0Y2hpbmcgbmFtZSAqLworICAgICAgICAgICAgd2hpbGUgKCBpbmRleCAhPSAwICYmIHAtPnN0YWNrX2RhdGFbIGluZGV4IF0ubmFtZSAhPSBsY2sgKSB7CisgICAgICAgICAgICAgICAgaW5kZXggPSBwLT5zdGFja19kYXRhWyBpbmRleCBdLnByZXY7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGluZGV4ICE9IDAgKSB7CisgICAgICAgICAgICAgICAgLyogZm91bmQgbWF0Y2ggb24gdGhlIHN0YWNrIChtYXkgbm90IGFsd2F5cyBiZWNhdXNlIG9mIGludGVybGVhdmVkIGNyaXRpY2FsIGZvciBGb3J0cmFuKSAqLworICAgICAgICAgICAgICAgIGNvbnMgPSBwLT5zdGFja19kYXRhWyBpbmRleCBdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogd2UgYXJlIGluIENSSVRJQ0FMIHdoaWNoIGlzIGluc2lkZSBhIENSSVRJQ0FMIGNvbnN0cnVjdCBvZiB0aGUgc2FtZSBuYW1lICovCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKCBrbXBfaTE4bl9tc2dfQ25zTmVzdGluZ1NhbWVOYW1lLCBjdCwgaWRlbnQsICYgY29ucyApOworICAgICAgICB9CisgICAgfSBlbHNlIGlmICggY3QgPT0gY3RfbWFzdGVyIHx8IGN0ID09IGN0X3JlZHVjZSApIHsKKyAgICAgICAgaWYgKHAtPndfdG9wID4gcC0+cF90b3ApIHsKKyAgICAgICAgICAgIC8qIGluc2lkZSBhIFdPUktTSEFSSU5HIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNJbnZhbGlkTmVzdGluZywKKyAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgcC0+d190b3AgXQorICAgICAgICAgICApOworICAgICAgICB9CisgICAgICAgIGlmIChjdCA9PSBjdF9yZWR1Y2UgJiYgcC0+c190b3AgPiBwLT5wX3RvcCkgeworICAgICAgICAgICAgLyogaW5zaWRlIGEgYW5vdGhlciBTWU5DIGNvbnN0cnVjdCBmb3IgdGhpcyBQQVJBTExFTCByZWdpb24gKi8KKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKK30KKwordm9pZAorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9wdXNoX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50LCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfdWludDMyIHNlcSApCisjZWxzZQorX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIGxjayApCisjZW5kaWYKK3sKKyAgICBpbnQgICAgICAgICB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgS01QX0FTU0VSVCggZ3RpZCA9PSBfX2ttcF9nZXRfZ3RpZCgpICk7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3B1c2hfc3luYyAoZ3RpZD0lZClcbiIsIGd0aWQgKSApOworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfY2hlY2tfc3luYyggZ3RpZCwgY3QsIGlkZW50LCBsY2ssIHNlcSApOworI2Vsc2UKKyAgICBfX2ttcF9jaGVja19zeW5jKCBndGlkLCBjdCwgaWRlbnQsIGxjayApOworI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQVVNIX01TRyggY3QsIGlkZW50ICkgKSApOworICAgIHRvcyA9ICsrIHAtPnN0YWNrX3RvcDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlICA9IGN0OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnByZXYgID0gcC0+c190b3A7CisgICAgcC0+c3RhY2tfZGF0YVsgdG9zIF0uaWRlbnQgPSBpZGVudDsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5uYW1lICA9IGxjazsKKyAgICBwLT5zX3RvcCA9IHRvczsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcG9wX3BhcmFsbGVsKCBpbnQgZ3RpZCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICkKK3sKKyAgICBpbnQgdG9zOworICAgIHN0cnVjdCBjb25zX2hlYWRlciAqcCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfY29uczsKKyAgICB0b3MgPSBwLT5zdGFja190b3A7CisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wX3BvcF9wYXJhbGxlbCAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnBfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdF9wYXJhbGxlbCwgaWRlbnQgKTsKKyAgICB9CisgICAgaWYgKCB0b3MgIT0gcC0+cF90b3AgfHwgcC0+c3RhY2tfZGF0YVsgdG9zIF0udHlwZSAhPSBjdF9wYXJhbGxlbCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0X3BhcmFsbGVsLCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPnBfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworfQorCitlbnVtIGNvbnNfdHlwZQorX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKQoreworICAgIGludCB0b3M7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworCisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfd29ya3NoYXJlICglZCAlZClcbiIsIGd0aWQsIF9fa21wX2dldF9ndGlkKCkgKSApOworICAgIGlmICggdG9zID09IDAgfHwgcC0+d190b3AgPT0gMCApIHsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zRGV0ZWN0ZWRFbmQsIGN0LCBpZGVudCApOworICAgIH0KKworICAgIGlmICggdG9zICE9IHAtPndfdG9wIHx8CisgICAgICAgICAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgJiYKKyAgICAgICAgICAvKiBiZWxvdyBhcmUgdHdvIGV4Y2VwdGlvbnMgdG8gdGhlIHJ1bGUgdGhhdCBjb25zdHJ1Y3QgdHlwZXMgbXVzdCBtYXRjaCAqLworICAgICAgICAgICEgKCBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID09IGN0X3Bkb19vcmRlcmVkICYmIGN0ID09IGN0X3BkbyApICYmCisgICAgICAgICAgISAoIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPT0gY3RfdGFza19vcmRlcmVkICYmIGN0ID09IGN0X3Rhc2sgKQorICAgICAgICAgKQorICAgICAgICkgeworICAgICAgICBfX2ttcF9jaGVja19udWxsX2Z1bmMoKTsKKyAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0MigKKyAgICAgICAgICAgIGttcF9pMThuX21zZ19DbnNFeHBlY3RlZEVuZCwKKyAgICAgICAgICAgIGN0LCBpZGVudCwKKyAgICAgICAgICAgICYgcC0+c3RhY2tfZGF0YVsgdG9zIF0KKyAgICAgICAgKTsKKyAgICB9CisgICAgS0VfVFJBQ0UoIDEwMCwgKCBQT1BfTVNHKCBwICkgKSApOworICAgIHAtPndfdG9wID0gcC0+c3RhY2tfZGF0YVsgdG9zIF0ucHJldjsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS50eXBlID0gY3Rfbm9uZTsKKyAgICBwLT5zdGFja19kYXRhWyB0b3MgXS5pZGVudCA9IE5VTEw7CisgICAgcC0+c3RhY2tfdG9wID0gdG9zIC0gMTsKKyAgICBLRV9EVU1QKCAxMDAwLCBkdW1wX2NvbnNfc3RhY2soIGd0aWQsIHAgKSApOworICAgIHJldHVybiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdLnR5cGU7Cit9CisKK3ZvaWQKK19fa21wX3BvcF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgaW50IHRvczsKKyAgICBzdHJ1Y3QgY29uc19oZWFkZXIgKnAgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2NvbnM7CisgICAgdG9zID0gcC0+c3RhY2tfdG9wOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3Bfc3luYyAoJWQgJWQpXG4iLCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIHRvcyA9PSAwIHx8IHAtPnNfdG9wID09IDAgKSB7CisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0RldGVjdGVkRW5kLCBjdCwgaWRlbnQgKTsKKyAgICB9OworICAgIGlmICggdG9zICE9IHAtPnNfdG9wIHx8IHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgIT0gY3QgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0V4cGVjdGVkRW5kLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyB0b3MgXQorICAgICAgICApOworICAgIH07CisgICAgaWYgKCBndGlkIDwgMCApIHsKKyAgICAgICAgX19rbXBfY2hlY2tfbnVsbF9mdW5jKCk7CisgICAgfTsKKyAgICBLRV9UUkFDRSggMTAwLCAoIFBPUF9NU0coIHAgKSApICk7CisgICAgcC0+c190b3AgPSBwLT5zdGFja19kYXRhWyB0b3MgXS5wcmV2OworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLnR5cGUgPSBjdF9ub25lOworICAgIHAtPnN0YWNrX2RhdGFbIHRvcyBdLmlkZW50ID0gTlVMTDsKKyAgICBwLT5zdGFja190b3AgPSB0b3MgLSAxOworICAgIEtFX0RVTVAoIDEwMDAsIGR1bXBfY29uc19zdGFjayggZ3RpZCwgcCApICk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9jaGVja19iYXJyaWVyKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCApCit7CisgICAgc3RydWN0IGNvbnNfaGVhZGVyICpwID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9jb25zOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF9jaGVja19iYXJyaWVyIChsb2M6ICVwLCBndGlkOiAlZCAlZClcbiIsIGlkZW50LCBndGlkLCBfX2ttcF9nZXRfZ3RpZCgpICkgKTsKKyAgICBpZiAoIGlkZW50ICE9IDAgKSB7CisgICAgICAgIF9fa21wX2NoZWNrX251bGxfZnVuYygpOworICAgIH0KKyAgICBpZiAoIHAtPndfdG9wID4gcC0+cF90b3AgKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgV09SS1NIQVJJTkcgY29uc3RydWN0IGZvciB0aGlzIFBBUkFMTEVMIHJlZ2lvbiAqLworICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QyKAorICAgICAgICAgICAga21wX2kxOG5fbXNnX0Nuc0ludmFsaWROZXN0aW5nLAorICAgICAgICAgICAgY3QsIGlkZW50LAorICAgICAgICAgICAgJiBwLT5zdGFja19kYXRhWyBwLT53X3RvcCBdCisgICAgICAgICk7CisgICAgfQorICAgIGlmIChwLT5zX3RvcCA+IHAtPnBfdG9wKSB7CisgICAgICAgIC8qIHdlIGFyZSBhbHJlYWR5IGluIGEgU1lOQyBjb25zdHJ1Y3QgZm9yIHRoaXMgUEFSQUxMRUwgcmVnaW9uICovCisgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdDIoCisgICAgICAgICAgICBrbXBfaTE4bl9tc2dfQ25zSW52YWxpZE5lc3RpbmcsCisgICAgICAgICAgICBjdCwgaWRlbnQsCisgICAgICAgICAgICAmIHAtPnN0YWNrX2RhdGFbIHAtPnNfdG9wIF0KKyAgICAgICAgKTsKKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Vycm9yLmggYi9yYzMvcnVudGltZS9zcmMva21wX2Vycm9yLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWRmZTExMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfZXJyb3IuaApAQCAtMCwwICsxLDU3IEBACisvKgorICoga21wX2Vycm9yLmggLS0gUFRTIGZ1bmN0aW9ucyBmb3IgZXJyb3IgY2hlY2tpbmcgYXQgcnVudGltZS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfRVJST1JfSAorI2RlZmluZSBLTVBfRVJST1JfSAorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIF9fa21wX2Vycm9yX2NvbnN0cnVjdCggIGttcF9pMThuX2lkX3QgaWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfZXJyb3JfY29uc3RydWN0Migga21wX2kxOG5faWRfdCBpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwgc3RydWN0IGNvbnNfZGF0YSBjb25zdCAqIGNvbnMgKTsKKworc3RydWN0IGNvbnNfaGVhZGVyICogX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggaW50IGd0aWQgKTsKK3ZvaWQgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdm9pZCAqIHB0ciApOworCit2b2lkIF9fa21wX3B1c2hfcGFyYWxsZWwoIGludCBndGlkLCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcHVzaF93b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfcHVzaF9zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUsIGttcF91aW50MzIgKTsKKyNlbHNlCit2b2lkIF9fa21wX3B1c2hfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lICk7CisjZW5kaWYKKwordm9pZCBfX2ttcF9jaGVja193b3Jrc2hhcmUoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgX19rbXBfY2hlY2tfc3luYyggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQsIGttcF91c2VyX2xvY2tfcCBuYW1lLCBrbXBfdWludDMyICk7CisjZWxzZQordm9pZCBfX2ttcF9jaGVja19zeW5jKCBpbnQgZ3RpZCwgZW51bSBjb25zX3R5cGUgY3QsIGlkZW50X3QgY29uc3QgKiBpZGVudCwga21wX3VzZXJfbG9ja19wIG5hbWUgKTsKKyNlbmRpZgorCit2b2lkIF9fa21wX3BvcF9wYXJhbGxlbCggaW50IGd0aWQsIGlkZW50X3QgY29uc3QgKiBpZGVudCApOworZW51bSBjb25zX3R5cGUgX19rbXBfcG9wX3dvcmtzaGFyZSggaW50IGd0aWQsIGVudW0gY29uc190eXBlIGN0LCBpZGVudF90IGNvbnN0ICogaWRlbnQgKTsKK3ZvaWQgX19rbXBfcG9wX3N5bmMoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7Cit2b2lkIF9fa21wX2NoZWNrX2JhcnJpZXIoIGludCBndGlkLCBlbnVtIGNvbnNfdHlwZSBjdCwgaWRlbnRfdCBjb25zdCAqIGlkZW50ICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy8gZXh0ZXJuICJDIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfRVJST1JfSAorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9jZGVjbC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41MWZhMWJmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fY2RlY2wuYwpAQCAtMCwwICsxLDM1IEBACisvKgorICoga21wX2Z0bl9jZGVjbC5jIC0tIEZvcnRyYW4gX19jZGVjbCBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBpZiBkZWZpbmVkICBLTVBfV0lOX0NERUNMIHx8ICAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyMgICAgICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyAgICAgIEtNUF9GVE5fVVBQRVIKKyMgICBlbmRpZgorI2VsaWYgS01QX09TX1VOSVgKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTICBLTVBfRlROX1BMQUlOCisjZW5kaWYKKworLy8gTm90ZTogVGhpcyBzdHJpbmcgaXMgbm90IHByaW50ZWQgd2hlbiBLTVBfVkVSU0lPTj0xLgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2Z0bmNkZWNsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19jZGVjbCBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAJLyogbm8gc3RkY2FsbCAqLworIyAgIGluY2x1ZGUgImttcF9mdG5fb3MuaCIKKyMgICBpbmNsdWRlICJrbXBfZnRuX2VudHJ5LmgiCisjZWxzZQorICAgICJubyI7CisjZW5kaWYgLyogS01QX0ZUTl9FTlRSSUVTICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9lbnRyeS5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iOWRlNWUzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZW50cnkuaApAQCAtMCwwICsxLDE0ODAgQEAKKy8qCisgKiBrbXBfZnRuX2VudHJ5LmggLS0gRm9ydHJhbiBlbnRyeSBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBGVE5fU1REQ0FMTAorIyBlcnJvciBUaGUgc3VwcG9ydCBmaWxlIGttcF9mdG5fZW50cnkuaCBzaG91bGQgbm90IGJlIGNvbXBpbGVkIGJ5IGl0c2VsZi4KKyNlbmRpZgorCisjaWZkZWYgS01QX1NUVUIKKyAgICAjaW5jbHVkZSAia21wX3N0dWIuaCIKKyNlbmRpZgorCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworLyoKKyAqIEZvciBjb21wYXRpYmlsaXR5IHdpdGggdGhlIEdudS9NUyBPcGVuIE1QIGNvZGVnZW4sIG9tcF9zZXRfbnVtX3RocmVhZHMoKSwKKyAqIG9tcF9zZXRfbmVzdGVkKCksIGFuZCBvbXBfc2V0X2R5bmFtaWMoKSBbaW4gbG93ZXJjYXNlIG9uIE1TLCBhbmQgdy9vCisgKiBhIHRyYWlsaW5nIHVuZGVyc2NvcmUgb24gTGludXgqIE9TXSB0YWtlIGNhbGwgYnkgdmFsdWUgaW50ZWdlciBhcmd1bWVudHMuCisgKiArIG9tcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoKQorICogKyBvbXBfc2V0X3NjaGVkdWxlKCkKKyAqCisgKiBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eSB3aXRoIDkuMSBhbmQgcHJldmlvdXMgSW50ZWwgY29tcGlsZXIsIHRoZXNlCisgKiBlbnRyeSBwb2ludHMgdGFrZSBjYWxsIGJ5IHJlZmVyZW5jZSBpbnRlZ2VyIGFyZ3VtZW50cy4KKyAqLworI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorIyBpZiAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fUExBSU4pIHx8IChLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUikKKyMgIGRlZmluZSBQQVNTX0FSR1NfQllfVkFMVUUgMQorIyBlbmRpZgorI2VuZGlmCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWYgKEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1BMQUlOKSB8fCAoS01QX0ZUTl9FTlRSSUVTID09IEtNUF9GVE5fQVBQRU5EKQorIyAgZGVmaW5lIFBBU1NfQVJHU19CWV9WQUxVRSAxCisjIGVuZGlmCisjZW5kaWYKKworLy8gVGhpcyBtYWNybyBoZWxwcyB0byByZWR1Y2UgY29kZSBkdXBsaWNhdGlvbi4KKyNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAjZGVmaW5lIEtNUF9ERVJFRgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9ERVJFRiAqCisjZW5kaWYKKwordm9pZCAgRlROX1NURENBTEwKK0ZUTl9TRVRfU1RBQ0tTSVpFKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCAoc2l6ZV90KSBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgIEZUTl9TVERDQUxMCitGVE5fU0VUX1NUQUNLU0laRV9TKCBzaXplX3QgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfYXV4X3NldF9zdGFja3NpemUgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgICAgIF9fa21wX2F1eF9zZXRfc3RhY2tzaXplKCBLTVBfREVSRUYgYXJnICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9TVEFDS1NJWkUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gKGludClfX2ttcF9zdGtzaXplOworICAgICNlbmRpZgorfQorCitzaXplX3QgRlROX1NURENBTEwKK0ZUTl9HRVRfU1RBQ0tTSVpFX1MoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9zdGFja3NpemUoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICByZXR1cm4gX19rbXBfc3Rrc2l6ZTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9CTE9DS1RJTUUoIGludCBLTVBfREVSRUYgYXJnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgX19rbXBfYXV4X3NldF9ibG9ja3RpbWUoIEtNUF9ERVJFRiBhcmcsIHRocmVhZCwgdGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9CTE9DS1RJTUUoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF9ibG9ja3RpbWUoKTsKKyAgICAjZWxzZQorCWludCBndGlkLCB0aWQ7CisJa21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGVhbV9wICp0ZWFtOworCisJZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKwl0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCXRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIHRlYW0gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0gLT4gdGgudGhfdGVhbTsKKworICAgICAgICAvKiBUaGVzZSBtdXN0IG1hdGNoIHRoZSBzZXR0aW5ncyB1c2VkIGluIF9fa21wX3dhaXRfc2xlZXAoKSAqLworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisJCQkgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBLTVBfTUFYX0JMT0NLVElNRSkgKTsKKyAgICAgICAgICAgIHJldHVybiBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF96ZXJvX2J0ICYmICFnZXRfX2J0X3NldCggdGVhbSwgdGlkICkgKSB7CisJICAgIEtGX1RSQUNFKDEwLCAoICJrbXBfZ2V0X2Jsb2NrdGltZTogVCMlZCglZDolZCksIGJsb2NrdGltZT0lZFxuIiwKKwkJCSAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0aWQsIDApICk7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisgICAgICAgIGVsc2UgeworCSAgICBLRl9UUkFDRSgxMCwgKCAia21wX2dldF9ibG9ja3RpbWU6IFQjJWQoJWQ6JWQpLCBibG9ja3RpbWU9JWRcbiIsCisgICAgICAgICAgICAgIGd0aWQsIHRlYW0tPnQudF9pZCwgdGlkLCBnZXRfX2Jsb2NrdGltZSggdGVhbSwgdGlkICkgKSApOworICAgICAgICAgICAgcmV0dXJuIGdldF9fYmxvY2t0aW1lKCB0ZWFtLCB0aWQgKTsKKyAgICAgICAgfTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZX1NFUklBTCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV9zZXJpYWwgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3NlcmlhbCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fU0VUX0xJQlJBUllfVFVSTkFST1VORCggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2Vsc2UKKyAgICAgICAgLy8gX19rbXBfdXNlcl9zZXRfbGlicmFyeSBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgX19rbXBfdXNlcl9zZXRfbGlicmFyeSggbGlicmFyeV90dXJuYXJvdW5kICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfTElCUkFSWV9USFJPVUdIUFVUKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZWxzZQorICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWJyYXJ5X3Rocm91Z2hwdXQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX1NFVF9MSUJSQVJZKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wc19zZXRfbGlicmFyeSggS01QX0RFUkVGIGFyZyApOworICAgICNlbHNlCisgICAgICAgIGVudW0gbGlicmFyeV90eXBlIGxpYjsKKyAgICAgICAgbGliID0gKGVudW0gbGlicmFyeV90eXBlKSBLTVBfREVSRUYgYXJnOworICAgICAgICAvLyBfX2ttcF91c2VyX3NldF9saWJyYXJ5IGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgICAgICBfX2ttcF91c2VyX3NldF9saWJyYXJ5KCBsaWIgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0xJQlJBUlkgKHZvaWQpCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2xpYnJhcnkoKTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiAoKGludCkgX19rbXBfbGlicmFyeSk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyggaW50IEtNUF9ERVJFRiBhcmcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICA7IC8vIGVtcHR5IHJvdXRpbmUKKyAgICAjZWxzZQorICAgICAgICAvLyBpZ25vcmUgYWZ0ZXIgaW5pdGlhbGl6YXRpb24gYmVjYXVzZSBzb21lIHRlYW1zIGhhdmUgYWxyZWFkeQorICAgICAgICAvLyBhbGxvY2F0ZWQgZGlzcGF0Y2ggYnVmZmVycworICAgICAgICBpZiggX19rbXBfaW5pdF9zZXJpYWwgPT0gMCAmJiAoS01QX0RFUkVGIGFyZykgPiAwICkKKyAgICAgICAgICAgIF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzID0gS01QX0RFUkVGIGFyZzsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fU0VUX0FGRklOSVRZKCB2b2lkICoqbWFzayApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAtMTsKKyAgICAjZWxzZQorICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gX19rbXBfYXV4X3NldF9hZmZpbml0eSggbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9HRVRfQUZGSU5JVFkoIHZvaWQgKiptYXNrICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIC0xOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdXhfZ2V0X2FmZmluaXR5KCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyggdm9pZCApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIC8vCisgICAgICAgIC8vIFdlIHJlYWxseSBvbmx5IE5FRUQgc2VyaWFsIGluaXRpYWxpemF0aW9uIGhlcmUuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGlmICggISAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisKKyAgICAjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSApIHsKKyAgICAgICAgICAgIHJldHVybiAoaW50KShfX2ttcF9udW1fcHJvY19ncm91cHMqc2l6ZW9mKERXT1JEX1BUUikqQ0hBUl9CSVQpOworICAgICAgICB9CisgICAgI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgICAgICByZXR1cm4gX19rbXBfeHByb2M7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9DUkVBVEVfQUZGSU5JVFlfTUFTSyggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAqbWFzayA9IE5VTEw7CisgICAgI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgKm1hc2sgPSAoaHdsb2NfY3B1c2V0X3QpaHdsb2NfYml0bWFwX2FsbG9jKCk7CisgICAgIyBlbHNlCisgICAgICAgICptYXNrID0ga21wY19tYWxsb2MoIF9fa21wX2FmZmluX21hc2tfc2l6ZSApOworICAgICMgZW5kaWYKKyAgICAgICAgS01QX0NQVV9aRVJPKCAoa21wX2FmZmluX21hc2tfdCAqKSgqbWFzaykgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyggdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAvLyBOb3RoaW5nCisgICAgI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gV2UgcmVhbGx5IG9ubHkgTkVFRCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBpZiAoICptYXNrID09IE5VTEwgKSB7CisJICAgICAgICBLTVBfRkFUQUwoIEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfZGVzdHJveV9hZmZpbml0eV9tYXNrIiApOworCSAgICB9CisgICAgICAgIH0KKyAgICAjIGlmIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgaHdsb2NfYml0bWFwX2ZyZWUoKGh3bG9jX2NwdXNldF90KSgqbWFzaykpOworICAgICMgZWxzZQorICAgICAgICBrbXBjX2ZyZWUoICptYXNrICk7CisgICAgIyBlbmRpZgorICAgICAgICAqbWFzayA9IE5VTEw7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1NFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9zZXRfYWZmaW5pdHlfbWFza19wcm9jKCBLTVBfREVSRUYgcHJvYywgbWFzayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIEtNUF9ERVJFRiBwcm9jLCBtYXNrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9BRkZJTklUWV9NQVNLX1BST0MoIGludCBLTVBfREVSRUYgcHJvYywgdm9pZCAqKm1hc2sgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2F1eF9nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBLTVBfREVSRUYgcHJvYywgbWFzayApOworICAgICNlbmRpZgorfQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRocmVhZHMgZm9yIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAqLworCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTlVNX1RIUkVBRFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIC8vIE5vdGhpbmcuCisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X251bV90aHJlYWRzKCBLTVBfREVSRUYgYXJnLCBfX2ttcF9lbnRyeV9ndGlkKCkgKTsKKyAgICAjZW5kaWYKK30KKworCisvKiByZXR1cm5zIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBpbiBjdXJyZW50IHRlYW0gKi8KK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9USFJFQURTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIC8vIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICAgICAgcmV0dXJuIF9fa21wY19ib3VuZF9udW1fdGhyZWFkcyhOVUxMKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX1RIUkVBRFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgaW50ICAgICAgICAgZ3RpZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBndGlkICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICAgICAgLy9yZXR1cm4gdGhyZWFkIC0+IHRoLnRoX3RlYW0gLT4gdC50X2N1cnJlbnRfdGFza1sgdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RpZCBdIC0+IGljdnMubnByb2M7CisJcmV0dXJuIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgLT4gdGRfaWN2cy5ucHJvYzsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfVEhSRUFEX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBpbnQgZ3RpZDsKKworICAgICAgICAjaWYgS01QX09TX0RBUldJTiB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICAjZWxpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAgICAgICAgICAgKGd0aWQgPSAoaW50KSgoa21wX2ludHB0cl90KVRsc0dldFZhbHVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkpKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgLy8gRWl0aGVyIGxpYnJhcnkgaXNuJ3QgaW5pdGlhbGl6ZWQgb3IgdGhyZWFkIGlzIG5vdCByZWdpc3RlcmVkCisgICAgICAgICAgICAgICAgLy8gMCBpcyB0aGUgY29ycmVjdCBUSUQgaW4gdGhpcyBjYXNlCisgICAgICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAtLWd0aWQ7IC8vIFdlIGtlZXAgKGd0aWQrMSkgaW4gVExTCisgICAgICAgICNlbGlmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgICAgICBpZiAoIF9fa21wX2d0aWRfbW9kZSA+PSAzICkgeworICAgICAgICAgICAgICAgIGlmICgoZ3RpZCA9IF9fa21wX2d0aWQpID09IEtNUF9HVElEX0RORSkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICAgICAgaWYgKCFfX2ttcF9pbml0X3BhcmFsbGVsIHx8CisgICAgICAgICAgICAgICAgICAgIChndGlkID0gKGttcF9pbnRwdHJfdCkocHRocmVhZF9nZXRzcGVjaWZpYyggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKSkgPT0gMCkgeworICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLS1ndGlkOworICAgICAgICAgICAgI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgICAgICAgICB9CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNlcnJvciBVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TCisgICAgICAgICNlbmRpZgorCisgICAgICAgIHJldHVybiBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9OVU1fS05PV05fVEhSRUFEUyggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgLyogTk9URTogdGhpcyBpcyBub3Qgc3luY3Jvbml6ZWQsIHNvIGl0IGNhbiBjaGFuZ2UgYXQgYW55IG1vbWVudCAqLworICAgICAgICAvKiBOT1RFOiB0aGlzIG51bWJlciBhbHNvIGluY2x1ZGVzIHRocmVhZHMgcHJlYWxsb2NhdGVkIGluIGhvdC10ZWFtcyAqLworICAgICAgICByZXR1cm4gVENSXzQoX19rbXBfbnRoKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTlVNX1BST0NTKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiAxOworICAgICNlbHNlCisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBfX2ttcF9hdmFpbF9wcm9jOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTkVTVEVEKSggaW50IEtNUF9ERVJFRiBmbGFnICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBzX3NldF9uZXN0ZWQoIEtNUF9ERVJFRiBmbGFnICk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGludGVybmFsIGNvbnRyb2xzIGltcGxlbWVudGF0aW9uICovCisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKyAgICAgICAgc2V0X19uZXN0ZWQoIHRocmVhZCwgKCAoS01QX0RFUkVGIGZsYWcpID8gVFJVRSA6IEZBTFNFICkgKTsKKyAgICAjZW5kaWYKK30KKworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9ORVNURUQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfbmVzdGVkKCk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgcmV0dXJuIGdldF9fbmVzdGVkKCB0aHJlYWQgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0RZTkFNSUMpKCBpbnQgS01QX0RFUkVGIGZsYWcgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X2R5bmFtaWMoIEtNUF9ERVJFRiBmbGFnID8gVFJVRSA6IEZBTFNFICk7CisgICAgI2Vsc2UKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICAvKiBGb3IgdGhlIHRocmVhZC1wcml2YXRlIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICB0aHJlYWQgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgLy8gISEhIFdoYXQgaWYgZm9yZWlnbiB0aHJlYWQgY2FsbHMgaXQ/CisgICAgICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworICAgICAgICBzZXRfX2R5bmFtaWMoIHRocmVhZCwgS01QX0RFUkVGIGZsYWcgPyBUUlVFIDogRkFMU0UgKTsKKyAgICAjZW5kaWYKK30KKworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9EWU5BTUlDKSggdm9pZCApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgIHJldHVybiBfX2ttcHNfZ2V0X2R5bmFtaWMoKTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIHRocmVhZCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworICAgICAgICByZXR1cm4gZ2V0X19keW5hbWljKCB0aHJlYWQgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTl9QQVJBTExFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX2VudHJ5X3RocmVhZCgpOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIC8vIEFDOiByX2luX3BhcmFsbGVsIGRvZXMgbm90IHdvcmsgaW5zaWRlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgLy8gICAgIHdoZXJlIHJlYWwgcGFyYWxsZWwgaXMgaW5hY3RpdmUsIGJ1dCBhbGwgdGhyZWFkcyBoYXZlIHNhbWUgcm9vdCwKKyAgICAgICAgICAgIC8vICAgICBzbyBzZXR0aW5nIGl0IGluIG9uZSB0ZWFtIGFmZmVjdHMgb3RoZXIgdGVhbXMuCisgICAgICAgICAgICAvLyAgICAgVGhlIHNvbHV0aW9uIGlzIHRvIHVzZSBwZXItdGVhbSBuZXN0aW5nIGxldmVsCisgICAgICAgICAgICByZXR1cm4gKCB0aC0+dGgudGhfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA/IDEgOiAwICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICByZXR1cm4gKCB0aC0+dGgudGhfcm9vdC0+ci5yX2luX3BhcmFsbGVsID8gRlROX1RSVUUgOiBGVE5fRkFMU0UgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX1NDSEVEVUxFKSgga21wX3NjaGVkX3QgS01QX0RFUkVGIGtpbmQsIGludCBLTVBfREVSRUYgbW9kaWZpZXIgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfc2V0X3NjaGVkdWxlKCBLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyICk7CisgICAgI2Vsc2UKKwkvKiAgVE8gRE8gICovCisgICAgICAgIC8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIF9fa21wX3NldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCBLTVBfREVSRUYga2luZCwgS01QX0RFUkVGIG1vZGlmaWVyICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9TQ0hFRFVMRSkoIGttcF9zY2hlZF90ICoga2luZCwgaW50ICogbW9kaWZpZXIgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBfX2ttcHNfZ2V0X3NjaGVkdWxlKCBraW5kLCBtb2RpZmllciApOworICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIF9fa21wX2dldF9zY2hlZHVsZSggX19rbXBfZW50cnlfZ3RpZCgpLCBraW5kLCBtb2RpZmllciApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMpKCBpbnQgS01QX0RFUkVGIGFyZyApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisJLy8gTm90aGluZy4KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKyAgICAgICAgLyogV2Ugd2FudCBwZXItdGFzayBpbXBsZW1lbnRhdGlvbiBvZiB0aGlzIGludGVybmFsIGNvbnRyb2wgKi8KKyAgICAgICAgX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBhcmcgKTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsKKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBXZSB3YW50IHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoaXMgaW50ZXJuYWwgY29udHJvbCAqLworCXJldHVybiBfX2ttcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIF9fa21wX2VudHJ5X2d0aWQoKSApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9BQ1RJVkVfTEVWRUwpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMDsgLy8gcmV0dXJucyAwIGlmIGl0IGlzIGNhbGxlZCBmcm9tIHRoZSBzZXF1ZW50aWFsIHBhcnQgb2YgdGhlIHByb2dyYW0KKyAgICAjZWxzZQorCS8qICBUTyBETyAgKi8KKwkvKiBGb3IgdGhlIHBlci10YXNrIGltcGxlbWVudGF0aW9uIG9mIHRoZSBpbnRlcm5hbCBjb250cm9scyAqLworICAgICAgICByZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfdGVhbSAtPiB0LnRfYWN0aXZlX2xldmVsOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9MRVZFTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAvLyByZXR1cm5zIDAgaWYgaXQgaXMgY2FsbGVkIGZyb20gdGhlIHNlcXVlbnRpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbQorICAgICNlbHNlCisJLyogIFRPIERPICAqLworCS8qIEZvciB0aGUgcGVyLXRhc2sgaW1wbGVtZW50YXRpb24gb2YgdGhlIGludGVybmFsIGNvbnRyb2xzICovCisgICAgICAgIHJldHVybiBfX2ttcF9lbnRyeV90aHJlYWQoKSAtPiB0aC50aF90ZWFtIC0+IHQudF9sZXZlbDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSkoIGludCBLTVBfREVSRUYgbGV2ZWwgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAoIEtNUF9ERVJFRiBsZXZlbCApID8gKCAtMSApIDogKCAwICk7CisgICAgI2Vsc2UKKwlyZXR1cm4gX19rbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0oIF9fa21wX2VudHJ5X2d0aWQoKSwgS01QX0RFUkVGIGxldmVsICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX1RFQU1fU0laRSkoIGludCBLTVBfREVSRUYgbGV2ZWwgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gKCBLTVBfREVSRUYgbGV2ZWwgKSA/ICggLTEgKSA6ICggMSApOworICAgICNlbHNlCisgICAgICAgIHJldHVybiBfX2ttcF9nZXRfdGVhbV9zaXplKCBfX2ttcF9lbnRyeV9ndGlkKCksIEtNUF9ERVJFRiBsZXZlbCApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9USFJFQURfTElNSVQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKwlyZXR1cm4gMTsgICAvLyBUTyBETzogY2xhcmlmeSB3aGV0aGVyIGl0IHJldHVybnMgMSBvciAwPworICAgICNlbHNlCisgICAgICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgICAgIH07CisgICAgICAgIC8qIGdsb2JhbCBJQ1YgKi8KKwlyZXR1cm4gX19rbXBfbWF4X250aDsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTl9GSU5BTCkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorCXJldHVybiAwOyAgIC8vIFRPIERPOiBjbGFyaWZ5IHdoZXRoZXIgaXQgcmV0dXJucyAxIG9yIDA/CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIH0KKwlyZXR1cm4gX19rbXBfZW50cnlfdGhyZWFkKCkgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX2ZsYWdzLmZpbmFsOworICAgICNlbmRpZgorfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworCitrbXBfcHJvY19iaW5kX3QgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9QUk9DX0JJTkQpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfcHJvY19iaW5kKCk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIGdldF9fcHJvY19iaW5kKCBfX2ttcF9lbnRyeV90aHJlYWQoKSApOworICAgICNlbmRpZgorfQorCisjaWYgT01QXzQ1X0VOQUJMRUQKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9OVU1fUExBQ0VTKCB2b2lkICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIF9fa21wX2FmZmluaXR5X251bV9tYXNrczsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1BMQUNFX05VTV9QUk9DUyggaW50IHBsYWNlX251bSApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIHJldHVybiAwOworICAgICNlbHNlCisgICAgICAgIGludCBpOworICAgICAgICBpbnQgcmV0dmFsID0gMDsKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBwbGFjZV9udW0gPCAwIHx8IHBsYWNlX251bSA+PSAoaW50KV9fa21wX2FmZmluaXR5X251bV9tYXNrcyApCisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIHBsYWNlX251bSk7CisgICAgICAgIEtNUF9DUFVfU0VUX0lURVJBVEUoaSwgbWFzaykgeworICAgICAgICAgICAgaWYgKCghIEtNUF9DUFVfSVNTRVQoaSwgX19rbXBfYWZmaW5fZnVsbE1hc2spKSB8fAorICAgICAgICAgICAgICAoIUtNUF9DUFVfSVNTRVQoaSwgbWFzaykpKSB7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICArK3JldHZhbDsKKyAgICAgICAgfQorICAgICAgICByZXR1cm4gcmV0dmFsOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fR0VUX1BMQUNFX1BST0NfSURTKCBpbnQgcGxhY2VfbnVtLCBpbnQgKmlkcyApCit7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8gTm90aGluZy4KKyAgICAjZWxzZQorICAgICAgICBpbnQgaSxqOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBsYWNlX251bSA8IDAgfHwgcGxhY2VfbnVtID49IChpbnQpX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAga21wX2FmZmluX21hc2tfdCAqbWFzayA9IEtNUF9DUFVfSU5ERVgoX19rbXBfYWZmaW5pdHlfbWFza3MsIHBsYWNlX251bSk7CisgICAgICAgIGogPSAwOworICAgICAgICBLTVBfQ1BVX1NFVF9JVEVSQVRFKGksIG1hc2spIHsKKyAgICAgICAgICAgIGlmICgoISBLTVBfQ1BVX0lTU0VUKGksIF9fa21wX2FmZmluX2Z1bGxNYXNrKSkgfHwKKyAgICAgICAgICAgICAgKCFLTVBfQ1BVX0lTU0VUKGksIG1hc2spKSkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWRzW2orK10gPSBpOworICAgICAgICB9CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9QTEFDRV9OVU0oIHZvaWQgKQoreworICAgICNpZiBkZWZpbmVkKEtNUF9TVFVCKSB8fCAhS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICByZXR1cm4gLTE7CisgICAgI2Vsc2UKKyAgICAgICAgaW50IGd0aWQ7CisgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKyAgICAgICAgaWYgKCAhIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgICAgIF9fa21wX21pZGRsZV9pbml0aWFsaXplKCk7CisgICAgICAgIH0KKyAgICAgICAgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPCAwICkKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF9wbGFjZTsKKyAgICAjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTKCB2b2lkICkKK3sKKyAgICAjaWYgZGVmaW5lZChLTVBfU1RVQikgfHwgIUtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgcmV0dXJuIDA7CisgICAgI2Vsc2UKKyAgICAgICAgaW50IGd0aWQsIG51bV9wbGFjZXMsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlOworICAgICAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAgICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgICAgICB9CisgICAgICAgIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoZ3RpZCk7CisgICAgICAgIGZpcnN0X3BsYWNlID0gdGhyZWFkLT50aC50aF9maXJzdF9wbGFjZTsKKyAgICAgICAgbGFzdF9wbGFjZSA9IHRocmVhZC0+dGgudGhfbGFzdF9wbGFjZTsKKyAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8IDAgfHwgbGFzdF9wbGFjZSA8IDAgKQorICAgICAgICAgICAgcmV0dXJuIDA7CisgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSApCisgICAgICAgICAgICBudW1fcGxhY2VzID0gbGFzdF9wbGFjZSAtIGZpcnN0X3BsYWNlICsgMTsKKyAgICAgICAgZWxzZQorICAgICAgICAgICAgbnVtX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgICAgICAgIHJldHVybiBudW1fcGxhY2VzOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TKCBpbnQgKnBsYWNlX251bXMgKSB7CisgICAgI2lmIGRlZmluZWQoS01QX1NUVUIpIHx8ICFLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8gTm90aGluZy4KKyAgICAjZWxzZQorICAgICAgICBpbnQgaSwgZ3RpZCwgcGxhY2VfbnVtLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSwgc3RhcnQsIGVuZDsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBpZiAoICEgVENSXzQoX19rbXBfaW5pdF9taWRkbGUpICkgeworICAgICAgICAgICAgX19rbXBfbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICAgICAgfQorICAgICAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpOworICAgICAgICBmaXJzdF9wbGFjZSA9IHRocmVhZC0+dGgudGhfZmlyc3RfcGxhY2U7CisgICAgICAgIGxhc3RfcGxhY2UgPSB0aHJlYWQtPnRoLnRoX2xhc3RfcGxhY2U7CisgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPCAwIHx8IGxhc3RfcGxhY2UgPCAwICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgaWYgKCBmaXJzdF9wbGFjZSA8PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgc3RhcnQgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgIGVuZCA9IGxhc3RfcGxhY2U7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBzdGFydCA9IGxhc3RfcGxhY2U7CisgICAgICAgICAgICBlbmQgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwLCBwbGFjZV9udW0gPSBzdGFydDsgcGxhY2VfbnVtIDw9IGVuZDsgKytwbGFjZV9udW0sICsraSkgeworICAgICAgICAgICAgcGxhY2VfbnVtc1tpXSA9IHBsYWNlX251bTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorI2VuZGlmCisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fR0VUX05VTV9URUFNUykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMTsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsgICAgICAgICAgICAvLyB0aGUgbGV2ZWwgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKKyAgICAgICAgICAgIGludCBsZXZlbCA9IHRsZXZlbCArIDE7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBpaSA+PSB0bGV2ZWwgKTsKKyAgICAgICAgICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBmb3IoIGRkID0gdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCAmJiAoICFkZCApICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgICAgICAgICAgaWktLTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGRkID4gMSApIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gMTsgIC8vIHRlYW1zIHJlZ2lvbiBpcyBzZXJpYWxpemVkICggMSB0ZWFtIG9mIDEgdGhyZWFkICkuCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJldHVybiB0ZWFtLT50LnRfcGFyZW50LT50LnRfbnByb2M7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9URUFNX05VTSkoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gMDsKKyAgICAjZWxzZQorICAgICAgICBrbXBfaW5mb190ICp0aHIgPSBfX2ttcF9lbnRyeV90aHJlYWQoKTsKKyAgICAgICAgaWYgKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgIGludCBpaSA9IHRlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgICAgIGludCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7CisgICAgICAgICAgICBpbnQgbGV2ZWwgPSB0bGV2ZWwgKyAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgZm9yKCBkZCA9IHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHRlYW0gLT4gdC50X3NlcmlhbGl6ZWQgJiYgKCAhZGQgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiggaWkgPiBsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgICAgIGlpLS07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBkZCA+IDEgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuIDA7ICAvLyB0ZWFtcyByZWdpb24gaXMgc2VyaWFsaXplZCAoIDEgdGVhbSBvZiAxIHRocmVhZCApLgorICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICByZXR1cm4gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfQorICAgICNlbmRpZgorfQorCisjaWYgS01QX01JQyB8fCBLTVBfT1NfREFSV0lOIHx8IGRlZmluZWQoS01QX1NUVUIpCisKK2ludCBGVE5fU1REQ0FMTAorRlROX0dFVF9ERUZBVUxUX0RFVklDRSggdm9pZCApCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfREVGQVVMVF9ERVZJQ0UoIGludCBLTVBfREVSRUYgYXJnICkKK3sKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX05VTV9ERVZJQ0VTKCB2b2lkICkKK3sKKyAgICByZXR1cm4gMDsKK30KKworI2VuZGlmIC8vIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorCisjaWYgISBLTVBfT1NfTElOVVgKKworaW50IEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JU19JTklUSUFMX0RFVklDRSkoIHZvaWQgKQoreworICAgIHJldHVybiAxOworfQorCisjZWxzZQorCisvLyBUaGlzIGludGVybmFsIGZ1bmN0aW9uIGlzIHVzZWQgd2hlbiB0aGUgZW50cnkgZnJvbSB0aGUgb2ZmbG9hZCBsaWJyYXJ5CisvLyBpcyBub3QgZm91bmQuCitpbnQgX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoIHZvaWQgKSAgX19hdHRyaWJ1dGVfXygod2VhaykpOworCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0lTX0lOSVRJQUxfREVWSUNFKSggdm9pZCApCit7CisgICAgaWYoIF9PZmZsb2FkX2dldF9kZXZpY2VfbnVtYmVyICkgeworICAgICAgICByZXR1cm4gX09mZmxvYWRfZ2V0X2RldmljZV9udW1iZXIoKSA9PSAtMTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyNlbmRpZiAvLyAhIEtNUF9PU19MSU5VWAorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUF80NV9FTkFCTEVEICYmIGRlZmluZWQoS01QX1NUVUIpCisvLyBPcGVuTVAgNC41IGVudHJpZXMgZm9yIHN0dWJzIGxpYnJhcnkKKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0lOSVRJQUxfREVWSUNFKHZvaWQpCit7CisgICByZXR1cm4gLTE7Cit9CisKKy8vIEFzIGFsbCAqdGFyZ2V0KiBmdW5jdGlvbnMgYXJlIEMtb25seSBwYXJhbWV0ZXJzIGFsd2F5cyBwYXNzZWQgYnkgdmFsdWUKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9BTExPQyhzaXplX3Qgc2l6ZSwgaW50IGRldmljZV9udW0pCit7CisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9UQVJHRVRfRlJFRSh2b2lkICogZGV2aWNlX3B0ciwgaW50IGRldmljZV9udW0pCit7Cit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9JU19QUkVTRU5UKHZvaWQgKiBwdHIsIGludCBkZXZpY2VfbnVtKQoreworICAgcmV0dXJuIDA7Cit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9NRU1DUFkodm9pZCAqZHN0LCB2b2lkICpzcmMsIHNpemVfdCBsZW5ndGgsIHNpemVfdCAgZHN0X29mZnNldCwKKyAgICAgICAgICAgICAgICAgIHNpemVfdCBzcmNfb2Zmc2V0LCBpbnQgZHN0X2RldmljZSwgaW50IHNyY19kZXZpY2UpCit7CisgICAgcmV0dXJuIC0xOworfQorCitpbnQgRlROX1NURENBTEwKK0ZUTl9UQVJHRVRfTUVNQ1BZX1JFQ1Qodm9pZCAqZHN0LCB2b2lkICpzcmMsIHNpemVfdCBlbGVtZW50X3NpemUsIGludCBudW1fZGltcywKKyAgICAgICAgICAgICAgICAgICAgICAgY29uc3Qgc2l6ZV90ICp2b2x1bWUsIGNvbnN0IHNpemVfdCAqZHN0X29mZnNldHMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqc3JjX29mZnNldHMsIGNvbnN0IHNpemVfdCAqZHN0X2RpbWVuc2lvbnMsCisgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHNpemVfdCAqc3JjX2RpbWVuc2lvbnMsIGludCBkc3RfZGV2aWNlLCBpbnQgc3JjX2RldmljZSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9BU1NPQ0lBVEVfUFRSKHZvaWQgKmhvc3RfcHRyLCB2b2lkICpkZXZpY2VfcHRyLCBzaXplX3QgIHNpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90ICBkZXZpY2Vfb2Zmc2V0LCBpbnQgZGV2aWNlX251bSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisKK2ludCBGVE5fU1REQ0FMTAorRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSKHZvaWQgKmhvc3RfcHRyLCBpbnQgZGV2aWNlX251bSkKK3sKKyAgICByZXR1cm4gLTE7Cit9CisjZW5kaWYgLy8gT01QXzQ1X0VOQUJMRUQgJiYgZGVmaW5lZChLTVBfU1RVQikKKworI2lmZGVmIEtNUF9TVFVCCit0eXBlZGVmIGVudW0geyBVTklOSVQgPSAtMSwgVU5MT0NLRUQsIExPQ0tFRCB9IGttcF9zdHViX2xvY2tfdDsKKyNlbmRpZiAvKiBLTVBfU1RVQiAqLworCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9JTklUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbG9ja193aXRoX2hpbnQoIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrLCBLTVBfREVSRUYgaGludCApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCitGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UKCB2b2lkICoqdXNlcl9sb2NrLCB1aW50cHRyX3QgS01QX0RFUkVGIGhpbnQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludCggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2ssIEtNUF9ERVJFRiBoaW50ICk7CisgICAgI2VuZGlmCit9CisjZW5kaWYKKworLyogaW5pdGlhbGl6ZSB0aGUgbG9jayAqLwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fSU5JVF9MT0NLKSggdm9pZCAqKnVzZXJfbG9jayApCit7CisgICAgI2lmZGVmIEtNUF9TVFVCCisgICAgICAgICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPSBVTkxPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfaW5pdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCisvKiBpbml0aWFsaXplIHRoZSBsb2NrICovCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9JTklUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX2luaXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IFVOSU5JVDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfZGVzdHJveV9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCit2b2lkIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9ERVNUUk9ZX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5JTklUOworICAgICNlbHNlCisgICAgICAgIF9fa21wY19kZXN0cm95X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fU0VUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgIT0gVU5MT0NLRUQgKSB7CisgICAgICAgICAgICAvLyBUT0RPOiBJc3N1ZSBhbiBlcnJvci4KKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1NFVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSkrKzsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfc2V0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKwordm9pZCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVU5TRVRfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID0gVU5MT0NLRUQ7CisgICAgI2Vsc2UKKyAgICAgICAgX19rbXBjX3Vuc2V0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1VOU0VUX05FU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBVTkxPQ0tFRCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAoKigoaW50ICopdXNlcl9sb2NrKSktLTsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcGNfdW5zZXRfbmVzdF9sb2NrKCBOVUxMLCBfX2ttcF9lbnRyeV9ndGlkKCksIHVzZXJfbG9jayApOworICAgICNlbmRpZgorfQorCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX1RFU1RfTE9DSykoIHZvaWQgKip1c2VyX2xvY2sgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICBpZiAoICooKGttcF9zdHViX2xvY2tfdCAqKXVzZXJfbG9jaykgPT0gVU5JTklUICkgeworICAgICAgICAgICAgLy8gVE9ETzogSXNzdWUgYW4gZXJyb3IuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9PSBMT0NLRUQgKSB7CisgICAgICAgICAgICByZXR1cm4gMDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKigoa21wX3N0dWJfbG9ja190ICopdXNlcl9sb2NrKSA9IExPQ0tFRDsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X2xvY2soIE5VTEwsIF9fa21wX2VudHJ5X2d0aWQoKSwgdXNlcl9sb2NrICk7CisgICAgI2VuZGlmCit9CisKK2ludCBGVE5fU1REQ0FMTAoreGV4cGFuZChGVE5fVEVTVF9ORVNUX0xPQ0spKCB2b2lkICoqdXNlcl9sb2NrICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgaWYgKCAqKChrbXBfc3R1Yl9sb2NrX3QgKil1c2VyX2xvY2spID09IFVOSU5JVCApIHsKKyAgICAgICAgICAgIC8vIFRPRE86IElzc3VlIGFuIGVycm9yLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gKysoKigoaW50ICopdXNlcl9sb2NrKSk7CisgICAgI2Vsc2UKKyAgICAgICAgcmV0dXJuIF9fa21wY190ZXN0X25lc3RfbG9jayggTlVMTCwgX19rbXBfZW50cnlfZ3RpZCgpLCB1c2VyX2xvY2sgKTsKKyAgICAjZW5kaWYKK30KKworZG91YmxlIEZUTl9TVERDQUxMCit4ZXhwYW5kKEZUTl9HRVRfV1RJTUUpKCB2b2lkICkKK3sKKyAgICAjaWZkZWYgS01QX1NUVUIKKyAgICAgICAgcmV0dXJuIF9fa21wc19nZXRfd3RpbWUoKTsKKyAgICAjZWxzZQorICAgICAgICBkb3VibGUgZGF0YTsKKyAgICAgICAgI2lmICEgS01QX09TX0xJTlVYCisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbGlicmFyeSBpbml0aWFsaXphdGlvbiB0byBnZXQgdGhlIHRpbWUgb24gTGludXgqIE9TLgorICAgICAgICAvLyBUaGUgcm91dGluZSBjYW4gYmUgdXNlZCB0byBtZWFzdXJlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdGltZSBvbiBMaW51eCogT1Mgbm93LgorICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfZWxhcHNlZCggJiBkYXRhICk7CisgICAgICAgIHJldHVybiBkYXRhOworICAgICNlbmRpZgorfQorCitkb3VibGUgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9XVElDSykoIHZvaWQgKQoreworICAgICNpZmRlZiBLTVBfU1RVQgorICAgICAgICByZXR1cm4gX19rbXBzX2dldF93dGljaygpOworICAgICNlbHNlCisgICAgICAgIGRvdWJsZSBkYXRhOworICAgICAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgICAgICB9OworICAgICAgICBfX2ttcF9lbGFwc2VkX3RpY2soICYgZGF0YSApOworICAgICAgICByZXR1cm4gZGF0YTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX01BTExPQyggc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX21hbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19tYWxsb2MoIEtNUF9ERVJFRiBzaXplICk7Cit9CisKK3ZvaWQgKiBGVE5fU1REQ0FMTAorRlROX0FMSUdORURfTUFMTE9DKCBzaXplX3QgS01QX0RFUkVGIHNpemUsIHNpemVfdCBLTVBfREVSRUYgYWxpZ25tZW50ICkKK3sKKyAgICAvLyBrbXBjX2FsaWduZWRfbWFsbG9jIGluaXRpYWxpemVzIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIHJldHVybiBrbXBjX2FsaWduZWRfbWFsbG9jKCBLTVBfREVSRUYgc2l6ZSwgS01QX0RFUkVGIGFsaWdubWVudCApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9DQUxMT0MoIHNpemVfdCBLTVBfREVSRUYgbmVsZW0sIHNpemVfdCBLTVBfREVSRUYgZWxzaXplICkKK3sKKyAgICAvLyBrbXBjX2NhbGxvYyBpbml0aWFsaXplcyB0aGUgbGlicmFyeSBpZiBuZWVkZWQKKyAgICByZXR1cm4ga21wY19jYWxsb2MoIEtNUF9ERVJFRiBuZWxlbSwgS01QX0RFUkVGIGVsc2l6ZSApOworfQorCit2b2lkICogRlROX1NURENBTEwKK0ZUTl9SRUFMTE9DKCB2b2lkICogS01QX0RFUkVGIHB0ciwgc2l6ZV90IEtNUF9ERVJFRiBzaXplICkKK3sKKyAgICAvLyBrbXBjX3JlYWxsb2MgaW5pdGlhbGl6ZXMgdGhlIGxpYnJhcnkgaWYgbmVlZGVkCisgICAgcmV0dXJuIGttcGNfcmVhbGxvYyggS01QX0RFUkVGIHB0ciwgS01QX0RFUkVGIHNpemUgKTsKK30KKwordm9pZCBGVE5fU1REQ0FMTAorRlROX0ZSRUUoIHZvaWQgKiBLTVBfREVSRUYgcHRyICkKK3sKKyAgICAvLyBkb2VzIG5vdGhpbmcgaWYgdGhlIGxpYnJhcnkgaXMgbm90IGluaXRpYWxpemVkCisgICAga21wY19mcmVlKCBLTVBfREVSRUYgcHRyICk7Cit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT04oIHZvaWQgKQoreworICAgICNpZm5kZWYgS01QX1NUVUIKKyAgICAgICAgX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPSBrbXBfd2FybmluZ3NfZXhwbGljaXQ7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfV0FSTklOR1NfT0ZGKCB2b2lkICkKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0gRkFMU0U7CisgICAgI2VuZGlmCit9CisKK3ZvaWQgRlROX1NURENBTEwKK0ZUTl9TRVRfREVGQVVMVFMoIGNoYXIgY29uc3QgKiBzdHIKKyAgICAjaWZuZGVmIFBBU1NfQVJHU19CWV9WQUxVRQorICAgICAgICAsIGludCBsZW4KKyAgICAjZW5kaWYKKykKK3sKKyAgICAjaWZuZGVmIEtNUF9TVFVCCisgICAgICAgICNpZmRlZiBQQVNTX0FSR1NfQllfVkFMVUUKKyAgICAgICAgICAgIGludCBsZW4gPSAoaW50KUtNUF9TVFJMRU4oIHN0ciApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYXV4X3NldF9kZWZhdWx0cyggc3RyLCBsZW4gKTsKKyAgICAjZW5kaWYKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisvKiByZXR1cm5zIHRoZSBzdGF0dXMgb2YgY2FuY2VsbGF0aW9uICovCitpbnQgRlROX1NURENBTEwKK3hleHBhbmQoRlROX0dFVF9DQU5DRUxMQVRJT04pKHZvaWQpIHsKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwIC8qIGZhbHNlICovOworI2Vsc2UKKyAgICAvLyBpbml0aWFsaXplIHRoZSBsaWJyYXJ5IGlmIG5lZWRlZAorICAgIGlmICggISBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX29tcF9jYW5jZWxsYXRpb247CisjZW5kaWYKK30KKworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMoaW50IGNhbmNlbF9raW5kKSB7CisjaWZkZWYgS01QX1NUVUIKKyAgICByZXR1cm4gMCAvKiBmYWxzZSAqLzsKKyNlbHNlCisgICAgcmV0dXJuIF9fa21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzKGNhbmNlbF9raW5kKTsKKyNlbmRpZgorfQorCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworI2lmIE9NUF80NV9FTkFCTEVECisvKiByZXR1cm5zIHRoZSBtYXhpbXVtIGFsbG93ZWQgdGFzayBwcmlvcml0eSAqLworaW50IEZUTl9TVERDQUxMCitGVE5fR0VUX01BWF9UQVNLX1BSSU9SSVRZKCB2b2lkICkKK3sKKyNpZmRlZiBLTVBfU1RVQgorICAgIHJldHVybiAwOworI2Vsc2UKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9tYXhfdGFza19wcmlvcml0eTsKKyNlbmRpZgorfQorI2VuZGlmCisKKy8vIEdDQyBjb21wYXRpYmlsaXR5ICh2ZXJzaW9uZWQgc3ltYm9scykKKyNpZmRlZiBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworCisvKgorICAgIFRoZXNlIGZvbGxvd2luZyBzZWN0aW9ucyBjcmVhdGUgZnVuY3Rpb24gYWxpYXNlcyAoZHVtbXkgc3ltYm9scykgZm9yIHRoZSBvbXBfKiByb3V0aW5lcy4KKyAgICBUaGVzZSBhbGlhc2VzIHdpbGwgdGhlbiBiZSB2ZXJzaW9uZWQgYWNjb3JkaW5nIHRvIGhvdyBsaWJnb21wIGBgdmVyc2lvbnMnJyBpdHMKKyAgICBzeW1ib2xzIChPTVBfMS4wLCBPTVBfMi4wLCBPTVBfMy4wLCAuLi4pIHdoaWxlIGFsc28gcmV0YWluaW5nIHRoZQorICAgIGRlZmF1bHQgdmVyc2lvbiB3aGljaCBsaWJvbXAgdXNlczogVkVSU0lPTiAoZGVmaW5lZCBpbiBleHBvcnRzX3NvLnR4dCkKKyAgICBJZiB5b3Ugd2FudCB0byBzZWUgdGhlIHZlcnNpb25lZCBzeW1ib2xzIGZvciBsaWJnb21wLnNvLjEgdGhlbiBqdXN0IHR5cGU6CisKKyAgICBvYmpkdW1wIC1UIC9wYXRoL3RvL2xpYmdvbXAuc28uMSB8IGdyZXAgb21wXworCisgICAgRXhhbXBsZToKKyAgICBTdGVwIDEpICBDcmVhdGUgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHNfMTBfYWxpYXMKKyAgICAgICAgICAgICB3aGljaCBpcyBhbGlhcyBvZiBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkcworICAgIFN0ZXAgMikgIFNldCBfX2ttcF9hcGlfb21wX3NldF9udW1fdGhyZWFkc18xMF9hbGlhcyB0byB2ZXJzaW9uOiBvbXBfc2V0X251bV90aHJlYWRzQE9NUF8xLjAKKyAgICBTdGVwIDJCKSBTZXQgX19rbXBfYXBpX29tcF9zZXRfbnVtX3RocmVhZHMgdG8gZGVmYXVsdCB2ZXJzaW9uIDogb21wX3NldF9udW1fdGhyZWFkc0BAVkVSU0lPTgorKi8KKworLy8gT01QXzEuMCBhbGlhc2VzCit4YWxpYXNpZnkoRlROX1NFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9USFJFQURfTlVNLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9OVU1fUFJPQ1MsICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9EWU5BTUlDLCAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0dFVF9ORVNURUQsICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTE9DSywgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1NFVF9ORVNUX0xPQ0ssICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTE9DSywgICAgICAgICAxMCk7Cit4YWxpYXNpZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAxMCk7CisKKy8vIE9NUF8yLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9HRVRfV1RJQ0ssIDIwKTsKK3hhbGlhc2lmeShGVE5fR0VUX1dUSU1FLCAyMCk7CisKKy8vIE9NUF8zLjAgYWxpYXNlcworeGFsaWFzaWZ5KEZUTl9TRVRfU0NIRURVTEUsICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEhSRUFEX0xJTUlULCAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfTEVWRUwsICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSwgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9HRVRfQUNUSVZFX0xFVkVMLCAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9JTklUX0xPQ0ssICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9ERVNUUk9ZX05FU1RfTE9DSywgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9MT0NLLCAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgICAgICAgMzApOworeGFsaWFzaWZ5KEZUTl9URVNUX05FU1RfTE9DSywgICAgICAgICAgMzApOworCisvLyBPTVBfMy4xIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fSU5fRklOQUwsIDMxKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisvLyBPTVBfNC4wIGFsaWFzZXMKK3hhbGlhc2lmeShGVE5fR0VUX1BST0NfQklORCwgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfTlVNX1RFQU1TLCA0MCk7Cit4YWxpYXNpZnkoRlROX0dFVF9URUFNX05VTSwgNDApOworeGFsaWFzaWZ5KEZUTl9HRVRfQ0FOQ0VMTEFUSU9OLCA0MCk7Cit4YWxpYXNpZnkoRlROX0lTX0lOSVRJQUxfREVWSUNFLCA0MCk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIE9NUF80NV9FTkFCTEVECisvLyBPTVBfNC41IGFsaWFzZXMKKyNlbmRpZgorCisjaWYgT01QXzUwX0VOQUJMRUQKKy8vIE9NUF81LjAgYWxpYXNlcworI2VuZGlmCisKKy8vIE9NUF8xLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTlVNX1RIUkVBRFMsICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9USFJFQURTLCAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9NQVhfVEhSRUFEUywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEhSRUFEX05VTSwgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9QUk9DUywgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOX1BBUkFMTEVMLCAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfRFlOQU1JQywgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0RZTkFNSUMsICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9ORVNURUQsICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTkVTVEVELCAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fSU5JVF9MT0NLLCAgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX0lOSVRfTkVTVF9MT0NLLCAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9ERVNUUk9ZX0xPQ0ssICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9ORVNUX0xPQ0ssIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9MT0NLLCAgICAgICAgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTkVTVF9MT0NLLCAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVU5TRVRfTE9DSywgICAgICAgIDEwLCAiT01QXzEuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX05FU1RfTE9DSywgICAxMCwgIk9NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9URVNUX0xPQ0ssICAgICAgICAgMTAsICJPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9ORVNUX0xPQ0ssICAgIDEwLCAiT01QXzEuMCIpOworCisvLyBPTVBfMi4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShGVE5fR0VUX1dUSUNLLCAgICAgICAgIDIwLCAiT01QXzIuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9XVElNRSwgICAgICAgICAyMCwgIk9NUF8yLjAiKTsKKworLy8gT01QXzMuMCB2ZXJzaW9uZWQgc3ltYm9scworeHZlcnNpb25pZnkoRlROX1NFVF9TQ0hFRFVMRSwgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfU0NIRURVTEUsICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX1RIUkVBRF9MSU1JVCwgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1NFVF9NQVhfQUNUSVZFX0xFVkVMUywgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfTUFYX0FDVElWRV9MRVZFTFMsICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0sIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9MRVZFTCwgICAgICAgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfVEVBTV9TSVpFLCAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX0FDVElWRV9MRVZFTCwgIDMwLCAiT01QXzMuMCIpOworCisvLyB0aGUgbG9jayByb3V0aW5lcyBoYXZlIGEgMS4wIGFuZCAzLjAgdmVyc2lvbgoreHZlcnNpb25pZnkoRlROX0lOSVRfTE9DSywgICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9JTklUX05FU1RfTE9DSywgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fREVTVFJPWV9MT0NLLCAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX0RFU1RST1lfTkVTVF9MT0NLLCAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9TRVRfTE9DSywgICAgICAgICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fU0VUX05FU1RfTE9DSywgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1VOU0VUX0xPQ0ssICAgICAgICAzMCwgIk9NUF8zLjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9VTlNFVF9ORVNUX0xPQ0ssICAgMzAsICJPTVBfMy4wIik7Cit4dmVyc2lvbmlmeShGVE5fVEVTVF9MT0NLLCAgICAgICAgIDMwLCAiT01QXzMuMCIpOworeHZlcnNpb25pZnkoRlROX1RFU1RfTkVTVF9MT0NLLCAgICAzMCwgIk9NUF8zLjAiKTsKKworLy8gT01QXzMuMSB2ZXJzaW9uZWQgc3ltYm9sCit4dmVyc2lvbmlmeShGVE5fSU5fRklOQUwsICAgICAgICAgIDMxLCAiT01QXzMuMSIpOworCisjaWYgT01QXzQwX0VOQUJMRUQKKy8vIE9NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfUFJPQ19CSU5ELCAgICAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fR0VUX05VTV9URUFNUywgICAgIDQwLCAiT01QXzQuMCIpOworeHZlcnNpb25pZnkoRlROX0dFVF9URUFNX05VTSwgICAgICA0MCwgIk9NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEZUTl9HRVRfQ0FOQ0VMTEFUSU9OLCAgNDAsICJPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShGVE5fSVNfSU5JVElBTF9ERVZJQ0UsIDQwLCAiT01QXzQuMCIpOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorLy8gT01QXzQuNSB2ZXJzaW9uZWQgc3ltYm9scworI2VuZGlmCisKKyNpZiBPTVBfNTBfRU5BQkxFRAorLy8gT01QXzUuMCB2ZXJzaW9uZWQgc3ltYm9scworI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9leHRyYS5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZDBmYjRjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fZXh0cmEuYwpAQCAtMCwwICsxLDMzIEBACisvKgorICoga21wX2Z0bl9leHRyYS5jIC0tIEZvcnRyYW4gJ2V4dHJhJyBsaW5rYWdlIHN1cHBvcnQgZm9yIE9wZW5NUC4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCisjaWYgS01QX09TX1dJTkRPV1MKKyMgICBkZWZpbmUgS01QX0ZUTl9FTlRSSUVTIEtNUF9GVE5fUExBSU4KKyNlbGlmIEtNUF9PU19VTklYCisjICAgZGVmaW5lIEtNUF9GVE5fRU5UUklFUyBLTVBfRlROX0FQUEVORAorI2VuZGlmCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5leHRyYVtdID0gS01QX1ZFUlNJT05fUFJFRklYICJGb3J0cmFuIFwiZXh0cmFcIiBPTVAgc3VwcG9ydDogIgorI2lmZGVmIEtNUF9GVE5fRU5UUklFUworICAgICJ5ZXMiOworIyAgIGRlZmluZSBGVE5fU1REQ0FMTCAvKiBub3RoaW5nIHRvIGRvICovCisjICAgaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorIyAgIGluY2x1ZGUgImttcF9mdG5fZW50cnkuaCIKKyNlbHNlCisgICAgIm5vIjsKKyNlbmRpZiAvKiBLTVBfRlROX0VOVFJJRVMgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZnRuX29zLmggYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ZmI3YzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9vcy5oCkBAIC0wLDAgKzEsNjIwIEBACisvKgorICoga21wX2Z0bl9vcy5oIC0tIEtQVFMgRm9ydHJhbiBkZWZpbmVzIGhlYWRlciBmaWxlLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9GVE5fT1NfSAorI2RlZmluZSBLTVBfRlROX09TX0gKKworLy8gS01QX0ZOVF9FTlRSSUVTIG1heSBiZSBvbmUgb2Y6IEtNUF9GVE5fUExBSU4sIEtNUF9GVE5fVVBQRVIsIEtNUF9GVE5fQVBQRU5ELCBLTVBfRlROX1VBUFBFTkQuCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gRXh0ZXJuYWwgZGVmaW5pdGlvbnMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9QTEFJTgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX3NldF9zdGFja3NpemUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBrbXBfc2V0X3N0YWNrc2l6ZV9zCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBrbXBfZ2V0X3N0YWNrc2l6ZV9zCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAga21wX3NldF9ibG9ja3RpbWUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV9zZXJpYWwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfdHVybmFyb3VuZAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0CisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAga21wX3NldF9saWJyYXJ5CisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAga21wX2dldF9saWJyYXJ5CisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0cworICAgICNkZWZpbmUgRlROX1NFVF9ESVNQX05VTV9CVUZGRVJTICAgICAgICAgICAgIGttcF9zZXRfZGlzcF9udW1fYnVmZmVycworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfYWZmaW5pdHkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAga21wX2dldF9hZmZpbml0eV9tYXhfcHJvYworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIGttcF9jcmVhdGVfYWZmaW5pdHlfbWFzaworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfc2V0X2FmZmluaXR5X21hc2tfcHJvYworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIGttcF91bnNldF9hZmZpbml0eV9tYXNrX3Byb2MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvYworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX21hbGxvYworICAgICNkZWZpbmUgRlROX0FMSUdORURfTUFMTE9DICAgICAgICAgICAgICAgICAgIGttcF9hbGlnbmVkX21hbGxvYworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jYWxsb2MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfcmVhbGxvYworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9mcmVlCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfc2V0X251bV90aHJlYWRzCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fdGhyZWFkcworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbWF4X3RocmVhZHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9wcm9jcworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfZHluYW1pYworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfZHluYW1pYworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfbmVzdGVkCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9uZXN0ZWQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5fcGFyYWxsZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RocmVhZF9saW1pdAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfc2NoZWR1bGUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3NjaGVkdWxlCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgb21wX3NldF9tYXhfYWN0aXZlX2xldmVscworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBvbXBfZ2V0X2FjdGl2ZV9sZXZlbAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbGV2ZWwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3RlYW1fc2l6ZQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9pbl9maW5hbAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfcHJvY19iaW5kCisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wcm9jX2JpbmQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBvbXBfY3Vycl9wcm9jX2JpbmQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RlYW1zCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX251bQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbG9jaworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBvbXBfaW5pdF9uZXN0X2xvY2tfd2l0aF9oaW50CisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBvbXBfZGVzdHJveV9sb2NrCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9sb2NrCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgb21wX3Vuc2V0X2xvY2sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfdGVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0X2xvY2sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX3Rlc3RfbmVzdF9sb2NrCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBrbXBfc2V0X3dhcm5pbmdzX29uCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vZmYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfd3RpbWUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aWNrCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBvbXBfc2V0X2RlZmF1bHRfZGV2aWNlCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fZGV2aWNlcworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgb21wX2lzX2luaXRpYWxfZGV2aWNlCisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb24KKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUyAgICAgICAgICBrbXBfZ2V0X2NhbmNlbGxhdGlvbl9zdGF0dXMKKyNlbmRpZgorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfTUFYX1RBU0tfUFJJT1JJVFkgICAgICAgICAgICBvbXBfZ2V0X21heF90YXNrX3ByaW9yaXR5CisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcGxhY2VzCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTV9QUk9DUyAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW1fcHJvY3MKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfUFJPQ19JRFMgICAgICAgICAgICAgICBvbXBfZ2V0X3BsYWNlX3Byb2NfaWRzCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW0KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX05VTV9QTEFDRVMgICAgICAgICBvbXBfZ2V0X3BhcnRpdGlvbl9udW1fcGxhY2VzCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TICAgICAgICAgb21wX2dldF9wYXJ0aXRpb25fcGxhY2VfbnVtcworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2UKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfQUxMT0MgICAgICAgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X2FsbG9jCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9mcmVlCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgb21wX3RhcmdldF9pc19wcmVzZW50CisgICAgI2RlZmluZSBGVE5fVEFSR0VUX01FTUNQWSAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9tZW1jcHkKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZX1JFQ1QgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X21lbWNweV9yZWN0CisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0RJU0FTU09DSUFURV9QVFIgICAgICAgICAgb21wX3RhcmdldF9kaXNhc3NvY2lhdGVfcHRyCisjIGVuZGlmCisjZW5kaWYKKworI2VuZGlmIC8qIEtNUF9GVE5fUExBSU4gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9BUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIGttcF9zZXRfc3RhY2tzaXplX3NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAga21wX2dldF9zdGFja3NpemVfc18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfc2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2Jsb2NrdGltZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBrbXBfc2V0X2xpYnJhcnlfc2VyaWFsXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90dXJuYXJvdW5kXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV90aHJvdWdocHV0XworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIGttcF9zZXRfbGlicmFyeV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2xpYnJhcnlfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAga21wX3NldF9kZWZhdWx0c18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyAgICAgICAgICAgICBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnNfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAga21wX3NldF9hZmZpbml0eV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5XworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIGttcF9nZXRfYWZmaW5pdHlfbWF4X3Byb2NfCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAga21wX2NyZWF0ZV9hZmZpbml0eV9tYXNrXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIGttcF9kZXN0cm95X2FmZmluaXR5X21hc2tfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAga21wX3NldF9hZmZpbml0eV9tYXNrX3Byb2NfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAga21wX3Vuc2V0X2FmZmluaXR5X21hc2tfcHJvY18KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBrbXBfZ2V0X2FmZmluaXR5X21hc2tfcHJvY18KKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9tYWxsb2NfCisgICAgI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0MgICAgICAgICAgICAgICAgICAga21wX2FsaWduZWRfbWFsbG9jXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9jYWxsb2NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAga21wX3JlYWxsb2NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAga21wX2ZyZWVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBrbXBfZ2V0X251bV9rbm93bl90aHJlYWRzXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgb21wX3NldF9udW1fdGhyZWFkc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV90aHJlYWRzXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbWF4X3RocmVhZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgb21wX2dldF90aHJlYWRfbnVtXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3Byb2NzXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfZHluYW1pY18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X2R5bmFtaWNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9uZXN0ZWRfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9uZXN0ZWRfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgb21wX2luX3BhcmFsbGVsXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGhyZWFkX2xpbWl0XworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfc2NoZWR1bGVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9zY2hlZHVsZV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIG9tcF9nZXRfbWF4X2FjdGl2ZV9sZXZlbHNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgb21wX2dldF9hY3RpdmVfbGV2ZWxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgb21wX2dldF9sZXZlbF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBvbXBfZ2V0X2FuY2VzdG9yX3RocmVhZF9udW1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgb21wX2dldF90ZWFtX3NpemVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgb21wX2luX2ZpbmFsXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9zZXRfcHJvY19iaW5kXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfcHJvY19iaW5kXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIG9tcF9jdXJyX3Byb2NfYmluZF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfbnVtX3RlYW1zXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfdGVhbV9udW1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBvbXBfaW5pdF9sb2NrXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgb21wX2luaXRfbG9ja193aXRoX2hpbnRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrX3dpdGhfaGludF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X2xvY2tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgb21wX3NldF9sb2NrXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIG9tcF91bnNldF9sb2NrXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X2xvY2tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgb21wX2luaXRfbmVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIG9tcF9kZXN0cm95X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBvbXBfc2V0X25lc3RfbG9ja18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIG9tcF90ZXN0X25lc3RfbG9ja18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIGttcF9zZXRfd2FybmluZ3Nfb25fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAga21wX3NldF93YXJuaW5nc19vZmZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBvbXBfZ2V0X3d0aW1lXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIG9tcF9nZXRfd3RpY2tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfZGVmYXVsdF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgb21wX3NldF9kZWZhdWx0X2RldmljZV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgICAgICAgICAgICAgICAgICBvbXBfZ2V0X251bV9kZXZpY2VzXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgb21wX2lzX2luaXRpYWxfZGV2aWNlXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgb21wX2dldF9jYW5jZWxsYXRpb25fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAga21wX2dldF9jYW5jZWxsYXRpb25fc3RhdHVzXworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHlfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgb21wX2dldF9udW1fcGxhY2VzXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9OVU1fUFJPQ1MgICAgICAgICAgICAgIG9tcF9nZXRfcGxhY2VfbnVtX3Byb2NzXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIG9tcF9nZXRfcGxhY2VfcHJvY19pZHNfCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgb21wX2dldF9wbGFjZV9udW1fCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTICAgICAgICAgb21wX2dldF9wYXJ0aXRpb25fbnVtX3BsYWNlc18KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBvbXBfZ2V0X3BhcnRpdGlvbl9wbGFjZV9udW1zXworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIG9tcF9nZXRfaW5pdGlhbF9kZXZpY2VfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgb21wX3RhcmdldF9hbGxvY18KKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBvbXBfdGFyZ2V0X2ZyZWVfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgb21wX3RhcmdldF9pc19wcmVzZW50XworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgICAgICAgICAgICAgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5XworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIG9tcF90YXJnZXRfbWVtY3B5X3JlY3RfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgb21wX3RhcmdldF9hc3NvY2lhdGVfcHRyXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSICAgICAgICAgIG9tcF90YXJnZXRfZGlzYXNzb2NpYXRlX3B0cl8KKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9BUFBFTkQgKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfRlROX0VOVFJJRVMgPT0gS01QX0ZUTl9VUFBFUgorCisgICAgI2RlZmluZSBGVE5fU0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9TRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfU0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU1RBQ0tTSVpFX1MgICAgICAgICAgICAgICAgICBLTVBfR0VUX1NUQUNLU0laRV9TCisgICAgI2RlZmluZSBGVE5fU0VUX0JMT0NLVElNRSAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9CTE9DS1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRQorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1NFUklBTCAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9TRVJJQUwKKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9UVVJOQVJPVU5EICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfVFVSTkFST1VORAorICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUCisgICAgI2RlZmluZSBGVE5fU0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fR0VUX0xJQlJBUlkgICAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9MSUJSQVJZCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUUworICAgICNkZWZpbmUgRlROX1NFVF9ESVNQX05VTV9CVUZGRVJTICAgICAgICAgICAgIEtNUF9TRVRfRElTUF9OVU1fQlVGRkVSUworICAgICNkZWZpbmUgRlROX1NFVF9BRkZJTklUWSAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfQUZGSU5JVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZCisgICAgI2RlZmluZSBGVE5fR0VUX0FGRklOSVRZX01BWF9QUk9DICAgICAgICAgICAgS01QX0dFVF9BRkZJTklUWV9NQVhfUFJPQworICAgICNkZWZpbmUgRlROX0NSRUFURV9BRkZJTklUWV9NQVNLICAgICAgICAgICAgIEtNUF9DUkVBVEVfQUZGSU5JVFlfTUFTSworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0sKKyAgICAjZGVmaW5lIEZUTl9TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfU0VUX0FGRklOSVRZX01BU0tfUFJPQworICAgICNkZWZpbmUgRlROX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgIEtNUF9VTlNFVF9BRkZJTklUWV9NQVNLX1BST0MKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQworCisgICAgI2RlZmluZSBGVE5fTUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01BTExPQworICAgICNkZWZpbmUgRlROX0FMSUdORURfTUFMTE9DICAgICAgICAgICAgICAgICAgIEtNUF9BTElHTkVEX01BTExPQworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9SRUFMTE9DICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfUkVBTExPQworICAgICNkZWZpbmUgRlROX0ZSRUUgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9GUkVFCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfU0VUX05VTV9USFJFQURTCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fVEhSRUFEUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX05VTSAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BST0NTICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX0dFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfRFlOQU1JQworICAgICNkZWZpbmUgRlROX1NFVF9ORVNURUQgICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfTkVTVEVECisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURUQKKyAgICAjZGVmaW5lIEZUTl9JTl9QQVJBTExFTCAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5fUEFSQUxMRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfVEhSRUFEX0xJTUlUICAgICAgICAgICAgICAgICBPTVBfR0VUX1RIUkVBRF9MSU1JVAorICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEUKKyAgICAjZGVmaW5lIEZUTl9HRVRfU0NIRURVTEUgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1NDSEVEVUxFCisgICAgI2RlZmluZSBGVE5fU0VUX01BWF9BQ1RJVkVfTEVWRUxTICAgICAgICAgICAgT01QX1NFVF9NQVhfQUNUSVZFX0xFVkVMUworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfQUNUSVZFX0xFVkVMICAgICAgICAgICAgICAgICBPTVBfR0VUX0FDVElWRV9MRVZFTAorICAgICNkZWZpbmUgRlROX0dFVF9MRVZFTCAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTEVWRUwKKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU0KKyAgICAjZGVmaW5lIEZUTl9HRVRfVEVBTV9TSVpFICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1RFQU1fU0laRQorICAgICNkZWZpbmUgRlROX0lOX0ZJTkFMICAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9JTl9GSU5BTAorLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5ECisgICAgI2RlZmluZSBGVE5fR0VUX1BST0NfQklORCAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QUk9DX0JJTkQKKy8vICAjZGVmaW5lIEZUTl9DVVJSX1BST0NfQklORCAgICAgICAgICAgICAgICAgICBPTVBfQ1VSUl9QUk9DX0JJTkQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fTlVNICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX05VTQorI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTE9DSworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlQKKyAgICAjZGVmaW5lIEZUTl9JTklUX05FU1RfTE9DS19XSVRIX0hJTlQgICAgICAgICBPTVBfSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9ERVNUUk9ZX0xPQ0sgICAgICAgICAgICAgICAgICAgICBPTVBfREVTVFJPWV9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVU5TRVRfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgT01QX1VOU0VUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9URVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfVEVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fREVTVFJPWV9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgT01QX0RFU1RST1lfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNUX0xPQ0sKKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLCisgICAgI2RlZmluZSBGVE5fVEVTVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX1RFU1RfTkVTVF9MT0NLCisKKyAgICAjZGVmaW5lIEZUTl9TRVRfV0FSTklOR1NfT04gICAgICAgICAgICAgICAgICBLTVBfU0VUX1dBUk5JTkdTX09OCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkYKKworICAgICNkZWZpbmUgRlROX0dFVF9XVElNRSAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJTUUKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSUNLCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0UKKyAgICAjZGVmaW5lIEZUTl9TRVRfREVGQVVMVF9ERVZJQ0UgICAgICAgICAgICAgICBPTVBfU0VUX0RFRkFVTFRfREVWSUNFCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9ERVZJQ0VTICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fREVWSUNFUworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFCisjZW5kaWYKKworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAjZGVmaW5lIEZUTl9HRVRfQ0FOQ0VMTEFUSU9OICAgICAgICAgICAgICAgICBPTVBfR0VUX0NBTkNFTExBVElPTgorICAgICNkZWZpbmUgRlROX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTICAgICAgICAgIEtNUF9HRVRfQ0FOQ0VMTEFUSU9OX1NUQVRVUworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFkKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1BMQUNFUyAgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9QTEFDRVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNX1BST0NTICAgICAgICAgICAgICBPTVBfR0VUX1BMQUNFX05VTV9QUk9DUworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfUFJPQ19JRFMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUExBQ0VfTlVNICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1BMQUNFX05VTQorICAgICNkZWZpbmUgRlROX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFUyAgICAgICAgIE9NUF9HRVRfUEFSVElUSU9OX05VTV9QTEFDRVMKKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBPTVBfR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TCisjIGlmZGVmIEtNUF9TVFVCCisgICAgI2RlZmluZSBGVE5fR0VUX0lOSVRJQUxfREVWSUNFICAgICAgICAgICAgICAgT01QX0dFVF9JTklUSUFMX0RFVklDRQorICAgICNkZWZpbmUgRlROX1RBUkdFVF9BTExPQyAgICAgICAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfQUxMT0MKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0ZSRUUKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfSVNfUFJFU0VOVCAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0lTX1BSRVNFTlQKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfTUVNQ1BZICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX01FTUNQWQorICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZX1JFQ1QKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfQVNTT0NJQVRFX1BUUiAgICAgICAgICAgICBPTVBfVEFSR0VUX0FTU09DSUFURV9QVFIKKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUiAgICAgICAgICBPTVBfVEFSR0VUX0RJU0FTU09DSUFURV9QVFIKKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VUFBFUiAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9GVE5fRU5UUklFUyA9PSBLTVBfRlROX1VBUFBFTkQKKworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkUgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFXworICAgICNkZWZpbmUgRlROX1NFVF9TVEFDS1NJWkVfUyAgICAgICAgICAgICAgICAgIEtNUF9TRVRfU1RBQ0tTSVpFX1NfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRSAgICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NUQUNLU0laRV9TICAgICAgICAgICAgICAgICAgS01QX0dFVF9TVEFDS1NJWkVfU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQkxPQ0tUSU1FICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0JMT0NLVElNRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTElCUkFSWV9TRVJJQUwgICAgICAgICAgICAgICBLTVBfU0VUX0xJQlJBUllfU0VSSUFMXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RVUk5BUk9VTkQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9UVVJOQVJPVU5EXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZX1RIUk9VR0hQVVQgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV9USFJPVUdIUFVUXworICAgICNkZWZpbmUgRlROX1NFVF9MSUJSQVJZICAgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfTElCUkFSWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTElCUkFSWSAgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0xJQlJBUllfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRTICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9ERUZBVUxUU18KKyAgICAjZGVmaW5lIEZUTl9TRVRfRElTUF9OVU1fQlVGRkVSUyAgICAgICAgICAgICBLTVBfU0VUX0RJU1BfTlVNX0JVRkZFUlNfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZICAgICAgICAgICAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFkgICAgICAgICAgICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZXworICAgICNkZWZpbmUgRlROX0dFVF9BRkZJTklUWV9NQVhfUFJPQyAgICAgICAgICAgIEtNUF9HRVRfQUZGSU5JVFlfTUFYX1BST0NfCisgICAgI2RlZmluZSBGVE5fQ1JFQVRFX0FGRklOSVRZX01BU0sgICAgICAgICAgICAgS01QX0NSRUFURV9BRkZJTklUWV9NQVNLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfQUZGSU5JVFlfTUFTSyAgICAgICAgICAgIEtNUF9ERVNUUk9ZX0FGRklOSVRZX01BU0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0FGRklOSVRZX01BU0tfUFJPQyAgICAgICAgICAgS01QX1NFVF9BRkZJTklUWV9NQVNLX1BST0NfCisgICAgI2RlZmluZSBGVE5fVU5TRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgS01QX1VOU0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfQUZGSU5JVFlfTUFTS19QUk9DICAgICAgICAgICBLTVBfR0VUX0FGRklOSVRZX01BU0tfUFJPQ18KKworICAgICNkZWZpbmUgRlROX01BTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NQUxMT0NfCisgICAgI2RlZmluZSBGVE5fQUxJR05FRF9NQUxMT0MgICAgICAgICAgICAgICAgICAgS01QX0FMSUdORURfTUFMTE9DXworICAgICNkZWZpbmUgRlROX0NBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9DQUxMT0NfCisgICAgI2RlZmluZSBGVE5fUkVBTExPQyAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1JFQUxMT0NfCisgICAgI2RlZmluZSBGVE5fRlJFRSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0ZSRUVfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0tOT1dOX1RIUkVBRFMgICAgICAgICAgICBLTVBfR0VUX05VTV9LTk9XTl9USFJFQURTXworCisgICAgI2RlZmluZSBGVE5fU0VUX05VTV9USFJFQURTICAgICAgICAgICAgICAgICAgT01QX1NFVF9OVU1fVEhSRUFEU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX1RIUkVBRFMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9USFJFQURTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEhSRUFEUyAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RIUkVBRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1RIUkVBRF9OVU0gICAgICAgICAgICAgICAgICAgT01QX0dFVF9USFJFQURfTlVNXworICAgICNkZWZpbmUgRlROX0dFVF9OVU1fUFJPQ1MgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX1NFVF9EWU5BTUlDICAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfRFlOQU1JQ18KKyAgICAjZGVmaW5lIEZUTl9HRVRfRFlOQU1JQyAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX0RZTkFNSUNfCisgICAgI2RlZmluZSBGVE5fU0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fR0VUX05FU1RFRCAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9ORVNURURfCisgICAgI2RlZmluZSBGVE5fSU5fUEFSQUxMRUwgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX1BBUkFMTEVMXworICAgICNkZWZpbmUgRlROX0dFVF9USFJFQURfTElNSVQgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEhSRUFEX0xJTUlUXworICAgICNkZWZpbmUgRlROX1NFVF9TQ0hFRFVMRSAgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfU0NIRURVTEVfCisgICAgI2RlZmluZSBGVE5fR0VUX1NDSEVEVUxFICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9TQ0hFRFVMRV8KKyAgICAjZGVmaW5lIEZUTl9TRVRfTUFYX0FDVElWRV9MRVZFTFMgICAgICAgICAgICBPTVBfU0VUX01BWF9BQ1RJVkVfTEVWRUxTXworICAgICNkZWZpbmUgRlROX0dFVF9NQVhfQUNUSVZFX0xFVkVMUyAgICAgICAgICAgIE9NUF9HRVRfTUFYX0FDVElWRV9MRVZFTFNfCisgICAgI2RlZmluZSBGVE5fR0VUX0FDVElWRV9MRVZFTCAgICAgICAgICAgICAgICAgT01QX0dFVF9BQ1RJVkVfTEVWRUxfCisgICAgI2RlZmluZSBGVE5fR0VUX0xFVkVMICAgICAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9MRVZFTF8KKyAgICAjZGVmaW5lIEZUTl9HRVRfQU5DRVNUT1JfVEhSRUFEX05VTSAgICAgICAgICBPTVBfR0VUX0FOQ0VTVE9SX1RIUkVBRF9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1RFQU1fU0laRSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9URUFNX1NJWkVfCisgICAgI2RlZmluZSBGVE5fSU5fRklOQUwgICAgICAgICAgICAgICAgICAgICAgICAgT01QX0lOX0ZJTkFMXworLy8gICNkZWZpbmUgRlROX1NFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9TRVRfUFJPQ19CSU5EXworICAgICNkZWZpbmUgRlROX0dFVF9QUk9DX0JJTkQgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfUFJPQ19CSU5EXworLy8gICNkZWZpbmUgRlROX0NVUlJfUFJPQ19CSU5EICAgICAgICAgICAgICAgICAgIE9NUF9DVVJSX1BST0NfQklORF8KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9OVU1fVEVBTVMgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfTlVNX1RFQU1TXworICAgICNkZWZpbmUgRlROX0dFVF9URUFNX05VTSAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfVEVBTV9OVU1fCisjZW5kaWYKKyAgICAjZGVmaW5lIEZUTl9JTklUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICBPTVBfSU5JVF9MT0NLXworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgI2RlZmluZSBGVE5fSU5JVF9MT0NLX1dJVEhfSElOVCAgICAgICAgICAgICAgT01QX0lOSVRfTE9DS19XSVRIX0hJTlRfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0tfV0lUSF9ISU5UICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLX1dJVEhfSElOVF8KKyNlbmRpZgorICAgICNkZWZpbmUgRlROX0RFU1RST1lfTE9DSyAgICAgICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgICAgT01QX1NFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1VOU0VUX0xPQ0sgICAgICAgICAgICAgICAgICAgICAgIE9NUF9VTlNFVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTE9DSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX0xPQ0tfCisgICAgI2RlZmluZSBGVE5fSU5JVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICAgT01QX0lOSVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX0RFU1RST1lfTkVTVF9MT0NLICAgICAgICAgICAgICAgIE9NUF9ERVNUUk9ZX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9TRVRfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgICBPTVBfU0VUX05FU1RfTE9DS18KKyAgICAjZGVmaW5lIEZUTl9VTlNFVF9ORVNUX0xPQ0sgICAgICAgICAgICAgICAgICBPTVBfVU5TRVRfTkVTVF9MT0NLXworICAgICNkZWZpbmUgRlROX1RFU1RfTkVTVF9MT0NLICAgICAgICAgICAgICAgICAgIE9NUF9URVNUX05FU1RfTE9DS18KKworICAgICNkZWZpbmUgRlROX1NFVF9XQVJOSU5HU19PTiAgICAgICAgICAgICAgICAgIEtNUF9TRVRfV0FSTklOR1NfT05fCisgICAgI2RlZmluZSBGVE5fU0VUX1dBUk5JTkdTX09GRiAgICAgICAgICAgICAgICAgS01QX1NFVF9XQVJOSU5HU19PRkZfCisKKyAgICAjZGVmaW5lIEZUTl9HRVRfV1RJTUUgICAgICAgICAgICAgICAgICAgICAgICBPTVBfR0VUX1dUSU1FXworICAgICNkZWZpbmUgRlROX0dFVF9XVElDSyAgICAgICAgICAgICAgICAgICAgICAgIE9NUF9HRVRfV1RJQ0tfCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorI2lmIEtNUF9NSUMgfHwgS01QX09TX0RBUldJTiB8fCBkZWZpbmVkKEtNUF9TVFVCKQorICAgICNkZWZpbmUgRlROX0dFVF9ERUZBVUxUX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfREVGQVVMVF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fU0VUX0RFRkFVTFRfREVWSUNFICAgICAgICAgICAgICAgT01QX1NFVF9ERUZBVUxUX0RFVklDRV8KKyAgICAjZGVmaW5lIEZUTl9HRVRfTlVNX0RFVklDRVMgICAgICAgICAgICAgICAgICBPTVBfR0VUX05VTV9ERVZJQ0VTXworI2VuZGlmCisgICAgI2RlZmluZSBGVE5fSVNfSU5JVElBTF9ERVZJQ0UgICAgICAgICAgICAgICAgT01QX0lTX0lOSVRJQUxfREVWSUNFXworI2VuZGlmCisKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTiAgICAgICAgICAgICAgICAgT01QX0dFVF9DQU5DRUxMQVRJT05fCisgICAgI2RlZmluZSBGVE5fR0VUX0NBTkNFTExBVElPTl9TVEFUVVMgICAgICAgICAgS01QX0dFVF9DQU5DRUxMQVRJT05fU1RBVFVTXworI2VuZGlmCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICNkZWZpbmUgRlROX0dFVF9NQVhfVEFTS19QUklPUklUWSAgICAgICAgICAgIE9NUF9HRVRfTUFYX1RBU0tfUFJJT1JJVFlfCisgICAgI2RlZmluZSBGVE5fR0VUX05VTV9QTEFDRVMgICAgICAgICAgICAgICAgICAgT01QX0dFVF9OVU1fUExBQ0VTXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9OVU1fUFJPQ1MgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfTlVNX1BST0NTXworICAgICNkZWZpbmUgRlROX0dFVF9QTEFDRV9QUk9DX0lEUyAgICAgICAgICAgICAgIE9NUF9HRVRfUExBQ0VfUFJPQ19JRFNfCisgICAgI2RlZmluZSBGVE5fR0VUX1BMQUNFX05VTSAgICAgICAgICAgICAgICAgICAgT01QX0dFVF9QTEFDRV9OVU1fCisgICAgI2RlZmluZSBGVE5fR0VUX1BBUlRJVElPTl9OVU1fUExBQ0VTICAgICAgICAgT01QX0dFVF9QQVJUSVRJT05fTlVNX1BMQUNFU18KKyAgICAjZGVmaW5lIEZUTl9HRVRfUEFSVElUSU9OX1BMQUNFX05VTVMgICAgICAgICBPTVBfR0VUX1BBUlRJVElPTl9QTEFDRV9OVU1TXworIyBpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgRlROX0dFVF9JTklUSUFMX0RFVklDRSAgICAgICAgICAgICAgIE9NUF9HRVRfSU5JVElBTF9ERVZJQ0VfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FMTE9DICAgICAgICAgICAgICAgICAgICAgT01QX1RBUkdFVF9BTExPQ18KKyAgICAjZGVmaW5lIEZUTl9UQVJHRVRfRlJFRSAgICAgICAgICAgICAgICAgICAgICBPTVBfVEFSR0VUX0ZSRUVfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0lTX1BSRVNFTlQgICAgICAgICAgICAgICAgT01QX1RBUkdFVF9JU19QUkVTRU5UXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFkgICAgICAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9NRU1DUFlfUkVDVCAgICAgICAgICAgICAgIE9NUF9UQVJHRVRfTUVNQ1BZX1JFQ1RfCisgICAgI2RlZmluZSBGVE5fVEFSR0VUX0FTU09DSUFURV9QVFIgICAgICAgICAgICAgT01QX1RBUkdFVF9BU1NPQ0lBVEVfUFRSXworICAgICNkZWZpbmUgRlROX1RBUkdFVF9ESVNBU1NPQ0lBVEVfUFRSICAgICAgICAgIE9NUF9UQVJHRVRfRElTQVNTT0NJQVRFX1BUUl8KKyMgZW5kaWYKKyNlbmRpZgorCisjZW5kaWYgLyogS01QX0ZUTl9VQVBQRU5EICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gR09NUCBBUEkgTkFNRVMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvLyBBbGwgR09NUF8xLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5EICAgICAgICAgICAgICAgICAgIEdPTVBfYXRvbWljX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfU1RBUlQgICAgICAgICAgICAgICAgIEdPTVBfYXRvbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIgICAgICAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCAgICAgICAgICAgICAgICAgR09NUF9jcml0aWNhbF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQgICAgICAgICAgICBHT01QX2NyaXRpY2FsX25hbWVfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfU1RBUlQgICAgICAgICAgR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJUICAgICAgICAgICAgICAgR09NUF9jcml0aWNhbF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfTkVYVCAgICAgICAgICAgIEdPTVBfbG9vcF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX1NUQVJUICAgICAgICAgICBHT01QX2xvb3BfZHluYW1pY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCAgICAgICAgICAgICAgICAgICAgIEdPTVBfbG9vcF9lbmQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfTk9XQUlUICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX25vd2FpdAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUICAgICAgICAgICAgIEdPTVBfbG9vcF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCAgICAgICAgICAgIEdPTVBfbG9vcF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfTkVYVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9keW5hbWljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQgICBHT01QX2xvb3Bfb3JkZXJlZF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCAgICAgR09NUF9sb29wX29yZGVyZWRfZ3VpZGVkX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9TVEFSVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9ndWlkZWRfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfTkVYVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQgICBHT01QX2xvb3Bfb3JkZXJlZF9ydW50aW1lX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9TVEFUSUNfTkVYVCAgICAgR09NUF9sb29wX29yZGVyZWRfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCAgICBHT01QX2xvb3Bfb3JkZXJlZF9zdGF0aWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQgICAgICAgICAgICBHT01QX2xvb3BfcnVudGltZV9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfUlVOVElNRV9TVEFSVCAgICAgICAgICAgR09NUF9sb29wX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCAgICAgICAgICAgICBHT01QX2xvb3Bfc3RhdGljX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQgICAgICAgICAgICBHT01QX2xvb3Bfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5EICAgICAgICAgICAgICAgICAgR09NUF9vcmRlcmVkX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfb3JkZXJlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQgICAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfZW5kCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERURfU1RBUlQgICBHT01QX3BhcmFsbGVsX2xvb3BfZ3VpZGVkX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCAgR09NUF9wYXJhbGxlbF9sb29wX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUNfU1RBUlQgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TX1NUQVJUICAgICAgR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCAgICAgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EICAgICAgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUICAgICAgICAgIEdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhUICAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19TVEFSVCAgICAgICAgICAgICAgIEdPTVBfc2VjdGlvbnNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX0NPUFlfRU5EICAgICAgICAgICAgICBHT01QX3NpbmdsZV9jb3B5X2VuZAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCAgICAgICAgICAgIEdPTVBfc2luZ2xlX2NvcHlfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfU0lOR0xFX1NUQVJUICAgICAgICAgICAgICAgICBHT01QX3NpbmdsZV9zdGFydAorCisvLyBBbGwgR09NUF8yLjAgc3ltYm9scworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVNLICAgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXNrCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUICAgICAgICAgICAgICAgICAgICAgICBHT01QX3Rhc2t3YWl0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfTkVYVCAgICAgICAgICBHT01QX2xvb3BfdWxsX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUICAgICAgICAgR09NUF9sb29wX3VsbF9keW5hbWljX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhUICAgICAgICAgICBHT01QX2xvb3BfdWxsX2d1aWRlZF9uZXh0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCAgICAgICAgICBHT01QX2xvb3BfdWxsX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfTkVYVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2R5bmFtaWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQgR09NUF9sb29wX3VsbF9vcmRlcmVkX2R5bmFtaWNfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfTkVYVCAgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9ndWlkZWRfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9TVEFSVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX2d1aWRlZF9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3J1bnRpbWVfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQgR09NUF9sb29wX3VsbF9vcmRlcmVkX3J1bnRpbWVfc3RhcnQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCAgIEdPTVBfbG9vcF91bGxfb3JkZXJlZF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCAgR09NUF9sb29wX3VsbF9vcmRlcmVkX3N0YXRpY19zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX05FWFQgICAgICAgICAgR09NUF9sb29wX3VsbF9ydW50aW1lX25leHQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9TVEFSVCAgICAgICAgIEdPTVBfbG9vcF91bGxfcnVudGltZV9zdGFydAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCAgICAgICAgICAgR09NUF9sb29wX3VsbF9zdGF0aWNfbmV4dAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQgICAgICAgICAgR09NUF9sb29wX3VsbF9zdGF0aWNfc3RhcnQKKworLy8gQWxsIEdPTVBfMy4wIHN5bWJvbHMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxEICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFza3lpZWxkCisKKy8vIEFsbCBHT01QXzQuMCBzeW1ib2xzCisvLyBUT0RPOiBBcyBvZiAyMDEzLTEwLTE0LCBub25lIG9mIHRoZSBHT01QXzQuMCBmdW5jdGlvbnMgYXJlIGltcGxlbWVudGVkIGluIGxpYm9tcAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9CQVJSSUVSX0NBTkNFTCAgICAgICAgICAgICAgICAgR09NUF9iYXJyaWVyX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UICAgICAgICAgICAgIEdPTVBfY2FuY2VsbGF0aW9uX3BvaW50CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCAgICAgICAgICAgICAgICBHT01QX2xvb3BfZW5kX2NhbmNlbAorI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMgICAgICAgICAgR09NUF9wYXJhbGxlbF9sb29wX2R5bmFtaWMKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9HVUlERUQgICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ndWlkZWQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FICAgICAgICAgIEdPTVBfcGFyYWxsZWxfbG9vcF9ydW50aW1lCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDICAgICAgICAgICBHT01QX3BhcmFsbGVsX2xvb3Bfc3RhdGljCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsX3NlY3Rpb25zCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMICAgICAgICAgICAgICAgICAgICAgICBHT01QX3BhcmFsbGVsCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9DQU5DRUwgICAgICAgICAgICBHT01QX3NlY3Rpb25zX2VuZF9jYW5jZWwKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUICAgICAgICAgICAgICAgIEdPTVBfdGFza2dyb3VwX3N0YXJ0CisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQgICAgICAgICAgICAgICAgICBHT01QX3Rhc2tncm91cF9lbmQKKy8qIFRhcmdldCBmdW5jdGlvbnMgc2hvdWxkIGJlIHRha2VuIGNhcmUgb2YgYnkgbGlib2ZmbG9hZCAqLworI2RlZmluZSBLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQgICAgICAgICAgICAgICAgICAgICAgICAgR09NUF90YXJnZXQKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0RBVEEgICAgICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2RhdGEKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBICAgICAgICAgICAgICAgIEdPTVBfdGFyZ2V0X2VuZF9kYXRhCisjZGVmaW5lIEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUgICAgICAgICAgICAgICAgICBHT01QX3RhcmdldF91cGRhdGUKKyNkZWZpbmUgS01QX0FQSV9OQU1FX0dPTVBfVEVBTVMgICAgICAgICAgICAgICAgICAgICAgICAgIEdPTVBfdGVhbXMKKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisgICAgI2RlZmluZSB4c3RyKHgpIHN0cih4KQorICAgICNkZWZpbmUgc3RyKHgpICN4CisKKyAgICAvLyBJZiBMaW51eCwgeGV4cGFuZCBwcmVwZW5kcyBfX2ttcF9hcGlfIHRvIHRoZSByZWFsIEFQSSBuYW1lCisgICAgI2RlZmluZSB4ZXhwYW5kKGFwaV9uYW1lKSBleHBhbmQoYXBpX25hbWUpCisgICAgI2RlZmluZSBleHBhbmQoYXBpX25hbWUpIF9fa21wX2FwaV8jI2FwaV9uYW1lCisKKyAgICAjZGVmaW5lIHhhbGlhc2lmeShhcGlfbmFtZSx2ZXIpIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikKKyAgICAjZGVmaW5lIGFsaWFzaWZ5KGFwaV9uYW1lLHZlcikgX190eXBlb2ZfXyhfX2ttcF9hcGlfIyNhcGlfbmFtZSkgX19rbXBfYXBpXyMjYXBpX25hbWUjI18jI3ZlciMjX2FsaWFzIF9fYXR0cmlidXRlX18oKGFsaWFzKHhzdHIoX19rbXBfYXBpXyMjYXBpX25hbWUpKSkpCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgIlZFUlNJT04iKQorICAgICNkZWZpbmUgdmVyc2lvbmlmeShhcGlfbmFtZSwgdmVyc2lvbl9udW0sIHZlcnNpb25fc3RyLCBkZWZhdWx0X3ZlcikgXAorICAgIF9fYXNtX18oIi5zeW12ZXIgIiB4c3RyKF9fa21wX2FwaV8jI2FwaV9uYW1lIyNfIyN2ZXJzaW9uX251bSMjX2FsaWFzKSAiLCIgeHN0cihhcGlfbmFtZSkgIkAiIHZlcnNpb25fc3RyICJcblx0Iik7IFwKKyAgICBfX2FzbV9fKCIuc3ltdmVyICIgeHN0cihfX2ttcF9hcGlfIyNhcGlfbmFtZSkgIiwiIHhzdHIoYXBpX25hbWUpICJAQCIgZGVmYXVsdF92ZXIgIlxuXHQiKQorCisjZWxzZSAvLyBLTVBfVVNFX1ZFUlNJT05fU1lNQk9MUworICAgICNkZWZpbmUgeHN0cih4KSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBzdHIoeCkgIC8qIE5vdGhpbmcgKi8KKworICAgIC8vIGlmIFdpbmRvd3Mgb3IgTWFjLCB4ZXhwYW5kIGRvZXMgbm8gbmFtZSB0cmFuc2Zvcm1hdGlvbgorICAgICNkZWZpbmUgeGV4cGFuZChhcGlfbmFtZSkgZXhwYW5kKGFwaV9uYW1lKQorICAgICNkZWZpbmUgZXhwYW5kKGFwaV9uYW1lKSBhcGlfbmFtZQorCisgICAgI2RlZmluZSB4YWxpYXNpZnkoYXBpX25hbWUsdmVyKSAvKiBOb3RoaW5nICovCisgICAgI2RlZmluZSBhbGlhc2lmeShhcGlfbmFtZSx2ZXIpICAvKiBOb3RoaW5nICovCisKKyAgICAjZGVmaW5lIHh2ZXJzaW9uaWZ5KGFwaV9uYW1lLCB2ZXJzaW9uX251bSwgdmVyc2lvbl9zdHIpIC8qIE5vdGhpbmcgKi8KKyAgICAjZGVmaW5lIHZlcnNpb25pZnkoYXBpX25hbWUsIHZlcnNpb25fbnVtLCB2ZXJzaW9uX3N0ciwgZGVmYXVsdF92ZXIpIC8qIE5vdGhpbmcgKi8KKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNlbmRpZiAvKiBLTVBfRlROX09TX0ggKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9mdG5fc3RkY2FsbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNzBkNzQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2Z0bl9zdGRjYWxsLmMKQEAgLTAsMCArMSwzNSBAQAorLyoKKyAqIGttcF9mdG5fc3RkY2FsbC5jIC0tIEZvcnRyYW4gX19zdGRjYWxsIGxpbmthZ2Ugc3VwcG9ydCBmb3IgT3Blbk1QLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisKKy8vIE5vdGU6IFRoaXMgc3RyaW5nIGlzIG5vdCBwcmludGVkIHdoZW4gS01QX1ZFUlNJT049MS4KK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5zdGRjYWxsW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkZvcnRyYW4gX19zdGRjYWxsIE9NUCBzdXBwb3J0OiAiCisjaWZkZWYgVVNFX0ZUTl9TVERDQUxMCisgICAgInllcyI7CisjZWxzZQorICAgICJubyI7CisjZW5kaWYKKworI2lmZGVmIFVTRV9GVE5fU1REQ0FMTAorCisjZGVmaW5lIEZUTl9TVERDQUxMIAlLTVBfU1REQ0FMTAorI2RlZmluZSBLTVBfRlROX0VOVFJJRVMJVVNFX0ZUTl9TVERDQUxMCisKKyNpbmNsdWRlICJrbXBfZnRuX29zLmgiCisjaW5jbHVkZSAia21wX2Z0bl9lbnRyeS5oIgorCisjZW5kaWYgLyogVVNFX0ZUTl9TVERDQUxMICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfZ2xvYmFsLmMgYi9yYzMvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJjZjBlMmYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2dsb2JhbC5jCkBAIC0wLDAgKzEsNDc4IEBACisvKgorICoga21wX2dsb2JhbC5jIC0tIEtQVFMgZ2xvYmFsIHZhcmlhYmxlcyBmb3IgcnVudGltZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorCitrbXBfa2V5X3QgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleTsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2ttcF9jcHVpbmZvX3QgICBfX2ttcF9jcHVpbmZvID0geyAwIH07IC8vIE5vdCBpbml0aWFsaXplZAorI2VuZGlmCisKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorLy8gbG9jayBmb3IgbW9kaWZ5aW5nIHRoZSBnbG9iYWwgX19rbXBfc3RhdHNfbGlzdAora21wX3Rhc19sb2NrX3QgX19rbXBfc3RhdHNfbG9jazsKKworLy8gZ2xvYmFsIGxpc3Qgb2YgcGVyIHRocmVhZCBzdGF0cywgdGhlIGhlYWQgaXMgYSBzZW50aW5lbCBub2RlIHdoaWNoIGFjY3VtdWxhdGVzIGFsbCBzdGF0cyBwcm9kdWNlZCBiZWZvcmUgX19rbXBfY3JlYXRlX3dvcmtlciBpcyBjYWxsZWQuCitrbXBfc3RhdHNfbGlzdCBfX2ttcF9zdGF0c19saXN0OworCisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitfX3RocmVhZCBrbXBfc3RhdHNfbGlzdCogX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9ICZfX2ttcF9zdGF0c19saXN0OworCisvLyBnaXZlcyByZWZlcmVuY2UgdGljayBmb3IgYWxsIGV2ZW50cyAoY29uc2lkZXJlZCB0aGUgMCB0aWNrKQordHNjX3RpY2tfY291bnQgX19rbXBfc3RhdHNfc3RhcnRfdGltZTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogSU5JVElBTElaQVRJT04gVkFSSUFCTEVTICovCisvKiB0aGV5IGFyZSBzeW5jcm9uaXplZCB0byB3cml0ZSBkdXJpbmcgaW5pdCwgYnV0IHJlYWQgYW55dGltZSAqLwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X3NlcmlhbCAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9ndGlkICAgICAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfY29tbW9uICAgICA9IEZBTFNFOwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X21pZGRsZSAgICAgPSBGQUxTRTsKK3ZvbGF0aWxlIGludCAgICAgICAgX19rbXBfaW5pdF9wYXJhbGxlbCAgID0gRkFMU0U7Cit2b2xhdGlsZSBpbnQgICAgICAgIF9fa21wX2luaXRfbW9uaXRvciAgICA9IDA7ICAvKiAxIC0gbGF1bmNoZWQsIDIgLSBhY3R1YWxseSBzdGFydGVkIChXaW5kb3dzKiBPUyBvbmx5KSAqLwordm9sYXRpbGUgaW50ICAgICAgICBfX2ttcF9pbml0X3VzZXJfbG9ja3MgPSBGQUxTRTsKKworLyogbGlzdCBvZiBhZGRyZXNzIG9mIGFsbG9jYXRlZCBjYWNoZXMgZm9yIGNvbW1vbnMgKi8KK2ttcF9jYWNoZWRfYWRkcl90ICAqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gTlVMTDsKKworaW50ICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X2NvdW50ZXIgID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfcm9vdF9jb3VudGVyICA9IDA7CitpbnQgICAgICAgICAgICAgICAgIF9fa21wX3ZlcnNpb24gICAgICAgPSAwOworCit2b2xhdGlsZSBrbXBfdWludDMyIF9fa21wX3RlYW1fY291bnRlciAgPSAwOwordm9sYXRpbGUga21wX3VpbnQzMiBfX2ttcF90YXNrX2NvdW50ZXIgID0gMDsKKwordW5zaWduZWQgaW50IF9fa21wX2luaXRfd2FpdCA9IEtNUF9ERUZBVUxUX0lOSVRfV0FJVDsgICAvKiBpbml0aWFsIG51bWJlciBvZiBzcGluLXRlc3RzICAgKi8KK3Vuc2lnbmVkIGludCBfX2ttcF9uZXh0X3dhaXQgPSBLTVBfREVGQVVMVF9ORVhUX1dBSVQ7ICAgLyogc3VzZXF1ZW50IG51bWJlciBvZiBzcGluLXRlc3RzICovCisKK3NpemVfdCAgICAgIF9fa21wX3N0a3NpemUgICAgICAgICA9IEtNUF9ERUZBVUxUX1NUS1NJWkU7CitzaXplX3QgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPSAwOyAgLy8gYXV0byBhZGp1c3QKK3NpemVfdCAgICAgIF9fa21wX3N0a29mZnNldCAgICAgICA9IEtNUF9ERUZBVUxUX1NUS09GRlNFVDsKK2ludCAgICAgICAgIF9fa21wX3N0a3BhZGRpbmcgICAgICA9IEtNUF9NSU5fU1RLUEFERElORzsKKworc2l6ZV90ICAgIF9fa21wX21hbGxvY19wb29sX2luY3IgID0gS01QX0RFRkFVTFRfTUFMTE9DX1BPT0xfSU5DUjsKKworLyogQmFycmllciBtZXRob2QgZGVmYXVsdHMsIHNldHRpbmdzLCBhbmQgc3RyaW5ncyAqLworLyogYnJhbmNoIGZhY3RvciA9IDJeYnJhbmNoX2JpdHMgKG9ubHkgcmVsZXZhbnQgZm9yIHRyZWUgYW5kIGh5cGVyIGJhcnJpZXIgdHlwZXMpICovCisjaWYgS01QX0FSQ0hfWDg2XzY0CitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBoeXBlcjI6IEM3ODk4MCAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogaHlwZXIyOiBDNzg5ODAgKi8KKyNlbHNlCitrbXBfdWludDMyIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgICAgICA9IDI7ICAvKiBicmFuY2hfZmFjdG9yID0gNCAqLyAvKiBjb21tdW5pY2F0aW9uIGluIGNvcmUgZm9yIE1JQyAqLwora21wX3VpbnQzMiBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYmJfZGZsdCAgICAgPSAyOyAgLyogYnJhbmNoX2ZhY3RvciA9IDQgKi8gLyogY29tbXVuaWNhdGlvbiBpbiBjb3JlIGZvciBNSUMgKi8KKyNlbmRpZiAvLyBLTVBfQVJDSF9YODZfNjQKKyNpZiBLTVBfQVJDSF9YODZfNjQKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0X2RmbHQgID0gYnBfaHlwZXJfYmFyOyAgLyogaHlwZXIyOiBDNzg5ODAgKi8KK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdF9kZmx0ID0gYnBfaHlwZXJfYmFyOyAgLyogaHlwZXIyOiBDNzg5ODAgKi8KKyNlbHNlCitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdF9kZmx0ICA9IGJwX2xpbmVhcl9iYXI7CitrbXBfYmFyX3BhdF9lIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdCA9IGJwX2xpbmVhcl9iYXI7CisjZW5kaWYKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IDAgfTsKK2ttcF91aW50MzIgX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IDAgfTsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IGJwX2xpbmVhcl9iYXIgfTsKK2ttcF9iYXJfcGF0X2UgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gIFsgYnNfbGFzdF9iYXJyaWVyIF0gPSB7IGJwX2xpbmVhcl9iYXIgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZSBbIGJzX2xhc3RfYmFycmllciBdID0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB7ICJLTVBfUExBSU5fQkFSUklFUiIsICJLTVBfRk9SS0pPSU5fQkFSUklFUiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAsICJLTVBfUkVEVUNUSU9OX0JBUlJJRVIiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH07CitjaGFyIGNvbnN0ICpfX2ttcF9iYXJyaWVyX3BhdHRlcm5fZW52X25hbWUgICAgWyBic19sYXN0X2JhcnJpZXIgXSA9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyAiS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiIsICJLTVBfRk9SS0pPSU5fQkFSUklFUl9QQVRURVJOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgIktNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjZW5kaWYgLy8gS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OworY2hhciBjb25zdCAqX19rbXBfYmFycmllcl90eXBlX25hbWUgICAgICAgICAgIFsgYnNfbGFzdF9iYXJyaWVyIF0gPQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgInBsYWluIiwgImZvcmtqb2luIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgInJlZHVjdGlvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKK2NoYXIgY29uc3QgKl9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2JwX2xhc3RfYmFyXSA9IHsibGluZWFyIiwidHJlZSIsImh5cGVyIiwiaGllcmFyY2hpY2FsIn07CisKK2ludCAgICAgICBfX2ttcF9hbGxUaHJlYWRzU3BlY2lmaWVkID0gMDsKK3NpemVfdCAgICBfX2ttcF9hbGlnbl9hbGxvYyA9IENBQ0hFX0xJTkU7CisKKworaW50ICAgICBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9IGttcF93YXJuaW5nc19sb3c7CitpbnQgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMDsKK2ludCAgICAgICAgICAgICAgICAgX19rbXBfeHByb2MgPSAwOworaW50ICAgICAgICAgICAgX19rbXBfYXZhaWxfcHJvYyA9IDA7CitzaXplX3QgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gS01QX01JTl9TVEtTSVpFOworaW50ICAgICAgICAgICBfX2ttcF9zeXNfbWF4X250aCA9IEtNUF9NQVhfTlRIOworaW50ICAgICAgICAgICAgICAgX19rbXBfbWF4X250aCA9IDA7CitpbnQgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gMDsKK2ludCAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSAwOworaW50ICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IDA7CitpbnQgICAgICAgICAgIF9fa21wX3RwX2NhcGFjaXR5ID0gMDsKK2ludCAgICAgICAgICAgICBfX2ttcF90cF9jYWNoZWQgPSAwOworaW50ICAgICAgICAgICBfX2ttcF9kZmx0X25lc3RlZCA9IEZBTFNFOworaW50ICBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVycyA9IEtNUF9ERkxUX0RJU1BfTlVNX0JVRkY7CitpbnQgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsgLyogbWF4X2FjdGl2ZV9sZXZlbHMgbGltaXQgKi8KKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworaW50IF9fa21wX2hvdF90ZWFtc19tb2RlICAgICAgICAgPSAwOyAvKiAwIC0gZnJlZSBleHRyYSB0aHJlYWRzIHdoZW4gcmVkdWNlZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiAxIC0ga2VlcCBleHRyYSB0aHJlYWRzIHdoZW4gcmVkdWNlZCAqLworaW50IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgICAgPSAxOyAvKiBuZXN0aW5nIGxldmVsIG9mIGhvdCB0ZWFtcyAqLworI2VuZGlmCitlbnVtIGxpYnJhcnlfdHlwZSBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9ub25lOworZW51bSBzY2hlZF90eXBlICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfZGVmYXVsdDsgIC8qIHNjaGVkdWxpbmcgbWV0aG9kIGZvciBydW50aW1lIHNjaGVkdWxpbmcgKi8KK2VudW0gc2NoZWRfdHlwZSAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19ncmVlZHk7IC8qIGRlZmF1bHQgc3RhdGljIHNjaGVkdWxpbmcgbWV0aG9kICovCitlbnVtIHNjaGVkX3R5cGUgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7IC8qIGRlZmF1bHQgZ3VpZGVkIHNjaGVkdWxpbmcgbWV0aG9kICovCitlbnVtIHNjaGVkX3R5cGUgICAgICBfX2ttcF9hdXRvID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOyAvKiBkZWZhdWx0IGF1dG8gc2NoZWR1bGluZyBtZXRob2QgKi8KK2ludCAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CitpbnQgICAgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX01JTl9NT05JVE9SX1dBS0VVUFM7CitpbnQgICAgICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRSggS01QX0RFRkFVTFRfQkxPQ0tUSU1FLCBLTVBfTUlOX01PTklUT1JfV0FLRVVQUyApOworI2lmZGVmIEtNUF9BREpVU1RfQkxPQ0tUSU1FCitpbnQgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gRkFMU0U7CisjZW5kaWYgLyogS01QX0FESlVTVF9CTE9DS1RJTUUgKi8KKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKK2ludCAgICAgICAgICAgICAgICBfX2ttcF9uY29yZXMgPSAwOworI2VuZGlmCitpbnQgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gMDsKK2ludCAgICAgICAgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworI2lmIEtNUF9PU19MSU5VWCAmJiBkZWZpbmVkKEtNUF9UREFUQV9HVElEKQoraW50ICAgICAgICAgICAgIF9fa21wX2d0aWRfbW9kZSA9IDM7IC8qIHVzZSBfX2RlY2xzcGVjKHRocmVhZCkgVExTIHRvIHN0b3JlIGd0aWQgKi8KK2ludCAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBGQUxTRTsKKyNlbGlmIEtNUF9PU19XSU5ET1dTCitpbnQgICAgICAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gMjsgLyogdXNlIFRMUyBmdW5jdGlvbnMgdG8gc3RvcmUgZ3RpZCAqLworaW50ICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworI2Vsc2UKK2ludCAgICAgICAgICAgICBfX2ttcF9ndGlkX21vZGUgPSAwOyAvKiBzZWxlY3QgbWV0aG9kIHRvIGdldCBndGlkIGJhc2VkIG9uICN0aHJlYWRzICovCitpbnQgICAgICBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlID0gVFJVRTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgZGVmaW5lZChLTVBfVERBVEFfR1RJRCkgKi8KKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorI2lmIEtNUF9PU19XSU5ET1dTCitfX2RlY2xzcGVjKHRocmVhZCkgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZWxzZQorX190aHJlYWQgaW50IF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgLSB3b3JrYXJvdW5kIGJlY2F1c2UgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgY29tcGlsZXIgMjAxMTAzMTYgZG9lc24ndCBhY2NlcHQgX19kZWNsc3BlYyAqLworI2VuZGlmIC8qIEtNUF9UREFUQV9HVElEICovCitpbnQgICAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gSU5UX01BWDsKK2ludCAgICAgICAgICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKK2ludCAgICBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgPSBUUlVFOwora21wX2ludDE2ICBfX2ttcF9pbml0X3g4N19mcHVfY29udHJvbF93b3JkID0gMDsKK2ttcF91aW50MzIgICAgIF9fa21wX2luaXRfbXhjc3IgPSAwOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK2RvdWJsZSAgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICAgPSAxLjA7CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCitrbXBfbmVzdGVkX250aHJlYWRzX3QgX19rbXBfbmVzdGVkX250aCAgPSB7IE5VTEwsIDAsIDAgfTsKKworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKwora21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zX3QgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMgPSB7IDEsIDEwMjQgfTsgLy8gVE9ETzogdHVuZSBpdCEKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworY2hhciAqIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSA9ICItIjsKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ludCBfX2ttcF9kaXNwbGF5X2VudiAgICAgICAgICAgPSBGQUxTRTsKK2ludCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlICAgPSBGQUxTRTsKK2ludCBfX2ttcF9vbXBfY2FuY2VsbGF0aW9uICAgICAgPSBGQUxTRTsKKyNlbmRpZgorCisvKiBtYXAgT01QIDMuMCBzY2hlZHVsZSB0eXBlcyB3aXRoIG91ciBpbnRlcm5hbCBzY2hlZHVsZSB0eXBlcyAqLworZW51bSBzY2hlZF90eXBlIF9fa21wX3NjaF9tYXBbIGttcF9zY2hlZF91cHBlciAtIGttcF9zY2hlZF9sb3dlcl9leHQgKyBrbXBfc2NoZWRfdXBwZXJfc3RkIC0ga21wX3NjaGVkX2xvd2VyIC0gMiBdID0geworICAgIGttcF9zY2hfc3RhdGljX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX3N0YXRpYyAgICAgICAgICAgID0gMQorICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCAgICAvLyA9PT4ga21wX3NjaGVkX2R5bmFtaWMgICAgICAgICAgID0gMgorICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsICAgICAvLyA9PT4ga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMworICAgIGttcF9zY2hfYXV0bywgICAgICAgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX2F1dG8gICAgICAgICAgICAgID0gNAorICAgIGttcF9zY2hfdHJhcGV6b2lkYWwgICAgICAgICAvLyA9PT4ga21wX3NjaGVkX3RyYXBlem9pZGFsICAgICAgID0gMTAxCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdpbGwgbGlrZWx5IG5vdCB1c2VkLCBpbnRyb2R1Y2VkIGhlcmUganVzdCB0byBkZWJ1ZyB0aGUgY29kZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBvZiBwdWJsaWMgaW50ZWwgZXh0ZW5zaW9uIHNjaGVkdWxlcworfTsKKworI2lmIEtNUF9PU19MSU5VWAorZW51bSBjbG9ja19mdW5jdGlvbl90eXBlIF9fa21wX2Nsb2NrX2Z1bmN0aW9uOworaW50IF9fa21wX2Nsb2NrX2Z1bmN0aW9uX3BhcmFtOworI2VuZGlmIC8qIEtNUF9PU19MSU5VWCAqLworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCitlbnVtIG1pY190eXBlIF9fa21wX21pY190eXBlID0gbm9uX21pYzsKKyNlbmRpZgorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorCisjIGlmIEtNUF9VU0VfSFdMT0MKK2ludCBfX2ttcF9od2xvY19lcnJvciA9IEZBTFNFOworaHdsb2NfdG9wb2xvZ3lfdCBfX2ttcF9od2xvY190b3BvbG9neSA9IE5VTEw7CisjIGVuZGlmCisKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKK2ludCBfX2ttcF9udW1fcHJvY19ncm91cHMgPSAxOworCitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnRfdCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CitrbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudF90IF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSBOVUxMOwora21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ID0gTlVMTDsKK2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5X3QgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKK3NpemVfdCAgIF9fa21wX2FmZmluX21hc2tfc2l6ZSA9IDA7CitlbnVtIGFmZmluaXR5X3R5cGUgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CitlbnVtIGFmZmluaXR5X2dyYW4gX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZGVmYXVsdDsKK2ludCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyAgPSAtMTsKK2ludCBfX2ttcF9hZmZpbml0eV9kdXBzID0gVFJVRTsKK2VudW0gYWZmaW5pdHlfdG9wX21ldGhvZCBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworaW50ICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCAgICAgID0gMDsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X29mZnNldCAgICAgICA9IDA7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV92ZXJib3NlICAgICAgPSBGQUxTRTsKK2ludCAgICAgIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICA9IFRSVUU7CitpbnQgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBhZmZpbml0eV9yZXNwZWN0X21hc2tfZGVmYXVsdDsKK2NoYXIgKiAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICAgICA9IE5VTEw7CitrbXBfYWZmaW5fbWFza190ICpfX2ttcF9hZmZpbml0eV9tYXNrcyA9IE5VTEw7Cit1bnNpZ25lZCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgICAgPSAwOworCitjaGFyIGNvbnN0ICogIF9fa21wX2NwdWluZm9fZmlsZSAgICAgPSBOVUxMOworCisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisjaWYgT01QXzQwX0VOQUJMRUQKK2ttcF9uZXN0ZWRfcHJvY19iaW5kX3QgX19rbXBfbmVzdGVkX3Byb2NfYmluZCA9IHsgTlVMTCwgMCwgMCB9OworaW50IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXMgPSAwOworI2VuZGlmCisKK2ludCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyA9IDA7CitpbnQgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gMDsKK2ludCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IDA7CitpbnQgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSAwOworCitrbXBfdGFza2luZ19tb2RlX3QgX19rbXBfdGFza2luZ19tb2RlID0gdHNrbV90YXNrX3RlYW1zOworI2lmIE9NUF80NV9FTkFCTEVECitrbXBfaW50MzIgX19rbXBfbWF4X3Rhc2tfcHJpb3JpdHkgPSAwOworI2VuZGlmCisKKy8qIFRoaXMgY2hlY2sgZW5zdXJlcyB0aGF0IHRoZSBjb21waWxlciBpcyBwYXNzaW5nIHRoZSBjb3JyZWN0IGRhdGEgdHlwZQorICogZm9yIHRoZSBmbGFncyBmb3JtYWwgcGFyYW1ldGVyIG9mIHRoZSBmdW5jdGlvbiBrbXBjX29tcF90YXNrX2FsbG9jKCkuCisgKiBJZiB0aGUgdHlwZSBpcyBub3QgYSA0LWJ5dGUgdHlwZSwgdGhlbiBnaXZlIGFuIGVycm9yIG1lc3NhZ2UgYWJvdXQKKyAqIGEgbm9uLXBvc2l0aXZlIGxlbmd0aCBhcnJheSBwb2ludGluZyBoZXJlLiAgSWYgdGhhdCBoYXBwZW5zLCB0aGUKKyAqIGttcF90YXNraW5nX2ZsYWdzX3Qgc3RydWN0dXJlIG11c3QgYmUgcmVkZWZpbmVkIHRvIGhhdmUgZXhhY3RseSAzMiBiaXRzLgorICovCitLTVBfQlVJTERfQVNTRVJUKCBzaXplb2Yoa21wX3Rhc2tpbmdfZmxhZ3NfdCkgPT0gNCApOworCitrbXBfaW50MzIgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ID0gMTsgICAvKiBDb25zdHJhaW4gdGFzayBzdGVhbGluZyBieSBkZWZhdWx0ICovCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECitpbnQgICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gMDsKKyNlbmRpZgorCitpbnQgICAgIF9fa21wX3NldHRpbmdzID0gRkFMU0U7CitpbnQgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMDsKKyNpZiBVU0VfSVRUX0JVSUxECitpbnQgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyA9IDE7CitpbnQgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID0gMzsKKyNlbmRpZgorUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKK2ludCAgICAgX19rbXBfZGV0ZXJtX3JlZCA9IEZBTFNFOworCisjaWZkZWYgS01QX0RFQlVHCitpbnQgICAgIGttcF9hX2RlYnVnID0gMDsKK2ludCAgICAga21wX2JfZGVidWcgPSAwOworaW50ICAgICBrbXBfY19kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9kX2RlYnVnID0gMDsKK2ludCAgICAga21wX2VfZGVidWcgPSAwOworaW50ICAgICBrbXBfZl9kZWJ1ZyA9IDA7CitpbnQgICAgIGttcF9kaWFnICAgID0gMDsKKyNlbmRpZgorCisvKiBGb3IgZGVidWcgaW5mb3JtYXRpb24gbG9nZ2luZyB1c2luZyByb3RhdGluZyBidWZmZXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmID0gRkFMU0U7ICAgICAgICAvKiBUUlVFIG1lYW5zIHVzZSBidWZmZXIsIEZBTFNFIG1lYW5zIHByaW50IHRvIHN0ZGVyciAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19idWZfbGluZXMgPSBLTVBfREVCVUdfQlVGX0xJTkVTX0lOSVQ7IC8qIExpbmVzIG9mIGRlYnVnIHN0b3JlZCBpbiBidWZmZXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX2NoYXJzID0gS01QX0RFQlVHX0JVRl9DSEFSU19JTklUOyAvKiBDaGFyYWN0ZXJzIGFsbG93ZWQgcGVyIGxpbmUgaW4gYnVmZmVyICovCitpbnQgICAgIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgPSBGQUxTRTsgLyogVFJVRSBtZWFucyB1c2UgYXRvbWljIHVwZGF0ZSBvZiBidWZmZXIgZW50cnkgcG9pbnRlciAqLworCitjaGFyICAgKl9fa21wX2RlYnVnX2J1ZmZlciA9IE5VTEw7ICAgICAgLyogRGVidWcgYnVmZmVyIGl0c2VsZiAqLworaW50ICAgICBfX2ttcF9kZWJ1Z19jb3VudCA9IDA7ICAgICAgICAgIC8qIENvdW50ZXIgZm9yIG51bWJlciBvZiBsaW5lcyBwcmludGVkIGluIGJ1ZmZlciBzbyBmYXIgKi8KK2ludCAgICAgX19rbXBfZGVidWdfYnVmX3dhcm5fY2hhcnMgPSAwOyAvKiBLZWVwIHRyYWNrIG9mIGNoYXIgaW5jcmVhc2UgcmVjb21tZW5kZWQgaW4gd2FybmluZ3MgKi8KKy8qIGVuZCByb3RhdGluZyBkZWJ1ZyBidWZmZXIgKi8KKworI2lmZGVmIEtNUF9ERUJVRworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2U7ICAgICAgICAgICAvKiArMSA9PiBvbmx5IGdvIHBhciBmb3IgY29uc3RydWN0cyBpbiByYW5nZSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIC0xID0+IG9ubHkgZ28gcGFyIGZvciBjb25zdHJ1Y3RzIG91dHNpZGUgcmFuZ2UgKi8KK2NoYXIgICAgX19rbXBfcGFyX3JhbmdlX3JvdXRpbmVbS01QX1BBUl9SQU5HRV9ST1VUSU5FX0xFTl0gPSB7ICdcMCcgfTsKK2NoYXIgICAgX19rbXBfcGFyX3JhbmdlX2ZpbGVuYW1lW0tNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOXSA9IHsgJ1wwJyB9OworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2VfbGIgPSAwOworaW50ICAgICBfX2ttcF9wYXJfcmFuZ2VfdWIgPSBJTlRfTUFYOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisvKiBGb3IgcHJpbnRpbmcgb3V0IGR5bmFtaWMgc3RvcmFnZSBtYXAgZm9yIHRocmVhZHMgYW5kIHRlYW1zICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwID0gRkFMU0U7ICAgICAgICAgLyogVHJ1ZSBtZWFucyBwcmludCBzdG9yYWdlIG1hcCBmb3IgdGhyZWFkcyBhbmQgdGVhbXMgKi8KK2ludCAgICAgX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSA9IEZBTFNFOyAvKiBUcnVlIG1lYW5zIHN0b3JhZ2UgbWFwIGluY2x1ZGVzIHBsYWNlbWVudCBpbmZvICovCitpbnQgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2Vfc3BlY2lmaWVkID0gRkFMU0U7CisvKiBJbml0aWFsaXplIHRoZSBsaWJyYXJ5IGRhdGEgc3RydWN0dXJlcyB3aGVuIHdlIGZvcmsgYSBjaGlsZCBwcm9jZXNzLCBkZWZhdWx0cyB0byBUUlVFICovCitpbnQgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrID0gVFJVRTsgLyogQXQgaW5pdGlhbGl6YXRpb24sIGNhbGwgcHRocmVhZF9hdGZvcmsgdG8gaW5zdGFsbCBmb3JrIGhhbmRsZXIgKi8KK2ludCAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKworaW50ICAgICAgICBfX2ttcF9lbnZfY2h1bmsgICAgICAgPSBGQUxTRTsgIC8qIEtNUF9DSFVOSyBzcGVjaWZpZWQ/ICAgICAqLworaW50ICAgICAgICBfX2ttcF9lbnZfc3Rrc2l6ZSAgICAgPSBGQUxTRTsgIC8qIEtNUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfb21wX3N0a3NpemUgPSBGQUxTRTsgIC8qIE9NUF9TVEFDS1NJWkUgc3BlY2lmaWVkPyAqLworaW50ICAgICAgICBfX2ttcF9lbnZfYWxsX3RocmVhZHMgICAgID0gRkFMU0U7LyogS01QX0FMTF9USFJFQURTIG9yIEtNUF9NQVhfVEhSRUFEUyBzcGVjaWZpZWQ/ICovCitpbnQgICAgICAgIF9fa21wX2Vudl9vbXBfYWxsX3RocmVhZHMgPSBGQUxTRTsvKiBPTVBfVEhSRUFEX0xJTUlUIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSAgID0gRkFMU0U7ICAvKiBLTVBfQkxPQ0tUSU1FIHNwZWNpZmllZD8gKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NoZWNrcyAgICAgID0gRkFMU0U7ICAvKiBLTVBfQ0hFQ0tTIHNwZWNpZmllZD8gICAgKi8KK2ludCAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICA9IEZBTFNFOyAgLyogS01QX0NPTlNJU1RFTkNZX0NIRUNLIHNwZWNpZmllZD8gKi8KKwora21wX3VpbnQzMiBfX2ttcF95aWVsZF9pbml0ID0gS01QX0lOSVRfV0FJVDsKK2ttcF91aW50MzIgX19rbXBfeWllbGRfbmV4dCA9IEtNUF9ORVhUX1dBSVQ7CitrbXBfdWludDMyIF9fa21wX3lpZWxkaW5nX29uID0gMTsKKyNpZiBLTVBfT1NfQ05LCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMDsKKyNlbHNlCitrbXBfdWludDMyIF9fa21wX3lpZWxkX2N5Y2xlID0gMTsgICAgIC8qIFlpZWxkLWN5Y2xlIGlzIG9uIGJ5IGRlZmF1bHQgKi8KKyNlbmRpZgora21wX2ludDMyICBfX2ttcF95aWVsZF9vbl9jb3VudCA9IDEwOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvbiBmb3IgMTAgbW9uaXRvciBwZXJpb2RzLiAqLwora21wX2ludDMyICBfX2ttcF95aWVsZF9vZmZfY291bnQgPSAxOyAvKiBCeSBkZWZhdWx0LCB5aWVsZGluZyBpcyBvZmYgZm9yIDEgbW9uaXRvciBwZXJpb2RzLiAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFNUQVRFIG1vc3RseSBzeW5jcm9uaXplZCB3aXRoIGdsb2JhbCBsb2NrICovCisvKiBkYXRhIHdyaXR0ZW4gdG8gcmFyZWx5IGJ5IG1hc3RlcnMsIHJlYWQgb2Z0ZW4gYnkgd29ya2VycyAqLworLyoKKyAqIFNIQUxMIFdFIEVESVQgVEhFIENPTU1FTlQgQkVMT1cgSU4gU09NRSBXQVk/CisgKiBUT0RPOiAgTm9uZSBvZiB0aGlzIGdsb2JhbCBwYWRkaW5nIHN0dWZmIHdvcmtzIGNvbnNpc3RlbnRseSBiZWNhdXNlCisgKiB0aGUgb3JkZXIgb2YgZGVjbGFyYXRpb24gaXMgbm90IG5lY2Vzc2FyaWx5IGNvcnJlbGF0ZWQgdG8gc3RvcmFnZSBvcmRlci4KKyAqIFRvIGZpeCB0aGlzLCBhbGwgdGhlIGltcG9ydGFudCBnbG9iYWxzIG11c3QgYmUgcHV0IGluIGEgYmlnIHN0cnVjdHVyZQorICogaW5zdGVhZC4KKyAqLworS01QX0FMSUdOX0NBQ0hFCisgICAgICAgICBrbXBfaW5mb190ICoqX19rbXBfdGhyZWFkcyAgICAgPSBOVUxMOworICAgICAgICAga21wX3Jvb3RfdCAqKl9fa21wX3Jvb3QgICAgICAgID0gTlVMTDsKKworLyogZGF0YSByZWFkL3dyaXR0ZW4gdG8gb2Z0ZW4gYnkgbWFzdGVycyAqLworS01QX0FMSUdOX0NBQ0hFCit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfbnRoICAgICAgICAgICAgICAgICAgICA9IDA7Cit2b2xhdGlsZSBpbnQgICAgICAgICAgX19rbXBfYWxsX250aCAgICAgICAgICAgICAgICA9IDA7CitpbnQgICAgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkX3Bvb2xfbnRoICAgICAgICA9IDA7Cit2b2xhdGlsZSBrbXBfaW5mb190ICAqX19rbXBfdGhyZWFkX3Bvb2wgICAgICAgICAgICA9IE5VTEw7Cit2b2xhdGlsZSBrbXBfdGVhbV90ICAqX19rbXBfdGVhbV9wb29sICAgICAgICAgICAgICA9IE5VTEw7CisKK0tNUF9BTElHTl9DQUNIRQordm9sYXRpbGUgaW50ICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggPSAwOworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgKiBHTE9CQUwvUk9PVCBTVEFURSAqLworS01QX0FMSUdOX0NBQ0hFCitrbXBfZ2xvYmFsX3QgX19rbXBfZ2xvYmFsID0ge3sgMCB9fTsKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIEdMT0JBTCBTWU5DSFJPTklaQVRJT04gTE9DS1MgKi8KKy8qIFRPRE8gdmVyaWZ5IHRoZSBuZWVkIGZvciB0aGVzZSBsb2NrcyBhbmQgaWYgdGhleSBuZWVkIHRvIGJlIGdsb2JhbCAqLworCisjaWYgS01QX1VTRV9JTlRFUk5PREVfQUxJR05NRU5UCisvKiBNdWx0aW5vZGUgc3lzdGVtcyBoYXZlIGxhcmdlciBjYWNoZSBsaW5lIGdyYW51bGFyaXR5IHdoaWNoIGNhbiBjYXVzZQorICogZmFsc2Ugc2hhcmluZyBpZiB0aGUgYWxpZ25tZW50IGlzIG5vdCBsYXJnZSBlbm91Z2ggZm9yIHRoZXNlIGxvY2tzICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCisKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2luaXR6X2xvY2sgICA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfaW5pdHpfbG9jayAgICk7IC8qIENvbnRyb2wgaW5pdGlhbGl6YXRpb25zICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9mb3Jram9pbl9sb2NrOyAvKiBjb250cm9sIGZvcmsvam9pbiBhY2Nlc3MgKi8KK0tNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUKK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2V4aXRfbG9jazsgICAvKiBleGl0KCkgaXMgbm90IGFsd2F5cyB0aHJlYWQtc2FmZSAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfbW9uaXRvcl9sb2NrOyAvKiBjb250cm9sIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90cF9jYWNoZWRfbG9jazsgLyogdXNlZCBmb3IgdGhlIGhhY2sgdG8gYWxsb3cgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhbmQgX19rbXBfdGhyZWFkcyBleHBhbnNpb24gdG8gY28tZXhpc3QgKi8KKworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOX0NBQ0hFX0lOVEVSTk9ERQora21wX3F1ZXVpbmdfbG9ja190IF9fa21wX2Rpc3BhdGNoX2xvY2s7ICAgICAgICAgLyogQ29udHJvbCBkaXNwYXRjaCBhY2Nlc3MgICovCitLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFCitrbXBfbG9ja190IF9fa21wX2RlYnVnX2xvY2s7ICAgICAgICAgICAgLyogQ29udHJvbCBJL08gYWNjZXNzIGZvciBLTVBfREVCVUcgKi8KKyNlbHNlCitLTVBfQUxJR05fQ0FDSEUKKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfaW5pdHpfbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pbml0el9sb2NrICAgKTsgLyogQ29udHJvbCBpbml0aWFsaXphdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2Zvcmtqb2luX2xvY2s7IC8qIGNvbnRyb2wgZm9yay9qb2luIGFjY2VzcyAqLwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfZXhpdF9sb2NrOyAgIC8qIGV4aXQoKSBpcyBub3QgYWx3YXlzIHRocmVhZC1zYWZlICovCitrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF9tb25pdG9yX2xvY2s7IC8qIGNvbnRyb2wgbW9uaXRvciB0aHJlYWQgY3JlYXRpb24gKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3RwX2NhY2hlZF9sb2NrOyAvKiB1c2VkIGZvciB0aGUgaGFjayB0byBhbGxvdyB0aHJlYWRwcml2YXRlIGNhY2hlIGFuZCBfX2ttcF90aHJlYWRzIGV4cGFuc2lvbiB0byBjby1leGlzdCAqLworCitLTVBfQUxJR04oMTI4KQora21wX2xvY2tfdCBfX2ttcF9nbG9iYWxfbG9jazsgICAgICAgICAgIC8qIENvbnRyb2wgT1MvZ2xvYmFsIGFjY2VzcyAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9xdWV1aW5nX2xvY2tfdCBfX2ttcF9kaXNwYXRjaF9sb2NrOyAgICAgICAgIC8qIENvbnRyb2wgZGlzcGF0Y2ggYWNjZXNzICAqLworS01QX0FMSUdOKDEyOCkKK2ttcF9sb2NrX3QgX19rbXBfZGVidWdfbG9jazsgICAgICAgICAgICAvKiBDb250cm9sIEkvTyBhY2Nlc3MgZm9yIEtNUF9ERUJVRyAqLworI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICAvKgorICAgICAgICBTaWduYWwgaGFuZGxpbmcgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCwgYmVjYXVzZSBpdCBjb25mdXNlcyB1c2VyczogSW4gY2FzZSBvZiBzaWdzZWd2CisgICAgICAgIChvciBvdGhlciB0cm91YmxlKSBpbiB1c2VyIGNvZGUgc2lnbmFsIGhhbmRsZXIgY2F0Y2hlcyB0aGUgc2lnbmFsLCB3aGljaCB0aGVuICJhcHBlYXJzIiBpbgorICAgICAgICB0aGUgbW9uaXRvciB0aHJlYWQgKHdoZW4gdGhlIG1vbml0b3IgZXhlY3V0ZXMgcmFpc2UoKSBmdW5jdGlvbikuIFVzZXJzIHNlZSBzaWduYWwgaW4gdGhlCisgICAgICAgIG1vbml0b3IgdGhyZWFkIGFuZCBibGFtZSBPcGVuTVAgUlRMLgorCisgICAgICAgIEdyYW50IHNhaWQgc2lnbmFsIGhhbmRsaW5nIHJlcXVpcmVkIG9uIHNvbWUgb2xkZXIgT1NlcyAoSXJpeD8pIHN1cHBvcnRlZCBieSBLQUksIGJlY2F1c2UKKyAgICAgICAgYmFkIGFwcGxpY2F0aW9ucyBodW5nIGJ1dCBub3QgYWJvcnRlZC4gQ3VycmVudGx5IGl0IGlzIG5vdCBhIHByb2JsZW0gZm9yIExpbnV4KiBPUywgT1MgWCogYW5kCisgICAgICAgIFdpbmRvd3MqIE9TLgorCisgICAgICAgIEdyYW50OiBGb3VuZCBuZXcgaGFuZ3MgZm9yIEVMNCwgRUw1LCBhbmQgYSBGZWRvcmEgQ29yZSBtYWNoaW5lLiAgU28gSSdtIHB1dHRpbmcKKyAgICAgICAgdGhlIGRlZmF1bHQgYmFjayBmb3Igbm93IHRvIHNlZSBpZiB0aGF0IGZpeGVzIGhhbmdzIG9uIHRob3NlIG1hY2hpbmVzLgorCisgICAgICAgIDIwMTAtMDQwMTMgTGV2OiBJdCB3YXMgYSBidWcgaW4gRm9ydHJhbiBSVEwuIEZvcnRyYW4gUlRMIHByaW50cyBhIGtpbmQgb2Ygc3RhY2sgYmFja3RyYWNlCisgICAgICAgIHdoZW4gcHJvZ3JhbSBpcyBhYm9ydGluZywgYnV0IHRoZSBjb2RlIGlzIG5vdCBzaWduYWwtc2FmZS4gV2hlbiBtdWx0aXBsZSBzaWduYWxzIHJhaXNlZCBhdAorICAgICAgICB0aGUgc2FtZSB0aW1lICh3aGljaCBvY2N1cnMgaW4gZHluYW1pYyBuZWdhdGl2ZSB0ZXN0cyBiZWNhdXNlIGFsbCB0aGUgd29ya2VyIHRocmVhZHMgZGV0ZWN0cworICAgICAgICB0aGUgc2FtZSBlcnJvciksIEZvcnRyYW4gUlRMIG1heSBoYW5nLiBUaGUgYnVnIGZpbmFsbHkgZml4ZWQgaW4gRm9ydHJhbiBSVEwgbGlicmFyeSBwcm92aWRlZAorICAgICAgICBieSBTdGV2ZSBSLiwgYW5kIHdpbGwgYmUgYXZhaWxhYmxlIHNvb24uCisgICAgKi8KKyAgICBpbnQgX19rbXBfaGFuZGxlX3NpZ25hbHMgPSBGQUxTRTsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworI2lmZGVmIEJVSUxEX1RWCitrbXBfa2V5X3QgX19rbXBfdHZfa2V5ID0gMDsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAoraW50CitnZXRfc3VzcGVuZF9jb3VudF8oIHZvaWQgKSB7CisgICAgaW50IGNvdW50ID0gX19rbXBfc3VzcGVuZF9jb3VudDsKKyAgICBfX2ttcF9zdXNwZW5kX2NvdW50ID0gMDsKKyAgICByZXR1cm4gY291bnQ7Cit9Cit2b2lkCitzZXRfc3VzcGVuZF9jb3VudF8oIGludCAqIHZhbHVlICkgeworICAgIF9fa21wX3N1c3BlbmRfY291bnQgPSAqdmFsdWU7Cit9CisjZW5kaWYKKworLy8gU3ltYm9scyBmb3IgTVMgbXV0dWFsIGRldGVjdGlvbi4KK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAoIEtNUF9WRVJTSU9OX01BSk9SID4gNCApCisgICAgaW50IF9Zb3VfbXVzdF9saW5rX3dpdGhfTWljcm9zb2Z0X09wZW5NUF9saWJyYXJ5ID0gMTsKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9nc3VwcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIzYzk3ZDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2dzdXBwb3J0LmMKQEAgLTAsMCArMSwxNjEwIEBACisvKgorICoga21wX2dzdXBwb3J0LmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZGVmaW5lIE1LTE9DKGxvYyxyb3V0aW5lKSBcCisgICAgc3RhdGljIGlkZW50X3QgKGxvYykgPSB7MCwgS01QX0lERU5UX0tNUEMsIDAsIDAsICI7dW5rbm93bjt1bmtub3duOzA7MDs7IiB9OworCisjaW5jbHVkZSAia21wX2Z0bl9vcy5oIgorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVIpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9iYXJyaWVyIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2JhcnJpZXIoJmxvYywgZ3RpZCk7Cit9CisKKworLy8KKy8vIE11dHVhbCBleGNsdXNpb24KKy8vCisKKy8vCisvLyBUaGUgc3ltYm9sIHRoYXQgaWNjL2lmb3J0IGdlbmVyYXRlcyBmb3IgdW5uYW1lZCBmb3IgdW5uYW1lZCBjcml0aWNhbAorLy8gc2VjdGlvbnMgLSAuZ29tcF9jcml0aWNhbF91c2VyXyAtIGlzIGRlZmluZWQgdXNpbmcgLmNvbW0gaW4gYW55IG9iamVjdHMKKy8vIHJlZmVyZW5jZSBpdC4gIFdlIGNhbid0IHJlZmVyZW5jZSBpdCBkaXJlY3RseSBoZXJlIGluIEMgY29kZSwgYXMgdGhlCisvLyBzeW1ib2wgY29udGFpbnMgYSAiLiIuCisvLworLy8gVGhlIFJUTCBjb250YWlucyBhbiBhc3NlbWJseSBsYW5ndWFnZSBkZWZpbml0aW9uIG9mIC5nb21wX2NyaXRpY2FsX3VzZXJfCisvLyB3aXRoIGFub3RoZXIgc3ltYm9sIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkciBpbml0aWFsaXplZCB3aXRoIGl0J3MKKy8vIGFkZHJlc3MuCisvLworZXh0ZXJuIGttcF9jcml0aWNhbF9uYW1lICpfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI7CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY3JpdGljYWxfZW5kOiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2VuZF9jcml0aWNhbCgmbG9jLCBndGlkLCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCkodm9pZCAqKnBwdHIpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0Iik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9uYW1lX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2NyaXRpY2FsKCZsb2MsIGd0aWQsIChrbXBfY3JpdGljYWxfbmFtZSAqKXBwdHIpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9FTkQpKHZvaWQgKipwcHRyKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NyaXRpY2FsX25hbWVfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jcml0aWNhbF9uYW1lX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworICAgIF9fa21wY19lbmRfY3JpdGljYWwoJmxvYywgZ3RpZCwgKGttcF9jcml0aWNhbF9uYW1lICopcHB0cik7Cit9CisKKworLy8KKy8vIFRoZSBHbnUgY29kZWdlbiB0cmllcyB0byB1c2UgbG9ja2VkIG9wZXJhdGlvbnMgdG8gcGVyZm9ybSBhdG9taWMgdXBkYXRlcworLy8gaW5saW5lLiAgSWYgaXQgY2FuJ3QsIHRoZW4gaXQgY2FsbHMgR09NUF9hdG9taWNfc3RhcnQoKSBiZWZvcmUgcGVyZm9ybWluZworLy8gdGhlIHVwZGF0ZSBhbmQgR09NUF9hdG9taWNfZW5kKCkgYWZ0ZXJ3YXJkLCByZWdhcmRsZXNzIG9mIHRoZSBkYXRhIHR5cGUuCisvLworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2F0b21pY19zdGFydDogVCMlZFxuIiwgZ3RpZCkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgX19vbXB0X3RocmVhZF9hc3NpZ25fd2FpdF9pZCgwKTsKKyNlbmRpZgorCisgICAgX19rbXBfYWNxdWlyZV9hdG9taWNfbG9jaygmX19rbXBfYXRvbWljX2xvY2ssIGd0aWQpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9hdG9taWNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcF9yZWxlYXNlX2F0b21pY19sb2NrKCZfX2ttcF9hdG9taWNfbG9jaywgZ3RpZCk7Cit9CisKKworaW50Cit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NpbmdsZV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgLy8KKyAgICAvLyAzcmQgcGFyYW1ldGVyID09IEZBTFNFIHByZXZlbnRzIGttcF9lbnRlcl9zaW5nbGUgZnJvbSBwdXNoaW5nIGEKKyAgICAvLyB3b3Jrc2hhcmUgd2hlbiBVU0VfQ0hFQ0tTIGlzIGRlZmluZWQuICBXZSBuZWVkIHRvIGF2b2lkIHRoZSBwdXNoLAorICAgIC8vIGFzIHRoZXJlIGlzIG5vIGNvcnJlc3BvbmRpbmcgR09NUF9zaW5nbGVfZW5kKCkgY2FsbC4KKyAgICAvLworICAgIHJldHVybiBfX2ttcF9lbnRlcl9zaW5nbGUoZ3RpZCwgJmxvYywgRkFMU0UpOworfQorCisKK3ZvaWQgKgoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCkodm9pZCkKK3sKKyAgICB2b2lkICpyZXR2YWw7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zaW5nbGVfY29weV9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2luZ2xlX2NvcHlfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmICghIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvLworICAgIC8vIElmIHRoaXMgaXMgdGhlIGZpcnN0IHRocmVhZCB0byBlbnRlciwgcmV0dXJuIE5VTEwuICBUaGUgZ2VuZXJhdGVkCisgICAgLy8gY29kZSB3aWxsIHRoZW4gY2FsbCBHT01QX3NpbmdsZV9jb3B5X2VuZCgpIGZvciB0aGlzIHRocmVhZCBvbmx5LAorICAgIC8vIHdpdGggdGhlIGNvcHlwcml2YXRlIGRhdGEgcG9pbnRlciBhcyBhbiBhcmd1bWVudC4KKyAgICAvLworICAgIGlmIChfX2ttcF9lbnRlcl9zaW5nbGUoZ3RpZCwgJmxvYywgRkFMU0UpKQorICAgICAgICByZXR1cm4gTlVMTDsKKworICAgIC8vCisgICAgLy8gV2FpdCBmb3IgdGhlIGZpcnN0IHRocmVhZCB0byBzZXQgdGhlIGNvcHlwcml2YXRlIGRhdGEgcG9pbnRlciwKKyAgICAvLyBhbmQgZm9yIGFsbCBvdGhlciB0aHJlYWRzIHRvIHJlYWNoIHRoaXMgcG9pbnQuCisgICAgLy8KKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICAgIC8vCisgICAgLy8gUmV0cmlldmUgdGhlIHZhbHVlIG9mIHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50LCBhbmQgd2FpdCBmb3IgYWxsCisgICAgLy8gdGhyZWFkcyB0byBkbyBsaWtld2lzZSwgdGhlbiByZXR1cm4uCisgICAgLy8KKyAgICByZXR2YWwgPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2NvcHlwcml2X2RhdGE7CisgICAgX19rbXBfYmFycmllcihic19wbGFpbl9iYXJyaWVyLCBndGlkLCBGQUxTRSwgMCwgTlVMTCwgTlVMTCk7CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX0VORCkodm9pZCAqZGF0YSkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zaW5nbGVfY29weV9lbmQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIC8vCisgICAgLy8gU2V0IHRoZSBjb3B5cHJpdmF0ZSBkYXRhIHBvaW50ZXIgZm8gdGhlIHRlYW0sIHRoZW4gaGl0IHRoZSBiYXJyaWVyCisgICAgLy8gc28gdGhhdCB0aGUgb3RoZXIgdGhyZWFkcyB3aWxsIGNvbnRpbnVlIG9uIGFuZCByZWFkIGl0LiAgSGl0IGFub3RoZXIKKyAgICAvLyBiYXJyaWVyIGJlZm9yZSBjb250aW51aW5nLCBzbyB0aGF0IHRoZSBrbm93IHRoYXQgdGhlIGNvcHlwcml2YXRlCisgICAgLy8gZGF0YSBwb2ludGVyIGhhcyBiZWVuIHByb3BhZ2F0ZWQgdG8gYWxsIHRocmVhZHMgYmVmb3JlIHRyeWluZyB0bworICAgIC8vIHJldXNlIHRoZSB0X2NvcHlwcml2X2RhdGEgZmllbGQuCisgICAgLy8KKyAgICBfX2ttcF90ZWFtX2Zyb21fZ3RpZChndGlkKS0+dC50X2NvcHlwcml2X2RhdGEgPSBkYXRhOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9TVEFSVCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX29yZGVyZWRfc3RhcnQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX29yZGVyZWRfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKyAgICBfX2ttcGNfb3JkZXJlZCgmbG9jLCBndGlkKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX29yZGVyZWRfZW5kIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9vcmRlcmVkX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgX19rbXBjX2VuZF9vcmRlcmVkKCZsb2MsIGd0aWQpOworfQorCisKKy8vCisvLyBEaXNwYXRjaCBtYWNybyBkZWZzCisvLworLy8gVGhleSBjb21lIGluIHR3byBmbGF2b3JzOiA2NC1iaXQgdW5zaWduZWQsIGFuZCBlaXRoZXIgMzItYml0IHNpZ25lZAorLy8gKElBLTMyIGFyY2hpdGVjdHVyZSkgb3IgNjQtYml0IHNpZ25lZCAoSW50ZWwoUikgNjQpLgorLy8KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0KKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9JTklUICAgICAgICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF80CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSyAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2ZpbmlfY2h1bmtfNAorIyBkZWZpbmUgS01QX0RJU1BBVENIX05FWFQgICAgICAgICAgICAgIF9fa21wY19kaXNwYXRjaF9uZXh0XzQKKyNlbHNlCisjIGRlZmluZSBLTVBfRElTUEFUQ0hfSU5JVCAgICAgICAgICAgICAgX19rbXBfYXV4X2Rpc3BhdGNoX2luaXRfOAorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksgICAgICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzgKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9ORVhUICAgICAgICAgICAgICBfX2ttcGNfZGlzcGF0Y2hfbmV4dF84CisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9ESVNQQVRDSF9JTklUX1VMTCAgICAgICAgICBfX2ttcF9hdXhfZGlzcGF0Y2hfaW5pdF84dQorIyBkZWZpbmUgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMICAgIF9fa21wX2F1eF9kaXNwYXRjaF9maW5pX2NodW5rXzh1CisjIGRlZmluZSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwgICAgICAgICAgX19rbXBjX2Rpc3BhdGNoX25leHRfOHUKKworCisvLworLy8gVGhlIHBhcmFsbGVsIGNvbnRydWN0CisvLworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX21pY3JvdGFza193cmFwcGVyKGludCAqZ3RpZCwgaW50ICpucHIsIHZvaWQgKCp0YXNrKSh2b2lkICopLAorICB2b2lkICpkYXRhKQoreworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF9pbmZvX3QgKnRocjsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWU7CisgICAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gZ2V0IHBvaW50ZXIgdG8gdGhyZWFkIGRhdGEgc3RydWN0dXJlCisgICAgICAgIHRociA9IF9fa21wX3RocmVhZHNbKmd0aWRdOworCisgICAgICAgIC8vIHNhdmUgZW5jbG9zaW5nIHRhc2sgc3RhdGU7IHNldCBjdXJyZW50IHN0YXRlIGZvciB0YXNrCisgICAgICAgIGVuY2xvc2luZ19zdGF0ZSA9IHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworCisgICAgICAgIC8vIHNldCB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgdGFzayhkYXRhKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgLy8gY2xlYXIgdGFzayBmcmFtZQorICAgICAgICBvbXB0X2ZyYW1lLT5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgIC8vIHJlc3RvcmUgZW5jbG9zaW5nIHN0YXRlCisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IGVuY2xvc2luZ19zdGF0ZTsKKyAgICB9CisjZW5kaWYKK30KKworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyKGludCAqZ3RpZCwgaW50ICpucHIsCisgIHZvaWQgKCp0YXNrKSh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgaWRlbnRfdCAqbG9jLAorICBlbnVtIHNjaGVkX3R5cGUgc2NoZWR1bGUsIGxvbmcgc3RhcnQsIGxvbmcgZW5kLCBsb25nIGluY3IsIGxvbmcgY2h1bmtfc2l6ZSkKK3sKKyAgICAvLworICAgIC8vIEludGlhbGl6ZSB0aGUgbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3QuCisgICAgLy8KKyAgICBLTVBfRElTUEFUQ0hfSU5JVChsb2MsICpndGlkLCBzY2hlZHVsZSwgc3RhcnQsIGVuZCwgaW5jciwgY2h1bmtfc2l6ZSwKKyAgICAgIHNjaGVkdWxlICE9IGttcF9zY2hfc3RhdGljKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGttcF9pbmZvX3QgKnRocjsKKyAgICBvbXB0X2ZyYW1lX3QgKm9tcHRfZnJhbWU7CisgICAgb21wdF9zdGF0ZV90IGVuY2xvc2luZ19zdGF0ZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgdGhyID0gX19rbXBfdGhyZWFkc1sqZ3RpZF07CisgICAgICAgIC8vIHNhdmUgZW5jbG9zaW5nIHRhc2sgc3RhdGU7IHNldCBjdXJyZW50IHN0YXRlIGZvciB0YXNrCisgICAgICAgIGVuY2xvc2luZ19zdGF0ZSA9IHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZTsKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworCisgICAgICAgIC8vIHNldCB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUgPSBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoMCk7CisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgLy8KKyAgICAvLyBOb3cgaW52b2tlIHRoZSBtaWNyb3Rhc2suCisgICAgLy8KKyAgICB0YXNrKGRhdGEpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBjbGVhciB0YXNrIGZyYW1lCisgICAgICAgIG9tcHRfZnJhbWUtPmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisKKyAgICAgICAgLy8gcmVzZXQgZW5jbG9zaW5nIHN0YXRlCisgICAgICAgIHRoci0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IGVuY2xvc2luZ19zdGF0ZTsKKyAgICB9CisjZW5kaWYKK30KKworCisjaWZuZGVmIEtNUF9ERUJVRworc3RhdGljCisjZW5kaWYgLyogS01QX0RFQlVHICovCit2b2lkCitfX2ttcF9HT01QX2ZvcmtfY2FsbChpZGVudF90ICpsb2MsIGludCBndGlkLCB2b2lkICgqdW53cmFwcGVkX3Rhc2spKHZvaWQgKiksIG1pY3JvdGFza190IHdyYXBwZXIsIGludCBhcmdjLC4uLikKK3sKKyAgICBpbnQgcmM7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGludCB0aWQgPSBfX2ttcF90aWRfZnJvbV9ndGlkKGd0aWQpOworCisgICAgdmFfbGlzdCBhcDsKKyAgICB2YV9zdGFydChhcCwgYXJnYyk7CisKKyAgICByYyA9IF9fa21wX2ZvcmtfY2FsbChsb2MsIGd0aWQsIGZvcmtfY29udGV4dF9nbnUsIGFyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICBWT0xBVElMRV9DQVNUKHZvaWQgKikgdW53cmFwcGVkX3Rhc2ssCisjZW5kaWYKKyAgICAgIHdyYXBwZXIsIF9fa21wX2ludm9rZV90YXNrX2Z1bmMsCisjaWYgKEtNUF9BUkNIX1g4Nl82NCB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0g2NCkgJiYgS01QX09TX0xJTlVYCisgICAgICAmYXAKKyNlbHNlCisgICAgICBhcAorI2VuZGlmCisgICAgICApOworCisgICAgdmFfZW5kKGFwKTsKKworICAgIGlmIChyYykgeworICAgICAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayhndGlkLCB0aWQsIHRociwgdGVhbSk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgb21wdF90ZWFtX2luZm9fdCAqdGVhbV9pbmZvID0gX19vbXB0X2dldF90ZWFtaW5mbygwLCBOVUxMKTsKKyAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKworICAgICAgICAvLyBpbXBsaWNpdCB0YXNrIGNhbGxiYWNrCisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgIH0KKyNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIHZvaWQgKCp0YXNrKSh2b2lkICopKQoreworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BhcmFsbGVsX2lkOworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSBOVUxMOworCisgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGd0aWQpOworCisgICAgICAgIC8vIHBhcmFsbGVsIHJlZ2lvbiBjYWxsYmFjaworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSkgeworICAgICAgICAgICAgaW50IHRlYW1fc2l6ZSA9IDE7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4pKAorICAgICAgICAgICAgICAgIHRhc2tfaW5mby0+dGFza19pZCwgJnRhc2tfaW5mby0+ZnJhbWUsIG9tcHRfcGFyYWxsZWxfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9zaXplLCAodm9pZCAqKSB0YXNrLAorICAgICAgICAgICAgICAgIE9NUFRfSU5WT0tFUihmb3JrX2NvbnRleHRfZ251KSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIF9fa21wX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgICAgICBvbXB0X3Rhc2tfaWRfdCBteV9vbXB0X3Rhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisKKyAgICAgICAgLy8gc2V0IHVwIGxpZ2h0d2VpZ2h0IHRhc2sKKyAgICAgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSAob21wdF9sd190YXNrdGVhbV90ICopCisgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZShzaXplb2Yob21wdF9sd190YXNrdGVhbV90KSk7CisgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9pbml0KGx3dCwgdGhyLCBndGlkLCAodm9pZCAqKSB0YXNrLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICAgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gbXlfb21wdF90YXNrX2lkOworICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9saW5rKGx3dCwgdGhyKTsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgLy8gaW1wbGljaXQgdGFzayBjYWxsYmFjaworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikoCisgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgbXlfb21wdF90YXNrX2lkKTsKKyAgICAgICAgfQorICAgICAgICB0aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisjZW5kaWYKKyAgICB9CisjZW5kaWYKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJUKSh2b2lkICgqdGFzaykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdW5zaWduZWQgbnVtX3RocmVhZHMpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorfQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICB0aHIgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9lbmQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3BhcmFsbGVsX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQ7CisgICAgb21wdF90YXNrX2lkX3Qgc2VyaWFsaXplZF90YXNrX2lkOworICAgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZSA9IE5VTEw7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG9tcHRfdGVhbV9pbmZvX3QgKnRlYW1faW5mbyA9IF9fb21wdF9nZXRfdGVhbWluZm8oMCwgTlVMTCk7CisgICAgICAgIHBhcmFsbGVsX2lkID0gdGVhbV9pbmZvLT5wYXJhbGxlbF9pZDsKKworICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgICAgICBzZXJpYWxpemVkX3Rhc2tfaWQgPSB0YXNrX2luZm8tPnRhc2tfaWQ7CisKKyAgICAgICAgLy8gUmVjb3JkIHRoYXQgd2UgcmUtZW50ZXJlZCB0aGUgcnVudGltZSBzeXN0ZW0gaW4gdGhlIGltcGxpY2l0CisgICAgICAgIC8vIHRhc2sgZnJhbWUgcmVwcmVzZW50aW5nIHRoZSBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIG9tcHRfZnJhbWUgPSAmdGFza19pbmZvLT5mcmFtZTsKKyAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisKKyAgICAgICAgLy8gdW5saW5rIGlmIG5lY2Vzc2FyeS4gbm8tb3AgaWYgdGhlcmUgaXMgbm90IGEgbGlnaHR3ZWlnaHQgdGFzay4KKyAgICAgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKHRocik7CisgICAgICAgIC8vIEdPTVAgYWxsb2NhdGVzL2ZyZWVzIGx3dCBzaW5jZSBpdCBjYW4ndCBiZSBrZXB0IG9uIHRoZSBzdGFjaworICAgICAgICBpZiAobHd0KSB7CisgICAgICAgICAgIF9fa21wX2ZyZWUobHd0KTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgIC8vIFNpbmNlIGEgbGlnaHR3ZWlnaHQgdGFzayB3YXMgZGVzdHJveWVkLCBtYWtlIHN1cmUgdGhhdCB0aGUKKyAgICAgICAgICAgICAgLy8gcmVtYWluaW5nIGRlZXBlc3QgdGFzayBrbm93cyB0aGUgc3RhY2sgZnJhbWUgd2hlcmUgdGhlIHJ1bnRpbWUKKyAgICAgICAgICAgICAgLy8gd2FzIHJlZW50ZXJlZC4KKyAgICAgICAgICAgICAgb21wdF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICAgICAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiAoISB0aHItPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkKSB7CisgICAgICAgIF9fa21wX3J1bl9hZnRlcl9pbnZva2VkX3Rhc2soZ3RpZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgdGhyLAorICAgICAgICAgIHRoci0+dGgudGhfdGVhbSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgIC8vIFNldCByZWVudGVyIGZyYW1lIGluIHBhcmVudCB0YXNrLCB3aGljaCB3aWxsIGJlY29tZSBjdXJyZW50IHRhc2sKKyAgICAgICAgICAvLyBpbiB0aGUgbWlkc3Qgb2Ygam9pbi4gVGhpcyBpcyBuZWVkZWQgYmVmb3JlIHRoZSBlbmRfcGFyYWxsZWwgY2FsbGJhY2suCisgICAgICAgICAgb21wdF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgxKTsKKyAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgX19rbXBfam9pbl9jYWxsKCZsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICwgZm9ya19jb250ZXh0X2dudQorI2VuZGlmCisgICAgICAgICk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZWxzZSB7CisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSkgeworICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICBwYXJhbGxlbF9pZCwgc2VyaWFsaXplZF90YXNrX2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgX19rbXBjX2VuZF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFJlY29yZCB0aGF0IHdlIHJlLWVudGVyZWQgdGhlIHJ1bnRpbWUgc3lzdGVtIGluIHRoZSBmcmFtZSB0aGF0CisgICAgICAgICAgICAvLyBjcmVhdGVkIHRoZSBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICBvbXB0X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKworICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgb21wdF90YXNrX2luZm9fdCAqdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGZvcmtfY29udGV4dF9nbnUpKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgb21wdF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gTlVMTDsKKworICAgICAgICAgICAgdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0KKyAgICAgICAgICAgICAgICAoKCh0aHItPnRoLnRoX3RlYW0pLT50LnRfc2VyaWFsaXplZCkgPworICAgICAgICAgICAgICAgIG9tcHRfc3RhdGVfd29ya19zZXJpYWwgOiBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWwpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9Cit9CisKKworLy8KKy8vIExvb3Agd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIFRoZSBHbnUgY29kZWdlbiBwYXNzZXMgaW4gYW4gZXhjbHVzaXZlIHVwcGVyIGJvdW5kIGZvciB0aGUgb3ZlcmFsbCByYW5nZSwKKy8vIGJ1dCB0aGUgbGliZ3VpZGUgZGlzcGF0Y2ggY29kZSBleHBlY3RzIGFuIGluY2x1c2l2ZSB1cHBlciBib3VuZCwgaGVuY2UgdGhlCisvLyAiZW5kIC0gaW5jciIgNXRoIGFyZ3VtZW50IHRvIEtNUF9ESVNQQVRDSF9JTklUIChhbmQgdGhlICIgdWIgLSBzdHIiIDExdGgKKy8vIGFyZ3VtZW50IHRvIF9fa21wX0dPTVBfZm9ya19jYWxsKS4KKy8vCisvLyBDb252ZXJzZWx5LCBLTVBfRElTUEFUQ0hfTkVYVCByZXR1cm5zIGFuZCBpbmNsdXNpdmUgdXBwZXIgYm91bmQgaW4gKnBfdWIsCisvLyBidXQgdGhlIEdudSBjb2RlZ2VuIGV4cGVjdHMgYW4gZXhjbHVzaWRlIHVwcGVyIGJvdW5kLCBzbyB0aGUgYWRqdXN0bWVudAorLy8gIipwX3ViICs9IHN0cmlkZSIgY29tcGVuc3RhdGVzIGZvciB0aGUgZGlzY3JlcGFuY3kuCisvLworLy8gQ29ycmVjdGlvbjogdGhlIGdudSBjb2RlZ2VuIGFsd2F5cyBhZGp1c3RzIHRoZSB1cHBlciBib3VuZCBieSArLTEsIG5vdCB0aGUKKy8vIHN0cmlkZSB2YWx1ZS4gIFdlIGFkanVzdCB0aGUgZGlzcGF0Y2ggcGFyYW1ldGVycyBhY2NvcmRpbmdseSAoYnkgKy0xKSwgYnV0CisvLyB3ZSBzdGlsbCBhZGp1c3QgcF91YiBieSB0aGUgYWN0dWFsIHN0cmlkZSB2YWx1ZS4KKy8vCisvLyBUaGUgInJ1bnRpbWUiIHZlcnNpb25zIGRvIG5vdCB0YWtlIGEgY2h1bmtfc3ogcGFyYW1ldGVyLgorLy8KKy8vIFRoZSBwcm9maWxlIGxpYiBjYW5ub3Qgc3VwcG9ydCBjb25zdHJ1Y3QgY2hlY2tpbmcgb2YgdW5vcmRlcmVkIGxvb3BzIHRoYXQKKy8vIGFyZSBwcmVkZXRlcm1pbmVkIGJ5IHRoZSBjb21waWxlciB0byBiZSBzdGF0aWNhbGx5IHNjaGVkdWxlZCwgYXMgdGhlIGdjYworLy8gY29kZWdlbiB3aWxsIG5vdCBhbHdheXMgZW1pdCBjYWxscyB0byBHT01QX2xvb3Bfc3RhdGljX25leHQoKSB0byBnZXQgdGhlCisvLyBuZXh0IGl0ZXJhdGlvbi4gIEluc3RlYWQsIGl0IGVtaXRzIGlubGluZSBjb2RlIHRvIGNhbGwgb21wX2dldF90aHJlYWRfbnVtKCkKKy8vIG51bSBhbmQgY2FsY3VsYXRlIHRoZSBpdGVyYXRpb24gc3BhY2UgdXNpbmcgdGhlIHJlc3VsdC4gIEl0IGRvZXNuJ3QgZG8gdGhpcworLy8gd2l0aCBvcmRlcmVkIHN0YXRpYyBsb29wLCBzbyB0aGV5IGNhbiBiZSBjaGVja2VkLgorLy8KKworI2RlZmluZSBMT09QX1NUQVJUKGZ1bmMsc2NoZWR1bGUpIFwKKyAgICBpbnQgZnVuYyAobG9uZyBsYiwgbG9uZyB1YiwgbG9uZyBzdHIsIGxvbmcgY2h1bmtfc3osIGxvbmcgKnBfbGIsICAgICAgICAgXAorICAgICAgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIHN0cmlkZTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX2ludCAqKXBfbGIsICAgIFwKKyAgICAgICAgICAgICAgKGttcF9pbnQgKilwX3ViLCAoa21wX2ludCAqKSZzdHJpZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWx4LCAqcF91YiAweCVseCwgcmV0dXJuaW5nICVkXG4iLCBcCisgICAgICAgICAgZ3RpZCwgKnBfbGIsICpwX3ViLCBzdGF0dXMpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuIHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworCisjZGVmaW5lIExPT1BfUlVOVElNRV9TVEFSVChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nICpwX2xiLCBsb25nICpwX3ViKSAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBjaHVua19zeiA9IDA7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6ICVkXG4iLCAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0ciwgY2h1bmtfc3osIFRSVUUpOyAgICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgXAorICAgICAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHN0cmlkZSA9PSBzdHIpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9ORVhUKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmMobG9uZyAqcF9sYiwgbG9uZyAqcF91YikgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsIChrbXBfaW50ICopcF9sYiwgICAgICAgIFwKKyAgICAgICAgICAoa21wX2ludCAqKXBfdWIsIChrbXBfaW50ICopJnN0cmlkZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbHgsICpwX3ViIDB4JWx4LCBzdHJpZGUgMHglbHgsICIgIFwKKyAgICAgICAgICAicmV0dXJuaW5nICVkXG4iLCBndGlkLCAqcF9sYiwgKnBfdWIsIHN0cmlkZSwgc3RhdHVzKSk7ICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCksIGttcF9zY2hfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19TVEFSVCksIGttcF9zY2hfZHluYW1pY19jaHVua2VkKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQpLCB7fSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9ORVhUKSwge30pCitMT09QX1JVTlRJTUVfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQpLCBrbXBfc2NoX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19TVEFSVCksIGttcF9vcmRfc3RhdGljKQorTE9PUF9ORVhUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQpLCBrbXBfb3JkX2R5bmFtaWNfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOSygmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQpLCBrbXBfb3JkX3J1bnRpbWUpCitMT09QX05FWFQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTksoJmxvYywgZ3RpZCk7IH0pCisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCkodm9pZCkKK3sKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZDogVCMlZFxuIiwgZ3RpZCkpCisKKyAgICBfX2ttcF9iYXJyaWVyKGJzX3BsYWluX2JhcnJpZXIsIGd0aWQsIEZBTFNFLCAwLCBOVUxMLCBOVUxMKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfbG9vcF9lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQpKHZvaWQpCit7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9sb29wX2VuZF9ub3dhaXQ6IFQjJWRcbiIsIF9fa21wX2dldF9ndGlkKCkpKQorfQorCisKKy8vCisvLyBVbnNpZ25lZCBsb25nIGxvbmcgbG9vcCB3b3Jrc2hhcmluZyBjb25zdHJ1Y3RzCisvLworLy8gVGhlc2UgYXJlIG5ldyB3aXRoIGdjYyA0LjQKKy8vCisKKyNkZWZpbmUgTE9PUF9TVEFSVF9VTEwoZnVuYyxzY2hlZHVsZSkgXAorICAgIGludCBmdW5jIChpbnQgdXAsIHVuc2lnbmVkIGxvbmcgbG9uZyBsYiwgdW5zaWduZWQgbG9uZyBsb25nIHViLCAgICAgICAgICBcCisgICAgICB1bnNpZ25lZCBsb25nIGxvbmcgc3RyLCB1bnNpZ25lZCBsb25nIGxvbmcgY2h1bmtfc3osICAgICAgICAgICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgbG9uZyBsb25nIHN0cjIgPSB1cCA/ICgobG9uZyBsb25nKXN0cikgOiAtKChsb25nIGxvbmcpc3RyKTsgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyaWRlOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWQsIHVwICVkLCBsYiAweCVsbHgsIHViIDB4JWxseCwgc3RyIDB4JWxseCwgY2h1bmtfc3ogMHglbGx4XG4iLCBcCisgICAgICAgICAgZ3RpZCwgdXAsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoKHN0ciA+IDApID8gKGxiIDwgdWIpIDogKGxiID4gdWIpKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVF9VTEwoJmxvYywgZ3RpZCwgKHNjaGVkdWxlKSwgbGIsICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKHN0cjIgPiAwKSA/ICh1YiAtIDEpIDogKHViICsgMSksIHN0cjIsIGNodW5rX3N6LCAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfRElTUEFUQ0hfTkVYVF9VTEwoJmxvYywgZ3RpZCwgTlVMTCwgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgKGttcF91aW50NjQgKilwX2xiLCAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgXAorICAgICAgICAgICAgaWYgKHN0YXR1cykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzdHJpZGUgPT0gc3RyMik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAqcF91YiArPSAoc3RyID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgc3RhdHVzID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWQsICpwX2xiIDB4JWxseCwgKnBfdWIgMHglbGx4LCByZXR1cm5pbmcgJWRcbiIsIFwKKyAgICAgICAgICBndGlkLCAqcF9sYiwgKnBfdWIsIHN0YXR1cykpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKyNkZWZpbmUgTE9PUF9SVU5USU1FX1NUQVJUX1VMTChmdW5jLHNjaGVkdWxlKSBcCisgICAgaW50IGZ1bmMgKGludCB1cCwgdW5zaWduZWQgbG9uZyBsb25nIGxiLCB1bnNpZ25lZCBsb25nIGxvbmcgdWIsICAgICAgICAgIFwKKyAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHIsIHVuc2lnbmVkIGxvbmcgbG9uZyAqcF9sYiwgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgdW5zaWduZWQgbG9uZyBsb25nICpwX3ViKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IHN0YXR1czsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBsb25nIGxvbmcgc3RyMiA9IHVwID8gKChsb25nIGxvbmcpc3RyKSA6IC0oKGxvbmcgbG9uZylzdHIpOyAgICAgICAgICBcCisgICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgdW5zaWduZWQgbG9uZyBsb25nIGNodW5rX3N6ID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCB1cCAlZCwgbGIgMHglbGx4LCB1YiAweCVsbHgsIHN0ciAweCVsbHgsIGNodW5rX3N6IDB4JWxseFxuIiwgXAorICAgICAgICAgIGd0aWQsIHVwLCBsYiwgdWIsIHN0ciwgY2h1bmtfc3ogKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKChzdHIgPiAwKSA/IChsYiA8IHViKSA6IChsYiA+IHViKSkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgS01QX0RJU1BBVENIX0lOSVRfVUxMKCZsb2MsIGd0aWQsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChzdHIyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIyLCBjaHVua19zeiwgVFJVRSk7ICAgICAgIFwKKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfbGIsIChrbXBfdWludDY0ICopcF91YiwgKGttcF9pbnQ2NCAqKSZzdHJpZGUpOyBcCisgICAgICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChsb25nIGxvbmcpc3RyaWRlID09IHN0cjIpOyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpwX3ViICs9IChzdHIgPiAwKSA/IDEgOiAtMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBzdGF0dXMgPSAwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHJldHVybmluZyAlZFxuIiwgXAorICAgICAgICAgIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RhdHVzKSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworI2RlZmluZSBMT09QX05FWFRfVUxMKGZ1bmMsZmluaV9jb2RlKSBcCisgICAgaW50IGZ1bmModW5zaWduZWQgbG9uZyBsb25nICpwX2xiLCB1bnNpZ25lZCBsb25nIGxvbmcgKnBfdWIpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgc3RhdHVzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGxvbmcgbG9uZyBzdHJpZGU7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBNS0xPQyhsb2MsICNmdW5jKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICI6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBmaW5pX2NvZGUgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUX1VMTCgmbG9jLCBndGlkLCBOVUxMLCAoa21wX3VpbnQ2NCAqKXBfbGIsIFwKKyAgICAgICAgICAoa21wX3VpbnQ2NCAqKXBfdWIsIChrbXBfaW50NjQgKikmc3RyaWRlKTsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoc3RhdHVzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqcF91YiArPSAoc3RyaWRlID4gMCkgPyAxIDogLTE7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtBX1RSQUNFKDIwLCAoICNmdW5jICIgZXhpdDogVCMlZCwgKnBfbGIgMHglbGx4LCAqcF91YiAweCVsbHgsIHN0cmlkZSAweCVsbHgsICIgXAorICAgICAgICAgICJyZXR1cm5pbmcgJWRcbiIsIGd0aWQsICpwX2xiLCAqcF91Yiwgc3RyaWRlLCBzdGF0dXMpKTsgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBzdGF0dXM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKworTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfU1RBUlQpLCBrbXBfc2NoX3N0YXRpYykKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCksIHt9KQorTE9PUF9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX1NUQVJUKSwga21wX3NjaF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhUKSwge30pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9TVEFSVCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX05FWFQpLCB7fSkKK0xPT1BfUlVOVElNRV9TVEFSVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJUKSwga21wX3NjaF9ydW50aW1lKQorTE9PUF9ORVhUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCksIHt9KQorCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX1NUQVJUKSwga21wX29yZF9zdGF0aWMpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9TVEFUSUNfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKK0xPT1BfU1RBUlRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX1NUQVJUKSwga21wX29yZF9keW5hbWljX2NodW5rZWQpCitMT09QX05FWFRfVUxMKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQpLCBcCisgICAgeyBLTVBfRElTUEFUQ0hfRklOSV9DSFVOS19VTEwoJmxvYywgZ3RpZCk7IH0pCitMT09QX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJUKSwga21wX29yZF9ndWlkZWRfY2h1bmtlZCkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhUKSwgXAorICAgIHsgS01QX0RJU1BBVENIX0ZJTklfQ0hVTktfVUxMKCZsb2MsIGd0aWQpOyB9KQorTE9PUF9SVU5USU1FX1NUQVJUX1VMTCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCksIGttcF9vcmRfcnVudGltZSkKK0xPT1BfTkVYVF9VTEwoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCksIFwKKyAgICB7IEtNUF9ESVNQQVRDSF9GSU5JX0NIVU5LX1VMTCgmbG9jLCBndGlkKTsgfSkKKworCisvLworLy8gQ29tYmluZWQgcGFyYWxsZWwgLyBsb29wIHdvcmtzaGFyaW5nIGNvbnN0cnVjdHMKKy8vCisvLyBUaGVyZSBhcmUgbm8gdWxsIHZlcnNpb25zICh5ZXQpLgorLy8KKworI2RlZmluZSBQQVJBTExFTF9MT09QX1NUQVJUKGZ1bmMsIHNjaGVkdWxlLCBvbXB0X3ByZSwgb21wdF9wb3N0KSBcCisgICAgdm9pZCBmdW5jICh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCAgICAgIFwKKyAgICAgIGxvbmcgbGIsIGxvbmcgdWIsIGxvbmcgc3RyLCBsb25nIGNodW5rX3N6KSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgTUtMT0MobG9jLCAjZnVuYyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiOiBUIyVkLCBsYiAweCVseCwgdWIgMHglbHgsIHN0ciAweCVseCwgY2h1bmtfc3ogMHglbHhcbiIsICAgICAgICBcCisgICAgICAgICAgZ3RpZCwgbGIsIHViLCBzdHIsIGNodW5rX3N6ICkpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBvbXB0X3ByZSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIG9tcHRfcG9zdCgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisKKworI2lmIE9NUFRfU1VQUE9SVAorCisjZGVmaW5lIE9NUFRfTE9PUF9QUkUoKSBcCisgICAgb21wdF9mcmFtZV90ICpwYXJlbnRfZnJhbWU7IFwKKyAgICBpZiAob21wdF9lbmFibGVkKSB7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOyBcCisgICAgICAgIHBhcmVudF9mcmFtZS0+cmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7IFwKKyAgICB9CisKKworI2RlZmluZSBPTVBUX0xPT1BfUE9TVCgpIFwKKyAgICBpZiAob21wdF9lbmFibGVkKSB7IFwKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOyBcCisgICAgfQorCisjZWxzZQorCisjZGVmaW5lIE9NUFRfTE9PUF9QUkUoKQorCisjZGVmaW5lIE9NUFRfTE9PUF9QT1NUKCkKKworI2VuZGlmCisKKworUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJUKSwKKyAgICAgICAgICAgICAgICAgICAga21wX3NjaF9zdGF0aWMsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfRFlOQU1JQ19TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZHluYW1pY19jaHVua2VkLCBPTVBUX0xPT1BfUFJFLCBPTVBUX0xPT1BfUE9TVCkKK1BBUkFMTEVMX0xPT1BfU1RBUlQoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQsIE9NUFRfTE9PUF9QUkUsIE9NUFRfTE9PUF9QT1NUKQorUEFSQUxMRUxfTE9PUF9TVEFSVCh4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCksCisgICAgICAgICAgICAgICAgICAgIGttcF9zY2hfcnVudGltZSwgT01QVF9MT09QX1BSRSwgT01QVF9MT09QX1BPU1QpCisKKworLy8KKy8vIFRhc2tpbmcgY29uc3RydWN0cworLy8KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVNLKSh2b2lkICgqZnVuYykodm9pZCAqKSwgdm9pZCAqZGF0YSwgdm9pZCAoKmNvcHlfZnVuYykodm9pZCAqLCB2b2lkICopLAorICBsb25nIGFyZ19zaXplLCBsb25nIGFyZ19hbGlnbiwgYm9vbCBpZl9jb25kLCB1bnNpZ25lZCBnb21wX2ZsYWdzKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFzayIpOworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIGttcF9pbnQzMiBmbGFncyA9IDA7CisgICAga21wX3Rhc2tpbmdfZmxhZ3NfdCAqaW5wdXRfZmxhZ3MgPSAoa21wX3Rhc2tpbmdfZmxhZ3NfdCAqKSAmIGZsYWdzOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICAvLyBUaGUgbG93LW9yZGVyIGJpdCBpcyB0aGUgInRpZWQiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDEpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID0gMTsKKyAgICB9CisgICAgLy8gVGhlIHNlY29uZCBsb3ctb3JkZXIgYml0IGlzIHRoZSAiZmluYWwiIGZsYWcKKyAgICBpZiAoZ29tcF9mbGFncyAmIDIpIHsKKyAgICAgICAgaW5wdXRfZmxhZ3MtPmZpbmFsID0gMTsKKyAgICB9CisgICAgaW5wdXRfZmxhZ3MtPm5hdGl2ZSA9IDE7CisgICAgLy8gX19rbXBfdGFza19hbGxvYygpIHNldHMgdXAgYWxsIG90aGVyIGZsYWdzCisKKyAgICBpZiAoISBpZl9jb25kKSB7CisgICAgICAgIGFyZ19zaXplID0gMDsKKyAgICB9CisKKyAgICBrbXBfdGFza190ICp0YXNrID0gX19rbXBfdGFza19hbGxvYygmbG9jLCBndGlkLCBpbnB1dF9mbGFncywKKyAgICAgIHNpemVvZihrbXBfdGFza190KSwgYXJnX3NpemUgPyBhcmdfc2l6ZSArIGFyZ19hbGlnbiAtIDEgOiAwLAorICAgICAgKGttcF9yb3V0aW5lX2VudHJ5X3QpZnVuYyk7CisKKyAgICBpZiAoYXJnX3NpemUgPiAwKSB7CisgICAgICAgIGlmIChhcmdfYWxpZ24gPiAwKSB7CisgICAgICAgICAgICB0YXNrLT5zaGFyZWRzID0gKHZvaWQgKikoKCgoc2l6ZV90KXRhc2stPnNoYXJlZHMpCisgICAgICAgICAgICAgICsgYXJnX2FsaWduIC0gMSkgLyBhcmdfYWxpZ24gKiBhcmdfYWxpZ24pOworICAgICAgICB9CisgICAgICAgIC8vZWxzZSBlcnJvcj8/CisKKyAgICAgICAgaWYgKGNvcHlfZnVuYykgeworICAgICAgICAgICAgKCpjb3B5X2Z1bmMpKHRhc2stPnNoYXJlZHMsIGRhdGEpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgS01QX01FTUNQWSh0YXNrLT5zaGFyZWRzLCBkYXRhLCBhcmdfc2l6ZSk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBpZiAoaWZfY29uZCkgeworICAgICAgICBfX2ttcGNfb21wX3Rhc2soJmxvYywgZ3RpZCwgdGFzayk7CisgICAgfQorICAgIGVsc2UgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3RocmVhZF9pbmZvX3Qgb2xkSW5mbzsKKyAgICAgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIC8vIFN0b3JlIHRoZSB0aHJlYWRzIHN0YXRlcyBhbmQgcmVzdG9yZSB0aGVtIGFmdGVyIHRoZSB0YXNrCisgICAgICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgICAgICB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgICAgICAgICAgb2xkSW5mbyA9IHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbzsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPQorICAgICAgICAgICAgICAgIF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCZsb2MsIGd0aWQsIHRhc2spOworICAgICAgICBmdW5jKGRhdGEpOworICAgICAgICBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKCZsb2MsIGd0aWQsIHRhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mbyA9IG9sZEluZm87CisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF90YXNrIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlUKSh2b2lkKQoreworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza3dhaXQiKTsKKyAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsKKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza3dhaXQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIF9fa21wY19vbXBfdGFza3dhaXQoJmxvYywgZ3RpZCk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t3YWl0IGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworCisvLworLy8gU2VjdGlvbnMgd29ya3NoYXJpbmcgY29uc3RydWN0cworLy8KKworLy8KKy8vIEZvciB0aGUgc2VjdGlvbnMgY29uc3RydWN0LCB3ZSBpbml0aWFsaXplIGEgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AKKy8vIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCB3aXRoIGxiIDEgYW5kIHN0cmlkZSAxLCBhbmQgdXNlIHRoZSBpdGVyYXRpb24gIydzCisvLyB0aGF0IGl0cyByZXR1cm5zIGFzIHNlY3Rpb25zIGlkcy4KKy8vCisvLyBUaGVyZSBhcmUgbm8gc3BlY2lhbCBlbnRyeSBwb2ludHMgZm9yIG9yZGVyZWQgc2VjdGlvbnMsIHNvIHdlIGFsd2F5cyB1c2UKKy8vIHRoZSBkeW5hbWljYWxseSBzY2hlZHVsZWQgd29ya3NoYXJlLCBldmVuIGlmIHRoZSBzZWN0aW9ucyBhcmVuJ3Qgb3JkZXJlZC4KKy8vCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJUKSh1bnNpZ25lZCBjb3VudCkKK3sKKyAgICBpbnQgc3RhdHVzOworICAgIGttcF9pbnQgbGIsIHViLCBzdHJpZGU7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfc3RhcnQgZXhpdDogVCMlZCByZXR1cm5pbmcgJXVcbiIsIGd0aWQsCisgICAgICAodW5zaWduZWQpbGIpKTsKKyAgICByZXR1cm4gKHVuc2lnbmVkKWxiOworfQorCisKK3Vuc2lnbmVkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQpKHZvaWQpCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW50IGxiLCB1Yiwgc3RyaWRlOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3NlY3Rpb25zX25leHQiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3NlY3Rpb25zX25leHQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIHN0YXR1cyA9IEtNUF9ESVNQQVRDSF9ORVhUKCZsb2MsIGd0aWQsIE5VTEwsICZsYiwgJnViLCAmc3RyaWRlKTsKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc3RyaWRlID09IDEpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGxiID4gMCk7CisgICAgICAgIEtNUF9BU1NFUlQobGIgPT0gdWIpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgbGIgPSAwOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfbmV4dCBleGl0OiBUIyVkIHJldHVybmluZyAldVxuIiwgZ3RpZCwKKyAgICAgICh1bnNpZ25lZClsYikpOworICAgIHJldHVybiAodW5zaWduZWQpbGI7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TRUNUSU9OU19TVEFSVCkodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLAorICB1bnNpZ25lZCBudW1fdGhyZWFkcywgdW5zaWduZWQgY291bnQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X2ZyYW1lX3QgKnBhcmVudF9mcmFtZTsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lID0gX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKDApOworICAgICAgICBwYXJlbnRfZnJhbWUtPnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworICAgIH0KKyNlbmRpZgorCisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnNfc3RhcnQ6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgcGFyZW50X2ZyYW1lLT5yZWVudGVyX3J1bnRpbWVfZnJhbWUgPSBOVUxMOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RJU1BBVENIX0lOSVQoJmxvYywgZ3RpZCwga21wX25tX2R5bmFtaWNfY2h1bmtlZCwgMSwgY291bnQsIDEsIDEsIFRSVUUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9uc19zdGFydCBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kOiBUIyVkXG4iLCBndGlkKSkKKworICAgIF9fa21wX2JhcnJpZXIoYnNfcGxhaW5fYmFycmllciwgZ3RpZCwgRkFMU0UsIDAsIE5VTEwsIE5VTEwpOworCisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmQgZXhpdDogVCMlZFxuIiwgZ3RpZCkpCit9CisKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfTk9XQUlUKSh2b2lkKQoreworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfc2VjdGlvbnNfZW5kX25vd2FpdDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCit9CisKKy8vIGxpYmdvbXAgaGFzIGFuIGVtcHR5IGZ1bmN0aW9uIGZvciBHT01QX3Rhc2t5aWVsZCBhcyBvZiAyMDEzLTEwLTEwCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tZSUVMRCkodm9pZCkKK3sKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX3Rhc2t5aWVsZDogVCMlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSkpCisgICAgcmV0dXJuOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQgLy8gdGhlc2UgYXJlIG5ldyBHT01QXzQuMCBlbnRyeSBwb2ludHMKKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTCkodm9pZCAoKnRhc2spKHZvaWQgKiksIHZvaWQgKmRhdGEsIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfbWljcm90YXNrX3dyYXBwZXIsIDIsIHRhc2ssIGRhdGEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKyAgICB0YXNrKGRhdGEpOworICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TKSh2b2lkICgqdGFzaykgKHZvaWQgKiksIHZvaWQgKmRhdGEsCisgIHVuc2lnbmVkIG51bV90aHJlYWRzLCB1bnNpZ25lZCBjb3VudCwgdW5zaWduZWQgZmxhZ3MpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfcGFyYWxsZWxfc2VjdGlvbnM6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGlmIChfX2ttcGNfb2tfdG9fZm9yaygmbG9jKSAmJiAobnVtX3RocmVhZHMgIT0gMSkpIHsKKyAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfbnVtX3RocmVhZHMoJmxvYywgZ3RpZCwgbnVtX3RocmVhZHMpOworICAgICAgICB9CisgICAgICAgIGlmKGZsYWdzICE9IDApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfcHJvY19iaW5kKCZsb2MsIGd0aWQsIChrbXBfcHJvY19iaW5kX3QpZmxhZ3MpOworICAgICAgICB9CisgICAgICAgIF9fa21wX0dPTVBfZm9ya19jYWxsKCZsb2MsIGd0aWQsIHRhc2ssCisgICAgICAgICAgKG1pY3JvdGFza190KV9fa21wX0dPTVBfcGFyYWxsZWxfbWljcm90YXNrX3dyYXBwZXIsIDksIHRhc2ssIGRhdGEsCisgICAgICAgICAgbnVtX3RocmVhZHMsICZsb2MsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIChrbXBfaW50KTEsCisgICAgICAgICAgKGttcF9pbnQpY291bnQsIChrbXBfaW50KTEsIChrbXBfaW50KTEpOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOworICAgIH0KKworICAgIEtNUF9ESVNQQVRDSF9JTklUKCZsb2MsIGd0aWQsIGttcF9ubV9keW5hbWljX2NodW5rZWQsIDEsIGNvdW50LCAxLCAxLCBUUlVFKTsKKworICAgIHRhc2soZGF0YSk7CisgICAgeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQpKCk7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9wYXJhbGxlbF9zZWN0aW9ucyBleGl0OiBUIyVkXG4iLCBndGlkKSk7Cit9CisKKyNkZWZpbmUgUEFSQUxMRUxfTE9PUChmdW5jLCBzY2hlZHVsZSkgXAorICAgIHZvaWQgZnVuYyAodm9pZCAoKnRhc2spICh2b2lkICopLCB2b2lkICpkYXRhLCB1bnNpZ25lZCBudW1fdGhyZWFkcywgICAgICBcCisgICAgICBsb25nIGxiLCBsb25nIHViLCBsb25nIHN0ciwgbG9uZyBjaHVua19zeiwgdW5zaWduZWQgZmxhZ3MpICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpbnQgZ3RpZCA9IF9fa21wX2VudHJ5X2d0aWQoKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIE1LTE9DKGxvYywgI2Z1bmMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggI2Z1bmMgIjogVCMlZCwgbGIgMHglbHgsIHViIDB4JWx4LCBzdHIgMHglbHgsIGNodW5rX3N6IDB4JWx4XG4iLCAgICAgICAgXAorICAgICAgICAgIGd0aWQsIGxiLCB1Yiwgc3RyLCBjaHVua19zeiApKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKF9fa21wY19va190b19mb3JrKCZsb2MpICYmIChudW1fdGhyZWFkcyAhPSAxKSkgeyAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKG51bV90aHJlYWRzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9udW1fdGhyZWFkcygmbG9jLCBndGlkLCBudW1fdGhyZWFkcyk7ICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKGZsYWdzICE9IDApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgX19rbXBfcHVzaF9wcm9jX2JpbmQoJmxvYywgZ3RpZCwgKGttcF9wcm9jX2JpbmRfdClmbGFncyk7ICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9mb3JrX2NhbGwoJmxvYywgZ3RpZCwgdGFzaywgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgIChtaWNyb3Rhc2tfdClfX2ttcF9HT01QX3BhcmFsbGVsX21pY3JvdGFza193cmFwcGVyLCA5LCAgICAgICAgIFwKKyAgICAgICAgICAgICAgdGFzaywgZGF0YSwgbnVtX3RocmVhZHMsICZsb2MsIChzY2hlZHVsZSksIGxiLCAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAoc3RyID4gMCkgPyAodWIgLSAxKSA6ICh1YiArIDEpLCBzdHIsIGNodW5rX3N6KTsgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19rbXBfR09NUF9zZXJpYWxpemVkX3BhcmFsbGVsKCZsb2MsIGd0aWQsIHRhc2spOyAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfRElTUEFUQ0hfSU5JVCgmbG9jLCBndGlkLCAoc2NoZWR1bGUpLCBsYiwgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKHN0ciA+IDApID8gKHViIC0gMSkgOiAodWIgKyAxKSwgc3RyLCBjaHVua19zeiwgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAoc2NoZWR1bGUpICE9IGttcF9zY2hfc3RhdGljKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB0YXNrKGRhdGEpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfRU5EKSgpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLQV9UUkFDRSgyMCwgKCAjZnVuYyAiIGV4aXQ6IFQjJWRcbiIsIGd0aWQpKTsgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9TVEFUSUMpLCBrbXBfc2NoX3N0YXRpYykKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMpLCBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCkKK1BBUkFMTEVMX0xPT1AoeGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCksIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQpCitQQVJBTExFTF9MT09QKHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FKSwga21wX3NjaF9ydW50aW1lKQorCisKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJUKSh2b2lkKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX3Rhc2tncm91cF9zdGFydCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX3N0YXJ0OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBfX2ttcGNfdGFza2dyb3VwKCZsb2MsIGd0aWQpOworCisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQpKHZvaWQpCit7CisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfdGFza2dyb3VwX2VuZCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfdGFza2dyb3VwX2VuZDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAoJmxvYywgZ3RpZCk7CisKKyAgICByZXR1cm47Cit9CisKKyNpZm5kZWYgS01QX0RFQlVHCitzdGF0aWMKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KK2ttcF9pbnQzMiBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZChpbnQgZ29tcF9raW5kKSB7CisgICAga21wX2ludDMyIGNuY2xfa2luZCA9IDA7CisgICAgc3dpdGNoKGdvbXBfa2luZCkgeworICAgICAgY2FzZSAxOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfcGFyYWxsZWw7CisgICAgICAgIGJyZWFrOworICAgICAgY2FzZSAyOgorICAgICAgICBjbmNsX2tpbmQgPSBjYW5jZWxfbG9vcDsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDQ6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF9zZWN0aW9uczsKKyAgICAgICAgYnJlYWs7CisgICAgICBjYXNlIDg6CisgICAgICAgIGNuY2xfa2luZCA9IGNhbmNlbF90YXNrZ3JvdXA7CisgICAgICAgIGJyZWFrOworICAgIH0KKyAgICByZXR1cm4gY25jbF9raW5kOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCkoaW50IHdoaWNoKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2NhbmNlbGxhdGlvbl9wb2ludCIpOworICAgIEtBX1RSQUNFKDIwLCAoIkdPTVBfY2FuY2VsbGF0aW9uX3BvaW50OiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICBrbXBfaW50MzIgY25jbF9raW5kID0gX19rbXBfZ29tcF90b19vbXBfY2FuY2VsbGF0aW9uX2tpbmQod2hpY2gpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxsYXRpb25wb2ludCgmbG9jLCBndGlkLCBjbmNsX2tpbmQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMKSh2b2lkKQoreworICAgIGlmKF9fa21wX29tcF9jYW5jZWxsYXRpb24pIHsKKyAgICAgICAgS01QX0ZBVEFMKE5vR29tcENhbmNlbGxhdGlvbik7CisgICAgfQorICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICBNS0xPQyhsb2MsICJHT01QX2JhcnJpZXJfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9iYXJyaWVyX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworYm9vbAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwpKGludCB3aGljaCwgYm9vbCBkb19jYW5jZWwpCit7CisgICAgaWYoX19rbXBfb21wX2NhbmNlbGxhdGlvbikgeworICAgICAgICBLTVBfRkFUQUwoTm9Hb21wQ2FuY2VsbGF0aW9uKTsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgIE1LTE9DKGxvYywgIkdPTVBfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9jYW5jZWw6IFQjJWRcbiIsIGd0aWQpKTsKKworICAgIGttcF9pbnQzMiBjbmNsX2tpbmQgPSBfX2ttcF9nb21wX3RvX29tcF9jYW5jZWxsYXRpb25fa2luZCh3aGljaCk7CisKKyAgICBpZihkb19jYW5jZWwgPT0gRkFMU0UpIHsKKyAgICAgICAgcmV0dXJuIHhleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5UKSh3aGljaCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuIF9fa21wY19jYW5jZWwoJmxvYywgZ3RpZCwgY25jbF9raW5kKTsKKyAgICB9Cit9CisKK2Jvb2wKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsIik7CisgICAgS0FfVFJBQ0UoMjAsICgiR09NUF9zZWN0aW9uc19lbmRfY2FuY2VsOiBUIyVkXG4iLCBndGlkKSk7CisKKyAgICByZXR1cm4gX19rbXBjX2NhbmNlbF9iYXJyaWVyKCZsb2MsIGd0aWQpOworfQorCitib29sCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX0NBTkNFTCkodm9pZCkKK3sKKyAgICBpZihfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIEtNUF9GQVRBTChOb0dvbXBDYW5jZWxsYXRpb24pOworICAgIH0KKyAgICBpbnQgZ3RpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgTUtMT0MobG9jLCAiR09NUF9sb29wX2VuZF9jYW5jZWwiKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJHT01QX2xvb3BfZW5kX2NhbmNlbDogVCMlZFxuIiwgZ3RpZCkpOworCisgICAgcmV0dXJuIF9fa21wY19jYW5jZWxfYmFycmllcigmbG9jLCBndGlkKTsKK30KKworLy8gQWxsIHRhcmdldCBmdW5jdGlvbnMgYXJlIGVtcHR5IGFzIG9mIDIwMTQtMDUtMjkKK3ZvaWQKK3hleHBhbmQoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUKShpbnQgZGV2aWNlLCB2b2lkICgqZm4pICh2b2lkICopLCBjb25zdCB2b2lkICpvcGVubXBfdGFyZ2V0LAorICAgICAgICAgICAgIHNpemVfdCBtYXBudW0sIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfREFUQSkoaW50IGRldmljZSwgY29uc3Qgdm9pZCAqb3Blbm1wX3RhcmdldCwgc2l6ZV90IG1hcG51bSwKKyAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEpKHZvaWQpCit7CisgICAgcmV0dXJuOworfQorCit2b2lkCit4ZXhwYW5kKEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUpKGludCBkZXZpY2UsIGNvbnN0IHZvaWQgKm9wZW5tcF90YXJnZXQsIHNpemVfdCBtYXBudW0sCisgICAgICAgICAgICAgICAgICAgIHZvaWQgKipob3N0YWRkcnMsIHNpemVfdCAqc2l6ZXMsIHVuc2lnbmVkIGNoYXIgKmtpbmRzKQoreworICAgIHJldHVybjsKK30KKwordm9pZAoreGV4cGFuZChLTVBfQVBJX05BTUVfR09NUF9URUFNUykodW5zaWduZWQgaW50IG51bV90ZWFtcywgdW5zaWduZWQgaW50IHRocmVhZF9saW1pdCkKK3sKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisvKgorICAgIFRoZSBmb2xsb3dpbmcgc2VjdGlvbnMgb2YgY29kZSBjcmVhdGUgYWxpYXNlcyBmb3IgdGhlIEdPTVBfKiBmdW5jdGlvbnMsCisgICAgdGhlbiBjcmVhdGUgdmVyc2lvbmVkIHN5bWJvbHMgdXNpbmcgdGhlIGFzc2VtYmxlciBkaXJlY3RpdmUgLnN5bXZlci4KKyAgICBUaGlzIGlzIG9ubHkgcGVydGluZW50IGZvciBFTEYgLnNvIGxpYnJhcnkKKyAgICB4YWxpYXNpZnkgYW5kIHh2ZXJzaW9uaWZ5IGFyZSBkZWZpbmVkIGluIGttcF9mdG5fb3MuaAorKi8KKworI2lmZGVmIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKy8vIEdPTVBfMS4wIGFsaWFzZXMKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9BVE9NSUNfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQVRPTUlDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX05BTUVfRU5ELCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NSSVRJQ0FMX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5EX05PV0FJVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9EWU5BTUlDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfTkVYVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfT1JERVJFRF9HVUlERURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX05FWFQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9TVEFUSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9PUkRFUkVEX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDX1NUQVJULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19ORVhULCAxMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfU1RBUlQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9TVEFSVCwgMTApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9TVEFSVCwgMTApOworCisvLyBHT01QXzIuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTSywgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfRFlOQU1JQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfR1VJREVEX1NUQVJULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9EWU5BTUlDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0dVSURFRF9ORVhULCAyMCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9HVUlERURfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfUlVOVElNRV9TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfU1RBVElDX05FWFQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1JVTlRJTUVfU1RBUlQsIDIwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX1NUQVRJQ19TVEFSVCwgMjApOworCisvLyBHT01QXzMuMCBhbGlhc2VzCit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS1lJRUxELCAzMCk7CisKKy8vIEdPTVBfNC4wIGFsaWFzZXMKKy8vIFRoZSBHT01QX3BhcmFsbGVsKiBlbnRyeSBwb2ludHMgYmVsb3cgYXJlbid0IE9wZW5NUCA0LjAgcmVsYXRlZC4KKyNpZiBPTVBfNDBfRU5BQkxFRAoreGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwKTsKK3hhbGlhc2lmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfUlVOVElNRSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX1NUQVJULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFTS0dST1VQX0VORCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfQ0FOQ0VMTEFUSU9OX1BPSU5ULCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfU0VDVElPTlNfRU5EX0NBTkNFTCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVCwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX0VORF9EQVRBLCA0MCk7Cit4YWxpYXNpZnkoS01QX0FQSV9OQU1FX0dPTVBfVEFSR0VUX1VQREFURSwgNDApOworeGFsaWFzaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCk7CisjZW5kaWYKKworLy8gR09NUF8xLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0FUT01JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQkFSUklFUiwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DUklUSUNBTF9OQU1FX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfTkFNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfQ1JJVElDQUxfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0RZTkFNSUNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfRU5ELCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfRFlOQU1JQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX0dVSURFRF9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfR1VJREVEX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfUlVOVElNRV9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9PUkRFUkVEX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX09SREVSRURfU1RBVElDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1JVTlRJTUVfTkVYVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19ORVhULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfT1JERVJFRF9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX09SREVSRURfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0VORCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9EWU5BTUlDX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0dVSURFRF9TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfTE9PUF9SVU5USU1FX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1NUQVRJQ19TVEFSVCwgMTAsICJHT01QXzEuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUxfU0VDVElPTlNfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX0VORF9OT1dBSVQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX05FWFQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NFQ1RJT05TX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfQ09QWV9FTkQsIDEwLCAiR09NUF8xLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1NJTkdMRV9DT1BZX1NUQVJULCAxMCwgIkdPTVBfMS4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TSU5HTEVfU1RBUlQsIDEwLCAiR09NUF8xLjAiKTsKKworLy8gR09NUF8yLjAgdmVyc2lvbmVkIHN5bWJvbHMKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0ssIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tXQUlULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9EWU5BTUlDX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX0dVSURFRF9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9HVUlERURfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfRFlOQU1JQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX0RZTkFNSUNfU1RBUlQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX05FWFQsIDIwLCAiR09NUF8yLjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0xPT1BfVUxMX09SREVSRURfR1VJREVEX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1JVTlRJTUVfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfT1JERVJFRF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9PUkRFUkVEX1NUQVRJQ19TVEFSVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfUlVOVElNRV9ORVhULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9SVU5USU1FX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9MT09QX1VMTF9TVEFUSUNfTkVYVCwgMjAsICJHT01QXzIuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9VTExfU1RBVElDX1NUQVJULCAyMCwgIkdPTVBfMi4wIik7CisKKy8vIEdPTVBfMy4wIHZlcnNpb25lZCBzeW1ib2xzCit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLWUlFTEQsIDMwLCAiR09NUF8zLjAiKTsKKworLy8gR09NUF80LjAgdmVyc2lvbmVkIHN5bWJvbHMKKyNpZiBPTVBfNDBfRU5BQkxFRAoreHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfUEFSQUxMRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX1NFQ1RJT05TLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX0RZTkFNSUMsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfR1VJREVELCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9QQVJBTExFTF9MT09QX1JVTlRJTUUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1BBUkFMTEVMX0xPT1BfU1RBVElDLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVNLR1JPVVBfU1RBUlQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBU0tHUk9VUF9FTkQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0JBUlJJRVJfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9DQU5DRUwsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX0NBTkNFTExBVElPTl9QT0lOVCwgNDAsICJHT01QXzQuMCIpOworeHZlcnNpb25pZnkoS01QX0FQSV9OQU1FX0dPTVBfTE9PUF9FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9TRUNUSU9OU19FTkRfQ0FOQ0VMLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVQsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9EQVRBLCA0MCwgIkdPTVBfNC4wIik7Cit4dmVyc2lvbmlmeShLTVBfQVBJX05BTUVfR09NUF9UQVJHRVRfRU5EX0RBVEEsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RBUkdFVF9VUERBVEUsIDQwLCAiR09NUF80LjAiKTsKK3h2ZXJzaW9uaWZ5KEtNUF9BUElfTkFNRV9HT01QX1RFQU1TLCA0MCwgIkdPTVBfNC4wIik7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9VU0VfVkVSU0lPTl9TWU1CT0xTCisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIH0gLy9leHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2kxOG4uYyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaTE4bi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjhkYWQyNTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2kxOG4uYwpAQCAtMCwwICsxLDk3NCBAQAorLyoKKyAqIGttcF9pMThuLmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworI2luY2x1ZGUgImttcF9vcy5oIgorI2luY2x1ZGUgImttcF9kZWJ1Zy5oIgorI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiICAgICAgICAgIC8vIF9fa21wX3ByaW50Zi4KKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpbmNsdWRlIDxsb2NhbGUuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKworI2luY2x1ZGUgImttcF9pMThuX2RlZmF1bHQuaW5jIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKworI3VuZGVmIEtNUF9JMThOX09LCisKKyNkZWZpbmUgZ2V0X3NlY3Rpb24oIGlkICkgICggKGlkKSA+PiAxNiApCisjZGVmaW5lIGdldF9udW1iZXIoIGlkICkgICAoIChpZCkgJiAweEZGRkYgKQorCitrbXBfbXNnX3QgICAgICAgICAgIF9fa21wX21zZ19lbXB0eSA9IHsga21wX210X2R1bW15LCAwLCAiIiwgMCAgfTsKK2ttcF9tc2dfdCAgICAgICAgICAgX19rbXBfbXNnX251bGwgID0geyBrbXBfbXRfZHVtbXksIDAsIE5VTEwsIDAgfTsKK3N0YXRpYyBjaGFyIGNvbnN0ICogbm9fbWVzc2FnZV9hdmFpbGFibGUgPSAiKE5vIG1lc3NhZ2UgYXZhaWxhYmxlKSI7CisKK2VudW0ga21wX2kxOG5fY2F0X3N0YXR1cyB7CisgICAgS01QX0kxOE5fQ0xPU0VELCAgICAvLyBOb3QgeWV0IG9wZW5lZCBvciBjbG9zZWQuCisgICAgS01QX0kxOE5fT1BFTkVELCAgICAvLyBPcGVuZWQgc3VjY2Vzc2Z1bGx5LCByZWFkeSB0byB1c2UuCisgICAgS01QX0kxOE5fQUJTRU5UICAgICAvLyBPcGVuaW5nIGZhaWxlZCwgbWVzc2FnZSBjYXRhbG9nIHNob3VsZCBub3QgYmUgdXNlZC4KK307IC8vIGVudW0ga21wX2kxOG5fY2F0X3N0YXR1cwordHlwZWRlZiBlbnVtIGttcF9pMThuX2NhdF9zdGF0dXMgIGttcF9pMThuX2NhdF9zdGF0dXNfdDsKK3N0YXRpYyB2b2xhdGlsZSBrbXBfaTE4bl9jYXRfc3RhdHVzX3QgIHN0YXR1cyA9IEtNUF9JMThOX0NMT1NFRDsKKworLyoKKyAgICBNZXNzYWdlIGNhdGFsb2cgaXMgb3BlbmVkIGF0IGZpcnN0IHVzYWdlLCBzbyB3ZSBoYXZlIHRvIHN5bmNocm9uaXplIG9wZW5pbmcgdG8gYXZvaWQgcmFjZSBhbmQKKyAgICBtdWx0aXBsZSBvcGVuaW5ncy4KKworICAgIENsb3NpbmcgZG9lcyBub3QgcmVxdWlyZSBzeW5jaHJvbml6YXRpb24sIGJlY2F1c2UgY2F0YWxvZyBpcyBjbG9zZWQgdmVyeSBsYXRlIGF0IGxpYnJhcnkKKyAgICBzaHV0dGluZyBkb3duLCB3aGVuIG5vIG90aGVyIHRocmVhZHMgYXJlIGFsaXZlLgorKi8KKworc3RhdGljIHZvaWQgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIGxvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKTsKKyAgICAvLyBgbG9jaycgdmFyaWFibGUgbWF5IGJlIHBsYWNlZCBpbnRvIF9fa21wX2kxOG5fY2F0b3BlbiBmdW5jdGlvbiBiZWNhdXNlIGl0IGlzIHVzZWQgb25seSBieQorICAgIC8vIHRoYXQgZnVuY3Rpb24uIEJ1dCB3ZSBhZnJhaWQgYSAoYnVnZ3kpIGNvbXBpbGVyIG1heSB0cmVhdCBpdCB3cm9uZ2x5LiBTbyB3ZSBwdXQgaXQgb3V0c2lkZSBvZgorICAgIC8vIGZ1bmN0aW9uIGp1c3QgaW4gY2FzZS4KKwordm9pZAorX19rbXBfaTE4bl9jYXRvcGVuKAorKSB7CisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICkgeworICAgICAgICAgICAgX19rbXBfaTE4bl9kb19jYXRvcGVuKCk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbG9jayApOworICAgIH07IC8vIGlmCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRvcGVuCisKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBMaW51eCogT1MgYW5kIE9TIFgqIHBhcnQuCisgICAgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisqLworCisjaWYgS01QX09TX1VOSVgKKyNkZWZpbmUgS01QX0kxOE5fT0sKKworI2luY2x1ZGUgPG5sX3R5cGVzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAoKG5sX2NhdGQpKCAtMSApKQorc3RhdGljIG5sX2NhdGQgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGUuY2F0IiA6ICJsaWJvbXAuY2F0IiApOworCisvKgorICAgIFVzZWZ1bCBsaW5rczoKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Jhc2VkZWZzL3hiZF9jaGFwMDguaHRtbCN0YWdfMDhfMDIKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9jYXRvcGVuLmh0bWwKKyAgICAgICAgaHR0cDovL3d3dy5vcGVuZ3JvdXAub3JnL29ubGluZXB1YnMvMDAwMDk1Mzk5L2Z1bmN0aW9ucy9zZXRsb2NhbGUuaHRtbAorKi8KKwordm9pZAorX19rbXBfaTE4bl9kb19jYXRvcGVuKAorKSB7CisgICAgaW50ICAgIGVuZ2xpc2ggPSAwOworICAgIGNoYXIgKiBsYW5nICAgID0gX19rbXBfZW52X2dldCggIkxBTkciICk7CisgICAgLy8gVE9ETzogV2hhdCBhYm91dCBMQ19BTEwgb3IgTENfTUVTU0FHRVM/CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdGF0dXMgPT0gS01QX0kxOE5fQ0xPU0VEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICAgID09IEtNUF9JMThOX05VTExDQVQgKTsKKworICAgIGVuZ2xpc2ggPQorCWxhbmcgPT0gTlVMTCAgICAgICAgICAgICAgICAgICAgICAgfHwgIC8vIEluIGFsbCB0aGVzZSBjYXNlcyBFbmdsaXNoIGxhbmd1YWdlIGlzIHVzZWQuCisJc3RyY21wKCBsYW5nLCAiIiApICAgICAgICAgICAgPT0gMCB8fAorICAgICAgICBzdHJjbXAoIGxhbmcsICIgIiApICAgICAgICAgICA9PSAwIHx8CisgICAgICAgICAgICAgIC8vIFdvcmthcm91bmQgZm9yIEZvcnRyYW4gUlRMIGJ1ZyBEUEQyMDAxMzc4NzMgIkZvcnRyYW4gcnVudGltZSByZXNldHMgTEFORyBlbnYgdmFyCisgICAgICAgICAgICAgIC8vIHRvIHNwYWNlIGlmIGl0IGlzIG5vdCBzZXQiLgorCXN0cmNtcCggbGFuZywgIkMiICkgICAgICAgICAgID09IDAgfHwKKwlzdHJjbXAoIGxhbmcsICJQT1NJWCIgKSAgICAgICA9PSAwOworCisgICAgaWYgKCAhIGVuZ2xpc2ggKSB7ICAvLyBFbmdsaXNoIGxhbmd1YWdlIGlzIG5vdCB5ZXQgZGV0ZWN0ZWQsIGxldCB1cyBjb250aW51ZS4KKyAgICAgICAgLy8gRm9ybWF0IG9mIExBTkcgaXM6IFtsYW5ndWFnZVtfdGVycml0b3J5XVsuY29kZXNldF1bQG1vZGlmaWVyXV0KKyAgICAgICAgLy8gU3RyaXAgYWxsIHBhcnRzIGV4Y2VwdCBsYW5ndWFnZS4KKyAgICAgICAgY2hhciAqIHRhaWwgPSBOVUxMOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIGxhbmcsICdAJywgJiBsYW5nLCAmIHRhaWwgKTsKKyAgICAgICAgX19rbXBfc3RyX3NwbGl0KCBsYW5nLCAnLicsICYgbGFuZywgJiB0YWlsICk7CisgICAgICAgIF9fa21wX3N0cl9zcGxpdCggbGFuZywgJ18nLCAmIGxhbmcsICYgdGFpbCApOworICAgICAgICBlbmdsaXNoID0gKCBzdHJjbXAoIGxhbmcsICJlbiIgKSA9PSAwICk7CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBsYW5nICk7CisKKyAgICAvLyBEbyBub3QgdHJ5IHRvIG9wZW4gRW5nbGlzaCBjYXRhbG9nIGJlY2F1c2UgaW50ZXJuYWwgbWVzc2FnZXMgYXJlCisgICAgLy8gZXhhY3QgY29weSBvZiBtZXNzYWdlcyBpbiBFbmdsaXNoIGNhdGFsb2cuCisgICAgaWYgKCBlbmdsaXNoICkgeworCXN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIG1hcmsgY2F0YWxvZyBhcyBhYnNlbnQgc28gaXQgd2lsbCBub3QgYmUgcmUtb3BlbmVkLgorCXJldHVybjsKKyAgICB9CisKKyAgICBjYXQgPSBjYXRvcGVuKCBuYW1lLCAwICk7CisgICAgLy8gVE9ETzogV2h5IGRvIHdlIHBhc3MgMCBpbiBmbGFncz8KKyAgICBzdGF0dXMgPSAoIGNhdCA9PSBLTVBfSTE4Tl9OVUxMQ0FUID8gS01QX0kxOE5fQUJTRU5UIDogS01QX0kxOE5fT1BFTkVEICk7CisKKyAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9BQlNFTlQgKSB7CisgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7IC8vIEFDOiBvbmx5IGlzc3VlIHdhcm5pbmcgaW4gY2FzZSBleHBsaWNpdGx5IGFza2VkIHRvCisgICAgICAgIGludCAgICBlcnJvciAgID0gZXJybm87IC8vIFNhdmUgZXJybm8gaW1tZWRpYXRlbHkuCisJY2hhciAqIG5sc3BhdGggPSBfX2ttcF9lbnZfZ2V0KCAiTkxTUEFUSCIgKTsKKyAgICAgICAgY2hhciAqIGxhbmcgICAgPSBfX2ttcF9lbnZfZ2V0KCAiTEFORyIgKTsKKworCS8vIEluZmluaXRlIHJlY3Vyc2lvbiB3aWxsIG5vdCBvY2N1ciAtLSBzdGF0dXMgaXMgS01QX0kxOE5fQUJTRU5UIG5vdywgc28KKwkvLyBfX2ttcF9pMThuX2NhdGdldHMoKSB3aWxsIG5vdCB0cnkgdG8gb3BlbiBjYXRhbG9nLCBidXQgd2lsbCByZXR1cm4gZGVmYXVsdCBtZXNzYWdlLgorCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwKKwkgICAgS01QX0VSUiggZXJyb3IgKSwKKwkgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJOTFNQQVRIIiwgbmxzcGF0aCApLAorICAgICAgICAgICAgS01QX0hOVCggQ2hlY2tFbnZWYXIsICJMQU5HIiwgbGFuZyApLAorCSAgICBfX2ttcF9tc2dfbnVsbAorCSk7CisJS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbmxzcGF0aCApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggbGFuZyApOworICAgICAgfQorICAgIH0gZWxzZSB7IC8vIHN0YXR1cyA9PSBLTVBfSTE4Tl9PUEVORUQKKworICAgICAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBpbnQgbnVtYmVyICA9IGdldF9udW1iZXIoIGttcF9pMThuX3BycF9WZXJzaW9uICk7CisgICAgICAgIGNoYXIgY29uc3QgKiBleHBlY3RlZCA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIC8vIEV4cGVjdGVkIHZlcnNpb24gb2YgdGhlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBjYXRnZXRzKCBjYXQsIHNlY3Rpb24sIG51bWJlciwgTlVMTCApICk7CisKKyAgICAgICAgICAgIC8vIFN0cmluZyByZXR1cm5lZCBieSBjYXRnZXRzIGlzIGludmFsaWQgYWZ0ZXIgY2xvc2luZyB0aGUgY2F0YWxvZywgc28gY29weSBpdC4KKyAgICAgICAgaWYgKCBzdHJjbXAoIHZlcnNpb24uc3RyLCBleHBlY3RlZCApICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7ICAgICAvLyBDbG9zZSBiYWQgY2F0YWxvZy4KKyAgICAgICAgICAgIHN0YXR1cyA9IEtNUF9JMThOX0FCU0VOVDsgIC8vIEFuZCBtYXJrIGl0IGFzIGFic2VudC4KKyAgICAgICAgICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA+IGttcF93YXJuaW5nc19sb3cpIHsgLy8gQUM6IG9ubHkgaXNzdWUgd2FybmluZyBpbiBjYXNlIGV4cGxpY2l0bHkgYXNrZWQgdG8KKyAgICAgICAgICAgICAgICAvLyBBbmQgbm93IHByaW50IGEgd2FybmluZyB1c2luZyBkZWZhdWx0IG1lc3NhZ2VzLgorICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICAgID0gIk5MU1BBVEgiOworICAgICAgICAgICAgICAgIGNoYXIgY29uc3QgKiBubHNwYXRoID0gX19rbXBfZW52X2dldCggbmFtZSApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIFdyb25nTWVzc2FnZUNhdGFsb2csIG5hbWUsIHZlcnNpb24uc3RyLCBleHBlY3RlZCApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGVja0VudlZhciwgbmFtZSwgbmxzcGF0aCApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggV2lsbFVzZURlZmF1bHRNZXNzYWdlcyApOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBubHNwYXRoICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAgY2F0Y2xvc2UoIGNhdCApOworICAgICAgICBjYXQgPSBLTVBfSTE4Tl9OVUxMQ0FUOworICAgIH07IC8vIGlmCisgICAgc3RhdHVzID0gS01QX0kxOE5fQ0xPU0VEOworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Y2xvc2UKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVEICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPQorICAgICAgICAgICAgICAgICAgICBjYXRnZXRzKAorICAgICAgICAgICAgICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgICAgICAgICAgICAgc2VjdGlvbiwgbnVtYmVyLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc3RyWyBudW1iZXIgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIG1lc3NhZ2UgPT0gTlVMTCApIHsKKyAgICAgICAgbWVzc2FnZSA9IG5vX21lc3NhZ2VfYXZhaWxhYmxlOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gZnVuYyBfX2ttcF9pMThuX2NhdGdldHMKKworCisjZW5kaWYgLy8gS01QX09TX1VOSVgKKworLyoKKyAgICA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyAgICBXaW5kb3dzKiBPUyBwYXJ0LgorICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisjZGVmaW5lIEtNUF9JMThOX09LCisKKyNpbmNsdWRlICJrbXBfZW52aXJvbm1lbnQuaCIKKyNpbmNsdWRlIDx3aW5kb3dzLmg+CisKKyNkZWZpbmUgS01QX0kxOE5fTlVMTENBVCAgTlVMTAorc3RhdGljIEhNT0RVTEUgICAgICAgY2F0ICA9IEtNUF9JMThOX05VTExDQVQ7ICAgIC8vICEhISBTaGFsbCBpdCBiZSB2b2xhdGlsZT8KK3N0YXRpYyBjaGFyIGNvbnN0ICogIG5hbWUgPSAoIEtNUF9WRVJTSU9OX01BSk9SID09IDQgPyAibGliZ3VpZGU0MHVpLmRsbCIgOiAibGlib21wdWkuZGxsIiApOworCitzdGF0aWMga21wX2kxOG5fdGFibGVfdCAgdGFibGUgICAgICAgICAgICAgPSB7IDAsIE5VTEwgfTsKKyAgICAvLyBNZXNzYWdlcyBmb3JtYXR0ZWQgYnkgRm9ybWF0TWVzc2FnZSgpIHNob3VsZCBiZSBmcmVlZCwgYnV0IGNhdGdldHMoKSBpbnRlcmZhY2UgYXNzdW1lcworICAgIC8vIHVzZXIgd2lsbCBub3QgZnJlZSBtZXNzYWdlcy4gU28gd2UgY2FjaGUgYWxsIHRoZSByZXRyaWV2ZWQgbWVzc2FnZXMgaW4gdGhlIHRhYmxlLCB3aGljaAorICAgIC8vIGFyZSBmcmVlZCBhdCBjYXRjbG9zZSgpLgorc3RhdGljIFVJTlQgY29uc3QgICAgICAgIGRlZmF1bHRfY29kZV9wYWdlID0gQ1BfT0VNQ1A7CitzdGF0aWMgVUlOVCAgICAgICAgICAgICAgY29kZV9wYWdlICAgICAgICAgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKworc3RhdGljIGNoYXIgY29uc3QgKiBfX19jYXRnZXRzKCBrbXBfaTE4bl9pZF90ICBpZCApOworc3RhdGljIFVJTlQgICAgICAgICBnZXRfY29kZV9wYWdlKCk7CitzdGF0aWMgdm9pZCAgICAgICAgIGttcF9pMThuX3RhYmxlX2ZyZWUoIGttcF9pMThuX3RhYmxlX3QgKiB0YWJsZSApOworCisKK3N0YXRpYyBVSU5UCitnZXRfY29kZV9wYWdlKAorKSB7CisKKyAgICBVSU5UIGNwID0gZGVmYXVsdF9jb2RlX3BhZ2U7CisgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2dldCggIktNUF9DT0RFUEFHRSIgKTsKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGlmICggX3N0cmljbXAoIHZhbHVlLCAiQU5TSSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9BQ1A7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIk9FTSIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9PRU1DUDsKKyAgICAgICAgfSBlbHNlIGlmICggX3N0cmljbXAoIHZhbHVlLCAiVVRGLTgiICkgPT0gMCB8fCBfc3RyaWNtcCggdmFsdWUsICJVVEY4IiApID09IDAgKSB7CisgICAgICAgICAgICBjcCA9IENQX1VURjg7CisgICAgICAgIH0gZWxzZSBpZiAoIF9zdHJpY21wKCB2YWx1ZSwgIlVURi03IiApID09IDAgfHwgX3N0cmljbXAoIHZhbHVlLCAiVVRGNyIgKSA9PSAwICkgeworICAgICAgICAgICAgY3AgPSBDUF9VVEY3OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gISEhIFRPRE86IElzc3VlIGEgd2FybmluZz8KKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSB2YWx1ZSApOworICAgIHJldHVybiBjcDsKKworfSAvLyBmdW5jIGdldF9jb2RlX3BhZ2UKKworCitzdGF0aWMgdm9pZAora21wX2kxOG5fdGFibGVfZnJlZSgKKyAgICBrbXBfaTE4bl90YWJsZV90ICogdGFibGUKKykgeworICAgIGludCBzOworICAgIGludCBtOworICAgIGZvciAoIHMgPSAwOyBzIDwgdGFibGUtPnNpemU7ICsrIHMgKSB7CisgICAgICAgIGZvciAoIG0gPSAwOyBtIDwgdGFibGUtPnNlY3RbIHMgXS5zaXplOyArKyBtICkgeworICAgICAgICAgICAgLy8gRnJlZSBtZXNzYWdlLgorICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gKTsKKyAgICAgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyWyBtIF0gPSBOVUxMOworICAgICAgICB9OyAvLyBmb3IgbQorICAgICAgICB0YWJsZS0+c2VjdFsgcyBdLnNpemUgPSAwOworICAgICAgICAvLyBGcmVlIHNlY3Rpb24gaXRzZWxmLgorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSAoICh2b2lkICopIHRhYmxlLT5zZWN0WyBzIF0uc3RyICk7CisgICAgICAgIHRhYmxlLT5zZWN0WyBzIF0uc3RyID0gTlVMTDsKKyAgICB9OyAvLyBmb3IgcworICAgIHRhYmxlLT5zaXplID0gMDsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgdGFibGUtPnNlY3QgKTsKKyAgICB0YWJsZS0+c2VjdCA9IE5VTEw7Cit9IC8vIGttcF9pOG5fdGFibGVfZnJlZQorCisKK3ZvaWQKK19fa21wX2kxOG5fZG9fY2F0b3BlbigKKykgeworCisgICAgTENJRCAgICAgICAgICBsb2NhbGVfaWQgPSBHZXRUaHJlYWRMb2NhbGUoKTsKKyAgICBXT1JEIAkgIGxhbmdfaWQgPSBMQU5HSURGUk9NTENJRCggbG9jYWxlX2lkICk7CisgICAgV09SRCAgICAgICAgICBwcmltYXJ5X2xhbmdfaWQgPSBQUklNQVJZTEFOR0lEKCBsYW5nX2lkICk7CisgICAga21wX3N0cl9idWZfdCBwYXRoOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhdHVzID09IEtNUF9JMThOX0NMT1NFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGNhdCAgICA9PSBLTVBfSTE4Tl9OVUxMQ0FUICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgcGF0aCApOworCisgICAgLy8gRG8gbm90IHRyeSB0byBvcGVuIEVuZ2xpc2ggY2F0YWxvZyBiZWNhdXNlIGludGVybmFsIG1lc3NhZ2VzIGFyZQorICAgIC8vIGV4YWN0IGNvcHkgb2YgbWVzc2FnZXMgaW4gRW5nbGlzaCBjYXRhbG9nLgorICAgIGlmICggcHJpbWFyeV9sYW5nX2lkID09IExBTkdfRU5HTElTSCApIHsKKwlzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBtYXJrIGNhdGFsb2cgYXMgYWJzZW50IHNvIGl0IHdpbGwgbm90IGJlIHJlLW9wZW5lZC4KKwlnb3RvIGVuZDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gQ29uc3RydWN0IHJlc291cmNlIERMTCBuYW1lLgorICAgIC8qCisgICAgICAgIFNpbXBsZQorICAgICAgICAgICAgTG9hZExpYnJhcnkoIG5hbWUgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbWVzc2FnZSBjYXRhbG9nLgorICAgICovCisgICAgeworCisgICAgICAgIC8vIEdldCBoYW5kbGUgb2Ygb3VyIERMTCBmaXJzdC4KKyAgICAgICAgSE1PRFVMRSBoYW5kbGU7CisgICAgICAgIEJPT0wgYnJjID0KKyAgICAgICAgICAgIEdldE1vZHVsZUhhbmRsZUV4KAorICAgICAgICAgICAgICAgIEdFVF9NT0RVTEVfSEFORExFX0VYX0ZMQUdfRlJPTV9BRERSRVNTIHwgR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19VTkNIQU5HRURfUkVGQ09VTlQsCisgICAgICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgTFBDU1RSID4oICYgX19rbXBfaTE4bl9kb19jYXRvcGVuICksCisgICAgICAgICAgICAgICAgJiBoYW5kbGUKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggISBicmMgKSB7ICAgIC8vIEVycm9yIG9jY3VycmVkLgorICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOyAgLy8gbWFyayBjYXRhbG9nIGFzIGFic2VudCBzbyBpdCB3aWxsIG5vdCBiZSByZS1vcGVuZWQuCisgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgIC8vIFRPRE86IEVuYWJsZSBtdWx0aXBsZSBtZXNzYWdlcyAoS01QX01TRykgdG8gYmUgcGFzc2VkIHRvIF9fa21wX21zZzsgYW5kIHByaW50CisgICAgICAgICAgICAvLyBhIHByb3BlciB3YXJuaW5nLgorICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIE5vdyBnZXQgcGF0aCB0byB0aGUgb3VyIERMTC4KKyAgICAgICAgZm9yICggOyA7ICkgeworICAgICAgICAgICAgRFdPUkQgZHJjID0gR2V0TW9kdWxlRmlsZU5hbWUoIGhhbmRsZSwgcGF0aC5zdHIsIHBhdGguc2l6ZSApOworICAgICAgICAgICAgaWYgKCBkcmMgPT0gMCApIHsgICAgLy8gRXJyb3Igb2NjdXJyZWQuCisgICAgICAgICAgICAgICAgc3RhdHVzID0gS01QX0kxOE5fQUJTRU5UOworICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggZHJjIDwgcGF0aC5zaXplICkgeworICAgICAgICAgICAgICAgIHBhdGgudXNlZCA9IGRyYzsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoICYgcGF0aCwgcGF0aC5zaXplICogMiApOworICAgICAgICB9OyAvLyBmb3JldmVyCisKKyAgICAgICAgLy8gTm93IGNvbnN0cnVjdCB0aGUgbmFtZSBvZiBtZXNzYWdlIGNhdGFsb2cuCisgICAgICAgIGttcF9zdHJfZm5hbWUgZm5hbWU7CisgICAgICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGZuYW1lLCBwYXRoLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHBhdGggKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBwYXRoLCAiJXMlbHUvJXMiLCBmbmFtZS5kaXIsICh1bnNpZ25lZCBsb25nKSggbG9jYWxlX2lkICksIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworICAgIH0KKworICAgIC8vIEZvciBzZWN1cml0eSByZWFzb25zLCB1c2UgTG9hZExpYnJhcnlFeCgpIGFuZCBsb2FkIG1lc3NhZ2UgY2F0YWxvZyBhcyBhIGRhdGEgZmlsZS4KKyAgICBjYXQgPSBMb2FkTGlicmFyeUV4KCBwYXRoLnN0ciwgTlVMTCwgTE9BRF9MSUJSQVJZX0FTX0RBVEFGSUxFICk7CisgICAgc3RhdHVzID0gKCBjYXQgPT0gS01QX0kxOE5fTlVMTENBVCA/IEtNUF9JMThOX0FCU0VOVCA6IEtNUF9JMThOX09QRU5FRCApOworCisgICAgaWYgKCBzdGF0dXMgPT0gS01QX0kxOE5fQUJTRU5UICkgeworICAgICAgaWYgKF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID4ga21wX3dhcm5pbmdzX2xvdykgeyAvLyBBQzogb25seSBpc3N1ZSB3YXJuaW5nIGluIGNhc2UgZXhwbGljaXRseSBhc2tlZCB0bworCURXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisJLy8gSW5maW5pdGUgcmVjdXJzaW9uIHdpbGwgbm90IG9jY3VyIC0tIHN0YXR1cyBpcyBLTVBfSTE4Tl9BQlNFTlQgbm93LCBzbworCS8vIF9fa21wX2kxOG5fY2F0Z2V0cygpIHdpbGwgbm90IHRyeSB0byBvcGVuIGNhdGFsb2cgYnV0IHdpbGwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgLyoKKyAgICAgICAgIElmIG1lc3NhZ2UgY2F0YWxvZyBmb3IgYW5vdGhlciBhcmNoaXRlY3R1cmUgZm91bmQgKGUuZy4gT3Blbk1QIFJUTAorCSBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIG9wZW5zIGxpYm9tcHVpLmRsbCBmb3IgSW50ZWwoUikgNjQpCisJIFdpbmRvd3MqIE9TIHJldHVybnMgZXJyb3IgMTkzIChFUlJPUl9CQURfRVhFX0ZPUk1BVCkuIEhvd2V2ZXIsCisgICAgICAgICBGb3JtYXRNZXNzYWdlIGZhaWxzIHRvIHJldHVybiBhIG1lc3NhZ2UgZm9yIHRoaXMgZXJyb3IsIHNvIHVzZXIKKwkgd2lsbCBzZWU6CisKKyAgICAgICAgIE9NUDogV2FybmluZyAjMjogQ2Fubm90IG9wZW4gbWVzc2FnZSBjYXRhbG9nICIxMDQxXGxpYm9tcHVpLmRsbCI6CisgICAgICAgICBPTVA6IFN5c3RlbSBlcnJvciAjMTkzOiAoTm8gc3lzdGVtIGVycm9yIG1lc3NhZ2UgYXZhaWxhYmxlKQorICAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4KKworICAgICAgICAgSXNzdWUgYSBoaW50IGluIHRoaXMgY2FzZSB0byBsZXQgY2F1c2Ugb2YgdHJvdWJsZSBtb3JlIHVuZGVyc3RhbmRhYmxlLgorICAgICAgICAqLworCV9fa21wX21zZygKKwkgICAga21wX21zX3dhcm5pbmcsCisJICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIHBhdGguc3RyICksCisJICAgIEtNUF9TWVNFUlJDT0RFKCBlcnJvciApLAorICAgICAgICAgICAgKCBlcnJvciA9PSBFUlJPUl9CQURfRVhFX0ZPUk1BVCA/IEtNUF9ITlQoIEJhZEV4ZUZvcm1hdCwgcGF0aC5zdHIsIEtNUF9BUkNIX1NUUiApIDogX19rbXBfbXNnX251bGwgKSwKKwkgICAgX19rbXBfbXNnX251bGwKKwkpOworCUtNUF9JTkZPUk0oIFdpbGxVc2VEZWZhdWx0TWVzc2FnZXMgKTsKKyAgICAgIH0KKyAgICB9IGVsc2UgeyAvLyBzdGF0dXMgPT0gS01QX0kxOE5fT1BFTkVECisKKyAgICAgICAgaW50IHNlY3Rpb24gPSBnZXRfc2VjdGlvbigga21wX2kxOG5fcHJwX1ZlcnNpb24gKTsKKyAgICAgICAgaW50IG51bWJlciAgPSBnZXRfbnVtYmVyKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApOworICAgICAgICBjaGFyIGNvbnN0ICogZXhwZWN0ZWQgPSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF07CisgICAgICAgIGttcF9zdHJfYnVmX3QgdmVyc2lvbjsgICAvLyBBY3R1YWwgdmVyc2lvbiBvZiB0aGUgY2F0YWxvZy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIHZlcnNpb24gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiB2ZXJzaW9uLCAiJXMiLCBfX19jYXRnZXRzKCBrbXBfaTE4bl9wcnBfVmVyc2lvbiApICk7CisgICAgICAgICAgICAvLyBTdHJpbmcgcmV0dXJuZWQgYnkgY2F0Z2V0cyBpcyBpbnZhbGlkIGFmdGVyIGNsb3NpbmcgdGhlIGNhdGFsb2csIHNvIGNvcHkgaXQuCisgICAgICAgIGlmICggc3RyY21wKCB2ZXJzaW9uLnN0ciwgZXhwZWN0ZWQgKSAhPSAwICkgeworICAgICAgICAgICAgLy8gQ2xvc2UgYmFkIGNhdGFsb2cuCisgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGNsb3NlKCk7CisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfSTE4Tl9BQlNFTlQ7ICAvLyBBbmQgbWFyayBpdCBhcyBhYnNlbnQuCisgICAgICAgICAgICBpZiAoX19rbXBfZ2VuZXJhdGVfd2FybmluZ3MgPiBrbXBfd2FybmluZ3NfbG93KSB7CisgICAgICAgICAgICAgICAgLy8gQW5kIG5vdyBwcmludCBhIHdhcm5pbmcgdXNpbmcgZGVmYXVsdCBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc193YXJuaW5nLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBXcm9uZ01lc3NhZ2VDYXRhbG9nLCBwYXRoLnN0ciwgdmVyc2lvbi5zdHIsIGV4cGVjdGVkICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgICAgICB9IC8vIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiB2ZXJzaW9uICk7CisKKyAgICB9OyAvLyBpZgorICAgIGNvZGVfcGFnZSA9IGdldF9jb2RlX3BhZ2UoKTsKKworICAgIGVuZDoKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHBhdGggKTsKKyAgICAgICAgcmV0dXJuOworCit9IC8vIGZ1bmMgX19rbXBfaTE4bl9kb19jYXRvcGVuCisKKwordm9pZAorX19rbXBfaTE4bl9jYXRjbG9zZSgKKykgeworICAgIGlmICggc3RhdHVzID09IEtNUF9JMThOX09QRU5FRCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICAgICAga21wX2kxOG5fdGFibGVfZnJlZSggJiB0YWJsZSApOworICAgICAgICBGcmVlTGlicmFyeSggY2F0ICk7CisgICAgICAgIGNhdCA9IEtNUF9JMThOX05VTExDQVQ7CisgICAgfTsgLy8gaWYKKyAgICBjb2RlX3BhZ2UgPSBkZWZhdWx0X2NvZGVfcGFnZTsKKyAgICBzdGF0dXMgPSBLTVBfSTE4Tl9DTE9TRUQ7Cit9IC8vIGZ1bmMgX19rbXBfaTE4bl9jYXRjbG9zZQorCisvKgorICAgIFdlIHVzZSBGb3JtYXRNZXNzYWdlKCkgdG8gZ2V0IHN0cmluZ3MgZnJvbSBjYXRhbG9nLCBnZXQgc3lzdGVtIGVycm9yIG1lc3NhZ2VzLCBldGMuCisgICAgRm9ybWF0TWVzc2FnZSgpIHRlbmRzIHRvIHJldHVybiBXaW5kb3dzKiBPUy1zdHlsZSBlbmQtb2YtbGluZXMsICJcclxuIi4gV2hlbiBzdHJpbmcgaXMgcHJpbnRlZCwKKyAgICBwcmludGYoKSBhbHNvIHJlcGxhY2VzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxuIiB3aXRoICJcclxuIiAoYWdhaW4hKSwgc28gc2VxdWVuY2VzIGxpa2UKKyAgICAiXHJcclxyXG4iIGFwcGVhciBpbiBvdXRwdXQuIEl0IGlzIG5vdCB0b28gZ29vZC4KKworICAgIEFkZGl0aW9uYWwgbWVzcyBjb21lcyBmcm9tIG1lc3NhZ2UgY2F0YWxvZzogT3VyIGNhdGFsb2cgc291cmNlIGVuX1VTLm1jIGZpbGUgKGdlbmVyYXRlZCBieQorICAgIG1lc3NhZ2UtY29udmVydGVyLnBsKSBjb250YWlucyBvbmx5ICJcbiIgY2hhcmFjdGVycywgYnV0IGVuX1VTX21zZ18xMDMzLmJpbiBmaWxlIChwcm9kdWNlZCBieQorICAgIG1jLmV4ZSkgbWF5IGNvbnRhaW4gIlxyXG4iIG9yIGp1c3QgIlxuIi4gVGhpcyBtZXNzIGdvZXMgZnJvbSBlbl9VU19tc2dfMTAzMy5iaW4gZmlsZSB0bworICAgIG1lc3NhZ2UgY2F0YWxvZywgbGlib21wdWkuZGxsLiBGb3IgZXhhbXBsZSwgbWVzc2FnZQorCisgICAgICAgIEVycm9yCisKKyAgICAodGhlcmUgaXMgIlxuIiBhdCB0aGUgZW5kKSBpcyBjb21waWxlZCBieSBtYy5leGUgdG8gIkVycm9yXHJcbiIsIHdoaWxlCisKKyAgICAgICAgT01QOiBFcnJvciAlMSFkITogJTIhcyFcbgorCisgICAgKHRoZXJlIGlzICJcbiIgYXQgdGhlIGVuZCBhcyB3ZWxsKSBpcyBjb21waWxlZCB0byAiT01QOiBFcnJvciAlMSFkITogJTIhcyFcclxuXG4iLgorCisgICAgVGh1cywgc3RyaXBwaW5nIGFsbCAiXHIiIG5vcm1hbGl6ZXMgc3RyaW5nIGFuZCByZXR1cm5zIGl0IHRvIGNhbm9uaWNhbCBmb3JtLCBzbyBwcmludGYoKSB3aWxsCisgICAgcHJvZHVjZSBjb3JyZWN0IGVuZC1vZi1saW5lIHNlcXVlbmNlcy4KKworICAgIF9fX3N0cmlwX2NycygpIHNlcnZlcyBmb3IgdGhpcyBwdXJwb3NlOiBpdCByZW1vdmVzIGFsbCB0aGUgb2NjdXJyZW5jZXMgb2YgIlxyIiBpbi1wbGFjZSBhbmQKKyAgICByZXR1cm5zIG5ldyBsZW5ndGggb2Ygc3RyaW5nLgorKi8KK3N0YXRpYworaW50CitfX19zdHJpcF9jcnMoCisgICAgY2hhciAqIHN0cgorKSB7CisgICAgaW50IGluICA9IDA7ICAvLyBJbnB1dCBjaGFyYWN0ZXIgaW5kZXguCisgICAgaW50IG91dCA9IDA7ICAvLyBPdXRwdXQgY2hhcmFjdGVyIGluZGV4LgorICAgIGZvciAoIDsgOyApIHsKKyAgICAgICAgaWYgKCBzdHJbIGluIF0gIT0gJ1xyJyApIHsKKyAgICAgICAgICAgIHN0clsgb3V0IF0gPSBzdHJbIGluIF07CisgICAgICAgICAgICArKyBvdXQ7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggc3RyWyBpbiBdID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgKysgaW47CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHJldHVybiBvdXQgLSAxOworfSAvLyBmdW5jIF9fc3RyaXBfY3JzCisKKworc3RhdGljCitjaGFyIGNvbnN0ICoKK19fX2NhdGdldHMoCisgICAga21wX2kxOG5faWRfdCAgaWQKKykgeworCisgICAgY2hhciAqICAgIHJlc3VsdCA9IE5VTEw7CisgICAgUFZPSUQgICAgIGFkZHIgICA9IE5VTEw7CisgICAgd2NoYXJfdCAqIHdtc2cgICA9IE5VTEw7CisgICAgRFdPUkQgICAgIHdsZW4gICA9IDA7CisgICAgY2hhciAqICAgIG1zZyAgICA9IE5VTEw7CisgICAgaW50ICAgICAgIGxlbiAgICA9IDA7CisgICAgaW50ICAgICAgIHJjOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggY2F0ICE9IEtNUF9JMThOX05VTExDQVQgKTsKKyAgICB3bGVuID0gICAgLy8gd2xlbiBkb2VzICpub3QqIGluY2x1ZGUgdGVybWluYXRpbmcgbnVsbC4KKyAgICAgICAgRm9ybWF0TWVzc2FnZVcoCisgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9BTExPQ0FURV9CVUZGRVIgfCBGT1JNQVRfTUVTU0FHRV9GUk9NX0hNT0RVTEUgfAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0lHTk9SRV9JTlNFUlRTLAorICAgICAgICAgICAgY2F0LAorICAgICAgICAgICAgaWQsCisgICAgICAgICAgICAwLCAgICAgICAgICAgICAvLyBMYW5nSWQKKyAgICAgICAgICAgIChMUFdTVFIpICYgYWRkciwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgIC8vIFNpemUgaW4gZWxlbWVudHMsIG5vdCBpbiBieXRlcy4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgKTsKKyAgICBpZiAoIHdsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICB3bXNnID0gKHdjaGFyX3QgKikgYWRkcjsgIC8vIFdhcm5pbmc6IHdtc2cgbWF5IGJlIG5vdCBudWwtdGVybWluYXRlZCEKKworICAgIC8vIENhbGN1bGF0ZSBsZW5ndGggb2YgbXVsdGlieXRlIG1lc3NhZ2UuCisgICAgbGVuID0gICAgIC8vIFNpbmNlIHdsZW4gZG9lcyBub3QgaW5jbHVkZSB0ZXJtaW5hdGluZyBudWxsLCBsZW4gZG9lcyBub3QgaW5jbHVkZSBpdCBhbHNvLgorICAgICAgICBXaWRlQ2hhclRvTXVsdGlCeXRlKAorICAgICAgICAgICAgY29kZV9wYWdlLAorICAgICAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gRmxhZ3MuCisgICAgICAgICAgICB3bXNnLCB3bGVuLCAgICAgICAvLyBXaWRlIGJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIDAsICAgICAgICAgIC8vIEJ1ZmZlciBhbmQgc2l6ZS4KKyAgICAgICAgICAgIE5VTEwsIE5VTEwgICAgICAgIC8vIERlZmF1bHQgY2hhciBhbmQgdXNlZCBkZWZhdWx0IGNoYXIuCisgICAgICAgICk7CisgICAgaWYgKCBsZW4gPD0gMCApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKworICAgIC8vIEFsbG9jYXRlIG1lbW9yeS4KKyAgICBtc2cgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBsZW4gKyAxICk7CisKKyAgICAvLyBDb252ZXJ0IHdpZGUgbWVzc2FnZSB0byBtdWx0aWJ5dGUgb25lLgorICAgIHJjID0KKyAgICAgICAgV2lkZUNoYXJUb011bHRpQnl0ZSgKKyAgICAgICAgICAgIGNvZGVfcGFnZSwKKyAgICAgICAgICAgIDAsICAgICAgICAgICAgICAgIC8vIEZsYWdzLgorICAgICAgICAgICAgd21zZywgd2xlbiwgICAgICAgLy8gV2lkZSBidWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBtc2csIGxlbiwgICAgICAgICAvLyBCdWZmZXIgYW5kIHNpemUuCisgICAgICAgICAgICBOVUxMLCBOVUxMICAgICAgICAvLyBEZWZhdWx0IGNoYXIgYW5kIHVzZWQgZGVmYXVsdCBjaGFyLgorICAgICAgICApOworICAgIGlmICggcmMgPD0gMCB8fCByYyA+IGxlbiApIHsKKyAgICAgICAgZ290byBlbmQ7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCByYyA9PSBsZW4gKTsKKyAgICBsZW4gPSByYzsKKyAgICBtc2dbIGxlbiBdID0gMDsgICAgICAgICAgIC8vIFB1dCB0ZXJtaW5hdGluZyBudWxsIHRvIHRoZSBlbmQuCisKKyAgICAvLyBTdHJpcHBpbmcgYWxsICJcciIgYmVmb3JlIHN0cmlwcGluZyBsYXN0IGVuZC1vZi1saW5lIHNpbXBsaWZpZXMgdGhlIHRhc2suCisgICAgbGVuID0gX19fc3RyaXBfY3JzKCBtc2cgKTsKKworICAgIC8vIEV2ZXJ5IG1lc3NhZ2UgaW4gY2F0YWxvZyBpcyB0ZXJtaW5hdGVkIHdpdGggIlxuIi4gU3RyaXAgaXQuCisgICAgaWYgKCBsZW4gPj0gMSAmJiBtc2dbIGxlbiAtIDEgXSA9PSAnXG4nICkgeworICAgICAgICAtLSBsZW47CisgICAgICAgIG1zZ1sgbGVuIF0gPSAwOworICAgIH07IC8vIGlmCisKKyAgICAvLyBFdmVyeXRoaW5nIGxvb2tzIG9rLgorICAgIHJlc3VsdCA9IG1zZzsKKyAgICBtc2cgICAgPSBOVUxMOworCisgICAgZW5kOgorCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG1zZyApOworICAgIH07IC8vIGlmCisgICAgaWYgKCB3bXNnICE9IE5VTEwgKSB7CisgICAgICAgIExvY2FsRnJlZSggd21zZyApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gcmVzdWx0OworCit9IC8vIF9fX2NhdGdldHMKKworCitjaGFyIGNvbnN0ICoKK19fa21wX2kxOG5fY2F0Z2V0cygKKyAgICBrbXBfaTE4bl9pZF90ICBpZAorKSB7CisKKyAgICBpbnQgc2VjdGlvbiA9IGdldF9zZWN0aW9uKCBpZCApOworICAgIGludCBudW1iZXIgID0gZ2V0X251bWJlciggaWQgKTsKKyAgICBjaGFyIGNvbnN0ICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICBpZiAoIDEgPD0gc2VjdGlvbiAmJiBzZWN0aW9uIDw9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zaXplICkgeworICAgICAgICBpZiAoIDEgPD0gbnVtYmVyICYmIG51bWJlciA8PSBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2VjdFsgc2VjdGlvbiBdLnNpemUgKSB7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBLTVBfSTE4Tl9DTE9TRUQgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9jYXRvcGVuKCk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjYXQgIT0gS01QX0kxOE5fTlVMTENBVCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNpemUgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdCA9IChrbXBfaTE4bl9zZWN0aW9uX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCBfX2ttcF9pMThuX2RlZmF1bHRfdGFibGUuc2l6ZSArIDIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGttcF9pMThuX3NlY3Rpb25fdCApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zaXplID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNpemU7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBpZiAoIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHIgPSAoY29uc3QgY2hhciAqKikKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9DQUxMT0MoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zaXplICsgMiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2YoIGNoYXIgY29uc3QgKiApCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB0YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZSA9IF9fa21wX2kxOG5fZGVmYXVsdF90YWJsZS5zZWN0WyBzZWN0aW9uIF0uc2l6ZTsKKyAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIGlmICggdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGFibGUuc2VjdFsgc2VjdGlvbiBdLnN0clsgbnVtYmVyIF0gPSBfX19jYXRnZXRzKCBpZCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgbWVzc2FnZSA9IHRhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIENhdGFsb2cgaXMgbm90IG9wZW5lZCBvciBtZXNzYWdlIGlzIG5vdCBmb3VuZCwgcmV0dXJuIGRlZmF1bHQgbWVzc2FnZS4KKyAgICAgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlLnNlY3RbIHNlY3Rpb24gXS5zdHJbIG51bWJlciBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorICAgIGlmICggbWVzc2FnZSA9PSBOVUxMICkgeworICAgICAgICBtZXNzYWdlID0gbm9fbWVzc2FnZV9hdmFpbGFibGU7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gbWVzc2FnZTsKKworfSAvLyBmdW5jIF9fa21wX2kxOG5fY2F0Z2V0cworCisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZm5kZWYgS01QX0kxOE5fT0sKKyAgICAjZXJyb3IgSTE4biBzdXBwb3J0IGlzIG5vdCBpbXBsZW1lbnRlZCBmb3IgdGhpcyBPUy4KKyNlbmRpZiAvLyBLTVBfSTE4Tl9PSworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2kxOG5fZHVtcF9jYXRhbG9nKAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworCisgICAgc3RydWN0IGttcF9pMThuX2lkX3JhbmdlX3QgeworICAgICAgICBrbXBfaTE4bl9pZF90ICBmaXJzdDsKKyAgICAgICAga21wX2kxOG5faWRfdCAgbGFzdDsKKyAgICB9OyAvLyBzdHJ1Y3Qga21wX2kxOG5faWRfcmFuZ2VfdAorCisgICAgc3RhdGljIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90IHJhbmdlc1tdID0geworICAgICAgICB7IGttcF9pMThuX3BycF9maXJzdCwga21wX2kxOG5fcHJwX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9zdHJfZmlyc3QsIGttcF9pMThuX3N0cl9sYXN0IH0sCisgICAgICAgIHsga21wX2kxOG5fZm10X2ZpcnN0LCBrbXBfaTE4bl9mbXRfbGFzdCB9LAorICAgICAgICB7IGttcF9pMThuX21zZ19maXJzdCwga21wX2kxOG5fbXNnX2xhc3QgfSwKKyAgICAgICAgeyBrbXBfaTE4bl9obnRfZmlyc3QsIGttcF9pMThuX2hudF9sYXN0IH0KKyAgICB9OyAvLyByYW5nZXMKKworICAgIGludCAgICAgICAgICAgbnVtX29mX3JhbmdlcyA9IHNpemVvZiggcmFuZ2VzICkgLyBzaXplb2YoIHN0cnVjdCBrbXBfaTE4bl9pZF9yYW5nZV90ICk7CisgICAgaW50ICAgICAgICAgICByYW5nZTsKKyAgICBrbXBfaTE4bl9pZF90IGlkOworCisgICAgZm9yICggcmFuZ2UgPSAwOyByYW5nZSA8IG51bV9vZl9yYW5nZXM7ICsrIHJhbmdlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIqKiogU2V0ICMlZCAqKipcbiIsIHJhbmdlICsgMSApOworICAgICAgICBmb3IgKCBpZCA9IChrbXBfaTE4bl9pZF90KSggcmFuZ2VzWyByYW5nZSBdLmZpcnN0ICsgMSApOworICAgICAgICAgICAgICBpZCA8IHJhbmdlc1sgcmFuZ2UgXS5sYXN0OworICAgICAgICAgICAgICBpZCA9IChrbXBfaTE4bl9pZF90KSggaWQgKyAxICkgKSB7CisgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQ6IDw8JXM+PlxuIiwgaWQsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSApOworICAgICAgICB9OyAvLyBmb3IgaWQKKyAgICB9OyAvLyBmb3IgcmFuZ2UKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLT5zdHIgKTsKKworfSAvLyBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK2ttcF9tc2dfdAorX19rbXBfbXNnX2Zvcm1hdCgKKyAgICBrbXBfaTE4bl9pZF90IGlkLAorICAgIC4uLgorKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgdmFfbGlzdCAgICAgICAgYXJnczsKKyAgICBrbXBfc3RyX2J1Zl90ICBidWZmZXI7CisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgdmFfc3RhcnQoIGFyZ3MsIGlkICk7CisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8vIE9uIExpbnV4KiBPUyBhbmQgT1MgWCosIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgcHJvY2VzcyBwYXJhbWV0ZXIgbnVtYmVycywgZm9yIGV4YW1wbGU6CisgICAgICAgIC8vICIlMiRzICUxJHMiLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ZwcmludCggJiBidWZmZXIsIF9fa21wX2kxOG5fY2F0Z2V0cyggaWQgKSwgYXJncyApOworICAgICNlbGlmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8vIE9uIFdpbm9kd3MsIHByaW50ZigpIGZhbWlseSBmdW5jdGlvbnMgZG9lcyBub3QgcmVjb2duaXplIEdOVSBzdHlsZSBwYXJhbWV0ZXIgbnVtYmVycywKKyAgICAgICAgLy8gc28gd2UgaGF2ZSB0byB1c2UgRm9ybWF0TWVzc2FnZSgpIGluc3RlYWQuIEl0IHJlY29nbml6ZXMgcGFyYW1ldGVyIG51bWJlcnMsIGUuIGcuOgorICAgICAgICAvLyAiJTIhcyEgIiUxIXMhIi4KKyAgICAgICAgeworICAgICAgICAgICAgTFBUU1RSIHN0ciA9IE5VTEw7CisgICAgICAgICAgICBpbnQgICAgbGVuOworICAgICAgICAgICAgRm9ybWF0TWVzc2FnZSgKKyAgICAgICAgICAgICAgICBGT1JNQVRfTUVTU0FHRV9GUk9NX1NUUklORyB8IEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiwKKyAgICAgICAgICAgICAgICBfX2ttcF9pMThuX2NhdGdldHMoIGlkICksCisgICAgICAgICAgICAgICAgMCwgMCwKKyAgICAgICAgICAgICAgICAoTFBUU1RSKSggJiBzdHIgKSwKKyAgICAgICAgICAgICAgICAwLAorICAgICAgICAgICAgICAgICYgYXJncworICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIGxlbiA9IF9fX3N0cmlwX2Nycyggc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBidWZmZXIsIHN0ciwgbGVuICk7CisgICAgICAgICAgICBMb2NhbEZyZWUoIHN0ciApOworICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgI2Vycm9yCisgICAgI2VuZGlmCisgICAgdmFfZW5kKCBhcmdzICk7CisgICAgX19rbXBfc3RyX2J1Zl9kZXRhY2goICYgYnVmZmVyICk7CisKKyAgICBtc2cudHlwZSA9IChrbXBfbXNnX3R5cGVfdCkoIGlkID4+IDE2ICk7CisgICAgbXNnLm51bSAgPSBpZCAmIDB4RkZGRjsKKyAgICBtc2cuc3RyICA9IGJ1ZmZlci5zdHI7CisgICAgbXNnLmxlbiAgPSBidWZmZXIudXNlZDsKKworICAgIHJldHVybiBtc2c7CisKK30gLy8gX19rbXBfbXNnX2Zvcm1hdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYworY2hhciAqCitzeXNfZXJyb3IoCisgICAgaW50IGVycgorKSB7CisKKyAgICBjaGFyICogbWVzc2FnZSA9IE5VTEw7CisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKworICAgICAgICBMUFZPSUQgIGJ1ZmZlciA9IE5VTEw7CisgICAgICAgIGludCAgICAgbGVuOworICAgICAgICBEV09SRCAgIHJjOworICAgICAgICByYyA9CisgICAgICAgICAgICBGb3JtYXRNZXNzYWdlKAorICAgICAgICAgICAgICAgIEZPUk1BVF9NRVNTQUdFX0FMTE9DQVRFX0JVRkZFUiB8IEZPUk1BVF9NRVNTQUdFX0ZST01fU1lTVEVNLAorICAgICAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAgICAgZXJyLAorICAgICAgICAgICAgICAgIE1BS0VMQU5HSUQoIExBTkdfTkVVVFJBTCwgU1VCTEFOR19ERUZBVUxUICksIC8vIERlZmF1bHQgbGFuZ3VhZ2UuCisgICAgICAgICAgICAgICAgKExQVFNUUikgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgMCwKKyAgICAgICAgICAgICAgICBOVUxMCisgICAgICAgICAgICApOworICAgICAgICBpZiAoIHJjID4gMCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgZm9ybWF0dGVkLiBDb3B5IGl0IChzbyB3ZSBjYW4gZnJlZSBpdCBsYXRlciB3aXRoIG5vcm1hbCBmcmVlKCkuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgKGNoYXIgKikgYnVmZmVyICk7CisgICAgICAgICAgICBsZW4gPSBfX19zdHJpcF9jcnMoIG1lc3NhZ2UgKTsgLy8gRGVsZXRlIGNhcnJpYWdlIHJldHVybnMgaWYgYW55LgorICAgICAgICAgICAgLy8gU3RyaXAgdHJhaWxpbmcgbmV3bGluZXMuCisgICAgICAgICAgICB3aGlsZSAoIGxlbiA+IDAgJiYgbWVzc2FnZVsgbGVuIC0gMSBdID09ICdcbicgKSB7CisgICAgICAgICAgICAgICAgLS0gbGVuOworICAgICAgICAgICAgfTsgLy8gd2hpbGUKKyAgICAgICAgICAgIG1lc3NhZ2VbIGxlbiBdID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIEZvcm1hdE1lc3NhZ2UoKSBmYWlsZWQgdG8gZm9ybWF0IHN5c3RlbSBlcnJvciBtZXNzYWdlLiBHZXRMYXN0RXJyb3IoKSB3b3VsZCBnaXZlIHVzCisgICAgICAgICAgICAvLyBlcnJvciBjb2RlLCB3aGljaCB3ZSB3b3VsZCBjb252ZXJ0IHRvIG1lc3NhZ2UuLi4gdGhpcyBpdCBkYW5nZXJvdXMgcmVjdXJzaW9uLCB3aGljaAorICAgICAgICAgICAgLy8gY2Fubm90IGNsYXJpZnkgb3JpZ2luYWwgZXJyb3IsIHNvIHdlIHdpbGwgbm90IGV2ZW4gc3RhcnQgaXQuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgIGlmICggYnVmZmVyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBMb2NhbEZyZWUoIGJ1ZmZlciApOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2Vsc2UgLy8gTm9uLVdpbmRvd3MqIE9TOiBMaW51eCogT1Mgb3IgT1MgWCoKKworICAgICAgICAvKgorICAgICAgICAgICAgVGhlcmUgYXJlIDIgaW5jb21wYXRpYmxlIHZlcnNpb25zIG9mIHN0cmVycm9yX3I6CisKKyAgICAgICAgICAgICAgICBjaGFyICogc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gR05VIHZlcnNpb24KKyAgICAgICAgICAgICAgICBpbnQgICAgc3RyZXJyb3JfciggaW50LCBjaGFyICosIHNpemVfdCApOyAgLy8gWFNJIHZlcnNpb24KKyAgICAgICAgKi8KKworICAgICAgICAjaWYgS01QX09TX0xJTlVYCisKKyAgICAgICAgICAgIC8vIEdOVSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGNoYXIgICBidWZmZXJbIDIwNDggXTsKKyAgICAgICAgICAgIGNoYXIgKiBjb25zdCBlcnJfbXNnID0gc3RyZXJyb3JfciggZXJyLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgKTsKKyAgICAgICAgICAgICAgICAvLyBEbyBub3QgZWxpbWluYXRlIHRoaXMgYXNzaWdubWVudCB0byB0ZW1wb3JhcnkgdmFyaWFibGUsIG90aGVyd2lzZSBjb21waWxlciB3b3VsZAorICAgICAgICAgICAgICAgIC8vIG5vdCBpc3N1ZSB3YXJuaW5nIGlmIHN0cmVycm9yX3IoKSByZXR1cm5zIGBpbnQnIGluc3RlYWQgb2YgZXhwZWN0ZWQgYGNoYXIgKicuCisgICAgICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgZXJyX21zZyApOworCisgICAgICAgICNlbHNlIC8vIE9TIFgqLCBGcmVlQlNEKiBldGMuCisKKyAgICAgICAgICAgIC8vIFhTSSB2ZXJzaW9uIG9mIHN0cmVycm9yX3IuCisKKyAgICAgICAgICAgIGludCAgICBzaXplICAgPSAyMDQ4OworICAgICAgICAgICAgLy8gVE9ETzogQWRkIGNoZWNraW5nIHJlc3VsdCBvZiBtYWxsb2MoKS4KKyAgICAgICAgICAgIGNoYXIgKiBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICBpbnQgICAgcmM7CisgICAgICAgICAgICByYyA9IHN0cmVycm9yX3IoIGVyciwgYnVmZmVyLCBzaXplICk7CisgICAgICAgICAgICBpZiAoIHJjID09IC0xICkgeworICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAgICAgLy8gWFNJIHZlcnNpb24gc2V0cyBlcnJuby4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB3aGlsZSAoIHJjID09IEVSQU5HRSApIHsgICAvLyBFUkFOR0UgbWVhbnMgdGhlIGJ1ZmZlciBpcyB0b28gc21hbGwuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgICAgIHNpemUgKj0gMjsKKyAgICAgICAgICAgICAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgICAgICAgICAgICAgcmMgPSBzdHJlcnJvcl9yKCBlcnIsIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICAgICAgICAgIGlmICggcmMgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgICAgIHJjID0gZXJybm87ICAgICAgICAvLyBYU0kgdmVyc2lvbiBzZXRzIGVycm5vLgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgICAgIG1lc3NhZ2UgPSBidWZmZXI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIEJ1ZmZlciBpcyB1bnVzZWQuIEZyZWUgaXQuCisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjZW5kaWYKKworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisgICAgaWYgKCBtZXNzYWdlID09IE5VTEwgKSB7CisgICAgICAgIC8vIFRPRE86IEkxOG4gdGhpcyBtZXNzYWdlLgorICAgICAgICBtZXNzYWdlID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgIihObyBzeXN0ZW0gZXJyb3IgbWVzc2FnZSBhdmFpbGFibGUpIiApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuIG1lc3NhZ2U7CisKK30gLy8gc3lzX2Vycm9yCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfY29kZSgKKyAgICBpbnQgIGNvZGUKKykgeworCisgICAga21wX21zZ190ICAgICAgbXNnOworICAgIG1zZy50eXBlID0ga21wX210X3N5c2VycjsKKyAgICBtc2cubnVtICA9IGNvZGU7CisgICAgbXNnLnN0ciAgPSBzeXNfZXJyb3IoIGNvZGUgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9jb2RlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwora21wX21zZ190CitfX2ttcF9tc2dfZXJyb3JfbWVzZygKKyAgICBjaGFyIGNvbnN0ICogbWVzZworKSB7CisKKyAgICBrbXBfbXNnX3QgICAgICBtc2c7CisgICAgbXNnLnR5cGUgPSBrbXBfbXRfc3lzZXJyOworICAgIG1zZy5udW0gID0gMDsKKyAgICBtc2cuc3RyICA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIG1lc2cgKTsKKyAgICBtc2cubGVuICA9IEtNUF9TVFJMRU4oIG1zZy5zdHIgKTsKKyAgICByZXR1cm4gbXNnOworCit9IC8vIF9fa21wX21zZ19lcnJvcl9tZXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfbXNnKAorICAgIGttcF9tc2dfc2V2ZXJpdHlfdCAgc2V2ZXJpdHksCisgICAga21wX21zZ190ICAgICAgICAgICBtZXNzYWdlLAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0ICAgICAgICBhcmdzOworICAgIGttcF9pMThuX2lkX3QgIGZvcm1hdDsgICAgICAvLyBmb3JtYXQgaWRlbnRpZmllcgorICAgIGttcF9tc2dfdCAgICAgIGZtc2c7ICAgICAgICAvLyBmb3JtYXR0ZWQgbWVzc2FnZQorICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKworICAgIGlmICggc2V2ZXJpdHkgIT0ga21wX21zX2ZhdGFsICYmIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID09IGttcF93YXJuaW5nc19vZmYgKQorICAgICAgICByZXR1cm47IC8vIG5vIHJlYXNvbiB0byBmb3JtIGEgc3RyaW5nIGluIG9yZGVyIHRvIG5vdCBwcmludCBpdAorCisgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworCisgICAgLy8gRm9ybWF0IHRoZSBwcmltYXJ5IG1lc3NhZ2UuCisgICAgc3dpdGNoICggc2V2ZXJpdHkgKSB7CisgICAgICAgIGNhc2Uga21wX21zX2luZm9ybSA6IHsKKyAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9JbmZvOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGttcF9tc193YXJuaW5nIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X1dhcm5pbmc7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2Uga21wX21zX2ZhdGFsIDogeworICAgICAgICAgICAgZm9ybWF0ID0ga21wX2kxOG5fZm10X0ZhdGFsOworICAgICAgICB9IGJyZWFrOworICAgICAgICBkZWZhdWx0IDogeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICB9OworICAgIH07IC8vIHN3aXRjaAorICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBtZXNzYWdlLnN0ciApOworICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIGJ1ZmZlciwgZm1zZy5zdHIsIGZtc2cubGVuICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisKKyAgICAvLyBGb3JtYXQgb3RoZXIgbWVzc2FnZXMuCisgICAgdmFfc3RhcnQoIGFyZ3MsIG1lc3NhZ2UgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIG1lc3NhZ2UgPSB2YV9hcmcoIGFyZ3MsIGttcF9tc2dfdCApOworICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBpZiAoIG1lc3NhZ2UudHlwZSA9PSBrbXBfbXRfZHVtbXkgJiYgbWVzc2FnZS5zdHIgPT0gX19rbXBfbXNnX2VtcHR5LnN0ciApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzd2l0Y2ggKCBtZXNzYWdlLnR5cGUgKSB7CisgICAgICAgICAgICBjYXNlIGttcF9tdF9oaW50IDogeworICAgICAgICAgICAgICAgIGZvcm1hdCA9IGttcF9pMThuX2ZtdF9IaW50OworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX210X3N5c2VyciA6IHsKKyAgICAgICAgICAgICAgICBmb3JtYXQgPSBrbXBfaTE4bl9mbXRfU3lzRXJyOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgICAgIGZtc2cgPSBfX2ttcF9tc2dfZm9ybWF0KCBmb3JtYXQsIG1lc3NhZ2UubnVtLCBtZXNzYWdlLnN0ciApOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgbWVzc2FnZS5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgYnVmZmVyLCBmbXNnLnN0ciwgZm1zZy5sZW4gKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIGZtc2cuc3RyICk7CisgICAgfTsgLy8gZm9yZXZlcgorICAgIHZhX2VuZCggYXJncyApOworCisgICAgLy8gUHJpbnQgZm9ybWF0dGVkIG1lc3NhZ2VzLgorICAgIC8vIFRoaXMgbG9jayBwcmV2ZW50cyBtdWx0aXBsZSBmYXRhbCBlcnJvcnMgb24gdGhlIHNhbWUgcHJvYmxlbS4KKyAgICAvLyBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgICAgLy8gR0VIIC0gVGhpcyBsb2NrIGNhdXNpbmcgdGVzdHMgdG8gaGFuZyBvbiBPUyBYKi4KKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisKKyAgICBpZiAoIHNldmVyaXR5ID09IGttcF9tc19mYXRhbCApIHsKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX3RocmVhZF9zbGVlcCggNTAwICk7ICAgLyogRGVsYXkgdG8gZ2l2ZSBtZXNzYWdlIGEgY2hhbmNlIHRvIGFwcGVhciBiZWZvcmUgcmVhcGluZyAqLworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfYWJvcnRfcHJvY2VzcygpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIGxvY2sgKTsgIC8vIEdFSCAtIHRoaXMgbG9jayBjYXVzaW5nIHRlc3RzIHRvIGhhbmcgb24gT1MgWCouCisKK30gLy8gX19rbXBfbXNnCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaTE4bi5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pMThuLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJlYzUxYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaTE4bi5oCkBAIC0wLDAgKzEsMTkzIEBACisvKgorICoga21wX2kxOG4uaAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9JMThOX0gKKyNkZWZpbmUgS01QX0kxOE5fSAorCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICBleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvKgorICAgIGttcF9pMThuX2lkLmluYyBkZWZpbmVzIGttcF9pMThuX2lkX3QgdHlwZS4gSXQgaXMgYW4gZW51bWVyYXRpb24gd2l0aCBpZGVudGlmaWVycyBvZiBhbGwgdGhlCisgICAgbWVzc2FnZXMgaW4gdGhlIGNhdGFsb2cuIFRoZXJlIGlzIG9uZSBzcGVjaWFsIGlkZW50aWZpZXI6IGttcF9pMThuX251bGwsIHdoaWNoIGRlbm90ZXMgYWJzZW5jZQorICAgIG9mIG1lc3NhZ2UuCisqLworI2luY2x1ZGUgImttcF9pMThuX2lkLmluYyIgLy8gR2VuZXJhdGVkIGZpbGUuIERvIG5vdCBlZGl0IGl0IG1hbnVhbGx5LgorCisvKgorICAgIExvdy1sZXZlbCBmdW5jdGlvbnMgaGFuZGxpbmcgbWVzc2FnZSBjYXRhbG9nLiBfX2ttcF9pMThuX29wZW4oKSBvcGVucyBtZXNzYWdlIGNhdGFsb2csCisgICAgX19rbXBfaTE4bl9jbG9zZXMoKSBpdC4gRXhwbGljaXQgb3BlbmluZyBpcyBub3QgcmVxdWlyZWQ6IGlmIG1lc3NhZ2UgY2F0YWxvZyBpcyBub3QgeWV0IG9wZW4sCisgICAgX19rbXBfaTE4bl9jYXRnZXRzKCkgd2lsbCBvcGVuIGl0IGltcGxpY2l0bHkuIEhvd2V2ZXIsIGNhdGFsb2cgc2hvdWxkIGJlIGV4cGxpY2l0bHkgY2xvc2VkLAorICAgIG90aGVyd2lzZSByZXNvdXJjZXMgKG1hbW9yeSwgaGFuZGxlcykgbWF5IGxlYWsuCisKKyAgICBfX2ttcF9pMThuX2NhdGdldHMoKSByZXR1cm5zIHJlYWQtb25seSBzdHJpbmcuIEl0IHNob3VsZCBub3QgYmUgZnJlZWQuCisKKyAgICBLTVBfSTE4Tl9TVFIgbWFjcm8gc2ltcGxpZmllcyBhY2NlcyB0byBzdHJpbmdzIGluIG1lc3NhZ2UgY2F0YWxvZyBhIGJpdC4gRm9sbG93aW5nIHR3byBsaW5lcyBhcmUKKyAgICBlcXVpdmFsZW50OgorCisgICAgICAgIF9fa21wX2kxOG5fY2F0Z2V0cygga21wX2kxOG5fc3RyX1dhcm5pbmcgKQorICAgICAgICBLTVBfSTE4Tl9TVFIoIFdhcm5pbmcgKQorKi8KKwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0b3BlbigpOwordm9pZCAgICAgICAgICAgIF9fa21wX2kxOG5fY2F0Y2xvc2UoKTsKK2NoYXIgY29uc3QgKiAgICBfX2ttcF9pMThuX2NhdGdldHMoIGttcF9pMThuX2lkX3QgaWQgKTsKKworI2RlZmluZSBLTVBfSTE4Tl9TVFIoIGlkICkgICAgX19rbXBfaTE4bl9jYXRnZXRzKCBrbXBfaTE4bl9zdHJfICMjIGlkICkKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgSGlnaC1sZXZlbCBpbnRlcmZhY2UgZm9yIHByaW50aW5nIHN0cmluZ3MgdGFyZ2V0ZWQgdG8gdGhlIHVzZXIuCisKKyAgICBBbGwgdGhlIHN0cmluZ3MgYXJlIGRpdmlkZWQgaW50byAzIHR5cGVzOgorCisgICAgICAgICogbWVzc2FnZXMsCisgICAgICAgICogaGludHMsCisgICAgICAgICogc3lzdGVtIGVycm9ycy4KKworICAgIFRoZXJlIGFyZSAzIGtpbmQgb2YgbWVzc2FnZSBzZXZlcml0aWVzOgorCisgICAgICAgICogaW5mb3JtYXRpb25hbCBtZXNzYWdlcywKKyAgICAgICAgKiB3YXJuaW5ncyAobm9uLWZhdGFsIGVycm9ycyksCisgICAgICAgICogZmF0YWwgZXJyb3JzLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgT01QOiBXYXJuaW5nICMyOiBDYW5ub3Qgb3BlbiBtZXNzYWdlIGNhdGFsb2cgImxpYmd1aWRlLmNhdCI6ICAgKDEpCisgICAgICAgIE9NUDogU3lzdGVtIGVycm9yICMyOiBObyBzdWNoIGZpbGUgb3IgZGlyZWN0b3J5ICAgICAgICAgICAgICAgICgyKQorICAgICAgICBPTVA6IEhpbnQ6IFBsZWFzZSBjaGVjayBOTFNQQVRIIGVudmlyb25tZW50IHZhcmlhYmxlLiAgICAgICAgICAoMykKKyAgICAgICAgT01QOiBJbmZvICMzOiBEZWZhdWx0IG1lc3NhZ2VzIHdpbGwgYmUgdXNlZC4gICAgICAgICAgICAgICAgICAgKDQpCisKKyAgICB3aGVyZQorCisgICAgICAgICgxKSBpcyBhIG1lc3NhZ2Ugb2Ygd2FybmluZyBzZXZlcml0eSwKKyAgICAgICAgKDIpIGlzIGEgc3lzdGVtIGVycm9yIGNhdXNlZCB0aGUgcHJldmlvdXMgd2FybmluZywKKyAgICAgICAgKDMpIGlzIGEgaGludCBmb3IgdGhlIHVzZXIgaG93IHRvIGZpeCB0aGUgcHJvYmxlbSwKKyAgICAgICAgKDQpIGlzIGEgbWVzc2FnZSBvZiBpbmZvcm1hdGlvbmFsIHNldmVyaXR5LgorCisgICBVc2FnZSBpbiBjb21wbGV4IGNhc2VzIChtZXNzYWdlIGlzIGFjY29tcGFuaWVkIHdpdGggaGludHMgYW5kIHN5c3RlbSBlcnJvcnMpOgorCisgICAgICAgaW50IGVycm9yID0gZXJybm87ICAgLy8gV2UgbmVlZCBzYXZlIGVycm5vIGltbWVkaWF0ZWx5LCBiZWNhdXNlIGl0IG1heSBiZSBjaGFuZ2VkLgorICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAga21wX21zX3dhcm5pbmcsICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFNldmVyaXR5CisgICAgICAgICAgIEtNUF9NU0coIENhbnRPcGVuTWVzc2FnZUNhdGFsb2csIG5hbWUgKSwgICAvLyBQcmltYXJ5IG1lc3NhZ2UKKyAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFN5c3RlbSBlcnJvcgorICAgICAgICAgICBLTVBfSE5UKCBDaGVja05MU1BBVEggKSwgICAgICAgICAgICAgICAgICAgLy8gSGludAorICAgICAgICAgICBfX2ttcF9tc2dfbnVsbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gVmFyaWFkaWMgYXJndW1lbnQgbGlzdCBmaW5pc2hlcgorICAgICAgICk7CisKKyAgICBVc2FnZSBpbiBzaW1wbGUgY2FzZXMgKGp1c3QgYSBtZXNzYWdlLCBubyBzeXN0ZW0gZXJyb3JzIG9yIGhpbnRzKToKKworICAgICAgICBLTVBfSU5GT1JNKCBXaWxsVXNlRGVmYXVsdE1lc3NhZ2VzICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBDYW50T3Blbk1lc3NhZ2VDYXRhbG9nLCBuYW1lICk7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVybGFwICk7CisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCitlbnVtIGttcF9tc2dfdHlwZSB7CisgICAga21wX210X2R1bW15ICA9ICAwLCAvLyBTcGVjaWFsIHR5cGUgZm9yIGludGVybmFsIHB1cnBvc2VzLgorICAgIGttcF9tdF9tZXNnICAgPSAgNCwgLy8gUHJpbWFyeSBPcGVuTVAgbWVzc2FnZSwgY291bGQgYmUgaW5mb3JtYXRpb24sIHdhcm5pbmcsIG9yIGZhdGFsLgorICAgIGttcF9tdF9oaW50ICAgPSAgNSwgLy8gSGludCB0byB0aGUgdXNlci4KKyAgICBrbXBfbXRfc3lzZXJyID0gLTEgIC8vIFN5c3RlbSBlcnJvciBtZXNzYWdlLgorfTsgLy8gZW51bSBrbXBfbXNnX3R5cGUKK3R5cGVkZWYgZW51bSBrbXBfbXNnX3R5cGUgIGttcF9tc2dfdHlwZV90OworCitzdHJ1Y3Qga21wX21zZyB7CisgICAga21wX21zZ190eXBlX3QgIHR5cGU7CisgICAgaW50ICAgICAgICAgICAgIG51bTsKKyAgICBjaGFyIGNvbnN0ICogICAgc3RyOworICAgIGludCAgICAgICAgICAgICBsZW47Cit9OyAvLyBzdHJ1Y3Qga21wX21lc3NhZ2UKK3R5cGVkZWYgc3RydWN0IGttcF9tc2cgIGttcF9tc2dfdDsKKworLy8gVHdvIHNwZWNpYWwgbWVzc2FnZXMuCitleHRlcm4ga21wX21zZ190IF9fa21wX21zZ19lbXB0eTsgIC8vIENhbiBiZSB1c2VkIGluIHBsYWNlIHdoZXJlIG1lc3NhZ2UgaXMgcmVxdWlyZWQgc3ludGFjdGljYWxseS4KK2V4dGVybiBrbXBfbXNnX3QgX19rbXBfbXNnX251bGw7ICAgLy8gRGVub3RlcyB0aGUgZW5kIG9mIHZhcmlhZGljIGxpc3Qgb2YgYXJndW1lbnRzLgorCisvLyBIZWxwZXIgZnVuY3Rpb25zLiBDcmVhdGVzIG1lc3NhZ2VzIGVpdGhlciBmcm9tIG1lc3NhZ2UgY2F0YWxvZyBvciBmcm9tIHN5c3RlbS4gTm90ZTogdGhlc2UKKy8vIGZ1bmN0aW9ucyBhbGxvY2F0ZSBtZW1vcnkuIFlvdSBzaG91bGQgcGFzcyBjcmVhdGVkIG1lc3NhZ2VzIHRvIF9fa21wX21zZygpIGZ1bmN0aW9uLCBpdCB3aWxsCisvLyBwcmludCBtZXNzYWdlcyBhbmQgZGVzdHJveSB0aGVtLgora21wX21zZ190ICBfX2ttcF9tc2dfZm9ybWF0KCBrbXBfaTE4bl9pZF90IGlkLCAuLi4gKTsKK2ttcF9tc2dfdCAgX19rbXBfbXNnX2Vycm9yX2NvZGUoIGludCBjb2RlICk7CitrbXBfbXNnX3QgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBjaGFyIGNvbnN0ICogbWVzZyApOworCisvLyBIZWxwZXIgbWFjcm9zIHRvIG1ha2UgY2FsbHMgc2hvcnRlci4KKyNkZWZpbmUgS01QX01TRyggLi4uICApICAgX19rbXBfbXNnX2Zvcm1hdCgga21wX2kxOG5fbXNnXyAjIyBfX1ZBX0FSR1NfXyApCisjZGVmaW5lIEtNUF9ITlQoIC4uLiAgKSAgIF9fa21wX21zZ19mb3JtYXQoIGttcF9pMThuX2hudF8gIyMgX19WQV9BUkdTX18gKQorI2RlZmluZSBLTVBfU1lTRVJSQ09ERSggY29kZSApICBfX2ttcF9tc2dfZXJyb3JfY29kZSggY29kZSApCisjZGVmaW5lIEtNUF9TWVNFUlJNRVNHKCBtZXNnICkgIF9fa21wX21zZ19lcnJvcl9tZXNnKCBtZXNnICkKKyNkZWZpbmUgS01QX0VSUiBLTVBfU1lTRVJSQ09ERQorCisvLyBNZXNzYWdlIHNldmVyaXR5LgorZW51bSBrbXBfbXNnX3NldmVyaXR5IHsKKyAgICBrbXBfbXNfaW5mb3JtLCAgICAgIC8vIEp1c3QgaW5mb3JtYXRpb24gZm9yIHRoZSB1c2VyLgorICAgIGttcF9tc193YXJuaW5nLCAgICAgLy8gTm9uLWZhdGFsIGVycm9yLCBleGVjdXRpb24gY29udGludWVzLgorICAgIGttcF9tc19mYXRhbCAgICAgICAgLy8gRmF0YWwgZXJyb3IsIHByb2dyYW0gYWJvcnRzLgorfTsgLy8gZW51bSBrbXBfbXNnX3NldmVyaXR5Cit0eXBlZGVmIGVudW0ga21wX21zZ19zZXZlcml0eSAga21wX21zZ19zZXZlcml0eV90OworCisvLyBQcmltYXJ5IGZ1bmN0aW9uIGZvciBwcmludGluZyBtZXNzYWdlcyBmb3IgdGhlIHVzZXIuIFRoZSBmaXJzdCBtZXNzYWdlIGlzIG1hbmRhdG9yeS4gQW55IG51bWJlcgorLy8gb2Ygc3lzdGVtIGVycm9ycyBhbmQgaGludHMgbWF5IGJlIHNwZWNpZmllZC4gQXJndW1lbnQgbGlzdCBtdXN0IGJlIGZpbmlzaGVkIHdpdGggX19rbXBfbXNnX251bGwuCit2b2lkICAgIF9fa21wX21zZygga21wX21zZ19zZXZlcml0eV90IHNldmVyaXR5LCBrbXBfbXNnX3QgbWVzc2FnZSwgLi4uICk7CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gbWFrZSBjYWxscyBzaG9ydGVyIGluIHNpbXBsZSBjYXNlcy4KKyNkZWZpbmUgS01QX0lORk9STSggLi4uICApIF9fa21wX21zZygga21wX21zX2luZm9ybSwgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1dBUk5JTkcoIC4uLiApIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX0ZBVEFMKCAgIC4uLiApIF9fa21wX21zZygga21wX21zX2ZhdGFsLCAgIEtNUF9NU0coIF9fVkFfQVJHU19fICksIF9fa21wX21zZ19udWxsICkKKyNkZWZpbmUgS01QX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2ttcF9tc2coICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAga21wX21zX2ZhdGFsLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX01TRyggRnVuY3Rpb25FcnJvciwgZnVuYyApLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX1NZU0VSUkNPREUoIGVycm9yICksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfbXNnX251bGwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICApCisKKy8vIENoZWNrIGVycm9yLCBpZiBub3QgemVybywgZ2VuZXJhdGUgZmF0YWwgZXJyb3IgbWVzc2FnZS4KKyNkZWZpbmUgS01QX0NIRUNLX1NZU0ZBSUwoIGZ1bmMsIGVycm9yICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBlcnJvciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIEtNUF9TWVNGQUlMKCBmdW5jLCBlcnJvciApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9CisKKy8vIENoZWNrIHN0YXR1cywgaWYgbm90IHplcm8sIGdlbmVyYXRlIGZhdGFsIGVycm9yIG1lc3NhZ2UgdXNpbmcgZXJybm8uCisjZGVmaW5lIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCBmdW5jLCBzdGF0dXMgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfU1lTRkFJTCggZnVuYywgZXJyb3IgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgdm9pZCBfX2ttcF9pMThuX2R1bXBfY2F0YWxvZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciApOworI2VuZGlmIC8vIEtNUF9ERUJVRworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9OyAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9JMThOX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaW1wb3J0LmMgYi9yYzMvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZmJhNDEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2ltcG9ydC5jCkBAIC0wLDAgKzEsNDIgQEAKKy8qCisgKiBrbXBfaW1wb3J0LmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBPYmplY3QgZ2VuZXJhdGVkIGZyb20gdGhpcyBzb3VyY2UgZmlsZSBpcyBsaW5rZWQgdG8gV2luZG93cyogT1MgRExMIGltcG9ydCBsaWJyYXJ5IChsaWJvbXBtZC5saWIpCisgICAgb25seSEgSXQgaXMgbm90IGEgcGFydCBvZiByZWd1bGFyIHN0YXRpYyBvciBkeW5hbWljIE9wZW5NUCBSVEwuIEFueSBjb2RlIHRoYXQganVzdCBuZWVkcyB0byBnbworICAgIGluIHRoZSBsaWJvbXBtZC5saWIgKGJ1dCBub3QgaW4gbGlib21wbXQubGliIGFuZCBsaWJvbXBtZC5kbGwpIHNob3VsZCBiZSBwbGFjZWQgaW4gdGhpcworICAgIGZpbGUuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKy8qCisgICAgVGhlc2Ugc3ltYm9scyBhcmUgcmVxdWlyZWQgZm9yIG11dHVhbCBleGNsdXNpb24gd2l0aCBNaWNyb3NvZnQgT3Blbk1QIFJUTCAoYW5kIGNvbXBhdGliaWxpdHkKKyAgICB3aXRoIE1TIENvbXBpbGVyKS4KKyovCisKK2ludCBfWW91X211c3RfbGlua193aXRoX2V4YWN0bHlfb25lX09wZW5NUF9saWJyYXJ5ID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX0ludGVsX09wZW5NUF9saWJyYXJ5ICAgICAgID0gMTsKK2ludCBfWW91X211c3RfbGlua193aXRoX01pY3Jvc29mdF9PcGVuTVBfbGlicmFyeSA9IDE7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2lvLmMgYi9yYzMvcnVudGltZS9zcmMva21wX2lvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGU3OWUyMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaW8uYwpAQCAtMCwwICsxLDI0OCBAQAorLyoKKyAqIEtNUF9JTy5jIC0tIFJUTCBJTworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpbmNsdWRlIDxzdGRhcmcuaD4KKyNpbmNsdWRlIDxzdHJpbmcuaD4KKyNpZm5kZWYgX19BQlNPRlRfV0lOCisjIGluY2x1ZGUgPHN5cy90eXBlcy5oPgorI2VuZGlmCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9zdHIuaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXAuaCIgLy8gS01QX0dUSURfRE5FLCBfX2ttcF9kZWJ1Z19idWYsIGV0YworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgcHJhZ21hIHdhcm5pbmcoIHB1c2ggKQorIyBwcmFnbWEgd2FybmluZyggZGlzYWJsZTogMjcxIDMxMCApCisjIGluY2x1ZGUgPHdpbmRvd3MuaD4KKyMgcHJhZ21hIHdhcm5pbmcoIHBvcCApCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwora21wX2Jvb3RzdHJhcF9sb2NrX3QgX19rbXBfc3RkaW9fbG9jayAgID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9zdGRpb19sb2NrICAgKTsgLyogQ29udHJvbCBzdGRpbyBmdW5jdGlvbnMgKi8KK2ttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfY29uc29sZV9sb2NrICk7IC8qIENvbnRyb2wgY29uc29sZSBpbml0aWFsaXphdGlvbiAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKworICAgICMgaWZkZWYgS01QX0RFQlVHCisgICAgLyogX19rbXBfc3Rkb3V0IGlzIHVzZWQgb25seSBmb3IgZGV2IGJ1aWxkICovCisgICAgc3RhdGljIEhBTkRMRSAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworICAgICMgZW5kaWYKKyAgICBzdGF0aWMgSEFORExFICAgICAgICBfX2ttcF9zdGRlcnIgPSBOVUxMOworICAgIHN0YXRpYyBpbnQgICAgICAgICAgIF9fa21wX2NvbnNvbGVfZXhpc3RzID0gRkFMU0U7CisgICAgc3RhdGljIGttcF9zdHJfYnVmX3QgX19rbXBfY29uc29sZV9idWY7CisKKyAgICBzdGF0aWMgaW50CisgICAgaXNfY29uc29sZSggdm9pZCApCisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsgMTI4IF07CisgICAgICAgIERXT1JEIHJjICA9IDA7CisgICAgICAgIERXT1JEIGVyciA9IDA7CisgICAgICAgIC8vIFRyeSB0byBnZXQgY29uc29sZSB0aXRsZS4KKyAgICAgICAgU2V0TGFzdEVycm9yKCAwICk7CisgICAgICAgICAgICAvLyBHZXRDb25zb2xlVGl0bGUgZG9lcyBub3QgcmVzZXQgbGFzdCBlcnJvciBpbiBjYXNlIG9mIHN1Y2Nlc3Mgb3Igc2hvcnQgYnVmZmVyLAorICAgICAgICAgICAgLy8gc28gd2UgbmVlZCB0byBjbGVhciBpdCBleHBsaWNpdGx5LgorICAgICAgICByYyA9IEdldENvbnNvbGVUaXRsZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisgICAgICAgIGlmICggcmMgPT0gMCApIHsKKyAgICAgICAgICAgIC8vIHJjID09IDAgbWVhbnMgZ2V0dGluZyBjb25zb2xlIHRpdGxlIGZhaWxlZC4gTGV0IHVzIGZpbmQgb3V0IHdoeS4KKyAgICAgICAgICAgIGVyciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgLy8gZXJyID09IDAgbWVhbnMgYnVmZmVyIHRvbyBzaG9ydCAod2Ugc3VwcG9zZSBjb25zb2xlIGV4aXN0cykuCisgICAgICAgICAgICAvLyBJbiBXaW5kb3cgYXBwbGljYXRpb25zIHdlIHVzdWFsbHkgaGF2ZSBlcnIgPT0gNiAoaW52YWxpZCBoYW5kbGUpLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXR1cm4gcmMgPiAwIHx8IGVyciA9PSAwOworICAgIH0KKworICAgIHZvaWQKKyAgICBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICkKKyAgICB7CisgICAgICAgIC8qIHdhaXQgdW50aWwgdXNlciBwcmVzc2VzIHJldHVybiBiZWZvcmUgY2xvc2luZyB3aW5kb3cgKi8KKyAgICAgICAgLyogVE9ETyBvbmx5IGNsb3NlIGlmIGEgd2luZG93IHdhcyBvcGVuZWQgKi8KKyAgICAgICAgaWYoIF9fa21wX2NvbnNvbGVfZXhpc3RzICkgeworICAgICAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgLyogc3RhbmRhcmQgb3V0IGlzIHVzZWQgb25seSBpbiBkZXYgYnVpbGQgKi8KKyAgICAgICAgICAgIF9fa21wX3N0ZG91dCA9IE5VTEw7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3N0ZGVyciA9IE5VTEw7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICZfX2ttcF9jb25zb2xlX2J1ZiApOworICAgICAgICAgICAgX19rbXBfY29uc29sZV9leGlzdHMgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIEZvciB3aW5kb3dzLCBjYWxsIHRoaXMgYmVmb3JlIHN0ZG91dCwgc3RkZXJyLCBvciBzdGRpbiBhcmUgdXNlZC4KKyAgICAgKiBJdCBvcGVucyBhIGNvbnNvbGUgd2luZG93IGFuZCBzdGFydHMgcHJvY2Vzc2luZyAqLworICAgIHN0YXRpYyB2b2lkCisgICAgX19rbXBfcmVkaXJlY3Rfb3V0cHV0KCB2b2lkICkKKyAgICB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9jb25zb2xlX2xvY2sgKTsKKworICAgICAgICBpZiggISBfX2ttcF9jb25zb2xlX2V4aXN0cyApIHsKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIC8qIHN0YW5kYXJkIG91dCBpcyB1c2VkIG9ubHkgaW4gZGV2IGJ1aWxkICovCisgICAgICAgICAgICBIQU5ETEUgaG87CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIEhBTkRMRSBoZTsKKworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmX19rbXBfY29uc29sZV9idWYgKTsKKworICAgICAgICAgICAgQWxsb2NDb25zb2xlKCk7CisgICAgICAgICAgICAvLyBXZSBkbyBub3QgY2hlY2sgdGhlIHJlc3VsdCBvZiBBbGxvY0NvbnNvbGUgYmVjYXVzZQorICAgICAgICAgICAgLy8gIDEuIHRoZSBjYWxsIGlzIGhhcm1sZXNzCisgICAgICAgICAgICAvLyAgMi4gaXQgaXMgbm90IGNsZWFyIGhvdyB0byBjb21tdW5pY2F0ZSBmYWlsdWUKKyAgICAgICAgICAgIC8vICAzLiB3ZSB3aWxsIGRldGVjdCBmYWlsdXJlIGxhdGVyIHdoZW4gd2UgZ2V0IGhhbmRsZShzKQorCisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgaG8gPSBHZXRTdGRIYW5kbGUoIFNURF9PVVRQVVRfSEFORExFICk7CisgICAgICAgICAgICAgICAgaWYgKCBobyA9PSBJTlZBTElEX0hBTkRMRV9WQUxVRSB8fCBobyA9PSBOVUxMICkgeworCisgICAgICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAgICAgLy8gVE9ETzogb3V0cHV0IGVycm9yIHNvbWVob3cgKG1heWJlIG1lc3NhZ2UgYm94KQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBOVUxMOworCisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGRvdXQgPSBobzsgLy8gdGVtcG9yYXJ5IGNvZGUsIG5lZWQgbmV3IGdsb2JhbCBmb3IgaG8KKworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgaGUgPSBHZXRTdGRIYW5kbGUoIFNURF9FUlJPUl9IQU5ETEUgKTsKKyAgICAgICAgICAgIGlmICggaGUgPT0gSU5WQUxJRF9IQU5ETEVfVkFMVUUgfHwgaGUgPT0gTlVMTCApIHsKKworICAgICAgICAgICAgICAgIERXT1JEICBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBvdXRwdXQgZXJyb3Igc29tZWhvdyAobWF5YmUgbWVzc2FnZSBib3gpCisgICAgICAgICAgICAgICAgX19rbXBfc3RkZXJyID0gTlVMTDsKKworICAgICAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0ZGVyciA9IGhlOyAvLyB0ZW1wb3JhcnkgY29kZSwgbmVlZCBuZXcgZ2xvYmFsCisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9jb25zb2xlX2V4aXN0cyA9IFRSVUU7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworICAgIH0KKworI2Vsc2UKKyAgICAjZGVmaW5lICAgICAgIF9fa21wX3N0ZGVyciAgICAgKHN0ZGVycikKKyNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCit2b2lkCitfX2ttcF92cHJpbnRmKCBlbnVtIGttcF9pbyBfX2ttcF9pbywgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcCApCit7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIGlmKCAhX19rbXBfY29uc29sZV9leGlzdHMgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWRpcmVjdF9vdXRwdXQoKTsKKyAgICAgICAgfQorICAgICAgICAgICAgaWYoICEgX19rbXBfc3RkZXJyICYmIF9fa21wX2lvID09IGttcF9lcnIgKSB7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoICEgX19rbXBfc3Rkb3V0ICYmIF9fa21wX2lvID09IGttcF9vdXQgKSB7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAjZW5kaWYKKyAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworICAgIGlmICggX19rbXBfZGVidWdfYnVmICYmIF9fa21wX2RlYnVnX2J1ZmZlciAhPSBOVUxMICkgeworCisgICAgICAgIGludCBkYyA9ICggX19rbXBfZGVidWdfYnVmX2F0b21pYyA/CisgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9kZWJ1Z19jb3VudCkgOiBfX2ttcF9kZWJ1Z19jb3VudCsrICkKKyAgICAgICAgICAgICAgICAgICAlIF9fa21wX2RlYnVnX2J1Zl9saW5lczsKKyAgICAgICAgY2hhciAqZGIgPSAmIF9fa21wX2RlYnVnX2J1ZmZlclsgZGMgKiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgXTsKKyAgICAgICAgaW50IGNoYXJzID0gMDsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgIGNoYXJzID0gS01QX1NOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCAicGlkPSVkOiAiLCAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBjaGFycyArPSBLTVBfVlNOUFJJTlRGKCBkYiwgX19rbXBfZGVidWdfYnVmX2NoYXJzLCBmb3JtYXQsIGFwICk7CisKKyAgICAgICAgaWYgKCBjaGFycyArIDEgPiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKSB7CisgICAgICAgICAgICBpZiAoIGNoYXJzICsgMSA+IF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzICkgeworICAgICAgICAgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICAgICBEV09SRCBjb3VudDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJl9fa21wX2NvbnNvbGVfYnVmLAorICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgY2hhcnMgKyAxICk7CisgICAgICAgICAgICAgICAgICAgIFdyaXRlRmlsZSggX19rbXBfc3RkZXJyLCBfX2ttcF9jb25zb2xlX2J1Zi5zdHIsIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsICZjb3VudCwgTlVMTCApOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKCBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIk9NUCB3YXJuaW5nOiBEZWJ1Z2dpbmcgYnVmZmVyIG92ZXJmbG93OyBpbmNyZWFzZSBLTVBfREVCVUdfQlVGX0NIQVJTIHRvICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXJzICsgMSApOworICAgICAgICAgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX2J1Zl93YXJuX2NoYXJzID0gY2hhcnMgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLyogdGVybWluYXRlIHN0cmluZyBpZiBvdmVyZmxvdyBvY2N1cnJlZCAqLworICAgICAgICAgICAgZGJbIF9fa21wX2RlYnVnX2J1Zl9jaGFycyAtIDIgXSA9ICdcbic7CisgICAgICAgICAgICBkYlsgX19rbXBfZGVidWdfYnVmX2NoYXJzIC0gMSBdID0gJ1wwJzsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgY291bnQ7CisgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHX1BJRFMKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmX19rbXBfY29uc29sZV9idWYsICJwaWQ9JWQ6ICIsCisgICAgICAgICAgICAgICAgICAoa21wX2ludDMyKWdldHBpZCgpICk7CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfdnByaW50KCAmX19rbXBfY29uc29sZV9idWYsIGZvcm1hdCwgYXAgKTsKKyAgICAgICAgICAgIFdyaXRlRmlsZSgKKyAgICAgICAgICAgICAgICBfX2ttcF9zdGRlcnIsCisgICAgICAgICAgICAgICAgX19rbXBfY29uc29sZV9idWYuc3RyLAorICAgICAgICAgICAgICAgIF9fa21wX2NvbnNvbGVfYnVmLnVzZWQsCisgICAgICAgICAgICAgICAgJmNvdW50LAorICAgICAgICAgICAgICAgIE5VTEwKKyAgICAgICAgICAgICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmX19rbXBfY29uc29sZV9idWYgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICNpZmRlZiBLTVBfREVCVUdfUElEUworICAgICAgICAgICAgICAgIGZwcmludGYoIF9fa21wX3N0ZGVyciwgInBpZD0lZDogIiwgKGttcF9pbnQzMilnZXRwaWQoKSApOworICAgICAgICAgICAgI2VuZGlmCisgICAgICAgICAgICB2ZnByaW50ZiggX19rbXBfc3RkZXJyLCBmb3JtYXQsIGFwICk7CisgICAgICAgICAgICBmZmx1c2goIF9fa21wX3N0ZGVyciApOworICAgICAgICAjZW5kaWYKKyAgICB9Cit9CisKK3ZvaWQKK19fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICkKK3sKKyAgICB2YV9saXN0IGFwOworICAgIHZhX3N0YXJ0KCBhcCwgZm9ybWF0ICk7CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKyAgICBfX2ttcF92cHJpbnRmKCBrbXBfZXJyLCBmb3JtYXQsIGFwICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9zdGRpb19sb2NrICk7CisKKyAgICB2YV9lbmQoIGFwICk7Cit9CisKK3ZvaWQKK19fa21wX3ByaW50Zl9ub19sb2NrKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIHZhX2xpc3QgYXA7CisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGZvcm1hdCwgYXAgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfaW8uaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfaW8uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMGNhYTY0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pby5oCkBAIC0wLDAgKzEsNDQgQEAKKy8qCisgKiBrbXBfaW8uaCAtLSBSVEwgSU8gaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lPX0gKKyNkZWZpbmUgS01QX0lPX0gKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitlbnVtIGttcF9pbyB7CisgICAga21wX291dCA9IDAsCisgICAga21wX2VycgorfTsKKworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX3N0ZGlvX2xvY2s7ICAgICAvKiBDb250cm9sIHN0ZGlvIGZ1bmN0aW9ucyAqLworZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2NvbnNvbGVfbG9jazsgICAvKiBDb250cm9sIGNvbnNvbGUgaW5pdGlhbGl6YXRpb24gKi8KKworZXh0ZXJuIHZvaWQgX19rbXBfdnByaW50ZiggZW51bSBrbXBfaW8gX19rbXBfaW8sIGNoYXIgY29uc3QgKiBmb3JtYXQsIHZhX2xpc3QgYXAgKTsKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50ZiggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9wcmludGZfbm9fbG9jayggY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7CitleHRlcm4gdm9pZCBfX2ttcF9jbG9zZV9jb25zb2xlKCB2b2lkICk7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKyNlbmRpZiAvKiBLTVBfSU9fSCAqLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2l0dC5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mMDlhMDNmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuYwpAQCAtMCwwICsxLDE0NyBAQAorI2luY2x1ZGUgImttcF9jb25maWcuaCIKKworI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmMgLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjaW5jbHVkZSAia21wX2l0dC5pbmwiCisjZW5kaWYKKworCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIGttcF9pbnQzMiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudDsKKyAgICBrbXBfaW50MzIgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudDsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tLTVBfTUFYX0ZSQU1FX0RPTUFJTlNdOworICAgIF9faXR0X2RvbWFpbiogX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgX19pdHRfZG9tYWluICogbWV0YWRhdGFfZG9tYWluID0gTlVMTDsKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICogc3RyaW5nX2hhbmRsZV9pbWJsID0gTlVMTDsKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICogc3RyaW5nX2hhbmRsZV9sb29wID0gTlVMTDsKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlICogc3RyaW5nX2hhbmRsZV9zbmdsID0gTlVMTDsKKworICAgICNpbmNsdWRlICJrbXBfdmVyc2lvbi5oIgorICAgICNpbmNsdWRlICJrbXBfaTE4bi5oIgorICAgICNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF9pdHRfbWFya190ICkgPT0gc2l6ZW9mKCBfX2l0dF9tYXJrX3R5cGUgKSApOworCisgICAgLyoKKyAgICAgICAgUHJldmlvdXNseSB1c2VkIHdhcm5pbmdzOgorCisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRBbGxOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRPYmpOb3RpZkRpc2FibGVkICk7CisgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRNYXJrTm90aWZEaXNhYmxlZCApOworICAgICAgICBLTVBfV0FSTklORyggSXR0VW5sb2FkTGliRmFpbGVkLCBsaWJpdHRub3RpZnkgKTsKKyAgICAqLworCisKKyAgICBrbXBfaW50MzIgX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgPSAwOworICAgIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrID0gS01QX0JPT1RTVFJBUF9MT0NLX0lOSVRJQUxJWkVSKCBfX2ttcF9pdHRfZGVidWdfbG9jayApOworCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpIHsKKworICAgIC8vIElUVE5vdGlmeSBsaWJyYXJ5IGlzIGxvYWRlZCBhbmQgaW5pdGlhbGl6ZWQgYXQgZmlyc3QgY2FsbCB0byBhbnkgaXR0bm90aWZ5IGZ1bmN0aW9uLAorICAgIC8vIHNvIHdlIGRvIG5vdCBuZWVkIHRvIGV4cGxpY2l0bHkgbG9hZCBpdCBhbnkgbW9yZS4KKyAgICAvLyBKdXNyIHJlcG9ydCBPTVAgUlRMIHZlcnNpb24gdG8gSVRUTm90aWZ5LgorCisgICAgI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIC8vIFJlcG9ydCBPcGVuTVAgUlRMIHZlcnNpb24uCisgICAgICAgIGttcF9zdHJfYnVmX3QgICAgICAgYnVmOworICAgICAgICBfX2l0dF9tYXJrX3R5cGUgICAgIHZlcnNpb247CisgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWYgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmLAorICAgICAgICAgICAgIk9NUCBSVEwgVmVyc2lvbiAlZC4lZC4lZCIsCisgICAgICAgICAgICBfX2ttcF92ZXJzaW9uX21ham9yLAorICAgICAgICAgICAgX19rbXBfdmVyc2lvbl9taW5vciwKKyAgICAgICAgICAgIF9fa21wX3ZlcnNpb25fYnVpbGQKKyAgICAgICAgKTsKKyAgICAgICAgaWYgKCBfX2l0dF9hcGlfdmVyc2lvbl9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmLCAiOiVzIiwgX19pdHRfYXBpX3ZlcnNpb24oKSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB2ZXJzaW9uID0gX19pdHRfbWFya19jcmVhdGUoIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19pdHRfbWFyayggdmVyc2lvbiwgTlVMTCApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmICk7CisgICAgI2VuZGlmCisKK30gLy8gX19rbXBfaXR0X2luaXRpYWxpemUKKworCit2b2lkIF9fa21wX2l0dF9kZXN0cm95KCkgeworICAgICNpZiBVU0VfSVRUX05PVElGWQorICAgICAgICBfX2ttcF9pdHRfZmluaV9pdHRsaWIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaXR0X2Rlc3Ryb3kKKworCitleHRlcm4gIkMiCit2b2lkCitfX2l0dF9lcnJvcl9oYW5kbGVyKAorICAgIF9faXR0X2Vycm9yX2NvZGUgZXJyLAorICAgIHZhX2xpc3QgYXJncworKSB7CisKKyAgICBzd2l0Y2ggKCBlcnIgKSB7CisgICAgICAgIGNhc2UgX19pdHRfZXJyb3Jfbm9fbW9kdWxlIDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGxpYnJhcnkgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAgICAgaW50IHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUkNPREUoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbHNlCisgICAgICAgICAgICAgICAgY2hhciBjb25zdCAqIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEl0dExvYWRMaWJGYWlsZWQsIGxpYnJhcnkgKSwgS01QX1NZU0VSUk1FU0coIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX25vX3N5bWJvbCA6IHsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBsaWJyYXJ5ID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIGNoYXIgY29uc3QgKiBzeW1ib2wgID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRMb29rdXBGYWlsZWQsIHN5bWJvbCwgbGlicmFyeSApOworICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGdyb3VwID0gdmFfYXJnKCBhcmdzLCBjaGFyIGNvbnN0ICogKTsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJdHRVbmtub3duR3JvdXAsIHZhciwgZ3JvdXAgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcgOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogdmFyICAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgYWN0X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBzaXplX3QgICAgICAgbWF4X2xlbiA9IHZhX2FyZyggYXJncywgc2l6ZV90ICk7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0RW52VmFyVG9vTG9uZywgdmFyLCAodW5zaWduZWQgbG9uZykgYWN0X2xlbiwgKHVuc2lnbmVkIGxvbmcpIG1heF9sZW4gKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52IDogeworICAgICAgICAgICAgY2hhciBjb25zdCAqIHZhciAgICAgPSB2YV9hcmcoIGFyZ3MsIGNoYXIgY29uc3QgKiApOworICAgICAgICAgICAgaW50ICAgICAgICAgIHN5c19lcnIgPSB2YV9hcmcoIGFyZ3MsIGludCApOworICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQ2FudEdldEVudlZhciwgdmFyICksIEtNUF9FUlIoIHN5c19lcnIgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBfX2l0dF9lcnJvcl9zeXN0ZW0gOiB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogZnVuYyAgICA9IHZhX2FyZyggYXJncywgY2hhciBjb25zdCAqICk7CisgICAgICAgICAgICBpbnQgICAgICAgICAgc3lzX2VyciA9IHZhX2FyZyggYXJncywgaW50ICk7CisgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJdHRGdW5jdGlvbkVycm9yLCBmdW5jICksIEtNUF9TWVNFUlJDT0RFKCBzeXNfZXJyICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggSXR0VW5rbm93bkVycm9yLCBlcnIgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKKworfSAvLyBfX2l0dF9lcnJvcl9oYW5kbGVyCisKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX2l0dC5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yODYwMjNkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaApAQCAtMCwwICsxLDMxMiBAQAorI2lmIFVTRV9JVFRfQlVJTEQKKy8qCisgKiBrbXBfaXR0LmggLS0gSVRUIE5vdGlmeSBpbnRlcmZhY2UuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX0lUVF9ICisjZGVmaW5lIEtNUF9JVFRfSAorCisjaW5jbHVkZSAia21wX2xvY2suaCIKKworI2RlZmluZSBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyNpbmNsdWRlICJpdHRub3RpZnkuaCIKKyNpbmNsdWRlICJsZWdhY3kvaXR0bm90aWZ5LmgiCisKKyNpZiBLTVBfREVCVUcKKyAgICAjZGVmaW5lIF9fa21wX2lubGluZSAgICAgICAgICAgLy8gVHVybiBvZmYgaW5saW5pbmcgaW4gZGVidWcgbW9kZS4KKyNlbHNlCisgICAgI2RlZmluZSBfX2ttcF9pbmxpbmUgc3RhdGljIGlubGluZQorI2VuZGlmCisKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGV4dGVybiBrbXBfaW50MzIgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5OworIyBpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVsc2UKKyAgICBleHRlcm4gdm9pZCBfX2ttcF9pdHRfZmluaV9pdHRsaWIodm9pZCk7CisjIGVuZGlmCisjZW5kaWYKKworLy8gU2ltcGxpZnkgdGhlIGhhbmRsaW5nIG9mIGFuIGFyZ3VtZW50IHRoYXQgaXMgb25seSByZXF1aXJlZCB3aGVuIFVTRV9JVFRfQlVJTEQgaXMgZW5hYmxlZC4KKyNkZWZpbmUgVVNFX0lUVF9CVUlMRF9BUkcoeCkgLHgKKwordm9pZCBfX2ttcF9pdHRfaW5pdGlhbGl6ZSgpOwordm9pZCBfX2ttcF9pdHRfZGVzdHJveSgpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBOZXcgc3R1ZmYgZm9yIHJlcG9ydGluZyBoaWdoLWxldmVsIGNvbnN0cnVjdHMuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIE5vdGUgdGhlIG5hbWluZyBjb252ZW50aW9uOgorLy8gICAgIF9fa21wX2l0dF94eHhpbmcoKSBmdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJlZm9yZSBhY3Rpb24sIHdoaWxlCisvLyAgICAgX19rbXBfaXR0X3h4eGVkKCkgIGZ1bmN0aW9uIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgYWN0aW9uLgorCisvLyAtLS0gUGFyYWxsZWwgcmVnaW9uIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9yZWdpb25fZm9ya2luZyggIGludCBndGlkLCBpbnQgdGVhbV9zaXplLCBpbnQgYmFycmllcnMgKTsgLy8gTWFzdGVyIG9ubHksIGJlZm9yZSBmb3JraW5nIHRocmVhZHMuCitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggICBpbnQgZ3RpZCApOyAvLyBNYXN0ZXIgb25seSwgYWZ0ZXIgam9pbmluZyB0aHJlYWRzLgorICAgIC8vICgqKSBOb3RlOiBBIHRocmVhZCBtYXkgZXhlY3V0ZSB0YXNrcyBhZnRlciB0aGlzIHBvaW50LCB0aG91Z2guCisKKy8vIC0tLSBGcmFtZSByZXBvcnRpbmcgLS0tCisvLyByZWdpb24gPSAwIC0gbm8gcmVnaW9ucywgcmVnaW9uID0gMSAtIHBhcmFsbGVsLCByZWdpb24gPSAyIC0gc2VyaWFsaXplZCBwYXJhbGxlbAorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdCggaW50IGd0aWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCwgaW50IGltYmFsYW5jZSwgaWRlbnRfdCAqbG9jLCBpbnQgdGVhbV9zaXplLCBpbnQgcmVnaW9uID0gMCApOworCisvLyAtLS0gTWV0YWRhdGEgcmVwb3J0aW5nIC0tLQorLy8gYmVnaW4vZW5kIC0gYmVnaW4vZW5kIHRpbWVzdGFtcHMgb2YgYSBiYXJyaWVyIGZyYW1lLCBpbWJhbGFuY2UgLSBhZ2dyZWdhdGVkIHdhaXQgdGltZSB2YWx1ZSwgcmVkdWN0aW9uIC1pZiB0aGlzIGlzIGEgcmVkdWN0aW9uIGJhcnJpZXIKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9tZXRhZGF0YV9pbWJhbGFuY2UoIGludCBndGlkLCBrbXBfdWludDY0IGJlZ2luLCBrbXBfdWludDY0IGVuZCwga21wX3VpbnQ2NCBpbWJhbGFuY2UsIGttcF91aW50NjQgcmVkdWN0aW9uICk7CisvLyBzY2hlZF90eXBlOiAwIC0gc3RhdGljLCAxIC0gZHluYW1pYywgMiAtIGd1aWRlZCwgMyAtIGN1c3RvbSAoYWxsIG90aGVycyk7IGl0ZXJhdGlvbnMgLSBsb29wIHRyaXAgY291bnQsIGNodW5rIC0gY2h1bmsgc2l6ZQorX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X21ldGFkYXRhX2xvb3AoIGlkZW50X3QgKiBsb2MsIGttcF91aW50NjQgc2NoZWRfdHlwZSwga21wX3VpbnQ2NCBpdGVyYXRpb25zLCBrbXBfdWludDY0IGNodW5rICk7CitfX2ttcF9pbmxpbmUgdm9pZCBfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCBpZGVudF90ICogbG9jICk7CisKKy8vIC0tLSBCYXJyaWVyIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICogX19rbXBfaXR0X2JhcnJpZXJfb2JqZWN0KCBpbnQgZ3RpZCwgaW50IGJ0LCBpbnQgc2V0X25hbWUgPSAwLCBpbnQgZGVsdGEgPSAwICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoICAgaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBUYXNrd2FpdCByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAqIF9fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggaW50IGd0aWQsIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCAgIGludCBndGlkLCB2b2lkICogb2JqZWN0ICk7CisKKy8vIC0tLSBUYXNrIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIHZvaWQgKiBvYmplY3QgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIHZvaWQgKiBvYmplY3QgKTsKKworLy8gLS0tIExvY2sgcmVwb3J0aW5nIC0tLQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCAga21wX3VzZXJfbG9ja19wIGxvY2ssIGNvbnN0IGlkZW50X3QgKiApOworI2Vsc2UKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworI2VuZGlmCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQoICBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfbG9ja19yZWxlYXNpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApOworCisvLyAtLS0gQ3JpdGljYWwgcmVwb3J0aW5nIC0tLQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICogKTsKKyNlbHNlCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZyggIGttcF91c2VyX2xvY2tfcCBsb2NrICk7CisjZW5kaWYKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2FjcXVpcmVkKCAga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKTsKKworLy8gLS0tIFNpbmdsZSByZXBvcnRpbmcgLS0tCitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfc3RhcnQoIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9zaW5nbGVfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBPcmRlcmVkIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfaW5pdCggIGludCBndGlkICk7CitfX2ttcF9pbmxpbmUgdm9pZCAgIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAoICBpbnQgZ3RpZCApOworX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydCggaW50IGd0aWQgKTsKK19fa21wX2lubGluZSB2b2lkICAgX19rbXBfaXR0X29yZGVyZWRfZW5kKCAgIGludCBndGlkICk7CisKKy8vIC0tLSBUaHJlYWRzIHJlcG9ydGluZyAtLS0KK19fa21wX2lubGluZSB2b2lkICBfX2ttcF9pdHRfdGhyZWFkX2lnbm9yZSgpOworX19rbXBfaW5saW5lIHZvaWQgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggaW50IGd0aWQgKTsKKworLy8gLS0tIFN5c3RlbSBvYmplY3RzIC0tLQorX19rbXBfaW5saW5lIHZvaWQgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCB2b2lkICogb2JqZWN0LCBjaGFyIGNvbnN0ICogbmFtZSApOworCisvLyAtLS0gU3RhY2sgc3RpdGNoaW5nIC0tLQorX19rbXBfaW5saW5lIF9faXR0X2NhbGxlciBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSh2b2lkKTsKK19fa21wX2lubGluZSB2b2lkIF9fa21wX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9lbnRlcihfX2l0dF9jYWxsZXIpOworX19rbXBfaW5saW5lIHZvaWQgX19rbXBfaXR0X3N0YWNrX2NhbGxlZV9sZWF2ZShfX2l0dF9jYWxsZXIpOworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPbGQgc3R1ZmYgZm9yIHJlcG9ydGluZyBsb3ctbGV2ZWwgaW50ZXJuYWwgc3luY2hyb25pemF0aW9uLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgVVNFX0lUVF9OT1RJRlkKKworICAgIC8qCisgICAgICogU3VwcG9ydCBmb3IgU1NDIG1hcmtzLCB3aGljaCBhcmUgdXNlZCBieSBTREUKKyAgICAgKiBodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2FydGljbGVzL2ludGVsLXNvZnR3YXJlLWRldmVsb3BtZW50LWVtdWxhdG9yCisgICAgICogdG8gbWFyayBwb2ludHMgaW4gaW5zdHJ1Y3Rpb24gdHJhY2VzIHRoYXQgcmVwcmVzZW50IHNwaW4tbG9vcHMgYW5kIGFyZQorICAgICAqIHRoZXJlZm9yZSB1bmludGVyZXN0aW5nIHdoZW4gY29sbGVjdGluZyB0cmFjZXMgZm9yIGFyY2hpdGVjdHVyZSBzaW11bGF0aW9uLgorICAgICAqLworICAgICNpZm5kZWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICAjIGRlZmluZSBJTkNMVURFX1NTQ19NQVJLUyAoS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAjZW5kaWYKKworICAgIC8qIExpbnV4IDY0IG9ubHkgZm9yIG5vdyAqLworICAgICNpZiAoSU5DTFVERV9TU0NfTUFSS1MgJiYgS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX1g4Nl82NCkKKyAgICAvLyBQb3J0YWJsZSAoYXQgbGVhc3QgZm9yIGdjYyBhbmQgaWNjKSBjb2RlIHRvIGluc2VydCB0aGUgbmVjZXNzYXJ5IGluc3RydWN0aW9ucworICAgIC8vIHRvIHNldCAlZWJ4IGFuZCBleGVjdXRlIHRoZSB1bmxpa2VseSBuby1vcC4KKyAgICAgICNpZiBkZWZpbmVkKCBfX0lOVEVMX0NPTVBJTEVSICkKKyAgICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpIF9fU1NDX01BUksodGFnKQorICAgICAgI2Vsc2UKKyAgICAgICMgZGVmaW5lIElOU0VSVF9TU0NfTUFSSyh0YWcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgX19hc21fXyBfX3ZvbGF0aWxlX18gKCJtb3ZsICUwLCAlJWVieDsgLmJ5dGUgMHg2NCwgMHg2NywgMHg5MCAiIDo6ImkiKHRhZyk6IiVlYngiKQorICAgICAgI2VuZGlmCisgICAgI2Vsc2UKKyAgICAjIGRlZmluZSBJTlNFUlRfU1NDX01BUksodGFnKSAoKHZvaWQpMCkKKyAgICAjZW5kaWYKKworICAgIC8qIE1hcmtlcnMgZm9yIHRoZSBzdGFydCBhbmQgZW5kIG9mIHJlZ2lvbnMgdGhhdCByZXByZXNlbnQgcG9sbGluZyBhbmQKKyAgICAgKiBhcmUgdGhlcmVmb3JlIHVuaW50ZXJlc3RpbmcgdG8gYXJjaGl0ZWN0dXJhbCBzaW11bGF0aW9ucyAweDQzNzYgYW5kCisgICAgICogMHg0Mzc3IGFyZSBhcmJpdHJhcnkgbnVtYmVycyB0aGF0IHNob3VsZCBiZSB1bmlxdWUgaW4gdGhlIHNwYWNlIG9mCisgICAgICogU1NDIHRhZ3MsIGJ1dCB0aGVyZSBpcyBubyBjZW50cmFsIGlzc3VpbmcgYXV0aG9yaXR5IHJhdGhlcgorICAgICAqIHJhbmRvbW5lc3MgaXMgZXhwZWN0ZWQgdG8gd29yay4KKyAgICAgKi8KKyAgICAjZGVmaW5lIFNTQ19NQVJLX1NQSU5fU1RBUlQoKSBJTlNFUlRfU1NDX01BUksoMHg0Mzc2KQorICAgICNkZWZpbmUgU1NDX01BUktfU1BJTl9FTkQoKSAgIElOU0VSVF9TU0NfTUFSSygweDQzNzcpCisKKyAgICAvLyBNYXJrZXJzIGZvciBhcmNoaXRlY3R1cmUgc2ltdWxhdGlvbi4KKyAgICAvLyBGT1JLSU5HICAgICAgOiBCZWZvcmUgdGhlIG1hc3RlciB0aHJlYWQgZm9ya3MuCisgICAgLy8gSk9JTklORyAgICAgIDogQXQgdGhlIHN0YXJ0IG9mIHRoZSBqb2luLgorICAgIC8vIElOVk9LSU5HICAgICA6IEJlZm9yZSB0aGUgdGhyZWFkcyBpbnZva2UgbWljcm90YXNrcy4KKyAgICAvLyBESVNQQVRDSF9JTklUOiBBdCB0aGUgc3RhcnQgb2YgZHluYW1pY2FsbHkgc2NoZWR1bGVkIGxvb3AuCisgICAgLy8gRElTUEFUQ0hfTkVYVDogQWZ0ZXIgY2xhbWluZyBuZXh0IGl0ZXJhdGlvbiBvZiBkeW5hbWljYWxseSBzY2hlZHVsZWQgbG9vcC4KKyAgICAjZGVmaW5lIFNTQ19NQVJLX0ZPUktJTkcoKSAgICAgICAgICBJTlNFUlRfU1NDX01BUksoMHhkNjkzKQorICAgICNkZWZpbmUgU1NDX01BUktfSk9JTklORygpICAgICAgICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTQpCisgICAgI2RlZmluZSBTU0NfTUFSS19JTlZPS0lORygpICAgICAgICAgSU5TRVJUX1NTQ19NQVJLKDB4ZDY5NSkKKyAgICAjZGVmaW5lIFNTQ19NQVJLX0RJU1BBVENIX0lOSVQoKSAgICBJTlNFUlRfU1NDX01BUksoMHhkNjk2KQorICAgICNkZWZpbmUgU1NDX01BUktfRElTUEFUQ0hfTkVYVCgpICAgIElOU0VSVF9TU0NfTUFSSygweGQ2OTcpCisKKyAgICAvLyBUaGUgb2JqZWN0IGlzIGFuIGFkZHJlc3MgdGhhdCBhc3NvY2lhdGVzIGEgc3BlY2lmaWMgc2V0IG9mIHRoZSBwcmVwYXJlLCBhY3F1aXJlLCByZWxlYXNlLAorICAgIC8vIGFuZCBjYW5jZWwgb3BlcmF0aW9ucy4KKworICAgIC8qIFN5bmMgcHJlcGFyZSBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgZ29pbmcgdG8gc3RhcnQgd2FpdGluZyBmb3IgYW5vdGhlciB0aHJlYWQKKyAgICAgICB0byBzZW5kIGEgcmVsZWFzZSBldmVudC4gIFRoaXMgb3BlcmF0aW9uIHNob3VsZCBiZSBkb25lIGp1c3QgYmVmb3JlIHRoZSB0aHJlYWQKKyAgICAgICBiZWdpbnMgY2hlY2tpbmcgZm9yIHRoZSBleGlzdGVuY2Ugb2YgdGhlIHJlbGVhc2UgZXZlbnQgKi8KKworICAgIC8qIFN5bmMgY2FuY2VsIGluZGljYXRlcyBhIHRocmVhZCBpcyBjYW5jZWxsaW5nIGEgd2FpdCBvbiBhbm90aGVyIHRocmVhZCBhbmMKKyAgICAgICBjb250aW51aW5nIGV4ZWN1dGlvbiB3aXRob3V0IHdhaXRpbmcgZm9yIHRoZSBvdGhlciB0aHJlYWQgdG8gcmVsZWFzZSBpdCAqLworCisgICAgLyogU3luYyBhY3F1aXJlZCBpbmRpY2F0ZXMgYSB0aHJlYWQgaGFzIHJlY2VpdmVkIGEgcmVsZWFzZSBldmVudCBmcm9tIGFub3RoZXIKKyAgICAgICB0aHJlYWQgYW5kIGhhcyBzdG9wcGVkIHdhaXRpbmcuICBUaGlzIG9wZXJhdGlvbiBtdXN0IG9jY3VyIG9ubHkgYWZ0ZXIgdGhlIHJlbGVhc2UKKyAgICAgICBldmVudCBpcyByZWNlaXZlZC4gKi8KKworICAgIC8qIFN5bmMgcmVsZWFzZSBpbmRpY2F0ZXMgYSB0aHJlYWQgaXMgZ29pbmcgdG8gc2VuZCBhIHJlbGVhc2UgZXZlbnQgdG8gYW5vdGhlciB0aHJlYWQKKyAgICAgICBzbyBpdCB3aWxsIHN0b3Agd2FpdGluZyBhbmQgY29udGludWUgZXhlY3V0aW9uLiBUaGlzIG9wZXJhdGlvbiBtdXN0IGp1c3QgaGFwcGVuIGJlZm9yZQorICAgICAgIHRoZSByZWxlYXNlIGV2ZW50LiAqLworCisgICAgI2RlZmluZSBLTVBfRlNZTkNfUFJFUEFSRSggICBvYmogKSAgX19pdHRfZnN5bmNfcHJlcGFyZSggICAodm9pZCAqKSggb2JqICkgKQorICAgICNkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgIF9faXR0X2ZzeW5jX2NhbmNlbCggICAgKHZvaWQgKikoIG9iaiApICkKKyAgICAjZGVmaW5lIEtNUF9GU1lOQ19BQ1FVSVJFRCggIG9iaiApICBfX2l0dF9mc3luY19hY3F1aXJlZCggICh2b2lkICopKCBvYmogKSApCisgICAgI2RlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKCBvYmogKSAgX19pdHRfZnN5bmNfcmVsZWFzaW5nKCAodm9pZCAqKSggb2JqICkgKQorCisgICAgLyoKKyAgICAgICAgSW4gY2FzZSBvZiB3YWl0aW5nIGluIGEgc3BpbiBsb29wLCBJVFQgd2FudHMgS01QX0ZTWU5DX1BSRVBBUkUoKSB0byBiZSBjYWxsZWQgd2l0aCBhIGRlbGF5CisgICAgICAgIChhbmQgbm90IGNhbGxlZCBhdCBhbGwgaWYgd2FpdGluZyB0aW1lIGlzIHNtYWxsKS4gU28sIGluIHNwaW4gbG9vcHMsIGRvIG5vdCB1c2UKKyAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoKSwgYnV0IHVzZSBLTVBfRlNZTkNfU1BJTl9JTklUKCkgKGJlZm9yZSBzcGluIGxvb3ApLAorICAgICAgICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCkgKHdoaXRoaW4gdGhlIHNwaW4gbG9vcCksIGFuZCBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCgpLgorICAgICAgICBTZWUgS01QX1dBSVRfWUlFTEQoKSBmb3IgZXhhbXBsZS4KKyAgICAqLworCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9JTklUCisgICAgI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgICBcCisgICAgICAgIGludCBzeW5jX2l0ZXJzID0gMDsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgKSB7ICAgICAgICBcCisgICAgICAgICAgICBpZiAoIG9iaiA9PSBOVUxMICkgeyAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb2JqID0gc3BpbjsgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIFNTQ19NQVJLX1NQSU5fU1RBUlQoKQorCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFCisgICAgI2RlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCBvYmogKSBkbyB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgJiYgc3luY19pdGVycyA8IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyBcCisgICAgICAgICAgICArKyBzeW5jX2l0ZXJzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHN5bmNfaXRlcnMgPj0gX19rbXBfaXR0X3ByZXBhcmVfZGVsYXkgKSB7ICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZTWU5DX1BSRVBBUkUoICh2b2lkKikgb2JqICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgIH0gd2hpbGUgKDApCisgICAgI3VuZGVmICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRAorICAgICNkZWZpbmUgS01QX0ZTWU5DX1NQSU5fQUNRVUlSRUQoIG9iaiApIGRvIHsgICAgICAgICBcCisgICAgICAgIFNTQ19NQVJLX1NQSU5fRU5EKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCBzeW5jX2l0ZXJzID49IF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ICkgeyAgXAorICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCAodm9pZCopIG9iaiApOyAgICAgICAgICBcCisgICAgICAgIH0gLyogaWYgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgfSB3aGlsZSAoMCkKKworICAgIC8qIElUVCB3aWxsIG5vdCByZXBvcnQgb2JqZWN0cyBjcmVhdGVkIHdpdGhpbiBLTVBfSVRUX0lHTk9SRSgpLCBlLiBnLjoKKyAgICAgICAgICAgS01QX0lUVF9JR05PUkUoCisgICAgICAgICAgICAgICBwdHIgPSBtYWxsb2MoIHNpemUgKTsKKyAgICAgICAgICAgKTsKKyAgICAqLworICAgICNkZWZpbmUgS01QX0lUVF9JR05PUkUoIHN0YXRlbWVudCApIGRvIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgX19pdHRfc3RhdGVfdCBfX2l0dF9zdGF0ZV87ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfX2l0dF9zdGF0ZV9nZXRfcHRyICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X3N0YXRlXyA9IF9faXR0X3N0YXRlX2dldCgpOyAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9faXR0X29ial9tb2RlX3NldCggX19pdHRfb2JqX3Byb3BfaWdub3JlLCBfX2l0dF9vYmpfc3RhdGVfc2V0ICk7IFwKKyAgICAgICAgICAgIH0gIC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHsgc3RhdGVtZW50IH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggX19pdHRfc3RhdGVfZ2V0X3B0ciApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9zdGF0ZV9zZXQoIF9faXR0X3N0YXRlXyApOyAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gIC8qIGlmICovICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB9IHdoaWxlICgwKQorCisgICAgY29uc3QgaW50IEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMjsgLy8gTWF4aW11bSBudW1iZXIgb2YgZnJhbWUgZG9tYWlucyB0byB1c2UgKG1hcHMgdG8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBkaWZmZXJlbnQgT3Blbk1QIHJlZ2lvbnMgaW4gdGhlIHVzZXIgc291cmNlIGNvZGUpLgorICAgIGV4dGVybiBrbXBfaW50MzIgX19rbXBfYmFycmllcl9kb21haW5fY291bnQ7CisgICAgZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50OworICAgIGV4dGVybiBfX2l0dF9kb21haW4qIF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4gX19pdHRfZG9tYWluKiBfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbS01QX01BWF9GUkFNRV9ET01BSU5TXTsKKyAgICBleHRlcm4ga21wX2ludDMyIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW0tNUF9NQVhfRlJBTUVfRE9NQUlOU107CisgICAgZXh0ZXJuIF9faXR0X2RvbWFpbiAqIG1ldGFkYXRhX2RvbWFpbjsKKyAgICBleHRlcm4gX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfaW1ibDsKKyAgICBleHRlcm4gX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfbG9vcDsKKyAgICBleHRlcm4gX19pdHRfc3RyaW5nX2hhbmRsZSAqIHN0cmluZ19oYW5kbGVfc25nbDsKKworI2Vsc2UKKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorIyBkZWZpbmUgS01QX0ZTWU5DX1BSRVBBUkUoICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0NBTkNFTCggICAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX0FDUVVJUkVEKCAgb2JqICkgICAgICAgICgodm9pZCkwKQorIyBkZWZpbmUgS01QX0ZTWU5DX1JFTEVBU0lORyggb2JqICkgICAgICAgICgodm9pZCkwKQorCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9JTklUKCBvYmosIHNwaW4gKSAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9QUkVQQVJFKCAgb2JqICkgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICkgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9JVFRfSUdOT1JFKHN0bXQgKSBkbyB7IHN0bXQgfSB3aGlsZSAoMCkKKworI2VuZGlmIC8vIFVTRV9JVFRfTk9USUZZCisKKyNpZiAhIEtNUF9ERUJVRworICAgIC8vIEluIHJlbGVhc2UgbW9kZSBpbmNsdWRlIGRlZmluaXRpb25zIG9mIGlubGluZSBmdW5jdGlvbnMuCisgICAgI2luY2x1ZGUgImttcF9pdHQuaW5sIgorI2VuZGlmCisKKyNlbmRpZiAvLyBLTVBfSVRUX0gKKworI2Vsc2UgIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworLy8gTnVsbCBkZWZpbml0aW9ucyBvZiB0aGUgc3luY2hyb25pemF0aW9uIHRyYWNpbmcgZnVuY3Rpb25zLgorLy8gSWYgVVNFX0lUVF9CVUxJRCBpcyBub3QgZW5hYmxlZCwgVVNFX0lUVF9OT1RJRlkgY2Fubm90IGJlIGVpdGhlci4KKy8vIEJ5IGRlZmluaW5nIHRoZXNlIHdlIGF2b2lkIHVucGxlYXNhbnQgaWZkZWYgdGVzdHMgaW4gbWFueSBwbGFjZXMuCisjIGRlZmluZSBLTVBfRlNZTkNfUFJFUEFSRSggICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQ0FOQ0VMKCAgICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfQUNRVUlSRUQoICBvYmogKSAgICAgICAgKCh2b2lkKTApCisjIGRlZmluZSBLTVBfRlNZTkNfUkVMRUFTSU5HKCBvYmogKSAgICAgICAgKCh2b2lkKTApCisKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgc3BpbiApICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoICBvYmogKSAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKCBvYmogKSAgICAoKHZvaWQpMCkKKworIyBkZWZpbmUgS01QX0lUVF9JR05PUkUoc3RtdCApIGRvIHsgc3RtdCB9IHdoaWxlICgwKQorCisjIGRlZmluZSBVU0VfSVRUX0JVSUxEX0FSRyh4KQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9pdHQuaW5sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZiZjg0OTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX2l0dC5pbmwKQEAgLTAsMCArMSwxMTQ4IEBACisjaWYgVVNFX0lUVF9CVUlMRAorLyoKKyAqIGttcF9pdHQuaW5sIC0tIElubGluZSBmdW5jdGlvbnMgb2YgSVRUIE5vdGlmeS4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLy8gSW5saW5lIGZ1bmN0aW9uIGRlZmluaXRpb25zLiBUaGlzIGZpbGUgc2hvdWxkIGJlIGluY2x1ZGVkIGludG8ga21wX2l0dC5oIGZpbGUgZm9yIHByb2RpY3Rpb24KKy8vIGJ1aWxkICh0byBsZXQgY29tcGxpbGVyIGlubGluZSBmdW5jdGlvbnMpIG9yIGludG8ga21wX2l0dC5jIGZpbGUgZm9yIGRlYnVnIGJ1aWxkICh0byByZWR1Y2UKKy8vIHRoZSBudW1iZXIgb2YgZmlsZXMgdG8gcmVjb21waWxlIGFuZCBzYXZlIGJ1aWxkIHRpbWUpLgorCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisKKyNpZiBLTVBfSVRUX0RFQlVHCisgICAgZXh0ZXJuIGttcF9ib290c3RyYXBfbG9ja190IF9fa21wX2l0dF9kZWJ1Z19sb2NrOworICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2l0dF9kZWJ1Z19sb2NrICk7ICAgICAgXAorICAgIH0KKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCAiIyUwMmQ6ICIsIF9fa21wX2dldF9ndGlkKCkgKTsgICAgICAgICAgICAgIFwKKyAgICAgICAgZnByaW50Ziggc3RkZXJyLCBfX1ZBX0FSR1NfXyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgZmZsdXNoKCBzdGRlcnIgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9pdHRfZGVidWdfbG9jayApOyAgICAgIFwKKyAgICB9CisjZWxzZQorICAgICNkZWZpbmUgS01QX0lUVF9ERUJVR19MT0NLKCkKKyAgICAjZGVmaW5lIEtNUF9JVFRfREVCVUdfUFJJTlQoIC4uLiApCisjZW5kaWYgLy8gS01QX0lUVF9ERUJVRworCisvLyBFbnN1cmUgdGhhdCB0aGUgZnVuY3Rpb25zIGFyZSBzdGF0aWMgaWYgdGhleSdyZSBzdXBwb3NlZCB0byBiZQorLy8gYmVpbmcgaW5saW5lZC4gT3RoZXJ3aXNlIHRoZXkgY2Fubm90IGJlIHVzZWQgaW4gbW9yZSB0aGFuIG9uZSBmaWxlLAorLy8gc2luY2UgdGhlcmUgd2lsbCBiZSBtdWx0aXBsZSBkZWZpbml0aW9ucy4KKyNpZiBLTVBfREVCVUcKKyMgZGVmaW5lIExJTktBR0UKKyNlbHNlCisjIGRlZmluZSBMSU5LQUdFIHN0YXRpYyBpbmxpbmUKKyNlbmRpZgorCisvLyBaQ0EgaW50ZXJmYWNlIHVzZWQgYnkgSW50ZWwoUikgSW5zcGVjdG9yLiBJbnRlbChSKSBQYXJhbGxlbCBBbXBsaWZpZXIgdXNlcyB0aGlzCisvLyBBUEkgdG8gc3VwcG9ydCB1c2VyLWRlZmluZWQgc3luY2hyb25pemF0aW9uIHByaW1pdGl2ZXMsIGJ1dCBkb2VzIG5vdCB1c2UgWkNBOworLy8gaXQgd291bGQgYmUgc2FmZSB0byB0dXJuIHRoaXMgb2ZmIHVudGlsIHdpZGVyIHN1cHBvcnQgYmVjb21lcyBhdmFpbGFibGUuCisjaWYgVVNFX0lUVF9aQ0EKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjICAgaWYgX19JTlRFTF9DT01QSUxFUiA+PSAxMjAwCisjICAgICAgIHVuZGVmIF9faXR0X3N5bmNfYWNxdWlyZWQKKyMgICAgICAgdW5kZWYgX19pdHRfc3luY19yZWxlYXNpbmcKKyMgICAgICAgZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQoYWRkcikgICAgX19ub3RpZnlfemNfaW50cmluc2ljKChjaGFyICopInN5bmNfYWNxdWlyZWQiLCBhZGRyKQorIyAgICAgICBkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikgICBfX25vdGlmeV9pbnRyaW5zaWMoKGNoYXIgKikic3luY19yZWxlYXNpbmciLCBhZGRyKQorIyAgIGVuZGlmCisjZW5kaWYKKyNlbmRpZgorCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgIG1ldGFkYXRhX2xvY2sgPSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIG1ldGFkYXRhX2xvY2sgKTsKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBQYXJhbGxlbCByZWdpb24gcmVwb3J0aW5nLgorCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nIHNob3VsZCBiZSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBvZiBhIHRlYW0uIEV4YWN0IG1vbWVudCBvZgorICAgICAgICAgIGNhbGwgZG9lcyBub3QgbWF0dGVyLCBidXQgaXQgc2hvdWxkIGJlIGNvbXBsZXRlZCBiZWZvcmUgYW55IHRocmVhZCBvZiB0aGlzIHRlYW0gY2FsbHMKKyAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nLgorICAgICAgICAqIF9fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcgc2hvdWxkIGJlIGNhbGxlZCBieSBlYWNoIHRocmVhZCBvZiBhIHRlYW0ganVzdCBiZWZvcmUgZW50ZXJpbmcKKyAgICAgICAgICBwYXJhbGxlbCByZWdpb24gYm9keS4KKyAgICAgICAgKiBfX2ttcF9pdHRfcmVnaW9uX2ZpbmlzaGVkIHNob3VsZCBiZSBjYWxsZWQgYnkgZWFjaCB0aHJlYWQgb2YgYSB0ZWFtIHJpZ2h0IGFmdGVyIHJldHVybmluZworICAgICAgICAgIGZyb20gcGFyYWxsZWwgcmVnaW9uIGJvZHkuCisgICAgICAgICogX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQgc2hvdWxkIGJlIGNhbGxlZCBieSBtYXN0ZXIgdGhyZWFkIG9mIGEgdGVhbSwgYWZ0ZXIgYWxsIHRocmVhZHMKKyAgICAgICAgICBjYWxsZWQgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZC4KKworICAgIE5vdGU6IFRocmVhZCB3YWl0aW5nIGF0IGpvaW4gYmFycmllciAoYWZ0ZXIgX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZCkgY2FuIGV4ZWN1dGUgc29tZSBtb3JlCisgICAgdXNlciBjb2RlIC0tIHN1Y2ggYSB0aHJlYWQgY2FuIGV4ZWN1dGUgdGFza3MuCisKKyAgICBOb3RlOiBUaGUgb3ZlcmhlYWQgb2YgbG9nZ2luZyByZWdpb25fc3RhcnRpbmcgYW5kIHJlZ2lvbl9maW5pc2hlZCBpbiBlYWNoIHRocmVhZCBpcyB0b28gbGFyZ2UsCisgICAgc28gdGhlc2UgY2FsbHMgYXJlIG5vdCB1c2VkLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKCBpbnQgZ3RpZCwgaW50IHRlYW1fc2l6ZSwgaW50IGJhcnJpZXJzICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPiAxKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MpIHsKKyAgICAgICAgLy8gVXNlIHRoZSByZXNlcnZlZF8yIGZpZWxkIHRvIHN0b3JlIHRoZSBpbmRleCB0byB0aGUgcmVnaW9uIGRvbWFpbi4KKyAgICAgICAgLy8gQXNzdW1lIHRoYXQgcmVzZXJ2ZWRfMiBjb250YWlucyB6ZXJvIGluaXRpYWxseS4gIFNpbmNlIHplcm8gaXMgc3BlY2lhbAorICAgICAgICAvLyB2YWx1ZSBoZXJlLCBzdG9yZSB0aGUgaW5kZXggaW50byBkb21haW4gYXJyYXkgaW5jcmVhc2VkIGJ5IDEuCisgICAgICAgIGlmIChsb2MtPnJlc2VydmVkXzIgPT0gMCkgeworICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9yZWdpb25fZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsgICAgICAgICAgICAgICAgICAgICAgLy8gbG9jLT5yZXNlcnZlZF8yIGlzIHN0aWxsIDAKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy9pZiAoIUtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJmxvYy0+cmVzZXJ2ZWRfMiwgMCwgZnJtICsgMSApKSB7CisgICAgICAgICAgICAgICAgLy8gICAgZnJtID0gbG9jLT5yZXNlcnZlZF8yIC0gMTsgICAvLyBnZXQgdmFsdWUgc2F2ZWQgYnkgb3RoZXIgdGhyZWFkIGZvciBzYW1lIGxvYworICAgICAgICAgICAgICAgIC8vfSAvLyBBQzogdGhpcyBibG9jayBpcyB0byByZXBsYWNlIG5leHQgdW5zeW5jaHJvbml6ZWQgbGluZQorCisgICAgICAgICAgICAgICAgLy8gV2UgbmVlZCB0byBzYXZlIGluZGV4ZXMgZm9yIGJvdGggcmVnaW9uIGFuZCBiYXJyaWVyIGZyYW1lcy4gV2UnbGwgdXNlIGxvYy0+cmVzZXJ2ZWRfMgorICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAvLyB0d28gYnl0ZXMuIEl0IGlzIE9LIGJlY2F1c2UgS01QX01BWF9GUkFNRV9ET01BSU5TID0gNTEyLgorICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gc2F2ZSAibmV3IiB2YWx1ZQorCisgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgLy8gdGhhdCB0aGUgdG9vbHMgbW9yZSBvciBsZXNzIHN0YW5kYXJkaXplZCBvbjoKKyAgICAgICAgICAgICAgICAvLyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiPGZ1bmM+JG9tcCRwYXJhbGxlbEBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCB0ZWFtX3NpemUsIHN0cl9sb2MuZmlsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgIGlmKCBiYXJyaWVycyApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZnJtID0gS01QX1RFU1RfVEhFTl9JTkMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChmcm0gPj0gS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAvLyBsb2MtPnJlc2VydmVkXzIgaXMgc3RpbGwgMAorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmYgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyQCVzOiVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgICAgICBsb2MtPnJlc2VydmVkXzIgfD0gKGZybSArIDEpIDw8IDE2OworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9sb2NfZnJlZSggJnN0cl9sb2MgKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIC8vIENoZWNrIGlmIHRlYW0gc2l6ZSB3YXMgY2hhbmdlZC4gVGhlbiBjcmVhdGUgbmV3IHJlZ2lvbiBkb21haW4gZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgIGludCBmcm0gPSAobG9jLT5yZXNlcnZlZF8yICYgMHgwMDAwRkZGRikgLSAxOworICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICBrbXBfc3RyX2xvY190IHN0cl9sb2MgPSBfX2ttcF9zdHJfbG9jX2luaXQoIGxvYy0+cHNvdXJjZSwgMSApOworICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5saW5lLCBzdHJfbG9jLmNvbCk7CisKKyAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl90ZWFtX3NpemVbZnJtXSA9IHRlYW1fc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9iZWdpbl92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbZnJtXSwgTlVMTCk7CisgICAgICAgICAgICB9IGVsc2UgeyAvLyBUZWFtIHNpemUgd2FzIG5vdCBjaGFuZ2VkLiBVc2UgZXhpc3RpbmcgZG9tYWluLgorICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX2JlZ2luX3YzKF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1tmcm1dLCBOVUxMKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gYmVnXSBndGlkPSVkLCBpZHg9JXgsIGxvYzolcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIGxvYyApOworICAgIH0KKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfcmVnaW9uX2ZvcmtpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9mcmFtZV9zdWJtaXQoIGludCBndGlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQsIGludCBpbWJhbGFuY2UsIGlkZW50X3QgKiBsb2MsIGludCB0ZWFtX3NpemUsIGludCByZWdpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggcmVnaW9uICkgeworICAgICAgICBrbXBfdGVhbV90ICogICAgICB0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaW50IHNlcmlhbGl6ZWQgPSAoIHJlZ2lvbiA9PSAyID8gMSA6IDAgKTsKKyAgICAgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgKyBzZXJpYWxpemVkID4gMSkKKyAgICAgICAgeworICAgICAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgICAvL0NoZWNrIHJlZ2lvbiBkb21haW4gaGFzIG5vdCBiZWVuIGNyZWF0ZWQgYmVmb3JlLiBJdCdzIGluZGV4IGlzIHNhdmVkIGluIHRoZSBsb3cgdHdvIGJ5dGVzLgorICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSA9PSAwKSB7CisgICAgICAgICAgICAgaWYgKF9fa21wX3JlZ2lvbl9kb21haW5fY291bnQgPCBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgaW50IGZybSA9IEtNUF9URVNUX1RIRU5fSU5DMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAvLyBnZXQgIm9sZCIgdmFsdWUKKyAgICAgICAgICAgICAgICAgaWYgKGZybSA+PSBLTVBfTUFYX0ZSQU1FX0RPTUFJTlMpIHsKKyAgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoICYgX19rbXBfcmVnaW9uX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAvLyBXZSBuZWVkIHRvIHNhdmUgaW5kZXhlcyBmb3IgYm90aCByZWdpb24gYW5kIGJhcnJpZXIgZnJhbWVzLiBXZSdsbCB1c2UgbG9jLT5yZXNlcnZlZF8yCisgICAgICAgICAgICAgICAgIC8vIGZpZWxkIGJ1dCBwdXQgcmVnaW9uIGluZGV4IHRvIHRoZSBsb3cgdHdvIGJ5dGVzIGFuZCBiYXJyaWVyIGluZGV4ZXMgdG8gdGhlIGhpZ2gKKyAgICAgICAgICAgICAgICAgLy8gdHdvIGJ5dGVzLiBJdCBpcyBPSyBiZWNhdXNlIEtNUF9NQVhfRlJBTUVfRE9NQUlOUyA9IDUxMi4KKyAgICAgICAgICAgICAgICAgbG9jLT5yZXNlcnZlZF8yIHw9IChmcm0gKyAxKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJHBhcmFsbGVsOnRlYW1fc2l6ZUBbZmlsZTpdPGxpbmU+Wzo8Y29sPl0iCisgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmID0gTlVMTDsKKyAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRwYXJhbGxlbDolZEAlczolZDolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MuZnVuYywgdGVhbV9zaXplLCBzdHJfbG9jLmZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0cl9sb2MubGluZSwgc3RyX2xvYy5jb2wpOworCisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fZG9tYWluc1sgZnJtIF0gPSBfX2l0dF9kb21haW5fY3JlYXRlKCBidWZmICk7CisgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworCisgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gPSB0ZWFtX3NpemU7CisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfSBlbHNlIHsgLy8gUmVnaW9uIGRvbWFpbiBleGlzdHMgZm9yIHRoaXMgbG9jYXRpb24KKyAgICAgICAgICAgICAvLyBDaGVjayBpZiB0ZWFtIHNpemUgd2FzIGNoYW5nZWQuIFRoZW4gY3JlYXRlIG5ldyByZWdpb24gZG9tYWluIGZvciB0aGlzIGxvY2F0aW9uCisgICAgICAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgICAgICAgaWYoIF9fa21wX2l0dF9yZWdpb25fdGVhbV9zaXplW2ZybV0gIT0gdGVhbV9zaXplICkgeworICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAgICAgICAgICAgICAgIGJ1ZmYgPSBfX2ttcF9zdHJfZm9ybWF0KCIlcyRvbXAkcGFyYWxsZWw6JWRAJXM6JWQ6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmxpbmUsIHN0cl9sb2MuY29sKTsKKworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdID0gX19pdHRfZG9tYWluX2NyZWF0ZSggYnVmZiApOworICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKworICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX3RlYW1fc2l6ZVtmcm1dID0gdGVhbV9zaXplOworICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zWyBmcm0gXSwgTlVMTCwgYmVnaW4sIGVuZCApOworICAgICAgICAgICAgIH0gZWxzZSB7IC8vIFRlYW0gc2l6ZSB3YXMgbm90IGNoYW5nZWQuIFVzZSBleGlzdGluZyBkb21haW4uCisgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfcmVnaW9uX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgfQorICAgICAgICAgfQorICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3JlZyBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgcmVnaW9uOiVkLCBsb2M6JXAsIGJlZzolbGx1LCBlbmQ6JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jLT5yZXNlcnZlZF8yLCByZWdpb24sIGxvYywgYmVnaW4sIGVuZCApOworICAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7IC8vIGNhbGxlZCBmb3IgYmFycmllciByZXBvcnRpbmcKKyAgICAgICAgaWYgKGxvYykgeworICAgICAgICAgICAgaWYgKChsb2MtPnJlc2VydmVkXzIgJiAweEZGRkYwMDAwKSA9PSAwKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50IDwgS01QX01BWF9GUkFNRV9ET01BSU5TKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBmcm0gPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAmIF9fa21wX2JhcnJpZXJfZG9tYWluX2NvdW50ICk7IC8vIGdldCAib2xkIiB2YWx1ZQorICAgICAgICAgICAgICAgICAgICBpZiAoZnJtID49IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMiggJiBfX2ttcF9iYXJyaWVyX2RvbWFpbl9jb3VudCApOyAgICAgICAvLyByZXZlcnQgdGhlIGNvdW50CisgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47ICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYy0+cmVzZXJ2ZWRfMiBpcyBzdGlsbCAwCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgLy8gU2F2ZSB0aGUgYmFycmllciBmcmFtZSBpbmRleCB0byB0aGUgaGlnaCB0d28gYnl0ZXMuCisgICAgICAgICAgICAgICAgICAgIGxvYy0+cmVzZXJ2ZWRfMiB8PSAoZnJtICsgMSkgPDwgMTY7ICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBzYXZlICJuZXciIHZhbHVlCisKKyAgICAgICAgICAgICAgICAgICAgLy8gVHJhbnNmb3JtIGNvbXBpbGVyLWdlbmVyYXRlZCByZWdpb24gbG9jYXRpb24gaW50byB0aGUgZm9ybWF0CisgICAgICAgICAgICAgICAgICAgIC8vIHRoYXQgdGhlIHRvb2xzIG1vcmUgb3IgbGVzcyBzdGFuZGFyZGl6ZWQgb246CisgICAgICAgICAgICAgICAgICAgIC8vICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICI8ZnVuYz4kb21wJGZyYW1lQFtmaWxlOl08bGluZT5bOjxjb2w+XSIKKyAgICAgICAgICAgICAgICAgICAga21wX3N0cl9sb2NfdCBzdHJfbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBsb2MtPnBzb3VyY2UsIDEgKTsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmX2ltYiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmX2ltYiA9IF9fa21wX3N0cl9mb3JtYXQoIiVzJG9tcCRiYXJyaWVyLWltYmFsYW5jZTolZEAlczolZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdHJfbG9jLmZ1bmMsIHRlYW1fc2l6ZSwgc3RyX2xvYy5maWxlLCBzdHJfbG9jLmNvbCk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wdXNoKF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfaXR0X2ltYmFsYW5jZV9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9zdXBwcmVzc19wb3AoKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhfX2ttcF9pdHRfaW1iYWxhbmNlX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmZfaW1iICk7CisgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICogYnVmZiA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgiJXMkb21wJGJhcnJpZXJAJXM6JWQiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RyX2xvYy5mdW5jLCBzdHJfbG9jLmZpbGUsIHN0cl9sb2MuY29sKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pdHRfYmFycmllcl9kb21haW5zWyBmcm0gXSA9IF9faXR0X2RvbWFpbl9jcmVhdGUoIGJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9iYXJyaWVyX2RvbWFpbnNbIGZybSBdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICZzdHJfbG9jICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfSBlbHNlIHsgLy8gaWYgaXQgaXMgbm90IDAgdGhlbiBpdCBzaG91bGQgYmUgPD0gS01QX01BWF9GUkFNRV9ET01BSU5TCisgICAgICAgICAgICAgICAgaWYoIGltYmFsYW5jZSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfZnJhbWVfc3VibWl0X3YzKF9fa21wX2l0dF9pbWJhbGFuY2VfZG9tYWluc1sgKGxvYy0+cmVzZXJ2ZWRfMiA+PiAxNikgLSAxIF0sIE5VTEwsIGJlZ2luLCBlbmQgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2l0dF9mcmFtZV9zdWJtaXRfdjMoX19rbXBfaXR0X2JhcnJpZXJfZG9tYWluc1sobG9jLT5yZXNlcnZlZF8yID4+IDE2KSAtIDFdLCBOVUxMLCBiZWdpbiwgZW5kICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2ZybSBzdWJdIGd0aWQ9JWQsIGlkeD0leCwgbG9jOiVwLCBiZWc6JWxsdSwgZW5kOiVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGxvYy0+cmVzZXJ2ZWRfMiwgbG9jLCBiZWdpbiwgZW5kICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2ZyYW1lX3N1Ym1pdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZSggaW50IGd0aWQsIGttcF91aW50NjQgYmVnaW4sIGttcF91aW50NjQgZW5kLCBrbXBfdWludDY0IGltYmFsYW5jZSwga21wX3VpbnQ2NCByZWR1Y3Rpb24gKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgICAgIGlmKCBtZXRhZGF0YV9kb21haW4gPT0gTlVMTCkgeworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcHVzaChfX2l0dF9zdXBwcmVzc19tZW1vcnlfZXJyb3JzKTsKKyAgICAgICAgICAgIG1ldGFkYXRhX2RvbWFpbiA9IF9faXR0X2RvbWFpbl9jcmVhdGUoICJPTVAgTWV0YWRhdGEiICk7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX2ltYmwgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9pbWJhbGFuY2UiKTsKKyAgICAgICAgICAgIHN0cmluZ19oYW5kbGVfbG9vcCA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX2xvb3AiKTsKKyAgICAgICAgICAgIHN0cmluZ19oYW5kbGVfc25nbCA9IF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKCAib21wX21ldGFkYXRhX3NpbmdsZSIpOworICAgICAgICAgICAgX19pdHRfc3VwcHJlc3NfcG9wKCk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBtZXRhZGF0YV9sb2NrICk7CisgICAgfQorCisgICAga21wX3VpbnQ2NCBpbWJhbGFuY2VfZGF0YVsgNCBdOworICAgIGltYmFsYW5jZV9kYXRhWyAwIF0gPSBiZWdpbjsKKyAgICBpbWJhbGFuY2VfZGF0YVsgMSBdID0gZW5kOworICAgIGltYmFsYW5jZV9kYXRhWyAyIF0gPSBpbWJhbGFuY2U7CisgICAgaW1iYWxhbmNlX2RhdGFbIDMgXSA9IHJlZHVjdGlvbjsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGVfaW1ibCwgX19pdHRfbWV0YWRhdGFfdTY0LCA0LCBpbWJhbGFuY2VfZGF0YSk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X21ldGFkYXRhX2ltYmFsYW5jZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X21ldGFkYXRhX2xvb3AoIGlkZW50X3QgKiBsb2MsIGttcF91aW50NjQgc2NoZWRfdHlwZSwga21wX3VpbnQ2NCBpdGVyYXRpb25zLCBrbXBfdWludDY0IGNodW5rICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9pbWJsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfaW1iYWxhbmNlIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX2xvb3AgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX3NuZ2wgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIC8vIFBhcnNlIGxpbmUgYW5kIGNvbHVtbiBmcm9tIHBzb3VyY2Ugc3RyaW5nOiAiO2ZpbGU7ZnVuYztsaW5lO2NvbDs7IgorICAgIGNoYXIgKiBzX2xpbmU7CisgICAgY2hhciAqIHNfY29sOworICAgIEtNUF9ERUJVR19BU1NFUlQobG9jLT5wc291cmNlKTsKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIHNfbGluZSA9IHN0cmNocigoY2hhciopbG9jLT5wc291cmNlLCAnOycpOworI2Vsc2UKKyAgICBzX2xpbmUgPSBzdHJjaHIobG9jLT5wc291cmNlLCAnOycpOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVChzX2xpbmUpOworICAgIHNfbGluZSA9IHN0cmNocihzX2xpbmUgKyAxLCAnOycpOyAgIC8vIDItbmQgc2VtaWNvbG9uCisgICAgS01QX0RFQlVHX0FTU0VSVChzX2xpbmUpOworICAgIHNfbGluZSA9IHN0cmNocihzX2xpbmUgKyAxLCAnOycpOyAgIC8vIDMtcmQgc2VtaWNvbG9uCisgICAgS01QX0RFQlVHX0FTU0VSVChzX2xpbmUpOworICAgIHNfY29sID0gc3RyY2hyKHNfbGluZSArIDEsICc7Jyk7ICAgIC8vIDQtdGggc2VtaWNvbG9uCisgICAgS01QX0RFQlVHX0FTU0VSVChzX2NvbCk7CisKKyAgICBrbXBfdWludDY0IGxvb3BfZGF0YVsgNSBdOworICAgIGxvb3BfZGF0YVsgMCBdID0gYXRvaShzX2xpbmUgKyAxKTsgLy8gcmVhZCBsaW5lCisgICAgbG9vcF9kYXRhWyAxIF0gPSBhdG9pKHNfY29sICsgMSk7ICAvLyByZWFkIGNvbHVtbgorICAgIGxvb3BfZGF0YVsgMiBdID0gc2NoZWRfdHlwZTsKKyAgICBsb29wX2RhdGFbIDMgXSA9IGl0ZXJhdGlvbnM7CisgICAgbG9vcF9kYXRhWyA0IF0gPSBjaHVuazsKKworICAgIF9faXR0X21ldGFkYXRhX2FkZChtZXRhZGF0YV9kb21haW4sIF9faXR0X251bGwsIHN0cmluZ19oYW5kbGVfbG9vcCwgX19pdHRfbWV0YWRhdGFfdTY0LCA1LCBsb29wX2RhdGEpOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9tZXRhZGF0YV9sb29wCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCBpZGVudF90ICogbG9jICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYoIG1ldGFkYXRhX2RvbWFpbiA9PSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgICAgICBpZiggbWV0YWRhdGFfZG9tYWluID09IE5VTEwpIHsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3B1c2goX19pdHRfc3VwcHJlc3NfbWVtb3J5X2Vycm9ycyk7CisgICAgICAgICAgICBtZXRhZGF0YV9kb21haW4gPSBfX2l0dF9kb21haW5fY3JlYXRlKCAiT01QIE1ldGFkYXRhIiApOworICAgICAgICAgICAgc3RyaW5nX2hhbmRsZV9pbWJsID0gX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUoICJvbXBfbWV0YWRhdGFfaW1iYWxhbmNlIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX2xvb3AgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9sb29wIik7CisgICAgICAgICAgICBzdHJpbmdfaGFuZGxlX3NuZ2wgPSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSggIm9tcF9tZXRhZGF0YV9zaW5nbGUiKTsKKyAgICAgICAgICAgIF9faXR0X3N1cHByZXNzX3BvcCgpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgbWV0YWRhdGFfbG9jayApOworICAgIH0KKworICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAxICk7CisgICAga21wX3VpbnQ2NCBzaW5nbGVfZGF0YVsgMiBdOworICAgIHNpbmdsZV9kYXRhWyAwIF0gPSBzdHJfbG9jLmxpbmU7CisgICAgc2luZ2xlX2RhdGFbIDEgXSA9IHN0cl9sb2MuY29sOworCisgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyApOworCisgICAgX19pdHRfbWV0YWRhdGFfYWRkKG1ldGFkYXRhX2RvbWFpbiwgX19pdHRfbnVsbCwgc3RyaW5nX2hhbmRsZV9zbmdsLCBfX2l0dF9tZXRhZGF0YV91NjQsIDIsIHNpbmdsZV9kYXRhKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworTElOS0FHRSB2b2lkCitfX2ttcF9pdHRfcmVnaW9uX3N0YXJ0aW5nKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fc3RhcnRpbmcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitMSU5LQUdFIHZvaWQKK19fa21wX2l0dF9yZWdpb25fZmluaXNoZWQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3JlZ2lvbl9maW5pc2hlZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0xJTktBR0Ugdm9pZAorX19rbXBfaXR0X3JlZ2lvbl9qb2luZWQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX3RlYW1fdCAqICAgICAgdGVhbSA9IF9fa21wX3RlYW1fZnJvbV9ndGlkKCBndGlkICk7CisgICAgaWYgKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPiAxKQorICAgIHsKKyAgICAgICAgLy8gVGhlIGZyYW1lIG5vdGlmaWNhdGlvbnMgYXJlIG9ubHkgc3VwcG9ydGVkIGZvciB0aGUgb3V0ZXJtb3N0IHRlYW1zLgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlkZW50X3QgKiAgICAgICAgIGxvYyAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2lkZW50OworICAgIGlmIChsb2MgJiYgbG9jLT5yZXNlcnZlZF8yKQorICAgIHsKKyAgICAgICAgaW50IGZybSA9IChsb2MtPnJlc2VydmVkXzIgJiAweDAwMDBGRkZGKSAtIDE7CisgICAgICAgIGlmKGZybSA8IEtNUF9NQVhfRlJBTUVfRE9NQUlOUykgeworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBfX2l0dF9mcmFtZV9lbmRfdjMoX19rbXBfaXR0X3JlZ2lvbl9kb21haW5zW2ZybV0sIE5VTEwpOworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltmcm0gZW5kXSBndGlkPSVkLCBpZHg9JXgsIGxvYzolcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBsb2MtPnJlc2VydmVkXzIsIGxvYyApOworICAgICAgICB9CisgICAgfQorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9yZWdpb25fam9pbmVkCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgQmFycmllcnMgcmVwb3J0aW5nLgorCisgICAgQSBiYXJyaWVyIGNvbnNpc3RzIG9mIHR3byBwaGFzZXM6CisKKyAgICAgICAgMS4gR2F0aGVyIC0tIG1hc3RlciB3YWl0cyBmb3IgYXJyaXZpbmcgb2YgYWxsIHRoZSB3b3JrZXIgdGhyZWFkczsgZWFjaCB3b3JrZXIgdGhyZWFkCisgICAgICAgICAgIHJlZ2lzdGVycyBhcnJpdmFsIGFuZCBnb2VzIGZ1cnRoZXIuCisgICAgICAgIDIuIFJlbGVhc2UgLS0gZWFjaCB3b3JrZXIgdGhyZWFkcyB3YWl0cyB1bnRpbCBtYXN0ZXIgbGV0cyBpdCBnbzsgbWFzdGVyIGxldHMgd29ya2VyIHRocmVhZHMKKyAgICAgICAgICAgZ28uCisKKyAgICBGdW5jdGlvbiBzaG91bGQgYmUgY2FsbGVkIGJ5IGVhY2ggdGhyZWFkOgorCisgICAgICAgICogX19rbXBfaXR0X2JhcnJpZXJfc3RhcnRpbmcoKSAtLSBiZWZvcmUgYXJyaXZpbmcgdG8gdGhlIGdhdGhlciBwaGFzZS4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9taWRkbGUoKSAgIC0tIGJldHdlZW4gZ2F0aGVyIGFuZCByZWxlYXNlIHBoYXNlcy4KKyAgICAgICAgKiBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZCgpIC0tIGFmdGVyIHJlbGVhc2UgcGhhc2UuCisKKyAgICBOb3RlOiBDYWxsIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpIGJlZm9yZSBjYWxsIHRvIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCkgYW5kIHNhdmUKKyAgICByZXN1bHQgaW4gbG9jYWwgdmFyaWFibGUuIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdCgpLCBiZWluZyBjYWxsZWQgdG9vIGxhdGUgKGUuIGcuIGFmdGVyIGdhdGhlcgorICAgIHBoYXNlKSB3b3VsZCByZXR1cm4gaXR0IHN5bmMgb2JqZWN0IGZvciB0aGUgbmV4dCBiYXJyaWVyIQorCisgICAgSVRUIG5lZWQgYW4gYWRkcmVzcyAodm9pZCAqKSB0byBiZSBzcGVjaWZpZWQgYXMgYSBzeW5jIG9iamVjdC4gT3Blbk1QIFJUTCBkb2VzIG5vdCBoYXZlCisgICAgYmFycmllciBvYmplY3Qgb3IgYmFycmllciBkYXRhIHN0cnVjdHVyZS4gQmFycmllciBpcyBqdXN0IGEgY291bnRlciBpbiB0ZWFtIGFuZCB0aHJlYWQKKyAgICBzdHJ1Y3R1cmVzLiBXZSBjb3VsZCB1c2UgYW4gYWRkcmVzcyBvZiB0ZWFtIHN0cnVjdHVyZSBhcyBhbiBiYXJyaWVyIHN5bmMgb2JqZWN0LCBidXQgSVRUIHdhbnRzCisgICAgZGlmZmVyZW50IG9iamVjdHMgZm9yIGRpZmZlcmVudCBiYXJyaWVycyAoZXZlbiB3aGl0aGluIHRoZSBzYW1lIHRlYW0pLiBTbyBsZXQgdXMgdXNlCisgICAgdGVhbSBhZGRyZXNzIGFzIGJhcnJpZXIgc3luYyBvYmplY3QgZm9yIHRoZSBmaXJzdCBiYXJyaWVyLCB0aGVuIGluY3JlYXNlIGl0IGJ5IG9uZSBmb3IgdGhlIG5leHQKKyAgICBiYXJyaWVyLCBhbmQgc28gb24gKGJ1dCB3cmFwIGl0IG5vdCB0byB1c2UgYWRkcmVzc2VzIG91dHNpZGUgb2YgdGVhbSBzdHJ1Y3R1cmUpLgorCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkICoKK19fa21wX2l0dF9iYXJyaWVyX29iamVjdCgKKyAgICBpbnQgIGd0aWQsCisgICAgaW50ICBidCwKKyAgICBpbnQgIHNldF9uYW1lLAorICAgIGludCAgZGVsdGEgICAgLy8gMCAoY3VycmVudCBiYXJyaWVyKSBpcyBkZWZhdWx0IHZhbHVlOyBzcGVjaWZ5IC0xIHRvIGdldCBwcmV2aW91cyBiYXJyaWVyLgorKSB7CisgICAgdm9pZCAqIG9iamVjdCA9IE5VTEw7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBrbXBfaW5mb190ICogICAgdGhyICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGVhbV90ICogICAgdGVhbSA9IHRoci0+dGgudGhfdGVhbTsKKworICAgIC8vIE5PVEU6CisgICAgLy8gSWYgdGhlIGZ1bmN0aW9uIGlzIGNhbGxlZCBmcm9tIF9fa21wX2ZvcmtfYmFycmllciwgdGVhbSBwb2ludGVyIGNhbiBiZSBOVUxMLiBUaGlzICJpZiIKKyAgICAvLyBoZWxwcyB0byBhdm9pZCBjcmFzaC4gSG93ZXZlciwgdGhpcyBpcyBub3QgY29tcGxldGUgc29sdXRpb24sIGFuZCByZXBvcnRpbmcgZm9yay9qb2luCisgICAgLy8gYmFycmllcnMgdG8gSVRUIHNob3VsZCBiZSByZXZpc2l0ZWQuCisKKyAgICBpZiAoIHRlYW0gIT0gTlVMTCApIHsKKworICAgICAgICAvLyBNYXN0ZXIgdGhyZWFkIGluY3JlYXNlcyBiX2Fycml2ZWQgYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCBlYWNoIHRpbWUuIERpdmlkZSBiX2Fycml2ZWQKKyAgICAgICAgLy8gYnkgS01QX0JBUlJJRVJfU1RBVEVfQlVNUCB0byBnZXQgcGxhaW4gYmFycmllciBjb3VudGVyLgorICAgICAgICBrbXBfdWludDY0IGNvdW50ZXIgPSB0ZWFtLT50LnRfYmFyWyBidCBdLmJfYXJyaXZlZCAvIEtNUF9CQVJSSUVSX1NUQVRFX0JVTVAgKyBkZWx0YTsKKyAgICAgICAgLy8gTm93IGZvcm0gdGhlIGJhcnJpZXIgaWQuIEVuY29kZSBiYXJyaWVyIHR5cGUgKGJ0KSBpbiBiYXJyaWVyIGlkIHRvbywgc28gYmFycmllcnMgb2YKKyAgICAgICAgLy8gZGlmZmVyZW50IHR5cGVzIGRvIG5vdCBoYXZlIHRoZSBzYW1lIGlkcy4KKyAgICAgICAgS01QX0JVSUxEX0FTU0VSVCggc2l6ZW9mKCBrbXBfdGVhbV90ICkgPj0gYnNfbGFzdF9iYXJyaWVyICk7CisgICAgICAgICAgICAvLyBUaGlzIGNvbmRpdG9uIGlzIGEgbXVzdCAod2Ugd291bGQgaGF2ZSB6ZXJvIGRpdmlkZSBvdGhlcndpc2UpLgorICAgICAgICBLTVBfQlVJTERfQVNTRVJUKCBzaXplb2YoIGttcF90ZWFtX3QgKSA+PSAyICogYnNfbGFzdF9iYXJyaWVyICk7CisgICAgICAgICAgICAvLyBNb3JlIHN0cm9uZyBjb25kaXRpb246IG1ha2Ugc3VyZSB3ZSBoYXZlIHJvb20gYXQgbGVhc3QgZm9yIGZvciB0d28gZGlmZmVydGVudCBpZHMKKyAgICAgICAgICAgIC8vIChmb3IgZWFjaCBiYXJyaWVyIHR5cGUpLgorICAgICAgICBvYmplY3QgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgdm9pZCAqID4oCisgICAgICAgICAgICAgICAga21wX3VpbnRwdHJfdCggdGVhbSApCisgICAgICAgICAgICAgICAgICAgICsgY291bnRlciAlICggc2l6ZW9mKCBrbXBfdGVhbV90ICkgLyBic19sYXN0X2JhcnJpZXIgKSAqIGJzX2xhc3RfYmFycmllcgorICAgICAgICAgICAgICAgICAgICArIGJ0CisgICAgICAgICAgICApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgb2JqXSB0eXBlPSVkLCBjb3VudGVyPSVsbGQsIG9iamVjdD0lcFxuIiwgYnQsIGNvdW50ZXIsIG9iamVjdCApOworCisgICAgICAgIGlmICggc2V0X25hbWUgKSB7CisgICAgICAgICAgICBpZGVudF90IGNvbnN0ICogbG9jICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogICAgdHlwZSA9ICJPTVAgQmFycmllciI7CisgICAgICAgICAgICBzd2l0Y2ggKCBidCApIHsKKyAgICAgICAgICAgICAgICBjYXNlIGJzX3BsYWluX2JhcnJpZXIgOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIEZvciBwbGFpbiBiYXJyaWVyIGNvbXBpbGVyIGNhbGxzIF9fa21wY19iYXJyaWVyKCkgZnVuY3Rpb24sIHdoaWNoIHNhdmVzCisgICAgICAgICAgICAgICAgICAgIC8vIGxvY2F0aW9uIGluIHRoci0+dGgudGhfaWRlbnQuCisgICAgICAgICAgICAgICAgICAgIGxvYyA9IHRoci0+dGgudGhfaWRlbnQ7CisgICAgICAgICAgICAgICAgICAgIC8vIEdldCB0aGUgYmFycmllciB0eXBlIGZyb20gZmxhZ3MgcHJvdmlkZWQgYnkgY29tcGlsZXIuCisgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAgIGV4cGwgPSAwOworICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICBpbXBsID0gMDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2MgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgICAgICBleHBsID0gKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfRVhQTCApICE9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpbXBsID0gKCBsb2MtPmZsYWdzICYgS01QX0lERU5UX0JBUlJJRVJfSU1QTCApICE9IDA7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIGlmICggaW1wbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHN3aXRjaCAoIGxvYy0+ZmxhZ3MgJiBLTVBfSURFTlRfQkFSUklFUl9JTVBMX01BU0sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX0ZPUiA6IHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgRm9yIEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBLTVBfSURFTlRfQkFSUklFUl9JTVBMX1NFQ1RJT05TIDogeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0eXBlID0gIk9NUCBTZWN0aW9ucyBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9TSU5HTEUgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFNpbmdsZSBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgS01QX0lERU5UX0JBUlJJRVJfSU1QTF9XT1JLU0hBUkUgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIFdvcmtzaGFyZSBCYXJyaWVyIjsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEltcGxpY2l0IEJhcnJpZXIiOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8qIHN3aXRjaCAqLworICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCBleHBsICkgeworICAgICAgICAgICAgICAgICAgICAgICAgdHlwZSA9ICJPTVAgRXhwbGljaXQgQmFycmllciI7CisgICAgICAgICAgICAgICAgICAgIH07IC8qIGlmICovCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIGJzX2Zvcmtqb2luX2JhcnJpZXIgOiB7CisgICAgICAgICAgICAgICAgICAgIC8vIEluIGNhc2Ugb2YgZm9yay9qb2luIGJhcnJpZXIgd2UgY2FuIHJlYWQgdGhyLT50aC50aF9pZGVudCwgYmVjYXVzZSBpdAorICAgICAgICAgICAgICAgICAgICAvLyBjb250YWlucyBsb2NhdGlvbiBvZiBsYXN0IHBhc3NlZCBjb25zdHJ1Y3QgKHdoaWxlIGpvaW4gYmFycmllciBpcyBub3QKKyAgICAgICAgICAgICAgICAgICAgLy8gc3VjaCBvbmUpLiBVc2UgdGhfaWRlbnQgb2YgbWFzdGVyIHRocmVhZCBpbnN0ZWFkIC0tIF9fa21wX2pvaW5fY2FsbCgpCisgICAgICAgICAgICAgICAgICAgIC8vIGNhbGxlZCBieSB0aGUgbWFzdGVyIHRocmVhZCBzYXZlcyBsb2NhdGlvbi4KKyAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAgICAgLy8gQUM6IGNhbm5vdCByZWFkIGZyb20gbWFzdGVyIGJlY2F1c2UgX19rbXBfam9pbl9jYWxsIG1heSBiZSBub3QgY2FsbGVkCisgICAgICAgICAgICAgICAgICAgIC8vICAgIHlldCwgc28gd2UgcmVhZCB0aGUgbG9jYXRpb24gZnJvbSB0ZWFtLiBUaGlzIGlzIHRoZSBzYW1lIGxvY2F0aW9uLgorICAgICAgICAgICAgICAgICAgICAvLyAgICBBbmQgdGVhbSBpcyB2YWxpZCBhdCB0aGUgZW50ZXIgdG8gam9pbiBiYXJyaWVyIHdoZXJlIHRoaXMgaGFwcGVucy4KKyAgICAgICAgICAgICAgICAgICAgbG9jICA9IHRlYW0tPnQudF9pZGVudDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBsb2MgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNyYyAgPSBsb2MtPnBzb3VyY2U7CisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHR5cGUgPSAiT01QIEpvaW4gQmFycmllciI7CisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIH07IC8vIHN3aXRjaAorICAgICAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2NyZWF0ZSggb2JqZWN0LCB0eXBlLCBzcmMsIF9faXR0X2F0dHJfYmFycmllciApOworICAgICAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgc3RhXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIF9faXR0X2F0dHJfYmFycmllciApXG4iLCBvYmplY3QsIHR5cGUsIHNyYyApOworICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgIHJldHVybiBvYmplY3Q7Cit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX29iamVjdAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggIUtNUF9NQVNURVJfR1RJRCggZ3RpZCApICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIG9iamVjdCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNyZWwoICVwIClcbiIsIG9iamVjdCApOworICAgIH07IC8vIGlmCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2JhciBzdGFdIHNwcmUoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9iYXJyaWVyX3N0YXJ0aW5nCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlKCBpbnQgZ3RpZCwgdm9pZCAqIG9iamVjdCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggS01QX01BU1RFUl9HVElEKCBndGlkICkgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgbWlkXSBzYWNxKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBvYmplY3QgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltiYXIgbWlkXSBzcmVsKCAlcCApXG4iLCBvYmplY3QgKTsKKyAgICB9IGVsc2UgeworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2JhcnJpZXJfbWlkZGxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19rbXBfaXR0X2JhcnJpZXJfZmluaXNoZWQoIGludCBndGlkLCB2b2lkICogb2JqZWN0ICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBLTVBfTUFTVEVSX0dUSUQoIGd0aWQgKSApIHsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbYmFyIGVuZF0gc2FjcSggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfYmFycmllcl9maW5pc2hlZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFRhc2t3YWl0IHJlcG9ydGluZy4KKworICAgIElUVCBuZWVkIGFuIGFkZHJlc3MgKHZvaWQgKikgdG8gYmUgc3BlY2lmaWVkIGFzIGEgc3luYyBvYmplY3QuIE9wZW5NUCBSVEwgZG9lcyBub3QgaGF2ZSB0YXNrd2FpdAorICAgIHN0cnVjdHVyZSwgc28gd2UgbmVlZCB0byBjb25zdHJ1Y3Qgc29tZXRoaW5nLgorCisqLworCit2b2lkICoKK19fa21wX2l0dF90YXNrd2FpdF9vYmplY3QoIGludCBndGlkICkgeworICAgIHZvaWQgKiBvYmplY3QgPSBOVUxMOworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKiAgICAgdGhyZWFkICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSB0aHJlYWQgLT4gdGgudGhfY3VycmVudF90YXNrOworICAgICAgICBvYmplY3QgPQorICAgICAgICAgICAgcmVpbnRlcnByZXRfY2FzdDwgdm9pZCAqID4oCisgICAgICAgICAgICAgICAga21wX3VpbnRwdHJfdCggdGFza2RhdGEgKSArIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICUgc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApCisgICAgICAgICAgICApOworICAgIH07IC8vIGlmCisjZW5kaWYKKyAgICByZXR1cm4gb2JqZWN0OworfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfb2JqZWN0CisKK3ZvaWQKK19fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZygKKyAgICBpbnQgICAgIGd0aWQsCisgICAgdm9pZCAqICBvYmplY3QKKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAga21wX2luZm9fdCAqICAgICB0aHJlYWQgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICBpZGVudF90IGNvbnN0ICogIGxvYyAgICAgID0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X2lkZW50OworICAgIGNoYXIgY29uc3QgKiAgICAgc3JjICAgICAgPSAoIGxvYyA9PSBOVUxMPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgIk9NUCBUYXNrd2FpdCIsIHNyYywgMCApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHdhIHN0YV0gc2NyZSggJXAsIFwiT01QIFRhc2t3YWl0XCIsIFwiJXNcIiwgMCApXG4iLCBvYmplY3QsIHNyYyApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2Egc3RhXSBzcHJlKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfc3RhcnRpbmcKKwordm9pZAorX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKAorICAgIGludCAgICAgZ3RpZCwKKyAgICB2b2lkICogIG9iamVjdAorKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3R3YSBlbmRdIHNhY3EoICVwIClcbiIsIG9iamVjdCApOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X3N5bmNfZGVzdHJveSggb2JqZWN0ICk7CisgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0d2EgZW5kXSBzZGVzKCAlcCApXG4iLCBvYmplY3QgKTsKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUYXNrIHJlcG9ydGluZy4KKworICAgIE9ubHkgdGhvc2UgdGFza3MgYXJlIHJlcG9ydGVkIHdoaWNoIGFyZSBleGVjdXRlZCBieSBhIHRocmVhZCBzcGlubmluZyBhdCBiYXJyaWVyIChvciB0YXNrd2FpdCkuCisgICAgU3luY2ggb2JqZWN0IHBhc3NlZCB0byB0aGUgZnVuY3Rpb24gbXVzdCBiZSBiYXJyaWVyIG9mIHRhc2t3YWl0IHRoZSB0aHJlYWRzIHdhaXRpbmcgYXQuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfdGFza19zdGFydGluZygKKyAgICB2b2lkICogb2JqZWN0ICAgICAvLyBJVFQgc3luYyBvYmplY3Q6IGJhcnJpZXIgb3IgdGFza3dhaXQuCispIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggb2JqZWN0ICE9IE5VTEwgKSB7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF9zeW5jX2NhbmNlbCggb2JqZWN0ICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbdHNrIHN0YV0gc2NhbiggJXAgKVxuIiwgb2JqZWN0ICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfdGFza19zdGFydGluZworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3ZvaWQKK19fa21wX2l0dF90YXNrX2ZpbmlzaGVkKAorICAgIHZvaWQgKiBvYmplY3QgICAgIC8vIElUVCBzeW5jIG9iamVjdDogYmFycmllciBvciB0YXNrd2FpdC4KKykgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19wcmVwYXJlKCBvYmplY3QgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3RzayBlbmRdIHNwcmUoICVwIClcbiIsIG9iamVjdCApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF90YXNrX2ZpbmlzaGVkCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBMb2NrIHJlcG9ydGluZy4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nKCBsb2NrICkgc2hvdWxkIGJlIGNhbGxlZCAqYmVmb3JlKiB0aGUgZmlyc3QgbG9jayBvcGVyYXRpb24KKyAgICAgICAgICAoc2V0L3Vuc2V0KS4gSXQgaXMgbm90IGEgcmVhbCBldmVudCBzaG93biB0byB0aGUgdXNlciBidXQganVzdCBzZXR0aW5nIGEgbmFtZSBmb3IKKyAgICAgICAgICBzeW5jaHJvbml6YXRpb24gb2JqZWN0LiBgbG9jaycgaXMgYW4gYWRkcmVzcyBvZiBzeW5jIG9iamVjdCwgdGhlIHNhbWUgYWRkcmVzcyBzaG91bGQgYmUKKyAgICAgICAgICB1c2VkIGluIGFsbCBzdWJzZXF1ZW50IGNhbGxzLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCkgc2hvdWxkIGJlIGNhbGxlZCBiZWZvcmUgc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2FjcXVpcmVkKCkgc2hvdWxkIGJlIGNhbGxlZCBhZnRlciBzZXR0aW5nIHRoZSBsb2NrLgorCisgICAgICAgICogX19rbXBfaXR0X2xvY2tfcmVhbGVhc2luZygpIHNob3VsZCBiZSBjYWxsZWQgYmVmb3JlIHVuc2V0dGluZyB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgpIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhyZWFkIGNhbmNlbGxlZCB3YWl0aW5nIGZvciB0aGUgbG9jay4KKworICAgICAgICAqIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZCggbG9jayApIHNob3VsZCBiZSBjYWxsZWQgYWZ0ZXIgdGhlIGxhc3QgbG9jayBvcGVyYXRpb24uIEFmdGVyCisgICAgICAgICAgX19rbXBfaXR0X2xvY2tfZGVzdHJveWVkKCkgYWxsIHRoZSByZWZlcmVuY2VzIHRvIHRoZSBzYW1lIGFkZHJlc3Mgd2lsbCBiZSBjb25zaWRlcmVkCisgICAgICAgICAgYXMgYW5vdGhlciBzeW5jIG9iamVjdCwgbm90IHJlbGF0ZWQgd2l0aCB0aGUgb3JpZ2luYWwgb25lLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKy8vIFRha2VzIGxvY2F0aW9uIGluZm9ybWF0aW9uIGRpcmVjdGx5CitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19pbml0KCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqdHlwZSwgY29uc3QgaWRlbnRfdCAqbG9jICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiAgICBzcmMgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3luY19jcmVhdGUoIGxvY2ssIHR5cGUsIHNyYywgMCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBpbmldIHNjcmUoICVwLCBcIiVzXCIsIFwiJXNcIiwgMCApXG4iLCBsb2NrLCB0eXBlLCBzcmMgKTsKKyAgICB9CisjZW5kaWYKK30KKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisvLyBJbnRlcm5hbCBndXRzIC0tIGNvbW1vbiBjb2RlIGZvciBsb2NrcyBhbmQgY3JpdGljYWwgc2VjdGlvbnMsIGRvIG5vdCBjYWxsIGRpcmVjdGx5LgorX19rbXBfaW5saW5lCit2b2lkCitfX19rbXBfaXR0X2xvY2tfaW5pdCgga21wX3VzZXJfbG9ja19wIGxvY2ssIGNoYXIgY29uc3QgKiB0eXBlICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGlkZW50X3QgY29uc3QgKiBsb2MgPSBOVUxMOworICAgICAgICBpZiAoIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICE9IE5VTEwgKQorICAgICAgICAgICAgbG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8oIChsb2NrKSApOworICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjID0gKCBsb2MgPT0gTlVMTCA/IE5VTEwgOiBsb2MtPnBzb3VyY2UgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKCBsb2NrLCB0eXBlLCBzcmMsIDAgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltsY2sgaW5pXSBzY3JlKCAlcCwgXCIlc1wiLCBcIiVzXCIsIDAgKVxuIiwgbG9jaywgdHlwZSwgc3JjICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX19rbXBfaXR0X2xvY2tfaW5pdAorI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIEludGVybmFsIGd1dHMgLS0gY29tbW9uIGNvZGUgZm9yIGxvY2tzIGFuZCBjcml0aWNhbCBzZWN0aW9ucywgZG8gbm90IGNhbGwgZGlyZWN0bHkuCitfX2ttcF9pbmxpbmUKK3ZvaWQKK19fX2ttcF9pdHRfbG9ja19maW5pKCBrbXBfdXNlcl9sb2NrX3AgbG9jaywgY2hhciBjb25zdCAqIHR5cGUgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9zeW5jX2Rlc3Ryb3koIGxvY2sgKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW2xjayBkc3RdIHNkZXMoICVwIClcbiIsIGxvY2sgKTsKKyNlbmRpZgorfSAvLyBfX19rbXBfaXR0X2xvY2tfZmluaQorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit2b2lkCitfX2ttcF9pdHRfbG9ja19jcmVhdGluZygga21wX3VzZXJfbG9ja19wIGxvY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfaW5pdCggbG9jaywgIk9NUCBMb2NrIiwgbG9jICk7Cit9CisjZWxzZQordm9pZAorX19rbXBfaXR0X2xvY2tfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19pbml0KCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2NyZWF0aW5nCisjZW5kaWYKKwordm9pZAorX19rbXBfaXR0X2xvY2tfYWNxdWlyaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBVU0VfSVRUX05PVElGWQorICAgIC8vIHBvc3Rwb25lIGxvY2sgb2JqZWN0IGFjY2VzcworICAgIGlmICggX19pdHRfc3luY19wcmVwYXJlX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX3ByZXBhcmUoIGlsay0+bG9jayApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19pdHRfc3luY19wcmVwYXJlKCBsb2NrICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIF9faXR0X3N5bmNfcHJlcGFyZSggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2FjcXVpcmluZworCit2b2lkCitfX2ttcF9pdHRfbG9ja19hY3F1aXJlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICAvLyBwb3N0cG9uZSBsb2NrIG9iamVjdCBhY2Nlc3MKKyAgICBpZiAoIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyICkgeworICAgICAgICBpZiAoIEtNUF9FWFRSQUNUX0RfVEFHKGxvY2spID09IDAgKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfYWNxdWlyZWQoIGlsay0+bG9jayApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX2FjcXVpcmVkKCBsb2NrICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2xvY2tfYWNxdWlyZWQKKwordm9pZAorX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19yZWxlYXNpbmdfcHRyICkgeworICAgICAgICBpZiAoIEtNUF9FWFRSQUNUX0RfVEFHKGxvY2spID09IDAgKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICppbGsgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBpbGstPmxvY2sgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7CisgICAgICAgIH0KKyAgICB9CisjZWxzZQorICAgIF9faXR0X3N5bmNfcmVsZWFzaW5nKCBsb2NrICk7CisjZW5kaWYKK30gLy8gX19rbXBfaXR0X2xvY2tfcmVsZWFzaW5nCisKK3ZvaWQKK19fa21wX2l0dF9sb2NrX2NhbmNlbGxlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N5bmNfY2FuY2VsX3B0ciApIHsKKyAgICAgICAgaWYgKCBLTVBfRVhUUkFDVF9EX1RBRyhsb2NrKSA9PSAwICkgeworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqaWxrID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2NhbmNlbCggaWxrLT5sb2NrICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2l0dF9zeW5jX2NhbmNlbCggbG9jayApOworICAgICAgICB9CisgICAgfQorI2Vsc2UKKyAgICBfX2l0dF9zeW5jX2NhbmNlbCggbG9jayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9sb2NrX2NhbmNlbGxlZAorCit2b2lkCitfX2ttcF9pdHRfbG9ja19kZXN0cm95ZWQoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9fX2ttcF9pdHRfbG9ja19maW5pKCBsb2NrLCAiT01QIExvY2siICk7Cit9IC8vIF9fa21wX2l0dF9sb2NrX2Rlc3Ryb3llZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIENyaXRpY2FsIHJlcG9ydGluZy4KKworICAgIENyaXRpY2FsIHNlY3Rpb25zIGFyZSB0cmVhdGVkIGV4YWN0bHkgYXMgbG9ja3MgKGJ1dCBoYXZlIGRpZmZlcmVudCBvYmplY3QgdHlwZSkuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfY3JlYXRpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrLCBjb25zdCBpZGVudF90ICpsb2MgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgQ3JpdGljYWwiLCBsb2MpOworfQorI2Vsc2UKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19fa21wX2l0dF9sb2NrX2luaXQoIGxvY2ssICJPTVAgQ3JpdGljYWwiICk7Cit9IC8vIF9fa21wX2l0dF9jcml0aWNhbF9jcmVhdGluZworI2VuZGlmCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJpbmcoIGttcF91c2VyX2xvY2tfcCBsb2NrICkgeworICAgIF9faXR0X3N5bmNfcHJlcGFyZSggbG9jayApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyaW5nCisKK3ZvaWQKK19fa21wX2l0dF9jcml0aWNhbF9hY3F1aXJlZCgga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19hY3F1aXJlZCggbG9jayApOworfSAvLyBfX2ttcF9pdHRfY3JpdGljYWxfYWNxdWlyZWQKKwordm9pZAorX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZygga21wX3VzZXJfbG9ja19wIGxvY2sgKSB7CisgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIGxvY2sgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX3JlbGVhc2luZworCit2b2lkCitfX2ttcF9pdHRfY3JpdGljYWxfZGVzdHJveWVkKCBrbXBfdXNlcl9sb2NrX3AgbG9jayApIHsKKyAgICBfX19rbXBfaXR0X2xvY2tfZmluaSggbG9jaywgIk9NUCBDcml0aWNhbCIgKTsKK30gLy8gX19rbXBfaXR0X2NyaXRpY2FsX2Rlc3Ryb3llZAorCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFNpbmdsZSByZXBvcnRpbmcuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfbWFya19jcmVhdGVfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSB7CisgICAgICAgIGttcF9pbmZvX3QgKiAgIHRociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIChndGlkKSApOworICAgICAgICBpZGVudF90ICogICAgICBsb2MgPSB0aHItPnRoLnRoX2lkZW50OworICAgICAgICBjaGFyIGNvbnN0ICogICBzcmMgPSAoIGxvYyA9PSBOVUxMID8gTlVMTCA6IGxvYy0+cHNvdXJjZSApOworICAgICAgICBrbXBfc3RyX2J1Zl90ICBuYW1lOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIG5hbWUsICJPTVAgU2luZ2xlLSVzIiwgc3JjICk7CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSA9IF9faXR0X21hcmtfY3JlYXRlKCBuYW1lLnN0ciApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3NpbiBzdGFdIG1jcmUoIFwiJXNcIikgLT4gJWRcbiIsIG5hbWUuc3RyLCB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgbmFtZSApOworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfbWFyayggdGhyLT50aC50aF9pdHRfbWFya19zaW5nbGUsIE5VTEwgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIltzaW4gc3RhXSBtYXJrKCAlZCwgTlVMTCApXG4iLCB0aHItPnRoLnRoX2l0dF9tYXJrX3NpbmdsZSApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3NpbmdsZV9zdGFydAorCit2b2lkCitfX2ttcF9pdHRfc2luZ2xlX2VuZCggaW50IGd0aWQgKSB7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBfX2l0dF9tYXJrX3R5cGUgIG1hcmsgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICktPnRoLnRoX2l0dF9tYXJrX3NpbmdsZTsKKyAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICBfX2l0dF9tYXJrX29mZiggbWFyayApOworICAgIEtNUF9JVFRfREVCVUdfUFJJTlQoICJbc2luIGVuZF0gbW9mZiggJWQgKVxuIiwgbWFyayApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zaW5nbGVfZW5kCisKKy8qCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgT3JkZXJlZCByZXBvcnRpbmcuCisKKyAgICBfX2ttcF9pdHRfb3JkZXJlZF9pbml0IGlzIGNhbGxlZCBieSBlYWNoIHRocmVhZCAqYmVmb3JlKiBmaXJzdCB1c2luZyBzeW5jCisgICAgb2JqZWN0LiBJVFQgdGVhbSB3b3VsZCBsaWtlIGl0IHRvIGJlIGNhbGxlZCBvbmNlLCBidXQgaXQgcmVxdWlyZXMgZXh0cmEgc3luY2hyb25pemF0aW9uLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfcHJlcCBpcyBjYWxsZWQgd2hlbiB0aHJlYWQgaXMgZ29pbmcgdG8gZW50ZXIgb3JkZXJlZCBzZWN0aW9uCisgICAgKGJlZm9yZSBzeW5jaHJvbml6YXRpb24pLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfc3RhcnQgaXMgY2FsbGVkIGp1c3QgYmVmb3JlIGVudGVyaW5nIHVzZXIgY29kZSAoYWZ0ZXIKKyAgICBzeW5jaHJvbml6YXRpb24pLgorCisgICAgX19rbXBfaXR0X29yZGVyZWRfZW5kIGlzIGNhbGxlZCBhZnRlciByZXR1cm5pbmcgZnJvbSB1c2VyIGNvZGUuCisKKyAgICBTeW5jIG9iamVjdCBpcyB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQuCisKKyAgICBFdmVudHMgYXJlIG5vdCBnZW5lcmF0ZWQgaW4gY2FzZSBvZiBzZXJpYWxpemVkIHRlYW0uCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisqLworCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9pbml0KCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfc3luY19jcmVhdGVfcHRyICkgeworICAgICAgICBrbXBfaW5mb190ICogICB0aHIgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaWRlbnRfdCBjb25zdCAqIGxvYyAgPSB0aHItPnRoLnRoX2lkZW50OworICAgICAgICBjaGFyIGNvbnN0ICogICAgc3JjICA9ICggbG9jID09IE5VTEwgPyBOVUxMIDogbG9jLT5wc291cmNlICk7CisgICAgICAgIF9faXR0X3N5bmNfY3JlYXRlKAorICAgICAgICAgICAgdGhyLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCwgIk9NUCBPcmRlcmVkIiwgc3JjLCAwCisgICAgICAgICk7CisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9pbml0CisKK3ZvaWQKK19fa21wX2l0dF9vcmRlcmVkX3ByZXAoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF90ZWFtX3QgKiB0ID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaWYgKCAhIHQtPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICAgICAgX19pdHRfc3luY19wcmVwYXJlKCB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorI2VuZGlmCit9IC8vIF9fa21wX2l0dF9vcmRlcmVkX3ByZXAKKwordm9pZAorX19rbXBfaXR0X29yZGVyZWRfc3RhcnQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF90ZWFtX3QgKiB0ID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaWYgKCAhIHQtPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICAgICAgX19pdHRfc3luY19hY3F1aXJlZCggdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kaXNwYXRjaF9zaF9jdXJyZW50ICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorfSAvLyBfX2ttcF9pdHRfb3JkZXJlZF9zdGFydAorCit2b2lkCitfX2ttcF9pdHRfb3JkZXJlZF9lbmQoIGludCBndGlkICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIGttcF90ZWFtX3QgKiB0ID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICAgICAgaWYgKCAhIHQtPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqIHRoID0gX19rbXBfdGhyZWFkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgICAgICAgICAgX19pdHRfc3luY19yZWxlYXNpbmcoIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGlzcGF0Y2hfc2hfY3VycmVudCApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X29yZGVyZWRfZW5kCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBUaHJlYWRzIHJlcG9ydGluZy4KKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF90aHJlYWRfaWdub3JlKCkgeworICAgIF9faXR0X3Rocl9pZ25vcmUoKTsKK30gLy8gX19rbXBfaXR0X3RocmVhZF9pZ25vcmUKKwordm9pZAorX19rbXBfaXR0X3RocmVhZF9uYW1lKCBpbnQgZ3RpZCApIHsKKyNpZiBVU0VfSVRUX05PVElGWQorICAgIGlmICggX19pdHRfdGhyX25hbWVfc2V0X3B0ciApIHsKKyAgICAgICAga21wX3N0cl9idWZfdCBuYW1lOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgbmFtZSApOworICAgICAgICBpZiggS01QX01BU1RFUl9HVElEKGd0aWQpICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIE1hc3RlciBUaHJlYWQgIyVkIiwgZ3RpZCApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBuYW1lLCAiT01QIFdvcmtlciBUaHJlYWQgIyVkIiwgZ3RpZCApOworICAgICAgICB9CisgICAgICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgICAgICBfX2l0dF90aHJfbmFtZV9zZXQoIG5hbWUuc3RyLCBuYW1lLnVzZWQgKTsKKyAgICAgICAgS01QX0lUVF9ERUJVR19QUklOVCggIlt0aHIgbmFtXSBuYW1lKCBcIiVzXCIpXG4iLCBuYW1lLnN0ciApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgbmFtZSApOworICAgIH07IC8vIGlmCisjZW5kaWYKK30gLy8gX19rbXBfaXR0X3RocmVhZF9uYW1lCisKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN5c3RlbSBvYmplY3QgcmVwb3J0aW5nLgorCisgICAgSVRUIGNhdGNoZXMgb3BlcmF0aW9ucyB3aXRoIHN5c3RlbSBzeW5jIG9iamVjdHMgKGxpa2UgV2luZG93cyogT1Mgb24gSUEtMzIKKyAgICBhcmNoaXRlY3R1cmUgQVBJIGNyaXRpY2FsIHNlY3Rpb25zIGFuZCBldmVudHMpLiBXZSBvbmx5IG5lZWQgdG8gc3BlY2lmeQorICAgIG5hbWUgKCJPTVAgU2NoZWR1bGVyIikgZm9yIHRoZSBvYmplY3QgdG8gbGV0IElUVCBrbm93IGl0IGlzIGFuIG9iamVjdCB1c2VkCisgICAgYnkgT3Blbk1QIFJUTCBmb3IgaW50ZXJuYWwgcHVycG9zZXMuCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKK3ZvaWQKK19fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIHZvaWQgKiBvYmplY3QsIGNoYXIgY29uc3QgKiBuYW1lICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgX19pdHRfc3luY19jcmVhdGUoIG9iamVjdCwgIk9NUCBTY2hlZHVsZXIiLCBuYW1lLCAwICk7CisgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3N5cyBvYmpdIHNjcmUoICVwLCBcIk9NUCBTY2hlZHVsZXJcIiwgXCIlc1wiLCAwIClcbiIsIG9iamVjdCwgbmFtZSApOworI2VuZGlmCit9IC8vIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQKKworCisvKgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIFN0YWNrIHN0aXRjaGluZyBhcGkuCisKKyAgICBNYXN0ZXIgY2FsbHMgImNyZWF0ZSIgYW5kIHB1dCB0aGUgc3RpdGNoaW5nIGlkIGludG8gdGVhbSBzdHJ1Y3R1cmUuCisgICAgV29ya2VycyByZWFkIHRoZSBzdGl0Y2hpbmcgaWQgYW5kIGNhbGwgImVudGVyIiAvICJsZWF2ZSIgYXBpLgorICAgIE1hc3RlciBjYWxscyAiZGVzdHJveSIgYXQgdGhlIGVuZCBvZiB0aGUgcGFyYWxsZWwgcmVnaW9uLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorKi8KKworX19pdHRfY2FsbGVyCitfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoICFfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciApCisgICAgICAgIHJldHVybiBOVUxMOworICAgIEtNUF9JVFRfREVCVUdfTE9DSygpOworICAgIF9faXR0X2NhbGxlciBpZCA9IF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKTsKKyAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3N0ayBjcmVdICVwXG4iLCBpZCApOworICAgIHJldHVybiBpZDsKKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCit2b2lkCitfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koIF9faXR0X2NhbGxlciBpZCApCit7CisjaWYgVVNFX0lUVF9OT1RJRlkKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciApIHsKKyAgICAgICAgS01QX0lUVF9ERUJVR19MT0NLKCk7CisgICAgICAgIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95KCBpZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3N0ayBkZXNdICVwXG4iLCBpZCApOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkCitfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCBpZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3N0ayBlbnRdICVwXG4iLCBpZCApOworICAgIH0KKyNlbmRpZgorfQorCit2b2lkCitfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKCBfX2l0dF9jYWxsZXIgaWQgKQoreworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgaWYgKCBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyICkgeworICAgICAgICBLTVBfSVRUX0RFQlVHX0xPQ0soKTsKKyAgICAgICAgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKCBpZCApOworICAgICAgICBLTVBfSVRUX0RFQlVHX1BSSU5UKCAiW3N0ayBsZWFdICVwXG4iLCBpZCApOworICAgIH0KKyNlbmRpZgorfQorCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmNjYTYxMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfbG9jay5jcHAKQEAgLTAsMCArMSw0MjU4IEBACisvKgorICoga21wX2xvY2suY3BwIC0tIGxvY2stcmVsYXRlZCBmdW5jdGlvbnMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2luY2x1ZGUgPGF0b21pYz4KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX2lvLmgiCisKKyNpZiBLTVBfVVNFX0ZVVEVYCisjIGluY2x1ZGUgPHVuaXN0ZC5oPgorIyBpbmNsdWRlIDxzeXMvc3lzY2FsbC5oPgorLy8gV2Ugc2hvdWxkIHJlYWxseSBpbmNsdWRlIDxmdXRleC5oPiwgYnV0IHRoYXQgY2F1c2VzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgb24gZGlmZmVyZW50CisvLyBMaW51eCogT1MgZGlzdHJpYnV0aW9ucyB0aGF0IGVpdGhlciByZXF1aXJlIHRoYXQgeW91IGluY2x1ZGUgKG9yIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKQorLy8gPHBjaS90eXBlcy5oPi4KKy8vIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIHRoZSB0d28gbWFjcm9zIGJlbG93ICh3aGljaCBhcmUgcGFydCBvZiB0aGUga2VybmVsIEFCSSwgc28gY2FuJ3QgY2hhbmdlKQorLy8gd2UganVzdCBkZWZpbmUgdGhlIGNvbnN0YW50cyBoZXJlIGFuZCBkb24ndCBpbmNsdWRlIDxmdXRleC5oPgorIyBpZm5kZWYgRlVURVhfV0FJVAorIyAgZGVmaW5lIEZVVEVYX1dBSVQgICAgMAorIyBlbmRpZgorIyBpZm5kZWYgRlVURVhfV0FLRQorIyAgZGVmaW5lIEZVVEVYX1dBS0UgICAgMQorIyBlbmRpZgorI2VuZGlmCisKKy8qIEltcGxlbWVudCBzcGluIGxvY2tzIGZvciBpbnRlcm5hbCBsaWJyYXJ5IHVzZS4gICAgICAgICAgICAgKi8KKy8qIFRoZSBhbGdvcml0aG0gaW1wbGVtZW50ZWQgaXMgTGFtcG9ydCdzIGJha2VyeSBsb2NrIFsxOTc0XS4gKi8KKwordm9pZAorX19rbXBfdmFsaWRhdGVfbG9ja3MoIHZvaWQgKQoreworICAgIGludCBpOworICAgIGttcF91aW50MzIgIHgsIHk7CisKKyAgICAvKiBDaGVjayB0byBtYWtlIHN1cmUgdW5zaWduZWQgYXJpdGhtZXRpYyBkb2VzIHdyYXBzIHByb3Blcmx5ICovCisgICAgeCA9IH4oKGttcF91aW50MzIpIDApIC0gMjsKKyAgICB5ID0geCAtIDI7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgODsgKytpLCArK3gsICsreSkgeworICAgICAgICBrbXBfdWludDMyIHogPSAoeCAtIHkpOworICAgICAgICBLTVBfQVNTRVJUKCB6ID09IDIgKTsKKyAgICB9CisKKyAgICBLTVBfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrLCB0YWlsX2lkICkgJSA4ID09IDAgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIHRlc3QgYW5kIHNldCBsb2NrcyAqLworCisvLworLy8gRm9yIHRoZSBub24tbmVzdGVkIGxvY2tzLCB3ZSBjYW4gb25seSBhc3N1bWUgdGhhdCB0aGUgZmlyc3QgNCBieXRlcyB3ZXJlCisvLyBhbGxvY2F0ZWQsIHNpbmNlIGdjYyBvbmx5IGFsbG9jYXRlcyA0IGJ5dGVzIGZvciBvbXBfbG9ja190LCBhbmQgdGhlIEludGVsCisvLyBjb21waWxlciBvbmx5IGFsbG9jYXRlcyBhIDQgYnl0ZSBwb2ludGVyIG9uIElBLTMyIGFyY2hpdGVjdHVyZS4gIE9uCisvLyBXaW5kb3dzKiBPUyBvbiBJbnRlbChSKSA2NCwgd2UgY2FuIGFzc3VtZSB0aGF0IGFsbCA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkLgorLy8KKy8vIGdjYyByZXNlcnZlcyA+PSA4IGJ5dGVzIGZvciBuZXN0ZWQgbG9ja3MsIHNvIHdlIGNhbiBhc3N1bWUgdGhhdCB0aGUKKy8vIGVudGlyZSA4IGJ5dGVzIHdlcmUgYWxsb2NhdGVkIGZvciBuZXN0ZWQgbG9ja3Mgb24gYWxsIDY0LWJpdCBwbGF0Zm9ybXMuCisvLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBLTVBfTE9DS19TVFJJUChUQ1JfNCggbGNrLT5say5wb2xsICkpIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSgga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBrbXBfdWludDMyIGN1cnIgPSBLTVBfTE9DS19TVFJJUCggVENSXzQoIGxjay0+bGsucG9sbCApICk7CisgICAgaWYgKCAoIGN1cnIgIT0gMCApICYmICggY3VyciAhPSBndGlkICsgMSApICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiTE9DSyBDT05URU5USU9OOiAlcFxuIiwgbGNrICk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgaWYgKCAoIGxjay0+bGsucG9sbCA9PSBLTVBfTE9DS19GUkVFKHRhcykgKQorICAgICAgJiYgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCAmICggbGNrLT5say5wb2xsICksIEtNUF9MT0NLX0ZSRUUodGFzKSwgS01QX0xPQ0tfQlVTWShndGlkKzEsIHRhcykgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9CisKKyAgICBrbXBfdWludDMyIHNwaW5zOworICAgIEtNUF9GU1lOQ19QUkVQQVJFKCBsY2sgKTsKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICBpZiAoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApIHsKKyAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICB9CisKKyAgICBrbXBfYmFja29mZl90IGJhY2tvZmYgPSBfX2ttcF9zcGluX2JhY2tvZmZfcGFyYW1zOworICAgIHdoaWxlICggKCBsY2stPmxrLnBvbGwgIT0gS01QX0xPQ0tfRlJFRSh0YXMpICkgfHwKKyAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSApICkgKSB7CisKKyAgICAgICAgX19rbXBfc3Bpbl9iYWNrb2ZmKCZiYWNrb2ZmKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgICAgICBfX2ttcF94cHJvYyApICkgeworICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoICggbGNrLT5say5wb2xsID09IEtNUF9MT0NLX0ZSRUUodGFzKSApCisgICAgICAmJiBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRSh0YXMpLCBLTVBfTE9DS19CVVNZKGd0aWQrMSwgdGFzKSApICkgeworICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQoIGxjayApOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMMzIoICYobGNrLT5say5wb2xsKSwgS01QX0xPQ0tfRlJFRSh0YXMpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLTVBfWUlFTEQoIFRDUl80KCBfX2ttcF9udGggKSA+ICggX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgX19rbXBfeHByb2MgKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc190YXNfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUodGFzKSApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfdGFzX2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgdGVzdCBhbmQgc2V0IGxvY2tzCisvLworCitpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgKz0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX05FWFQ7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKKyAgICAgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorfQorCitzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF90YXNfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dmFsID0gbGNrLT5say5kZXB0aF9sb2NrZWQgPSAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9ja193aXRoX2NoZWNrcygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3Rhc19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV90YXNfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X25lc3RfbG9jayI7CisgICAgS01QX01CKCk7ICAvKiBpbiBjYXNlIGFub3RoZXIgcHJvY2Vzc29yIGluaXRpYWxpemVkIGxvY2sgKi8KKyAgICBpZiAoICEgX19rbXBfaXNfdGFzX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90YXNfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGFzX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3Rhc19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGFzX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGFzX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90YXNfbG9jayggbGNrICk7CisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2tfd2l0aF9jaGVja3MoIGttcF90YXNfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX3Rhc19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGFzX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3Rhc19sb2NrKCBsY2sgKTsKK30KKworCisjaWYgS01QX1VTRV9GVVRFWAorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIGZ1dGV4IGxvY2tzICovCisKKy8vIGZ1dGV4IGxvY2tzIGFyZSByZWFsbHkganVzdCB0ZXN0IGFuZCBzZXQgbG9ja3MsIHdpdGggYSBkaWZmZXJlbnQgbWV0aG9kCisvLyBvZiBoYW5kbGluZyBjb250ZW50aW9uLiAgVGhleSB0YWtlIHRoZSBzYW1lIGFtb3VudCBvZiBzcGFjZSBhcyB0ZXN0IGFuZAorLy8gc2V0IGxvY2tzLCBhbmQgYXJlIGFsbG9jYXRlZCB0aGUgc2FtZSB3YXkgKGkuZS4gdXNlIHRoZSBhcmVhIGFsbG9jYXRlZCBieQorLy8gdGhlIGNvbXBpbGVyIGZvciBub24tbmVzdGVkIGxvY2tzIC8gYWxsb2NhdGUgbmVzdGVkIGxvY2tzIG9uIHRoZSBoZWFwKS4KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUUklQKCggVENSXzQoIGxjay0+bGsucG9sbCApID4+IDEgKSkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX2ludDMyIGd0aWRfY29kZSA9ICggZ3RpZCArIDEgKSA8PCAxOworCisgICAgS01QX01CKCk7CisKKyNpZmRlZiBVU0VfTE9DS19QUk9GSUxFCisgICAga21wX3VpbnQzMiBjdXJyID0gS01QX0xPQ0tfU1RSSVAoIFRDUl80KCBsY2stPmxrLnBvbGwgKSApOworICAgIGlmICggKCBjdXJyICE9IDAgKSAmJiAoIGN1cnIgIT0gZ3RpZF9jb2RlICkgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7CisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgZW50ZXJpbmdcbiIsCisgICAgICBsY2ssIGxjay0+bGsucG9sbCwgZ3RpZCApICk7CisKKyAgICBrbXBfaW50MzIgcG9sbF92YWw7CisKKyAgICB3aGlsZSAoICggcG9sbF92YWwgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIoICYgKCBsY2stPmxrLnBvbGwgKSwgS01QX0xPQ0tfRlJFRShmdXRleCksCisgICAgICAgICAgICAgS01QX0xPQ0tfQlVTWShndGlkX2NvZGUsIGZ1dGV4KSApICkgIT0gS01QX0xPQ0tfRlJFRShmdXRleCkgKSB7CisKKyAgICAgICAga21wX2ludDMyIGNvbmQgPSBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxOworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBwb2xsX3ZhbCA9IDB4JXggY29uZCA9IDB4JXhcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIGNvbmQgKSApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5PVEU6IGlmIHlvdSB0cnkgdG8gdXNlIHRoZSBmb2xsb3dpbmcgY29uZGl0aW9uIGZvciB0aGlzIGJyYW5jaAorICAgICAgICAvLworICAgICAgICAvLyBpZiAoIHBvbGxfdmFsICYgMSA9PSAwICkKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlbiB0aGUgMTIuMCBjb21waWxlciBoYXMgYSBidWcgd2hlcmUgdGhlIGZvbGxvd2luZyBibG9jayB3aWxsCisgICAgICAgIC8vIGFsd2F5cyBiZSBza2lwcGVkLCByZWdhcmRsZXNzIG9mIHRoZSB2YWx1ZSBvZiB0aGUgTFNCIG9mIHBvbGxfdmFsLgorICAgICAgICAvLworICAgICAgICBpZiAoICEgY29uZCApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBUcnkgdG8gc2V0IHRoZSBsc2IgaW4gdGhlIHBvbGwgdG8gaW5kaWNhdGUgdG8gdGhlIG93bmVyCisgICAgICAgICAgICAvLyB0aHJlYWQgdGhhdCB0aGV5IG5lZWQgdG8gd2FrZSB0aGlzIHRocmVhZCB1cC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCAmICggbGNrLT5say5wb2xsICksIHBvbGxfdmFsLCBwb2xsX3ZhbCB8IEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpICkgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAoMHgleCksIFQjJWQgY2FuJ3Qgc2V0IGJpdCAwXG4iLAorICAgICAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcG9sbF92YWwgfD0gS01QX0xPQ0tfQlVTWSgxLCBmdXRleCk7CisKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGJpdCAwIHNldFxuIiwKKyAgICAgICAgICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgICAgICB9CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgYmVmb3JlIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgICAgIGttcF9pbnQzMiByYzsKKyAgICAgICAgaWYgKCAoIHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJiAoIGxjay0+bGsucG9sbCApLCBGVVRFWF9XQUlULAorICAgICAgICAgIHBvbGxfdmFsLCBOVUxMLCBOVUxMLCAwICkgKSAhPSAwICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgZnV0ZXhfd2FpdCgweCV4KSBmYWlsZWQgKHJjPSVkIGVycm5vPSVkKVxuIiwKKyAgICAgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwsIHJjLCBlcnJubyApICk7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jazogbGNrOiVwLCBUIyVkIGFmdGVyIGZ1dGV4X3dhaXQoMHgleClcbiIsCisgICAgICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIHRocmVhZCBoYXMgbm93IGRvbmUgYSBzdWNjZXNzZnVsIGZ1dGV4IHdhaXQgY2FsbCBhbmQgd2FzCisgICAgICAgIC8vIGVudGVyZWQgb24gdGhlIE9TIGZ1dGV4IHF1ZXVlLiAgV2UgbXVzdCBub3cgcGVyZm9ybSBhIGZ1dGV4CisgICAgICAgIC8vIHdha2UgY2FsbCB3aGVuIHJlbGVhc2luZyB0aGUgbG9jaywgYXMgd2UgaGF2ZSBubyBpZGVhIGhvdyBtYW55CisgICAgICAgIC8vIG90aGVyIHRocmVhZHMgYXJlIGluIHRoZSBxdWV1ZS4KKyAgICAgICAgLy8KKyAgICAgICAgZ3RpZF9jb2RlIHw9IDE7CisgICAgfQorCisgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF9hY3F1aXJlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSwgS01QX0xPQ0tfQlVTWSgoZ3RpZCsxKSA8PCAxLCBmdXRleCkgKSApIHsKKyAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKCBsY2sgKTsKKyAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKyAgICBpZiAoICggc2l6ZW9mICgga21wX2Z1dGV4X2xvY2tfdCApIDw9IE9NUF9MT0NLX1RfU0laRSApCisgICAgICAmJiBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfZnV0ZXhfbG9jazogbGNrOiVwKDB4JXgpLCBUIyVkIGVudGVyaW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworCisgICAga21wX2ludDMyIHBvbGxfdmFsID0gS01QX1hDSEdfRklYRUQzMiggJiAoIGxjay0+bGsucG9sbCApLCBLTVBfTE9DS19GUkVFKGZ1dGV4KSApOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfcmVsZWFzZV9mdXRleF9sb2NrOiBsY2s6JXAsIFQjJWQgcmVsZWFzZWQgcG9sbF92YWwgPSAweCV4XG4iLAorICAgICAgIGxjaywgZ3RpZCwgcG9sbF92YWwgKSApOworCisgICAgaWYgKCBLTVBfTE9DS19TVFJJUChwb2xsX3ZhbCkgJiAxICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCwgVCMlZCBmdXRleF93YWtlIDEgdGhyZWFkXG4iLAorICAgICAgICAgICBsY2ssIGd0aWQgKSApOworICAgICAgICBzeXNjYWxsKCBfX05SX2Z1dGV4LCAmICggbGNrLT5say5wb2xsICksIEZVVEVYX1dBS0UsIEtNUF9MT0NLX0JVU1koMSwgZnV0ZXgpLCBOVUxMLCBOVUxMLCAwICk7CisgICAgfQorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2s6IGxjazolcCgweCV4KSwgVCMlZCBleGl0aW5nXG4iLAorICAgICAgbGNrLCBsY2stPmxrLnBvbGwsIGd0aWQgKSApOworCisgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoIF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDoKKyAgICAgIF9fa21wX3hwcm9jICkgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCAoIHNpemVvZiAoIGttcF9mdXRleF9sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgJiYgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICYmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIFRDV180KCBsY2stPmxrLnBvbGwsIEtNUF9MT0NLX0ZSRUUoZnV0ZXgpICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfZnV0ZXhfbG9jayggbGNrICk7Cit9CisKK3ZvaWQKK19fa21wX2Rlc3Ryb3lfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLnBvbGwgPSAwOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X2xvY2siOworICAgIGlmICggKCBzaXplb2YgKCBrbXBfZnV0ZXhfbG9ja190ICkgPD0gT01QX0xPQ0tfVF9TSVpFICkKKyAgICAgICYmIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGxjayApOworfQorCisKKy8vCisvLyBuZXN0ZWQgZnV0ZXggbG9ja3MKKy8vCisKK2ludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9mdXRleF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZnV0ZXhfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZnV0ZXhfbG9ja193aXRoX2NoZWNrcygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGludCByZXR2YWw7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIHJldHZhbCA9ICsrbGNrLT5say5kZXB0aF9sb2NrZWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X25lc3RfbG9jayI7CisgICAgaWYgKCAhIF9fa21wX2lzX2Z1dGV4X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGxjaywgZ3RpZCApOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgfQorICAgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggISBfX2ttcF9pc19mdXRleF9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZnV0ZXhfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9mdXRleF9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZnV0ZXhfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2tfd2l0aF9jaGVja3MoIGttcF9mdXRleF9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoICEgX19rbXBfaXNfZnV0ZXhfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGxjayApOworfQorCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdGlja2V0IChiYWtlcnkpIGxvY2tzICovCisKK3N0YXRpYyBrbXBfaW50MzIKK19fa21wX2dldF90aWNrZXRfbG9ja19vd25lcigga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLm93bmVyX2lkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX3RpY2tldF9sb2NrX25lc3RhYmxlKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgIT0gLTE7Cit9CisKK3N0YXRpYyBrbXBfdWludDMyCitfX2ttcF9iYWtlcnlfY2hlY2soIHZvaWQgKm5vd19zZXJ2aW5nLCBrbXBfdWludDMyIG15X3RpY2tldCApCit7CisgICAgcmV0dXJuIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoIChzdGQ6OmF0b21pYzx1bnNpZ25lZD4gKilub3dfc2VydmluZywgc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSApID09IG15X3RpY2tldDsKK30KKworX19mb3JjZWlubGluZSBzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQzMiBteV90aWNrZXQgPSBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoICZsY2stPmxrLm5leHRfdGlja2V0LCAxVSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworCisjaWZkZWYgVVNFX0xPQ0tfUFJPRklMRQorICAgIGlmICggc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSAhPSBteV90aWNrZXQgKQorICAgICAgICBfX2ttcF9wcmludGYoICJMT0NLIENPTlRFTlRJT046ICVwXG4iLCBsY2sgKTsKKyAgICAvKiBlbHNlIF9fa21wX3ByaW50ZiggIi4iICk7Ki8KKyNlbmRpZiAvKiBVU0VfTE9DS19QUk9GSUxFICovCisKKyAgICBpZiAoIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLm5vd19zZXJ2aW5nLCBzdGQ6Om1lbW9yeV9vcmRlcl9hY3F1aXJlICkgPT0gbXlfdGlja2V0ICkgeworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgfQorICAgIEtNUF9XQUlUX1lJRUxEX1BUUiggJmxjay0+bGsubm93X3NlcnZpbmcsIG15X3RpY2tldCwgX19rbXBfYmFrZXJ5X2NoZWNrLCBsY2sgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrX3RpbWVkX3RlbXBsYXRlKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9zZXRfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfdGVzdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGttcF91aW50MzIgbXlfdGlja2V0ID0gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsubmV4dF90aWNrZXQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKworICAgIGlmICggc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsubm93X3NlcnZpbmcsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSA9PSBteV90aWNrZXQgKSB7CisgICAgICAgIGttcF91aW50MzIgbmV4dF90aWNrZXQgPSBteV90aWNrZXQgKyAxOworICAgICAgICBpZiAoIHN0ZDo6YXRvbWljX2NvbXBhcmVfZXhjaGFuZ2Vfc3Ryb25nX2V4cGxpY2l0KCAmbGNrLT5say5uZXh0X3RpY2tldCwKKyAgICAgICAgICAgICAmbXlfdGlja2V0LCBuZXh0X3RpY2tldCwgc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSwgc3RkOjptZW1vcnlfb3JkZXJfYWNxdWlyZSApKSB7CisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gRkFMU0U7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9sb2NrIjsKKworICAgIGlmICggISBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBsY2stPmxrLnNlbGYgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorCisgICAgaW50IHJldHZhbCA9IF9fa21wX3Rlc3RfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQzMiBkaXN0YW5jZSA9IHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLm5leHRfdGlja2V0LCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgLSBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5ub3dfc2VydmluZywgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworCisgICAgc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCAmbGNrLT5say5ub3dfc2VydmluZywgMVUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UgKTsKKworICAgIEtNUF9ZSUVMRCggZGlzdGFuY2UKKyAgICAgID4gKGttcF91aW50MzIpIChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApOworICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKworICAgIGlmICggISBzdGQ6OmF0b21pY19sb2FkX2V4cGxpY2l0KCAmbGNrLT5say5pbml0aWFsaXplZCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBsY2stPmxrLnNlbGYgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApID49IDAgKQorICAgICAgJiYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuc2VsZiA9IGxjazsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsubmV4dF90aWNrZXQsIDBVLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm5vd19zZXJ2aW5nLCAwVSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOyAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAtMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOyAvLyAtMSA9PiBub3QgYSBuZXN0ZWQgbG9jay4KKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHRydWUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGVhc2UgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCBmYWxzZSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsZWFzZSApOworICAgIGxjay0+bGsuc2VsZiA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm5leHRfdGlja2V0LCAwVSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5ub3dfc2VydmluZywgMFUsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsub3duZXJfaWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAtMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgIT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1N0aWxsT3duZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCB0aWNrZXQgbG9ja3MKKy8vCisKK2ludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49IDAgKTsKKworICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBzdGQ6OmF0b21pY19mZXRjaF9hZGRfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMSwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfdGlja2V0X2xvY2tfdGltZWRfdGVtcGxhdGUoIGxjaywgZ3RpZCApOworICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworICAgIH0KK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9hY3F1aXJlX25lc3RlZF90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpbnQgcmV0dmFsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSArIDE7CisgICAgfQorICAgIGVsc2UgaWYgKCAhX19rbXBfdGVzdF90aWNrZXRfbG9jayggbGNrLCBndGlkICkgKSB7CisgICAgICAgIHJldHZhbCA9IDA7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdGQ6OmF0b21pY19zdG9yZV9leHBsaWNpdCggJmxjay0+bGsuZGVwdGhfbG9ja2VkLCAxLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5vd25lcl9pZCwgZ3RpZCArIDEsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsKKyAgICAgICAgcmV0dmFsID0gMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworCisgICAgaWYgKCAhIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIGxjay0+bGsuc2VsZiAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoICggc3RkOjphdG9taWNfZmV0Y2hfYWRkX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIC0xLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgLSAxICkgPT0gMCApIHsKKyAgICAgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLm93bmVyX2lkLCAwLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7CisgICAgfQorICAgIHJldHVybiBLTVBfTE9DS19TVElMTF9IRUxEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9ja193aXRoX2NoZWNrcygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworCisgICAgaWYgKCAhIHN0ZDo6YXRvbWljX2xvYWRfZXhwbGljaXQoICZsY2stPmxrLmluaXRpYWxpemVkLCBzdGQ6Om1lbW9yeV9vcmRlcl9yZWxheGVkICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIGxjay0+bGsuc2VsZiAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfdGlja2V0X2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfdGlja2V0X2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfdGlja2V0X2xvY2soIGxjayApOworICAgIHN0ZDo6YXRvbWljX3N0b3JlX2V4cGxpY2l0KCAmbGNrLT5say5kZXB0aF9sb2NrZWQsIDAsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdGlja2V0X2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfdGlja2V0X2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7CisgICAgc3RkOjphdG9taWNfc3RvcmVfZXhwbGljaXQoICZsY2stPmxrLmRlcHRoX2xvY2tlZCwgMCwgc3RkOjptZW1vcnlfb3JkZXJfcmVsYXhlZCApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdGlja2V0X2xvY2tfd2l0aF9jaGVja3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisKKyAgICBpZiAoICEgc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggbGNrLT5say5zZWxmICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc190aWNrZXRfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gc3RkOjphdG9taWNfbG9hZF9leHBsaWNpdCggJmxjay0+bGsuaW5pdGlhbGl6ZWQsIHN0ZDo6bWVtb3J5X29yZGVyX3JlbGF4ZWQgKSAmJiAoIGxjay0+bGsuc2VsZiA9PSBsY2spOworfQorCitzdGF0aWMgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfdGlja2V0X2xvY2tfbG9jYXRpb24oIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBjb25zdCBpZGVudF90ICpsb2MgKQoreworICAgIGxjay0+bGsubG9jYXRpb24gPSBsb2M7Cit9CisKK3N0YXRpYyBrbXBfbG9ja19mbGFnc190CitfX2ttcF9nZXRfdGlja2V0X2xvY2tfZmxhZ3MoIGttcF90aWNrZXRfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmZsYWdzOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3RpY2tldF9sb2NrX2ZsYWdzKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogcXVldWluZyBsb2NrcyAqLworCisvKgorICogRmlyc3QgdGhlIHN0YXRlcworICogKGhlYWQsdGFpbCkgPSAgMCwgMCAgbWVhbnMgbG9jayBpcyB1bmhlbGQsIG5vYm9keSBvbiBxdWV1ZQorICogICBVSU5UX01BWCBvciAtMSwgMCAgbWVhbnMgbG9jayBpcyBoZWxkLCBub2JvZHkgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIGggIG1lYW5zIGxvY2sgaXMgaGVsZCBvciBhYm91dCB0byB0cmFuc2l0aW9uLCAxIGVsZW1lbnQgb24gcXVldWUKKyAqICAgICAgICAgICAgICAgIGgsIHQgIGggPD4gdCwgbWVhbnMgbG9jayBpcyBoZWxkIG9yIGFib3V0IHRvIHRyYW5zaXRpb24sID4xIGVsZW1lbnRzIG9uIHF1ZXVlCisgKgorICogTm93IHRoZSB0cmFuc2l0aW9ucworICogICAgQWNxdWlyZSgwLDApICA9IC0xICwwCisgKiAgICBSZWxlYXNlKDAsMCkgID0gRXJyb3IKKyAqICAgIEFjcXVpcmUoLTEsMCkgPSAgaCAsaCAgICBoID4gMAorICogICAgUmVsZWFzZSgtMSwwKSA9ICAwICwwCisgKiAgICBBY3F1aXJlKGgsaCkgID0gIGggLHQgICAgaCA+IDAsIHQgPiAwLCBoIDw+IHQKKyAqICAgIFJlbGVhc2UoaCxoKSAgPSAtMSAsMCAgICBoID4gMAorICogICAgQWNxdWlyZShoLHQpICA9ICBoICx0JyAgIGggPiAwLCB0ID4gMCwgdCcgPiAwLCBoIDw+IHQsIGggPD4gdCcsIHQgPD4gdCcKKyAqICAgIFJlbGVhc2UoaCx0KSAgPSAgaCcsdCAgICBoID4gMCwgdCA+IDAsIGggPD4gdCwgaCA8PiBoJywgaCcgbWF5YmUgPSB0CisgKgorICogQW5kIHBpY3RvcmlhbGx5CisgKgorICoKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgMCwgMHwtLS0tLS0tIHJlbGVhc2UgLS0tLS0tLT4gRXJyb3IKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgICAgfCAgXgorICogICAgIGFjcXVpcmV8ICB8cmVsZWFzZQorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgdiAgfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgfC0xLCAwfAorICogICAgICAgICAgKy0tLS0tKworICogICAgICAgICAgICB8ICBeCisgKiAgICAgYWNxdWlyZXwgIHxyZWxlYXNlCisgKiAgICAgICAgICAgIHwgIHwKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB2ICB8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICB8IGgsIGh8CisgKiAgICAgICAgICArLS0tLS0rCisgKiAgICAgICAgICAgIHwgIF4KKyAqICAgICBhY3F1aXJlfCAgfHJlbGVhc2UKKyAqICAgICAgICAgICAgfCAgfAorICogICAgICAgICAgICB8ICB8CisgKiAgICAgICAgICAgIHYgIHwKKyAqICAgICAgICAgICstLS0tLSsKKyAqICAgICAgICAgIHwgaCwgdHwtLS0tLSBhY3F1aXJlLCByZWxlYXNlIGxvb3BiYWNrIC0tLSsKKyAqICAgICAgICAgICstLS0tLSsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgXiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgfCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyAqICAgICAgICAgICAgICAgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSsKKyAqCisgKi8KKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKworLyogU3R1ZmYgZm9yIGNpcmN1bGFyIHRyYWNlIGJ1ZmZlciAqLworI2RlZmluZSBUUkFDRV9CVUZfRUxFCTEwMjQKK3N0YXRpYyBjaGFyIHRyYWNlc1tUUkFDRV9CVUZfRUxFXVsxMjhdID0geyAwIH0KK3N0YXRpYyBpbnQgdGMgPSAwOworI2RlZmluZSBUUkFDRV9MT0NLKFgsWSkgICAgICAgICAgS01QX1NOUFJJTlRGKCB0cmFjZXNbdGMrKyAlIFRSQUNFX0JVRl9FTEVdLCAxMjgsICAidCVkIGF0ICVzXG4iLCBYLCBZICk7CisjZGVmaW5lIFRSQUNFX0xPQ0tfVChYLFksWikgICAgICBLTVBfU05QUklOVEYoIHRyYWNlc1t0YysrICUgVFJBQ0VfQlVGX0VMRV0sIDEyOCwgInQlZCBhdCAlcyVkXG4iLCBYLFksWiApOworI2RlZmluZSBUUkFDRV9MT0NLX0hUKFgsWSxaLFEpICAgS01QX1NOUFJJTlRGKCB0cmFjZXNbdGMrKyAlIFRSQUNFX0JVRl9FTEVdLCAxMjgsICJ0JWQgYXQgJXMgJWQsJWRcbiIsIFgsIFksIFosIFEgKTsKKworc3RhdGljIHZvaWQKK19fa21wX2R1bXBfcXVldWluZ19sb2NrKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsCisgIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgaGVhZF9pZCwga21wX2ludDMyIHRhaWxfaWQgKQoreworICAgIGttcF9pbnQzMiB0LCBpOworCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcbl9fa21wX2R1bXBfcXVldWluZ19sb2NrOiBUUkFDRSBCRUdJTlMgSEVSRSEgXG4iICk7CisKKyAgICBpID0gdGMgJSBUUkFDRV9CVUZfRUxFOworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiJXNcbiIsIHRyYWNlc1tpXSApOworICAgIGkgPSAoaSsxKSAlIFRSQUNFX0JVRl9FTEU7CisgICAgd2hpbGUgKCBpICE9ICh0YyAlIFRSQUNFX0JVRl9FTEUpICkgeworICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIiVzIiwgdHJhY2VzW2ldICk7CisgICAgICAgIGkgPSAoaSsxKSAlIFRSQUNFX0JVRl9FTEU7CisgICAgfQorICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG4iICk7CisKKyAgICBfX2ttcF9wcmludGZfbm9fbG9jaygKKyAgICAgICAgICAgICAiXG5fX2ttcF9kdW1wX3F1ZXVpbmdfbG9jazogZ3RpZCsxOiVkLCBzcGluX2hlcmU6JWQsIG5leHRfd2FpdDolZCwgaGVhZF9pZDolZCwgdGFpbF9pZDolZFxuIiwKKyAgICAgICAgICAgICBndGlkKzEsIHRoaXNfdGhyLT50aC50aF9zcGluX2hlcmUsIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcsCisgICAgICAgICAgICAgaGVhZF9pZCwgdGFpbF9pZCApOworCisgICAgX19rbXBfcHJpbnRmX25vX2xvY2soICJcdFx0aGVhZDogJWQgIiwgbGNrLT5say5oZWFkX2lkICk7CisKKyAgICBpZiAoIGxjay0+bGsuaGVhZF9pZCA+PSAxICkgeworICAgICAgICB0ID0gX19rbXBfdGhyZWFkc1tsY2stPmxrLmhlYWRfaWQtMV0tPnRoLnRoX25leHRfd2FpdGluZzsKKyAgICAgICAgd2hpbGUgKHQgPiAwKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIi0+ICVkICIsIHQgKTsKKyAgICAgICAgICAgIHQgPSBfX2ttcF90aHJlYWRzW3QtMV0tPnRoLnRoX25leHRfd2FpdGluZzsKKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9wcmludGZfbm9fbG9jayggIjsgIHRhaWw6ICVkICIsIGxjay0+bGsudGFpbF9pZCApOworICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCAiXG5cbiIgKTsKK30KKworI2VuZGlmIC8qIERFQlVHX1FVRVVJTkdfTE9DS1MgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcigga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBUQ1JfNCggbGNrLT5say5vd25lcl9pZCApIC0gMTsKK30KKworc3RhdGljIGlubGluZSBib29sCitfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5kZXB0aF9sb2NrZWQgIT0gLTE7Cit9CisKKy8qIEFjcXVpcmUgYSBsb2NrIHVzaW5nIGEgdGhlIHF1ZXVpbmcgbG9jayBpbXBsZW1lbnRhdGlvbiAqLwordGVtcGxhdGUgPGJvb2wgdGFrZVRpbWU+CisvKiBbVExXXSBUaGUgdW51c2VkIHRlbXBsYXRlIGFib3ZlIGlzIGxlZnQgYmVoaW5kIGJlY2F1c2Ugb2Ygd2hhdCBCRUIgYmVsaWV2ZXMgaXMgYQorICAgcG90ZW50aWFsIGNvbXBpbGVyIHByb2JsZW0gd2l0aCBfX2ZvcmNlaW5saW5lLiAqLworX19mb3JjZWlubGluZSBzdGF0aWMgaW50CitfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RociAgICA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgICpoZWFkX2lkX3AgICA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgKnRhaWxfaWRfcCAgID0gJiBsY2stPmxrLnRhaWxfaWQ7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3Bpbl9oZXJlX3A7CisgICAga21wX2ludDMyIG5lZWRfbWYgPSAxOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9zdGF0ZV90IHByZXZfc3RhdGUgPSBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBlbnRlcmluZ1xuIiwgbGNrLCBndGlkICkpOworCisgICAgS01QX0ZTWU5DX1BSRVBBUkUoIGxjayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBzcGluX2hlcmVfcCA9ICYgdGhpc190aHItPnRoLnRoX3NwaW5faGVyZTsKKworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZW50IiApOworICAgIGlmICggKnNwaW5faGVyZV9wICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgIT0gMCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhKnNwaW5faGVyZV9wICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKworICAgIC8qIFRoZSBmb2xsb3dpbmcgc3QucmVsIHRvIHNwaW5faGVyZV9wIG5lZWRzIHRvIHByZWNlZGUgdGhlIGNtcHhjaGcuYWNxIHRvIGhlYWRfaWRfcAorICAgICAgIHRoYXQgbWF5IGZvbGxvdywgbm90IGp1c3QgaW4gZXhlY3V0aW9uIG9yZGVyLCBidXQgYWxzbyBpbiB2aXNpYmlsaXR5IG9yZGVyLiAgVGhpcyB3YXksCisgICAgICAgd2hlbiBhIHJlbGVhc2luZyB0aHJlYWQgb2JzZXJ2ZXMgdGhlIGNoYW5nZXMgdG8gdGhlIHF1ZXVlIGJ5IHRoaXMgdGhyZWFkLCBpdCBjYW4KKyAgICAgICByaWdodGx5IGFzc3VtZSB0aGF0IHNwaW5faGVyZV9wIGhhcyBhbHJlYWR5IGJlZW4gc2V0IHRvIFRSVUUsIHNvIHRoYXQgd2hlbiBpdCBzZXRzCisgICAgICAgc3Bpbl9oZXJlX3AgdG8gRkFMU0UsIGl0IGlzIG5vdCBwcmVtYXR1cmUuICBJZiB0aGUgcmVsZWFzaW5nIHRocmVhZCBzZXRzIHNwaW5faGVyZV9wCisgICAgICAgdG8gRkFMU0UgYmVmb3JlIHRoaXMgdGhyZWFkIHNldHMgaXQgdG8gVFJVRSwgdGhpcyB0aHJlYWQgd2lsbCBoYW5nLgorICAgICovCisgICAgKnNwaW5faGVyZV9wID0gVFJVRTsgIC8qIGJlZm9yZSBlbnF1ZXVpbmcgdG8gcHJldmVudCByYWNlICovCisKKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAga21wX2ludDMyIGVucXVldWVkOworICAgICAgICBrbXBfaW50MzIgaGVhZDsKKyAgICAgICAga21wX2ludDMyIHRhaWw7CisKKyAgICAgICAgaGVhZCA9ICpoZWFkX2lkX3A7CisKKyAgICAgICAgc3dpdGNoICggaGVhZCApIHsKKworICAgICAgICAgICAgY2FzZSAtMToKKyAgICAgICAgICAgIHsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgdGFpbCA9ICp0YWlsX2lkX3A7CisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIHRhaWwgPSAwOyAgLyogdG8gbWFrZSBzdXJlIG5leHQgbGluayBhc3luY2hyb25vdXNseSByZWFkIGlzIG5vdCBzZXQgYWNjaWRlbnRhbGx5OworICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBhc3NpZ25tZW50IHByZXZlbnRzIHVzIGZyb20gZW50ZXJpbmcgdGhlIGlmICggdCA+IDAgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uZGl0aW9uIGluIHRoZSBlbnF1ZXVlZCBjYXNlIGJlbG93LCB3aGljaCBpcyBub3QgbmVjZXNzYXJ5IGZvcgorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhpcyBzdGF0ZSB0cmFuc2l0aW9uICovCisKKyAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAvKiB0cnkgKC0xLDApLT4odGlkLHRpZCkgKi8KKyAgICAgICAgICAgICAgICBlbnF1ZXVlZCA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSB0YWlsX2lkX3AsCisgICAgICAgICAgICAgICAgICBLTVBfUEFDS182NCggLTEsIDAgKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBndGlkKzEsIGd0aWQrMSApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6ICgtMSwwKS0+KHRpZCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YWlsICE9IGd0aWQgKyAxICk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAgICAgaWYgKCB0YWlsID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gRkFMU0U7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBuZWVkX21mID0gMDsKKyAgICAgICAgICAgICAgICAgICAgLyogdHJ5IChoLHQpIG9yIChoLGgpLT4oaCx0aWQpICovCisgICAgICAgICAgICAgICAgICAgIGVucXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCB0YWlsX2lkX3AsIHRhaWwsIGd0aWQrMSApOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBlbnF1ZXVlZCApIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSBlbnE6IChoLHQpLT4oaCx0aWQpIiApOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgMDogLyogZW1wdHkgcXVldWUgKi8KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBrbXBfaW50MzIgZ3JhYmJlZF9sb2NrOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIHRhaWwgPSAqdGFpbF9pZF9wOworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0tfSFQoIGd0aWQrMSwgImFjcSByZWFkOiAiLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAvKiB0cnkgKDAsMCktPigtMSwwKSAqLworCisgICAgICAgICAgICAgICAgLyogb25seSBsZWdhbCB0cmFuc2l0aW9uIG91dCBvZiBoZWFkID0gMCBpcyBoZWFkID0gLTEgd2l0aCBubyBjaGFuZ2UgdG8gdGFpbCAqLworICAgICAgICAgICAgICAgIGdyYWJiZWRfbG9jayA9IEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggaGVhZF9pZF9wLCAwLCAtMSApOworCisgICAgICAgICAgICAgICAgaWYgKCBncmFiYmVkX2xvY2sgKSB7CisKKyAgICAgICAgICAgICAgICAgICAgKnNwaW5faGVyZV9wID0gRkFMU0U7CisKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2s6IGxjazolcCwgVCMlZCBleGl0aW5nOiBubyBxdWV1aW5nXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGNrLCBndGlkICkpOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAiYWNxIGV4aXQ6ICIsIGhlYWQsIDAgKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgcHJldl9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICAgICAgICAgICAgICAgICAgLyogY2hhbmdlIHRoZSBzdGF0ZSBiZWZvcmUgY2xlYXJpbmcgd2FpdF9pZCAqLworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBwcmV2X3N0YXRlOworICAgICAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsgLyogbG9jayBob2xkZXIgY2Fubm90IGJlIG9uIHF1ZXVlICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVucXVldWVkID0gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgcHJldl9zdGF0ZSA9PSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICAgICAgLyogdGhpcyB0aHJlYWQgd2lsbCBzcGluOyBzZXQgd2FpdF9pZCBiZWZvcmUgZW50ZXJpbmcgd2FpdCBzdGF0ZSAqLworICAgICAgICAgICAgcHJldl9zdGF0ZSA9IHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9ICh1aW50NjRfdCkgbGNrOworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dhaXRfbG9jazsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgaWYgKCBlbnF1ZXVlZCApIHsKKyAgICAgICAgICAgIGlmICggdGFpbCA+IDAgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGFpbF90aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCB0YWlsIC0gMSApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIHRhaWxfdGhyICE9IE5VTEwgKTsKKyAgICAgICAgICAgICAgICB0YWlsX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID0gZ3RpZCsxOworICAgICAgICAgICAgICAgIC8qIGNvcnJlc3BvbmRpbmcgd2FpdCBmb3IgdGhpcyB3cml0ZSBpbiByZWxlYXNlIGNvZGUgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgd2FpdGluZyBmb3IgbG9ja1xuIiwgbGNrLCBndGlkICkpOworCisKKyAgICAgICAgICAgIC8qIFRvRG86IE1heSB3YW50IHRvIGNvbnNpZGVyIHVzaW5nIF9fa21wX3dhaXRfc2xlZXAgIG9yIHNvbWV0aGluZyB0aGF0IHNsZWVwcyBmb3IKKyAgICAgICAgICAgICAqICAgICAgIHRocm91Z2hwdXQgb25seSBoZXJlLgorICAgICAgICAgICAgICovCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgIEtNUF9XQUlUX1lJRUxEKHNwaW5faGVyZV9wLCBGQUxTRSwgS01QX0VRLCBsY2spOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAiYWNxIHNwaW4iICk7CisKKyAgICAgICAgICAgIGlmICggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyAhPSAwICkKKyAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgKmhlYWRfaWRfcCwgKnRhaWxfaWRfcCApOworI2VuZGlmCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfbmV4dF93YWl0aW5nID09IDAgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogYWZ0ZXIgd2FpdGluZyBvbiBxdWV1ZVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJhY3EgZXhpdCAyIiApOworI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIC8qIGNoYW5nZSB0aGUgc3RhdGUgYmVmb3JlIGNsZWFyaW5nIHdhaXRfaWQgKi8KKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gcHJldl9zdGF0ZTsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLndhaXRfaWQgPSAwOworI2VuZGlmCisKKyAgICAgICAgICAgIC8qIGdvdCBsb2NrLCB3ZSB3ZXJlIGRlcXVldWVkIGJ5IHRoZSB0aHJlYWQgdGhhdCByZWxlYXNlZCBsb2NrICovCisgICAgICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7CisgICAgICAgIH0KKworICAgICAgICAvKiBZaWVsZCBpZiBudW1iZXIgb2YgdGhyZWFkcyA+IG51bWJlciBvZiBsb2dpY2FsIHByb2Nlc3NvcnMgKi8KKyAgICAgICAgLyogVG9EbzogTm90IHN1cmUgd2h5IHRoaXMgc2hvdWxkIG9ubHkgYmUgaW4gb3ZlcnN1YnNjcmlwdGlvbiBjYXNlLAorICAgICAgICAgICBtYXliZSBzaG91bGQgYmUgdHJhZGl0aW9uYWwgWUlFTERfSU5JVC9ZSUVMRF9XSEVOIGxvb3AgKi8KKyAgICAgICAgS01QX1lJRUxEKCBUQ1JfNCggX19rbXBfbnRoICkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOgorICAgICAgICAgIF9fa21wX3hwcm9jICkgKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgImFjcSByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfQorICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7Cit9CisKK2ludAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8ZmFsc2U+KCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGludAorX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLAorICBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgKmhlYWRfaWRfcCAgPSAmIGxjay0+bGsuaGVhZF9pZDsKKyAgICBrbXBfaW50MzIgaGVhZDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBrbXBfaW5mb190ICp0aGlzX3RocjsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZW50ZXJpbmdcbiIsIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisjaWZkZWYgS01QX0RFQlVHCisgICAgdGhpc190aHIgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisjZW5kaWYKKworICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisgICAgaWYgKCBoZWFkID09IDAgKSB7IC8qIG5vYm9keSBvbiBxdWV1ZSwgbm9ib2R5IGhvbGRpbmcgKi8KKworICAgICAgICAvKiB0cnkgKDAsMCktPigtMSwwKSAqLworCisgICAgICAgIGlmICggS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKCBoZWFkX2lkX3AsIDAsIC0xICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF90ZXN0X3F1ZXVpbmdfbG9jazogVCMlZCBleGl0aW5nOiBob2xkaW5nIGxvY2tcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICBLTVBfRlNZTkNfQUNRVUlSRUQobGNrKTsKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwMDAsICgiX19rbXBfdGVzdF9xdWV1aW5nX2xvY2s6IFQjJWQgZXhpdGluZzogd2l0aG91dCBsb2NrXG4iLCBndGlkICkpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9xdWV1aW5nX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZWdpc3RlciBrbXBfaW5mb190ICp0aGlzX3RocjsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgKmhlYWRfaWRfcCA9ICYgbGNrLT5say5oZWFkX2lkOworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAqdGFpbF9pZF9wID0gJiBsY2stPmxrLnRhaWxfaWQ7CisKKyAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGVudGVyaW5nXG4iLCBsY2ssIGd0aWQgKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisgICAgdGhpc190aHIgICAgPSBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHIgIT0gTlVMTCApOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICBUUkFDRV9MT0NLKCBndGlkKzEsICJyZWwgZW50IiApOworCisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICkKKyAgICAgICAgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssICpoZWFkX2lkX3AsICp0YWlsX2lkX3AgKTsKKyAgICBpZiAoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgIT0gMCApCisgICAgICAgIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCAqaGVhZF9pZF9wLCAqdGFpbF9pZF9wICk7CisjZW5kaWYKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAhdGhpc190aHItPnRoLnRoX3NwaW5faGVyZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPT0gMCApOworCisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyhsY2spOworCisgICAgd2hpbGUoIDEgKSB7CisgICAgICAgIGttcF9pbnQzMiBkZXF1ZXVlZDsKKyAgICAgICAga21wX2ludDMyIGhlYWQ7CisgICAgICAgIGttcF9pbnQzMiB0YWlsOworCisgICAgICAgIGhlYWQgPSAqaGVhZF9pZF9wOworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIHJlYWQ6ICIsIGhlYWQsIHRhaWwgKTsKKyAgICAgICAgaWYgKCBoZWFkID09IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgIT0gMCApOyAvKiBob2xkaW5nIHRoZSBsb2NrLCBoZWFkIG11c3QgYmUgLTEgb3IgcXVldWUgaGVhZCAqLworCisgICAgICAgIGlmICggaGVhZCA9PSAtMSApIHsgLyogbm9ib2R5IG9uIHF1ZXVlICovCisKKyAgICAgICAgICAgIC8qIHRyeSAoLTEsMCktPigwLDApICovCisgICAgICAgICAgICBpZiAoIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMiggaGVhZF9pZF9wLCAtMSwgMCApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAwLCAoIl9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrOiBsY2s6JXAsIFQjJWQgZXhpdGluZzogcXVldWUgZW1wdHlcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgIGxjaywgZ3RpZCApKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DS19IVCggZ3RpZCsxLCAicmVsIGV4aXQ6ICIsIDAsIDAgKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgLyogbm90aGluZyB0byBkbyAtIG5vIG90aGVyIHRocmVhZCBpcyB0cnlpbmcgdG8gc2hpZnQgYmxhbWUgKi8KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZGVxdWV1ZWQgPSBGQUxTRTsKKworICAgICAgICB9CisgICAgICAgIGVsc2UgeworCisgICAgICAgICAgICB0YWlsID0gKnRhaWxfaWRfcDsKKyAgICAgICAgICAgIGlmICggaGVhZCA9PSB0YWlsICkgeyAgLyogb25seSBvbmUgdGhyZWFkIG9uIHRoZSBxdWV1ZSAqLworCisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIGlmICggaGVhZCA8PSAwICkgX19rbXBfZHVtcF9xdWV1aW5nX2xvY2soIHRoaXNfdGhyLCBndGlkLCBsY2ssIGhlYWQsIHRhaWwgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICk7CisKKyAgICAgICAgICAgICAgICAvKiB0cnkgKGgsaCktPigtMSwwKSAqLworICAgICAgICAgICAgICAgIGRlcXVldWVkID0gS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KCAoa21wX2ludDY0ICopIHRhaWxfaWRfcCwKKyAgICAgICAgICAgICAgICAgIEtNUF9QQUNLXzY0KCBoZWFkLCBoZWFkICksIEtNUF9QQUNLXzY0KCAtMSwgMCApICk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCBkZXE6IChoLGgpLT4oLTEsMCkiICk7CisjZW5kaWYKKworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX2ludDMyICp3YWl0aW5nX2lkX3A7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAgICAgICAgICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZF90aHIgIT0gTlVMTCApOworICAgICAgICAgICAgICAgIHdhaXRpbmdfaWRfcCA9ICYgaGVhZF90aHItPnRoLnRoX25leHRfd2FpdGluZzsKKworICAgICAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgICAgICBpZiAoIGhlYWQgPD0gMCB8fCB0YWlsIDw9IDAgKSBfX2ttcF9kdW1wX3F1ZXVpbmdfbG9jayggdGhpc190aHIsIGd0aWQsIGxjaywgaGVhZCwgdGFpbCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaGVhZCA+IDAgJiYgdGFpbCA+IDAgKTsKKworICAgICAgICAgICAgICAgIC8qIHRyeSAoaCx0KS0+KGgnLHQpIG9yICh0LHQpICovCisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICAvKiBtYWtlIHN1cmUgZW5xdWV1aW5nIHRocmVhZCBoYXMgdGltZSB0byB1cGRhdGUgbmV4dCB3YWl0aW5nIHRocmVhZCBmaWVsZCAqLworICAgICAgICAgICAgICAgICpoZWFkX2lkX3AgPSBLTVBfV0FJVF9ZSUVMRCgodm9sYXRpbGUga21wX3VpbnQzMiopd2FpdGluZ19pZF9wLCAwLCBLTVBfTkVRLCBOVUxMKTsKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGRlcTogKGgsdCktPihoJyx0KSIgKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIGRlcXVldWVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIGlmICggZGVxdWV1ZWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpoZWFkX3RociA9IF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGhlYWQgLSAxICk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBoZWFkX3RociAhPSBOVUxMICk7CisKKyAgICAgICAgICAgIC8qIERvZXMgdGhpcyByZXF1aXJlIHN5bmNocm9ub3VzIHJlYWRzPyAqLworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIGlmICggaGVhZCA8PSAwIHx8IHRhaWwgPD0gMCApIF9fa21wX2R1bXBfcXVldWluZ19sb2NrKCB0aGlzX3RociwgZ3RpZCwgbGNrLCBoZWFkLCB0YWlsICk7CisjZW5kaWYKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhlYWQgPiAwICYmIHRhaWwgPiAwICk7CisKKyAgICAgICAgICAgIC8qIEZvciBjbGVhbiBjb2RlIG9ubHkuCisgICAgICAgICAgICAgKiBUaHJlYWQgbm90IHJlbGVhc2VkIHVudGlsIG5leHQgc3RhdGVtZW50IHByZXZlbnRzIHJhY2Ugd2l0aCBhY3F1aXJlIGNvZGUuCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGhlYWRfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSAwOworI2lmZGVmIERFQlVHX1FVRVVJTkdfTE9DS1MKKyAgICAgICAgICAgIFRSQUNFX0xPQ0tfVCggZ3RpZCsxLCAicmVsIG53PTAgZm9yIHQ9IiwgaGVhZCApOworI2VuZGlmCisKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgLyogcmVzZXQgc3BpbiB2YWx1ZSAqLworICAgICAgICAgICAgaGVhZF90aHItPnRoLnRoX3NwaW5faGVyZSA9IEZBTFNFOworCisgICAgICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCJfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jazogbGNrOiVwLCBUIyVkIGV4aXRpbmc6IGFmdGVyIGRlcXVldWluZ1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICBsY2ssIGd0aWQgKSk7CisjaWZkZWYgREVCVUdfUVVFVUlOR19MT0NLUworICAgICAgICAgICAgVFJBQ0VfTE9DSyggZ3RpZCsxLCAicmVsIGV4aXQgMiIgKTsKKyNlbmRpZgorICAgICAgICAgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworICAgICAgICB9CisgICAgICAgIC8qIEtNUF9DUFVfUEFVU0UoICk7ICBkb24ndCB3YW50IHRvIG1ha2UgcmVsZWFzaW5nIHRocmVhZCBob2xkIHVwIGFjcXVpcmluZyB0aHJlYWRzICovCisKKyNpZmRlZiBERUJVR19RVUVVSU5HX0xPQ0tTCisgICAgICAgIFRSQUNFX0xPQ0soIGd0aWQrMSwgInJlbCByZXRyeSIgKTsKKyNlbmRpZgorCisgICAgfSAvKiB3aGlsZSAqLworICAgIEtNUF9BU1NFUlQyKCAwLCAic2hvdWxkIG5vdCBnZXQgaGVyZSIgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrX3dpdGhfY2hlY2tzKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywKKyAga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX3F1ZXVpbmdfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSAhPSBndGlkICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdTZXRCeUFub3RoZXIsIGZ1bmMgKTsKKyAgICB9CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gTlVMTDsKKyAgICBsY2stPmxrLmhlYWRfaWQgPSAwOworICAgIGxjay0+bGsudGFpbF9pZCA9IDA7CisgICAgbGNrLT5say5uZXh0X3RpY2tldCA9IDA7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IDA7CisgICAgbGNrLT5say5vd25lcl9pZCA9IDA7ICAgICAgLy8gbm8gdGhyZWFkIG93bnMgdGhlIGxvY2suCisgICAgbGNrLT5say5kZXB0aF9sb2NrZWQgPSAtMTsgLy8gPj0gMCBmb3IgbmVzdGFibGUgbG9ja3MsIC0xIGZvciBzaW1wbGUgbG9ja3MuCisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IGxjazsKKworICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9xdWV1aW5nX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGxjay0+bGsuaW5pdGlhbGl6ZWQgPSBOVUxMOworICAgIGxjay0+bGsubG9jYXRpb24gPSBOVUxMOworICAgIGxjay0+bGsuaGVhZF9pZCA9IDA7CisgICAgbGNrLT5say50YWlsX2lkID0gMDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gbmVzdGVkIHF1ZXVpbmcgbG9ja3MKKy8vCisKK2ludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfcXVldWluZ19sb2NrX3RpbWVkX3RlbXBsYXRlPGZhbHNlPiggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworaW50CitfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICByZXR2YWwgPSArK2xjay0+bGsuZGVwdGhfbG9ja2VkOworICAgIH0KKyAgICBlbHNlIGlmICggIV9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKSApIHsKKyAgICAgICAgcmV0dmFsID0gMDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICByZXR2YWwgPSBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssCisgIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgS01QX01CKCk7CisgICAgaWYgKCAtLShsY2stPmxrLmRlcHRoX2xvY2tlZCkgPT0gMCApIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgICAgICBfX2ttcF9yZWxlYXNlX3F1ZXVpbmdfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdW5zZXRfbmVzdF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoICEgX19rbXBfaXNfcXVldWluZ19sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfcXVldWluZ19sb2NrX293bmVyKCBsY2sgKSA9PSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nRnJlZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfcmVsZWFzZV9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKiBsY2sgKQoreworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF9xdWV1aW5nX2xvY2tfd2l0aF9jaGVja3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9ja193aXRoX2NoZWNrcygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF9kZXN0cm95X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19xdWV1aW5nX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX3F1ZXVpbmdfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIGFjY2VzcyBmdW5jdGlvbnMgdG8gZmllbGRzIHdoaWNoIGRvbid0IGV4aXN0IGZvciBhbGwgbG9jayBraW5kcy4KKy8vCisKK3N0YXRpYyBpbnQKK19fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCgga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2sgPT0gbGNrLT5say5pbml0aWFsaXplZDsKK30KKworc3RhdGljIGNvbnN0IGlkZW50X3QgKgorX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbigga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbigga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IGxvYzsKK30KKworc3RhdGljIGttcF9sb2NrX2ZsYWdzX3QKK19fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrLT5say5mbGFnczsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9xdWV1aW5nX2xvY2tfZmxhZ3MoIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKy8qCisgICAgUlRNIEFkYXB0aXZlIGxvY2tzCisqLworCisjaWYgS01QX0NPTVBJTEVSX0lDQyAmJiBfX0lOVEVMX0NPTVBJTEVSID49IDEzMDAKKworI2luY2x1ZGUgPGltbWludHJpbi5oPgorI2RlZmluZSBTT0ZUX0FCT1JUX01BU0sgIChfWEFCT1JUX1JFVFJZIHwgX1hBQk9SVF9DT05GTElDVCB8IF9YQUJPUlRfRVhQTElDSVQpCisKKyNlbHNlCisKKy8vIFZhbHVlcyBmcm9tIHRoZSBzdGF0dXMgcmVnaXN0ZXIgYWZ0ZXIgZmFpbGVkIHNwZWN1bGF0aW9uLgorI2RlZmluZSBfWEJFR0lOX1NUQVJURUQgICAgICAgICAgKH4wdSkKKyNkZWZpbmUgX1hBQk9SVF9FWFBMSUNJVCAgICAgICAgICgxIDw8IDApCisjZGVmaW5lIF9YQUJPUlRfUkVUUlkgICAgICAgICAgICAoMSA8PCAxKQorI2RlZmluZSBfWEFCT1JUX0NPTkZMSUNUICAgICAgICAgKDEgPDwgMikKKyNkZWZpbmUgX1hBQk9SVF9DQVBBQ0lUWSAgICAgICAgICgxIDw8IDMpCisjZGVmaW5lIF9YQUJPUlRfREVCVUcgICAgICAgICAgICAoMSA8PCA0KQorI2RlZmluZSBfWEFCT1JUX05FU1RFRCAgICAgICAgICAgKDEgPDwgNSkKKyNkZWZpbmUgX1hBQk9SVF9DT0RFKHgpICAgICAgICAgICgodW5zaWduZWQgY2hhcikoKCh4KSA+PiAyNCkgJiAweEZGKSkKKworLy8gQWJvcnRzIGZvciB3aGljaCBpdCdzIHdvcnRoIHRyeWluZyBhZ2FpbiBpbW1lZGlhdGVseQorI2RlZmluZSBTT0ZUX0FCT1JUX01BU0sgIChfWEFCT1JUX1JFVFJZIHwgX1hBQk9SVF9DT05GTElDVCB8IF9YQUJPUlRfRVhQTElDSVQpCisKKyNkZWZpbmUgU1RSSU5HSVpFX0lOVEVSTkFMKGFyZykgI2FyZworI2RlZmluZSBTVFJJTkdJWkUoYXJnKSBTVFJJTkdJWkVfSU5URVJOQUwoYXJnKQorCisvLyBBY2Nlc3MgdG8gUlRNIGluc3RydWN0aW9ucworCisvKgorICBBIHZlcnNpb24gb2YgWEJlZ2luIHdoaWNoIHJldHVybnMgLTEgb24gc3BlY3VsYXRpb24sIGFuZCB0aGUgdmFsdWUgb2YgRUFYIG9uIGFuIGFib3J0LgorICBUaGlzIGlzIHRoZSBzYW1lIGRlZmluaXRpb24gYXMgdGhlIGNvbXBpbGVyIGludHJpbnNpYyB0aGF0IHdpbGwgYmUgc3VwcG9ydGVkIGF0IHNvbWUgcG9pbnQuCisqLworc3RhdGljIF9faW5saW5lIGludCBfeGJlZ2luKCkKK3sKKyAgICBpbnQgcmVzID0gLTE7CisKKyNpZiBLTVBfT1NfV0lORE9XUworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIF9hc20geworICAgICAgICBfZW1pdCAweEM3CisgICAgICAgIF9lbWl0IDB4RjgKKyAgICAgICAgX2VtaXQgMgorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBqbXAgICBMMgorICAgICAgICBtb3YgICByZXMsIGVheAorICAgIEwyOgorICAgIH0KKyNlbHNlIC8qIElBMzIgKi8KKyAgICBfYXNtIHsKKyAgICAgICAgX2VtaXQgMHhDNworICAgICAgICBfZW1pdCAweEY4CisgICAgICAgIF9lbWl0IDIKKyAgICAgICAgX2VtaXQgMAorICAgICAgICBfZW1pdCAwCisgICAgICAgIF9lbWl0IDAKKyAgICAgICAgam1wICAgTDIKKyAgICAgICAgbW92ICAgcmVzLCBlYXgKKyAgICBMMjoKKyAgICB9CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisjZWxzZQorICAgIC8qIE5vdGUgdGhhdCAlZWF4IG11c3QgYmUgbm90ZWQgYXMga2lsbGVkIChjbG9iYmVyZWQpLCBiZWNhdXNlCisgICAgICogdGhlIFhTUiBpcyByZXR1cm5lZCBpbiAlZWF4KCVyYXgpIG9uIGFib3J0LiAgT3RoZXIgcmVnaXN0ZXIKKyAgICAgKiB2YWx1ZXMgYXJlIHJlc3RvcmVkLCBzbyBkb24ndCBuZWVkIHRvIGJlIGtpbGxlZC4KKyAgICAgKgorICAgICAqIFdlIG11c3QgYWxzbyBtYXJrICdyZXMnIGFzIGFuIGlucHV0IGFuZCBhbiBvdXRwdXQsIHNpbmNlIG90aGVyd2lzZQorICAgICAqICdyZXM9LTEnIG1heSBiZSBkcm9wcGVkIGFzIGJlaW5nIGRlYWQsIHdoZXJlYXMgd2UgZG8gbmVlZCB0aGUKKyAgICAgKiBhc3NpZ25tZW50IG9uIHRoZSBzdWNjZXNzZnVsIChpLmUuLCBub24tYWJvcnQpIHBhdGguCisgICAgICovCisgICAgX19hc21fXyB2b2xhdGlsZSAoIjE6IC5ieXRlICAweEM3OyAuYnl0ZSAweEY4O1xuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAubG9uZyAgMWYtMWItNlxuIgorICAgICAgICAgICAgICAgICAgICAgICIgICAgam1wICAgMmZcbiIKKyAgICAgICAgICAgICAgICAgICAgICAiMTogIG1vdmwgICUlZWF4LCUwXG4iCisgICAgICAgICAgICAgICAgICAgICAgIjI6IgorICAgICAgICAgICAgICAgICAgICAgIDoiK3IiKHJlcyk6OiJtZW1vcnkiLCIlZWF4Iik7CisjZW5kaWYgLy8gS01QX09TX1dJTkRPV1MKKyAgICByZXR1cm4gcmVzOworfQorCisvKgorICBUcmFuc2FjdGlvbiBlbmQKKyovCitzdGF0aWMgX19pbmxpbmUgdm9pZCBfeGVuZCgpCit7CisjaWYgS01QX09TX1dJTkRPV1MKKyAgICBfX2FzbSAgeworICAgICAgICBfZW1pdCAweDBmCisgICAgICAgIF9lbWl0IDB4MDEKKyAgICAgICAgX2VtaXQgMHhkNQorICAgIH0KKyNlbHNlCisgICAgX19hc21fXyB2b2xhdGlsZSAoIi5ieXRlIDB4MGY7IC5ieXRlIDB4MDE7IC5ieXRlIDB4ZDUiIDo6OiJtZW1vcnkiKTsKKyNlbmRpZgorfQorCisvKgorICBUaGlzIGlzIGEgbWFjcm8sIHRoZSBhcmd1bWVudCBtdXN0IGJlIGEgc2luZ2xlIGJ5dGUgY29uc3RhbnQgd2hpY2gKKyAgY2FuIGJlIGV2YWx1YXRlZCBieSB0aGUgaW5saW5lIGFzc2VtYmxlciwgc2luY2UgaXQgaXMgZW1pdHRlZCBhcyBhCisgIGJ5dGUgaW50byB0aGUgYXNzZW1ibHkgY29kZS4KKyovCisjaWYgS01QX09TX1dJTkRPV1MKKyNkZWZpbmUgX3hhYm9ydChBUkcpICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IDB4YzYgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IDB4ZjggICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfYXNtIF9lbWl0IEFSRworI2Vsc2UKKyNkZWZpbmUgX3hhYm9ydChBUkcpIFwKKyAgICBfX2FzbV9fIHZvbGF0aWxlICgiLmJ5dGUgMHhDNjsgLmJ5dGUgMHhGODsgLmJ5dGUgIiBTVFJJTkdJWkUoQVJHKSA6OjoibWVtb3J5Iik7CisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9DT01QSUxFUl9JQ0MgJiYgX19JTlRFTF9DT01QSUxFUiA+PSAxMzAwCisKKy8vCisvLyAgICBTdGF0aXN0aWNzIGlzIGNvbGxlY3RlZCBmb3IgdGVzdGluZyBwdXJwb3NlCisvLworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCisvLyBXZSBhY2N1bXVsYXRlIHNwZWN1bGF0aXZlIGxvY2sgc3RhdGlzdGljcyB3aGVuIHRoZSBsb2NrIGlzIGRlc3Ryb3llZC4KKy8vIFdlIGtlZXAgbG9ja3MgdGhhdCBoYXZlbid0IGJlZW4gZGVzdHJveWVkIGluIHRoZSBsaXZlTG9ja3MgbGlzdAorLy8gc28gdGhhdCB3ZSBjYW4gZ3JhYiB0aGVpciBzdGF0aXN0aWNzIHRvby4KK3N0YXRpYyBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgZGVzdHJveWVkU3RhdHM7CisKKy8vIFRvIGhvbGQgdGhlIGxpc3Qgb2YgbGl2ZSBsb2Nrcy4KK3N0YXRpYyBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgbGl2ZUxvY2tzOworCisvLyBBIGxvY2sgc28gd2UgY2FuIHNhZmVseSB1cGRhdGUgdGhlIGxpc3Qgb2YgbG9ja3MuCitzdGF0aWMga21wX2Jvb3RzdHJhcF9sb2NrX3QgY2hhaW5fbG9jazsKKworLy8gSW5pdGlhbGl6ZSB0aGUgbGlzdCBvZiBzdGF0cy4KK3ZvaWQKK19fa21wX2luaXRfc3BlY3VsYXRpdmVfc3RhdHMoKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqbGNrID0gJmxpdmVMb2NrczsKKworICAgIG1lbXNldCggKCB2b2lkICogKSAmICggbGNrLT5zdGF0cyApLCAwLCBzaXplb2YoIGxjay0+c3RhdHMgKSApOworICAgIGxjay0+c3RhdHMubmV4dCA9IGxjazsKKyAgICBsY2stPnN0YXRzLnByZXYgPSBsY2s7CisKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworfQorCisvLyBJbnNlcnQgdGhlIGxvY2sgaW50byB0aGUgY2lyY3VsYXIgbGlzdAorc3RhdGljIHZvaWQKK19fa21wX3JlbWVtYmVyX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIGxjayApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIGxjay0+c3RhdHMubmV4dCA9IGxpdmVMb2Nrcy5zdGF0cy5uZXh0OworICAgIGxjay0+c3RhdHMucHJldiA9ICZsaXZlTG9ja3M7CisKKyAgICBsaXZlTG9ja3Muc3RhdHMubmV4dCA9IGxjazsKKyAgICBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgID0gbGNrOworCisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5uZXh0LT5zdGF0cy5wcmV2ID09IGxjayApOworICAgIEtNUF9BU1NFUlQoIGxjay0+c3RhdHMucHJldi0+c3RhdHMubmV4dCA9PSBsY2sgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZjaGFpbl9sb2NrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9mb3JnZXRfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbGNrICkKK3sKKyAgICBLTVBfQVNTRVJUKCBsY2stPnN0YXRzLm5leHQtPnN0YXRzLnByZXYgPT0gbGNrICk7CisgICAgS01QX0FTU0VSVCggbGNrLT5zdGF0cy5wcmV2LT5zdGF0cy5uZXh0ID09IGxjayApOworCisgICAga21wX2FkYXB0aXZlX2xvY2tfaW5mb190ICogbiA9IGxjay0+c3RhdHMubmV4dDsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBwID0gbGNrLT5zdGF0cy5wcmV2OworCisgICAgbi0+c3RhdHMucHJldiA9IHA7CisgICAgcC0+c3RhdHMubmV4dCA9IG47Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF96ZXJvX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIG1lbXNldCggKCB2b2lkICogKSZsY2stPnN0YXRzLCAwLCBzaXplb2YoIGxjay0+c3RhdHMgKSApOworICAgIF9fa21wX3JlbWVtYmVyX2xvY2soIGxjayApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWRkX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKiB0LCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2sgKQoreworICAgIGttcF9hZGFwdGl2ZV9sb2NrX3N0YXRpc3RpY3NfdCB2b2xhdGlsZSAqcyA9ICZsY2stPnN0YXRzOworCisgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgKz0gbGNrLT5hY3F1aXJlX2F0dGVtcHRzOworICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMgKz0gcy0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9uczsKKyAgICB0LT5oYXJkRmFpbGVkU3BlY3VsYXRpb25zICs9IHMtPmhhcmRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAgdC0+c29mdEZhaWxlZFNwZWN1bGF0aW9ucyArPSBzLT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zOworICAgIHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKz0gcy0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlczsKKyAgICB0LT5sZW1taW5nWWllbGRzICAgICAgICAgICs9IHMtPmxlbW1pbmdZaWVsZHM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBsY2spCit7CisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190ICp0ID0gJmRlc3Ryb3llZFN0YXRzOworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJmNoYWluX2xvY2sgKTsKKworICAgIF9fa21wX2FkZF9zdGF0cyggJmRlc3Ryb3llZFN0YXRzLCBsY2sgKTsKKyAgICBfX2ttcF9mb3JnZXRfbG9jayggbGNrICk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmY2hhaW5fbG9jayApOworfQorCitzdGF0aWMgZmxvYXQKK3BlcmNlbnQgKGttcF91aW50MzIgY291bnQsIGttcF91aW50MzIgdG90YWwpCit7CisgICAgcmV0dXJuICh0b3RhbCA9PSAwKSA/IDAuMDogKDEwMC4wICogY291bnQpL3RvdGFsOworfQorCitzdGF0aWMKK0ZJTEUgKiBfX2ttcF9vcGVuX3N0YXRzX2ZpbGUoKQoreworICAgIGlmIChzdHJjbXAgKF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSwgIi0iKSA9PSAwKQorICAgICAgICByZXR1cm4gc3Rkb3V0OworCisgICAgc2l6ZV90IGJ1ZmZMZW4gPSBLTVBfU1RSTEVOKCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKSArIDIwOworICAgIGNoYXIgYnVmZmVyW2J1ZmZMZW5dOworICAgIEtNUF9TTlBSSU5URiAoJmJ1ZmZlclswXSwgYnVmZkxlbiwgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLAorICAgICAgKGttcF9pbnQzMilnZXRwaWQoKSk7CisgICAgRklMRSAqIHJlc3VsdCA9IGZvcGVuKCZidWZmZXJbMF0sICJ3Iik7CisKKyAgICAvLyBNYXliZSB3ZSBzaG91bGQgaXNzdWUgYSB3YXJuaW5nIGhlcmUuLi4KKyAgICByZXR1cm4gcmVzdWx0ID8gcmVzdWx0IDogc3Rkb3V0OworfQorCit2b2lkCitfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpCit7CisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kICE9IGxrX2FkYXB0aXZlKQorICAgICAgICByZXR1cm47CisKKyAgICBGSUxFICogc3RhdHNGaWxlID0gX19rbXBfb3Blbl9zdGF0c19maWxlKCk7CisKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgdG90YWwgPSBkZXN0cm95ZWRTdGF0czsKKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKmxjazsKKworICAgIGZvciAobGNrID0gbGl2ZUxvY2tzLnN0YXRzLm5leHQ7IGxjayAhPSAmbGl2ZUxvY2tzOyBsY2sgPSBsY2stPnN0YXRzLm5leHQpIHsKKyAgICAgICAgX19rbXBfYWRkX3N0YXRzKCAmdG90YWwsIGxjayApOworICAgIH0KKyAgICBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3QgKnQgPSAmdG90YWw7CisgICAga21wX3VpbnQzMiB0b3RhbFNlY3Rpb25zICAgICA9IHQtPm5vblNwZWN1bGF0aXZlQWNxdWlyZXMgKyB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgdG90YWxTcGVjdWxhdGlvbnMgPSB0LT5zdWNjZXNzZnVsU3BlY3VsYXRpb25zICsgdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucyArCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHQtPnNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisKKyAgICBmcHJpbnRmICggc3RhdHNGaWxlLCAiU3BlY3VsYXRpdmUgbG9jayBzdGF0aXN0aWNzIChhbGwgYXBwcm94aW1hdGUhKVxuIik7CisgICAgZnByaW50ZiAoIHN0YXRzRmlsZSwgIiBMb2NrIHBhcmFtZXRlcnM6IFxuIgorICAgICAgICAgICAgICIgICBtYXhfc29mdF9yZXRyaWVzICAgICAgICAgICAgICAgOiAlMTBkXG4iCisgICAgICAgICAgICAgIiAgIG1heF9iYWRuZXNzICAgICAgICAgICAgICAgICAgICA6ICUxMGRcbiIsCisgICAgICAgICAgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcywKKyAgICAgICAgICAgICBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFkbmVzcyk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIE5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHRzIDogJTEwZFxuIiwgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgVG90YWwgY3JpdGljYWwgc2VjdGlvbnMgICAgICAgICAgOiAlMTBkXG4iLCB0b3RhbFNlY3Rpb25zICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIFN1Y2Nlc3NmdWwgc3BlY3VsYXRpb25zICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+c3VjY2Vzc2Z1bFNwZWN1bGF0aW9ucywgdG90YWxTZWN0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIE5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlcyAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcywgcGVyY2VudCggdC0+bm9uU3BlY3VsYXRpdmVBY3F1aXJlcywgdG90YWxTZWN0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIExlbW1pbmcgeWllbGRzICAgICAgICAgICAgICAgICAgIDogJTEwZFxuXG4iLCB0LT5sZW1taW5nWWllbGRzICk7CisKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU3BlY3VsYXRpdmUgYWNxdWlyZSBhdHRlbXB0cyAgICAgOiAlMTBkXG4iLCB0b3RhbFNwZWN1bGF0aW9ucyApOworICAgIGZwcmludGYoIHN0YXRzRmlsZSwgIiBTdWNjZXNzZXMgICAgICAgICAgICAgICAgICAgICAgICA6ICUxMGQgKCU1LjFmJSUpXG4iLAorICAgICAgICAgICAgIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHBlcmNlbnQoIHQtPnN1Y2Nlc3NmdWxTcGVjdWxhdGlvbnMsIHRvdGFsU3BlY3VsYXRpb25zICkgKTsKKyAgICBmcHJpbnRmKCBzdGF0c0ZpbGUsICIgU29mdCBmYWlsdXJlcyAgICAgICAgICAgICAgICAgICAgOiAlMTBkICglNS4xZiUlKVxuIiwKKyAgICAgICAgICAgICB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zLCBwZXJjZW50KCB0LT5zb2Z0RmFpbGVkU3BlY3VsYXRpb25zLCB0b3RhbFNwZWN1bGF0aW9ucyApICk7CisgICAgZnByaW50Ziggc3RhdHNGaWxlLCAiIEhhcmQgZmFpbHVyZXMgICAgICAgICAgICAgICAgICAgIDogJTEwZCAoJTUuMWYlJSlcbiIsCisgICAgICAgICAgICAgdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucywgcGVyY2VudCggdC0+aGFyZEZhaWxlZFNwZWN1bGF0aW9ucywgdG90YWxTcGVjdWxhdGlvbnMgKSApOworCisgICAgaWYgKHN0YXRzRmlsZSAhPSBzdGRvdXQpCisgICAgICAgIGZjbG9zZSggc3RhdHNGaWxlICk7Cit9CisKKyMgZGVmaW5lIEtNUF9JTkNfU1RBVChsY2ssc3RhdCkgKCBsY2stPmxrLmFkYXB0aXZlLnN0YXRzLnN0YXQrKyApCisjZWxzZQorIyBkZWZpbmUgS01QX0lOQ19TVEFUKGxjayxzdGF0KQorCisjZW5kaWYgLy8gS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisKK3N0YXRpYyBpbmxpbmUgYm9vbAorX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApCit7CisgICAgLy8gSXQgaXMgZW5vdWdoIHRvIGNoZWNrIHRoYXQgdGhlIGhlYWRfaWQgaXMgemVyby4KKyAgICAvLyBXZSBkb24ndCBhbHNvIG5lZWQgdG8gY2hlY2sgdGhlIHRhaWwuCisgICAgYm9vbCByZXMgPSBsY2stPmxrLmhlYWRfaWQgPT0gMDsKKworICAgIC8vIFdlIG5lZWQgYSBmZW5jZSBoZXJlLCBzaW5jZSB3ZSBtdXN0IGVuc3VyZSB0aGF0IG5vIG1lbW9yeSBvcGVyYXRpb25zCisgICAgLy8gZnJvbSBsYXRlciBpbiB0aGlzIHRocmVhZCBmbG9hdCBhYm92ZSB0aGF0IHJlYWQuCisjaWYgS01QX0NPTVBJTEVSX0lDQworICAgIF9tbV9tZmVuY2UoKTsKKyNlbHNlCisgICAgX19zeW5jX3N5bmNocm9uaXplKCk7CisjZW5kaWYKKworICAgIHJldHVybiByZXM7Cit9CisKKy8vIEZ1bmN0aW9ucyBmb3IgbWFuaXB1bGF0aW5nIHRoZSBiYWRuZXNzCitzdGF0aWMgX19pbmxpbmUgdm9pZAorX19rbXBfdXBkYXRlX2JhZG5lc3NfYWZ0ZXJfc3VjY2Vzcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICAvLyBSZXNldCB0aGUgYmFkbmVzcyB0byB6ZXJvIHNvIHdlIGVhZ2VybHkgdHJ5IHRvIHNwZWN1bGF0ZSBhZ2FpbgorICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IDA7CisgICAgS01QX0lOQ19TVEFUKGxjayxzdWNjZXNzZnVsU3BlY3VsYXRpb25zKTsKK30KKworLy8gQ3JlYXRlIGEgYml0IG1hc2sgd2l0aCBvbmUgbW9yZSBzZXQgYml0Lgorc3RhdGljIF9faW5saW5lIHZvaWQKK19fa21wX3N0ZXBfYmFkbmVzcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBrbXBfdWludDMyIG5ld0JhZG5lc3MgPSAoIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA8PCAxICkgfCAxOworICAgIGlmICggbmV3QmFkbmVzcyA+IGxjay0+bGsuYWRhcHRpdmUubWF4X2JhZG5lc3MpIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0gZWxzZSB7CisgICAgICAgIGxjay0+bGsuYWRhcHRpdmUuYmFkbmVzcyA9IG5ld0JhZG5lc3M7CisgICAgfQorfQorCisvLyBDaGVjayB3aGV0aGVyIHNwZWN1bGF0aW9uIHNob3VsZCBiZSBhdHRlbXB0ZWQuCitzdGF0aWMgX19pbmxpbmUgaW50CitfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdWludDMyIGJhZG5lc3MgPSBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3M7CisgICAga21wX3VpbnQzMiBhdHRlbXB0cz0gbGNrLT5say5hZGFwdGl2ZS5hY3F1aXJlX2F0dGVtcHRzOworICAgIGludCByZXMgPSAoYXR0ZW1wdHMgJiBiYWRuZXNzKSA9PSAwOworICAgIHJldHVybiByZXM7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWNxdWlyZSBvbmx5IHRoZSBzcGVjdWxhdGl2ZSBsb2NrLgorLy8gRG9lcyBub3QgYmFjayBvZmYgdG8gdGhlIG5vbi1zcGVjdWxhdGl2ZSBsb2NrLgorLy8KK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja19vbmx5KCBrbXBfYWRhcHRpdmVfbG9ja190ICogbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHJpZXMgPSBsY2stPmxrLmFkYXB0aXZlLm1heF9zb2Z0X3JldHJpZXM7CisKKyAgICAvLyBXZSBkb24ndCBleHBsaWNpdGx5IGNvdW50IHRoZSBzdGFydCBvZiBzcGVjdWxhdGlvbiwgcmF0aGVyIHdlIHJlY29yZAorICAgIC8vIHRoZSByZXN1bHRzIChzdWNjZXNzLCBoYXJkIGZhaWwsIHNvZnQgZmFpbCkuIFRoZSBzdW0gb2YgYWxsIG9mIHRob3NlCisgICAgLy8gaXMgdGhlIHRvdGFsIG51bWJlciBvZiB0aW1lcyB3ZSBzdGFydGVkIHNwZWN1bGF0aW9uIHNpbmNlIGFsbAorICAgIC8vIHNwZWN1bGF0aW9ucyBtdXN0IGVuZCBvbmUgb2YgdGhvc2Ugd2F5cy4KKyAgICBkbworICAgIHsKKyAgICAgICAga21wX3VpbnQzMiBzdGF0dXMgPSBfeGJlZ2luKCk7CisgICAgICAgIC8vIFN3aXRjaCB0aGlzIGluIHRvIGRpc2FibGUgYWN0dWFsIHNwZWN1bGF0aW9uIGJ1dCBleGVyY2lzZQorICAgICAgICAvLyBhdCBsZWFzdCBzb21lIG9mIHRoZSByZXN0IG9mIHRoZSBjb2RlLiBVc2VmdWwgZm9yIGRlYnVnZ2luZy4uLgorICAgICAgICAvLyBrbXBfdWludDMyIHN0YXR1cyA9IF9YQUJPUlRfTkVTVEVEOworCisgICAgICAgIGlmIChzdGF0dXMgPT0gX1hCRUdJTl9TVEFSVEVEICkKKyAgICAgICAgeyAvKiBXZSBoYXZlIHN1Y2Nlc3NmdWxseSBzdGFydGVkIHNwZWN1bGF0aW9uCisgICAgICAgICAgICogQ2hlY2sgdGhhdCBuby1vbmUgYWNxdWlyZWQgdGhlIGxvY2sgZm9yIHJlYWwgYmV0d2VlbiB3aGVuIHdlIGxhc3QgbG9va2VkCisgICAgICAgICAgICogYW5kIG5vdy4gVGhpcyBhbHNvIGdldHMgdGhlIGxvY2sgY2FjaGUgbGluZSBpbnRvIG91ciByZWFkLXNldCwKKyAgICAgICAgICAgKiB3aGljaCB3ZSBuZWVkIHNvIHRoYXQgd2UnbGwgYWJvcnQgaWYgYW55b25lIGxhdGVyIGNsYWltcyBpdCBmb3IgcmVhbC4KKyAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGlmICghIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBMb2NrIGlzIG5vdyB2aXNpYmx5IGFjcXVpcmVkLCBzbyBzb21lb25lIGJlYXQgdXMgdG8gaXQuCisgICAgICAgICAgICAgICAgLy8gQWJvcnQgdGhlIHRyYW5zYWN0aW9uIHNvIHdlJ2xsIHJlc3RhcnQgZnJvbSBfeGJlZ2luIHdpdGggdGhlCisgICAgICAgICAgICAgICAgLy8gZmFpbHVyZSBzdGF0dXMuCisgICAgICAgICAgICAgICAgX3hhYm9ydCgweDAxKTsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgInNob3VsZCBub3QgZ2V0IGhlcmUiICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gMTsgICAvLyBMb2NrIGhhcyBiZWVuIGFjcXVpcmVkIChzcGVjdWxhdGl2ZWx5KQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gV2UgaGF2ZSBhYm9ydGVkLCB1cGRhdGUgdGhlIHN0YXRpc3RpY3MKKyAgICAgICAgICAgIGlmICggc3RhdHVzICYgU09GVF9BQk9SVF9NQVNLKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIEtNUF9JTkNfU1RBVChsY2ssc29mdEZhaWxlZFNwZWN1bGF0aW9ucyk7CisgICAgICAgICAgICAgICAgLy8gYW5kIGxvb3Agcm91bmQgdG8gcmV0cnkuCisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgS01QX0lOQ19TVEFUKGxjayxoYXJkRmFpbGVkU3BlY3VsYXRpb25zKTsKKyAgICAgICAgICAgICAgICAvLyBHaXZlIHVwIGlmIHdlIGhhZCBhIGhhcmQgZmFpbHVyZS4KKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0gIHdoaWxlKCByZXRyaWVzLS0gKTsgLy8gTG9vcCB3aGlsZSB3ZSBoYXZlIHJldHJpZXMsIGFuZCBkaWRuJ3QgZmFpbCBoYXJkLgorCisgICAgLy8gRWl0aGVyIHdlIGhhZCBhIGhhcmQgZmFpbHVyZSBvciB3ZSBkaWRuJ3Qgc3VjY2VlZCBzb2Z0bHkgYWZ0ZXIKKyAgICAvLyB0aGUgZnVsbCBzZXQgb2YgYXR0ZW1wdHMsIHNvIGJhY2sgb2ZmIHRoZSBiYWRuZXNzLgorICAgIF9fa21wX3N0ZXBfYmFkbmVzcyggbGNrICk7CisgICAgcmV0dXJuIDA7Cit9CisKKy8vIEF0dGVtcHQgdG8gYWNxdWlyZSB0aGUgc3BlY3VsYXRpdmUgbG9jaywgb3IgYmFjayBvZmYgdG8gdGhlIG5vbi1zcGVjdWxhdGl2ZSBvbmUKKy8vIGlmIHRoZSBzcGVjdWxhdGl2ZSBsb2NrIGNhbm5vdCBiZSBhY3F1aXJlZC4KKy8vIFdlIGNhbiBzdWNjZWVkIHNwZWN1bGF0aXZlbHksIG5vbi1zcGVjdWxhdGl2ZWx5LCBvciBmYWlsLgorc3RhdGljIGludAorX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICAvLyBGaXJzdCB0cnkgdG8gYWNxdWlyZSB0aGUgbG9jayBzcGVjdWxhdGl2ZWx5CisgICAgaWYgKCBfX2ttcF9zaG91bGRfc3BlY3VsYXRlKCBsY2ssIGd0aWQgKSAmJiBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrLCBndGlkICkgKQorICAgICAgICByZXR1cm4gMTsKKworICAgIC8vIFNwZWN1bGF0aXZlIGFjcXVpc2l0aW9uIGZhaWxlZCwgc28gdHJ5IHRvIGFjcXVpcmUgaXQgbm9uLXNwZWN1bGF0aXZlbHkuCisgICAgLy8gQ291bnQgdGhlIG5vbi1zcGVjdWxhdGl2ZSBhY3F1aXJlIGF0dGVtcHQKKyAgICBsY2stPmxrLmFkYXB0aXZlLmFjcXVpcmVfYXR0ZW1wdHMrKzsKKworICAgIC8vIFVzZSBiYXNlLCBub24tc3BlY3VsYXRpdmUgbG9jay4KKyAgICBpZiAoIF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBHRVRfUUxLX1BUUihsY2spLCBndGlkICkgKQorICAgIHsKKyAgICAgICAgS01QX0lOQ19TVEFUKGxjayxub25TcGVjdWxhdGl2ZUFjcXVpcmVzKTsKKyAgICAgICAgcmV0dXJuIDE7ICAgICAgIC8vIExvY2sgaXMgYWNxdWlyZWQgKG5vbi1zcGVjdWxhdGl2ZWx5KQorICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICByZXR1cm4gMDsgICAgICAgLy8gRmFpbGVkIHRvIGFjcXVpcmUgdGhlIGxvY2ssIGl0J3MgYWxyZWFkeSB2aXNpYmx5IGxvY2tlZC4KKyAgICB9Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLnFsay5pbml0aWFsaXplZCAhPSBHRVRfUUxLX1BUUihsY2spICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBpbnQgcmV0dmFsID0gX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGlmICggcmV0dmFsICkgeworICAgICAgICBsY2stPmxrLnFsay5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIH0KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvLyBCbG9jayB1bnRpbCB3ZSBjYW4gYWNxdWlyZSBhIHNwZWN1bGF0aXZlLCBhZGFwdGl2ZSBsb2NrLgorLy8gV2UgY2hlY2sgd2hldGhlciB3ZSBzaG91bGQgYmUgdHJ5aW5nIHRvIHNwZWN1bGF0ZS4KKy8vIElmIHdlIHNob3VsZCBiZSwgd2UgY2hlY2sgdGhlIHJlYWwgbG9jayB0byBzZWUgaWYgaXQgaXMgZnJlZSwKKy8vIGFuZCwgaWYgbm90LCBwYXVzZSB3aXRob3V0IGF0dGVtcHRpbmcgdG8gYWNxdWlyZSBpdCB1bnRpbCBpdCBpcy4KKy8vIFRoZW4gd2UgdHJ5IHRoZSBzcGVjdWxhdGl2ZSBhY3F1aXJlLgorLy8gVGhpcyBtZWFucyB0aGF0IGFsdGhvdWdoIHdlIHN1ZmZlciBmcm9tIGxlbW1pbmdzIGEgbGl0dGxlICgKKy8vIGJlY2F1c2UgYWxsIHdlIGNhbid0IGFjcXVpcmUgdGhlIGxvY2sgc3BlY3VsYXRpdmVseSB1bnRpbAorLy8gdGhlIHF1ZXVlIG9mIHRocmVhZHMgd2FpdGluZyBoYXMgY2xlYXJlZCksIHdlIGRvbid0IGdldCBpbnRvIGEKKy8vIHN0YXRlIHdoZXJlIHdlIGNhbiBuZXZlciBhY3F1aXJlIHRoZSBsb2NrIHNwZWN1bGF0aXZlbHkgKGJlY2F1c2Ugd2UKKy8vIGZvcmNlIHRoZSBxdWV1ZSB0byBjbGVhciBieSBwcmV2ZW50aW5nIG5ldyBhcnJpdmFscyBmcm9tIGVudGVyaW5nIHRoZQorLy8gcXVldWUpLgorLy8gVGhpcyBkb2VzIG1lYW4gdGhhdCB3aGVuIHdlJ3JlIHRyeWluZyB0byBicmVhayBsZW1taW5ncywgdGhlIGxvY2sKKy8vIGlzIG5vIGxvbmdlciBmYWlyLiBIb3dldmVyIE9wZW5NUCBtYWtlcyBubyBndWFyYW50ZWUgdGhhdCBpdHMKKy8vIGxvY2tzIGFyZSBmYWlyLCBzbyB0aGlzIGlzbid0IGEgcmVhbCBwcm9ibGVtLgorc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGlmICggX19rbXBfc2hvdWxkX3NwZWN1bGF0ZSggbGNrLCBndGlkICkgKQorICAgIHsKKyAgICAgICAgaWYgKCBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfdGVzdF9hZGFwdGl2ZV9sb2NrX29ubHkoIGxjayAsIGd0aWQgKSApCisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgLy8gV2UgdHJpZWQgc3BlY3VsYXRpb24gYW5kIGZhaWxlZCwgc28gZ2l2ZSB1cC4KKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFdlIGNhbid0IHRyeSBzcGVjdWxhdGlvbiB1bnRpbCB0aGUgbG9jayBpcyBmcmVlLCBzbyB3ZQorICAgICAgICAgICAgLy8gcGF1c2UgaGVyZSAod2l0aG91dCBzdXNwZW5kaW5nIG9uIHRoZSBxdWV1ZWluZyBsb2NrLAorICAgICAgICAgICAgLy8gdG8gYWxsb3cgaXQgdG8gZHJhaW4sIHRoZW4gdHJ5IGFnYWluLgorICAgICAgICAgICAgLy8gQWxsIG90aGVyIHRocmVhZHMgd2lsbCBhbHNvIHNlZSB0aGUgc2FtZSByZXN1bHQgZm9yCisgICAgICAgICAgICAvLyBzaG91bGRTcGVjdWxhdGUsIHNvIHdpbGwgYmUgZG9pbmcgdGhlIHNhbWUgaWYgdGhleQorICAgICAgICAgICAgLy8gdHJ5IHRvIGNsYWltIHRoZSBsb2NrIGZyb20gbm93IG9uLgorICAgICAgICAgICAgd2hpbGUgKCAhIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayggR0VUX1FMS19QVFIobGNrKSApICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5DX1NUQVQobGNrLGxlbW1pbmdZaWVsZHMpOworICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkIChUUlVFKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgaWYgKCBfX2ttcF90ZXN0X2FkYXB0aXZlX2xvY2tfb25seSggbGNrLCBndGlkICkgKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFNwZWN1bGF0aXZlIGFjcXVpc2l0aW9uIGZhaWxlZCwgc28gYWNxdWlyZSBpdCBub24tc3BlY3VsYXRpdmVseS4KKyAgICAvLyBDb3VudCB0aGUgbm9uLXNwZWN1bGF0aXZlIGFjcXVpcmUgYXR0ZW1wdAorICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cysrOworCisgICAgX19rbXBfYWNxdWlyZV9xdWV1aW5nX2xvY2tfdGltZWRfdGVtcGxhdGU8RkFMU0U+KCBHRVRfUUxLX1BUUihsY2spLCBndGlkICk7CisgICAgLy8gV2UgaGF2ZSBhY3F1aXJlZCB0aGUgYmFzZSBsb2NrLCBzbyBjb3VudCB0aGF0LgorICAgIEtNUF9JTkNfU1RBVChsY2ssbm9uU3BlY3VsYXRpdmVBY3F1aXJlcyApOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfYWRhcHRpdmVfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApID09IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzQWxyZWFkeU93bmVkLCBmdW5jICk7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKworICAgIGxjay0+bGsucWxrLm93bmVyX2lkID0gZ3RpZCArIDE7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKSApCisgICAgeyAgIC8vIElmIHRoZSBsb2NrIGRvZXNuJ3QgbG9vayBjbGFpbWVkIHdlIG11c3QgYmUgc3BlY3VsYXRpbmcuCisgICAgICAgIC8vIChPciB0aGUgdXNlcidzIGNvZGUgaXMgYnVnZ3kgYW5kIHRoZXkncmUgcmVsZWFzaW5nIHdpdGhvdXQgbG9ja2luZzsKKyAgICAgICAgLy8gaWYgd2UgaGFkIFhURVNUIHdlJ2QgYmUgYWJsZSB0byBjaGVjayB0aGF0IGNhc2UuLi4pCisgICAgICAgIF94ZW5kKCk7ICAgICAgICAvLyBFeGl0IHNwZWN1bGF0aW9uCisgICAgICAgIF9fa21wX3VwZGF0ZV9iYWRuZXNzX2FmdGVyX3N1Y2Nlc3MoIGxjayApOworICAgIH0KKyAgICBlbHNlCisgICAgeyAgIC8vIFNpbmNlIHRoZSBsb2NrICppcyogdmlzaWJseSBsb2NrZWQgd2UncmUgbm90IHNwZWN1bGF0aW5nLAorICAgICAgICAvLyBzbyBzaG91bGQgdXNlIHRoZSB1bmRlcmx5aW5nIGxvY2sncyByZWxlYXNlIHNjaGVtZS4KKyAgICAgICAgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjayksIGd0aWQgKTsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1JFTEVBU0VEOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2FkYXB0aXZlX2xvY2tfd2l0aF9jaGVja3MoIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9sb2NrIjsKKyAgICBLTVBfTUIoKTsgIC8qIGluIGNhc2UgYW5vdGhlciBwcm9jZXNzb3IgaW5pdGlhbGl6ZWQgbG9jayAqLworICAgIGlmICggbGNrLT5say5xbGsuaW5pdGlhbGl6ZWQgIT0gR0VUX1FMS19QVFIobGNrKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciggR0VUX1FMS19QVFIobGNrKSApICE9IGd0aWQgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ1NldEJ5QW5vdGhlciwgZnVuYyApOworICAgIH0KKyAgICBsY2stPmxrLnFsay5vd25lcl9pZCA9IDA7CisgICAgX19rbXBfcmVsZWFzZV9hZGFwdGl2ZV9sb2NrKCBsY2ssIGd0aWQgKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2FkYXB0aXZlX2xvY2soIGttcF9hZGFwdGl2ZV9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIEdFVF9RTEtfUFRSKGxjaykgKTsKKyAgICBsY2stPmxrLmFkYXB0aXZlLmJhZG5lc3MgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUuYWNxdWlyZV9hdHRlbXB0cyA9IDA7IC8vbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHMgPSAwOworICAgIGxjay0+bGsuYWRhcHRpdmUubWF4X3NvZnRfcmV0cmllcyA9IF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9zb2Z0X3JldHJpZXM7CisgICAgbGNrLT5say5hZGFwdGl2ZS5tYXhfYmFkbmVzcyAgICAgID0gX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X2JhZG5lc3M7CisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfemVyb19zcGVjdWxhdGl2ZV9zdGF0cyggJmxjay0+bGsuYWRhcHRpdmUgKTsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrOiBsb2NrICVwIGluaXRpYWxpemVkXG4iLCBsY2spKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9hZGFwdGl2ZV9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jaygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3NwZWN1bGF0aXZlX3N0YXRzKCAmbGNrLT5say5hZGFwdGl2ZSApOworI2VuZGlmCisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKEdFVF9RTEtfUFRSKGxjaykpOworICAgIC8vIE5vdGhpbmcgbmVlZGVkIGZvciB0aGUgc3BlY3VsYXRpdmUgcGFydC4KK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9ja193aXRoX2NoZWNrcygga21wX2FkYXB0aXZlX2xvY2tfdCAqbGNrICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfZGVzdHJveV9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsucWxrLmluaXRpYWxpemVkICE9IEdFVF9RTEtfUFRSKGxjaykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9xdWV1aW5nX2xvY2tfb3duZXIoIEdFVF9RTEtfUFRSKGxjaykgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X2FkYXB0aXZlX2xvY2soIGxjayApOworfQorCisKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiBEUkRQQSB0aWNrZXQgbG9ja3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyogIkRSRFBBIiBtZWFucyBEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEgKi8KKworc3RhdGljIGttcF9pbnQzMgorX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIFRDUl80KCBsY2stPmxrLm93bmVyX2lkICkgLSAxOworfQorCitzdGF0aWMgaW5saW5lIGJvb2wKK19fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZGVwdGhfbG9ja2VkICE9IC0xOworfQorCitfX2ZvcmNlaW5saW5lIHN0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSgga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAga21wX3VpbnQ2NCB0aWNrZXQgPSBLTVBfVEVTVF9USEVOX0lOQzY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCk7CisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqcG9sbHMKKyAgICAgID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICBUQ1JfUFRSKGxjay0+bGsucG9sbHMpOyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKworI2lmZGVmIFVTRV9MT0NLX1BST0ZJTEUKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgIT0gdGlja2V0KQorICAgICAgICBfX2ttcF9wcmludGYoIkxPQ0sgQ09OVEVOVElPTjogJXBcbiIsIGxjayk7CisgICAgLyogZWxzZSBfX2ttcF9wcmludGYoICIuIiApOyovCisjZW5kaWYgLyogVVNFX0xPQ0tfUFJPRklMRSAqLworCisgICAgLy8KKyAgICAvLyBOb3cgc3Bpbi13YWl0LCBidXQgcmVsb2FkIHRoZSBwb2xscyBwb2ludGVyIGFuZCBtYXNrLCBpbiBjYXNlIHRoZQorICAgIC8vIHBvbGxpbmcgYXJlYSBoYXMgYmVlbiByZWNvbmZpZ3VyZWQuICBVbmxlc3MgaXQgaXMgcmVjb25maWd1cmVkLCB0aGUKKyAgICAvLyByZWxvYWRzIHN0YXkgaW4gTDEgY2FjaGUgYW5kIGFyZSBjaGVhcC4KKyAgICAvLworICAgIC8vIEtlZXAgdGhpcyBjb2RlIGluIHN5bmMgd2l0aCBLTVBfV0FJVF9ZSUVMRCwgaW4ga21wX2Rpc3BhdGNoLmMgISEhCisgICAgLy8KKyAgICAvLyBUaGUgY3VycmVudCBpbXBsZW1lbnRhdGlvbiBvZiBLTVBfV0FJVF9ZSUVMRCBkb2Vzbid0IGFsbG93IGZvciBtYXNrCisgICAgLy8gYW5kIHBvbGwgdG8gYmUgcmUtcmVhZCBldmVyeSBzcGluIGl0ZXJhdGlvbi4KKyAgICAvLworICAgIGttcF91aW50MzIgc3BpbnM7CisKKyAgICBLTVBfRlNZTkNfUFJFUEFSRShsY2spOworICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKyAgICB3aGlsZSAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPCB0aWNrZXQpIHsgLy8gdm9sYXRpbGUgbG9hZAorICAgICAgICAvLyBJZiB3ZSBhcmUgb3ZlcnN1YnNjcmliZWQsCisgICAgICAgIC8vIG9yIGhhdmUgd2FpdGVkIGEgYml0IChhbmQgS01QX0xJQlJBUlk9dHVybmFyb3VuZCksIHRoZW4geWllbGQuCisgICAgICAgIC8vIENQVSBQYXVzZSBpcyBpbiB0aGUgbWFjcm9zIGZvciB5aWVsZC4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX1lJRUxEKFRDUl80KF9fa21wX250aCkKKyAgICAgICAgICA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSk7CisgICAgICAgIEtNUF9ZSUVMRF9TUElOKHNwaW5zKTsKKworICAgICAgICAvLyBSZS1yZWFkIHRoZSBtYXNrIGFuZCB0aGUgcG9sbCBwb2ludGVyIGZyb20gdGhlIGxvY2sgc3RydWN0dXJlLgorICAgICAgICAvLworICAgICAgICAvLyBNYWtlIGNlcnRhaW4gdGhhdCAibWFzayIgaXMgcmVhZCBiZWZvcmUgInBvbGxzIiAhISEKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSWYgYW5vdGhlciB0aHJlYWQgcGlja3MgcmVjb25maWd1cmVzIHRoZSBwb2xsaW5nIGFyZWEgYW5kIHVwZGF0ZXMKKyAgICAgICAgLy8gdGhlaXIgdmFsdWVzLCBhbmQgd2UgZ2V0IHRoZSBuZXcgdmFsdWUgb2YgbWFzayBhbmQgdGhlIG9sZCBwb2xscworICAgICAgICAvLyBwb2ludGVyLCB3ZSBjb3VsZCBhY2Nlc3MgbWVtb3J5IGJleW9uZCB0aGUgZW5kIG9mIHRoZSBvbGQgcG9sbGluZworICAgICAgICAvLyBhcmVhLgorICAgICAgICAvLworICAgICAgICBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgICAgIHBvbGxzID0gKHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICopCisgICAgICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICB9CisKKyAgICAvLworICAgIC8vIENyaXRpY2FsIHNlY3Rpb24gc3RhcnRzIGhlcmUKKyAgICAvLworICAgIEtNUF9GU1lOQ19BQ1FVSVJFRChsY2spOworICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgYWNxdWlyZWQgbG9jayAlcFxuIiwKKyAgICAgIHRpY2tldCwgbGNrKSk7CisgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorCisgICAgLy8KKyAgICAvLyBEZWFsbG9jYXRlIGEgZ2FyYmFnZSBwb2xsaW5nIGFyZWEgaWYgd2Uga25vdyB0aGF0IHdlIGFyZSB0aGUgbGFzdAorICAgIC8vIHRocmVhZCB0aGF0IGNvdWxkIHBvc3NpYmx5IGFjY2VzcyBpdC4KKyAgICAvLworICAgIC8vIFRoZSA+PSBjaGVjayBpcyBpbiBjYXNlIF9fa21wX3Rlc3RfZHJkcGFfbG9jaygpIGFsbG9jYXRlZCB0aGUgY2xlYW51cAorICAgIC8vIHRpY2tldC4KKyAgICAvLworICAgIGlmICgobGNrLT5say5vbGRfcG9sbHMgIT0gTlVMTCkgJiYgKHRpY2tldCA+PSBsY2stPmxrLmNsZWFudXBfdGlja2V0KSkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5vbGRfcG9sbHMpOworICAgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IE5VTEw7CisgICAgICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgdG8gc2VlIGlmIHdlIHNob3VsZCByZWNvbmZpZ3VyZSB0aGUgcG9sbGluZyBhcmVhLgorICAgIC8vIElmIHRoZXJlIGlzIHN0aWxsIGEgZ2FyYmFnZSBwb2xsaW5nIGFyZWEgdG8gYmUgZGVhbGxvY2F0ZWQgZnJvbSBhCisgICAgLy8gcHJldmlvdXMgcmVjb25maWd1cmF0aW9uLCBsZXQgYSBsYXRlciB0aHJlYWQgcmVjb25maWd1cmUgaXQuCisgICAgLy8KKyAgICBpZiAobGNrLT5say5vbGRfcG9sbHMgPT0gTlVMTCkgeworICAgICAgICBib29sIHJlY29uZmlndXJlID0gZmFsc2U7CisgICAgICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpvbGRfcG9sbHMgPSBwb2xsczsKKyAgICAgICAga21wX3VpbnQzMiBudW1fcG9sbHMgPSBUQ1JfNChsY2stPmxrLm51bV9wb2xscyk7CisKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX250aCkKKyAgICAgICAgICA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFdlIGFyZSBpbiBvdmVyc3Vic2NyaXB0aW9uIG1vZGUuICBDb250cmFjdCB0aGUgcG9sbGluZyBhcmVhCisgICAgICAgICAgICAvLyBkb3duIHRvIGEgc2luZ2xlIGxvY2F0aW9uLCBpZiB0aGF0IGhhc24ndCBiZWVuIGRvbmUgYWxyZWFkeS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAobnVtX3BvbGxzID4gMSkgeworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBudW1fcG9sbHMgPSBUQ1JfNChsY2stPmxrLm51bV9wb2xscyk7CisgICAgICAgICAgICAgICAgbWFzayA9IDA7CisgICAgICAgICAgICAgICAgbnVtX3BvbGxzID0gMTsKKyAgICAgICAgICAgICAgICBwb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUobnVtX3BvbGxzICogc2l6ZW9mKCpwb2xscykpOworICAgICAgICAgICAgICAgIHBvbGxzWzBdLnBvbGwgPSB0aWNrZXQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gV2UgYXJlIGluIHVuZGVyL2Z1bGx5IHN1YnNjcmliZWQgbW9kZS4gIENoZWNrIHRoZSBudW1iZXIgb2YKKyAgICAgICAgICAgIC8vIHRocmVhZHMgd2FpdGluZyBvbiB0aGUgbG9jay4gIFRoZSBzaXplIG9mIHRoZSBwb2xsaW5nIGFyZWEKKyAgICAgICAgICAgIC8vIHNob3VsZCBiZSBhdCBsZWFzdCB0aGUgbnVtYmVyIG9mIHRocmVhZHMgd2FpdGluZy4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBrbXBfdWludDY0IG51bV93YWl0aW5nID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCkgLSB0aWNrZXQgLSAxOworICAgICAgICAgICAgaWYgKG51bV93YWl0aW5nID4gbnVtX3BvbGxzKSB7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBvbGRfbnVtX3BvbGxzID0gbnVtX3BvbGxzOworICAgICAgICAgICAgICAgIHJlY29uZmlndXJlID0gdHJ1ZTsKKyAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgIG1hc2sgPSAobWFzayA8PCAxKSB8IDE7CisgICAgICAgICAgICAgICAgICAgIG51bV9wb2xscyAqPSAyOworICAgICAgICAgICAgICAgIH0gd2hpbGUgKG51bV9wb2xscyA8PSBudW1fd2FpdGluZyk7CisKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIEFsbG9jYXRlIHRoZSBuZXcgcG9sbGluZyBhcmVhLCBhbmQgY29weSB0aGUgcmVsZXZhbnQgcG9ydGlvbgorICAgICAgICAgICAgICAgIC8vIG9mIHRoZSBvbGQgcG9sbGluZyBhcmVhIHRvIHRoZSBuZXcgYXJlYS4gIF9fa21wX2FsbG9jYXRlKCkKKyAgICAgICAgICAgICAgICAvLyB6ZXJvZXMgdGhlIG1lbW9yeSBpdCBhbGxvY2F0ZXMsIGFuZCBtb3N0IG9mIHRoZSBvbGQgYXJlYSBpcworICAgICAgICAgICAgICAgIC8vIGp1c3QgemVybyBwYWRkaW5nLCBzbyB3ZSBvbmx5IGNvcHkgdGhlIHJlbGVhc2UgY291bnRlcnMuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBwb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUobnVtX3BvbGxzICogc2l6ZW9mKCpwb2xscykpOworICAgICAgICAgICAgICAgIGttcF91aW50MzIgaTsKKyAgICAgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgb2xkX251bV9wb2xsczsgaSsrKSB7CisgICAgICAgICAgICAgICAgICAgIHBvbGxzW2ldLnBvbGwgPSBvbGRfcG9sbHNbaV0ucG9sbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBpZiAocmVjb25maWd1cmUpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBOb3cgd3JpdGUgdGhlIHVwZGF0ZWQgZmllbGRzIGJhY2sgdG8gdGhlIGxvY2sgc3RydWN0dXJlLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE1ha2UgY2VydGFpbiB0aGF0ICJwb2xscyIgaXMgd3JpdHRlbiBiZWZvcmUgIm1hc2siICEhIQorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIGFub3RoZXIgdGhyZWFkIHBpY2tzIHVwIHRoZSBuZXcgdmFsdWUgb2YgbWFzayBhbmQgdGhlIG9sZAorICAgICAgICAgICAgLy8gcG9sbHMgcG9pbnRlciAsIGl0IGNvdWxkIGFjY2VzcyBtZW1vcnkgYmV5b25kIHRoZSBlbmQgb2YgdGhlCisgICAgICAgICAgICAvLyBvbGQgcG9sbGluZyBhcmVhLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9uIHg4Niwgd2UgbmVlZCBtZW1vcnkgZmVuY2VzLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIEtBX1RSQUNFKDEwMDAsICgiX19rbXBfYWNxdWlyZV9kcmRwYV9sb2NrOiB0aWNrZXQgIyVsbGQgcmVjb25maWd1cmluZyBsb2NrICVwIHRvICVkIHBvbGxzXG4iLAorICAgICAgICAgICAgICB0aWNrZXQsIGxjaywgbnVtX3BvbGxzKSk7CisKKyAgICAgICAgICAgIGxjay0+bGsub2xkX3BvbGxzID0gb2xkX3BvbGxzOyAgICAgICAgICAgICAgLy8gbm9uLXZvbGF0aWxlIHN0b3JlCisgICAgICAgICAgICBsY2stPmxrLnBvbGxzID0gcG9sbHM7ICAgICAgICAgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIHN0b3JlCisKKyAgICAgICAgICAgIEtNUF9NQigpOworCisgICAgICAgICAgICBsY2stPmxrLm51bV9wb2xscyA9IG51bV9wb2xsczsgICAgICAgICAgICAgIC8vIG5vbi12b2xhdGlsZSBzdG9yZQorICAgICAgICAgICAgbGNrLT5say5tYXNrID0gbWFzazsgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBzdG9yZQorCisgICAgICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9ubHkgYWZ0ZXIgdGhlIG5ldyBwb2xsaW5nIGFyZWEgYW5kIG1hc2sgaGF2ZSBiZWVuIGZsdXNoZWQKKyAgICAgICAgICAgIC8vIHRvIG1haW4gbWVtb3J5IGNhbiB3ZSB1cGRhdGUgdGhlIGNsZWFudXAgdGlja2V0IGZpZWxkLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQgLyBub24tdm9sYXRpbGUgc3RvcmUKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBsY2stPmxrLmNsZWFudXBfdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX0FDUVVJUkVEX0ZJUlNUOworfQorCitpbnQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgcmV0dXJuIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX2FjcXVpcmVfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAoIGd0aWQgPj0gMCApICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgbGNrLT5say5vd25lcl9pZCA9IGd0aWQgKyAxOworICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKK30KKworaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gRmlyc3QgZ2V0IGEgdGlja2V0LCB0aGVuIHJlYWQgdGhlIHBvbGxzIHBvaW50ZXIgYW5kIHRoZSBtYXNrLgorICAgIC8vIFRoZSBwb2xscyBwb2ludGVyIG11c3QgYmUgcmVhZCBiZWZvcmUgdGhlIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gVENSXzgobGNrLT5say5uZXh0X3RpY2tldCk7ICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKnBvbGxzCisgICAgICA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgVENSX1BUUihsY2stPmxrLnBvbGxzKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAga21wX3VpbnQ2NCBtYXNrID0gVENSXzgobGNrLT5say5tYXNrKTsgICAgICAgICAgICAgIC8vIHZvbGF0aWxlIGxvYWQKKyAgICBpZiAoVENSXzgocG9sbHNbdGlja2V0ICYgbWFza10ucG9sbCkgPT0gdGlja2V0KSB7CisgICAgICAgIGttcF91aW50NjQgbmV4dF90aWNrZXQgPSB0aWNrZXQgKyAxOworICAgICAgICBpZiAoS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KChrbXBfaW50NjQgKikmbGNrLT5say5uZXh0X3RpY2tldCwKKyAgICAgICAgICB0aWNrZXQsIG5leHRfdGlja2V0KSkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0FDUVVJUkVEKGxjayk7CisgICAgICAgICAgICBLQV9UUkFDRSgxMDAwLCAoIl9fa21wX3Rlc3RfZHJkcGFfbG9jazogdGlja2V0ICMlbGxkIGFjcXVpcmVkIGxvY2sgJXBcbiIsCisgICAgICAgICAgICAgICB0aWNrZXQsIGxjaykpOworICAgICAgICAgICAgbGNrLT5say5ub3dfc2VydmluZyA9IHRpY2tldDsgICAgICAgICAgICAgICAvLyBub24tdm9sYXRpbGUgc3RvcmUKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNpbmNlIG5vIHRocmVhZHMgYXJlIHdhaXRpbmcsIHRoZXJlIGlzIG5vIHBvc3NpYmlsaXR5IHRoYXQKKyAgICAgICAgICAgIC8vIHdlIHdvdWxkIHdhbnQgdG8gcmVjb25maWd1cmUgdGhlIHBvbGxpbmcgYXJlYS4gIFdlIG1pZ2h0CisgICAgICAgICAgICAvLyBoYXZlIHRoZSBjbGVhbnVwIHRpY2tldCB2YWx1ZSAod2hpY2ggc2F5cyB0aGF0IGl0IGlzIG5vdworICAgICAgICAgICAgLy8gc2FmZSB0byBkZWFsbG9jYXRlIG9sZF9wb2xscyksIGJ1dCB3ZSdsbCBsZXQgYSBsYXRlciB0aHJlYWQKKyAgICAgICAgICAgIC8vIHdoaWNoIGNhbGxzIF9fa21wX2FjcXVpcmVfbG9jayBkbyB0aGF0IC0gdGhpcyByb3V0aW5lCisgICAgICAgICAgICAvLyBpc24ndCBzdXBwb3NlZCB0byBibG9jaywgYW5kIHdlIHdvdWxkIHJpc2sgYmxvY2tzIGlmIHdlCisgICAgICAgICAgICAvLyBjYWxsZWQgX19rbXBfZnJlZSgpIHRvIGRvIHRoZSBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAvLworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIEZBTFNFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF90ZXN0X2xvY2siOworICAgIGlmICggbGNrLT5say5pbml0aWFsaXplZCAhPSBsY2sgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgIH0KKworICAgIGludCByZXR2YWwgPSBfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworCisgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworaW50CitfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIC8vCisgICAgLy8gUmVhZCB0aGUgdGlja2V0IHZhbHVlIGZyb20gdGhlIGxvY2sgZGF0YSBzdHJ1Y3QsIHRoZW4gdGhlIHBvbGxzCisgICAgLy8gcG9pbnRlciBhbmQgdGhlIG1hc2suICBUaGUgcG9sbHMgcG9pbnRlciBtdXN0IGJlIHJlYWQgYmVmb3JlIHRoZQorICAgIC8vIG1hc2shISEgKFNlZSBhYm92ZSkKKyAgICAvLworICAgIGttcF91aW50NjQgdGlja2V0ID0gbGNrLT5say5ub3dfc2VydmluZyArIDE7ICAgICAgICAvLyBub24tdm9sYXRpbGUgbG9hZAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrOjprbXBfbG9ja19wb2xsICpwb2xscworICAgICAgPSAodm9sYXRpbGUgc3RydWN0IGttcF9iYXNlX2RyZHBhX2xvY2s6OmttcF9sb2NrX3BvbGwgKikKKyAgICAgIFRDUl9QVFIobGNrLT5say5wb2xscyk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gdm9sYXRpbGUgbG9hZAorICAgIGttcF91aW50NjQgbWFzayA9IFRDUl84KGxjay0+bGsubWFzayk7ICAgICAgICAgICAgICAvLyB2b2xhdGlsZSBsb2FkCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2s6IHRpY2tldCAjJWxsZCByZWxlYXNlZCBsb2NrICVwXG4iLAorICAgICAgIHRpY2tldCAtIDEsIGxjaykpOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcobGNrKTsKKyAgICBLTVBfU1RfUkVMNjQoJihwb2xsc1t0aWNrZXQgJiBtYXNrXS5wb2xsKSwgdGlja2V0KTsgLy8gdm9sYXRpbGUgc3RvcmUKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Vuc2V0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApID09IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tVbnNldHRpbmdGcmVlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggKCBndGlkID49IDAgKSAmJiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA+PSAwICkKKyAgICAgICYmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IGd0aWQgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX2RyZHBhX2xvY2soIGxjaywgZ3RpZCApOworfQorCit2b2lkCitfX2ttcF9pbml0X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5sb2NhdGlvbiA9IE5VTEw7CisgICAgbGNrLT5say5tYXNrID0gMDsKKyAgICBsY2stPmxrLm51bV9wb2xscyA9IDE7CisgICAgbGNrLT5say5wb2xscyA9ICh2b2xhdGlsZSBzdHJ1Y3Qga21wX2Jhc2VfZHJkcGFfbG9jazo6a21wX2xvY2tfcG9sbCAqKQorICAgICAgX19rbXBfYWxsb2NhdGUobGNrLT5say5udW1fcG9sbHMgKiBzaXplb2YoKihsY2stPmxrLnBvbGxzKSkpOworICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIGxjay0+bGsub2xkX3BvbGxzID0gTlVMTDsKKyAgICBsY2stPmxrLm5leHRfdGlja2V0ID0gMDsKKyAgICBsY2stPmxrLm5vd19zZXJ2aW5nID0gMDsKKyAgICBsY2stPmxrLm93bmVyX2lkID0gMDsgICAgICAvLyBubyB0aHJlYWQgb3ducyB0aGUgbG9jay4KKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IC0xOyAvLyA+PSAwIGZvciBuZXN0YWJsZSBsb2NrcywgLTEgZm9yIHNpbXBsZSBsb2Nrcy4KKyAgICBsY2stPmxrLmluaXRpYWxpemVkID0gbGNrOworCisgICAgS0FfVFJBQ0UoMTAwMCwgKCJfX2ttcF9pbml0X2RyZHBhX2xvY2s6IGxvY2sgJXAgaW5pdGlhbGl6ZWRcbiIsIGxjaykpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X2RyZHBhX2xvY2soIGxjayApOworfQorCit2b2lkCitfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgbGNrLT5say5pbml0aWFsaXplZCA9IE5VTEw7CisgICAgbGNrLT5say5sb2NhdGlvbiAgICA9IE5VTEw7CisgICAgaWYgKGxjay0+bGsucG9sbHMgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5wb2xscyk7CisgICAgICAgIGxjay0+bGsucG9sbHMgPSBOVUxMOworICAgIH0KKyAgICBpZiAobGNrLT5say5vbGRfcG9sbHMgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKCh2b2lkICopbGNrLT5say5vbGRfcG9sbHMpOworICAgICAgICBsY2stPmxrLm9sZF9wb2xscyA9IE5VTEw7CisgICAgfQorICAgIGxjay0+bGsubWFzayA9IDA7CisgICAgbGNrLT5say5udW1fcG9sbHMgPSAwOworICAgIGxjay0+bGsuY2xlYW51cF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubmV4dF90aWNrZXQgPSAwOworICAgIGxjay0+bGsubm93X3NlcnZpbmcgPSAwOworICAgIGxjay0+bGsub3duZXJfaWQgPSAwOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gLTE7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfaXNfZHJkcGFfbG9ja19uZXN0YWJsZSggbGNrICkgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja05lc3RhYmxlVXNlZEFzU2ltcGxlLCBmdW5jICk7CisgICAgfQorICAgIGlmICggX19rbXBfZ2V0X2RyZHBhX2xvY2tfb3duZXIoIGxjayApICE9IC0xICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTdGlsbE93bmVkLCBmdW5jICk7CisgICAgfQorICAgIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jayggbGNrICk7Cit9CisKKworLy8KKy8vIG5lc3RlZCBkcmRwYSB0aWNrZXQgbG9ja3MKKy8vCisKK2ludAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICkgeworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCArPSAxOworICAgICAgICByZXR1cm4gS01QX0xPQ0tfQUNRVUlSRURfTkVYVDsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfZHJkcGFfbG9ja190aW1lZF90ZW1wbGF0ZSggbGNrLCBndGlkICk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICBsY2stPmxrLm93bmVyX2lkID0gZ3RpZCArIDE7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19BQ1FVSVJFRF9GSVJTVDsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X25lc3RfbG9jayI7CisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaW50IHJldHZhbDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworCisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gZ3RpZCApIHsKKyAgICAgICAgcmV0dmFsID0gKytsY2stPmxrLmRlcHRoX2xvY2tlZDsKKyAgICB9CisgICAgZWxzZSBpZiAoICFfX2ttcF90ZXN0X2RyZHBhX2xvY2soIGxjaywgZ3RpZCApICkgeworICAgICAgICByZXR2YWwgPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHZhbCA9IGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIGxjay0+bGsub3duZXJfaWQgPSBndGlkICsgMTsKKyAgICB9CisgICAgcmV0dXJuIHJldHZhbDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9ja193aXRoX2NoZWNrcygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICByZXR1cm4gX19rbXBfdGVzdF9uZXN0ZWRfZHJkcGFfbG9jayggbGNrLCBndGlkICk7Cit9CisKK2ludAorX19rbXBfcmVsZWFzZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCA+PSAwICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICBpZiAoIC0tKGxjay0+bGsuZGVwdGhfbG9ja2VkKSA9PSAwICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgbGNrLT5say5vd25lcl9pZCA9IDA7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jayggbGNrLCBndGlkICk7CisgICAgICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKKyAgICB9CisgICAgcmV0dXJuIEtNUF9MT0NLX1NUSUxMX0hFTEQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIGNoYXIgY29uc3QgKiBjb25zdCBmdW5jID0gIm9tcF91bnNldF9uZXN0X2xvY2siOworICAgIEtNUF9NQigpOyAgLyogaW4gY2FzZSBhbm90aGVyIHByb2Nlc3NvciBpbml0aWFsaXplZCBsb2NrICovCisgICAgaWYgKCBsY2stPmxrLmluaXRpYWxpemVkICE9IGxjayApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgfQorICAgIGlmICggISBfX2ttcF9pc19kcmRwYV9sb2NrX25lc3RhYmxlKCBsY2sgKSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU2ltcGxlVXNlZEFzTmVzdGFibGUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgPT0gLTEgKSB7CisgICAgICAgIEtNUF9GQVRBTCggTG9ja1Vuc2V0dGluZ0ZyZWUsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9nZXRfZHJkcGFfbG9ja19vd25lciggbGNrICkgIT0gZ3RpZCApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrVW5zZXR0aW5nU2V0QnlBbm90aGVyLCBmdW5jICk7CisgICAgfQorICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX25lc3RlZF9kcmRwYV9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKwordm9pZAorX19rbXBfaW5pdF9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqIGxjayApCit7CisgICAgX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBsY2sgKTsKKyAgICBsY2stPmxrLmRlcHRoX2xvY2tlZCA9IDA7IC8vID49IDAgZm9yIG5lc3RhYmxlIGxvY2tzLCAtMSBmb3Igc2ltcGxlIGxvY2tzCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfZHJkcGFfbG9ja190ICogbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X25lc3RlZF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKwordm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9kZXN0cm95X2RyZHBhX2xvY2soIGxjayApOworICAgIGxjay0+bGsuZGVwdGhfbG9ja2VkID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfbmVzdGVkX2RyZHBhX2xvY2tfd2l0aF9jaGVja3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX2Rlc3Ryb3lfbmVzdF9sb2NrIjsKKyAgICBpZiAoIGxjay0+bGsuaW5pdGlhbGl6ZWQgIT0gbGNrICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICB9CisgICAgaWYgKCAhIF9fa21wX2lzX2RyZHBhX2xvY2tfbmVzdGFibGUoIGxjayApICkgeworICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKCBsY2sgKSAhPSAtMSApIHsKKyAgICAgICAgS01QX0ZBVEFMKCBMb2NrU3RpbGxPd25lZCwgZnVuYyApOworICAgIH0KKyAgICBfX2ttcF9kZXN0cm95X25lc3RlZF9kcmRwYV9sb2NrKCBsY2sgKTsKK30KKworCisvLworLy8gYWNjZXNzIGZ1bmN0aW9ucyB0byBmaWVsZHMgd2hpY2ggZG9uJ3QgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKworc3RhdGljIGludAorX19rbXBfaXNfZHJkcGFfbG9ja19pbml0aWFsaXplZCgga21wX2RyZHBhX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gbGNrID09IGxjay0+bGsuaW5pdGlhbGl6ZWQ7Cit9CisKK3N0YXRpYyBjb25zdCBpZGVudF90ICoKK19fa21wX2dldF9kcmRwYV9sb2NrX2xvY2F0aW9uKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBsY2stPmxrLmxvY2F0aW9uOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc2V0X2RyZHBhX2xvY2tfbG9jYXRpb24oIGttcF9kcmRwYV9sb2NrX3QgKmxjaywgY29uc3QgaWRlbnRfdCAqbG9jICkKK3sKKyAgICBsY2stPmxrLmxvY2F0aW9uID0gbG9jOworfQorCitzdGF0aWMga21wX2xvY2tfZmxhZ3NfdAorX19rbXBfZ2V0X2RyZHBhX2xvY2tfZmxhZ3MoIGttcF9kcmRwYV9sb2NrX3QgKmxjayApCit7CisgICAgcmV0dXJuIGxjay0+bGsuZmxhZ3M7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICkKK3sKKyAgICBsY2stPmxrLmZsYWdzID0gZmxhZ3M7Cit9CisKKy8vIFRpbWUgc3RhbXAgY291bnRlcgorI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgZGVmaW5lIF9fa21wX3RzYygpIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcCgpCisvLyBSdW50aW1lJ3MgZGVmYXVsdCBiYWNrb2ZmIHBhcmFtZXRlcnMKK2ttcF9iYWNrb2ZmX3QgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcyA9IHsgMSwgNDA5NiwgMTAwIH07CisjZWxzZQorLy8gVXNlIG5hbm9zZWNvbmRzIGZvciBvdGhlciBwbGF0Zm9ybXMKK2V4dGVybiBrbXBfdWludDY0IF9fa21wX25vd19uc2VjKCk7CitrbXBfYmFja29mZl90IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMgPSB7IDEsIDI1NiwgMTAwIH07CisjIGRlZmluZSBfX2ttcF90c2MoKSBfX2ttcF9ub3dfbnNlYygpCisjZW5kaWYKKworLy8gQSB1c2VmdWwgcHJlZGljYXRlIGZvciBkZWFsaW5nIHdpdGggdGltZXN0YW1wcyB0aGF0IG1heSB3cmFwLgorLy8gSXMgYSBiZWZvcmUgYj8KKy8vIFNpbmNlIHRoZSB0aW1lc3RhbXBzIG1heSB3cmFwLCB0aGlzIGlzIGFza2luZyB3aGV0aGVyIGl0J3MKKy8vIHNob3J0ZXIgdG8gZ28gY2xvY2t3aXNlIGZyb20gYSB0byBiIGFyb3VuZCB0aGUgY2xvY2stZmFjZSwgb3IgYW50aS1jbG9ja3dpc2UuCisvLyBUaW1lcyB3aGVyZSBnb2luZyBjbG9ja3dpc2UgaXMgbGVzcyBkaXN0YW5jZSB0aGFuIGdvaW5nIGFudGktY2xvY2t3aXNlCisvLyBhcmUgaW4gdGhlIGZ1dHVyZSwgb3RoZXJzIGFyZSBpbiB0aGUgcGFzdC4KKy8vIGUuZy4pIGEgPSBNQVgtMSwgYiA9IE1BWCsxICg9MCksIHRoZW4gYSA+IGIgKHRydWUpIGRvZXMgbm90IG1lYW4gYSByZWFjaGVkIGIKKy8vICAgICAgIHdoZXJlYXMgc2lnbmVkKGEpID0gLTIsIHNpZ25lZChiKSA9IDAgY2FwdHVyZXMgdGhlIGFjdHVhbCBkaWZmZXJlbmNlCitzdGF0aWMgaW5saW5lIGJvb2wgYmVmb3JlKGttcF91aW50NjQgYSwga21wX3VpbnQ2NCBiKQoreworICAgIHJldHVybiAoKGttcF9pbnQ2NCliIC0gKGttcF9pbnQ2NClhKSA+IDA7Cit9CisKKy8vIFRydW5jYXRlZCBiaW5hcnkgZXhwb25lbnRpYWwgYmFja29mZiBmdW5jdGlvbgordm9pZAorX19rbXBfc3Bpbl9iYWNrb2ZmKGttcF9iYWNrb2ZmX3QgKmJvZmYpCit7CisgICAgLy8gV2UgY291bGQgZmxhdHRlbiB0aGlzIGxvb3AsIGJ1dCBtYWtpbmcgaXQgYSBuZXN0ZWQgbG9vcCBnaXZlcyBiZXR0ZXIgcmVzdWx0LgorICAgIGttcF91aW50MzIgaTsKKyAgICBmb3IgKGkgPSBib2ZmLT5zdGVwOyBpID4gMDsgaS0tKSB7CisgICAgICAgIGttcF91aW50NjQgZ29hbCA9IF9fa21wX3RzYygpICsgYm9mZi0+bWluX3RpY2s7CisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgfSB3aGlsZSAoYmVmb3JlKF9fa21wX3RzYygpLCBnb2FsKSk7CisgICAgfQorICAgIGJvZmYtPnN0ZXAgPSAoYm9mZi0+c3RlcDw8MSB8IDEpICYgKGJvZmYtPm1heF9iYWNrb2ZmLTEpOworfQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8gRGlyZWN0IGxvY2sgaW5pdGlhbGl6ZXJzLiBJdCBzaW1wbHkgd3JpdGVzIGEgdGFnIHRvIHRoZSBsb3cgOCBiaXRzIG9mIHRoZSBsb2NrIHdvcmQuCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0X2RpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfZHluYV9sb2Nrc2VxX3Qgc2VxKQoreworICAgIFRDV180KCpsY2ssIEtNUF9HRVRfRF9UQUcoc2VxKSk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaW5pdF9kaXJlY3RfbG9jazogaW5pdGlhbGl6ZWQgZGlyZWN0IGxvY2sgd2l0aCB0eXBlIyVkXG4iLCBzZXEpKTsKK30KKworI2lmIEtNUF9VU0VfVFNYCisKKy8vIEhMRSBsb2NrIGZ1bmN0aW9ucyAtIGltcG9ydGVkIGZyb20gdGhlIHRlc3RiZWQgcnVudGltZS4KKyNkZWZpbmUgSExFX0FDUVVJUkUgIi5ieXRlIDB4ZjI7IgorI2RlZmluZSBITEVfUkVMRUFTRSAiLmJ5dGUgMHhmMzsiCisKK3N0YXRpYyBpbmxpbmUga21wX3VpbnQzMgorc3dhcDQoa21wX3VpbnQzMiB2b2xhdGlsZSAqcCwga21wX3VpbnQzMiB2KQoreworICAgIF9fYXNtX18gdm9sYXRpbGUoSExFX0FDUVVJUkUgInhjaGcgJTEsJTAiCisgICAgICAgICAgICAgICAgICAgIDogIityIih2KSwgIittIigqcCkKKyAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gdjsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfaGxlX2xvY2soa21wX2R5bmFfbG9ja190ICpsY2spCit7CisgICAgVENXXzQoKmxjaywgMCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hY3F1aXJlX2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICAvLyBVc2UgZ3RpZCBmb3IgS01QX0xPQ0tfQlVTWSBpZiBuZWNlc3NhcnkKKyAgICBpZiAoc3dhcDQobGNrLCBLTVBfTE9DS19CVVNZKDEsIGhsZSkpICE9IEtNUF9MT0NLX0ZSRUUoaGxlKSkgeworICAgICAgICBpbnQgZGVsYXkgPSAxOworICAgICAgICBkbyB7CisgICAgICAgICAgICB3aGlsZSAoKihrbXBfdWludDMyIHZvbGF0aWxlICopbGNrICE9IEtNUF9MT0NLX0ZSRUUoaGxlKSkgeworICAgICAgICAgICAgICAgIGZvciAoaW50IGkgPSBkZWxheTsgaSAhPSAwOyAtLWkpCisgICAgICAgICAgICAgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgICAgICAgICBkZWxheSA9ICgoZGVsYXkgPDwgMSkgfCAxKSAmIDc7CisgICAgICAgICAgICB9CisgICAgICAgIH0gd2hpbGUgKHN3YXA0KGxjaywgS01QX0xPQ0tfQlVTWSgxLCBobGUpKSAhPSBLTVBfTE9DS19GUkVFKGhsZSkpOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfaGxlX2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIF9fa21wX2FjcXVpcmVfaGxlX2xvY2sobGNrLCBndGlkKTsgLy8gVE9ETzogYWRkIGNoZWNrcworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX2hsZV9sb2NrKGttcF9keW5hX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBfX2FzbV9fIHZvbGF0aWxlKEhMRV9SRUxFQVNFICJtb3ZsICUxLCUwIgorICAgICAgICAgICAgICAgICAgICA6ICI9bSIoKmxjaykKKyAgICAgICAgICAgICAgICAgICAgOiAiciIoS01QX0xPQ0tfRlJFRShobGUpKQorICAgICAgICAgICAgICAgICAgICA6ICJtZW1vcnkiKTsKKyAgICByZXR1cm4gS01QX0xPQ0tfUkVMRUFTRUQ7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3JlbGVhc2VfaGxlX2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF9yZWxlYXNlX2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9obGVfbG9jayhrbXBfZHluYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgcmV0dXJuIHN3YXA0KGxjaywgS01QX0xPQ0tfQlVTWSgxLCBobGUpKSA9PSBLTVBfTE9DS19GUkVFKGhsZSk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaGxlX2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X2hsZV9sb2NrKGxjaywgZ3RpZCk7IC8vIFRPRE86IGFkZCBjaGVja3MKK30KKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2spCit7CisgICAgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2sobGNrKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2Rlc3Ryb3lfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2spCit7CisgICAgX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sobGNrKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2FjcXVpcmVfcnRtX2xvY2soa21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIHVuc2lnbmVkIHJldHJpZXM9Mywgc3RhdHVzOworICAgIGRvIHsKKyAgICAgICAgc3RhdHVzID0gX3hiZWdpbigpOworICAgICAgICBpZiAoc3RhdHVzID09IF9YQkVHSU5fU1RBUlRFRCkgeworICAgICAgICAgICAgaWYgKF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKQorICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIF94YWJvcnQoMHhmZik7CisgICAgICAgIH0KKyAgICAgICAgaWYgKChzdGF0dXMgJiBfWEFCT1JUX0VYUExJQ0lUKSAmJiBfWEFCT1JUX0NPREUoc3RhdHVzKSA9PSAweGZmKSB7CisgICAgICAgICAgICAvLyBXYWl0IHVudGlsIGxvY2sgYmVjb21lcyBmcmVlCisgICAgICAgICAgICB3aGlsZSAoISBfX2ttcF9pc191bmxvY2tlZF9xdWV1aW5nX2xvY2sobGNrKSkKKyAgICAgICAgICAgICAgICBfX2ttcF95aWVsZChUUlVFKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICghKHN0YXR1cyAmIF9YQUJPUlRfUkVUUlkpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgfSB3aGlsZSAocmV0cmllcy0tKTsKKworICAgIC8vIEZhbGwtYmFjayBub24tc3BlY3VsYXRpdmUgbG9jayAoeGNoZykKKyAgICBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfYWNxdWlyZV9ydG1fbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgX19rbXBfYWNxdWlyZV9ydG1fbG9jayhsY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF9yZWxlYXNlX3J0bV9sb2NrKGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBpZiAoX19rbXBfaXNfdW5sb2NrZWRfcXVldWluZ19sb2NrKGxjaykpIHsKKyAgICAgICAgLy8gUmVsZWFzaW5nIGZyb20gc3BlY3VsYXRpb24KKyAgICAgICAgX3hlbmQoKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFJlbGVhc2luZyBmcm9tIGEgcmVhbCBsb2NrCisgICAgICAgIF9fa21wX3JlbGVhc2VfcXVldWluZ19sb2NrKGxjaywgZ3RpZCk7CisgICAgfQorICAgIHJldHVybiBLTVBfTE9DS19SRUxFQVNFRDsKK30KKworc3RhdGljIGludAorX19rbXBfcmVsZWFzZV9ydG1fbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgcmV0dXJuIF9fa21wX3JlbGVhc2VfcnRtX2xvY2sobGNrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9ydG1fbG9jayhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgdW5zaWduZWQgcmV0cmllcz0zLCBzdGF0dXM7CisgICAgZG8geworICAgICAgICBzdGF0dXMgPSBfeGJlZ2luKCk7CisgICAgICAgIGlmIChzdGF0dXMgPT0gX1hCRUdJTl9TVEFSVEVEICYmIF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKSB7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIShzdGF0dXMgJiBfWEFCT1JUX1JFVFJZKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0gd2hpbGUgKHJldHJpZXMtLSk7CisKKyAgICByZXR1cm4gKF9fa21wX2lzX3VubG9ja2VkX3F1ZXVpbmdfbG9jayhsY2spKT8gMTogMDsKK30KKworc3RhdGljIGludAorX19rbXBfdGVzdF9ydG1fbG9ja193aXRoX2NoZWNrcyhrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQpCit7CisgICAgcmV0dXJuIF9fa21wX3Rlc3RfcnRtX2xvY2sobGNrLCBndGlkKTsKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfVFNYCisKKy8vIEVudHJ5IGZ1bmN0aW9ucyBmb3IgaW5kaXJlY3QgbG9ja3MgKGZpcnN0IGVsZW1lbnQgb2YgZGlyZWN0IGxvY2sganVtcCB0YWJsZXMpLgorc3RhdGljIHZvaWQgX19rbXBfaW5pdF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGwsIGttcF9keW5hX2xvY2tzZXFfdCB0YWcpOworc3RhdGljIHZvaWQgX19rbXBfZGVzdHJveV9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2spOworc3RhdGljIHZvaWQgX19rbXBfc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyBpbnQgIF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyBpbnQgIF9fa21wX3Rlc3RfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworc3RhdGljIHZvaWQgX19rbXBfc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyBpbnQgIF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyKTsKK3N0YXRpYyBpbnQgIF9fa21wX3Rlc3RfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcyhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIpOworCisvLworLy8gSnVtcCB0YWJsZXMgZm9yIHRoZSBpbmRpcmVjdCBsb2NrIGZ1bmN0aW9ucy4KKy8vIE9ubHkgZmlsbCBpbiB0aGUgb2RkIGVudHJpZXMsIHRoYXQgYXZvaWRzIHRoZSBuZWVkIHRvIHNoaWZ0IG91dCB0aGUgbG93IGJpdC4KKy8vCisKKy8vIGluaXQgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCxfX2ttcF9pbml0X2RpcmVjdF9sb2NrLAordm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpCisgICAgPSB7IF9fa21wX2luaXRfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgaW5pdCkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gZGVzdHJveSBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLCh2b2lkICgqKShrbXBfZHluYV9sb2NrX3QgKikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2ssCit2b2lkICgqX19rbXBfZGlyZWN0X2Rlc3Ryb3lbXSkoa21wX2R5bmFfbG9ja190ICopCisgICAgPSB7IF9fa21wX2Rlc3Ryb3lfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgZGVzdHJveSkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gc2V0L2FjcXVpcmUgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwodm9pZCAoKikoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2ssCitzdGF0aWMgdm9pZCAoKmRpcmVjdF9zZXRbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfc2V0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGFjcXVpcmUpIH07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwodm9pZCAoKikoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2tfd2l0aF9jaGVja3MsCitzdGF0aWMgdm9pZCAoKmRpcmVjdF9zZXRfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3MsIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIGFjcXVpcmUpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIHVuc2V0L3JlbGVhc2UgYW5kIHRlc3QgZnVuY3Rpb25zCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgMCwoaW50ICAoKikoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjX2xvY2ssCitzdGF0aWMgaW50ICgqZGlyZWN0X3Vuc2V0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2ssIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICAoKmRpcmVjdF90ZXN0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpCisgICAgPSB7IF9fa21wX3Rlc3RfaW5kaXJlY3RfbG9jaywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgdGVzdCkgfTsKKyN1bmRlZiBleHBhbmQKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAwLChpbnQgICgqKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfbG9ja193aXRoX2NoZWNrcywKK3N0YXRpYyBpbnQgKCpkaXJlY3RfdW5zZXRfY2hlY2tbXSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikKKyAgICA9IHsgX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9ja193aXRoX2NoZWNrcywgMCwgS01QX0ZPUkVBQ0hfRF9MT0NLKGV4cGFuZCwgcmVsZWFzZSkgfTsKK3N0YXRpYyBpbnQgKCpkaXJlY3RfdGVzdF9jaGVja1tdKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKQorICAgID0geyBfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3MsIDAsIEtNUF9GT1JFQUNIX0RfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisKKy8vIEV4cG9zZXMgb25seSBvbmUgc2V0IG9mIGp1bXAgdGFibGVzICgqbG9jayBvciAqbG9ja193aXRoX2NoZWNrcykuCit2b2lkICgqKCpfX2ttcF9kaXJlY3Rfc2V0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9kaXJlY3RfdW5zZXQpKShrbXBfZHluYV9sb2NrX3QgKiwga21wX2ludDMyKSA9IDA7CitpbnQgKCooKl9fa21wX2RpcmVjdF90ZXN0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMikgPSAwOworCisvLworLy8gSnVtcCB0YWJsZXMgZm9yIHRoZSBpbmRpcmVjdCBsb2NrIGZ1bmN0aW9ucy4KKy8vCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9jaywKK3ZvaWQgKCpfX2ttcF9pbmRpcmVjdF9pbml0W10pKGttcF91c2VyX2xvY2tfcCkgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIGluaXQpIH07Cit2b2lkICgqX19rbXBfaW5kaXJlY3RfZGVzdHJveVtdKShrbXBfdXNlcl9sb2NrX3ApID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBkZXN0cm95KSB9OworI3VuZGVmIGV4cGFuZAorCisvLyBzZXQvYWNxdWlyZSBmdW5jdGlvbnMKKyNkZWZpbmUgZXhwYW5kKGwsIG9wKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpKV9fa21wXyMjb3AjI18jI2wjI18jI2xvY2ssCitzdGF0aWMgdm9pZCAoKmluZGlyZWN0X3NldFtdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIGFjcXVpcmUpIH07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKHZvaWQgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIHZvaWQgKCppbmRpcmVjdF9zZXRfY2hlY2tbXSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0geyBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kLCBhY3F1aXJlKSB9OworI3VuZGVmIGV4cGFuZAorCisvLyB1bnNldC9yZWxlYXNlIGFuZCB0ZXN0IGZ1bmN0aW9ucworI2RlZmluZSBleHBhbmQobCwgb3ApIChpbnQgICgqKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikpX19rbXBfIyNvcCMjXyMjbCMjXyMjbG9jaywKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF91bnNldFtdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHJlbGVhc2UpIH07CitzdGF0aWMgaW50ICgqaW5kaXJlY3RfdGVzdFtdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSB7IEtNUF9GT1JFQUNIX0lfTE9DSyhleHBhbmQsIHRlc3QpIH07CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsLCBvcCkgKGludCAgKCopKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSlfX2ttcF8jI29wIyNfIyNsIyNfIyNsb2NrX3dpdGhfY2hlY2tzLAorc3RhdGljIGludCAoKmluZGlyZWN0X3Vuc2V0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgcmVsZWFzZSkgfTsKK3N0YXRpYyBpbnQgKCppbmRpcmVjdF90ZXN0X2NoZWNrW10pKGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyKSA9IHsgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZCwgdGVzdCkgfTsKKyN1bmRlZiBleHBhbmQKKworLy8gRXhwb3NlcyBvbmx5IG9uZSBqdW1wIHRhYmxlcyAoKmxvY2sgb3IgKmxvY2tfd2l0aF9jaGVja3MpLgordm9pZCAoKigqX19rbXBfaW5kaXJlY3Rfc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0gMDsKK2ludCAoKigqX19rbXBfaW5kaXJlY3RfdW5zZXQpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMikgPSAwOworaW50ICgqKCpfX2ttcF9pbmRpcmVjdF90ZXN0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpID0gMDsKKworLy8gTG9jayBpbmRleCB0YWJsZS4KK2ttcF9pbmRpcmVjdF9sb2NrX3RhYmxlX3QgX19rbXBfaV9sb2NrX3RhYmxlOworCisvLyBTaXplIG9mIGluZGlyZWN0IGxvY2tzLgorc3RhdGljIGttcF91aW50MzIgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW0tNUF9OVU1fSV9MT0NLU10gPSB7IDAgfTsKKworLy8gSnVtcCB0YWJsZXMgZm9yIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIuCit2b2lkICgqX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqKSA9IHsgMCB9Owordm9pZCAoKl9fa21wX2luZGlyZWN0X3NldF9mbGFnc1tLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QpID0geyAwIH07Citjb25zdCBpZGVudF90ICogKCpfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wKSA9IHsgMCB9Owora21wX2xvY2tfZmxhZ3NfdCAoKl9fa21wX2luZGlyZWN0X2dldF9mbGFnc1tLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3ApID0geyAwIH07CisKKy8vIFVzZSBkaWZmZXJlbnQgbG9jayBwb29scyBmb3IgZGlmZmVyZW50IGxvY2sgdHlwZXMuCitzdGF0aWMga21wX2luZGlyZWN0X2xvY2tfdCAqIF9fa21wX2luZGlyZWN0X2xvY2tfcG9vbFtLTVBfTlVNX0lfTE9DS1NdID0geyAwIH07CisKKy8vIFVzZXIgbG9jayBhbGxvY2F0b3IgZm9yIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgaW5kaXJlY3QgbG9ja3MuCisvLyBFdmVyeSBlbnRyeSBvZiB0aGUgaW5kaXJlY3QgbG9jayB0YWJsZSBob2xkcyB0aGUgYWRkcmVzcyBhbmQgdHlwZSBvZiB0aGUgYWxsb2NhdGVkIGluZHJlY3QgbG9jaworLy8gKGttcF9pbmRpcmVjdF9sb2NrX3QpLCBhbmQgdGhlIHNpemUgb2YgdGhlIHRhYmxlIGRvdWJsZXMgd2hlbiBpdCBpcyBmdWxsLiBBIGRlc3Ryb3llZCBpbmRpcmVjdCBsb2NrCisvLyBvYmplY3QgaXMgcmV0dXJuZWQgdG8gdGhlIHJldXNhYmxlIHBvb2wgb2YgbG9ja3MsIHVuaXF1ZSB0byBlYWNoIGxvY2sgdHlwZS4KK2ttcF9pbmRpcmVjdF9sb2NrX3QgKgorX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jayh2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX2luZGlyZWN0X2xvY2t0YWdfdCB0YWcpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbGNrOworICAgIGttcF9sb2NrX2luZGV4X3QgaWR4OworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCk7CisKKyAgICBpZiAoX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW3RhZ10gIT0gTlVMTCkgeworICAgICAgICAvLyBSZXVzZSB0aGUgYWxsb2NhdGVkIGFuZCBkZXN0cm95ZWQgbG9jayBvYmplY3QKKyAgICAgICAgbGNrID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW3RhZ107CisgICAgICAgIGlmIChPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSkKKyAgICAgICAgICAgIGlkeCA9IGxjay0+bG9jay0+cG9vbC5pbmRleDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW3RhZ10gPSAoa21wX2luZGlyZWN0X2xvY2tfdCAqKWxjay0+bG9jay0+cG9vbC5uZXh0OworICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrOiByZXVzaW5nIGFuIGV4aXN0aW5nIGxvY2sgJXBcbiIsIGxjaykpOworICAgIH0gZWxzZSB7CisgICAgICAgIGlkeCA9IF9fa21wX2lfbG9ja190YWJsZS5uZXh0OworICAgICAgICAvLyBDaGVjayBjYXBhY2l0eSBhbmQgZG91YmxlIHRoZSBzaXplIGlmIGl0IGlzIGZ1bGwKKyAgICAgICAgaWYgKGlkeCA9PSBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSkgeworICAgICAgICAgICAgLy8gRG91YmxlIHVwIHRoZSBzcGFjZSBmb3IgYmxvY2sgcG9pbnRlcnMKKyAgICAgICAgICAgIGludCByb3cgPSBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZS9LTVBfSV9MT0NLX0NIVU5LOworICAgICAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqKm9sZF90YWJsZSA9IF9fa21wX2lfbG9ja190YWJsZS50YWJsZTsKKyAgICAgICAgICAgIF9fa21wX2lfbG9ja190YWJsZS50YWJsZSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICoqKV9fa21wX2FsbG9jYXRlKDIqcm93KnNpemVvZihrbXBfaW5kaXJlY3RfbG9ja190ICopKTsKKyAgICAgICAgICAgIEtNUF9NRU1DUFkoX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlLCBvbGRfdGFibGUsIHJvdypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCAqKSk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG9sZF90YWJsZSk7CisgICAgICAgICAgICAvLyBBbGxvY2F0ZSBuZXcgb2JqZWN0cyBpbiB0aGUgbmV3IGJsb2NrcworICAgICAgICAgICAgZm9yIChpbnQgaSA9IHJvdzsgaSA8IDIqcm93OyArK2kpCisgICAgICAgICAgICAgICAgKihfX2ttcF9pX2xvY2tfdGFibGUudGFibGUgKyBpKSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKEtNUF9JX0xPQ0tfQ0hVTksqc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QpKTsKKyAgICAgICAgICAgIF9fa21wX2lfbG9ja190YWJsZS5zaXplID0gMippZHg7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQrKzsKKyAgICAgICAgbGNrID0gS01QX0dFVF9JX0xPQ0soaWR4KTsKKyAgICAgICAgLy8gQWxsb2NhdGUgYSBuZXcgYmFzZSBsb2NrIG9iamVjdAorICAgICAgICBsY2stPmxvY2sgPSAoa21wX3VzZXJfbG9ja19wKV9fa21wX2FsbG9jYXRlKF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVt0YWddKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfYWxsb2NhdGVfaW5kaXJlY3RfbG9jazogYWxsb2NhdGVkIGEgbmV3IGxvY2sgJXBcbiIsIGxjaykpOworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgICAgbGNrLT50eXBlID0gdGFnOworCisgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgICAgICooKGttcF9sb2NrX2luZGV4X3QgKil1c2VyX2xvY2spID0gaWR4IDw8IDE7IC8vIGluZGlyZWN0IGxvY2sgd29yZCBtdXN0IGJlIGV2ZW4uCisgICAgfSBlbHNlIHsKKyAgICAgICAgKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKil1c2VyX2xvY2spID0gbGNrOworICAgIH0KKworICAgIHJldHVybiBsY2s7Cit9CisKKy8vIFVzZXIgbG9jayBsb29rdXAgZm9yIGR5bmFtaWNhbGx5IGRpc3BhdGNoZWQgbG9ja3MuCitzdGF0aWMgX19mb3JjZWlubGluZQora21wX2luZGlyZWN0X2xvY2tfdCAqCitfX2ttcF9sb29rdXBfaW5kaXJlY3RfbG9jayh2b2lkICoqdXNlcl9sb2NrLCBjb25zdCBjaGFyICpmdW5jKQoreworICAgIGlmIChfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2spIHsKKyAgICAgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbGNrID0gTlVMTDsKKyAgICAgICAgaWYgKHVzZXJfbG9jayA9PSBOVUxMKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgICAgICAgICBrbXBfbG9ja19pbmRleF90IGlkeCA9IEtNUF9FWFRSQUNUX0lfSU5ERVgodXNlcl9sb2NrKTsKKyAgICAgICAgICAgIGlmIChpZHggPj0gX19rbXBfaV9sb2NrX3RhYmxlLnNpemUpIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoTG9ja0lzVW5pbml0aWFsaXplZCwgZnVuYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsY2sgPSBLTVBfR0VUX0lfTE9DSyhpZHgpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbGNrID0gKigoa21wX2luZGlyZWN0X2xvY2tfdCAqKil1c2VyX2xvY2spOworICAgICAgICB9CisgICAgICAgIGlmIChsY2sgPT0gTlVMTCkgeworICAgICAgICAgICAgS01QX0ZBVEFMKExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMpOworICAgICAgICB9CisgICAgICAgIHJldHVybiBsY2s7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgICAgICAgICByZXR1cm4gS01QX0dFVF9JX0xPQ0soS01QX0VYVFJBQ1RfSV9JTkRFWCh1c2VyX2xvY2spKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKXVzZXJfbG9jayk7CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2R5bmFfbG9ja3NlcV90IHNlcSkKK3sKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgaWYgKHNlcSA9PSBsb2Nrc2VxX2FkYXB0aXZlICYmICFfX2ttcF9jcHVpbmZvLnJ0bSkgeworICAgICAgICBLTVBfV0FSTklORyhBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgImttcF9sb2Nrc2VxX3QiLCAiYWRhcHRpdmUiKTsKKyAgICAgICAgc2VxID0gbG9ja3NlcV9xdWV1aW5nOworICAgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfVFNYCisgICAgaWYgKHNlcSA9PSBsb2Nrc2VxX3J0bSAmJiAhX19rbXBfY3B1aW5mby5ydG0pIHsKKyAgICAgICAgc2VxID0gbG9ja3NlcV9xdWV1aW5nOworICAgIH0KKyNlbmRpZgorICAgIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnID0gS01QX0dFVF9JX1RBRyhzZXEpOworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBfX2ttcF9hbGxvY2F0ZV9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssIF9fa21wX2VudHJ5X2d0aWQoKSwgdGFnKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgaW5pdCkobC0+bG9jayk7CisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfaW5pdF9pbmRpcmVjdF9sb2NrOiBpbml0aWFsaXplZCBpbmRpcmVjdCBsb2NrIHdpdGggdHlwZSMlZFxuIiwgc2VxKSk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXN0cm95X2luZGlyZWN0X2xvY2soa21wX2R5bmFfbG9ja190ICogbG9jaykKK3sKKyAgICBrbXBfdWludDMyIGd0aWQgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfZGVzdHJveV9sb2NrIik7CisgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgIGttcF9pbmRpcmVjdF9sb2NrdGFnX3QgdGFnID0gbC0+dHlwZTsKKworICAgIF9fa21wX2FjcXVpcmVfbG9jaygmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQpOworCisgICAgLy8gVXNlIHRoZSBiYXNlIGxvY2sncyBzcGFjZSB0byBrZWVwIHRoZSBwb29sIGNoYWluLgorICAgIGwtPmxvY2stPnBvb2wubmV4dCA9IChrbXBfdXNlcl9sb2NrX3ApX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW3RhZ107CisgICAgaWYgKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSB7CisgICAgICAgIGwtPmxvY2stPnBvb2wuaW5kZXggPSBLTVBfRVhUUkFDVF9JX0lOREVYKGxvY2spOworICAgIH0KKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3Bvb2xbdGFnXSA9IGw7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soJl9fa21wX2dsb2JhbF9sb2NrLCBndGlkKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9pbmRpcmVjdF9sb2NrKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBLTVBfTE9PS1VQX0lfTE9DSyhsb2NrKTsKKyAgICBLTVBfSV9MT0NLX0ZVTkMobCwgc2V0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIGludAorX19rbXBfdW5zZXRfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB1bnNldCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Rlc3RfaW5kaXJlY3RfbG9jayhrbXBfZHluYV9sb2NrX3QgKiBsb2NrLCBrbXBfaW50MzIgZ3RpZCkKK3sKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0xPT0tVUF9JX0xPQ0sobG9jayk7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB0ZXN0KShsLT5sb2NrLCBndGlkKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3NldF9pbmRpcmVjdF9sb2NrX3dpdGhfY2hlY2tzKGttcF9keW5hX2xvY2tfdCAqIGxvY2ssIGttcF9pbnQzMiBndGlkKQoreworICAgIGttcF9pbmRpcmVjdF9sb2NrX3QgKmwgPSBfX2ttcF9sb29rdXBfaW5kaXJlY3RfbG9jaygodm9pZCAqKilsb2NrLCAib21wX3NldF9sb2NrIik7CisgICAgS01QX0lfTE9DS19GVU5DKGwsIHNldCkobC0+bG9jaywgZ3RpZCk7Cit9CisKK3N0YXRpYyBpbnQKK19fa21wX3Vuc2V0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfdW5zZXRfbG9jayIpOworICAgIHJldHVybiBLTVBfSV9MT0NLX0ZVTkMobCwgdW5zZXQpKGwtPmxvY2ssIGd0aWQpOworfQorCitzdGF0aWMgaW50CitfX2ttcF90ZXN0X2luZGlyZWN0X2xvY2tfd2l0aF9jaGVja3Moa21wX2R5bmFfbG9ja190ICogbG9jaywga21wX2ludDMyIGd0aWQpCit7CisgICAga21wX2luZGlyZWN0X2xvY2tfdCAqbCA9IF9fa21wX2xvb2t1cF9pbmRpcmVjdF9sb2NrKCh2b2lkICoqKWxvY2ssICJvbXBfdGVzdF9sb2NrIik7CisgICAgcmV0dXJuIEtNUF9JX0xPQ0tfRlVOQyhsLCB0ZXN0KShsLT5sb2NrLCBndGlkKTsKK30KKwora21wX2R5bmFfbG9ja3NlcV90IF9fa21wX3VzZXJfbG9ja19zZXEgPSBsb2Nrc2VxX3F1ZXVpbmc7CisKKy8vIFRoaXMgaXMgdXNlZCBvbmx5IGluIGttcF9lcnJvci5jIHdoZW4gY29uc2lzdGVuY3kgY2hlY2tpbmcgaXMgb24uCitrbXBfaW50MzIKK19fa21wX2dldF91c2VyX2xvY2tfb3duZXIoa21wX3VzZXJfbG9ja19wIGxjaywga21wX3VpbnQzMiBzZXEpCit7CisgICAgc3dpdGNoIChzZXEpIHsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX3RhczoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF90YXM6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKChrbXBfdGFzX2xvY2tfdCAqKWxjayk7CisjaWYgS01QX1VTRV9GVVRFWAorICAgICAgICBjYXNlIGxvY2tzZXFfZnV0ZXg6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfZnV0ZXg6CisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIoKGttcF9mdXRleF9sb2NrX3QgKilsY2spOworI2VuZGlmCisgICAgICAgIGNhc2UgbG9ja3NlcV90aWNrZXQ6CisgICAgICAgIGNhc2UgbG9ja3NlcV9uZXN0ZWRfdGlja2V0OgorICAgICAgICAgICAgcmV0dXJuIF9fa21wX2dldF90aWNrZXRfbG9ja19vd25lcigoa21wX3RpY2tldF9sb2NrX3QgKilsY2spOworICAgICAgICBjYXNlIGxvY2tzZXFfcXVldWluZzoKKyAgICAgICAgY2FzZSBsb2Nrc2VxX25lc3RlZF9xdWV1aW5nOgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2FkYXB0aXZlOgorI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lcigoa21wX3F1ZXVpbmdfbG9ja190ICopbGNrKTsKKyAgICAgICAgY2FzZSBsb2Nrc2VxX2RyZHBhOgorICAgICAgICBjYXNlIGxvY2tzZXFfbmVzdGVkX2RyZHBhOgorICAgICAgICAgICAgcmV0dXJuIF9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyKChrbXBfZHJkcGFfbG9ja190ICopbGNrKTsKKyAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgIHJldHVybiAwOworICAgIH0KK30KKworLy8gSW5pdGlhbGl6ZXMgZGF0YSBmb3IgZHluYW1pYyB1c2VyIGxvY2tzLgordm9pZAorX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKQoreworICAgIC8vIEluaXRpYWxpemUganVtcCB0YWJsZSBmb3IgdGhlIGxvY2sgZnVuY3Rpb25zCisgICAgaWYgKF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjaykgeworICAgICAgICBfX2ttcF9kaXJlY3Rfc2V0ICAgICA9IGRpcmVjdF9zZXRfY2hlY2s7CisgICAgICAgIF9fa21wX2RpcmVjdF91bnNldCAgID0gZGlyZWN0X3Vuc2V0X2NoZWNrOworICAgICAgICBfX2ttcF9kaXJlY3RfdGVzdCAgICA9IGRpcmVjdF90ZXN0X2NoZWNrOworICAgICAgICBfX2ttcF9pbmRpcmVjdF9zZXQgICA9IGluZGlyZWN0X3NldF9jaGVjazsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdW5zZXQgPSBpbmRpcmVjdF91bnNldF9jaGVjazsKKyAgICAgICAgX19rbXBfaW5kaXJlY3RfdGVzdCAgPSBpbmRpcmVjdF90ZXN0X2NoZWNrOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfZGlyZWN0X3NldCAgICAgPSBkaXJlY3Rfc2V0OworICAgICAgICBfX2ttcF9kaXJlY3RfdW5zZXQgICA9IGRpcmVjdF91bnNldDsKKyAgICAgICAgX19rbXBfZGlyZWN0X3Rlc3QgICAgPSBkaXJlY3RfdGVzdDsKKyAgICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0ICAgPSBpbmRpcmVjdF9zZXQ7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3Vuc2V0ID0gaW5kaXJlY3RfdW5zZXQ7CisgICAgICAgIF9fa21wX2luZGlyZWN0X3Rlc3QgID0gaW5kaXJlY3RfdGVzdDsKKyAgICB9CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgaW5kZXggdGFibGUKKyAgICBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSA9IEtNUF9JX0xPQ0tfQ0hVTks7CisgICAgX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKiopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9pbmRpcmVjdF9sb2NrX3QgKikpOworICAgICooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKSA9IChrbXBfaW5kaXJlY3RfbG9ja190ICopCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoS01QX0lfTE9DS19DSFVOSypzaXplb2Yoa21wX2luZGlyZWN0X2xvY2tfdCkpOworICAgIF9fa21wX2lfbG9ja190YWJsZS5uZXh0ID0gMDsKKworICAgIC8vIEluZGlyZWN0IGxvY2sgc2l6ZQorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3RpY2tldF0gICAgICAgICA9IHNpemVvZihrbXBfdGlja2V0X2xvY2tfdCk7CisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfcXVldWluZ10gICAgICAgID0gc2l6ZW9mKGttcF9xdWV1aW5nX2xvY2tfdCk7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2FkYXB0aXZlXSAgICAgICA9IHNpemVvZihrbXBfYWRhcHRpdmVfbG9ja190KTsKKyNlbmRpZgorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX2RyZHBhXSAgICAgICAgICA9IHNpemVvZihrbXBfZHJkcGFfbG9ja190KTsKKyNpZiBLTVBfVVNFX1RTWAorICAgIF9fa21wX2luZGlyZWN0X2xvY2tfc2l6ZVtsb2NrdGFnX3J0bV0gICAgICAgICAgICA9IHNpemVvZihrbXBfcXVldWluZ19sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3Rhc10gICAgID0gc2l6ZW9mKGttcF90YXNfbG9ja190KTsKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX2Z1dGV4XSAgID0gc2l6ZW9mKGttcF9mdXRleF9sb2NrX3QpOworI2VuZGlmCisgICAgX19rbXBfaW5kaXJlY3RfbG9ja19zaXplW2xvY2t0YWdfbmVzdGVkX3RpY2tldF0gID0gc2l6ZW9mKGttcF90aWNrZXRfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfcXVldWluZ10gPSBzaXplb2Yoa21wX3F1ZXVpbmdfbG9ja190KTsKKyAgICBfX2ttcF9pbmRpcmVjdF9sb2NrX3NpemVbbG9ja3RhZ19uZXN0ZWRfZHJkcGFdICAgPSBzaXplb2Yoa21wX2RyZHBhX2xvY2tfdCk7CisKKyAgICAvLyBJbml0aWFsaXplIGxvY2sgYWNjZXNzb3IvbW9kaWZpZXIKKyNkZWZpbmUgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBzZXApIHsgICAgICAgICAgICBcCisgICAgdGFibGVbbG9ja3RhZyMjc2VwIyN0aWNrZXRdICA9IGV4cGFuZCh0aWNrZXQpOyAgXAorICAgIHRhYmxlW2xvY2t0YWcjI3NlcCMjcXVldWluZ10gPSBleHBhbmQocXVldWluZyk7IFwKKyAgICB0YWJsZVtsb2NrdGFnIyNzZXAjI2RyZHBhXSAgID0gZXhwYW5kKGRyZHBhKTsgICBcCit9CisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIHRhYmxlW2xvY2t0YWdfYWRhcHRpdmVdID0gZXhwYW5kKHF1ZXVpbmcpOyBcCisgICAgZmlsbF9qdW1wcyh0YWJsZSwgZXhwYW5kLCBfbmVzdGVkXyk7ICAgICAgIFwKK30KKyNlbHNlCisjIGRlZmluZSBmaWxsX3RhYmxlKHRhYmxlLCBleHBhbmQpIHsgICAgICAgICAgIFwKKyAgICBmaWxsX2p1bXBzKHRhYmxlLCBleHBhbmQsIF8pOyAgICAgICAgICAgICAgXAorICAgIGZpbGxfanVtcHModGFibGUsIGV4cGFuZCwgX25lc3RlZF8pOyAgICAgICBcCit9CisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopKV9fa21wX3NldF8jI2wjI19sb2NrX2xvY2F0aW9uCisgICAgZmlsbF90YWJsZShfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb24sIGV4cGFuZCk7CisjdW5kZWYgZXhwYW5kCisjZGVmaW5lIGV4cGFuZChsKSAodm9pZCAoKikoa21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190KSlfX2ttcF9zZXRfIyNsIyNfbG9ja19mbGFncworICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3Rfc2V0X2ZsYWdzLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGNvbnN0IGlkZW50X3QgKiAoKikoa21wX3VzZXJfbG9ja19wKSlfX2ttcF9nZXRfIyNsIyNfbG9ja19sb2NhdGlvbgorICAgIGZpbGxfdGFibGUoX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uLCBleHBhbmQpOworI3VuZGVmIGV4cGFuZAorI2RlZmluZSBleHBhbmQobCkgKGttcF9sb2NrX2ZsYWdzX3QgKCopKGttcF91c2VyX2xvY2tfcCkpX19rbXBfZ2V0XyMjbCMjX2xvY2tfZmxhZ3MKKyAgICBmaWxsX3RhYmxlKF9fa21wX2luZGlyZWN0X2dldF9mbGFncywgZXhwYW5kKTsKKyN1bmRlZiBleHBhbmQKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IFRSVUU7Cit9CisKKy8vIENsZWFuIHVwIHRoZSBsb2NrIHRhYmxlLgordm9pZAorX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCkKK3sKKyAgICBrbXBfbG9ja19pbmRleF90IGk7CisgICAgaW50IGs7CisKKyAgICAvLyBDbGVhbiB1cCBsb2NrcyBpbiB0aGUgcG9vbHMgZmlyc3QgKHRoZXkgd2VyZSBhbHJlYWR5IGRlc3Ryb3llZCBiZWZvcmUgZ29pbmcgaW50byB0aGUgcG9vbHMpLgorICAgIGZvciAoayA9IDA7IGsgPCBLTVBfTlVNX0lfTE9DS1M7ICsraykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdOworICAgICAgICB3aGlsZSAobCAhPSBOVUxMKSB7CisgICAgICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsbCA9IGw7CisgICAgICAgICAgICBsID0gKGttcF9pbmRpcmVjdF9sb2NrX3QgKilsLT5sb2NrLT5wb29sLm5leHQ7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9jbGVhbnVwX2luZGlyZWN0X3VzZXJfbG9ja3M6IGZyZWVpbmcgJXAgZnJvbSBwb29sXG4iLCBsbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsbC0+bG9jayk7CisgICAgICAgICAgICBsbC0+bG9jayA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfaW5kaXJlY3RfbG9ja19wb29sW2tdID0gTlVMTDsKKyAgICB9CisgICAgLy8gQ2xlYW4gdXAgdGhlIHJlbWFpbmluZyB1bmRlc3Ryb3llZCBsb2Nrcy4KKyAgICBmb3IgKGkgPSAwOyBpIDwgX19rbXBfaV9sb2NrX3RhYmxlLm5leHQ7IGkrKykgeworICAgICAgICBrbXBfaW5kaXJlY3RfbG9ja190ICpsID0gS01QX0dFVF9JX0xPQ0soaSk7CisgICAgICAgIGlmIChsLT5sb2NrICE9IE5VTEwpIHsKKyAgICAgICAgICAgIC8vIExvY2tzIG5vdCBkZXN0cm95ZWQgZXhwbGljaXRseSBuZWVkIHRvIGJlIGRlc3Ryb3llZCBoZXJlLgorICAgICAgICAgICAgS01QX0lfTE9DS19GVU5DKGwsIGRlc3Ryb3kpKGwtPmxvY2spOworICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzOiBkZXN0cm95L2ZyZWVpbmcgJXAgZnJvbSB0YWJsZVxuIiwgbCkpOworICAgICAgICAgICAgX19rbXBfZnJlZShsLT5sb2NrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICAvLyBGcmVlIHRoZSB0YWJsZQorICAgIGZvciAoaSA9IDA7IGkgPCBfX2ttcF9pX2xvY2tfdGFibGUuc2l6ZSAvIEtNUF9JX0xPQ0tfQ0hVTks7IGkrKykKKyAgICAgICAgX19rbXBfZnJlZShfX2ttcF9pX2xvY2tfdGFibGUudGFibGVbaV0pOworICAgIF9fa21wX2ZyZWUoX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlKTsKKworICAgIF9fa21wX2luaXRfdXNlcl9sb2NrcyA9IEZBTFNFOworfQorCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKKyNlbHNlIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogdXNlciBsb2NrcworICoKKyAqIFRoZXkgYXJlIGltcGxlbWVudGVkIGFzIGEgdGFibGUgb2YgZnVuY3Rpb24gcG9pbnRlcnMgd2hpY2ggYXJlIHNldCB0byB0aGUKKyAqIGxvY2sgZnVuY3Rpb25zIG9mIHRoZSBhcHByb3ByaWF0ZSBraW5kLCBvbmNlIHRoYXQgaGFzIGJlZW4gZGV0ZXJtaW5lZC4KKyAqLworCitlbnVtIGttcF9sb2NrX2tpbmQgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19kZWZhdWx0OworCitzaXplX3QgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IDA7CitzaXplX3QgX19rbXBfdXNlcl9sb2NrX3NpemUgPSAwOworCitrbXBfaW50MzIgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19vd25lcl8gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK2ludCAoICpfX2ttcF9hY3F1aXJlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CitpbnQgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOwordm9pZCAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworaW50ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7CisKK2ludCAoICpfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkgPSBOVUxMOworaW50ICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworCitpbnQgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkgPSBOVUxMOworY29uc3QgaWRlbnRfdCAqICggKl9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKSA9IE5VTEw7Cit2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApID0gTlVMTDsKK2ttcF9sb2NrX2ZsYWdzX3QgKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjayApID0gTlVMTDsKK3ZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApID0gTlVMTDsKKwordm9pZCBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBrbXBfbG9ja19raW5kX3QgdXNlcl9sb2NrX2tpbmQgKQoreworICAgIHN3aXRjaCAoIHVzZXJfbG9ja19raW5kICkgeworICAgICAgICBjYXNlIGxrX2RlZmF1bHQ6CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKworICAgICAgICBjYXNlIGxrX3RhczogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGFzX2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90YXNfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGFzKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0YXMpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGFzKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGFzX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2lmIEtNUF9VU0VfRlVURVgKKworICAgICAgICBjYXNlIGxrX2Z1dGV4OiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9mdXRleF9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfZnV0ZXhfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2Z1dGV4X2xvY2tfb3duZXIgKTsKKworICAgICAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGZ1dGV4KTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGZ1dGV4KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhmdXRleCk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DSyhmdXRleCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkgTlVMTDsKKworICAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggY29uc3QgaWRlbnRfdCAqICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKSBOVUxMOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApIE5VTEw7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwga21wX2xvY2tfZmxhZ3NfdCApICkgTlVMTDsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworI2VuZGlmIC8vIEtNUF9VU0VfRlVURVgKKworICAgICAgICBjYXNlIGxrX3RpY2tldDogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfdGlja2V0X2xvY2tfdCApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF90aWNrZXRfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1ModGlja2V0KTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyh0aWNrZXQpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0sodGlja2V0KTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfdGlja2V0X2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3RpY2tldF9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCwgY29uc3QgaWRlbnRfdCAqICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3RpY2tldF9sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF90aWNrZXRfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfdGlja2V0X2xvY2tfZmxhZ3MgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGxrX3F1ZXVpbmc6IHsKKyAgICAgICAgICAgIF9fa21wX2Jhc2VfdXNlcl9sb2NrX3NpemUgPSBzaXplb2YoIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX3F1ZXVpbmdfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MocXVldWluZyk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhxdWV1aW5nKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DSyhxdWV1aW5nKTsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLKHF1ZXVpbmcpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9xdWV1aW5nX2xvY2sgKTsKKworICAgICAgICAgICAgIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gPQorICAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2lzX3F1ZXVpbmdfbG9ja19pbml0aWFsaXplZCApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gPQorICAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2xvY2F0aW9uICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgICggJl9fa21wX2dldF9xdWV1aW5nX2xvY2tfZmxhZ3MgKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfc2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOiB7CisgICAgICAgICAgICBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19zaXplID0gc2l6ZW9mKCBrbXBfYWRhcHRpdmVfbG9ja190ICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfID0KKyAgICAgICAgICAgICAgKCBrbXBfaW50MzIgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19vd25lciApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0tfV0lUSF9DSEVDS1MoYWRhcHRpdmUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLKGFkYXB0aXZlKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZGVzdHJveV91c2VyX2xvY2tfID0KKyAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2Rlc3Ryb3lfYWRhcHRpdmVfbG9jayApOworCisgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgKCBpbnQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfaXNfcXVldWluZ19sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgKCBjb25zdCBpZGVudF90ICogKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICggJl9fa21wX3NldF9xdWV1aW5nX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAoIGttcF9sb2NrX2ZsYWdzX3QgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X3F1ZXVpbmdfbG9ja19mbGFncyApOworCisgICAgICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX2ZsYWdzXyA9CisgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBrbXBfbG9ja19mbGFnc190ICkgKQorICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfcXVldWluZ19sb2NrX2ZsYWdzICk7CisKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKKyAgICAgICAgY2FzZSBsa19kcmRwYTogeworICAgICAgICAgICAgX19rbXBfYmFzZV91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2Jhc2VfZHJkcGFfbG9ja190ICk7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfc2l6ZSA9IHNpemVvZigga21wX2RyZHBhX2xvY2tfdCApOworCisgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyA9CisgICAgICAgICAgICAgICgga21wX2ludDMyICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICggJl9fa21wX2dldF9kcmRwYV9sb2NrX293bmVyICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgICAgIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICAgICAgS01QX0JJTkRfTkVTVEVEX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhkcmRwYSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfQklORF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgICAgIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soZHJkcGEpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gPQorICAgICAgICAgICAgICAoIHZvaWQgKCAqICkoIGttcF91c2VyX2xvY2tfcCApICkKKyAgICAgICAgICAgICAgKCAmX19rbXBfZGVzdHJveV9kcmRwYV9sb2NrICk7CisKKyAgICAgICAgICAgICBfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfID0KKyAgICAgICAgICAgICAgICggaW50ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9pc19kcmRwYV9sb2NrX2luaXRpYWxpemVkICk7CisKKyAgICAgICAgICAgICBfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyA9CisgICAgICAgICAgICAgICAoIGNvbnN0IGlkZW50X3QgKiAoICogKSgga21wX3VzZXJfbG9ja19wICkgKQorICAgICAgICAgICAgICAgKCAmX19rbXBfZ2V0X2RyZHBhX2xvY2tfbG9jYXRpb24gKTsKKworICAgICAgICAgICAgIF9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fID0KKyAgICAgICAgICAgICAgICggdm9pZCAoICogKSgga21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICogKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19sb2NhdGlvbiApOworCisgICAgICAgICAgICAgX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCBrbXBfbG9ja19mbGFnc190ICggKiApKCBrbXBfdXNlcl9sb2NrX3AgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9nZXRfZHJkcGFfbG9ja19mbGFncyApOworCisgICAgICAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gPQorICAgICAgICAgICAgICAgKCB2b2lkICggKiApKCBrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QgKSApCisgICAgICAgICAgICAgICAoICZfX2ttcF9zZXRfZHJkcGFfbG9ja19mbGFncyApOworICAgICAgICB9CisgICAgICAgIGJyZWFrOworICAgIH0KK30KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBVc2VyIGxvY2sgdGFibGUgJiBsb2NrIGFsbG9jYXRpb24KKwora21wX2xvY2tfdGFibGVfdCBfX2ttcF91c2VyX2xvY2tfdGFibGUgPSB7IDEsIDAsIE5VTEwgfTsKK2ttcF91c2VyX2xvY2tfcCBfX2ttcF9sb2NrX3Bvb2wgPSBOVUxMOworCisvLyBMb2NrIGJsb2NrLWFsbG9jYXRpb24gc3VwcG9ydC4KK2ttcF9ibG9ja19vZl9sb2NrcyogX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jayA9IDE7ICAgICAgICAgICAgIC8vIEZJWE1FIC0gdHVuZSB0aGlzIHZhbHVlCisKK3N0YXRpYyBrbXBfbG9ja19pbmRleF90CitfX2ttcF9sb2NrX3RhYmxlX2luc2VydCgga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgLy8gQXNzdW1lIHRoYXQga21wX2dsb2JhbF9sb2NrIGlzIGhlbGQgdXBvbiBlbnRyeS9leGl0LgorICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+PSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICkgeworICAgICAgICBrbXBfbG9ja19pbmRleF90IHNpemU7CisgICAgICAgIGttcF91c2VyX2xvY2tfcCAqdGFibGU7CisgICAgICAgIC8vIFJlYWxsb2NhdGUgbG9jayB0YWJsZS4KKyAgICAgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID09IDAgKSB7CisgICAgICAgICAgICBzaXplID0gMTAyNDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIHNpemUgPSBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICogMjsKKyAgICAgICAgfQorICAgICAgICB0YWJsZSA9IChrbXBfdXNlcl9sb2NrX3AgKilfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBrbXBfdXNlcl9sb2NrX3AgKSAqIHNpemUgKTsKKyAgICAgICAgS01QX01FTUNQWSggdGFibGUgKyAxLCBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgKyAxLCBzaXplb2YoIGttcF91c2VyX2xvY2tfcCApICogKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCAtIDEgKSApOworICAgICAgICB0YWJsZVsgMCBdID0gKGttcF91c2VyX2xvY2tfcClfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGU7CisgICAgICAgICAgICAvLyBXZSBjYW5ub3QgZnJlZSB0aGUgcHJldmlvdXMgdGFibGUgbm93LCBzaW5jZSBpdCBtYXkgYmUgaW4gdXNlIGJ5IG90aGVyCisgICAgICAgICAgICAvLyB0aHJlYWRzLiBTbyBzYXZlIHRoZSBwb2ludGVyIHRvIHRoZSBwcmV2aW91cyB0YWJsZSBpbiBpbiB0aGUgZmlyc3QgZWxlbWVudCBvZiB0aGUKKyAgICAgICAgICAgIC8vIG5ldyB0YWJsZS4gQWxsIHRoZSB0YWJsZXMgd2lsbCBiZSBvcmdhbml6ZWQgaW50byBhIGxpc3QsIGFuZCBjb3VsZCBiZSBmcmVlZCB3aGVuCisgICAgICAgICAgICAvLyBsaWJyYXJ5IHNodXR0aW5nIGRvd24uCisgICAgICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IHRhYmxlOworICAgICAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkID0gc2l6ZTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPCBfX2ttcF91c2VyX2xvY2tfdGFibGUuYWxsb2NhdGVkICk7CisgICAgaW5kZXggPSBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZDsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGVbIGluZGV4IF0gPSBsY2s7CisgICAgKysgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQ7CisgICAgcmV0dXJuIGluZGV4OworfQorCitzdGF0aWMga21wX3VzZXJfbG9ja19wCitfX2ttcF9sb2NrX2Jsb2NrX2FsbG9jYXRlKCkKK3sKKyAgICAvLyBBc3N1bWUgdGhhdCBrbXBfZ2xvYmFsX2xvY2sgaXMgaGVsZCB1cG9uIGVudHJ5L2V4aXQuCisgICAgc3RhdGljIGludCBsYXN0X2luZGV4ID0gMDsKKyAgICBpZiAoICggbGFzdF9pbmRleCA+PSBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKQorICAgICAgfHwgKCBfX2ttcF9sb2NrX2Jsb2NrcyA9PSBOVUxMICkgKSB7CisgICAgICAgIC8vIFJlc3RhcnQgdGhlIGluZGV4LgorICAgICAgICBsYXN0X2luZGV4ID0gMDsKKyAgICAgICAgLy8gTmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBibG9jay4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIHNpemVfdCBzcGFjZV9mb3JfbG9ja3MgPSBfX2ttcF91c2VyX2xvY2tfc2l6ZSAqIF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKyAgICAgICAgY2hhciogYnVmZmVyID0gKGNoYXIqKV9fa21wX2FsbG9jYXRlKCBzcGFjZV9mb3JfbG9ja3MgKyBzaXplb2YoIGttcF9ibG9ja19vZl9sb2NrcyApICk7CisgICAgICAgIC8vIFNldCB1cCB0aGUgbmV3IGJsb2NrLgorICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3MgKm5ld19ibG9jayA9IChrbXBfYmxvY2tfb2ZfbG9ja3MgKikoJiBidWZmZXJbc3BhY2VfZm9yX2xvY2tzXSk7CisgICAgICAgIG5ld19ibG9jay0+bmV4dF9ibG9jayA9IF9fa21wX2xvY2tfYmxvY2tzOworICAgICAgICBuZXdfYmxvY2stPmxvY2tzID0gKHZvaWQgKilidWZmZXI7CisgICAgICAgIC8vIFB1Ymxpc2ggdGhlIG5ldyBibG9jay4KKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIF9fa21wX2xvY2tfYmxvY2tzID0gbmV3X2Jsb2NrOworICAgIH0KKyAgICBrbXBfdXNlcl9sb2NrX3AgcmV0ID0gKGttcF91c2VyX2xvY2tfcCkoJiAoICggKGNoYXIgKikoIF9fa21wX2xvY2tfYmxvY2tzLT5sb2NrcyApICkKKyAgICAgIFsgbGFzdF9pbmRleCAqIF9fa21wX3VzZXJfbG9ja19zaXplIF0gKSApOworICAgIGxhc3RfaW5kZXgrKzsKKyAgICByZXR1cm4gcmV0OworfQorCisvLworLy8gR2V0IG1lbW9yeSBmb3IgYSBsb2NrLiBJdCBtYXkgYmUgZnJlc2hseSBhbGxvY2F0ZWQgbWVtb3J5IG9yIHJldXNlZCBtZW1vcnkKKy8vIGZyb20gbG9jayBwb29sLgorLy8KK2ttcF91c2VyX2xvY2tfcAorX19rbXBfdXNlcl9sb2NrX2FsbG9jYXRlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwKKyAga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApCit7CisgICAga21wX3VzZXJfbG9ja19wIGxjazsKKyAgICBrbXBfbG9ja19pbmRleF90IGluZGV4OworICAgIEtNUF9ERUJVR19BU1NFUlQoIHVzZXJfbG9jayApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIGlmICggX19rbXBfbG9ja19wb29sID09IE5VTEwgKSB7CisgICAgICAgIC8vIExvY2sgcG9vbCBpcyBlbXB0eS4gQWxsb2NhdGUgbmV3IG1lbW9yeS4KKyAgICAgICAgaWYgKCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgPD0gMSApIHsgLy8gVHVuZSB0aGlzIGN1dG9mZiBwb2ludC4KKyAgICAgICAgICAgIGxjayA9IChrbXBfdXNlcl9sb2NrX3ApIF9fa21wX2FsbG9jYXRlKCBfX2ttcF91c2VyX2xvY2tfc2l6ZSApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbGNrID0gX19rbXBfbG9ja19ibG9ja19hbGxvY2F0ZSgpOworICAgICAgICB9CisKKyAgICAgICAgLy8gSW5zZXJ0IGxvY2sgaW4gdGhlIHRhYmxlIHNvIHRoYXQgaXQgY2FuIGJlIGZyZWVkIGluIF9fa21wX2NsZWFudXAsCisgICAgICAgIC8vIGFuZCBkZWJ1Z2dlciBoYXMgaW5mbyBvbiBhbGwgYWxsb2NhdGVkIGxvY2tzLgorICAgICAgICBpbmRleCA9IF9fa21wX2xvY2tfdGFibGVfaW5zZXJ0KCBsY2sgKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFBpY2sgdXAgbG9jayBmcm9tIHBvb2wuCisgICAgICAgIGxjayA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICAgICAgaW5kZXggPSBfX2ttcF9sb2NrX3Bvb2wtPnBvb2wuaW5kZXg7CisgICAgICAgIF9fa21wX2xvY2tfcG9vbCA9IF9fa21wX2xvY2tfcG9vbC0+cG9vbC5uZXh0OworICAgIH0KKworICAgIC8vCisgICAgLy8gV2UgY291bGQgcG90ZW50aWFsbHkgZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIG5lc3RlZCBhbmQgcmVndWxhciBsb2NrcworICAgIC8vIGhlcmUsIGFuZCBkbyB0aGUgbG9jayB0YWJsZSBsb29rdXAgZm9yIHJlZ3VsYXIgbG9ja3Mgb25seS4KKyAgICAvLworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKSA9IGluZGV4OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgKiAoIChrbXBfdXNlcl9sb2NrX3AgKikgdXNlcl9sb2NrICkgPSBsY2s7CisgICAgfQorCisgICAgLy8gbWFyayB0aGUgbG9jayBpZiBpdCBpcyBjcml0aWNhbCBzZWN0aW9uIGxvY2suCisgICAgX19rbXBfc2V0X3VzZXJfbG9ja19mbGFncyggbGNrLCBmbGFncyApOworCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7IC8vIEFDOiBUT0RPOiBtb3ZlIHRoaXMgbGluZSB1cHBlcgorCisgICAgcmV0dXJuIGxjazsKK30KKworLy8gUHV0IGxvY2sncyBtZW1vcnkgdG8gcG9vbCBmb3IgcmV1c2luZy4KK3ZvaWQKK19fa21wX3VzZXJfbG9ja19mcmVlKCB2b2lkICoqdXNlcl9sb2NrLCBrbXBfaW50MzIgZ3RpZCwga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdXNlcl9sb2NrICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBsY2sgIT0gTlVMTCApOworCisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICBsY2stPnBvb2wubmV4dCA9IF9fa21wX2xvY2tfcG9vbDsKKyAgICBfX2ttcF9sb2NrX3Bvb2wgPSBsY2s7CisgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2Yodm9pZCAqKSApIHsKKyAgICAgICAga21wX2xvY2tfaW5kZXhfdCBpbmRleCA9ICogKCAoa21wX2xvY2tfaW5kZXhfdCAqKSB1c2VyX2xvY2sgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDw9IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICk7CisgICAgICAgIGxjay0+cG9vbC5pbmRleCA9IGluZGV4OworICAgIH0KKworICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworfQorCitrbXBfdXNlcl9sb2NrX3AKK19fa21wX2xvb2t1cF91c2VyX2xvY2soIHZvaWQgKip1c2VyX2xvY2ssIGNoYXIgY29uc3QgKmZ1bmMgKQoreworICAgIGttcF91c2VyX2xvY2tfcCBsY2sgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggdXNlcl9sb2NrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggT01QX0xPQ0tfVF9TSVpFIDwgc2l6ZW9mKHZvaWQgKikgKSB7CisgICAgICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXggPSAqKCAoa21wX2xvY2tfaW5kZXhfdCAqKXVzZXJfbG9jayApOworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIGlmICggISAoIDAgPCBpbmRleCAmJiBpbmRleCA8IF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkICkgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNVbmluaXRpYWxpemVkLCBmdW5jICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggMCA8IGluZGV4ICYmIGluZGV4IDwgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdXNlcl9sb2NrX3NpemUgPiAwICk7CisgICAgICAgIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVtpbmRleF07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBsY2sgPSAqKCAoa21wX3VzZXJfbG9ja19wICopdXNlcl9sb2NrICk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmICggbGNrID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tJc1VuaW5pdGlhbGl6ZWQsIGZ1bmMgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBsY2s7Cit9CisKK3ZvaWQKK19fa21wX2NsZWFudXBfdXNlcl9sb2Nrcyggdm9pZCApCit7CisgICAgLy8KKyAgICAvLyBSZXNldCBsb2NrIHBvb2wuIERvIG5vdCB3b3JyeSBhYm91dCBsb2NrIGluIHRoZSBwb29sIC0tIHdlIHdpbGwgZnJlZQorICAgIC8vIHRoZW0gd2hlbiBpdGVyYXRpbmcgdGhyb3VnaCBsb2NrIHRhYmxlIChpdCBpbmNsdWRlcyBhbGwgdGhlIGxvY2tzLAorICAgIC8vIGRlYWQgb3IgYWxpdmUpLgorICAgIC8vCisgICAgX19rbXBfbG9ja19wb29sID0gTlVMTDsKKworI2RlZmluZSBJU19DUklUSUNBTChsY2spIFwKKyAgICAgICAgKCAoIF9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICE9IE5VTEwgKSAmJiBcCisgICAgICAgICggKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19mbGFnc18gKSggbGNrICkgJiBrbXBfbGZfY3JpdGljYWxfc2VjdGlvbiApICkKKworICAgIC8vCisgICAgLy8gTG9vcCB0aHJvdWdoIGxvY2sgdGFibGUsIGZyZWUgYWxsIGxvY2tzLgorICAgIC8vCisgICAgLy8gRG8gbm90IGZyZWUgaXRlbSBbMF0sIGl0IGlzIHJlc2VydmVkIGZvciBsb2NrIHRhYmxlcyBsaXN0LgorICAgIC8vCisgICAgLy8gRklYTUUgLSB3ZSBhcmUgaXRlcmF0aW5nIHRocm91Z2ggYSBsaXN0IG9mIChwb2ludGVycyB0bykgb2JqZWN0cyBvZgorICAgIC8vIHR5cGUgdW5pb24ga21wX3VzZXJfbG9jaywgYnV0IHdlIGhhdmUgbm8gd2F5IG9mIGtub3dpbmcgd2hldGhlciB0aGUKKyAgICAvLyBiYXNlIHR5cGUgaXMgY3VycmVudGx5ICJwb29sIiBvciB3aGF0ZXZlciB0aGUgZ2xvYmFsIHVzZXIgbG9jayB0eXBlCisgICAgLy8gaXMuCisgICAgLy8KKyAgICAvLyBXZSBhcmUgcmVseWluZyBvbiB0aGUgZmFjdCB0aGF0IGZvciBhbGwgb2YgdGhlIHVzZXIgbG9jayB0eXBlcworICAgIC8vIChleGNlcHQgInRhcyIpLCB0aGUgZmlyc3QgZmllbGQgaW4gdGhlIGxvY2sgc3RydWN0IGlzIHRoZSAiaW5pdGlhbGl6ZWQiCisgICAgLy8gZmllbGQsIHdoaWNoIGlzIHNldCB0byB0aGUgYWRkcmVzcyBvZiB0aGUgbG9jayBvYmplY3QgaXRzZWxmIHdoZW4KKyAgICAvLyB0aGUgbG9jayBpcyBpbml0aWFsaXplZC4gIFdoZW4gdGhlIHVuaW9uIGlzIG9mIHR5cGUgInBvb2wiLCB0aGUKKyAgICAvLyBmaXJzdCBmaWVsZCBpcyBhIHBvaW50ZXIgdG8gdGhlIG5leHQgb2JqZWN0IGluIHRoZSBmcmVlIGxpc3QsIHdoaWNoCisgICAgLy8gd2lsbCBub3QgYmUgdGhlIHNhbWUgYWRkcmVzcyBhcyB0aGUgb2JqZWN0IGl0c2VsZi4KKyAgICAvLworICAgIC8vIFRoaXMgbWVhbnMgdGhhdCB0aGUgY2hlY2sgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKQorICAgIC8vIHdpbGwgZmFpbCBmb3IgInBvb2wiIG9iamVjdHMgb24gdGhlIGZyZWUgbGlzdC4gIFRoaXMgbXVzdCBoYXBwZW4gYXMKKyAgICAvLyB0aGUgImxvY2F0aW9uIiBmaWVsZCBvZiByZWFsIHVzZXIgbG9ja3Mgb3ZlcmxhcHMgdGhlICJpbmRleCIgZmllbGQKKyAgICAvLyBvZiAicG9vbCIgb2JqZWN0cy4KKyAgICAvLworICAgIC8vIEl0IHdvdWxkIGJlIGJldHRlciB0byBydW4gdGhyb3VnaCB0aGUgZnJlZSBsaXN0LCBhbmQgcmVtb3ZlIGFsbCAicG9vbCIKKyAgICAvLyBvYmplY3RzIGZyb20gdGhlIGxvY2sgdGFibGUgYmVmb3JlIGV4ZWN1dGluZyB0aGlzIGxvb3AuICBIb3dldmVyLAorICAgIC8vICJwb29sIiBvYmplY3RzIGRvIG5vdCBhbHdheXMgaGF2ZSB0aGVpciBpbmRleCBmaWVsZCBzZXQgKG9ubHkgb24KKyAgICAvLyBsaW5fMzJlKSwgYW5kIEkgZG9uJ3Qgd2FudCB0byBzZWFyY2ggdGhlIGxvY2sgdGFibGUgZm9yIHRoZSBhZGRyZXNzCisgICAgLy8gb2YgZXZlcnkgInBvb2wiIG9iamVjdCBvbiB0aGUgZnJlZSBsaXN0LgorICAgIC8vCisgICAgd2hpbGUgKCBfX2ttcF91c2VyX2xvY2tfdGFibGUudXNlZCA+IDEgKSB7CisgICAgICAgIGNvbnN0IGlkZW50ICpsb2M7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gcmVkdWNlIF9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIGJlZm9yZSBmcmVlaW5nIHRoZSBsb2NrLAorICAgICAgICAvLyBzbyB0aGF0IHN0YXRlIG9mIGxvY2tzIGlzIGNvbnNpc3RlbnQKKyAgICAgICAgLy8KKyAgICAgICAga21wX3VzZXJfbG9ja19wIGxjayA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZVsKKyAgICAgICAgICAtLV9fa21wX3VzZXJfbG9ja190YWJsZS51c2VkIF07CisKKyAgICAgICAgaWYgKCAoIF9fa21wX2lzX3VzZXJfbG9ja19pbml0aWFsaXplZF8gIT0gTlVMTCApICYmCisgICAgICAgICAgKCAqX19rbXBfaXNfdXNlcl9sb2NrX2luaXRpYWxpemVkXyApKCBsY2sgKSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJc3N1ZSBhIHdhcm5pbmcgaWY6IEtNUF9DT05TSVNURU5DWV9DSEVDSyBBTkQgbG9jayBpcworICAgICAgICAgICAgLy8gaW5pdGlhbGl6ZWQgQU5EIGl0IGlzIE5PVCBhIGNyaXRpY2FsIHNlY3Rpb24gKHVzZXIgaXMgbm90CisgICAgICAgICAgICAvLyByZXNwb25zaWJsZSBmb3IgZGVzdHJveWluZyBjcml0aWNhbHMpIEFORCB3ZSBrbm93IHNvdXJjZQorICAgICAgICAgICAgLy8gbG9jYXRpb24gdG8gcmVwb3J0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICYmICggISBJU19DUklUSUNBTCggbGNrICkgKSAmJgorICAgICAgICAgICAgICAoICggbG9jID0gX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbiggbGNrICkgKSAhPSBOVUxMICkgJiYKKyAgICAgICAgICAgICAgKCBsb2MtPnBzb3VyY2UgIT0gTlVMTCApICkgeworICAgICAgICAgICAgICAgIGttcF9zdHJfbG9jX3Qgc3RyX2xvYyA9IF9fa21wX3N0cl9sb2NfaW5pdCggbG9jLT5wc291cmNlLCAwICk7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIENuc0xvY2tOb3REZXN0cm95ZWQsIHN0cl9sb2MuZmlsZSwgc3RyX2xvYy5saW5lICk7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2xvY19mcmVlKCAmc3RyX2xvYyk7CisgICAgICAgICAgICB9CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmICggSVNfQ1JJVElDQUwoIGxjayApICkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3M6IGZyZWUgY3JpdGljYWwgc2VjdGlvbiBsb2NrICVwICglcClcbiIsIGxjaywgKih2b2lkKiopbGNrICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9jbGVhbnVwX3VzZXJfbG9ja3M6IGZyZWUgbG9jayAlcCAoJXApXG4iLCBsY2ssICoodm9pZCoqKWxjayApICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBDbGVhbnVwIGludGVybmFsIGxvY2sgZHluYW1pYyByZXNvdXJjZXMKKyAgICAgICAgICAgIC8vIChmb3IgZHJkcGEgbG9ja3MgcGFydGljdWxhcmx5KS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9kZXN0cm95X3VzZXJfbG9jayggbGNrICk7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBGcmVlIHRoZSBsb2NrIGlmIGJsb2NrIGFsbG9jYXRpb24gb2YgbG9ja3MgaXMgbm90IHVzZWQuCisgICAgICAgIC8vCisgICAgICAgIGlmICggX19rbXBfbG9ja19ibG9ja3MgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIGxjayApOworICAgICAgICB9CisgICAgfQorCisjdW5kZWYgSVNfQ1JJVElDQUwKKworICAgIC8vCisgICAgLy8gZGVsZXRlIGxvY2sgdGFibGUocykuCisgICAgLy8KKyAgICBrbXBfdXNlcl9sb2NrX3AgKnRhYmxlX3B0ciA9IF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZTsKKyAgICBfX2ttcF91c2VyX2xvY2tfdGFibGUudGFibGUgPSBOVUxMOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworCisgICAgd2hpbGUgKCB0YWJsZV9wdHIgIT0gTlVMTCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gSW4gdGhlIGZpcnN0IGVsZW1lbnQgd2Ugc2F2ZWQgdGhlIHBvaW50ZXIgdG8gdGhlIHByZXZpb3VzCisgICAgICAgIC8vIChzbWFsbGVyKSBsb2NrIHRhYmxlLgorICAgICAgICAvLworICAgICAgICBrbXBfdXNlcl9sb2NrX3AgKm5leHQgPSAoa21wX3VzZXJfbG9ja19wICopKCB0YWJsZV9wdHJbIDAgXSApOworICAgICAgICBfX2ttcF9mcmVlKCB0YWJsZV9wdHIgKTsKKyAgICAgICAgdGFibGVfcHRyID0gbmV4dDsKKyAgICB9CisKKyAgICAvLworICAgIC8vIEZyZWUgYnVmZmVycyBhbGxvY2F0ZWQgZm9yIGJsb2NrcyBvZiBsb2Nrcy4KKyAgICAvLworICAgIGttcF9ibG9ja19vZl9sb2Nrc190ICpibG9ja19wdHIgPSBfX2ttcF9sb2NrX2Jsb2NrczsKKyAgICBfX2ttcF9sb2NrX2Jsb2NrcyA9IE5VTEw7CisKKyAgICB3aGlsZSAoIGJsb2NrX3B0ciAhPSBOVUxMICkgeworICAgICAgICBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqbmV4dCA9IGJsb2NrX3B0ci0+bmV4dF9ibG9jazsKKyAgICAgICAgX19rbXBfZnJlZSggYmxvY2tfcHRyLT5sb2NrcyApOworICAgICAgICAvLworICAgICAgICAvLyAqYmxvY2tfcHRyIGl0c2VsZiB3YXMgYWxsb2NhdGVkIGF0IHRoZSBlbmQgb2YgdGhlIGxvY2tzIHZlY3Rvci4KKyAgICAgICAgLy8KKwlibG9ja19wdHIgPSBuZXh0OworICAgIH0KKworICAgIFRDV180KF9fa21wX2luaXRfdXNlcl9sb2NrcywgRkFMU0UpOworfQorCisjZW5kaWYgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfbG9jay5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9sb2NrLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGQwYTJmMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfbG9jay5oCkBAIC0wLDAgKzEsMTMyMCBAQAorLyoKKyAqIGttcF9sb2NrLmggLS0gbG9jayBoZWFkZXIgZmlsZQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9MT0NLX0gKKyNkZWZpbmUgS01QX0xPQ0tfSAorCisjaW5jbHVkZSA8bGltaXRzLmg+ICAgIC8vIENIQVJfQklUCisjaW5jbHVkZSA8c3RkZGVmLmg+ICAgIC8vIG9mZnNldG9mCisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKyNpbmNsdWRlICJrbXBfZGVidWcuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisjaW5jbHVkZSA8YXRvbWljPgorCitleHRlcm4gIkMiIHsKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIYXZlIHRvIGNvcHkgdGhlc2UgZGVmaW5pdGlvbnMgZnJvbSBrbXAuaCBiZWNhdXNlIGttcC5oIGNhbm5vdCBiZSBpbmNsdWRlZAorLy8gZHVlIHRvIGNpcmN1bGFyIGRlcGVuZGVuY2llcy4gIFdpbGwgdW5kZWYgdGhlc2UgYXQgZW5kIG9mIGZpbGUuCisKKyNkZWZpbmUgS01QX1BBRCh0eXBlLCBzeikgICAgIChzaXplb2YodHlwZSkgKyAoc3ogLSAoKHNpemVvZih0eXBlKSAtIDEpICUgKHN6KSkgLSAxKSkKKyNkZWZpbmUgS01QX0dUSURfRE5FICgtMikKKworLy8gRm9yd2FyZCBkZWNsYXJhdGlvbiBvZiBpZGVudCBhbmQgaWRlbnRfdAorCitzdHJ1Y3QgaWRlbnQ7Cit0eXBlZGVmIHN0cnVjdCBpZGVudCBpZGVudF90OworCisvLyBFbmQgb2YgY29waWVkIGNvZGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vCisvLyBXZSBuZWVkIHRvIGtub3cgdGhlIHNpemUgb2YgdGhlIGFyZWEgd2UgY2FuIGFzc3VtZSB0aGF0IHRoZSBjb21waWxlcihzKQorLy8gYWxsb2NhdGVkIGZvciBvYmVjdHMgb2YgdHlwZSBvbXBfbG9ja190IGFuZCBvbXBfbmVzdF9sb2NrX3QuICBUaGUgSW50ZWwKKy8vIGNvbXBpbGVyIGFsd2F5cyBhbGxvY2F0ZXMgYSBwb2ludGVyLXNpemVkIGFyZWEsIGFzIGRvZXMgdmlzdWFsIHN0dWRpby4KKy8vCisvLyBnY2MgaG93ZXZlciwgb25seSBhbGxvY2F0ZXMgNCBieXRlcyBmb3IgcmVndWxhciBsb2NrcywgZXZlbiBvbiA2NC1iaXQKKy8vIGludGVsIGFyY2hzLiAgSXQgYWxsb2NhdGVzIGF0IGxlYXN0IDggYnl0ZXMgZm9yIG5lc3RlZCBsb2NrIChtb3JlIG9uCisvLyByZWNlbnQgdmVyc2lvbnMpLCBidXQgd2UgYXJlIGJvdW5kZWQgYnkgdGhlIHBvaW50ZXItc2l6ZWQgY2h1bmtzIHRoYXQKKy8vIHRoZSBJbnRlbCBjb21waWxlciBhbGxvY2F0ZXMuCisvLworCisjaWYgS01QX09TX0xJTlVYICYmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorIyBkZWZpbmUgT01QX0xPQ0tfVF9TSVpFICAgICAgICBzaXplb2YoaW50KQorIyBkZWZpbmUgT01QX05FU1RfTE9DS19UX1NJWkUgICBzaXplb2Yodm9pZCAqKQorI2Vsc2UKKyMgZGVmaW5lIE9NUF9MT0NLX1RfU0laRSAgICAgICAgc2l6ZW9mKHZvaWQgKikKKyMgZGVmaW5lIE9NUF9ORVNUX0xPQ0tfVF9TSVpFICAgc2l6ZW9mKHZvaWQgKikKKyNlbmRpZgorCisvLworLy8gVGhlIEludGVsIGNvbXBpbGVyIGFsbG9jYXRlcyBhIDMyLWJ5dGUgY2h1bmsgZm9yIGEgY3JpdGljYWwgc2VjdGlvbi4KKy8vIEJvdGggZ2NjIGFuZCB2aXN1YWwgc3R1ZGlvIG9ubHkgYWxsb2NhdGUgZW5vdWdoIHNwYWNlIGZvciBhIHBvaW50ZXIuCisvLyBTb21ldGltZXMgd2Uga25vdyB0aGF0IHRoZSBzcGFjZSB3YXMgYWxsb2NhdGVkIGJ5IHRoZSBJbnRlbCBjb21waWxlci4KKy8vCisjZGVmaW5lIE9NUF9DUklUSUNBTF9TSVpFICAgICAgIHNpemVvZih2b2lkICopCisjZGVmaW5lIElOVEVMX0NSSVRJQ0FMX1NJWkUgICAgIDMyCisKKy8vCisvLyBsb2NrIGZsYWdzCisvLwordHlwZWRlZiBrbXBfdWludDMyIGttcF9sb2NrX2ZsYWdzX3Q7CisKKyNkZWZpbmUga21wX2xmX2NyaXRpY2FsX3NlY3Rpb24gMQorCisvLworLy8gV2hlbiBhIGxvY2sgdGFibGUgaXMgdXNlZCwgdGhlIGluZGljZXMgYXJlIG9mIGttcF9sb2NrX2luZGV4X3QKKy8vCit0eXBlZGVmIGttcF91aW50MzIga21wX2xvY2tfaW5kZXhfdDsKKworLy8KKy8vIFdoZW4gbWVtb3J5IGFsbG9jYXRlZCBmb3IgbG9ja3MgYXJlIG9uIHRoZSBsb2NrIHBvb2wgKGZyZWUgbGlzdCksCisvLyBpdCBpcyB0cmVhdGVkIGFzIHN0cnVjdHMgb2YgdGhpcyB0eXBlLgorLy8KK3N0cnVjdCBrbXBfbG9ja19wb29sIHsKKyAgICB1bmlvbiBrbXBfdXNlcl9sb2NrICpuZXh0OworICAgIGttcF9sb2NrX2luZGV4X3QgaW5kZXg7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfbG9ja19wb29sIGttcF9sb2NrX3Bvb2xfdDsKKworCitleHRlcm4gdm9pZCBfX2ttcF92YWxpZGF0ZV9sb2Nrcyggdm9pZCApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyAgVGhlcmUgYXJlIDUgbG9jayBpbXBsZW1lbnRhdGlvbnM6CisvLworLy8gICAgICAgMS4gVGVzdCBhbmQgc2V0IGxvY2tzLgorLy8gICAgICAgMi4gZnV0ZXggbG9ja3MgKExpbnV4KiBPUyBvbiB4ODYgYW5kIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIGFyY2hpdGVjdHVyZSkKKy8vICAgICAgIDMuIFRpY2tldCAoTGFtcG9ydCBiYWtlcnkpIGxvY2tzLgorLy8gICAgICAgNC4gUXVldWluZyBsb2NrcyAod2l0aCBzZXBhcmF0ZSBzcGluIGZpZWxkcykuCisvLyAgICAgICA1LiBEUlBBIChEeW5hbWljYWxseSBSZWNvbmZpZ3VyYWJsZSBEaXN0cmlidXRlZCBQb2xsaW5nIEFyZWEpIGxvY2tzCisvLworLy8gICBhbmQgMyBsb2NrIHB1cnBvc2VzOgorLy8KKy8vICAgICAgIDEuIEJvb3RzdHJhcCBsb2NrcyAtLSBVc2VkIGZvciBhIGZldyBsb2NrcyBhdmFpbGFibGUgYXQgbGlicmFyeSBzdGFydHVwLXNodXRkb3duIHRpbWUuCisvLyAgICAgICAgICBUaGVzZSBkbyBub3QgcmVxdWlyZSBub24tbmVnYXRpdmUgZ2xvYmFsIHRocmVhZCBJRCdzLgorLy8gICAgICAgMi4gSW50ZXJuYWwgUlRMIGxvY2tzIC0tIFVzZWQgZXZlcnl3aGVyZSBlbHNlIGluIHRoZSBSVEwKKy8vICAgICAgIDMuIFVzZXIgbG9ja3MgKGluY2x1ZGVzIGNyaXRpY2FsIHNlY3Rpb25zKQorLy8KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBMb2NrIGltcGxlbWVudGF0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBUZXN0IGFuZCBzZXQgbG9ja3MuCisvLworLy8gTm9uLW5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9ja3MgZGlmZmVyIGZyb20gdGhlIG90aGVyIGxvY2sga2luZHMgKGV4Y2VwdAorLy8gZnV0ZXgpIGluIHRoYXQgd2UgdXNlIHRoZSBtZW1vcnkgYWxsb2NhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgdGhlIGxvY2ssCisvLyByYXRoZXIgdGhhbiBhIHBvaW50ZXIgdG8gaXQuCisvLworLy8gT24gbGluMzIsIGxpbl8zMmUsIGFuZCB3aW5fMzIsIHRoZSBzcGFjZSBhbGxvY2F0ZWQgbWF5IGJlIGFzIHNtYWxsIGFzIDQKKy8vIGJ5dGVzLCBzbyB3ZSBoYXZlIHRvIHVzZSBhIGxvY2sgdGFibGUgZm9yIG5lc3RlZCBsb2NrcywgYW5kIGF2b2lkIGFjY2Vzc2luZworLy8gdGhlIGRlcHRoX2xvY2tlZCBmaWVsZCBmb3Igbm9uLW5lc3RlZCBsb2Nrcy4KKy8vCisvLyBJbmZvcm1hdGlvbiBub3JtYWxseSBhdmFpbGFibGUgdG8gdGhlIHRvb2xzLCBzdWNoIGFzIGxvY2sgbG9jYXRpb24sCisvLyBsb2NrIHVzYWdlIChub3JtYWwgbG9jayB2cy4gY3JpdGljYWwgc2VjdGlvbiksIGV0Yy4gaXMgbm90IGF2YWlsYWJsZSB3aXRoCisvLyB0ZXN0IGFuZCBzZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV90YXNfbG9jayB7CisgICAgdm9sYXRpbGUga21wX2ludDMyIHBvbGw7ICAgICAgICAgLy8gMCA9PiB1bmxvY2tlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvY2tlZDogKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZAorICAgIGttcF9pbnQzMiAgICAgICAgICBkZXB0aF9sb2NrZWQ7IC8vIGRlcHRoIGxvY2tlZCwgZm9yIG5lc3RlZCBsb2NrcyBvbmx5Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV90YXNfbG9jayBrbXBfYmFzZV90YXNfbG9ja190OworCit1bmlvbiBrbXBfdGFzX2xvY2sgeworICAgIGttcF9iYXNlX3Rhc19sb2NrX3QgbGs7CisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7ICAgLy8gbWFrZSBjZXJ0YWluIHN0cnVjdCBpcyBsYXJnZSBlbm91Z2gKKyAgICBkb3VibGUgbGtfYWxpZ247ICAgICAgICAvLyB1c2Ugd29yc3QgY2FzZSBhbGlnbm1lbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBubyBjYWNoZSBsaW5lIHBhZGRpbmcKK307CisKK3R5cGVkZWYgdW5pb24ga21wX3Rhc19sb2NrIGttcF90YXNfbG9ja190OworCisvLworLy8gU3RhdGljIGluaXRpYWxpemVyIGZvciB0ZXN0IGFuZCBzZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3Rhc19sb2NrX3QgeGxvY2sgPSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLworI2RlZmluZSBLTVBfVEFTX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSB7IHsgMCwgMCB9IH0KKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX3Rhc19sb2NrKCBrbXBfdGFzX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF90YXNfbG9jaygga21wX3Rhc19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfdGFzX2xvY2soIGttcF90YXNfbG9ja190ICpsY2sgKTsKKworI2RlZmluZSBLTVBfTE9DS19SRUxFQVNFRCAgICAgICAxCisjZGVmaW5lIEtNUF9MT0NLX1NUSUxMX0hFTEQgICAgIDAKKyNkZWZpbmUgS01QX0xPQ0tfQUNRVUlSRURfRklSU1QgMQorI2RlZmluZSBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUICAwCisKKyNkZWZpbmUgS01QX1VTRV9GVVRFWCAoS01QX09TX0xJTlVYICYmICFLTVBfT1NfQ05LICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSkKKworI2lmIEtNUF9VU0VfRlVURVgKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gZnV0ZXggbG9ja3MuICBmdXRleCBsb2NrcyBhcmUgb25seSBhdmFpbGFibGUgb24gTGludXgqIE9TLgorLy8KKy8vIExpa2Ugbm9uLW5lc3RlZCB0ZXN0IGFuZCBzZXQgbG9jaywgbm9uLW5lc3RlZCBmdXRleCBsb2NrcyB1c2UgdGhlIG1lbW9yeQorLy8gYWxsb2NhdGVkIGJ5IHRoZSBjb21waWxlciBmb3IgdGhlIGxvY2ssIHJhdGhlciB0aGFuIGEgcG9pbnRlciB0byBpdC4KKy8vCisvLyBJbmZvcm1hdGlvbiBub3JtYWxseSBhdmFpbGFibGUgdG8gdGhlIHRvb2xzLCBzdWNoIGFzIGxvY2sgbG9jYXRpb24sCisvLyBsb2NrIHVzYWdlIChub3JtYWwgbG9jayB2cy4gY3JpdGljYWwgc2VjdGlvbiksIGV0Yy4gaXMgbm90IGF2YWlsYWJsZSB3aXRoCisvLyB0ZXN0IGFuZCBzZXQgbG9ja3MuICBXaXRoIG5vbi1uZXN0ZWQgZnV0ZXggbG9ja3MsIHRoZSBsb2NrIG93bmVyIGlzIG5vdAorLy8gZXZlbiBhdmFpbGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9mdXRleF9sb2NrIHsKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgcG9sbDsgICAgICAgICAvLyAwID0+IHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gMiooZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbG9ja2VkOiAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkCisgICAga21wX2ludDMyICAgICAgICAgIGRlcHRoX2xvY2tlZDsgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9iYXNlX2Z1dGV4X2xvY2sga21wX2Jhc2VfZnV0ZXhfbG9ja190OworCit1bmlvbiBrbXBfZnV0ZXhfbG9jayB7CisgICAga21wX2Jhc2VfZnV0ZXhfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOyAgIC8vIG1ha2UgY2VydGFpbiBzdHJ1Y3QgaXMgbGFyZ2UgZW5vdWdoCisgICAgZG91YmxlIGxrX2FsaWduOyAgICAgICAgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbm8gY2FjaGUgbGluZSBwYWRkaW5nCit9OworCit0eXBlZGVmIHVuaW9uIGttcF9mdXRleF9sb2NrIGttcF9mdXRleF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIGZ1dGV4IGxvY2sgdmFyaWFibGVzLiBVc2FnZToKKy8vICAgIGttcF9mdXRleF9sb2NrX3QgeGxvY2sgPSBLTVBfRlVURVhfTE9DS19JTklUSUFMSVpFUiggeGxvY2sgKTsKKy8vCisjZGVmaW5lIEtNUF9GVVRFWF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IDAsIDAgfSB9CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCitleHRlcm4gaW50IF9fa21wX2FjcXVpcmVfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9uZXN0ZWRfZnV0ZXhfbG9jaygga21wX2Z1dGV4X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X25lc3RlZF9mdXRleF9sb2NrKCBrbXBfZnV0ZXhfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfbmVzdGVkX2Z1dGV4X2xvY2soIGttcF9mdXRleF9sb2NrX3QgKmxjayApOworCisjZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFRpY2tldCBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmZGVmIF9fY3BsdXNwbHVzCisKKyNpZmRlZiBfTVNDX1ZFUgorLy8gTVNWQyB3b24ndCBhbGxvdyB1c2Ugb2Ygc3RkOjphdG9taWM8PiBpbiBhIHVuaW9uIHNpbmNlIGl0IGhhcyBub24tdHJpdmlhbCBjb3B5IGNvbnN0cnVjdG9yLgorCitzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sgeworICAgIC8vIGBpbml0aWFsaXplZCcgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgICAgc3RkOjphdG9taWNfYm9vbCAgICAgIGluaXRpYWxpemVkOworICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqc2VsZjsgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgIGxvY2F0aW9uOyAgICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgc3RkOjphdG9taWNfdWludCAgICAgIG5leHRfdGlja2V0OyAgICAvLyB0aWNrZXQgbnVtYmVyIHRvIGdpdmUgdG8gbmV4dCB0aHJlYWQgd2hpY2ggYWNxdWlyZXMKKyAgICBzdGQ6OmF0b21pY191aW50ICAgICAgbm93X3NlcnZpbmc7ICAgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHN0ZDo6YXRvbWljX2ludCAgICAgICBvd25lcl9pZDsgICAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIHN0ZDo6YXRvbWljX2ludCAgICAgICBkZXB0aF9sb2NrZWQ7ICAgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKKyAgICBrbXBfbG9ja19mbGFnc190ICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKyNlbHNlCitzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sgeworICAgIC8vIGBpbml0aWFsaXplZCcgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgICAgc3RkOjphdG9taWM8Ym9vbD4gICAgIGluaXRpYWxpemVkOworICAgIHZvbGF0aWxlIHVuaW9uIGttcF90aWNrZXRfbG9jayAqc2VsZjsgLy8gcG9pbnRzIHRvIHRoZSBsb2NrIHVuaW9uCisgICAgaWRlbnRfdCBjb25zdCAqICAgICAgIGxvY2F0aW9uOyAgICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgc3RkOjphdG9taWM8dW5zaWduZWQ+IG5leHRfdGlja2V0OyAgICAvLyB0aWNrZXQgbnVtYmVyIHRvIGdpdmUgdG8gbmV4dCB0aHJlYWQgd2hpY2ggYWNxdWlyZXMKKyAgICBzdGQ6OmF0b21pYzx1bnNpZ25lZD4gbm93X3NlcnZpbmc7ICAgIC8vIHRpY2tldCBudW1iZXIgZm9yIHRocmVhZCB3aGljaCBob2xkcyB0aGUgbG9jaworICAgIHN0ZDo6YXRvbWljPGludD4gICAgICBvd25lcl9pZDsgICAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIHN0ZDo6YXRvbWljPGludD4gICAgICBkZXB0aF9sb2NrZWQ7ICAgLy8gZGVwdGggbG9ja2VkLCBmb3IgbmVzdGVkIGxvY2tzIG9ubHkKKyAgICBrbXBfbG9ja19mbGFnc190ICAgICAgZmxhZ3M7ICAgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKyNlbmRpZgorCisjZWxzZSAvLyBfX2NwbHVzcGx1cworCitzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2s7CisKKyNlbmRpZiAvLyAhX19jcGx1c3BsdXMKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfdGlja2V0X2xvY2sga21wX2Jhc2VfdGlja2V0X2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF90aWNrZXRfbG9jayB7CisgICAga21wX2Jhc2VfdGlja2V0X2xvY2tfdCBsazsgICAgICAgLy8gVGhpcyBmaWVsZCBtdXN0IGJlIGZpcnN0IHRvIGFsbG93IHN0YXRpYyBpbml0aWFsaXppbmcuCisgICAga21wX2xvY2tfcG9vbF90IHBvb2w7CisgICAgZG91YmxlICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICBsa19wYWRbIEtNUF9QQUQoIGttcF9iYXNlX3RpY2tldF9sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfdGlja2V0X2xvY2sga21wX3RpY2tldF9sb2NrX3Q7CisKKy8vCisvLyBTdGF0aWMgaW5pdGlhbGl6ZXIgZm9yIHNpbXBsZSB0aWNrZXQgbG9jayB2YXJpYWJsZXMuIFVzYWdlOgorLy8gICAga21wX3RpY2tldF9sb2NrX3QgeGxvY2sgPSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIHhsb2NrICk7CisvLyBOb3RlIHRoZSBtYWNybyBhcmd1bWVudC4gSXQgaXMgaW1wb3J0YW50IHRvIG1ha2UgdmFyIHByb3Blcmx5IGluaXRpYWxpemVkLgorLy8KKyNkZWZpbmUgS01QX1RJQ0tFVF9MT0NLX0lOSVRJQUxJWkVSKCBsb2NrICkgeyB7IEFUT01JQ19WQVJfSU5JVCh0cnVlKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmKGxvY2spLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1ZBUl9JTklUKDBVKSwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfVkFSX0lOSVQoMFUpLCBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBBVE9NSUNfVkFSX0lOSVQoMCksIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQVRPTUlDX1ZBUl9JTklUKC0xKSAgICB9IH0KKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X3RpY2tldF9sb2NrX3dpdGhfY2hla3MoIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfdGlja2V0X2xvY2soIGttcF90aWNrZXRfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3RpY2tldF9sb2NrKCBrbXBfdGlja2V0X2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X25lc3RlZF90aWNrZXRfbG9jaygga21wX3RpY2tldF9sb2NrX3QgKmxjayApOworCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIFF1ZXVpbmcgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisKK3N0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvOworCit0eXBlZGVmIHN0cnVjdCBrbXBfYWRhcHRpdmVfbG9ja19pbmZvIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdDsKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworCitzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljcyB7CisgICAgLyogU28gd2UgY2FuIGdldCBzdGF0cyBmcm9tIGxvY2tzIHRoYXQgaGF2ZW4ndCBiZWVuIGRlc3Ryb3llZC4gKi8KKyAgICBrbXBfYWRhcHRpdmVfbG9ja19pbmZvX3QgKiBuZXh0OworICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCAqIHByZXY7CisKKyAgICAvKiBPdGhlciBzdGF0aXN0aWNzICovCisgICAga21wX3VpbnQzMiBzdWNjZXNzZnVsU3BlY3VsYXRpb25zOworICAgIGttcF91aW50MzIgaGFyZEZhaWxlZFNwZWN1bGF0aW9uczsKKyAgICBrbXBfdWludDMyIHNvZnRGYWlsZWRTcGVjdWxhdGlvbnM7CisgICAga21wX3VpbnQzMiBub25TcGVjdWxhdGl2ZUFjcXVpcmVzOworICAgIGttcF91aW50MzIgbm9uU3BlY3VsYXRpdmVBY3F1aXJlQXR0ZW1wdHM7CisgICAga21wX3VpbnQzMiBsZW1taW5nWWllbGRzOworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljcyBrbXBfYWRhcHRpdmVfbG9ja19zdGF0aXN0aWNzX3Q7CisKK2V4dGVybiB2b2lkIF9fa21wX3ByaW50X3NwZWN1bGF0aXZlX3N0YXRzKCk7CitleHRlcm4gdm9pZCBfX2ttcF9pbml0X3NwZWN1bGF0aXZlX3N0YXRzKCk7CisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RydWN0IGttcF9hZGFwdGl2ZV9sb2NrX2luZm8KK3sKKyAgICAvKiBWYWx1ZXMgdXNlZCBmb3IgYWRhcHRpdml0eS4KKyAgICAgKiBBbHRob3VnaCB0aGVzZSBhcmUgYWNjZXNzZWQgZnJvbSBtdWx0aXBsZSB0aHJlYWRzIHdlIGRvbid0IGFjY2VzcyB0aGVtIGF0b21pY2FsbHksCisgICAgICogYmVjYXVzZSBpZiB3ZSBtaXNzIHVwZGF0ZXMgaXQgcHJvYmFibHkgZG9lc24ndCBtYXR0ZXIgbXVjaC4gKEl0IGp1c3QgYWZmZWN0cyBvdXIKKyAgICAgKiBkZWNpc2lvbiBhYm91dCB3aGV0aGVyIHRvIHRyeSBzcGVjdWxhdGlvbiBvbiB0aGUgbG9jaykuCisgICAgICovCisgICAga21wX3VpbnQzMiB2b2xhdGlsZSBiYWRuZXNzOworICAgIGttcF91aW50MzIgdm9sYXRpbGUgYWNxdWlyZV9hdHRlbXB0czsKKyAgICAvKiBQYXJhbWV0ZXJzIG9mIHRoZSBsb2NrLiAqLworICAgIGttcF91aW50MzIgbWF4X2JhZG5lc3M7CisgICAga21wX3VpbnQzMiBtYXhfc29mdF9yZXRyaWVzOworCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2FkYXB0aXZlX2xvY2tfc3RhdGlzdGljc190IHZvbGF0aWxlIHN0YXRzOworI2VuZGlmCit9OworCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisKK3N0cnVjdCBrbXBfYmFzZV9xdWV1aW5nX2xvY2sgeworCisgICAgLy8gIGBpbml0aWFsaXplZCcgbXVzdCBiZSB0aGUgZmlyc3QgZW50cnkgaW4gdGhlIGxvY2sgZGF0YSBzdHJ1Y3R1cmUhCisgICAgdm9sYXRpbGUgdW5pb24ga21wX3F1ZXVpbmdfbG9jayAqaW5pdGlhbGl6ZWQ7IC8vIFBvaW50cyB0byB0aGUgbG9jayB1bmlvbiBpZiBpbiBpbml0aWFsaXplZCBzdGF0ZS4KKworICAgIGlkZW50X3QgY29uc3QgKiAgICAgbG9jYXRpb247ICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisKKyAgICBLTVBfQUxJR04oIDggKSAgICAgICAgICAgICAgICAgICAgLy8gdGFpbF9pZCAgbXVzdCBiZSA4LWJ5dGUgYWxpZ25lZCEKKworICAgIHZvbGF0aWxlIGttcF9pbnQzMiAgdGFpbF9pZDsgICAgICAvLyAoZ3RpZCsxKSBvZiB0aHJlYWQgYXQgdGFpbCBvZiB3YWl0IHF1ZXVlLCAwIGlmIGVtcHR5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE11c3QgYmUgbm8gcGFkZGluZyBoZXJlIHNpbmNlIGhlYWQvdGFpbCB1c2VkIGluIDgtYnl0ZSBDQVMKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIGhlYWRfaWQ7ICAgICAgLy8gKGd0aWQrMSkgb2YgdGhyZWFkIGF0IGhlYWQgb2Ygd2FpdCBxdWV1ZSwgMCBpZiBlbXB0eQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBEZWNsIG9yZGVyIGFzc3VtZXMgbGl0dGxlIGVuZGlhbgorICAgIC8vIGJha2VyeS1zdHlsZSBsb2NrCisgICAgdm9sYXRpbGUga21wX3VpbnQzMiBuZXh0X3RpY2tldDsgIC8vIHRpY2tldCBudW1iZXIgdG8gZ2l2ZSB0byBuZXh0IHRocmVhZCB3aGljaCBhY3F1aXJlcworICAgIHZvbGF0aWxlIGttcF91aW50MzIgbm93X3NlcnZpbmc7ICAvLyB0aWNrZXQgbnVtYmVyIGZvciB0aHJlYWQgd2hpY2ggaG9sZHMgdGhlIGxvY2sKKyAgICB2b2xhdGlsZSBrbXBfaW50MzIgIG93bmVyX2lkOyAgICAgLy8gKGd0aWQrMSkgb2Ygb3duaW5nIHRocmVhZCwgMCBpZiB1bmxvY2tlZAorICAgIGttcF9pbnQzMiAgICAgICAgICAgZGVwdGhfbG9ja2VkOyAvLyBkZXB0aCBsb2NrZWQsIGZvciBuZXN0ZWQgbG9ja3Mgb25seQorCisgICAga21wX2xvY2tfZmxhZ3NfdCAgICBmbGFnczsgICAgICAgIC8vIGxvY2sgc3BlY2lmaWNzLCBlLmcuIGNyaXRpY2FsIHNlY3Rpb24gbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfcXVldWluZ19sb2NrIGttcF9iYXNlX3F1ZXVpbmdfbG9ja190OworCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZigga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIHRhaWxfaWQgKSAlIDggPT0gMCApOworCit1bmlvbiBLTVBfQUxJR05fQ0FDSEUga21wX3F1ZXVpbmdfbG9jayB7CisgICAga21wX2Jhc2VfcXVldWluZ19sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLgorICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfcXVldWluZ19sb2NrX3QsIENBQ0hFX0xJTkUgKSBdOworfTsKKwordHlwZWRlZiB1bmlvbiBrbXBfcXVldWluZ19sb2NrIGttcF9xdWV1aW5nX2xvY2tfdDsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3Rlc3RfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfcmVsZWFzZV9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrICk7CitleHRlcm4gdm9pZCBfX2ttcF9kZXN0cm95X3F1ZXVpbmdfbG9jaygga21wX3F1ZXVpbmdfbG9ja190ICpsY2sgKTsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF9yZWxlYXNlX25lc3RlZF9xdWV1aW5nX2xvY2soIGttcF9xdWV1aW5nX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfcXVldWluZ19sb2NrKCBrbXBfcXVldWluZ19sb2NrX3QgKmxjayApOworCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBBZGFwdGl2ZSBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0cnVjdCBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrIHsKKyAgICBrbXBfYmFzZV9xdWV1aW5nX2xvY2sgcWxrOworICAgIEtNUF9BTElHTihDQUNIRV9MSU5FKQorICAgIGttcF9hZGFwdGl2ZV9sb2NrX2luZm9fdCBhZGFwdGl2ZTsgICAgIC8vIEluZm9ybWF0aW9uIGZvciB0aGUgc3BlY3VsYXRpdmUgYWRhcHRpdmUgbG9jaworfTsKKwordHlwZWRlZiBzdHJ1Y3Qga21wX2Jhc2VfYWRhcHRpdmVfbG9jayBrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3Q7CisKK3VuaW9uIEtNUF9BTElHTl9DQUNIRSBrbXBfYWRhcHRpdmVfbG9jayB7CisgICAga21wX2Jhc2VfYWRhcHRpdmVfbG9ja190IGxrOworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSBsa19hbGlnbjsKKyAgICBjaGFyIGxrX3BhZFsgS01QX1BBRChrbXBfYmFzZV9hZGFwdGl2ZV9sb2NrX3QsIENBQ0hFX0xJTkUpIF07Cit9OwordHlwZWRlZiB1bmlvbiBrbXBfYWRhcHRpdmVfbG9jayBrbXBfYWRhcHRpdmVfbG9ja190OworCisjIGRlZmluZSBHRVRfUUxLX1BUUihsKSAoKGttcF9xdWV1aW5nX2xvY2tfdCAqKSAmIChsKS0+bGsucWxrKQorCisjZW5kaWYgLy8gS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBEUkRQQSB0aWNrZXQgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIHsKKyAgICAvLworICAgIC8vIEFsbCBvZiB0aGUgZmllbGRzIG9uIHRoZSBmaXJzdCBjYWNoZSBsaW5lIGFyZSBvbmx5IHdyaXR0ZW4gd2hlbgorICAgIC8vIGluaXRpYWxpemluZyBvciByZWNvbmZpZ3VyaW5nIHRoZSBsb2NrLiAgVGhlc2UgYXJlIHJlbGF0aXZlbHkgcmFyZQorICAgIC8vIG9wZXJhdGlvbnMsIHNvIGRhdGEgZnJvbSB0aGUgZmlyc3QgY2FjaGUgbGluZSB3aWxsIHVzdWFsbHkgc3RheQorICAgIC8vIHJlc2lkZW50IGluIHRoZSBjYWNoZSBvZiBlYWNoIHRocmVhZCB0cnlpbmcgdG8gYWNxdWlyZSB0aGUgbG9jay4KKyAgICAvLworICAgIC8vIGluaXRpYWxpemVkIG11c3QgYmUgdGhlIGZpcnN0IGVudHJ5IGluIHRoZSBsb2NrIGRhdGEgc3RydWN0dXJlIQorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSB1bmlvbiBrbXBfZHJkcGFfbG9jayAqIGluaXRpYWxpemVkOyAgICAvLyBwb2ludHMgdG8gdGhlIGxvY2sgdW5pb24gaWYgaW4gaW5pdGlhbGl6ZWQgc3RhdGUKKyAgICBpZGVudF90IGNvbnN0ICogICAgICAgICAgICAgICAgIGxvY2F0aW9uOyAgICAgICAvLyBTb3VyY2UgY29kZSBsb2NhdGlvbiBvZiBvbXBfaW5pdF9sb2NrKCkuCisgICAgdm9sYXRpbGUgc3RydWN0IGttcF9sb2NrX3BvbGwgeworICAgICAgICBrbXBfdWludDY0IHBvbGw7CisgICAgfSAqIHZvbGF0aWxlIHBvbGxzOworICAgIHZvbGF0aWxlIGttcF91aW50NjQgICAgICAgICAgICAgbWFzazsgICAgICAgICAgIC8vIGlzIDIqKm51bV9wb2xscy0xIGZvciBtb2Qgb3AKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIGNsZWFudXBfdGlja2V0OyAvLyB0aHJlYWQgd2l0aCBjbGVhbnVwIHRpY2tldAorICAgIHZvbGF0aWxlIHN0cnVjdCBrbXBfbG9ja19wb2xsICogb2xkX3BvbGxzOyAgICAgIC8vIHdpbGwgZGVhbGxvY2F0ZSBvbGRfcG9sbHMKKyAgICBrbXBfdWludDMyICAgICAgICAgICAgICAgICAgICAgIG51bV9wb2xsczsgICAgICAvLyBtdXN0IGJlIHBvd2VyIG9mIDIKKworICAgIC8vCisgICAgLy8gbmV4dF90aWNrZXQgaXQgbmVlZHMgdG8gZXhpc3QgaW4gYSBzZXBhcmF0ZSBjYWNoZSBsaW5lLCBhcyBpdCBpcworICAgIC8vIGludmFsaWRhdGVkIGV2ZXJ5IHRpbWUgYSB0aHJlYWQgdGFrZXMgYSBuZXcgdGlja2V0LgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICB2b2xhdGlsZSBrbXBfdWludDY0ICAgICAgICAgICAgIG5leHRfdGlja2V0OworCisgICAgLy8KKyAgICAvLyBub3dfc2VydmluZyBpcyB1c2VkIHRvIHN0b3JlIG91ciB0aWNrZXQgdmFsdWUgd2hpbGUgd2UgaG9sZCB0aGUgbG9jay4KKyAgICAvLyBJdCBoYXMgYSBzbGlnaHRseSBkaWZmZXJlbnQgbWVhbmluZyBpbiB0aGUgRFJEUEEgdGlja2V0IGxvY2tzICh3aGVyZQorICAgIC8vIGl0IGlzIHdyaXR0ZW4gYnkgdGhlIGFjcXVpcmluZyB0aHJlYWQpIHRoYW4gaXQgZG9lcyBpbiB0aGUgc2ltcGxlCisgICAgLy8gdGlja2V0IGxvY2tzICh3aGVyZSBpdCBpcyB3cml0dGVuIGJ5IHRoZSByZWxlYXNpbmcgdGhyZWFkKS4KKyAgICAvLworICAgIC8vIFNpbmNlIG5vd19zZXJ2aW5nIGlzIG9ubHkgcmVhZCBhbiB3cml0dGVuIGluIHRoZSBjcml0aWNhbCBzZWN0aW9uLAorICAgIC8vIGl0IGlzIG5vbi12b2xhdGlsZSwgYnV0IGl0IG5lZWRzIHRvIGV4aXN0IG9uIGEgc2VwYXJhdGUgY2FjaGUgbGluZSwKKyAgICAvLyBhcyBpdCBpcyBpbnZhbGlkYXRlZCBhdCBldmVyeSBsb2NrIGFjcXVpcmUuCisgICAgLy8KKyAgICAvLyBMaWtld2lzZSwgdGhlIHZhcnMgdXNlZCBmb3IgbmVzdGVkIGxvY2tzIChvd25lcl9pZCBhbmQgZGVwdGhfbG9ja2VkKQorICAgIC8vIGFyZSBvbmx5IHdyaXR0ZW4gYnkgdGhlIHRocmVhZCBvd25pbmcgdGhlIGxvY2ssIHNvIHRoZXkgYXJlIHB1dCBpbgorICAgIC8vIHRoaXMgY2FjaGUgbGluZS4gIG93bmVyX2lkIGlzIHJlYWQgYnkgb3RoZXIgdGhyZWFkcywgc28gaXQgbXVzdCBiZQorICAgIC8vIGRlY2xhcmVkIHZvbGF0aWxlLgorICAgIC8vCisgICAgS01QX0FMSUdOX0NBQ0hFCisKKyAgICBrbXBfdWludDY0ICAgICAgICAgICAgICAgICAgICAgIG5vd19zZXJ2aW5nOyAgICAvLyBkb2Vzbid0IGhhdmUgdG8gYmUgdm9sYXRpbGUKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICAgICAgICAgICAgIG93bmVyX2lkOyAgICAgICAvLyAoZ3RpZCsxKSBvZiBvd25pbmcgdGhyZWFkLCAwIGlmIHVubG9ja2VkCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICBkZXB0aF9sb2NrZWQ7ICAgLy8gZGVwdGggbG9ja2VkCisgICAga21wX2xvY2tfZmxhZ3NfdCAgICAgICAgICAgICAgICBmbGFnczsgICAgICAgICAgLy8gbG9jayBzcGVjaWZpY3MsIGUuZy4gY3JpdGljYWwgc2VjdGlvbiBsb2NrCit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmFzZV9kcmRwYV9sb2NrIGttcF9iYXNlX2RyZHBhX2xvY2tfdDsKKwordW5pb24gS01QX0FMSUdOX0NBQ0hFIGttcF9kcmRwYV9sb2NrIHsKKyAgICBrbXBfYmFzZV9kcmRwYV9sb2NrX3QgbGs7ICAgICAgIC8vIFRoaXMgZmllbGQgbXVzdCBiZSBmaXJzdCB0byBhbGxvdyBzdGF0aWMgaW5pdGlhbGl6aW5nLiAqLworICAgIGttcF9sb2NrX3Bvb2xfdCBwb29sOworICAgIGRvdWJsZSAgICAgICAgICAgICAgICBsa19hbGlnbjsgLy8gdXNlIHdvcnN0IGNhc2UgYWxpZ25tZW50CisgICAgY2hhciAgICAgICAgICAgICAgICAgIGxrX3BhZFsgS01QX1BBRCgga21wX2Jhc2VfZHJkcGFfbG9ja190LCBDQUNIRV9MSU5FICkgXTsKK307CisKK3R5cGVkZWYgdW5pb24ga21wX2RyZHBhX2xvY2sga21wX2RyZHBhX2xvY2tfdDsKKworZXh0ZXJuIGludCBfX2ttcF9hY3F1aXJlX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiBpbnQgX19rbXBfdGVzdF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2sgKTsKK2V4dGVybiB2b2lkIF9fa21wX2Rlc3Ryb3lfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CisKK2V4dGVybiBpbnQgX19rbXBfYWNxdWlyZV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrLCBrbXBfaW50MzIgZ3RpZCApOworZXh0ZXJuIGludCBfX2ttcF90ZXN0X25lc3RlZF9kcmRwYV9sb2NrKCBrbXBfZHJkcGFfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICk7CitleHRlcm4gaW50IF9fa21wX3JlbGVhc2VfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKTsKK2V4dGVybiB2b2lkIF9fa21wX2luaXRfbmVzdGVkX2RyZHBhX2xvY2soIGttcF9kcmRwYV9sb2NrX3QgKmxjayApOworZXh0ZXJuIHZvaWQgX19rbXBfZGVzdHJveV9uZXN0ZWRfZHJkcGFfbG9jaygga21wX2RyZHBhX2xvY2tfdCAqbGNrICk7CisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gTG9jayBwdXJwb3Nlcy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBCb290c3RyYXAgbG9ja3MuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIEJvb3RzdHJhcCBsb2NrcyAtLSB2ZXJ5IGZldyBsb2NrcyB1c2VkIGF0IGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vIEJvb3RzdHJhcCBsb2NrcyBhcmUgY3VycmVudGx5IGltcGxlbWVudGVkIGFzIHRpY2tldCBsb2Nrcy4KKy8vIFRoZXkgY291bGQgYWxzbyBiZSBpbXBsZW1lbnRlZCBhcyB0ZXN0IGFuZCBzZXQgbG9jaywgYnV0IGNhbm5vdCBiZQorLy8gaW1wbGVtZW50ZWQgd2l0aCBvdGhlciBsb2NrIGtpbmRzIGFzIHRoZXkgcmVxdWlyZSBndGlkcyB3aGljaCBhcmUgbm90CisvLyBhdmFpbGFibGUgYXQgaW5pdGlhbGl6YXRpb24gdGltZS4KKwordHlwZWRlZiBrbXBfdGlja2V0X2xvY2tfdCBrbXBfYm9vdHN0cmFwX2xvY2tfdDsKKworI2RlZmluZSBLTVBfQk9PVFNUUkFQX0xPQ0tfSU5JVElBTElaRVIoIGxvY2sgKSBLTVBfVElDS0VUX0xPQ0tfSU5JVElBTElaRVIoIChsb2NrKSApCisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCBrbXBfYm9vdHN0cmFwX2xvY2tfdCAqbGNrICkKK3sKKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayggbGNrLCBLTVBfR1RJRF9ETkUgKTsKK30KKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIEtNUF9HVElEX0RORSApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soIGttcF9ib290c3RyYXBfbG9ja190ICpsY2sgKQoreworICAgIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGxjaywgS01QX0dUSURfRE5FICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfaW5pdF9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfaW5pdF90aWNrZXRfbG9jayggbGNrICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9ib290c3RyYXBfbG9jaygga21wX2Jvb3RzdHJhcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSW50ZXJuYWwgUlRMIGxvY2tzLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLworLy8gSW50ZXJuYWwgUlRMIGxvY2tzIGFyZSBhbHNvIGltcGxlbWVudGVkIGFzIHRpY2tldCBsb2NrcywgZm9yIG5vdy4KKy8vCisvLyBGSVhNRSAtIFdlIHNob3VsZCBnbyB0aHJvdWdoIGFuZCBmaWd1cmUgb3V0IHdoaWNoIGxvY2sga2luZCB3b3JrcyBiZXN0IGZvcgorLy8gZWFjaCBpbnRlcm5hbCBsb2NrLCBhbmQgdXNlIHRoZSB0eXBlIGRlY2xhcmF0aW9uIGFuZCBmdW5jdGlvbiBjYWxscyBmb3IKKy8vIHRoYXQgZXhwbGljaXQgbG9jayBraW5kIChhbmQgZ2V0IHJpZCBvZiB0aGlzIHNlY3Rpb24pLgorLy8KKwordHlwZWRlZiBrbXBfdGlja2V0X2xvY2tfdCBrbXBfbG9ja190OworCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfYWNxdWlyZV9sb2NrKCBrbXBfbG9ja190ICpsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICByZXR1cm4gX19rbXBfYWNxdWlyZV90aWNrZXRfbG9jayggbGNrLCBndGlkICk7Cit9CisKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X2xvY2soIGttcF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIHJldHVybiBfX2ttcF90ZXN0X3RpY2tldF9sb2NrKCBsY2ssIGd0aWQgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX2xvY2soIGttcF9sb2NrX3QgKmxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIF9fa21wX3JlbGVhc2VfdGlja2V0X2xvY2soIGxjaywgZ3RpZCApOworfQorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2luaXRfbG9jaygga21wX2xvY2tfdCAqbGNrICkKK3sKKyAgICBfX2ttcF9pbml0X3RpY2tldF9sb2NrKCBsY2sgKTsKK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X2xvY2soIGttcF9sb2NrX3QgKmxjayApCit7CisgICAgX19rbXBfZGVzdHJveV90aWNrZXRfbG9jayggbGNrICk7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXNlciBsb2Nrcy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8KKy8vIERvIG5vdCBhbGxvY2F0ZSBvYmplY3RzIG9mIHR5cGUgdW5pb24ga21wX3VzZXJfbG9jayEhIQorLy8gVGhpcyB3aWxsIHdhc3RlIHNwYWNlIHVubGVzcyBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa19kcmRwYS4KKy8vIEluc3RlYWQsIGNoZWNrIHRoZSB2YWx1ZSBvZiBfX2ttcF91c2VyX2xvY2tfa2luZCBhbmQgYWxsb2NhdGUgb2JqZWN0cyBvZgorLy8gdGhlIHR5cGUgb2YgdGhlIGFwcHJvcHJpYXRlIHVuaW9uIG1lbWJlciwgYW5kIGNhc3QgdGhlaXIgYWRkcmVzc2VzIHRvCisvLyBrbXBfdXNlcl9sb2NrX3AuCisvLworCitlbnVtIGttcF9sb2NrX2tpbmQgeworICAgIGxrX2RlZmF1bHQgPSAwLAorICAgIGxrX3RhcywKKyNpZiBLTVBfVVNFX0ZVVEVYCisgICAgbGtfZnV0ZXgsCisjZW5kaWYKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBLTVBfVVNFX1RTWAorICAgIGxrX2hsZSwKKyAgICBsa19ydG0sCisjZW5kaWYKKyAgICBsa190aWNrZXQsCisgICAgbGtfcXVldWluZywKKyAgICBsa19kcmRwYSwKKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgbGtfYWRhcHRpdmUKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCit9OworCit0eXBlZGVmIGVudW0ga21wX2xvY2tfa2luZCBrbXBfbG9ja19raW5kX3Q7CisKK2V4dGVybiBrbXBfbG9ja19raW5kX3QgX19rbXBfdXNlcl9sb2NrX2tpbmQ7CisKK3VuaW9uIGttcF91c2VyX2xvY2sgeworICAgIGttcF90YXNfbG9ja190ICAgICB0YXM7CisjaWYgS01QX1VTRV9GVVRFWAorICAgIGttcF9mdXRleF9sb2NrX3QgICBmdXRleDsKKyNlbmRpZgorICAgIGttcF90aWNrZXRfbG9ja190ICB0aWNrZXQ7CisgICAga21wX3F1ZXVpbmdfbG9ja190IHF1ZXVpbmc7CisgICAga21wX2RyZHBhX2xvY2tfdCAgIGRyZHBhOworI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICBrbXBfYWRhcHRpdmVfbG9ja190ICAgICBhZGFwdGl2ZTsKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAga21wX2xvY2tfcG9vbF90ICAgIHBvb2w7Cit9OworCit0eXBlZGVmIHVuaW9uIGttcF91c2VyX2xvY2sgKmttcF91c2VyX2xvY2tfcDsKKworI2lmICEgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworZXh0ZXJuIHNpemVfdCBfX2ttcF9iYXNlX3VzZXJfbG9ja19zaXplOworZXh0ZXJuIHNpemVfdCBfX2ttcF91c2VyX2xvY2tfc2l6ZTsKKworZXh0ZXJuIGttcF9pbnQzMiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUga21wX2ludDMyCitfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9nZXRfdXNlcl9sb2NrX293bmVyXyAhPSBOVUxMICk7CisgICAgcmV0dXJuICggKl9fa21wX2dldF91c2VyX2xvY2tfb3duZXJfICkoIGxjayApOworfQorCitleHRlcm4gaW50ICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApOworCisjaWYgS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorCisjZGVmaW5lIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKGxjayxndGlkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcykgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfc2V0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkICE9IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrTmVzdGFibGVVc2VkQXNTaW1wbGUsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICggZ3RpZCA+PSAwICkgJiYgKCBsY2stPnRhcy5say5wb2xsIC0gMSA9PSBndGlkICkgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBMb2NrSXNBbHJlYWR5T3duZWQsIGZ1bmMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgICAgICBcCisgICAgICAgICAgICBrbXBfdWludDMyIHNwaW5zOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIFRDUl80KF9fa21wX250aCkgPiAoX19rbXBfYXZhaWxfcHJvYyA/IF9fa21wX2F2YWlsX3Byb2MgOiBfX2ttcF94cHJvYykgKSB7ICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB3aGlsZSAoICggbGNrLT50YXMubGsucG9sbCAhPSAwICkgfHwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSAgeyAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICggKl9fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfQorCisjZWxzZQorc3RhdGljIGlubGluZSBpbnQKK19fa21wX2FjcXVpcmVfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfYWNxdWlyZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorI2VuZGlmCisKK2V4dGVybiBpbnQgKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICk7CisKKyNpZiBLTVBfT1NfTElOVVggJiYgKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpCisKKyNpbmNsdWRlICJrbXBfaTE4bi5oIiAgICAgICAgICAgICAgICAgICAgICAgLyogQUM6IEtNUF9GQVRBTCBkZWZpbml0aW9uICovCitleHRlcm4gaW50IF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjazsgICAgIC8qIEFDOiBjb3B5IGZyb20ga21wLmggaGVyZSAqLworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3Rlc3RfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCApCit7CisgICAgaWYgKCBfX2ttcF91c2VyX2xvY2tfa2luZCA9PSBsa190YXMgKSB7CisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3Rlc3RfbG9jayI7CisgICAgICAgICAgICBpZiAoICggc2l6ZW9mICgga21wX3Rhc19sb2NrX3QgKSA8PSBPTVBfTE9DS19UX1NJWkUgKQorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCAhPSAtMSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tOZXN0YWJsZVVzZWRBc1NpbXBsZSwgZnVuYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIHJldHVybiAoICggbGNrLT50YXMubGsucG9sbCA9PSAwICkgJiYKKyAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgICAgICByZXR1cm4gKCAqX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworICAgIH0KK30KKyNlbHNlCitzdGF0aWMgaW5saW5lIGludAorX19rbXBfdGVzdF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF90ZXN0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7Cit9CisjZW5kaWYKKworZXh0ZXJuIGludCAoICpfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9yZWxlYXNlX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlbGVhc2VfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfcmVsZWFzZV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkgKCBsY2ssIGd0aWQgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9pbml0X3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrICk7Cit9CisKKy8vCisvLyBXZSBuZWVkIGEgbm9uLWNoZWNraW5nIHZlcnNpb24gb2YgZGVzdHJveSBsb2NrIGZvciB3aGVuIHRoZSBSVEwgaXMKKy8vIGRvaW5nIHRoZSBjbGVhbnVwIGFzIGl0IGNhbid0IGFsd2F5cyB0ZWxsIGlmIHRoZSBsb2NrIGlzIG5lc3RlZCBvciBub3QuCisvLworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF9kZXN0cm95X3VzZXJfbG9jaygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfZGVzdHJveV91c2VyX2xvY2tfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X3VzZXJfbG9ja18gKSggbGNrICk7Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2Rlc3Ryb3lfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfZGVzdHJveV91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCitleHRlcm4gaW50ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKworI2RlZmluZSBfX2ttcF9hY3F1aXJlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MobGNrLGd0aWQsZGVwdGgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfdGFzKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgY2hhciBjb25zdCAqIGNvbnN0IGZ1bmMgPSAib21wX3NldF9uZXN0X2xvY2siOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBzaXplb2YgKCBrbXBfdGFzX2xvY2tfdCApIDw9IE9NUF9ORVNUX0xPQ0tfVF9TSVpFICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgJiYgbGNrLT50YXMubGsuZGVwdGhfbG9ja2VkID09IC0xICkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggTG9ja1NpbXBsZVVzZWRBc05lc3RhYmxlLCBmdW5jICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBpZiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCArPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqZGVwdGggPSBLTVBfTE9DS19BQ1FVSVJFRF9ORVhUOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmICggKCBsY2stPnRhcy5say5wb2xsICE9IDAgKSB8fCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKSAgKSB7ICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGttcF91aW50MzIgc3BpbnM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBLTVBfRlNZTkNfUFJFUEFSRSggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgS01QX0lOSVRfWUlFTEQoIHNwaW5zICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggVENSXzQoX19rbXBfbnRoKSA+IChfX2ttcF9hdmFpbF9wcm9jID8gX19rbXBfYXZhaWxfcHJvYyA6IF9fa21wX3hwcm9jKSApIHsgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgS01QX1lJRUxEKCBUUlVFICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTERfU1BJTiggc3BpbnMgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgd2hpbGUgKCAoIGxjay0+dGFzLmxrLnBvbGwgIT0gMCApIHx8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMiggJihsY2stPnRhcy5say5wb2xsKSwgMCwgZ3RpZCArIDEgKSApICApIHsgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9udGgpID4gKF9fa21wX2F2YWlsX3Byb2MgPyBfX2ttcF9hdmFpbF9wcm9jIDogX19rbXBfeHByb2MpICkgeyBcCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9TUElOKCBzcGlucyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBsY2stPnRhcy5say5kZXB0aF9sb2NrZWQgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKmRlcHRoID0gS01QX0xPQ0tfQUNRVUlSRURfRklSU1Q7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9GU1lOQ19BQ1FVSVJFRCggbGNrICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICpkZXB0aCA9ICggKl9fa21wX2FjcXVpcmVfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7ICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0KKworI2Vsc2UKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrLCBrbXBfaW50MzIgZ3RpZCwgaW50KiBkZXB0aCApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKmRlcHRoID0gKCAqX19rbXBfYWNxdWlyZV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworI2lmIEtNUF9PU19MSU5VWCAmJiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBpZiAoIF9fa21wX3VzZXJfbG9ja19raW5kID09IGxrX3RhcyApIHsKKyAgICAgICAgaW50IHJldHZhbDsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogY29uc3QgZnVuYyA9ICJvbXBfdGVzdF9uZXN0X2xvY2siOworICAgICAgICAgICAgaWYgKCAoIHNpemVvZiAoIGttcF90YXNfbG9ja190ICkgPD0gT01QX05FU1RfTE9DS19UX1NJWkUgKQorICAgICAgICAgICAgICAgICYmIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9PSAtMSApIHsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIExvY2tTaW1wbGVVc2VkQXNOZXN0YWJsZSwgZnVuYyApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgPj0gMCApOworICAgICAgICBpZiAoIGxjay0+dGFzLmxrLnBvbGwgLSAxID09IGd0aWQgKSB7ICAgLyogX19rbXBfZ2V0X3Rhc19sb2NrX293bmVyKCBsY2sgKSA9PSBndGlkICovCisgICAgICAgICAgICByZXR1cm4gKytsY2stPnRhcy5say5kZXB0aF9sb2NrZWQ7ICAvKiBzYW1lIG93bmVyLCBkZXB0aCBpbmNyZWFzZWQgKi8KKyAgICAgICAgfQorICAgICAgICByZXR2YWwgPSAoICggbGNrLT50YXMubGsucG9sbCA9PSAwICkgJiYKKyAgICAgICAgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoICYobGNrLT50YXMubGsucG9sbCksIDAsIGd0aWQgKyAxICkgKTsKKyAgICAgICAgaWYgKCByZXR2YWwgKSB7CisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgIGxjay0+dGFzLmxrLmRlcHRoX2xvY2tlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIHJldHZhbDsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAgICAgcmV0dXJuICggKl9fa21wX3Rlc3RfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSggbGNrLCBndGlkICk7CisgICAgfQorfQorI2Vsc2UKK3N0YXRpYyBpbmxpbmUgaW50CitfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90ZXN0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICByZXR1cm4gKCAqX19rbXBfdGVzdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2ssIGd0aWQgKTsKK30KKyNlbmRpZgorCitleHRlcm4gaW50ICggKl9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKTsKKworc3RhdGljIGlubGluZSBpbnQKK19fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjaywga21wX2ludDMyIGd0aWQgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3JlbGVhc2VfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrc18gIT0gTlVMTCApOworICAgIHJldHVybiAoICpfX2ttcF9yZWxlYXNlX25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjaywgZ3RpZCApOworfQorCitleHRlcm4gdm9pZCAoICpfX2ttcF9pbml0X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworc3RhdGljIGlubGluZSB2b2lkIF9fa21wX2luaXRfbmVzdGVkX3VzZXJfbG9ja193aXRoX2NoZWNrcygga21wX3VzZXJfbG9ja19wIGxjayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyAhPSBOVUxMICk7CisgICAgKCAqX19rbXBfaW5pdF9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBsY2sgKTsKK30KKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfZGVzdHJveV9uZXN0ZWRfdXNlcl9sb2NrX3dpdGhfY2hlY2tzKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICE9IE5VTEwgKTsKKyAgICAoICpfX2ttcF9kZXN0cm95X25lc3RlZF91c2VyX2xvY2tfd2l0aF9jaGVja3NfICkoIGxjayApOworfQorCisvLworLy8gdXNlciBsb2NrIGZ1bmN0aW9ucyB3aGljaCBkbyBub3QgbmVjZXNzYXJpbHkgZXhpc3QgZm9yIGFsbCBsb2NrIGtpbmRzLgorLy8KKy8vIFRoZSAic2V0IiBmdW5jdGlvbnMgdXN1YWxseSBoYXZlIHdyYXBwZXIgcm91dGluZXMgdGhhdCBjaGVjayBmb3IgYSBOVUxMIHNldAorLy8gZnVuY3Rpb24gcG9pbnRlciBhbmQgY2FsbCBpdCBpZiBub24tTlVMTC4KKy8vCisvLyBJbiBzb21lIGNhc2VzLCBpdCBtYWtlcyBzZW5zZSB0byBoYXZlIGEgImdldCIgd3JhcHBlciBmdW5jdGlvbiBjaGVjayBmb3IgYQorLy8gTlVMTCBnZXQgZnVuY3Rpb24gcG9pbnRlciBhbmQgcmV0dXJuIE5VTEwgLyBpbnZhbGlkIHZhbHVlIC8gZXJyb3IgY29kZSBpZgorLy8gdGhlIGZ1bmN0aW9uIHBvaW50ZXIgaXMgTlVMTC4KKy8vCisvLyBJbiBvdGhlciBjYXNlcywgdGhlIGNhbGxpbmcgY29kZSByZWFsbHkgc2hvdWxkIGRpZmZlcmVudGlhdGUgYmV0d2VlbiBhbgorLy8gdW5pbXBsZW1lbnRlZCBmdW5jdGlvbiBhbmQgb25lIHRoYXQgaXMgaW1wbGVtZW50ZWQgYnV0IHJldHVybmluZyBOVUxMIC8KKy8vIGludmFsaWVkIHZhbHVlLiAgSWYgdGhpcyBpcyB0aGUgY2FzZSwgbm8gZ2V0IGZ1bmN0aW9uIHdyYXBwZXIgZXhpc3RzLgorLy8KKworZXh0ZXJuIGludCAoICpfX2ttcF9pc191c2VyX2xvY2tfaW5pdGlhbGl6ZWRfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworLy8gbm8gc2V0IGZ1bmN0aW9uOyBmaWVsZHMgc2V0IGR1cmluaW5nIGxvY2FsIGFsbG9jYXRpb24KKworZXh0ZXJuIGNvbnN0IGlkZW50X3QgKiAoICpfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyApKCBrbXBfdXNlcl9sb2NrX3AgbGNrICk7CisKK3N0YXRpYyBpbmxpbmUgY29uc3QgaWRlbnRfdCAqCitfX2ttcF9nZXRfdXNlcl9sb2NrX2xvY2F0aW9uKCBrbXBfdXNlcl9sb2NrX3AgbGNrICkKK3sKKyAgICBpZiAoIF9fa21wX2dldF91c2VyX2xvY2tfbG9jYXRpb25fICAhPSBOVUxMICkgeworICAgICAgICByZXR1cm4gKCAqX19rbXBfZ2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSggbGNrICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9Cit9CisKK2V4dGVybiB2b2lkICggKl9fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb25fICkoIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3NldF91c2VyX2xvY2tfbG9jYXRpb24oIGttcF91c2VyX2xvY2tfcCBsY2ssIGNvbnN0IGlkZW50X3QgKmxvYyApCit7CisgICAgaWYgKCBfX2ttcF9zZXRfdXNlcl9sb2NrX2xvY2F0aW9uXyAgIT0gTlVMTCApIHsKKyAgICAgICAgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19sb2NhdGlvbl8gKSggbGNrLCBsb2MgKTsKKyAgICB9Cit9CisKK2V4dGVybiBrbXBfbG9ja19mbGFnc190ICggKl9fa21wX2dldF91c2VyX2xvY2tfZmxhZ3NfICkoIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKKworZXh0ZXJuIHZvaWQgKCAqX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gKSgga21wX3VzZXJfbG9ja19wIGxjaywga21wX2xvY2tfZmxhZ3NfdCBmbGFncyApOworCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3NldF91c2VyX2xvY2tfZmxhZ3MoIGttcF91c2VyX2xvY2tfcCBsY2ssIGttcF9sb2NrX2ZsYWdzX3QgZmxhZ3MgKQoreworICAgIGlmICggX19rbXBfc2V0X3VzZXJfbG9ja19mbGFnc18gICE9IE5VTEwgKSB7CisgICAgICAgICggKl9fa21wX3NldF91c2VyX2xvY2tfZmxhZ3NfICkoIGxjaywgZmxhZ3MgKTsKKyAgICB9Cit9CisKKy8vCisvLyBUaGUgZnVjdGlvbiB3aGljaCBzZXRzIHVwIGFsbCBvZiB0aGUgdnRibCBwb2ludGVycyBmb3Iga21wX3VzZXJfbG9ja190LgorLy8KK2V4dGVybiB2b2lkIF9fa21wX3NldF91c2VyX2xvY2tfdnB0cnMoIGttcF9sb2NrX2tpbmRfdCB1c2VyX2xvY2tfa2luZCApOworCisvLworLy8gTWFjcm9zIGZvciBiaW5kaW5nIHVzZXIgbG9jayBmdW5jdGlvbnMuCisvLworI2RlZmluZSBLTVBfQklORF9VU0VSX0xPQ0tfVEVNUExBVEUobmVzdCwga2luZCwgc3VmZml4KSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIF9fa21wX2FjcXVpcmUjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIGludCAoKikoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlIyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorICAgIF9fa21wX3JlbGVhc2UjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIGludCAoKikoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlIyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorICAgIF9fa21wX3Rlc3QjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gICAgPSAoIGludCAoKikoIGttcF91c2VyX2xvY2tfcCwga21wX2ludDMyICkgKSAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgICAgXAorICAgIF9fa21wX2luaXQjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gICAgPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AgKSApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgICAgXAorICAgIF9fa21wX2Rlc3Ryb3kjI25lc3QjI3VzZXJfbG9ja193aXRoX2NoZWNrc18gPSAoIHZvaWQgKCopKCBrbXBfdXNlcl9sb2NrX3AgKSApICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9kZXN0cm95IyNuZXN0IyNraW5kIyNfIyNzdWZmaXg7ICAgICAgICAgXAorfQorCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DSyhraW5kKSAgICAgICAgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF8sIGtpbmQsIGxvY2spCisjZGVmaW5lIEtNUF9CSU5EX1VTRVJfTE9DS19XSVRIX0NIRUNLUyhraW5kKSAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF8sIGtpbmQsIGxvY2tfd2l0aF9jaGVja3MpCisjZGVmaW5lIEtNUF9CSU5EX05FU1RFRF9VU0VSX0xPQ0soa2luZCkgICAgICAgICAgICAgS01QX0JJTkRfVVNFUl9MT0NLX1RFTVBMQVRFKF9uZXN0ZWRfLCBraW5kLCBsb2NrKQorI2RlZmluZSBLTVBfQklORF9ORVNURURfVVNFUl9MT0NLX1dJVEhfQ0hFQ0tTKGtpbmQpIEtNUF9CSU5EX1VTRVJfTE9DS19URU1QTEFURShfbmVzdGVkXywga2luZCwgbG9ja193aXRoX2NoZWNrcykKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVXNlciBsb2NrIHRhYmxlICYgbG9jayBhbGxvY2F0aW9uCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8qCisgICAgT24gNjQtYml0IExpbnV4KiBPUyAoYW5kIE9TIFgqKSBHTlUgY29tcGlsZXIgYWxsb2NhdGVzIG9ubHkgNCBieXRlbXMgbWVtb3J5IGZvciBsb2NrIHZhcmlhYmxlLCB3aGljaAorICAgIGlzIG5vdCBlbm91Z2ggdG8gc3RvcmUgYSBwb2ludGVyLCBzbyB3ZSBoYXZlIHRvIHVzZSBsb2NrIGluZGV4ZXMgaW5zdGVhZCBvZiBwb2ludGVycyBhbmQKKyAgICBtYWludGFpbiBsb2NrIHRhYmxlIHRvIG1hcCBpbmRleGVzIHRvIHBvaW50ZXJzLgorCisKKyAgICBOb3RlOiBUaGUgZmlyc3QgZWxlbWVudCBvZiB0aGUgdGFibGUgaXMgbm90IGEgcG9pbnRlciB0byBsb2NrISBJdCBpcyBhIHBvaW50ZXIgdG8gcHJldmlvdXNseQorICAgIGFsbG9jYXRlZCB0YWJsZSAob3IgTlVMTCBpZiBpdCBpcyB0aGUgZmlyc3QgdGFibGUpLgorCisgICAgVXNhZ2U6CisKKyAgICAgICAgaWYgKCBPTVBfTE9DS19UX1NJWkUgPCBzaXplb2YoIDxsb2NrPiApICkgeyAvLyBvciBPTVBfTkVTVF9MT0NLX1RfU0laRQorICAgICAgICAgICAgTG9jayB0YWJsZSBpcyBmdWxseSB1dGlsaXplZC4gVXNlciBsb2NrcyBhcmUgaW5kZXhlcywgc28gdGFibGUgaXMKKyAgICAgICAgICAgIHVzZWQgb24gdXNlciBsb2NrIG9wZXJhdGlvbi4KKyAgICAgICAgICAgIE5vdGU6IGl0IG1heSBiZSB0aGUgY2FzZSAobGluXzMyKSB0aGF0IHdlIGRvbid0IG5lZWQgdG8gdXNlIGEgbG9jaworICAgICAgICAgICAgdGFibGUgZm9yIHJlZ3VsYXIgbG9ja3MsIGJ1dCBkbyBuZWVkIHRoZSB0YWJsZSBmb3IgbmVzdGVkIGxvY2tzLgorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgTG9jayB0YWJsZSBpbml0aWFsaXplZCBidXQgbm90IGFjdHVhbGx5IHVzZWQuCisgICAgICAgIH0KKyovCisKK3N0cnVjdCBrbXBfbG9ja190YWJsZSB7CisgICAga21wX2xvY2tfaW5kZXhfdCAgdXNlZDsgICAgICAvLyBOdW1iZXIgb2YgdXNlZCBlbGVtZW50cworICAgIGttcF9sb2NrX2luZGV4X3QgIGFsbG9jYXRlZDsgLy8gTnVtYmVyIG9mIGFsbG9jYXRlZCBlbGVtZW50cworICAgIGttcF91c2VyX2xvY2tfcCAqIHRhYmxlOyAgICAgLy8gTG9jayB0YWJsZS4KK307CisKK3R5cGVkZWYgc3RydWN0IGttcF9sb2NrX3RhYmxlIGttcF9sb2NrX3RhYmxlX3Q7CisKK2V4dGVybiBrbXBfbG9ja190YWJsZV90IF9fa21wX3VzZXJfbG9ja190YWJsZTsKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfbG9ja19wb29sOworCitzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzIHsKKyAgICBzdHJ1Y3Qga21wX2Jsb2NrX29mX2xvY2tzICogbmV4dF9ibG9jazsKKyAgICB2b2lkICogICAgICAgICAgICAgICAgICAgICAgbG9ja3M7Cit9OworCit0eXBlZGVmIHN0cnVjdCBrbXBfYmxvY2tfb2ZfbG9ja3Mga21wX2Jsb2NrX29mX2xvY2tzX3Q7CisKK2V4dGVybiBrbXBfYmxvY2tfb2ZfbG9ja3NfdCAqX19rbXBfbG9ja19ibG9ja3M7CitleHRlcm4gaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKworZXh0ZXJuIGttcF91c2VyX2xvY2tfcCBfX2ttcF91c2VyX2xvY2tfYWxsb2NhdGUoIHZvaWQgKip1c2VyX2xvY2ssIGttcF9pbnQzMiBndGlkLCBrbXBfbG9ja19mbGFnc190IGZsYWdzICk7CitleHRlcm4gdm9pZCBfX2ttcF91c2VyX2xvY2tfZnJlZSggdm9pZCAqKnVzZXJfbG9jaywga21wX2ludDMyIGd0aWQsIGttcF91c2VyX2xvY2tfcCBsY2sgKTsKK2V4dGVybiBrbXBfdXNlcl9sb2NrX3AgX19rbXBfbG9va3VwX3VzZXJfbG9jayggdm9pZCAqKnVzZXJfbG9jaywgY2hhciBjb25zdCAqZnVuYyApOworZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF91c2VyX2xvY2tzKCk7CisKKyNkZWZpbmUgS01QX0NIRUNLX1VTRVJfTE9DS19JTklUKCkgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCAhIFRDUl80KCBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSApIHsgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7ICAgICAgXAorICAgICAgICAgICAgICAgIGlmICggISBUQ1JfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzICkgKSB7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF91c2VyX2xvY2tzLCBUUlVFICk7ICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7ICAgICAgXAorICAgICAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyNlbmRpZiAvLyBLTVBfVVNFX0RZTkFNSUNfTE9DSworCisjdW5kZWYgS01QX1BBRAorI3VuZGVmIEtNUF9HVElEX0RORQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworLy8KKy8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLIGVuYWJsZXMgZHluYW1pYyBkaXNwYXRjaCBvZiBsb2NrIGZ1bmN0aW9ucyB3aXRob3V0IGJyZWFraW5nIHRoZSBjdXJyZW50CisvLyBjb21wYXRpYmlsaXR5LiBFc3NlbnRpYWwgZnVuY3Rpb25hbGl0eSBvZiB0aGlzIG5ldyBjb2RlIGlzIGR5bmFtaWMgZGlzcGF0Y2gsIGJ1dCBpdCBhbHNvCisvLyBpbXBsZW1lbnRzIChvciBlbmFibGVzIGltcGxlbWVudGF0aW9uIG9mKSBoaW50ZWQgdXNlciBsb2NrIGFuZCBjcml0aWNhbCBzZWN0aW9uIHdoaWNoIHdpbGwgYmUKKy8vIHBhcnQgb2YgT01QIDQuNSBzb29uLgorLy8KKy8vIExvY2sgdHlwZSBjYW4gYmUgZGVjaWRlZCBhdCBjcmVhdGlvbiB0aW1lIChpLmUuLCBsb2NrIGluaXRpYWxpemF0aW9uKSwgYW5kIHN1YnNlcXVlbnQgbG9jaworLy8gZnVuY3Rpb24gY2FsbCBvbiB0aGUgY3JlYXRlZCBsb2NrIG9iamVjdCByZXF1aXJlcyB0eXBlIGV4dHJhY3Rpb24gYW5kIGNhbGwgdGhyb3VnaCBqdW1wIHRhYmxlCisvLyB1c2luZyB0aGUgZXh0cmFjdGVkIHR5cGUuIFRoaXMgdHlwZSBpbmZvcm1hdGlvbiBpcyBzdG9yZWQgaW4gdHdvIGRpZmZlcmVudCB3YXlzIGRlcGVuZGluZyBvbgorLy8gdGhlIHNpemUgb2YgdGhlIGxvY2sgb2JqZWN0LCBhbmQgd2UgZGlmZmVyZW50aWF0ZSBsb2NrIHR5cGVzIGJ5IHRoaXMgc2l6ZSByZXF1aXJlbWVudCAtIGRpcmVjdAorLy8gYW5kIGluZGlyZWN0IGxvY2tzLgorLy8KKy8vIERpcmVjdCBsb2NrczoKKy8vIEEgZGlyZWN0IGxvY2sgb2JqZWN0IGZpdHMgaW50byB0aGUgc3BhY2UgY3JlYXRlZCBieSB0aGUgY29tcGlsZXIgZm9yIGFuIG9tcF9sb2NrX3Qgb2JqZWN0LCBhbmQKKy8vIFRBUy9GdXRleCBsb2NrIGZhbGxzIGludG8gdGhpcyBjYXRlZ29yeS4gV2UgdXNlIGxvdyBvbmUgYnl0ZSBvZiB0aGUgbG9jayBvYmplY3QgYXMgdGhlIHN0b3JhZ2UKKy8vIGZvciB0aGUgbG9jayB0eXBlLCBhbmQgYXBwcm9wcmlhdGUgYml0IG9wZXJhdGlvbiBpcyByZXF1aXJlZCB0byBhY2Nlc3MgdGhlIGRhdGEgbWVhbmluZ2Z1bCB0bworLy8gdGhlIGxvY2sgYWxnb3JpdGhtcy4gQWxzbywgdG8gZGlmZmVyZW50aWF0ZSBkaXJlY3QgbG9jayBmcm9tIGluZGlyZWN0IGxvY2ssIDEgaXMgd3JpdHRlbiB0byBMU0IKKy8vIG9mIHRoZSBsb2NrIG9iamVjdC4gVGhlIG5ld2x5IGludHJvZHVjZWQgImhsZSIgbG9jayBpcyBhbHNvIGEgZGlyZWN0IGxvY2suCisvLworLy8gSW5kaXJlY3QgbG9ja3M6CisvLyBBbiBpbmRpcmVjdCBsb2NrIG9iamVjdCByZXF1aXJlcyBtb3JlIHNwYWNlIHRoYW4gdGhlIGNvbXBpbGVyLWdlbmVyYXRlZCBzcGFjZSwgYW5kIGl0IHNob3VsZCBiZQorLy8gYWxsb2NhdGVkIGZyb20gaGVhcC4gRGVwZW5kaW5nIG9uIHRoZSBzaXplIG9mIHRoZSBjb21waWxlci1nZW5lcmF0ZWQgc3BhY2UgZm9yIHRoZSBsb2NrIChpLmUuLAorLy8gc2l6ZSBvZiBvbXBfbG9ja190KSwgdGhpcyBvbXBfbG9ja190IG9iamVjdCBzdG9yZXMgZWl0aGVyIHRoZSBhZGRyZXNzIG9mIHRoZSBoZWFwLWFsbG9jYXRlZAorLy8gaW5kaXJlY3QgbG9jayAodm9pZCAqIGZpdHMgaW4gdGhlIG9iamVjdCkgb3IgYW4gaW5kZXggdG8gdGhlIGluZGlyZWN0IGxvY2sgdGFibGUgZW50cnkgdGhhdAorLy8gaG9sZHMgdGhlIGFkZHJlc3MuIFRpY2tldC9RdWV1aW5nL0RSRFBBL0FkYXB0aXZlIGxvY2sgZmFsbHMgaW50byB0aGlzIGNhdGVnb3J5LCBhbmQgdGhlIG5ld2x5CisvLyBpbnRyb2R1Y2VkICJydG0iIGxvY2sgaXMgYWxzbyBhbiBpbmRpcmVjdCBsb2NrIHdoaWNoIHdhcyBpbXBsZW1lbnRlZCBvbiB0b3Agb2YgdGhlIFF1ZXVpbmcgbG9jay4KKy8vIFdoZW4gdGhlIG9tcF9sb2NrX3Qgb2JqZWN0IGhvbGRzIGFuIGluZGV4IChub3QgbG9jayBhZGRyZXNzKSwgMCBpcyB3cml0dGVuIHRvIExTQiB0bworLy8gZGlmZmVyZW50aWF0ZSB0aGUgbG9jayBmcm9tIGEgZGlyZWN0IGxvY2ssIGFuZCB0aGUgcmVtYWluaW5nIHBhcnQgaXMgdGhlIGFjdHVhbCBpbmRleCB0byB0aGUKKy8vIGluZGlyZWN0IGxvY2sgdGFibGUuCisvLworCisjaW5jbHVkZSA8c3RkaW50Lmg+IC8vIGZvciB1aW50cHRyX3QKKworLy8gU2hvcnRjdXRzCisjZGVmaW5lIEtNUF9VU0VfSU5MSU5FRF9UQVMgICAoS01QX09TX0xJTlVYICYmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSkpICYmIDEKKyNkZWZpbmUgS01QX1VTRV9JTkxJTkVEX0ZVVEVYIEtNUF9VU0VfRlVURVggJiYgMAorCisvLyBMaXN0IG9mIGxvY2sgZGVmaW5pdGlvbnM7IGFsbCBuZXN0ZWQgbG9ja3MgYXJlIGluZGlyZWN0IGxvY2tzLgorLy8gaGxlIGxvY2sgaXMgeGNoZyBsb2NrIHByZWZpeGVkIHdpdGggWEFDUVVJUkUvWFJFTEVBU0UuCisvLyBBbGwgbmVzdGVkIGxvY2tzIGFyZSBpbmRpcmVjdCBsb2NrIHR5cGVzLgorI2lmIEtNUF9VU0VfVFNYCisjIGlmIEtNUF9VU0VfRlVURVgKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSBtKGZ1dGV4LCBhKSBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpIG0obmVzdGVkX2Z1dGV4LCBhKSBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKSAgICAgICAgICAgICBtKGhsZSwgYSkKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9JX0xPQ0sobSwgYSkgIG0odGlja2V0LCBhKSBtKHF1ZXVpbmcsIGEpIG0oYWRhcHRpdmUsIGEpIG0oZHJkcGEsIGEpIG0ocnRtLCBhKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90YXMsIGEpICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF90aWNrZXQsIGEpICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfcXVldWluZywgYSkgbShuZXN0ZWRfZHJkcGEsIGEpCisjIGVuZGlmIC8vIEtNUF9VU0VfRlVURVgKKyMgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2hsZQorI2Vsc2UKKyMgaWYgS01QX1VTRV9GVVRFWAorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0RfTE9DSyhtLCBhKSAgbSh0YXMsIGEpIG0oZnV0ZXgsIGEpCisjICBkZWZpbmUgS01QX0ZPUkVBQ0hfSV9MT0NLKG0sIGEpICBtKHRpY2tldCwgYSkgbShxdWV1aW5nLCBhKSAgICAgICAgICAgICAgICBtKGRyZHBhLCBhKSAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbShuZXN0ZWRfdGFzLCBhKSBtKG5lc3RlZF9mdXRleCwgYSkgbShuZXN0ZWRfdGlja2V0LCBhKSAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3F1ZXVpbmcsIGEpIG0obmVzdGVkX2RyZHBhLCBhKQorIyAgZGVmaW5lIEtNUF9MQVNUX0RfTE9DSyBsb2Nrc2VxX2Z1dGV4CisjIGVsc2UKKyMgIGRlZmluZSBLTVBfRk9SRUFDSF9EX0xPQ0sobSwgYSkgIG0odGFzLCBhKQorIyAgZGVmaW5lIEtNUF9GT1JFQUNIX0lfTE9DSyhtLCBhKSAgbSh0aWNrZXQsIGEpIG0ocXVldWluZywgYSkgICAgICAgICAgICAgICAgbShkcmRwYSwgYSkgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RhcywgYSkgICAgICAgICAgICAgICAgICAgIG0obmVzdGVkX3RpY2tldCwgYSkgICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtKG5lc3RlZF9xdWV1aW5nLCBhKSBtKG5lc3RlZF9kcmRwYSwgYSkKKyMgIGRlZmluZSBLTVBfTEFTVF9EX0xPQ0sgbG9ja3NlcV90YXMKKyMgZW5kaWYgLy8gS01QX1VTRV9GVVRFWAorI2VuZGlmIC8vIEtNUF9VU0VfVFNYCisKKy8vIEluZm9ybWF0aW9uIHVzZWQgaW4gZHluYW1pYyBkaXNwYXRjaAorI2RlZmluZSBLTVBfTE9DS19TSElGVCAgIDggLy8gbnVtYmVyIG9mIGxvdyBiaXRzIHRvIGJlIHVzZWQgYXMgdGFnIGZvciBkaXJlY3QgbG9ja3MKKyNkZWZpbmUgS01QX0ZJUlNUX0RfTE9DSyBsb2Nrc2VxX3RhcworI2RlZmluZSBLTVBfRklSU1RfSV9MT0NLIGxvY2tzZXFfdGlja2V0CisjZGVmaW5lIEtNUF9MQVNUX0lfTE9DSyAgbG9ja3NlcV9uZXN0ZWRfZHJkcGEKKyNkZWZpbmUgS01QX05VTV9JX0xPQ0tTICAobG9ja3RhZ19uZXN0ZWRfZHJkcGErMSkgLy8gbnVtYmVyIG9mIGluZGlyZWN0IGxvY2sgdHlwZXMKKworLy8gQmFzZSB0eXBlIGZvciBkeW5hbWljIGxvY2tzLgordHlwZWRlZiBrbXBfdWludDMyIGttcF9keW5hX2xvY2tfdDsKKworLy8gTG9jayBzZXF1ZW5jZSB0aGF0IGVudW1lcmF0ZXMgYWxsIGxvY2sga2luZHMuCisvLyBBbHdheXMgbWFrZSB0aGlzIGVudW1lcmF0aW9uIGNvbnNpc3RlbnQgd2l0aCBrbXBfbG9ja3NlcV90IGluIHRoZSBpbmNsdWRlIGRpcmVjdG9yeS4KK3R5cGVkZWYgZW51bSB7CisgICAgbG9ja3NlcV9pbmRpcmVjdCA9IDAsCisjZGVmaW5lIGV4cGFuZF9zZXEobCxhKSBsb2Nrc2VxXyMjbCwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyAgICBLTVBfRk9SRUFDSF9JX0xPQ0soZXhwYW5kX3NlcSwgMCkKKyN1bmRlZiBleHBhbmRfc2VxCit9IGttcF9keW5hX2xvY2tzZXFfdDsKKworLy8gRW51bWVyYXRlcyBpbmRpcmVjdCBsb2NrIHRhZ3MuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wsCisgICAgS01QX0ZPUkVBQ0hfSV9MT0NLKGV4cGFuZF90YWcsIDApCisjdW5kZWYgZXhwYW5kX3RhZworfSBrbXBfaW5kaXJlY3RfbG9ja3RhZ190OworCisvLyBVdGlsaXR5IG1hY3JvcyB0aGF0IGV4dHJhY3QgaW5mb3JtYXRpb24gZnJvbSBsb2NrIHNlcXVlbmNlcy4KKyNkZWZpbmUgS01QX0lTX0RfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfRF9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0RfTE9DSykKKyNkZWZpbmUgS01QX0lTX0lfTE9DSyhzZXEpICgoc2VxKSA+PSBLTVBfRklSU1RfSV9MT0NLICYmIChzZXEpIDw9IEtNUF9MQVNUX0lfTE9DSykKKyNkZWZpbmUgS01QX0dFVF9JX1RBRyhzZXEpIChrbXBfaW5kaXJlY3RfbG9ja3RhZ190KSgoc2VxKSAtIEtNUF9GSVJTVF9JX0xPQ0spCisjZGVmaW5lIEtNUF9HRVRfRF9UQUcoc2VxKSAoKHNlcSk8PDEgfCAxKQorCisvLyBFbnVtZXJhdGVzIGRpcmVjdCBsb2NrIHRhZ3Mgc3RhcnRpbmcgZnJvbSBpbmRpcmVjdCB0YWcuCit0eXBlZGVmIGVudW0geworI2RlZmluZSBleHBhbmRfdGFnKGwsYSkgbG9ja3RhZ18jI2wgPSBLTVBfR0VUX0RfVEFHKGxvY2tzZXFfIyNsKSwKKyAgICBLTVBfRk9SRUFDSF9EX0xPQ0soZXhwYW5kX3RhZywgMCkKKyN1bmRlZiBleHBhbmRfdGFnCit9IGttcF9kaXJlY3RfbG9ja3RhZ190OworCisvLyBJbmRpcmVjdCBsb2NrIHR5cGUKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdXNlcl9sb2NrX3AgbG9jazsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja3RhZ190IHR5cGU7Cit9IGttcF9pbmRpcmVjdF9sb2NrX3Q7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgZGlyZWN0IGxvY2tzLiBTZXQvdW5zZXQvdGVzdCBkaWZmZXJlbnRpYXRlIGZ1bmN0aW9ucyB3aXRoL3dpdGhvdXQgY29uc2lzdGVuY3kgY2hlY2tpbmcuCitleHRlcm4gdm9pZCAoKl9fa21wX2RpcmVjdF9pbml0W10pKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfZHluYV9sb2Nrc2VxX3QpOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9kaXJlY3RfZGVzdHJveVtdKShrbXBfZHluYV9sb2NrX3QgKik7CitleHRlcm4gdm9pZCAoKigqX19rbXBfZGlyZWN0X3NldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF91bnNldCkpKGttcF9keW5hX2xvY2tfdCAqLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2RpcmVjdF90ZXN0KSkoa21wX2R5bmFfbG9ja190ICosIGttcF9pbnQzMik7CisKKy8vIEZ1bmN0aW9uIHRhYmxlcyBmb3IgaW5kaXJlY3QgbG9ja3MuIFNldC91bnNldC90ZXN0IGRpZmZlcmVudGlhdGUgZnVuY3Rpb25zIHdpdGgvd2l0aHVvdCBjb25zaXN0ZW5jeSBjaGVja2luZy4KK2V4dGVybiB2b2lkICgqX19rbXBfaW5kaXJlY3RfaW5pdFtdKShrbXBfdXNlcl9sb2NrX3ApOworZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9kZXN0cm95W10pKGttcF91c2VyX2xvY2tfcCk7CitleHRlcm4gdm9pZCAoKigqX19rbXBfaW5kaXJlY3Rfc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Vuc2V0KSkoa21wX3VzZXJfbG9ja19wLCBrbXBfaW50MzIpOworZXh0ZXJuIGludCAgKCooKl9fa21wX2luZGlyZWN0X3Rlc3QpKShrbXBfdXNlcl9sb2NrX3AsIGttcF9pbnQzMik7CisKKy8vIEV4dHJhY3RzIGRpcmVjdCBsb2NrIHRhZyBmcm9tIGEgdXNlciBsb2NrIHBvaW50ZXIKKyNkZWZpbmUgS01QX0VYVFJBQ1RfRF9UQUcobCkgICAoKigoa21wX2R5bmFfbG9ja190ICopKGwpKSAmICgoMTw8S01QX0xPQ0tfU0hJRlQpLTEpICYgLSgqKChrbXBfZHluYV9sb2NrX3QgKikobCkpICYgMSkpCisKKy8vIEV4dHJhY3RzIGluZGlyZWN0IGxvY2sgaW5kZXggZnJvbSBhIHVzZXIgbG9jayBwb2ludGVyCisjZGVmaW5lIEtNUF9FWFRSQUNUX0lfSU5ERVgobCkgKCooa21wX2xvY2tfaW5kZXhfdCAqKShsKSA+PiAxKQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGRpcmVjdCBsb2NrIGZ1bmN0aW9uIHdpdGggbCAoa21wX2R5bmFfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfRF9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2RpcmVjdF8jI29wW0tNUF9FWFRSQUNUX0RfVEFHKGwpXQorCisvLyBSZXR1cm5zIGZ1bmN0aW9uIHBvaW50ZXIgdG8gdGhlIGluZGlyZWN0IGxvY2sgZnVuY3Rpb24gd2l0aCBsIChrbXBfaW5kaXJlY3RfbG9ja190ICopIGFuZCBvcCAob3BlcmF0aW9uIHR5cGUpLgorI2RlZmluZSBLTVBfSV9MT0NLX0ZVTkMobCwgb3ApIF9fa21wX2luZGlyZWN0XyMjb3BbKChrbXBfaW5kaXJlY3RfbG9ja190ICopKGwpKS0+dHlwZV0KKworLy8gSW5pdGlhbGl6ZXMgYSBkaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0RfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0W0tNUF9HRVRfRF9UQUcoc2VxKV0oKGttcF9keW5hX2xvY2tfdCAqKWwsIHNlcSkKKworLy8gSW5pdGlhbGl6ZXMgYW4gaW5kaXJlY3QgbG9jayB3aXRoIHRoZSBnaXZlbiBsb2NrIHBvaW50ZXIgYW5kIGxvY2sgc2VxdWVuY2UuCisjZGVmaW5lIEtNUF9JTklUX0lfTE9DSyhsLCBzZXEpIF9fa21wX2RpcmVjdF9pbml0WzBdKChrbXBfZHluYV9sb2NrX3QgKikobCksIHNlcSkKKworLy8gUmV0dXJucyAiZnJlZSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdHlwZS4KKyNkZWZpbmUgS01QX0xPQ0tfRlJFRSh0eXBlKSAgICAgIChsb2NrdGFnXyMjdHlwZSkKKworLy8gUmV0dXJucyAiYnVzeSIgbG9jayB2YWx1ZSBmb3IgdGhlIGdpdmVuIGxvY2sgdGV5cC4KKyNkZWZpbmUgS01QX0xPQ0tfQlVTWSh2LCB0eXBlKSAgICgodik8PEtNUF9MT0NLX1NISUZUIHwgbG9ja3RhZ18jI3R5cGUpCisKKy8vIFJldHVybnMgbG9jayB2YWx1ZSBhZnRlciByZW1vdmluZyAoc2hpZnRpbmcpIGxvY2sgdGFnLgorI2RlZmluZSBLTVBfTE9DS19TVFJJUCh2KSAgICAgICAgKCh2KT4+S01QX0xPQ0tfU0hJRlQpCisKKy8vIEluaXRpYWxpemVzIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfaW5pdF9keW5hbWljX3VzZXJfbG9ja3MoKTsKKworLy8gQWxsb2NhdGVzIGFuZCByZXR1cm5zIGFuIGluZGlyZWN0IGxvY2sgd2l0aCB0aGUgZ2l2ZW4gaW5kaXJlY3QgbG9jayB0YWcuCitleHRlcm4ga21wX2luZGlyZWN0X2xvY2tfdCAqIF9fa21wX2FsbG9jYXRlX2luZGlyZWN0X2xvY2sodm9pZCAqKiwga21wX2ludDMyLCBrbXBfaW5kaXJlY3RfbG9ja3RhZ190KTsKKworLy8gQ2xlYW5zIHVwIGdsb2JhbCBzdGF0ZXMgYW5kIGRhdGEgc3RydWN0dXJlcyBmb3IgbWFuYWdpbmcgZHluYW1pYyB1c2VyIGxvY2tzLgorZXh0ZXJuIHZvaWQgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCk7CisKKy8vIERlZmF1bHQgdXNlciBsb2NrIHNlcXVlbmNlIHdoZW4gbm90IHVzaW5nIGhpbnRlZCBsb2Nrcy4KK2V4dGVybiBrbXBfZHluYV9sb2Nrc2VxX3QgX19rbXBfdXNlcl9sb2NrX3NlcTsKKworLy8gSnVtcCB0YWJsZSBmb3IgInNldCBsb2NrIGxvY2F0aW9uIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIHZvaWQgKCpfX2ttcF9pbmRpcmVjdF9zZXRfbG9jYXRpb25bS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wLCBjb25zdCBpZGVudF90ICopOworI2RlZmluZSBLTVBfU0VUX0lfTE9DS19MT0NBVElPTihsY2ssIGxvYykgeyAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaWYgKF9fa21wX2luZGlyZWN0X3NldF9sb2NhdGlvblsobGNrKS0+dHlwZV0gIT0gTlVMTCkgICAgICAgICAgIFwKKyAgICAgICAgX19rbXBfaW5kaXJlY3Rfc2V0X2xvY2F0aW9uWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaywgbG9jKTsgXAorfQorCisvLyBKdW1wIHRhYmxlIGZvciAic2V0IGxvY2sgZmxhZ3MiLCBhdmFpbGFibGUgb25seSBmb3IgaW5kaXJlY3QgbG9ja3MuCitleHRlcm4gdm9pZCAoKl9fa21wX2luZGlyZWN0X3NldF9mbGFnc1tLTVBfTlVNX0lfTE9DS1NdKShrbXBfdXNlcl9sb2NrX3AsIGttcF9sb2NrX2ZsYWdzX3QpOworI2RlZmluZSBLTVBfU0VUX0lfTE9DS19GTEFHUyhsY2ssIGZsYWcpIHsgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbKGxjayktPnR5cGVdICE9IE5VTEwpICAgICAgICAgICAgXAorICAgICAgICBfX2ttcF9pbmRpcmVjdF9zZXRfZmxhZ3NbKGxjayktPnR5cGVdKChsY2spLT5sb2NrLCBmbGFnKTsgXAorfQorCisvLyBKdW1wIHRhYmxlIGZvciAiZ2V0IGxvY2sgbG9jYXRpb24iLCBhdmFpbGFibGUgb25seSBmb3IgaW5kaXJlY3QgbG9ja3MuCitleHRlcm4gY29uc3QgaWRlbnRfdCAqICgqX19rbXBfaW5kaXJlY3RfZ2V0X2xvY2F0aW9uW0tNUF9OVU1fSV9MT0NLU10pKGttcF91c2VyX2xvY2tfcCk7CisjZGVmaW5lIEtNUF9HRVRfSV9MT0NLX0xPQ0FUSU9OKGxjaykgKCBfX2ttcF9pbmRpcmVjdF9nZXRfbG9jYXRpb25bKGxjayktPnR5cGVdICE9IE5VTEwgICAgICAgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA/IF9fa21wX2luZGlyZWN0X2dldF9sb2NhdGlvblsobGNrKS0+dHlwZV0oKGxjayktPmxvY2spIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiBOVUxMICkKKworLy8gSnVtcCB0YWJsZSBmb3IgImdldCBsb2NrIGZsYWdzIiwgYXZhaWxhYmxlIG9ubHkgZm9yIGluZGlyZWN0IGxvY2tzLgorZXh0ZXJuIGttcF9sb2NrX2ZsYWdzX3QgKCpfX2ttcF9pbmRpcmVjdF9nZXRfZmxhZ3NbS01QX05VTV9JX0xPQ0tTXSkoa21wX3VzZXJfbG9ja19wKTsKKyNkZWZpbmUgS01QX0dFVF9JX0xPQ0tfRkxBR1MobGNrKSAoIF9fa21wX2luZGlyZWN0X2dldF9mbGFnc1sobGNrKS0+dHlwZV0gIT0gTlVMTCAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgID8gX19rbXBfaW5kaXJlY3RfZ2V0X2ZsYWdzWyhsY2spLT50eXBlXSgobGNrKS0+bG9jaykgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA6IE5VTEwgKQorCisjZGVmaW5lIEtNUF9JX0xPQ0tfQ0hVTksgMTAyNCAgICAgICAvLyBudW1iZXIgb2Yga21wX2luZGlyZWN0X2xvY2tfdCBvYmplY3RzIHRvIGJlIGFsbG9jYXRlZCB0b2dldGhlcgorCisvLyBMb2NrIHRhYmxlIGZvciBpbmRpcmVjdCBsb2Nrcy4KK3R5cGVkZWYgc3RydWN0IGttcF9pbmRpcmVjdF9sb2NrX3RhYmxlIHsKKyAgICBrbXBfaW5kaXJlY3RfbG9ja190ICoqdGFibGU7ICAgIC8vIGJsb2NrcyBvZiBpbmRpcmVjdCBsb2NrcyBhbGxvY2F0ZWQKKyAgICBrbXBfbG9ja19pbmRleF90IHNpemU7ICAgICAgICAgIC8vIHNpemUgb2YgdGhlIGluZGlyZWN0IGxvY2sgdGFibGUKKyAgICBrbXBfbG9ja19pbmRleF90IG5leHQ7ICAgICAgICAgIC8vIGluZGV4IHRvIHRoZSBuZXh0IGxvY2sgdG8gYmUgYWxsb2NhdGVkCit9IGttcF9pbmRpcmVjdF9sb2NrX3RhYmxlX3Q7CisKK2V4dGVybiBrbXBfaW5kaXJlY3RfbG9ja190YWJsZV90IF9fa21wX2lfbG9ja190YWJsZTsKKworLy8gUmV0dXJucyB0aGUgaW5kaXJlY3QgbG9jayBhc3NvY2lhdGVkIHdpdGggdGhlIGdpdmVuIGluZGV4LgorI2RlZmluZSBLTVBfR0VUX0lfTE9DSyhpbmRleCkgKCooX19rbXBfaV9sb2NrX3RhYmxlLnRhYmxlICsgKGluZGV4KS9LTVBfSV9MT0NLX0NIVU5LKSArIChpbmRleCklS01QX0lfTE9DS19DSFVOSykKKworLy8gTnVtYmVyIG9mIGxvY2tzIGluIGEgbG9jayBibG9jaywgd2hpY2ggaXMgZml4ZWQgdG8gIjEiIG5vdy4KKy8vIFRPRE86IE5vIGxvY2sgYmxvY2sgaW1wbGVtZW50YXRpb24gbm93LiBJZiB3ZSBkbyBzdXBwb3J0LCB3ZSBuZWVkIHRvIG1hbmFnZSBsb2NrIGJsb2NrIGRhdGEKKy8vIHN0cnVjdHVyZSBmb3IgZWFjaCBpbmRpcmVjdCBsb2NrIHR5cGUuCitleHRlcm4gaW50IF9fa21wX251bV9sb2Nrc19pbl9ibG9jazsKKworLy8gRmFzdCBsb2NrIHRhYmxlIGxvb2t1cCB3aXRob3V0IGNvbnNpc3RlbmN5IGNoZWNraW5nCisjZGVmaW5lIEtNUF9MT09LVVBfSV9MT0NLKGwpICggKE9NUF9MT0NLX1RfU0laRSA8IHNpemVvZih2b2lkICopKSAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgPyBLTVBfR0VUX0lfTE9DSyhLTVBfRVhUUkFDVF9JX0lOREVYKGwpKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOiAqKChrbXBfaW5kaXJlY3RfbG9ja190ICoqKShsKSkgKQorCisvLyBVc2VkIG9uY2UgaW4ga21wX2Vycm9yLmMKK2V4dGVybiBrbXBfaW50MzIKK19fa21wX2dldF91c2VyX2xvY2tfb3duZXIoa21wX3VzZXJfbG9ja19wLCBrbXBfdWludDMyKTsKKworI2Vsc2UgLy8gS01QX1VTRV9EWU5BTUlDX0xPQ0sKKworIyBkZWZpbmUgS01QX0xPQ0tfQlVTWSh2LCB0eXBlKSAgICAodikKKyMgZGVmaW5lIEtNUF9MT0NLX0ZSRUUodHlwZSkgICAgICAgMAorIyBkZWZpbmUgS01QX0xPQ0tfU1RSSVAodikgICAgICAgICAodikKKworI2VuZGlmIC8vIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisKKy8vIGRhdGEgc3RydWN0dXJlIGZvciB1c2luZyBiYWNrb2ZmIHdpdGhpbiBzcGluIGxvY2tzLgordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF91aW50MzIgc3RlcDsgICAgICAgIC8vIGN1cnJlbnQgc3RlcAorICAgIGttcF91aW50MzIgbWF4X2JhY2tvZmY7IC8vIHVwcGVyIGJvdW5kIG9mIG91dGVyIGRlbGF5IGxvb3AKKyAgICBrbXBfdWludDMyIG1pbl90aWNrOyAgICAvLyBzaXplIG9mIGlubmVyIGRlbGF5IGxvb3AgaW4gdGlja3MgKG1hY2hpbmUtZGVwZW5kZW50KQorfSBrbXBfYmFja29mZl90OworCisvLyBSdW50aW1lJ3MgZGVmYXVsdCBiYWNrb2ZmIHBhcmFtZXRlcnMKK2V4dGVybiBrbXBfYmFja29mZl90IF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXM7CisKKy8vIEJhY2tvZmYgZnVuY3Rpb24KK2V4dGVybiB2b2lkIF9fa21wX3NwaW5fYmFja29mZihrbXBfYmFja29mZl90ICopOworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfTE9DS19IICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfb21wLmggYi9yYzMvcnVudGltZS9zcmMva21wX29tcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZhNzYwMjMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX29tcC5oCkBAIC0wLDAgKzEsMjM0IEBACisjaWYgVVNFX0RFQlVHR0VSCisvKgorICoga21wX29tcC5oIC0tIE9wZW5NUCBkZWZpbml0aW9uIGZvciBrbXBfb21wX3N0cnVjdF9pbmZvX3QuCisgKiAgICAgICAgICAgICAgVGhpcyBpcyBmb3IgaW5mb3JtYXRpb24gYWJvdXQgcnVudGltZSBsaWJyYXJ5IHN0cnVjdHVyZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKy8qIFRISVMgRklMRSBTSE9VTEQgTk9UIEJFIE1PRElGSUVEIElOIElEQiBJTlRFUkZBQ0UgTElCUkFSWSBDT0RFCisgKiBJdCBzaG91bGQgaW5zdGVhZCBiZSBtb2RpZmllZCBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUgYW5kIGNvcGllZAorICogdG8gdGhlIGludGVyZmFjZSBsaWJyYXJ5IGNvZGUuICBUaGlzIHdheSB3ZSBjYW4gbWluaW1pemUgdGhlCisgKiBwcm9ibGVtcyB0aGF0IHRoaXMgaXMgc3VyZSB0byBjYXVzZSBoYXZpbmcgdHdvIGNvcGllcyBvZiB0aGUKKyAqIHNhbWUgZmlsZS4KKyAqCisgKiBmaWxlcyBsaXZlIGluIGxpYm9tcCBhbmQgbGlib21wX2RiL3NyYy9pbmNsdWRlCisgKi8KKworLyogQ0hBTkdFIFRISVMgV0hFTiBTVFJVQ1RVUkVTIEJFTE9XIENIQU5HRQorICogQmVmb3JlIHdlIHJlbGVhc2UgdGhpcyB0byBhIGN1c3RvbWVyLCBwbGVhc2UgZG9uJ3QgY2hhbmdlIHRoaXMgdmFsdWUuICBBZnRlciBpdCBpcyByZWxlYXNlZCBhbmQKKyAqIHN0YWJsZSwgdGhlbiBhbnkgbmV3IHVwZGF0ZXMgdG8gdGhlIHN0cnVjdHVyZXMgb3IgZGF0YSBzdHJ1Y3R1cmUgdHJhdmVyc2FsIGFsZ29yaXRobXMgbmVlZCB0bworICogY2hhbmdlIHRoaXMgdmFsdWUuCisgKi8KKyNkZWZpbmUgS01QX09NUF9WRVJTSU9OIDkKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIGttcF9pbnQzMiAgb2Zmc2V0OworICAgIGttcF9pbnQzMiAgc2l6ZTsKK30gb2Zmc2V0X2FuZF9zaXplX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfdWludDY0ICAgIGFkZHI7CisgICAga21wX2ludDMyICAgICBzaXplOworICAgIGttcF9pbnQzMiAgICAgcGFkZGluZzsKK30gYWRkcl9hbmRfc2l6ZV90OworCit0eXBlZGVmIHN0cnVjdCB7CisgICAga21wX3VpbnQ2NCAgIGZsYWdzOyAgICAgICAgIC8vIEZsYWdzIGZvciBmdXR1cmUgZXh0ZW5zaW9ucy4KKyAgICBrbXBfdWludDY0ICAgZmlsZTsgICAgICAgICAgLy8gUG9pbnRlciB0byBuYW1lIG9mIHNvdXJjZSBmaWxlIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX3VpbnQ2NCAgIGZ1bmM7ICAgICAgICAgIC8vIFBvaW50ZXIgdG8gbmFtZSBvZiByb3V0aW5lIHdoZXJlIHRoZSBwYXJhbGxlbCByZWdpb24gaXMuCisgICAga21wX2ludDMyICAgIGJlZ2luOyAgICAgICAgIC8vIEJlZ2lubmluZyBvZiBzb3VyY2UgbGluZSByYW5nZS4KKyAgICBrbXBfaW50MzIgICAgZW5kOyAgICAgICAgICAgLy8gRW5kIG9mIHNvdXJjZSBsaW5lIHJhbmdlLgorICAgIGttcF9pbnQzMiAgICBudW1fdGhyZWFkczsgICAvLyBTcGVjaWZpZWQgbnVtYmVyIG9mIHRocmVhZHMuCit9IGttcF9vbXBfbnRocl9pdGVtX3Q7CisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBrbXBfaW50MzIgICAgIG51bTsgICAgICAgICAgLy8gTnVtYmVyIG9mIGl0ZW1zIGluIHRoZSBhcnJyYXkuCisgICAga21wX3VpbnQ2NCAgICBhcnJheTsgICAgICAgIC8vIEFkZHJlc3Mgb2YgYXJyYXkgb2Yga21wX29tcF9udW1fdGhyZWFkc19pdGVtX3QuCit9IGttcF9vbXBfbnRocl9pbmZvX3Q7CisKKworLyogVGhpcyBzdHJ1Y3R1cmUgaXMga25vd24gdG8gdGhlIGlkYiBpbnRlcmZhY2UgbGlicmFyeSAqLwordHlwZWRlZiBzdHJ1Y3QgeworCisgICAgLyogQ2hhbmdlIHRoaXMgb25seSBpZiB5b3UgbWFrZSBhIGZ1bmRhbWVudGFsIGRhdGEgc3RydWN0dXJlIGNoYW5nZSBoZXJlICovCisgICAga21wX2ludDMyICAgICAgICAgIGxpYl92ZXJzaW9uOworCisgICAgLyogc2FuaXR5IGNoZWNrLiAgT25seSBzaG91bGQgYmUgY2hlY2tlZCBpZiB2ZXJzaW9ucyBhcmUgaWRlbnRpY2FsCisgICAgICogVGhpcyBpcyBhbHNvIHVzZWQgZm9yIGJhY2t3YXJkIGNvbXBhdGliaWxpdHkgdG8gZ2V0IHRoZSBydW50aW1lCisgICAgICogc3RydWN0dXJlIHNpemUgaWYgaXQgdGhlIHJ1bnRpbWUgaXMgb2xkZXIgdGhhbiB0aGUgaW50ZXJmYWNlICovCisgICAga21wX2ludDMyICAgICAgICAgIHNpemVvZl90aGlzX3N0cnVjdHVyZTsKKworICAgIC8qIE9wZW5NUCBSVEwgdmVyc2lvbiBpbmZvLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgICBtYWpvcjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgbWlub3I7CisgICAgYWRkcl9hbmRfc2l6ZV90ICAgIGJ1aWxkOworICAgIGFkZHJfYW5kX3NpemVfdCAgICBvcGVubXBfdmVyc2lvbjsKKyAgICBhZGRyX2FuZF9zaXplX3QgICAgYmFubmVyOworCisgICAgLyogVmFyaW91cyBnbG9iYWxzLiAqLworICAgIGFkZHJfYW5kX3NpemVfdCAgdGhyZWFkczsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX3RocmVhZHMuCisgICAgYWRkcl9hbmRfc2l6ZV90ICByb290czsgICAgICAgICAgICAgIC8vIFBvaW50ZXIgdG8gX19rbXBfcm9vdC4KKyAgICBhZGRyX2FuZF9zaXplX3QgIGNhcGFjaXR5OyAgICAgICAgICAgLy8gUG9pbnRlciB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LgorICAgIGFkZHJfYW5kX3NpemVfdCAgbW9uaXRvcjsgICAgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX21vbml0b3IuCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIGFkZHJfYW5kX3NpemVfdCAgbG9ja190YWJsZTsgICAgICAgICAvLyBQb2ludGVyIHRvIF9fa21wX2xvY2tfdGFibGUuCisjZW5kaWYKKyAgICBhZGRyX2FuZF9zaXplX3QgIGZ1bmNfbWljcm90YXNrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrOworICAgIGFkZHJfYW5kX3NpemVfdCAgZnVuY19mb3JrX3RlYW1zOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGVhbV9jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgdGFza19jb3VudGVyOworICAgIGFkZHJfYW5kX3NpemVfdCAgbnRocl9pbmZvOworICAgIGttcF9pbnQzMiAgICAgICAgYWRkcmVzc193aWR0aDsKKyAgICBrbXBfaW50MzIgICAgICAgIGluZGV4ZWRfbG9ja3M7CisgICAga21wX2ludDMyICAgICAgICBsYXN0X2JhcnJpZXI7ICAgICAgIC8vIFRoZSBlbmQgaW4gZW51bSBiYXJyaWVyX3R5cGUKKyAgICBrbXBfaW50MzIgICAgICAgIGRlcXVlX3NpemU7ICAgICAgICAgLy8gVEFTS19ERVFVRV9TSVpFCisKKyAgICAvKiB0aHJlYWQgc3RydWN0dXJlIGluZm9ybWF0aW9uLiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0aF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9pbmZvOyAgICAgICAgICAvLyBkZXNjcmlwdG9yIGZvciB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGVhbTsgICAgICAgICAgLy8gdGVhbSBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfcm9vdDsgICAgICAgICAgLy8gcm9vdCBmb3IgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfc2VyaWFsX3RlYW07ICAgLy8gc2VyaWFsIHRlYW0gdW5kZXIgdGhpcyB0aHJlYWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfaWRlbnQ7ICAgICAgICAgLy8gbG9jYXRpb24gZm9yIHRoaXMgdGhyZWFkIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX3NwaW5faGVyZTsgICAgIC8vIGlzIHRocmVhZCB3YWl0aW5nIGZvciBsb2NrIChpZiBhdmFpbGFibGUpCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX25leHRfd2FpdGluZzsgIC8vIG5leHQgdGhyZWFkIHdhaXRpbmcgZm9yIGxvY2sgKGlmIGF2YWlsYWJsZSkKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGhfdGFza190ZWFtOyAgICAgLy8gdGFzayB0ZWFtIHN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9jdXJyZW50X3Rhc2s7ICAvLyBpbm5lcm1vc3QgdGFzayBiZWluZyBleGVjdXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF90YXNrX3N0YXRlOyAgICAvLyBhbHRlcm5hdGluZyAwLzEgZm9yIHRhc2sgdGVhbSBpZGVudGlmaWNhdGlvbgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0aF9iYXI7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRoX2Jfd29ya2VyX2Fycml2ZWQ7IC8vIHRoZSB3b3JrZXIgaW5jcmVhc2VzIGl0IGJ5IDEgd2hlbiBpdCBhcnJpdmVzIHRvIHRoZSBiYXJyaWVyCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8qIHRlYW1zIGluZm9ybWF0aW9uICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgdGhfdGVhbXNfbWljcm90YXNrOy8vIGVudHJ5IGFkZHJlc3MgZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX2xldmVsOyAgICAvLyBpbml0aWFsIGxldmVsIG9mIHRlYW1zIGNvbnN0cnVjdAorICAgIG9mZnNldF9hbmRfc2l6ZV90IHRoX3RlYW1zX250ZWFtczsgICAvLyBudW1iZXIgb2YgdGVhbXMgaW4gYSBsZWFndWUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCB0aF90ZWFtc19udGg7ICAgICAgLy8gbnVtYmVyIG9mIHRocmVhZHMgaW4gZWFjaCB0ZWFtIG9mIHRoZSBsZWFndWUKKyNlbmRpZgorCisgICAgLyoga21wX2Rlc2Mgc3RydWN0dXJlIChmb3IgaW5mbyBmaWVsZCBhYm92ZSkgKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgZHNfc2l6ZW9mX3N0cnVjdDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfdGlkOyAgICAgICAgICAgLy8gdGVhbSB0aHJlYWQgaWQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgZHNfZ3RpZDsgICAgICAgICAgLy8gZ2xvYmFsIHRocmVhZCBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICBkc190aHJlYWQ7ICAgICAgICAvLyBuYXRpdmUgdGhyZWFkIGlkCisKKyAgICAvKiB0ZWFtIHN0cnVjdHVyZSBpbmZvcm1hdGlvbiAqLworICAgIGttcF9pbnQzMiAgICAgICAgICB0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbWFzdGVyX3RpZDsgICAgIC8vIHRpZCBvZiBtYXN0ZXIgaW4gcGFyZW50IHRlYW0KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pZGVudDsgICAgICAgICAgLy8gbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfcGFyZW50OyAgICAgICAgIC8vIHBhcmVudCB0ZWFtCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfbnByb2M7ICAgICAgICAgIC8vICMgdGVhbSB0aHJlYWRzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGhyZWFkczsgICAgICAgIC8vIGFycmF5IG9mIHRocmVhZHMKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9zZXJpYWxpemVkOyAgICAgLy8gIyBsZXZlbHMgb2Ygc2VyaWFsaXplZCB0ZWFtcworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2lkOyAgICAgICAgICAgICAvLyB1bmlxdWUgdGVhbSBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X3BrZm47CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRfdGFza190ZWFtOyAgICAgIC8vIHRhc2sgdGVhbSBzdHJ1Y3R1cmUKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9pbXBsaWNpdF90YXNrOyAgLy8gdGFza2RhdGEgZm9yIHRoZSB0aHJlYWQncyBpbXBsaWNpdCB0YXNrCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9jYW5jZWxfcmVxdWVzdDsKKyNlbmRpZgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JhcjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdF9iX21hc3Rlcl9hcnJpdmVkOyAvLyBpbmNyZWFzZWQgYnkgMSB3aGVuIG1hc3RlciBhcnJpdmVzIHRvIGEgYmFycmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0X2JfdGVhbV9hcnJpdmVkOyAgIC8vIGluY3JlYXNlZCBieSBvbmUgd2hlbiBhbGwgdGhlIHRocmVhZHMgYXJyaXZlZAorCisgICAgLyogcm9vdCBzdHJ1Y3R1cmUgaW5mb3JtYXRpb24gKi8KKyAgICBrbXBfaW50MzIgICAgICAgICAgcl9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfdGVhbTsgICAgICAvLyB0ZWFtIGF0IHJvb3QKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgcl9ob3RfdGVhbTsgICAgICAgLy8gaG90IHRlYW0gZm9yIHRoaXMgcm9vdAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3ViZXJfdGhyZWFkOyAgICAvLyByb290IHRocmVhZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICByX3Jvb3RfaWQ7ICAgICAgICAvLyB1bmlxdWUgcm9vdCBpZCAoaWYgYXZhaWxhYmxlKQorCisgICAgLyogaWRlbnQgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGlkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGlkX3Bzb3VyY2U7ICAgICAgIC8qIGFkZHJlc3Mgb2Ygc3RyaW5nICI7ZmlsZTtmdW5jO2xpbmUxO2xpbmUyOzsiLiAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBpZF9mbGFnczsKKworICAgIC8qIGxvY2sgc3RydWN0dXJlIGluZm9ybWF0aW9uICovCisgICAga21wX2ludDMyICAgICAgICAgIGxrX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX2luaXRpYWxpemVkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NhdGlvbjsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfdGFpbF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfaGVhZF9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfbmV4dF90aWNrZXQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGxrX25vd19zZXJ2aW5nOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19vd25lcl9pZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbGtfZGVwdGhfbG9ja2VkOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBsa19sb2NrX2ZsYWdzOworCisjaWYgISBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgIC8qIGxvY2tfdGFibGVfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBsdF9zaXplX29mX3N0cnVjdDsgICAgLyogU2l6ZSBhbmQgbGF5b3V0IG9mIGttcF9sb2NrX3RhYmxlX3QuICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X3VzZWQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGx0X2FsbG9jYXRlZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgbHRfdGFibGU7CisjZW5kaWYKKworICAgIC8qIHRhc2tfdGVhbV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHR0X3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X3RocmVhZHNfZGF0YTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdHRfZm91bmRfdGFza3M7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X25wcm9jOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0dF91bmZpbmlzaGVkX3RocmVhZHM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHR0X2FjdGl2ZTsKKworICAgIC8qIGttcF90YXNrZGF0YV90ICovCisgICAga21wX2ludDMyICAgICAgICAgIHRkX3NpemVvZl9zdHJ1Y3Q7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2tfaWQ7ICAgICAgICAgICAgICAgICAgLy8gdGFzayBpZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9mbGFnczsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgZmxhZ3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGVhbTsgICAgICAgICAgICAgICAgICAgICAvLyB0ZWFtIGZvciB0aGlzIHRhc2sKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfcGFyZW50OyAgICAgICAgICAgICAgICAgICAvLyBwYXJlbnQgdGFzaworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9sZXZlbDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgdGVzdGluZyBsZXZlbAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pZGVudDsgICAgICAgICAgICAgICAgICAgIC8vIHRhc2sgaWRlbnRpZmllcgorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3M7ICAgIC8vIGNoaWxkIHRhc2tzICgrIGN1cnJlbnQgdGFzaykgbm90IHlldCBkZWFsbG9jYXRlZAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzOyAgIC8vIGNoaWxkIHRhc2tzIG5vdCB5ZXQgY29tcGxldGUKKworICAgIC8qIFRhc2t3YWl0ICovCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIHRkX3Rhc2t3YWl0X2lkZW50OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF9jb3VudGVyOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrd2FpdF90aHJlYWQ7ICAgICAgICAgIC8vIGd0aWQgKyAxIG9mIHRocmVhZCBlbmNvdW50ZXJlZCB0YXNrd2FpdAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBUYXNrZ3JvdXAgKi8KKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfdGFza2dyb3VwOyAgICAgICAgICAgICAgICAvLyBwb2ludGVyIHRvIHRoZSBjdXJyZW50IHRhc2tncm91cAorICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF90YXNrX2NvdW50OyAgICAgICAgICAgICAgIC8vIG51bWJlciBvZiBhbGxvY2F0ZWQgYW5kIG5vdCB5ZXQgY29tcGxldGUgdGFza3MKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgdGRfY2FuY2VsOyAgICAgICAgICAgICAgICAgICAvLyByZXF1ZXN0IGZvciBjYW5jZWxsYXRpb24gb2YgdGhpcyB0YXNrZ3JvdXAKKworICAgIC8qIFRhc2sgZGVwZW5kZW5jeSAqLworICAgIG9mZnNldF9hbmRfc2l6ZV90ICB0ZF9kZXBub2RlOyAgICAgICAgICAgICAgICAgIC8vIHBvaW50ZXIgdG8gZ3JhcGggbm9kZSBpZiB0aGUgdGFzayBoYXMgZGVwZW5kZW5jaWVzCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25vZGU7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25leHQ7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3N1Y2Nlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3Rhc2s7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25wcmVkZWNlc3NvcnM7CisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX25yZWZzOworI2VuZGlmCisgICAgb2Zmc2V0X2FuZF9zaXplX3QgIGRuX3JvdXRpbmU7CisKKyAgICAvKiBrbXBfdGhyZWFkX2RhdGFfdCAqLworICAgIGttcF9pbnQzMiAgICAgICAgICBoZF9zaXplb2Zfc3RydWN0OworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfc2l6ZTsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfaGVhZDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfdGFpbDsKKyAgICBvZmZzZXRfYW5kX3NpemVfdCAgaGRfZGVxdWVfbnRhc2tzOworICAgIG9mZnNldF9hbmRfc2l6ZV90ICBoZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKworICAgIC8vIFRoZSBsYXN0IGZpZWxkIG9mIHN0YWJsZSB2ZXJzaW9uLgorICAgIGttcF91aW50NjQgICAgICAgICBsYXN0X2ZpZWxkOworCit9IGttcF9vbXBfc3RydWN0X2luZm9fdDsKKworI2VuZGlmIC8qIFVTRV9ERUJVR0dFUiAqLworCisvKiBlbmQgb2YgZmlsZSAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9vcy5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9vcy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzMzUyMTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX29zLmgKQEAgLTAsMCArMSw3MTYgQEAKKy8qCisgKiBrbXBfb3MuaCAtLSBLUFRTIHJ1bnRpbWUgaGVhZGVyIGZpbGUuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX09TX0gKKyNkZWZpbmUgS01QX09TX0gKKworI2luY2x1ZGUgImttcF9jb25maWcuaCIKKyNpbmNsdWRlIDxzdGRsaWIuaD4KKworI2RlZmluZSBLTVBfRlROX1BMQUlOICAgMQorI2RlZmluZSBLTVBfRlROX0FQUEVORCAgMgorI2RlZmluZSBLTVBfRlROX1VQUEVSICAgMworLyoKKyNkZWZpbmUgS01QX0ZUTl9QUkVQRU5EIDQKKyNkZWZpbmUgS01QX0ZUTl9VQVBQRU5EIDUKKyovCisKKyNkZWZpbmUgS01QX1BUUl9TS0lQICAgIChzaXplb2Yodm9pZCopKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciB2YXJpYXRpb25zIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIEtNUF9PRkYJCQkJMAorI2RlZmluZSBLTVBfT04JCQkJMQorCisjZGVmaW5lIEtNUF9NRU1fQ09OU19WT0xBVElMRQkJMAorI2RlZmluZSBLTVBfTUVNX0NPTlNfRkVOQ0UJCTEKKworI2lmbmRlZiBLTVBfTUVNX0NPTlNfTU9ERUwKKyMgZGVmaW5lIEtNUF9NRU1fQ09OU19NT0RFTAkgS01QX01FTV9DT05TX1ZPTEFUSUxFCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBDb21waWxlciByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisjZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMAorI2RlZmluZSBLTVBfQ09NUElMRVJfR0NDIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX0NMQU5HIDAKKyNkZWZpbmUgS01QX0NPTVBJTEVSX01TVkMgMAorCisjaWYgZGVmaW5lZCggX19JTlRFTF9DT01QSUxFUiApCisjIHVuZGVmIEtNUF9DT01QSUxFUl9JQ0MKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9JQ0MgMQorI2VsaWYgZGVmaW5lZCggX19jbGFuZ19fICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX0NMQU5HCisjIGRlZmluZSBLTVBfQ09NUElMRVJfQ0xBTkcgMQorI2VsaWYgZGVmaW5lZCggX19HTlVDX18gKQorIyB1bmRlZiBLTVBfQ09NUElMRVJfR0NDCisjIGRlZmluZSBLTVBfQ09NUElMRVJfR0NDIDEKKyNlbGlmIGRlZmluZWQoIF9NU0NfVkVSICkKKyMgdW5kZWYgS01QX0NPTVBJTEVSX01TVkMKKyMgZGVmaW5lIEtNUF9DT01QSUxFUl9NU1ZDIDEKKyNlbHNlCisjIGVycm9yIFVua25vd24gY29tcGlsZXIKKyNlbmRpZgorCisjaWYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgJiYgIUtNUF9PU19DTksgJiYgIUtNUF9BUkNIX1BQQzY0CisjIGRlZmluZSBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEIDEKKyMgaWYgS01QX09TX1dJTkRPV1MgJiYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0dST1VQX0FGRklOSVRZICAgIDEKKyMgZWxzZQorIyAgZGVmaW5lIEtNUF9HUk9VUF9BRkZJTklUWSAgICAwCisjIGVuZGlmCisjZWxzZQorIyBkZWZpbmUgS01QX0FGRklOSVRZX1NVUFBPUlRFRCAwCisjIGRlZmluZSBLTVBfR1JPVVBfQUZGSU5JVFkgICAgIDAKKyNlbmRpZgorCisvKiBDaGVjayBmb3IgcXVhZC1wcmVjaXNpb24gZXh0ZW5zaW9uLiAqLworI2RlZmluZSBLTVBfSEFWRV9RVUFEIDAKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisjIGlmIEtNUF9DT01QSUxFUl9JQ0MKKyAgIC8qIF9RdWFkIGlzIGFscmVhZHkgZGVmaW5lZCBmb3IgaWNjICovCisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgLyogQ2xhbmcgZG9lc24ndCBzdXBwb3J0IGEgc29mdHdhcmUtaW1wbGVtZW50ZWQKKyAgICAgIDEyOC1iaXQgZXh0ZW5kZWQgcHJlY2lzaW9uIHR5cGUgeWV0ICovCisgICB0eXBlZGVmIGxvbmcgZG91YmxlIF9RdWFkOworIyBlbGlmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgX19mbG9hdDEyOCBfUXVhZDsKKyMgIHVuZGVmICBLTVBfSEFWRV9RVUFECisjICBkZWZpbmUgS01QX0hBVkVfUVVBRCAxCisjIGVsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjIGVuZGlmCisjZWxzZQorIyBpZiBfX0xEQkxfTUFYX0VYUF9fID49IDE2Mzg0ICYmIEtNUF9DT01QSUxFUl9HQ0MKKyAgIHR5cGVkZWYgbG9uZyBkb3VibGUgX1F1YWQ7CisjICB1bmRlZiAgS01QX0hBVkVfUVVBRAorIyAgZGVmaW5lIEtNUF9IQVZFX1FVQUQgMQorIyBlbmRpZgorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19XSU5ET1dTCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAga21wX2ludDg7CisgIHR5cGVkZWYgdW5zaWduZWQgY2hhciAgICAga21wX3VpbnQ4OworICB0eXBlZGVmIHNob3J0ICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICBrbXBfdWludDE2OworICB0eXBlZGVmIGludCAgICAgICAgICAgICAgIGttcF9pbnQzMjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgICAgICBrbXBfdWludDMyOworIyBkZWZpbmUgS01QX0lOVDMyX1NQRUMgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICJ1IgorIyBpZm5kZWYgS01QX1NUUlVDVDY0CisgICB0eXBlZGVmIF9faW50NjQgCQlrbXBfaW50NjQ7CisgICB0eXBlZGVmIHVuc2lnbmVkIF9faW50NjQgCWttcF91aW50NjQ7CisgICAjZGVmaW5lIEtNUF9JTlQ2NF9TUEVDIAkiSTY0ZCIKKyAgICNkZWZpbmUgS01QX1VJTlQ2NF9TUEVDCSJJNjR1IgorIyBlbHNlCisgICBzdHJ1Y3Qga21wX3N0cnVjdDY0IHsKKyAgICBrbXBfaW50MzIgICBhLGI7CisgICB9OworICAgdHlwZWRlZiBzdHJ1Y3Qga21wX3N0cnVjdDY0IGttcF9pbnQ2NDsKKyAgIHR5cGVkZWYgc3RydWN0IGttcF9zdHJ1Y3Q2NCBrbXBfdWludDY0OworICAgLyogTm90IHN1cmUgd2hhdCB0byB1c2UgZm9yIEtNUF9bVV1JTlQ2NF9TUEVDIGhlcmUgKi8KKyMgZW5kaWYKKyMgaWYgS01QX0FSQ0hfWDg2XzY0CisjICBkZWZpbmUgS01QX0lOVFBUUiAxCisgICB0eXBlZGVmIF9faW50NjQgICAgICAgICAJa21wX2ludHB0cl90OworICAgdHlwZWRlZiB1bnNpZ25lZCBfX2ludDY0CWttcF91aW50cHRyX3Q7CisjICBkZWZpbmUgS01QX0lOVFBUUl9TUEVDICAJIkk2NGQiCisjICBkZWZpbmUgS01QX1VJTlRQVFJfU1BFQyAJIkk2NHUiCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9PU19VTklYCisgIHR5cGVkZWYgY2hhciAgICAgICAgICAgICAgIGttcF9pbnQ4OworICB0eXBlZGVmIHVuc2lnbmVkIGNoYXIgICAgICBrbXBfdWludDg7CisgIHR5cGVkZWYgc2hvcnQgICAgICAgICAgICAgIGttcF9pbnQxNjsKKyAgdHlwZWRlZiB1bnNpZ25lZCBzaG9ydCAgICAga21wX3VpbnQxNjsKKyAgdHlwZWRlZiBpbnQgICAgICAgICAgICAgICAga21wX2ludDMyOworICB0eXBlZGVmIHVuc2lnbmVkIGludCAgICAgICBrbXBfdWludDMyOworICB0eXBlZGVmIGxvbmcgbG9uZyAgICAgICAgICBrbXBfaW50NjQ7CisgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIGttcF91aW50NjQ7CisjIGRlZmluZSBLTVBfSU5UMzJfU1BFQyAgICAgICJkIgorIyBkZWZpbmUgS01QX1VJTlQzMl9TUEVDICAgICAidSIKKyMgZGVmaW5lIEtNUF9JTlQ2NF9TUEVDCSAgICAgImxsZCIKKyMgZGVmaW5lIEtNUF9VSU5UNjRfU1BFQyAgICAgImxsdSIKKyNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyBkZWZpbmUgS01QX1NJWkVfVF9TUEVDIEtNUF9VSU5UMzJfU1BFQworI2VsaWYgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyMgZGVmaW5lIEtNUF9TSVpFX1RfU1BFQyBLTVBfVUlOVDY0X1NQRUMKKyNlbHNlCisjIGVycm9yICJDYW4ndCBkZXRlcm1pbmUgc2l6ZV90IHByaW50ZiBmb3JtYXQgc3BlY2lmaWVyLiIKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2CisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRikKKyNlbHNlCisjIGRlZmluZSBLTVBfU0laRV9UX01BWCAoMHhGRkZGRkZGRkZGRkZGRkZGKQorI2VuZGlmCisKK3R5cGVkZWYgc2l6ZV90ICBrbXBfc2l6ZV90OwordHlwZWRlZiBmbG9hdCAgIGttcF9yZWFsMzI7Cit0eXBlZGVmIGRvdWJsZSAga21wX3JlYWw2NDsKKworI2lmbmRlZiBLTVBfSU5UUFRSCisjIGRlZmluZSBLTVBfSU5UUFRSIDEKKyAgdHlwZWRlZiBsb25nICAgICAgICAgICAgIGttcF9pbnRwdHJfdDsKKyAgdHlwZWRlZiB1bnNpZ25lZCBsb25nICAgIGttcF91aW50cHRyX3Q7CisjIGRlZmluZSBLTVBfSU5UUFRSX1NQRUMgICAibGQiCisjIGRlZmluZSBLTVBfVUlOVFBUUl9TUEVDICAibHUiCisjZW5kaWYKKworI2lmZGVmIEJVSUxEX0k4CisgIHR5cGVkZWYga21wX2ludDY0ICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDY0ICAgICBrbXBfdWludDsKKyNlbHNlCisgIHR5cGVkZWYga21wX2ludDMyICAgICAga21wX2ludDsKKyAgdHlwZWRlZiBrbXBfdWludDMyICAgICBrbXBfdWludDsKKyNlbmRpZiAvKiBCVUlMRF9JOCAqLworI2RlZmluZSAgS01QX0lOVF9NQVggICAgICgoa21wX2ludDMyKTB4N0ZGRkZGRkYpCisjZGVmaW5lICBLTVBfSU5UX01JTiAgICAgKChrbXBfaW50MzIpMHg4MDAwMDAwMCkKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gdGVtcGxhdGUgZm9yIGRlYnVnIHByaW50cyBzcGVjaWZpY2F0aW9uICggZCwgdSwgbGxkLCBsbHUgKSwgYW5kIHRvIG9idGFpbgorICAgIC8vIHNpZ25lZC91bnNpZ25lZCBmbGF2b3JzIG9mIGEgdHlwZQorICAgIHRlbXBsYXRlPCB0eXBlbmFtZSBUID4KKyAgICBzdHJ1Y3QgdHJhaXRzX3QgeworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIFQgICAgICAgICAgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgVCAgICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiBzcGVjOworICAgIH07CisgICAgLy8gaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgc2lnbmVkIGludCA+IHsKKyAgICAgICAgdHlwZWRlZiBzaWduZWQgaW50ICAgIHNpZ25lZF90OworICAgICAgICB0eXBlZGVmIHVuc2lnbmVkIGludCAgdW5zaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiBkb3VibGUgICAgICAgIGZsb2F0aW5nX3Q7CisgICAgICAgIHN0YXRpYyBjaGFyIGNvbnN0ICogICBzcGVjOworICAgIH07CisgICAgLy8gdW5zaWduZWQgaW50CisgICAgdGVtcGxhdGU8PgorICAgIHN0cnVjdCB0cmFpdHNfdDwgdW5zaWduZWQgaW50ID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBpbnQgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgaW50ICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGRvdWJsZSAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgIHNwZWM7CisgICAgfTsKKyAgICAvLyBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCBzaWduZWQgbG9uZyBsb25nID4geworICAgICAgICB0eXBlZGVmIHNpZ25lZCBsb25nIGxvbmcgICAgc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nICB1bnNpZ25lZF90OworICAgICAgICB0eXBlZGVmIGxvbmcgZG91YmxlICAgICAgICAgZmxvYXRpbmdfdDsKKyAgICAgICAgc3RhdGljIGNoYXIgY29uc3QgKiAgICAgICAgIHNwZWM7CisgICAgfTsKKyAgICAvLyB1bnNpZ25lZCBsb25nIGxvbmcKKyAgICB0ZW1wbGF0ZTw+CisgICAgc3RydWN0IHRyYWl0c190PCB1bnNpZ25lZCBsb25nIGxvbmcgPiB7CisgICAgICAgIHR5cGVkZWYgc2lnbmVkIGxvbmcgbG9uZyAgICBzaWduZWRfdDsKKyAgICAgICAgdHlwZWRlZiB1bnNpZ25lZCBsb25nIGxvbmcgIHVuc2lnbmVkX3Q7CisgICAgICAgIHR5cGVkZWYgbG9uZyBkb3VibGUgICAgICAgICBmbG9hdGluZ190OworICAgICAgICBzdGF0aWMgY2hhciBjb25zdCAqICAgICAgICAgc3BlYzsKKyAgICB9OworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgS01QX0VYUE9SVAlleHRlcm4JLyogZXhwb3J0IGRlY2xhcmF0aW9uIGluIGd1aWRlIGxpYnJhcmllcyAqLworCisjaWYgX19HTlVDX18gPj0gNAorICAgICNkZWZpbmUgX19mb3JjZWlubGluZSBfX2lubGluZQorI2VuZGlmCisKKyNkZWZpbmUgUEFHRV9TSVpFICAgICAgICAgICAgICAgICAgICAgICAoMHg0MDAwKQorI2RlZmluZSBQQUdFX0FMSUdORUQoX2FkZHIpICAgICAoICEgKChzaXplX3QpIF9hZGRyICYgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKyNkZWZpbmUgQUxJR05fVE9fUEFHRSh4KSAgICh2b2lkICopKCgoc2l6ZV90KSh4KSkgJiB+KChzaXplX3QpKFBBR0VfU0laRSAtIDEpKSkKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSBTdXBwb3J0IGZvciBjYWNoZSBhbGlnbm1lbnQsIHBhZGRpbmcsIGV0Yy4gLS0tLS0tLS0tLS0tLS0tLS0qLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNkZWZpbmUgSU5URVJOT0RFX0NBQ0hFX0xJTkUgNDA5NiAvKiBmb3IgbXVsdGktbm9kZSBzeXN0ZW1zICovCisKKy8qIERlZmluZSB0aGUgZGVmYXVsdCBzaXplIG9mIHRoZSBjYWNoZSBsaW5lICovCisjaWZuZGVmIENBQ0hFX0xJTkUKKyAgICAjZGVmaW5lIENBQ0hFX0xJTkUgICAgICAgICAgICAgICAgICAxMjggICAgICAgICAvKiBjYWNoZSBsaW5lIHNpemUgaW4gYnl0ZXMgKi8KKyNlbHNlCisgICAgI2lmICggQ0FDSEVfTElORSA8IDY0ICkgJiYgISBkZWZpbmVkKCBLTVBfT1NfREFSV0lOICkKKyAgICAgICAgLy8gMjAwNi0wMi0xMzogVGhpcyBwcm9kdWNlcyB0b28gbWFueSB3YXJuaW5ncyBvbiBPUyBYKi4gRGlzYWJsZSBpdCBmb3IgYSB3aGlsZS4uLgorICAgICAgICAjd2FybmluZyBDQUNIRV9MSU5FIGlzIHRvbyBzbWFsbC4KKyAgICAjZW5kaWYKKyNlbmRpZiAvKiBDQUNIRV9MSU5FICovCisKKyNkZWZpbmUgS01QX0NBQ0hFX1BSRUZFVENIKEFERFIpIAkvKiBub3RoaW5nICovCisKKy8qIFRlbXBvcmFyeSBub3RlOiBpZiBwZXJmb3JtYW5jZSB0ZXN0aW5nIG9mIHRoaXMgcGFzc2VzLCB3ZSBjYW4gcmVtb3ZlCisgICBhbGwgcmVmZXJlbmNlcyB0byBLTVBfRE9fQUxJR04gYW5kIHJlcGxhY2Ugd2l0aCBLTVBfQUxJR04uICAqLworI2lmIEtNUF9PU19VTklYICYmIGRlZmluZWQoX19HTlVDX18pCisjIGRlZmluZSBLTVBfRE9fQUxJR04oYnl0ZXMpICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKGJ5dGVzKSkpCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2F0dHJpYnV0ZV9fKChhbGlnbmVkKENBQ0hFX0xJTkUpKSkKKyMgZGVmaW5lIEtNUF9BTElHTl9DQUNIRV9JTlRFUk5PREUgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChJTlRFUk5PREVfQ0FDSEVfTElORSkpKQorIyBkZWZpbmUgS01QX0FMSUdOKGJ5dGVzKSAgICAgX19hdHRyaWJ1dGVfXygoYWxpZ25lZChieXRlcykpKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9ET19BTElHTihieXRlcykgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEUgICAgICBfX2RlY2xzcGVjKCBhbGlnbihDQUNIRV9MSU5FKSApCisjIGRlZmluZSBLTVBfQUxJR05fQ0FDSEVfSU5URVJOT0RFICAgICAgX19kZWNsc3BlYyggYWxpZ24oSU5URVJOT0RFX0NBQ0hFX0xJTkUpICkKKyMgZGVmaW5lIEtNUF9BTElHTihieXRlcykgICAgIF9fZGVjbHNwZWMoIGFsaWduKGJ5dGVzKSApCisjZW5kaWYKKworLyogR2VuZXJhbCBwdXJwb3NlIGZlbmNlIHR5cGVzIGZvciBtZW1vcnkgb3BlcmF0aW9ucyAqLworZW51bSBrbXBfbWVtX2ZlbmNlX3R5cGUgeworICAgIGttcF9ub19mZW5jZSwgICAgICAgICAvKiBObyBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfYWNxdWlyZV9mZW5jZSwgICAgLyogQWNxdWlyZSAocmVhZCkgbWVtb3J5IGZlbmNlICovCisgICAga21wX3JlbGVhc2VfZmVuY2UsICAgIC8qIFJlbGVhc2UgKHdyaXRlKSBtZW1vcnkgZmVuY2UgKi8KKyAgICBrbXBfZnVsbF9mZW5jZSAgICAgICAgLyogRnVsbCAocmVhZCt3cml0ZSkgbWVtb3J5IGZlbmNlICovCit9OworCisKKy8vCisvLyBTeW5jaHJvbml6YXRpb24gcHJpbWl0aXZlcworLy8KKworI2lmIEtNUF9BU01fSU5UUklOUyAmJiBLTVBfT1NfV0lORE9XUworCisjaW5jbHVkZSA8V2luZG93cy5oPgorCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRDb21wYXJlRXhjaGFuZ2UpCisjcHJhZ21hIGludHJpbnNpYyhJbnRlcmxvY2tlZEV4Y2hhbmdlKQorI3ByYWdtYSBpbnRyaW5zaWMoSW50ZXJsb2NrZWRFeGNoYW5nZTY0KQorCisvLworLy8gVXNpbmcgSW50ZXJsb2NrZWRJbmNyZW1lbnQgLyBJbnRlcmxvY2tlZERlY3JlbWVudCBjYXVzZXMgYSBsaWJyYXJ5IGxvYWRpbmcKKy8vIG9yZGVyaW5nIHByb2JsZW0sIHNvIHdlIHVzZSBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkIGluc3RlYWQuCisvLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRMzIocCkgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0XzMyKHApICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTMyKHApICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIDQgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZUFkZCggKHZvbGF0aWxlIGxvbmcgKikocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIEludGVybG9ja2VkRXhjaGFuZ2VBZGQoICh2b2xhdGlsZSBsb25nICopKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlQWRkKCAodm9sYXRpbGUgbG9uZyAqKShwKSwgKHYpICkKKworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hZGQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9vcjgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CitleHRlcm4ga21wX2ludDggX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCB2ICk7CisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBJbnRlcmxvY2tlZENvbXBhcmVFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksKGxvbmcpKHN2KSwobG9uZykoY3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQzMihwLCB2KSAgICAgICAgICAgICAgICAgSW50ZXJsb2NrZWRFeGNoYW5nZSggKHZvbGF0aWxlIGxvbmcgKikocCksIChsb25nKSh2KSApCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDY0KHAsIHYpICAgICAgICAgICAgICAgICBJbnRlcmxvY2tlZEV4Y2hhbmdlNjQoICh2b2xhdGlsZSBrbXBfaW50NjQgKikocCksIChrbXBfaW50NjQpKHYpICkKKworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IEludGVybG9ja2VkRXhjaGFuZ2UoICh2b2xhdGlsZSBsb25nICopcCwgKihsb25nICopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsMzIqKSZ0bXA7Cit9CisKKy8vCisvLyBSb3V0aW5lcyB0aGF0IHdlIHN0aWxsIG5lZWQgdG8gaW1wbGVtZW50IGluIGFzc2VtYmx5LgorLy8KK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworZXh0ZXJuIGttcF9yZWFsNjQgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkOCggKHApLCAodikgKQorCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kOCggKHApLCAodikgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQ19BQ1EzMihwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0lOQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTY0KHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorLy8jIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1EzMihwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCA0ICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF82NChwKSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ0X0FDUTY0KHApICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDRMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDMzIocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisvLyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9vcjY0KCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYW5kNjQoIChwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDgocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwxNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHZvbGF0aWxlIGttcF9pbnQzMiopKHApLCAoa21wX2ludDMyKShjdiksIChrbXBfaW50MzIpKHN2KSApCisjIGVsc2UgLyogNjQgYml0IHBvaW50ZXJzICovCisjICBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1BUUihwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAodm9sYXRpbGUga21wX2ludDY0KikocCksIChrbXBfaW50NjQpKGN2KSwgKGttcF9pbnQ2NCkoc3YpICkKKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggKHApLCAoY3YpLCAoc3YpICkKKy8vIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ4KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDgoICh2b2xhdGlsZSBrbXBfaW50OCopKHApLCAoa21wX2ludDgpKHYpICk7CisjIGRlZmluZSBLTVBfWENIR19GSVhFRDE2KHAsIHYpICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkMTYoIChwKSwgKHYpICk7CisvLyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKy8vIyBkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19maXhlZDY0KCAocCksICh2KSApOworLy8jIGRlZmluZSBLTVBfWENIR19SRUFMMzIocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX3JlYWwzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUw2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDY0KCAocCksICh2KSApOworCisKKyNlbGlmIChLTVBfQVNNX0lOVFJJTlMgJiYgS01QX09TX1VOSVgpIHx8ICEoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREOChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDggKikocCksICh2KSApCisKKy8qIGNhc3QgcCB0byBjb3JyZWN0IHR5cGUgc28gdGhhdCBwcm9wZXIgaW50cmluc2ljIHdpbGwgYmUgdXNlZCAqLworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9vciggKGttcF9pbnQ4ICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hbmQoIChrbXBfaW50OCAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQzMiAqKShwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FkZCggKGttcF9pbnQ2NCAqKShwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDY0ICopKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUNfQUNRMzIocCkgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50MzIgKikocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUM2NChwKSAgICAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9zdWIoIChrbXBfaW50NjQgKikocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX3N1YiggKGttcF9pbnQ2NCAqKShwKSwgMUxMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQUREMzIocCwgdikgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfYWRkKCAoa21wX2ludDMyICopKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ2NChwLCB2KSAgICAgICAgICAgICAgX19zeW5jX2ZldGNoX2FuZF9hZGQoIChrbXBfaW50NjQgKikocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1IzMihwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50MzIgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDMyKHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQzMiAqKShwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fT1I2NChwLCB2KSAgICAgICAgICAgICAgIF9fc3luY19mZXRjaF9hbmRfb3IoIChrbXBfaW50NjQgKikocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FORDY0KHAsIHYpICAgICAgICAgICAgICBfX3N5bmNfZmV0Y2hfYW5kX2FuZCggKGttcF9pbnQ2NCAqKShwKSwgKHYpICkKKworIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTgocCwgY3YsIHN2KSAgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDggKikocCksKGttcF91aW50OCkoY3YpLChrbXBfdWludDgpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMTYocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQxNiAqKShwKSwoa21wX3VpbnQxNikoY3YpLChrbXBfdWludDE2KShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDE2KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1EzMihwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDMyICopKHApLChrbXBfdWludDMyKShjdiksKGttcF91aW50MzIpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIocCwgY3YsIHN2KSBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwoa21wX3VpbnQzMikoY3YpLChrbXBfdWludDMyKShzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTY0KHAsIGN2LCBzdikgX19zeW5jX2Jvb2xfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw2NChwLCBjdiwgc3YpIF9fc3luY19ib29sX2NvbXBhcmVfYW5kX3N3YXAoICh2b2xhdGlsZSBrbXBfdWludDY0ICopKHApLChrbXBfdWludDY0KShjdiksKGttcF91aW50NjQpKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgICBfX3N5bmNfYm9vbF9jb21wYXJlX2FuZF9zd2FwKCAodm9sYXRpbGUgdm9pZCAqKikocCksKHZvaWQgKikoY3YpLCh2b2lkICopKHN2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ4KHAsIGN2LCBzdikgIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50OCAqKShwKSwoa21wX3VpbnQ4KShjdiksKGttcF91aW50OCkoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQxNihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MTYgKikocCksKGttcF91aW50MTYpKGN2KSwoa21wX3VpbnQxNikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQzMihwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50MzIgKikocCksKGttcF91aW50MzIpKGN2KSwoa21wX3VpbnQzMikoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fc3luY192YWxfY29tcGFyZV9hbmRfc3dhcCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksKGttcF91aW50NjQpKGN2KSwoa21wX3VpbnQ2NCkoc3YpICkKKworI2RlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQ4ICopKHApLCAoa21wX3VpbnQ4KSh2KSApCisjZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgICBfX3N5bmNfbG9ja190ZXN0X2FuZF9zZXQoICh2b2xhdGlsZSBrbXBfdWludDE2ICopKHApLCAoa21wX3VpbnQxNikodikgKQorI2RlZmluZSBLTVBfWENIR19GSVhFRDMyKHAsIHYpICAgICAgICAgICAgICAgICAgX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAodm9sYXRpbGUga21wX3VpbnQzMiAqKShwKSwgKGttcF91aW50MzIpKHYpICkKKyNkZWZpbmUgS01QX1hDSEdfRklYRUQ2NChwLCB2KSAgICAgICAgICAgICAgICAgIF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKHZvbGF0aWxlIGttcF91aW50NjQgKikocCksIChrbXBfdWludDY0KSh2KSApCisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IHYgKTsKK2V4dGVybiBrbXBfaW50OCBfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworZXh0ZXJuIGttcF9pbnQ4IF9fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggdiApOworaW5saW5lIGttcF9yZWFsMzIgS01QX1hDSEdfUkVBTDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICpwLCBrbXBfcmVhbDMyIHYpCit7CisgICAga21wX2ludDMyIHRtcCA9IF9fc3luY19sb2NrX3Rlc3RfYW5kX3NldCggKGttcF9pbnQzMiopcCwgKihrbXBfaW50MzIqKSZ2KTsKKyAgICByZXR1cm4gKihrbXBfcmVhbDMyKikmdG1wOworfQorCitpbmxpbmUga21wX3JlYWw2NCBLTVBfWENIR19SRUFMNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgdikKK3sKKyAgICBrbXBfaW50NjQgdG1wID0gX19zeW5jX2xvY2tfdGVzdF9hbmRfc2V0KCAoa21wX2ludDY0KilwLCAqKGttcF9pbnQ2NCopJnYpOworICAgIHJldHVybiAqKGttcF9yZWFsNjQqKSZ0bXA7Cit9CisKKyNlbHNlCisKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9vcjMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgdiApOworZXh0ZXJuIGttcF9pbnQ2NCBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX29yNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IHYgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCB2ICk7CisKK2V4dGVybiBrbXBfaW50OCBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworZXh0ZXJuIGttcF9pbnQzMiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CitleHRlcm4ga21wX2ludDMyIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKK2V4dGVybiBrbXBfaW50OCAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggIHZvbGF0aWxlIGttcF9pbnQ4ICAqcCwga21wX2ludDggIGN2LCBrbXBfaW50OCAgc3YgKTsKK2V4dGVybiBrbXBfaW50MTYgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKK2V4dGVybiBrbXBfaW50NjQgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKworZXh0ZXJuIGttcF9pbnQ4ICBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggICpwLCBrbXBfaW50OCAgdiApOworZXh0ZXJuIGttcF9pbnQxNiBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IHYgKTsKK2V4dGVybiBrbXBfaW50MzIgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiB2ICk7CitleHRlcm4ga21wX2ludDY0IF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgdiApOworZXh0ZXJuIGttcF9yZWFsMzIgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgdiApOworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BREQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDgoIChwKSwgKHYpICkKK2V4dGVybiBrbXBfcmVhbDY0IF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICpwLCBrbXBfcmVhbDY0IHYgKTsKKworIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIDEgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9PUjgocCwgdikgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX29yOCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ4KHAsIHYpICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDgoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAxICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fSU5DNjQocCkgICAgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAxTEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9JTkNfQUNRNjQocCkgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDY0KCAocCksIDFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfMzIocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfQUNRMzIocCkgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgNCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDRfNjQocCkgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgNExMICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENF9BQ1E2NChwKSAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCA0TEwgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9ERUMzMihwKSAgICAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyKCAocCksIC0xICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fREVDX0FDUTMyKHApICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggKHApLCAtMSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQzY0KHApICAgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0RFQ19BQ1E2NChwKSAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIChwKSwgLTFMTCApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX0FERDMyKHAsIHYpICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIChwKSwgKHYpICkKKyMgZGVmaW5lIEtNUF9URVNUX1RIRU5fQURENjQocCwgdikgICAgICAgICAgICAgIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NCggKHApLCAodikgKQorCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SMzIocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3IzMiggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQzMihwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDMyKCAocCksICh2KSApCisjIGRlZmluZSBLTVBfVEVTVF9USEVOX09SNjQocCwgdikgICAgICAgICAgICAgICBfX2ttcF90ZXN0X3RoZW5fb3I2NCggKHApLCAodikgKQorIyBkZWZpbmUgS01QX1RFU1RfVEhFTl9BTkQ2NChwLCB2KSAgICAgICAgICAgICAgX19rbXBfdGVzdF90aGVuX2FuZDY0KCAocCksICh2KSApCisKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1E4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4KHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9BQ1ExNihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMTYocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX0FDUTMyKHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUwzMihwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRNjQocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHApLCAoY3YpLCAoc3YpICkKKworIyBpZiBLTVBfQVJDSF9YODYKKyMgIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUFRSKHAsIGN2LCBzdikgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoICh2b2xhdGlsZSBrbXBfaW50MzIqKShwKSwgKGttcF9pbnQzMikoY3YpLCAoa21wX2ludDMyKShzdikgKQorIyBlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworIyAgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9QVFIocCwgY3YsIHN2KSAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggKHZvbGF0aWxlIGttcF9pbnQ2NCopKHApLCAoa21wX2ludDY0KShjdiksIChrbXBfaW50NjQpKHN2KSApCisjIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUOChwLCBjdiwgc3YpICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4KCAocCksIChjdiksIChzdikgKQorIyBkZWZpbmUgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFVDE2KHAsIGN2LCBzdikgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIChwKSwgKGN2KSwgKHN2KSApCisjIGRlZmluZSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVUMzIocCwgY3YsIHN2KSBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggKHApLCAoY3YpLCAoc3YpICkKKyMgZGVmaW5lIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRVQ2NChwLCBjdiwgc3YpIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCAocCksIChjdiksIChzdikgKQorCisjIGRlZmluZSBLTVBfWENIR19GSVhFRDgocCwgdikgICAgICAgICAgICAgICAgICBfX2ttcF94Y2hnX2ZpeGVkOCggKHZvbGF0aWxlIGttcF9pbnQ4KikocCksIChrbXBfaW50OCkodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMTYocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQxNiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVEMzIocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQzMiggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX0ZJWEVENjQocCwgdikgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfZml4ZWQ2NCggKHApLCAodikgKTsKKyMgZGVmaW5lIEtNUF9YQ0hHX1JFQUwzMihwLCB2KSAgICAgICAgICAgICAgICAgIF9fa21wX3hjaGdfcmVhbDMyKCAocCksICh2KSApOworIyBkZWZpbmUgS01QX1hDSEdfUkVBTDY0KHAsIHYpICAgICAgICAgICAgICAgICAgX19rbXBfeGNoZ19yZWFsNjQoIChwKSwgKHYpICk7CisKKyNlbmRpZiAvKiBLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tIHJlbGF4ZWQgY29uc2lzdGVuY3kgbWVtb3J5IG1vZGVsIHN0dWZmIC0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX09TX1dJTkRPV1MKKyMgaWZkZWYgX19BQlNPRlRfV0lOCisjICAgZGVmaW5lIEtNUF9NQigpICAgICBhc20gKCJub3AiKQorIyAgIGRlZmluZSBLTVBfSU1CKCkgICAgYXNtICgibm9wIikKKyMgZWxzZQorIyAgIGRlZmluZSBLTVBfTUIoKSAgICAgLyogX2FzbXsgbm9wIH0gKi8KKyMgICBkZWZpbmUgS01QX0lNQigpICAgIC8qIF9hc217IG5vcCB9ICovCisjIGVuZGlmCisjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0CisjIGRlZmluZSBLTVBfTUIoKSAgICAgICBfX3N5bmNfc3luY2hyb25pemUoKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX01CCisjIGRlZmluZSBLTVBfTUIoKSAgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfSU1CCisjIGRlZmluZSBLTVBfSU1CKCkgICAgICAvKiBub3RoaW5nIHRvIGRvICovCisjZW5kaWYKKworI2lmbmRlZiBLTVBfU1RfUkVMMzIKKyMgZGVmaW5lIEtNUF9TVF9SRUwzMihBLEQpICAgICAgKCAqKEEpID0gKEQpICkKKyNlbmRpZgorCisjaWZuZGVmIEtNUF9TVF9SRUw2NAorIyBkZWZpbmUgS01QX1NUX1JFTDY0KEEsRCkgICAgICAoICooQSkgPSAoRCkgKQorI2VuZGlmCisKKyNpZm5kZWYgS01QX0xEX0FDUTMyCisjIGRlZmluZSBLTVBfTERfQUNRMzIoQSkgICAgICAgICggKihBKSApCisjZW5kaWYKKworI2lmbmRlZiBLTVBfTERfQUNRNjQKKyMgZGVmaW5lIEtNUF9MRF9BQ1E2NChBKSAgICAgICAgKCAqKEEpICkKKyNlbmRpZgorCisjZGVmaW5lIFRDUl8xKGEpICAgICAgICAgICAgKGEpCisjZGVmaW5lIFRDV18xKGEsYikgICAgICAgICAgKGEpID0gKGIpCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8vCisvLyBGSVhNRSAtIG1heWJlIHRoaXMgc2hvdWxkIHRoaXMgYmUKKy8vCisvLyAjZGVmaW5lIFRDUl80KGEpICAgICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSgmYSkpCisvLyAjZGVmaW5lIFRDV180KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQzMiAqKSYoYikpCisvLworLy8gI2RlZmluZSBUQ1JfOChhKSAgICAoKih2b2xhdGlsZSBrbXBfaW50NjQgKikoYSkpCisvLyAjZGVmaW5lIFRDV184KGEsYikgIChhKSA9ICgqKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSgmYikpCisvLworLy8gSSdtIGZhaXJseSBjZXJ0YWluIHRoaXMgaXMgdGhlIGNvcnJlY3QgdGhpbmcgdG8gZG8sIGJ1dCBJJ20gYWZyYWlkCisvLyBvZiBwZXJmb3JtYW5jZSByZWdyZXNzaW9ucy4KKy8vCisKKyNkZWZpbmUgVENSXzQoYSkgICAgICAgICAgICAoYSkKKyNkZWZpbmUgVENXXzQoYSxiKSAgICAgICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENJXzQoYSkgICAgICAgICAgICAoKysoYSkpCisjZGVmaW5lIFRDRF80KGEpICAgICAgICAgICAgKC0tKGEpKQorI2RlZmluZSBUQ1JfOChhKSAgICAgICAgICAgIChhKQorI2RlZmluZSBUQ1dfOChhLGIpICAgICAgICAgIChhKSA9IChiKQorI2RlZmluZSBUQ0lfOChhKSAgICAgICAgICAgICgrKyhhKSkKKyNkZWZpbmUgVENEXzgoYSkgICAgICAgICAgICAoLS0oYSkpCisjZGVmaW5lIFRDUl9TWU5DXzQoYSkgICAgICAgKGEpCisjZGVmaW5lIFRDV19TWU5DXzQoYSxiKSAgICAgKGEpID0gKGIpCisjZGVmaW5lIFRDWF9TWU5DXzQoYSxiLGMpICAgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKikodm9sYXRpbGUgdm9pZCAqKSYoYSksIChrbXBfaW50MzIpKGIpLCAoa21wX2ludDMyKShjKSkKKyNkZWZpbmUgVENSX1NZTkNfOChhKSAgICAgICAoYSkKKyNkZWZpbmUgVENXX1NZTkNfOChhLGIpICAgICAoYSkgPSAoYikKKyNkZWZpbmUgVENYX1NZTkNfOChhLGIsYykgICBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKSh2b2xhdGlsZSB2b2lkICopJihhKSwgKGttcF9pbnQ2NCkoYiksIChrbXBfaW50NjQpKGMpKQorCisjaWYgS01QX0FSQ0hfWDg2CisvLyBXaGF0IGFib3V0IEFSTT8KKyAgICAjZGVmaW5lIFRDUl9QVFIoYSkgICAgICAgICAgKCh2b2lkICopVENSXzQoYSkpCisgICAgI2RlZmluZSBUQ1dfUFRSKGEsYikgICAgICAgIFRDV180KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1JfU1lOQ19QVFIoYSkgICAgICgodm9pZCAqKVRDUl9TWU5DXzQoYSkpCisgICAgI2RlZmluZSBUQ1dfU1lOQ19QVFIoYSxiKSAgIFRDV19TWU5DXzQoKGEpLChiKSkKKyAgICAjZGVmaW5lIFRDWF9TWU5DX1BUUihhLGIsYykgKCh2b2lkICopVENYX1NZTkNfNCgoYSksKGIpLChjKSkpCisKKyNlbHNlIC8qIDY0IGJpdCBwb2ludGVycyAqLworCisgICAgI2RlZmluZSBUQ1JfUFRSKGEpICAgICAgICAgICgodm9pZCAqKVRDUl84KGEpKQorICAgICNkZWZpbmUgVENXX1BUUihhLGIpICAgICAgICBUQ1dfOCgoYSksKGIpKQorICAgICNkZWZpbmUgVENSX1NZTkNfUFRSKGEpICAgICAoKHZvaWQgKilUQ1JfU1lOQ184KGEpKQorICAgICNkZWZpbmUgVENXX1NZTkNfUFRSKGEsYikgICBUQ1dfU1lOQ184KChhKSwoYikpCisgICAgI2RlZmluZSBUQ1hfU1lOQ19QVFIoYSxiLGMpICgodm9pZCAqKVRDWF9TWU5DXzgoKGEpLChiKSwoYykpKQorCisjZW5kaWYgLyogS01QX0FSQ0hfWDg2ICovCisKKy8qCisgKiBJZiB0aGVzZSBGVE5fe1RSVUUsRkFMU0V9IHZhbHVlcyBjaGFuZ2UsIG1heSBuZWVkIHRvCisgKiBjaGFuZ2Ugc2V2ZXJhbCBwbGFjZXMgd2hlcmUgdGhleSBhcmUgdXNlZCB0byBjaGVjayB0aGF0CisgKiBsYW5ndWFnZSBpcyBGb3J0cmFuLCBub3QgQy4KKyAqLworCisjaWZuZGVmIEZUTl9UUlVFCisjIGRlZmluZSBGVE5fVFJVRSAgICAgICBUUlVFCisjZW5kaWYKKworI2lmbmRlZiBGVE5fRkFMU0UKKyMgZGVmaW5lIEZUTl9GQUxTRSAgICAgIEZBTFNFCisjZW5kaWYKKwordHlwZWRlZiB2b2lkICAgICgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqbnByLCAuLi4gKTsKKworI2lmZGVmIFVTRV9WT0xBVElMRV9DQVNUCisjIGRlZmluZSBWT0xBVElMRV9DQVNUKHgpICAgICAgICAodm9sYXRpbGUgeCkKKyNlbHNlCisjIGRlZmluZSBWT0xBVElMRV9DQVNUKHgpICAgICAgICAoeCkKKyNlbmRpZgorCisjZGVmaW5lIEtNUF9XQUlUX1lJRUxEICAgICAgICAgICBfX2ttcF93YWl0X3lpZWxkXzQKKyNkZWZpbmUgS01QX1dBSVRfWUlFTERfUFRSICAgICAgIF9fa21wX3dhaXRfeWllbGRfNF9wdHIKKyNkZWZpbmUgS01QX0VRICAgICAgICAgICAgICAgICAgIF9fa21wX2VxXzQKKyNkZWZpbmUgS01QX05FUSAgICAgICAgICAgICAgICAgIF9fa21wX25lcV80CisjZGVmaW5lIEtNUF9MVCAgICAgICAgICAgICAgICAgICBfX2ttcF9sdF80CisjZGVmaW5lIEtNUF9HRSAgICAgICAgICAgICAgICAgICBfX2ttcF9nZV80CisjZGVmaW5lIEtNUF9MRSAgICAgICAgICAgICAgICAgICBfX2ttcF9sZV80CisKKy8qIFdvcmthcm91bmQgZm9yIEludGVsKFIpIDY0IGNvZGUgZ2VuIGJ1ZyB3aGVuIHRha2luZyBhZGRyZXNzIG9mIHN0YXRpYyBhcnJheSAoSW50ZWwoUikgNjQgVHJhY2tlciAjMTM4KSAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQpICYmIEtNUF9PU19MSU5VWAorIyBkZWZpbmUgU1RBVElDX0VGSTJfV09SS0FST1VORAorI2Vsc2UKKyMgZGVmaW5lIFNUQVRJQ19FRkkyX1dPUktBUk9VTkQgc3RhdGljCisjZW5kaWYKKworLy8gU3VwcG9ydCBvZiBCR0VUIHVzYWdlCisjaWZuZGVmIEtNUF9VU0VfQkdFVAorI2RlZmluZSBLTVBfVVNFX0JHRVQgMQorI2VuZGlmCisKKworLy8gU3dpdGNoZXMgZm9yIE9TUyBidWlsZHMKKyNpZm5kZWYgVVNFX1NZU0ZTX0lORk8KKyMgZGVmaW5lIFVTRV9TWVNGU19JTkZPICAwCisjZW5kaWYKKyNpZm5kZWYgVVNFX0NNUFhDSEdfRklYCisjIGRlZmluZSBVU0VfQ01QWENIR19GSVggMQorI2VuZGlmCisKKy8vIEVuYWJsZSBkeW5hbWljIHVzZXIgbG9jaworI2lmIE9NUF80NV9FTkFCTEVECisjIGRlZmluZSBLTVBfVVNFX0RZTkFNSUNfTE9DSyAxCisjZW5kaWYKKworLy8gRW5hYmxlIFRTWCBpZiBkeW5hbWljIHVzZXIgbG9jayBpcyB0dXJuZWQgb24KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworLy8gVmlzdWFsIHN0dWRpbyBjYW4ndCBoYW5kbGUgdGhlIGFzbSBzZWN0aW9ucyBpbiB0aGlzIGNvZGUKKyMgZGVmaW5lIEtNUF9VU0VfVFNYICAgICAgICAgICAgIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAhS01QX0NPTVBJTEVSX01TVkMKKyMgaWZkZWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworIyAgdW5kZWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworIyBlbmRpZgorIyBkZWZpbmUgS01QX1VTRV9BREFQVElWRV9MT0NLUyBLTVBfVVNFX1RTWAorI2VuZGlmCisKKy8vIEVuYWJsZSB0aWNrIHRpbWUgY29udmVyc2lvbiBvZiB0aWNrcyB0byBzZWNvbmRzCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyMgZGVmaW5lIEtNUF9IQVZFX1RJQ0tfVElNRSAoS01QX09TX0xJTlVYICYmIChLTVBfTUlDIHx8IEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQpKQorI2VuZGlmCisKKy8vIFdhcm5pbmcgbGV2ZWxzCitlbnVtIGttcF93YXJuaW5nc19sZXZlbCB7CisgICAga21wX3dhcm5pbmdzX29mZiA9IDAsCQkvKiBObyB3YXJuaW5ncyAqLworICAgIGttcF93YXJuaW5nc19sb3csCQkJLyogTWluaW1hbCB3YXJuaW5ncyAoZGVmYXVsdCkgKi8KKyAgICBrbXBfd2FybmluZ3NfZXhwbGljaXQgPSA2LAkJLyogRXhwbGljaXRseSBzZXQgdG8gT04gLSBtb3JlIHdhcm5pbmdzICovCisgICAga21wX3dhcm5pbmdzX3ZlcmJvc2UJCS8qIHJlc2VydmVkICovCit9OworCisjaWZkZWYgX19jcGx1c3BsdXMKK30gLy8gZXh0ZXJuICJDIgorI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNlbmRpZiAvKiBLTVBfT1NfSCAqLworLy8gU2FmZSBDIEFQSQorI2luY2x1ZGUgImttcF9zYWZlX2NfYXBpLmgiCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfcGxhdGZvcm0uaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmExOWRjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9wbGF0Zm9ybS5oCkBAIC0wLDAgKzEsMTcxIEBACisvKgorICoga21wX3BsYXRmb3JtLmggLS0gaGVhZGVyIGZvciBkZXRlcm1pbmluZyBvcGVyYXRpbmcgc3lzdGVtIGFuZCBhcmNoaXRlY3R1cmUKKyAqLworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaWZuZGVmIEtNUF9QTEFURk9STV9ICisjZGVmaW5lIEtNUF9QTEFURk9STV9ICisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gT3BlcmF0aW5nIHN5c3RlbSByZWNvZ25pdGlvbiAtLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNkZWZpbmUgS01QX09TX0xJTlVYICAgIDAKKyNkZWZpbmUgS01QX09TX0ZSRUVCU0QgIDAKKyNkZWZpbmUgS01QX09TX05FVEJTRCAgIDAKKyNkZWZpbmUgS01QX09TX0RBUldJTiAgIDAKKyNkZWZpbmUgS01QX09TX1dJTkRPV1MgIDAKKyNkZWZpbmUgS01QX09TX0NOSyAgICAgIDAKKyNkZWZpbmUgS01QX09TX1VOSVggICAgIDAgIC8qIGRpc2p1bmN0aW9uIG9mIEtNUF9PU19MSU5VWCwgS01QX09TX0RBUldJTiBldGMuICovCisKKworI2lmZGVmIF9XSU4zMgorIyB1bmRlZiBLTVBfT1NfV0lORE9XUworIyBkZWZpbmUgS01QX09TX1dJTkRPV1MgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19BUFBMRV9fICYmIGRlZmluZWQgX19NQUNIX18gKQorIyB1bmRlZiBLTVBfT1NfREFSV0lOCisjIGRlZmluZSBLTVBfT1NfREFSV0lOIDEKKyNlbmRpZgorCisvLyBpbiBzb21lIHBwYzY0IGxpbnV4IGluc3RhbGxhdGlvbnMsIG9ubHkgdGhlIHNlY29uZCBjb25kaXRpb24gaXMgbWV0CisjaWYgKCBkZWZpbmVkIF9fbGludXggKQorIyB1bmRlZiBLTVBfT1NfTElOVVgKKyMgZGVmaW5lIEtNUF9PU19MSU5VWCAxCisjZWxpZiAoIGRlZmluZWQgX19saW51eF9fKQorIyB1bmRlZiBLTVBfT1NfTElOVVgKKyMgZGVmaW5lIEtNUF9PU19MSU5VWCAxCisjZWxzZQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19GcmVlQlNEX18gKQorIyB1bmRlZiBLTVBfT1NfRlJFRUJTRAorIyBkZWZpbmUgS01QX09TX0ZSRUVCU0QgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19OZXRCU0RfXyApCisjIHVuZGVmIEtNUF9PU19ORVRCU0QKKyMgZGVmaW5lIEtNUF9PU19ORVRCU0QgMQorI2VuZGlmCisKKyNpZiAoIGRlZmluZWQgX19iZ3FfXyApCisjIHVuZGVmIEtNUF9PU19DTksKKyMgZGVmaW5lIEtNUF9PU19DTksgMQorI2VuZGlmCisKKyNpZiAoMSAhPSBLTVBfT1NfTElOVVggKyBLTVBfT1NfRlJFRUJTRCArIEtNUF9PU19ORVRCU0QgKyBLTVBfT1NfREFSV0lOICsgS01QX09TX1dJTkRPV1MpCisjIGVycm9yIFVua25vd24gT1MKKyNlbmRpZgorCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX0RBUldJTgorIyB1bmRlZiBLTVBfT1NfVU5JWAorIyBkZWZpbmUgS01QX09TX1VOSVggMQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gQXJjaGl0ZWN0dXJlIHJlY29nbml0aW9uIC0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2RlZmluZSBLTVBfQVJDSF9YODYgICAgICAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfWDg2XzY0ICAgICAwCisjZGVmaW5lIEtNUF9BUkNIX0FBUkNINjQgICAgMAorI2RlZmluZSBLTVBfQVJDSF9QUEM2NF9CRSAgIDAKKyNkZWZpbmUgS01QX0FSQ0hfUFBDNjRfTEUgICAwCisjZGVmaW5lIEtNUF9BUkNIX1BQQzY0IChLTVBfQVJDSF9QUEM2NF9MRSB8fCBLTVBfQVJDSF9QUEM2NF9CRSkKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGlmIGRlZmluZWQgX01fQU1ENjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsc2UKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVuZGlmCisjZW5kaWYKKworI2lmIEtNUF9PU19VTklYCisjIGlmIGRlZmluZWQgX194ODZfNjQKKyMgIHVuZGVmIEtNUF9BUkNIX1g4Nl82NAorIyAgZGVmaW5lIEtNUF9BUkNIX1g4Nl82NCAxCisjIGVsaWYgZGVmaW5lZCBfX2kzODYKKyMgIHVuZGVmIEtNUF9BUkNIX1g4NgorIyAgZGVmaW5lIEtNUF9BUkNIX1g4NiAxCisjIGVsaWYgZGVmaW5lZCBfX3Bvd2VycGM2NF9fCisjICBpZiBkZWZpbmVkIF9fTElUVExFX0VORElBTl9fCisjICAgdW5kZWYgS01QX0FSQ0hfUFBDNjRfTEUKKyMgICBkZWZpbmUgS01QX0FSQ0hfUFBDNjRfTEUgMQorIyAgZWxzZQorIyAgIHVuZGVmIEtNUF9BUkNIX1BQQzY0X0JFCisjICAgZGVmaW5lIEtNUF9BUkNIX1BQQzY0X0JFIDEKKyMgIGVuZGlmCisjIGVsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworIyAgdW5kZWYgS01QX0FSQ0hfQUFSQ0g2NAorIyAgZGVmaW5lIEtNUF9BUkNIX0FBUkNINjQgMQorIyBlbmRpZgorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fQVJNX0FSQ0hfN19fKSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF83Ul9fKSAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF83QV9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjcgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY3KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF82X18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF82Sl9fKSAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzZLX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzZaX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNlQyX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNlpLX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WNiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjYpICAgfHwgZGVmaW5lZChfX0FSTV9BUkNIXzVUX18pICB8fCBcCisgICAgZGVmaW5lZChfX0FSTV9BUkNIXzVFX18pICB8fCBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFX18pIHx8IFwKKyAgICBkZWZpbmVkKF9fQVJNX0FSQ0hfNVRFSl9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjUgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY1KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF80X18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF80VF9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjQgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVY0KSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF8zX18pICAgfHwgXAorICAgIGRlZmluZWQoX19BUk1fQVJDSF8zTV9fKQorIyBkZWZpbmUgS01QX0FSQ0hfQVJNVjMgMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKEtNUF9BUkNIX0FSTVYzKSAgIHx8IGRlZmluZWQoX19BUk1fQVJDSF8yX18pCisjIGRlZmluZSBLTVBfQVJDSF9BUk1WMiAxCisjZW5kaWYKKworI2lmIGRlZmluZWQoS01QX0FSQ0hfQVJNVjIpCisjIGRlZmluZSBLTVBfQVJDSF9BUk0gMQorI2VuZGlmCisKKyNpZiBkZWZpbmVkKF9fTUlDX18pIHx8IGRlZmluZWQoX19NSUMyX18pCisjIGRlZmluZSBLTVBfTUlDICAxCisjIGlmIF9fTUlDMl9fIHx8IF9fS05DX18KKyMgIGRlZmluZSBLTVBfTUlDMSAwCisjICBkZWZpbmUgS01QX01JQzIgMQorIyBlbHNlCisjICBkZWZpbmUgS01QX01JQzEgMQorIyAgZGVmaW5lIEtNUF9NSUMyIDAKKyMgZW5kaWYKKyNlbHNlCisjIGRlZmluZSBLTVBfTUlDICAwCisjIGRlZmluZSBLTVBfTUlDMSAwCisjIGRlZmluZSBLTVBfTUlDMiAwCisjZW5kaWYKKworLyogU3BlY2lmeSAzMiBiaXQgYXJjaGl0ZWN0dXJlcyBoZXJlICovCisjZGVmaW5lIEtNUF8zMl9CSVRfQVJDSCAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTSkKKworLy8gVE9ETzogRml4bWUgLSBUaGlzIGlzIGNsZXZlciwgYnV0IHJlYWxseSBmdWdseQorI2lmICgxICE9IEtNUF9BUkNIX1g4NiArIEtNUF9BUkNIX1g4Nl82NCArIEtNUF9BUkNIX0FSTSArIEtNUF9BUkNIX1BQQzY0ICsgS01QX0FSQ0hfQUFSQ0g2NCkKKyMgZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBhcmNoaXRlY3R1cmUKKyNlbmRpZgorCisjZW5kaWYgLy8gS01QX1BMQVRGT1JNX0gKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTgwYzUzMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfcnVudGltZS5jCkBAIC0wLDAgKzEsNzYxOCBAQAorLyoKKyAqIGttcF9ydW50aW1lLmMgLS0gS1BUUyBydW50aW1lIHN1cHBvcnQgbGlicmFyeQorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2F0b21pYy5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX3NldHRpbmdzLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfZXJyb3IuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLyogdGhlc2UgYXJlIHRlbXBvcmFyeSBpc3N1ZXMgdG8gYmUgZGVhbHQgd2l0aCAqLworI2RlZmluZSBLTVBfVVNFX1BSQ1RMIDAKKworI2lmIEtNUF9PU19XSU5ET1dTCisjaW5jbHVkZSA8cHJvY2Vzcy5oPgorI2VuZGlmCisKKworI2lmIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKQorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2FsdF9jb21wW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImFsdGVybmF0aXZlIGNvbXBpbGVyIHN1cHBvcnQ6IHllcyI7CisjZW5kaWYgLyogZGVmaW5lZChLTVBfR09NUF9DT01QQVQpICovCisKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggIkFQSSB2ZXJzaW9uOiAiCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAiNC4wICgyMDEzMDcpIjsKKyNlbHNlCisgICAgIjMuMSAoMjAxMTA3KSI7CisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xvY2tbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibG9jayB0eXBlOiBydW4gdGltZSBzZWxlY3RhYmxlIjsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworI2RlZmluZSBLTVBfTUlOKCB4LCB5ICkgKCAoeCkgPCAoeSkgPyAoeCkgOiAoeSkgKQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitrbXBfaW5mb190IF9fa21wX21vbml0b3I7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIEZvcndhcmQgZGVjbGFyYXRpb25zICovCisKK3ZvaWQgX19rbXBfY2xlYW51cCggdm9pZCApOworCitzdGF0aWMgdm9pZCBfX2ttcF9pbml0aWFsaXplX2luZm8oIGttcF9pbmZvX3QgKiwga21wX3RlYW1fdCAqLCBpbnQgdGlkLCBpbnQgZ3RpZCApOworc3RhdGljIHZvaWQgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCBrbXBfdGVhbV90ICogdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICogbG9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorc3RhdGljIHZvaWQgX19rbXBfcGFydGl0aW9uX3BsYWNlcygga21wX3RlYW1fdCAqdGVhbSwgaW50IHVwZGF0ZV9tYXN0ZXJfb25seT0wICk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICk7Cit2b2lkIF9fa21wX2ZvcmtfYmFycmllciggaW50IGd0aWQsIGludCB0aWQgKTsKK3ZvaWQgX19rbXBfam9pbl9iYXJyaWVyKCBpbnQgZ3RpZCApOwordm9pZCBfX2ttcF9zZXR1cF9pY3ZfY29weSgga21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld19ucHJvYywga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLCBpZGVudF90ICpsb2MgKTsKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKK3N0YXRpYyBpbnQgX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCBrbXBfcm9vdF90ICogcm9vdCwgaW50IHNldF9ucHJvYyApOworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfZXhwYW5kX3RocmVhZHMoaW50IG5XaXNoLCBpbnQgbk5lZWQpOworI2lmIEtNUF9PU19XSU5ET1dTCitzdGF0aWMgaW50IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoIGludCBndGlkICk7CisjZW5kaWYKK3N0YXRpYyB2b2lkIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeSggdm9pZCApOyAvLyBjYWxsZWQgYnkgX19rbXBfaW50ZXJuYWxfZW5kKCkKK3N0YXRpYyB2b2lkIF9fa21wX3JlYXBfdGhyZWFkKCBrbXBfaW5mb190ICogdGhyZWFkLCBpbnQgaXNfcm9vdCApOworc3RhdGljIGttcF9pbmZvX3QgKl9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENhbGN1bGF0ZSB0aGUgaWRlbnRpZmllciBvZiB0aGUgY3VycmVudCB0aHJlYWQgKi8KKy8qIGZhc3QgKGFuZCBzb21ld2hhdCBwb3J0YWJsZSkgd2F5IHRvIGdldCB1bmlxdWUgKi8KKy8qIGlkZW50aWZpZXIgb2YgZXhlY3V0aW5nIHRocmVhZC4gICAgICAgICAgICAgICAgKi8KKy8qIHJldHVybnMgS01QX0dUSURfRE5FIGlmIHdlIGhhdmVuJ3QgYmVlbiBhc3NpZ25lZCBhIGd0aWQgICAqLworCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCApCit7CisgICAgaW50IGk7CisgICAga21wX2luZm9fdCAgICoqb3RoZXJfdGhyZWFkczsKKyAgICBzaXplX3QgICAgICAgICBzdGFja19kYXRhOworICAgIGNoYXIgICAgICAgICAgKnN0YWNrX2FkZHI7CisgICAgc2l6ZV90ICAgICAgICAgc3RhY2tfc2l6ZTsKKyAgICBjaGFyICAgICAgICAgICpzdGFja19iYXNlOworCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogZW50ZXJpbmcsIG5wcm9jPSVkICBhbGxfbnByb2M9JWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbnRoLCBfX2ttcF9hbGxfbnRoICkpOworCisgICAgLyogSlBIIC0gdG8gaGFuZGxlIHRoZSBjYXNlIHdoZXJlIF9fa21wY19lbmQoMCkgaXMgY2FsbGVkIGltbWVkaWF0ZWx5IHByaW9yIHRvIGEKKyAgICAgICAgICAgICBwYXJhbGxlbCByZWdpb24sIG1hZGUgaXQgcmV0dXJuIEtNUF9HVElEX0RORSB0byBmb3JjZSBzZXJpYWxfaW5pdGlhbGl6ZSBieQorICAgICAgICAgICAgIGNhbGxlci4gIEhhZCB0byBoYW5kbGUgS01QX0dUSURfRE5FIGF0IGFsbCBjYWxsLXNpdGVzLCBvciBlbHNlIGd1YXJhbnRlZQorICAgICAgICAgICAgIF9fa21wX2luaXRfZ3RpZCBmb3IgdGhpcyB0byB3b3JrLiAgKi8KKworICAgIGlmICggIVRDUl80KF9fa21wX2luaXRfZ3RpZCkgKSByZXR1cm4gS01QX0dUSURfRE5FOworCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMykgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkOiB1c2luZyBUREFUQVxuIiApKTsKKyAgICAgICAgcmV0dXJuIF9fa21wX2d0aWQ7CisgICAgfQorI2VuZGlmCisgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpID49IDIpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICByZXR1cm4gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKworICAgIHN0YWNrX2FkZHIgICAgPSAoY2hhciopICYgc3RhY2tfZGF0YTsKKyAgICBvdGhlcl90aHJlYWRzID0gX19rbXBfdGhyZWFkczsKKworICAgIC8qCisgICAgICAgIEFUVDogVGhlIGNvZGUgYmVsb3cgaXMgYSBzb3VyY2Ugb2YgcG90ZW50aWFsIGJ1Z3MgZHVlIHRvIHVuc3luY2hyb25pemVkIGFjY2VzcyB0bworICAgICAgICBfX2ttcF90aHJlYWRzIGFycmF5LiBGb3IgZXhhbXBsZToKKyAgICAgICAgICAgIDEuIEN1cnJlbnQgdGhyZWFkIGxvYWRzIG90aGVyX3RocmVhZHNbaV0gdG8gdGhyIGFuZCBjaGVja3MgaXQsIGl0IGlzIG5vbi1OVUxMLgorICAgICAgICAgICAgMi4gQ3VycmVudCB0aHJlYWQgaXMgc3VzcGVuZGVkIGJ5IE9TLgorICAgICAgICAgICAgMy4gQW5vdGhlciB0aHJlYWQgdW5yZWdpc3RlcnMgYW5kIGZpbmlzaGVzIChkZWJ1ZyB2ZXJzaW9ucyBvZiBmcmVlKCkgbWF5IGZpbGwgbWVtb3J5CisgICAgICAgICAgICAgICB3aXRoIHNvbWV0aGluZyBsaWtlIDB4RUYpLgorICAgICAgICAgICAgNC4gQ3VycmVudCB0aHJlYWQgaXMgcmVzdW1lZC4KKyAgICAgICAgICAgIDUuIEN1cnJlbnQgdGhyZWFkIHJlYWRzIGp1bmsgZnJvbSAqdGhyLgorICAgICAgICBUT0RPOiBGaXggaXQuCisgICAgICAgIC0tbG4KKyAgICAqLworCisgICAgZm9yKCBpID0gMCA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgaSsrICkgeworCisgICAgICAgIGttcF9pbmZvX3QgKnRociA9IChrbXBfaW5mb190ICopVENSX1NZTkNfUFRSKG90aGVyX3RocmVhZHNbaV0pOworICAgICAgICBpZiggIXRociApIGNvbnRpbnVlOworCisgICAgICAgIHN0YWNrX3NpemUgPSAgKHNpemVfdClUQ1JfUFRSKHRoci0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUpOworICAgICAgICBzdGFja19iYXNlID0gIChjaGFyICopVENSX1BUUih0aHItPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKworICAgICAgICAvKiBzdGFjayBncm93cyBkb3duIC0tIHNlYXJjaCB0aHJvdWdoIGFsbCBvZiB0aGUgYWN0aXZlIHRocmVhZHMgKi8KKworICAgICAgICBpZiggc3RhY2tfYWRkciA8PSBzdGFja19iYXNlICkgeworICAgICAgICAgICAgc2l6ZV90IHN0YWNrX2RpZmYgPSBzdGFja19iYXNlIC0gc3RhY2tfYWRkcjsKKworICAgICAgICAgICAgaWYoIHN0YWNrX2RpZmYgPD0gc3RhY2tfc2l6ZSApIHsKKyAgICAgICAgICAgICAgICAvKiBUaGUgb25seSB3YXkgd2UgY2FuIGJlIGNsb3NlciB0aGFuIHRoZSBhbGxvY2F0ZWQgKi8KKyAgICAgICAgICAgICAgICAvKiBzdGFjayBzaXplIGlzIGlmIHdlIGFyZSBydW5uaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gaSApOworICAgICAgICAgICAgICAgIHJldHVybiBpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgLyogZ2V0IHNwZWNpZmljIHRvIHRyeSBhbmQgZGV0ZXJtaW5lIG91ciBndGlkICovCisgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZDogaW50ZXJuYWwgYWxnLiBmYWlsZWQgdG8gZmluZCAiCisgICAgICAgICAgICAgICAgICAgICAgInRocmVhZCwgdXNpbmcgVExTXG4iICkpOworICAgIGkgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworCisgICAgLypmcHJpbnRmKCBzdGRlcnIsICI9PT0gJWRcbiIsIGkgKTsgICovIC8qIEdST08gKi8KKworICAgIC8qIGlmIHdlIGhhdm4ndCBiZWVuIGFzc2lnbmVkIGEgZ3RpZCwgdGhlbiByZXR1cm4gY29kZSAqLworICAgIGlmKCBpPDAgKSByZXR1cm4gaTsKKworICAgIC8qIGR5bmFtaWNhbGx5IHVwZGF0ZWQgc3RhY2sgd2luZG93IGZvciB1YmVyIHRocmVhZHMgdG8gYXZvaWQgZ2V0X3NwZWNpZmljIGNhbGwgKi8KKyAgICBpZiggISBUQ1JfNChvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdykgKSB7CisgICAgICAgIEtNUF9GQVRBTCggU3RhY2tPdmVyZmxvdywgaSApOworICAgIH0KKworICAgIHN0YWNrX2Jhc2UgPSAoY2hhciAqKSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICBpZiggc3RhY2tfYWRkciA+IHN0YWNrX2Jhc2UgKSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsIHN0YWNrX2FkZHIpOworICAgICAgICBUQ1dfUFRSKG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplLAorICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplICsgc3RhY2tfYWRkciAtIHN0YWNrX2Jhc2UpOworICAgIH0gZWxzZSB7CisgICAgICAgIFRDV19QVFIob3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX2Jhc2UgLSBzdGFja19hZGRyKTsKKyAgICB9CisKKyAgICAvKiBSZXByaW50IHN0YWNrIGJvdW5kcyBmb3IgdWJlcm1hc3RlciBzaW5jZSB0aGV5IGhhdmUgYmVlbiByZWZpbmVkICovCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgY2hhciAqc3RhY2tfZW5kID0gKGNoYXIgKikgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2U7CisgICAgICAgIGNoYXIgKnN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tzaXplOworICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBpLCBzdGFja19iZWcsIHN0YWNrX2VuZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZCBzdGFjayAocmVmaW5lbWVudCkiLCBpICk7CisgICAgfQorICAgIHJldHVybiBpOworfQorCitpbnQKK19fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZyggKQoreworICAgIGludCBndGlkOworCisgICAgaWYgKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIGd0aWQgPSBLTVBfR1RJRF9ETkU7CisgICAgfSBlbHNlCisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBpZiAoIFRDUl80KF9fa21wX2d0aWRfbW9kZSkgPj0gMyApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwMDAsICggIioqKiBfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IHVzaW5nIFREQVRBXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZDsKKyAgICB9IGVsc2UKKyNlbmRpZgorICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA+PSAyICkgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcga2V5ZWQgVExTXG4iICkpOworICAgICAgICBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggMTAwMCwgKCAiKioqIF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZzogdXNpbmcgaW50ZXJuYWwgYWxnLlxuIiApKTsKKyAgICAgICAgZ3RpZCA9IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkKCk7CisgICAgfQorCisgICAgLyogd2UgbXVzdCBiZSBhIG5ldyB1YmVyIG1hc3RlciBzaWJsaW5nIHRocmVhZCAqLworICAgIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9nZXRfZ2xvYmFsX3RocmVhZF9pZF9yZWc6IEVuY291bnRlcmVkIG5ldyByb290IHRocmVhZC4gIgorICAgICAgICAgICAgICAgICAgICAgICAgIlJlZ2lzdGVyaW5nIGEgbmV3IGd0aWQuXG4iICkpOworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICBpZiggIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICAgICAgX19rbXBfZG9fc2VyaWFsX2luaXRpYWxpemUoKTsKKyAgICAgICAgICAgIGd0aWQgPSBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgZ3RpZCA9IF9fa21wX3JlZ2lzdGVyX3Jvb3QoRkFMU0UpOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIC8qX19rbXBfcHJpbnRmKCAiKysrICVkXG4iLCBndGlkICk7ICovIC8qIEdST08gKi8KKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBndGlkID49MCApOworCisgICAgcmV0dXJuIGd0aWQ7Cit9CisKKy8qIGNhbGxlciBtdXN0IGhvbGQgZm9ya2pvaW5fbG9jayAqLwordm9pZAorX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCgga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBmOworICAgIGNoYXIgKnN0YWNrX2JlZyA9IE5VTEw7CisgICAgY2hhciAqc3RhY2tfZW5kID0gTlVMTDsKKyAgICBpbnQgZ3RpZDsKKworICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogY2FsbGVkXG4iKSk7CisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgc3RhY2tfZW5kID0gKGNoYXIgKikgdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlOworICAgICAgICBzdGFja19iZWcgPSBzdGFja19lbmQgLSB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemU7CisKKyAgICAgICAgZ3RpZCA9IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoICk7CisKKyAgICAgICAgaWYgKGd0aWQgPT0gS01QX0dUSURfTU9OSVRPUikgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJXMgc3RhY2sgKCVzKSIsICJtb24iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICggdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tncm93ICkgPyAiaW5pdGlhbCIgOiAiYWN0dWFsIiApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgc3RhY2tfYmVnLCBzdGFja19lbmQsIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQgc3RhY2sgKCVzKSIsIGd0aWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCB0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3cgKSA/ICJpbml0aWFsIiA6ICJhY3R1YWwiICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvKiBObyBwb2ludCBpbiBjaGVja2luZyB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhleSB1c2UgcmVmaW5lbWVudCBhbmQgY2Fubm90IG92ZXJsYXAgKi8KKyAgICBndGlkID0gX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGggKTsKKyAgICBpZiAoIF9fa21wX2Vudl9jaGVja3MgPT0gVFJVRSAmJiAhS01QX1VCRVJfR1RJRChndGlkKSkKKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcGVyZm9ybWluZyBleHRlbnNpdmUgY2hlY2tpbmdcbiIpKTsKKyAgICAgICAgaWYgKCBzdGFja19iZWcgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YWNrX2VuZCA9IChjaGFyICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZTsKKyAgICAgICAgICAgIHN0YWNrX2JlZyA9IHN0YWNrX2VuZCAtIHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZTsKKyAgICAgICAgfQorCisgICAgICAgIGZvciggZj0wIDsgZiA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgOyBmKysgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190ICpmX3RoID0gKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tmXSk7CisKKyAgICAgICAgICAgIGlmKCBmX3RoICYmIGZfdGggIT0gdGggKSB7CisgICAgICAgICAgICAgICAgY2hhciAqb3RoZXJfc3RhY2tfZW5kID0gKGNoYXIgKilUQ1JfUFRSKGZfdGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlKTsKKyAgICAgICAgICAgICAgICBjaGFyICpvdGhlcl9zdGFja19iZWcgPSBvdGhlcl9zdGFja19lbmQgLQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSk7CisgICAgICAgICAgICAgICAgaWYoKHN0YWNrX2JlZyA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19iZWcgPCBvdGhlcl9zdGFja19lbmQpIHx8CisgICAgICAgICAgICAgICAgICAgKHN0YWNrX2VuZCA+IG90aGVyX3N0YWNrX2JlZyAmJiBzdGFja19lbmQgPCBvdGhlcl9zdGFja19lbmQpKSB7CisKKyAgICAgICAgICAgICAgICAgICAgLyogUHJpbnQgdGhlIG90aGVyIHN0YWNrIHZhbHVlcyBiZWZvcmUgdGhlIGFib3J0ICovCisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKQorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsIG90aGVyX3N0YWNrX2JlZywgb3RoZXJfc3RhY2tfZW5kLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIChzaXplX3QpVENSX1BUUihmX3RoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRoXyVkIHN0YWNrIChvdmVybGFwcGVkKSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggZl90aCApICk7CisKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFN0YWNrT3ZlcmxhcCApLCBLTVBfSE5UKCBDaGFuZ2VTdGFja0xpbWl0ICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDEwLCgiX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcDogcmV0dXJuaW5nXG4iKSk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9pbmZpbml0ZV9sb29wKCB2b2lkICkKK3sKKyAgICBzdGF0aWMgaW50IGRvbmUgPSBGQUxTRTsKKworICAgIHdoaWxlICghIGRvbmUpIHsKKyAgICAgICAgS01QX1lJRUxEKCAxICk7CisgICAgfQorfQorCisjZGVmaW5lIE1BWF9NRVNTQUdFICAgICA1MTIKKwordm9pZAorX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggaW50IGd0aWQsIHZvaWQgKnAxLCB2b2lkICpwMiwgc2l6ZV90IHNpemUsIGNoYXIgY29uc3QgKmZvcm1hdCwgLi4uKSB7CisgICAgY2hhciBidWZmZXJbTUFYX01FU1NBR0VdOworICAgIHZhX2xpc3QgYXA7CisKKyAgICB2YV9zdGFydCggYXAsIGZvcm1hdCk7CisgICAgS01QX1NOUFJJTlRGKCBidWZmZXIsIHNpemVvZihidWZmZXIpLCAiT01QIHN0b3JhZ2UgbWFwOiAlcCAlcCU4bHUgJXNcbiIsIHAxLCBwMiwgKHVuc2lnbmVkIGxvbmcpIHNpemUsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyNpZiBLTVBfUFJJTlRfREFUQV9QTEFDRU1FTlQKKyAgICBpbnQgbm9kZTsKKyAgICBpZihndGlkID49IDApIHsKKyAgICAgICAgaWYocDEgPD0gcDIgJiYgKGNoYXIqKXAyIC0gKGNoYXIqKXAxID09IHNpemUpIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlICkgeworICAgICAgICAgICAgICAgIG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKTsKKyAgICAgICAgICAgICAgICBpZihub2RlIDwgMCkgIC8qIGRvZXNuJ3Qgd29yaywgc28gZG9uJ3QgdHJ5IHRoaXMgbmV4dCB0aW1lICovCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqbGFzdDsKKyAgICAgICAgICAgICAgICAgICAgaW50IGxhc3ROb2RlOworICAgICAgICAgICAgICAgICAgICBpbnQgbG9jYWxQcm9jID0gX19rbXBfZ2V0X2NwdV9mcm9tX2d0aWQoZ3RpZCk7CisKKyAgICAgICAgICAgICAgICAgICAgcDEgPSAodm9pZCAqKSggKHNpemVfdClwMSAmIH4oKHNpemVfdClQQUdFX1NJWkUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBwMiA9ICh2b2lkICopKCAoKHNpemVfdCkgcDIgLSAxKSAmIH4oKHNpemVfdClQQUdFX1NJWkUgLSAxKSApOworICAgICAgICAgICAgICAgICAgICBpZihsb2NhbFByb2MgPj0gMCkKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgIEdUSUQgJWQgbG9jYWxOb2RlICVkXG4iLCBndGlkLCBsb2NhbFByb2M+PjEpOworICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICBHVElEICVkXG4iLCBndGlkKTsKKyMgaWYgS01QX1VTRV9QUkNUTAorLyogVGhlIG1vcmUgZWxhYm9yYXRlIGZvcm1hdCBpcyBkaXNhYmxlZCBmb3Igbm93IGJlY2F1c2Ugb2YgdGhlIHByY3RsIGhhbmdpbmcgYnVnLiAqLworICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0ID0gcDE7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0Tm9kZSA9IG5vZGU7CisgICAgICAgICAgICAgICAgICAgICAgICAvKiBUaGlzIGxvb3AgY29sbGF0ZXMgYWRqYWNlbnQgcGFnZXMgd2l0aCB0aGUgc2FtZSBob3N0IG5vZGUuICovCisgICAgICAgICAgICAgICAgICAgICAgICBkbyB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxICs9IFBBR0VfU0laRTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gd2hpbGUocDEgPD0gcDIgJiYgKG5vZGUgPSBfX2ttcF9nZXRfaG9zdF9ub2RlKHAxKSkgPT0gbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmX25vX2xvY2soIiAgICAlcC0lcCBtZW1Ob2RlICVkXG4iLCBsYXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGNoYXIqKXAxIC0gMSwgbGFzdE5vZGUpOworICAgICAgICAgICAgICAgICAgICB9IHdoaWxlKHAxIDw9IHAyKTsKKyMgZWxzZQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAgICVwLSVwIG1lbU5vZGUgJWRcbiIsIHAxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDEgKyAoUEFHRV9TSVpFIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDEpKTsKKyAgICAgICAgICAgICAgICAgICAgaWYocDEgPCBwMikgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3ByaW50Zl9ub19sb2NrKCIgICAgJXAtJXAgbWVtTm9kZSAlZFxuIiwgcDIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoY2hhciopcDIgKyAoUEFHRV9TSVpFIC0gMSksIF9fa21wX2dldF9ob3N0X25vZGUocDIpKTsKKyAgICAgICAgICAgICAgICAgICAgfQorIyBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBfX2ttcF9wcmludGZfbm9fbG9jaygiICAlc1xuIiwgS01QX0kxOE5fU1RSKCBTdG9yYWdlTWFwV2FybmluZyApICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9QUklOVF9EQVRBX1BMQUNFTUVOVCAqLworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworfQorCit2b2lkCitfX2ttcF93YXJuKCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKQoreworICAgIGNoYXIgYnVmZmVyW01BWF9NRVNTQUdFXTsKKyAgICB2YV9saXN0IGFwOworCisgICAgaWYgKCBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyA9PSBrbXBfd2FybmluZ3Nfb2ZmICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgdmFfc3RhcnQoIGFwLCBmb3JtYXQgKTsKKworICAgIEtNUF9TTlBSSU5URiggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSAsICJPTVAgd2FybmluZzogJXNcbiIsIGZvcm1hdCApOworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfc3RkaW9fbG9jayApOworICAgIF9fa21wX3ZwcmludGYoIGttcF9lcnIsIGJ1ZmZlciwgYXAgKTsKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3N0ZGlvX2xvY2sgKTsKKworICAgIHZhX2VuZCggYXAgKTsKK30KKwordm9pZAorX19rbXBfYWJvcnRfcHJvY2VzcygpCit7CisKKyAgICAvLyBMYXRlciB0aHJlYWRzIG1heSBzdGFsbCBoZXJlLCBidXQgdGhhdCdzIG9rIGJlY2F1c2UgYWJvcnQoKSB3aWxsIGtpbGwgdGhlbS4KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2V4aXRfbG9jayApOworCisgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggS01QX09TX1dJTkRPV1MgKSB7CisgICAgICAgIC8vIExldCBvdGhlciB0aHJlYWRzIGtub3cgb2YgYWJub3JtYWwgdGVybWluYXRpb24gYW5kIHByZXZlbnQgZGVhZGxvY2sKKyAgICAgICAgLy8gaWYgYWJvcnQgaGFwcGVuZWQgZHVyaW5nIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gb3Igc2h1dGRvd24KKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IFNJR0FCUlQ7CisKKyAgICAgICAgLyoKKyAgICAgICAgICAgIE9uIFdpbmRvd3MqIE9TIGJ5IGRlZmF1bHQgYWJvcnQoKSBjYXVzZXMgcG9wLXVwIGVycm9yIGJveCwgd2hpY2ggc3RhbGxzIG5pZ2h0bHkgdGVzdGluZy4KKyAgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHdlIGNhbm5vdCByZWxpYWJseSBzdXBwcmVzcyBwb3AtdXAgZXJyb3IgYm94ZXMuIF9zZXRfYWJvcnRfYmVoYXZpb3IoKQorICAgICAgICAgICAgd29ya3Mgd2VsbCwgYnV0IHRoaXMgZnVuY3Rpb24gaXMgbm90IGF2YWlsYWJsZSBpbiBWUzcgKHRoaXMgaXMgbm90IHByb2JsZW0gZm9yIERMTCwgYnV0CisgICAgICAgICAgICBpdCBpcyBhIHByb2JsZW0gZm9yIHN0YXRpYyBPcGVuTVAgUlRMKS4gU2V0RXJyb3JNb2RlIChhbmQgc28sIHRpbWVsaW1pdCB1dGlsaXR5KSBkb2VzCisgICAgICAgICAgICBub3QgaGVscCwgYXQgbGVhc3QgaW4gc29tZSB2ZXJzaW9ucyBvZiBNUyBDIFJUTC4KKworICAgICAgICAgICAgSXQgc2VlbXMgZm9sbG93aW5nIHNlcXVlbmNlIGlzIHRoZSBvbmx5IHdheSB0byBzaW11bGF0ZSBhYm9ydCgpIGFuZCBhdm9pZCBwb3AtdXAgZXJyb3IKKyAgICAgICAgICAgIGJveC4KKyAgICAgICAgKi8KKyAgICAgICAgcmFpc2UoIFNJR0FCUlQgKTsKKyAgICAgICAgX2V4aXQoIDMgKTsgICAgLy8gSnVzdCBpbiBjYXNlLCBpZiBzaWduYWwgaWdub3JlZCwgZXhpdCBhbnl3YXkuCisgICAgfSBlbHNlIHsKKyAgICAgICAgYWJvcnQoKTsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfaW5maW5pdGVfbG9vcCgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfZXhpdF9sb2NrICk7CisKK30gLy8gX19rbXBfYWJvcnRfcHJvY2VzcworCit2b2lkCitfX2ttcF9hYm9ydF90aHJlYWQoIHZvaWQgKQoreworICAgIC8vIFRPRE86IEVsaW1pbmF0ZSBnX2Fib3J0IGdsb2JhbCB2YXJpYWJsZSBhbmQgdGhpcyBmdW5jdGlvbi4KKyAgICAvLyBJbiBjYXNlIG9mIGFib3J0IGp1c3QgY2FsbCBhYm9ydCgpLCBpdCB3aWxsIGtpbGwgYWxsIHRoZSB0aHJlYWRzLgorICAgIF9fa21wX2luZmluaXRlX2xvb3AoKTsKK30gLy8gX19rbXBfYWJvcnRfdGhyZWFkCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogUHJpbnQgb3V0IHRoZSBzdG9yYWdlIG1hcCBmb3IgdGhlIG1ham9yIGttcF9pbmZvX3QgdGhyZWFkIGRhdGEgc3RydWN0dXJlcworICogdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIGttcF9pbmZvX3QgKnRociwgaW50IGd0aWQgKQoreworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsIHRociwgdGhyICsgMSwgc2l6ZW9mKGttcF9pbmZvX3QpLCAidGhfJWQiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9pbmZvLCAmdGhyLT50aC50aF90ZWFtLCBzaXplb2Yoa21wX2Rlc2NfdCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aF8lZC50aF9pbmZvIiwgZ3RpZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfbG9jYWwsICZ0aHItPnRoLnRoX3ByaV9oZWFkLCBzaXplb2Yoa21wX2xvY2FsX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAidGhfJWQudGhfbG9jYWwiLCBndGlkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCBndGlkLCAmdGhyLT50aC50aF9iYXJbMF0sICZ0aHItPnRoLnRoX2Jhcltic19sYXN0X2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSAqIGJzX2xhc3RfYmFycmllciwgInRoXyVkLnRoX2JhciIsIGd0aWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIGd0aWQsICZ0aHItPnRoLnRoX2Jhcltic19wbGFpbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3QpLCAidGhfJWQudGhfYmFyW3BsYWluXSIsIGd0aWQpOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX2Zvcmtqb2luX2JhcnJpZXJdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmdGhyLT50aC50aF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdCksICJ0aF8lZC50aF9iYXJbZm9ya2pvaW5dIiwgZ3RpZCk7CisKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJnRoci0+dGgudGhfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoci0+dGgudGhfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90KSwgInRoXyVkLnRoX2JhcltyZWR1Y3Rpb25dIiwgZ3RpZCk7CisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCit9CisKKy8qCisgKiBQcmludCBvdXQgdGhlIHN0b3JhZ2UgbWFwIGZvciB0aGUgbWFqb3Iga21wX3RlYW1fdCB0ZWFtIGRhdGEgc3RydWN0dXJlcworICogdGhhdCBhcmUgYWxsb2NhdGVkIHRvZ2V0aGVyLgorICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wcmludF90ZWFtX3N0b3JhZ2VfbWFwKCBjb25zdCBjaGFyICpoZWFkZXIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0ZWFtX2lkLCBpbnQgbnVtX3RociApCit7CisgICAgaW50IG51bV9kaXNwX2J1ZmYgPSB0ZWFtLT50LnRfbWF4X25wcm9jID4gMSA/IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzIDogMjsKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgdGVhbSwgdGVhbSArIDEsIHNpemVvZihrbXBfdGVhbV90KSwgIiVzXyVkIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbMF0sICZ0ZWFtLT50LnRfYmFyW2JzX2xhc3RfYmFycmllcl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCkgKiBic19sYXN0X2JhcnJpZXIsICIlc18lZC50X2JhciIsIGhlYWRlciwgdGVhbV9pZCApOworCisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF9iYXJbYnNfcGxhaW5fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXIrMV0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfYmFsaWduX3RlYW1fdCksICIlc18lZC50X2JhcltwbGFpbl0iLCBoZWFkZXIsIHRlYW1faWQgKTsKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19mb3Jram9pbl9iYXJyaWVyXSwgJnRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcisxXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9iYWxpZ25fdGVhbV90KSwgIiVzXyVkLnRfYmFyW2Zvcmtqb2luXSIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2Jhcltic19yZWR1Y3Rpb25fYmFycmllcl0sICZ0ZWFtLT50LnRfYmFyW2JzX3JlZHVjdGlvbl9iYXJyaWVyKzFdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yoa21wX2JhbGlnbl90ZWFtX3QpLCAiJXNfJWQudF9iYXJbcmVkdWN0aW9uXSIsIGhlYWRlciwgdGVhbV9pZCApOworICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcGF0Y2hbMF0sICZ0ZWFtLT50LnRfZGlzcGF0Y2hbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfZGlzcF90KSAqIG51bV90aHIsICIlc18lZC50X2Rpc3BhdGNoIiwgaGVhZGVyLCB0ZWFtX2lkICk7CisKKyAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKCAtMSwgJnRlYW0tPnQudF90aHJlYWRzWzBdLCAmdGVhbS0+dC50X3RocmVhZHNbbnVtX3Rocl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfaW5mb190ICopICogbnVtX3RociwgIiVzXyVkLnRfdGhyZWFkcyIsIGhlYWRlciwgdGVhbV9pZCApOworCisgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbMF0sICZ0ZWFtLT50LnRfZGlzcF9idWZmZXJbbnVtX2Rpc3BfYnVmZl0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihkaXNwYXRjaF9zaGFyZWRfaW5mb190KSAqIG51bV9kaXNwX2J1ZmYsICIlc18lZC50X2Rpc3BfYnVmZmVyIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaGVhZGVyLCB0ZWFtX2lkICk7CisKKworICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X3Rhc2txLCAmdGVhbS0+dC50X2NvcHlwcml2X2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVvZihrbXBfdGFza3FfdCksICIlc18lZC50X3Rhc2txIiwgaGVhZGVyLCB0ZWFtX2lkICk7Cit9CisKK3N0YXRpYyB2b2lkIF9fa21wX2luaXRfYWxsb2NhdG9yKCkge30KK3N0YXRpYyB2b2lkIF9fa21wX2ZpbmlfYWxsb2NhdG9yKCkge30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfRFlOQU1JQ19MSUIKKyMgaWYgS01QX09TX1dJTkRPV1MKKworc3RhdGljIHZvaWQKK19fa21wX3Jlc2V0X2xvY2soIGttcF9ib290c3RyYXBfbG9ja190KiBsY2sgKSB7CisgICAgLy8gVE9ETzogQ2hhbmdlIHRvIF9fa21wX2JyZWFrX2Jvb3RzdHJhcF9sb2NrKCkuCisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggbGNrICk7IC8vIG1ha2UgdGhlIGxvY2sgcmVsZWFzZWQKK30KKworc3RhdGljIHZvaWQKK19fa21wX3Jlc2V0X2xvY2tzX29uX3Byb2Nlc3NfZGV0YWNoKCBpbnQgZ3RpZF9yZXEgKSB7CisgICAgaW50IGk7CisgICAgaW50IHRocmVhZF9jb3VudDsKKworICAgIC8vIFBST0NFU1NfREVUQUNIIGlzIGV4cGVjdGVkIHRvIGJlIGNhbGxlZCBieSBhIHRocmVhZAorICAgIC8vIHRoYXQgZXhlY3V0ZXMgUHJvY2Vzc0V4aXQoKSBvciBGcmVlTGlicmFyeSgpLgorICAgIC8vIE9TIHRlcm1pbmF0ZXMgb3RoZXIgdGhyZWFkcyAoZXhjZXB0IHRoZSBvbmUgY2FsbGluZyBQcm9jZXNzRXhpdCBvciBGcmVlTGlicmFyeSkuCisgICAgLy8gU28sIGl0IG1pZ2h0IGJlIHNhZmUgdG8gYWNjZXNzIHRoZSBfX2ttcF90aHJlYWRzW10gd2l0aG91dCB0YWtpbmcgdGhlIGZvcmtqb2luX2xvY2suCisgICAgLy8gSG93ZXZlciwgaW4gZmFjdCwgc29tZSB0aHJlYWRzIGNhbiBiZSBzdGlsbCBhbGl2ZSBoZXJlLCBhbHRob3VnaCBiZWluZyBhYm91dCB0byBiZSB0ZXJtaW5hdGVkLgorICAgIC8vIFRoZSB0aHJlYWRzIGluIHRoZSBhcnJheSB3aXRoIGRzX3RocmVhZD09MCBhcmUgbW9zdCBzdXNwaWNpb3VzLgorICAgIC8vIEFjdHVhbGx5LCBpdCBjYW4gYmUgbm90IHNhZmUgdG8gYWNjZXNzIHRoZSBfX2ttcF90aHJlYWRzW10uCisKKyAgICAvLyBUT0RPOiBkb2VzIGl0IG1ha2Ugc2Vuc2UgdG8gY2hlY2sgX19rbXBfcm9vdHNbXSA/CisKKyAgICAvLyBMZXQncyBjaGVjayB0aGF0IHRoZXJlIGFyZSBubyBvdGhlciBhbGl2ZSB0aHJlYWRzIHJlZ2lzdGVyZWQgd2l0aCB0aGUgT01QIGxpYi4KKyAgICB3aGlsZSggMSApIHsKKyAgICAgICAgdGhyZWFkX2NvdW50ID0gMDsKKyAgICAgICAgZm9yKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSApIHsKKyAgICAgICAgICAgIGlmKCAhX19rbXBfdGhyZWFkcyApIGNvbnRpbnVlOworICAgICAgICAgICAga21wX2luZm9fdCogdGggPSBfX2ttcF90aHJlYWRzWyBpIF07CisgICAgICAgICAgICBpZiggdGggPT0gTlVMTCApIGNvbnRpbnVlOworICAgICAgICAgICAgaW50IGd0aWQgPSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgICAgICAgICAgaWYoIGd0aWQgPT0gZ3RpZF9yZXEgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmKCBndGlkIDwgMCApIGNvbnRpbnVlOworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisgICAgICAgICAgICBpbnQgYWxpdmUgPSBfX2ttcF9pc190aHJlYWRfYWxpdmUoIHRoLCAmZXhpdF92YWwgKTsKKyAgICAgICAgICAgIGlmKCBhbGl2ZSApIHsKKyAgICAgICAgICAgICsrdGhyZWFkX2NvdW50OworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmKCB0aHJlYWRfY291bnQgPT0gMCApIGJyZWFrOyAvLyBzdWNjZXNzCisgICAgfQorCisgICAgLy8gQXNzdW1lIHRoYXQgSSdtIGFsb25lLgorCisgICAgLy8gTm93IGl0IG1pZ2h0IGJlIHByb2JhYmx5IHNhZmUgdG8gY2hlY2sgYW5kIHJlc2V0IGxvY2tzLgorICAgIC8vIF9fa21wX2Zvcmtqb2luX2xvY2sgYW5kIF9fa21wX3N0ZGlvX2xvY2sgYXJlIGV4cGVjdGVkIHRvIGJlIHJlc2V0LgorICAgIF9fa21wX3Jlc2V0X2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIF9fa21wX3Jlc2V0X2xvY2soICZfX2ttcF9zdGRpb19sb2NrICk7CisgICAgI2VuZGlmIC8vIEtNUF9ERUJVRworfQorCitCT09MIFdJTkFQSQorRGxsTWFpbiggSElOU1RBTkNFIGhJbnN0RExMLCBEV09SRCBmZHdSZWFzb24sIExQVk9JRCBscFJlc2VydmVkICkgeworICAgIC8vX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIHN3aXRjaCggZmR3UmVhc29uICkgeworCisgICAgICAgIGNhc2UgRExMX1BST0NFU1NfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFBST0NFU1NfQVRUQUNIXG4iICkpOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9QUk9DRVNTX0RFVEFDSDoKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJEbGxNYWluOiBQUk9DRVNTX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgaWYoIGxwUmVzZXJ2ZWQgIT0gTlVMTCApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgLy8gbHBSZXNlcnZlZCBpcyB1c2VkIGZvciB0ZWxsaW5nIHRoZSBkaWZmZXJlbmNlOgorICAgICAgICAgICAgICAgIC8vICBscFJlc2VydmVkID09IE5VTEwgd2hlbiBGcmVlTGlicmFyeSgpIHdhcyBjYWxsZWQsCisgICAgICAgICAgICAgICAgLy8gIGxwUmVzZXJ2ZWQgIT0gTlVMTCB3aGVuIHRoZSBwcm9jZXNzIHRlcm1pbmF0ZXMuCisgICAgICAgICAgICAgICAgLy8gV2hlbiBGcmVlTGlicmFyeSgpIGlzIGNhbGxlZCwgd29ya2VyIHRocmVhZHMgcmVtYWluIGFsaXZlLgorICAgICAgICAgICAgICAgIC8vIFNvIHRoZXkgd2lsbCByZWxlYXNlIHRoZSBmb3Jram9pbiBsb2NrIGJ5IHRoZW1zZWx2ZXMuCisgICAgICAgICAgICAgICAgLy8gV2hlbiB0aGUgcHJvY2VzcyB0ZXJtaW5hdGVzLCB3b3JrZXIgdGhyZWFkcyBkaXNhcHBlYXIgdHJpZ2dlcmluZworICAgICAgICAgICAgICAgIC8vIHRoZSBwcm9ibGVtIG9mIHVucmVsZWFzZWQgZm9ya2pvaW4gbG9jayBhcyBkZXNjcmliZWQgYmVsb3cuCisKKyAgICAgICAgICAgICAgICAvLyBBIHdvcmtlciB0aHJlYWQgY2FuIHRha2UgdGhlIGZvcmtqb2luIGxvY2suCisgICAgICAgICAgICAgICAgLy8gVGhlIHByb2JsZW0gY29tZXMgdXAgaWYgdGhhdCB3b3JrZXIgdGhyZWFkIGJlY29tZXMgZGVhZAorICAgICAgICAgICAgICAgIC8vIGJlZm9yZSBpdCByZWxlYXNlcyB0aGUgZm9ya2pvaW4gbG9jay4KKyAgICAgICAgICAgICAgICAvLyBUaGUgZm9ya2pvaW4gbG9jayByZW1haW5zIHRha2VuLCB3aGlsZSB0aGUgdGhyZWFkCisgICAgICAgICAgICAgICAgLy8gZXhlY3V0aW5nIERsbE1haW4oKS0+UFJPQ0VTU19ERVRBQ0gtPl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5KCkgYmVsb3cKKyAgICAgICAgICAgICAgICAvLyB3aWxsIHRyeSB0byB0YWtlIHRoZSBmb3Jram9pbiBsb2NrIGFuZCB3aWxsIGFsd2F5cyBmYWlsLAorICAgICAgICAgICAgICAgIC8vIHNvIHRoYXQgdGhlIGFwcGxpY2F0aW9uIHdpbGwgbmV2ZXIgZmluaXNoIFtub3JtYWxseV0uCisgICAgICAgICAgICAgICAgLy8gVGhpcyBzY2VuYXJpbyBpcyBwb3NzaWJsZSBpZiBfX2ttcGNfZW5kKCkgaGFzIG5vdCBiZWVuIGV4ZWN1dGVkLgorICAgICAgICAgICAgICAgIC8vIEl0IGxvb2tzIGxpa2UgaXQncyBub3QgYSBjb3JuZXIgY2FzZSwgYnV0IGNvbW1vbiBjYXNlczoKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBhbiBhbHRlcm5hdGl2ZSBjb21waWxlcjsKKyAgICAgICAgICAgICAgICAvLyAtIHRoZSBtYWluIGZ1bmN0aW9uIHdhcyBjb21waWxlZCBieSBpY2wgYnV0IHdpdGhvdXQgL1FvcGVubXAgKGFwcGxpY2F0aW9uIHdpdGggcGx1Z2lucyk7CisgICAgICAgICAgICAgICAgLy8gLSBhcHBsaWNhdGlvbiB0ZXJtaW5hdGVzIGJ5IGNhbGxpbmcgQyBleGl0KCksIEZvcnRyYW4gQ0FMTCBFWElUKCkgb3IgRm9ydHJhbiBTVE9QLgorICAgICAgICAgICAgICAgIC8vIC0gYWxpdmUgZm9yZWlnbiB0aHJlYWQgcHJldmVudGVkIF9fa21wY19lbmQgZnJvbSBkb2luZyBjbGVhbnVwLgorCisgICAgICAgICAgICAgICAgLy8gVGhpcyBpcyBhIGhhY2sgdG8gd29yayBhcm91bmQgdGhlIHByb2JsZW0uCisgICAgICAgICAgICAgICAgLy8gVE9ETzogISEhIHRvIGZpZ3VyZSBvdXQgc29tZXRoaW5nIGJldHRlci4KKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNldF9sb2Nrc19vbl9wcm9jZXNzX2RldGFjaCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworCisgICAgICAgICAgICByZXR1cm4gVFJVRTsKKworICAgICAgICBjYXNlIERMTF9USFJFQURfQVRUQUNIOgorICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIkRsbE1haW46IFRIUkVBRF9BVFRBQ0hcbiIgKSk7CisKKyAgICAgICAgICAgIC8qIGlmIHdlIHdhbnRlZCB0byByZWdpc3RlciBuZXcgc2libGluZ3MgYWxsIHRoZSB0aW1lIGhlcmUgY2FsbAorICAgICAgICAgICAgICogX19rbXBfZ2V0X2d0aWQoKTsgKi8KKyAgICAgICAgICAgIHJldHVybiBUUlVFOworCisgICAgICAgIGNhc2UgRExMX1RIUkVBRF9ERVRBQ0g6CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiRGxsTWFpbjogVEhSRUFEX0RFVEFDSCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApKTsKKworICAgICAgICAgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKSApOworICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgfQorCisgICAgcmV0dXJuIFRSVUU7Cit9CisKKyMgZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyNlbmRpZiAvKiBLTVBfRFlOQU1JQ19MSUIgKi8KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogQ2hhbmdlIHRoZSBsaWJyYXJ5IHR5cGUgdG8gInN0YXR1cyIgYW5kIHJldHVybiB0aGUgb2xkIHR5cGUgKi8KKy8qIGNhbGxlZCBmcm9tIHdpdGhpbiBpbml0aWFsaXphdGlvbiByb3V0aW5lcyB3aGVyZSBfX2ttcF9pbml0el9sb2NrIGlzIGhlbGQgKi8KK2ludAorX19rbXBfY2hhbmdlX2xpYnJhcnkoIGludCBzdGF0dXMgKQoreworICAgIGludCBvbGRfc3RhdHVzOworCisgICAgb2xkX3N0YXR1cyA9IF9fa21wX3lpZWxkX2luaXQgJiAxOyAgLy8gY2hlY2sgd2hldGhlciBLTVBfTElCUkFSWT10aHJvdWdocHV0IChldmVuIGluaXQgY291bnQpCisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIF9fa21wX3lpZWxkX2luaXQgfD0gMTsgIC8vIHRocm91Z2hwdXQgPT4gdHVybmFyb3VuZCAob2RkIGluaXQgY291bnQpCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZF9pbml0ICY9IH4xOyAvLyB0dXJuYXJvdW5kID0+IHRocm91Z2hwdXQgKGV2ZW4gaW5pdCBjb3VudCkKKyAgICB9CisKKyAgICByZXR1cm4gb2xkX3N0YXR1czsgIC8vIHJldHVybiBwcmV2aW91cyBzZXR0aW5nIG9mIHdoZXRoZXIgS01QX0xJQlJBUlk9dGhyb3VnaHB1dAorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBfX2ttcF9wYXJhbGxlbF9kZW8gLS0KKyAqIFdhaXQgdW50aWwgaXQncyBvdXIgdHVybi4KKyAqLwordm9pZAorX19rbXBfcGFyYWxsZWxfZGVvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCBndGlkID0gKmd0aWRfcmVmOworI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gX19rbXBfdGVhbV9mcm9tX2d0aWQoIGd0aWQgKTsKKyNlbmRpZiAvKiBCVUlMRF9QQVJBTExFTF9PUkRFUkVEICovCisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfcm9vdC0+ci5yX2FjdGl2ZSApCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCwgMCApOworI2Vsc2UKKyAgICAgICAgICAgIF9fa21wX3B1c2hfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl9wYXJhbGxlbCwgbG9jX3JlZiwgTlVMTCApOworI2VuZGlmCisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiggIXRlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUsIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSwgS01QX0VRLCBOVUxMKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogX19rbXBfcGFyYWxsZWxfZHhvIC0tCisgKiBTaWduYWwgdGhlIG5leHQgdGFzay4KKyAqLworCit2b2lkCitfX2ttcF9wYXJhbGxlbF9keG8oIGludCAqZ3RpZF9yZWYsIGludCAqY2lkX3JlZiwgaWRlbnRfdCAqbG9jX3JlZiApCit7CisgICAgaW50IGd0aWQgPSAqZ3RpZF9yZWY7CisjaWZkZWYgQlVJTERfUEFSQUxMRUxfT1JERVJFRAorICAgIGludCB0aWQgPSAgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSBfX2ttcF90ZWFtX2Zyb21fZ3RpZCggZ3RpZCApOworI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIGlmKCBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290LT5yLnJfYWN0aXZlICkKKyAgICAgICAgICAgIF9fa21wX3BvcF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3BhcmFsbGVsLCBsb2NfcmVmICk7CisgICAgfQorI2lmZGVmIEJVSUxEX1BBUkFMTEVMX09SREVSRUQKKyAgICBpZiAoICEgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIHVzZSB0aGUgdGlkIG9mIHRoZSBuZXh0IHRocmVhZCBpbiB0aGlzIHRlYW0gKi8KKyAgICAgICAgLyogVE9ETyByZXBsZWFjZSB3aXRoIGdlbmVyYWwgcmVsZWFzZSBwcm9jZWR1cmUgKi8KKyAgICAgICAgdGVhbS0+dC50X29yZGVyZWQuZHQudF92YWx1ZSA9ICgodGlkICsgMSkgJSB0ZWFtLT50LnRfbnByb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX0JMQU1FCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9yZWxlYXNlX29yZGVyZWQpKSB7CisgICAgICAgICAgICAvKiBhY2NlcHQgYmxhbWUgZm9yICJvcmRlcmVkIiB3YWl0aW5nICovCisgICAgICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RocmVhZCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcmVsZWFzZV9vcmRlcmVkKSgKKyAgICAgICAgICAgICAgICB0aGlzX3RocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1BBUkFMTEVMX09SREVSRUQgKi8KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogVGhlIEJBUlJJRVIgZm9yIGEgU0lOR0xFIHByb2Nlc3Mgc2VjdGlvbiBpcyBhbHdheXMgZXhwbGljaXQgICAqLworCitpbnQKK19fa21wX2VudGVyX3NpbmdsZSggaW50IGd0aWQsIGlkZW50X3QgKmlkX3JlZiwgaW50IHB1c2hfd3MgKQoreworICAgIGludCBzdGF0dXM7CisgICAga21wX2luZm9fdCAqdGg7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKworICAgIGlmKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkKKyAgICAgICAgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSgpOworCisgICAgdGggICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgc3RhdHVzID0gMDsKKworICAgIHRoLT50aC50aF9pZGVudCA9IGlkX3JlZjsKKworICAgIGlmICggdGVhbS0+dC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIHN0YXR1cyA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAga21wX2ludDMyIG9sZF90aGlzID0gdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworCisgICAgICAgICsrdGgtPnRoLnRoX2xvY2FsLnRoaXNfY29uc3RydWN0OworICAgICAgICAvKiB0cnkgdG8gc2V0IHRlYW0gY291bnQgdG8gdGhyZWFkIGNvdW50LS1zdWNjZXNzIG1lYW5zIHRocmVhZCBnb3QgdGhlCisgICAgICAgICAgIHNpbmdsZSBibG9jaworICAgICAgICAqLworICAgICAgICAvKiBUT0RPOiBTaG91bGQgdGhpcyBiZSBhY3F1aXJlIG9yIHJlbGVhc2U/ICovCisgICAgICAgIGlmICh0ZWFtLT50LnRfY29uc3RydWN0ID09IG9sZF90aGlzKSB7CisgICAgICAgICAgICBzdGF0dXMgPSBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfQUNRMzIoJnRlYW0tPnQudF9jb25zdHJ1Y3QsIG9sZF90aGlzLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdCk7CisgICAgICAgIH0KKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICYmIEtNUF9NQVNURVJfR1RJRChndGlkKSAmJgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrID09IE5VTEwgJiYKKyNlbmRpZgorICAgICAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxICkKKyAgICAgICAgeyAgIC8vIE9ubHkgcmVwb3J0IG1ldGFkYXRhIGJ5IG1hc3RlciBvZiBhY3RpdmUgdGVhbSBhdCBsZXZlbCAxCisgICAgICAgICAgICBfX2ttcF9pdHRfbWV0YWRhdGFfc2luZ2xlKCBpZF9yZWYgKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICB9CisKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoc3RhdHVzICYmIHB1c2hfd3MpIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBndGlkLCBjdF9wc2luZ2xlLCBpZF9yZWYgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX2NoZWNrX3dvcmtzaGFyZSggZ3RpZCwgY3RfcHNpbmdsZSwgaWRfcmVmICk7CisgICAgICAgIH0KKyAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBfX2ttcF9pdHRfc2luZ2xlX3N0YXJ0KCBndGlkICk7CisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICByZXR1cm4gc3RhdHVzOworfQorCit2b2lkCitfX2ttcF9leGl0X3NpbmdsZSggaW50IGd0aWQgKQoreworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc2luZ2xlX2VuZCggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ3RpZCwgY3RfcHNpbmdsZSwgTlVMTCApOworfQorCisKKy8qCisgKiBkZXRlcm1pbmUgaWYgd2UgY2FuIGdvIHBhcmFsbGVsIG9yIG11c3QgdXNlIGEgc2VyaWFsaXplZCBwYXJhbGxlbCByZWdpb24gYW5kCisgKiBob3cgbWFueSB0aHJlYWRzIHdlIGNhbiB1c2UKKyAqIHNldF9ucHJvYyBpcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgcmVxdWVzdGVkIGZvciB0aGUgdGVhbQorICogcmV0dXJucyAwIGlmIHdlIHNob3VsZCBzZXJpYWxpemUgb3Igb25seSB1c2Ugb25lIHRocmVhZCwKKyAqIG90aGVyd2lzZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgdG8gdXNlCisgKiBUaGUgZm9ya2pvaW4gbG9jayBpcyBoZWxkIGJ5IHRoZSBjYWxsZXIuCisgKi8KK3N0YXRpYyBpbnQKK19fa21wX3Jlc2VydmVfdGhyZWFkcygga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqcGFyZW50X3RlYW0sCisgICBpbnQgbWFzdGVyX3RpZCwgaW50IHNldF9udGhyZWFkcworI2lmIE9NUF80MF9FTkFCTEVECisgICwgaW50IGVudGVyX3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKykKK3sKKyAgICBpbnQgY2FwYWNpdHk7CisgICAgaW50IG5ld19udGhyZWFkczsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgJiYgcGFyZW50X3RlYW0gKTsKKworICAgIC8vCisgICAgLy8gSWYgZHluLXZhciBpcyBzZXQsIGR5bmFtaWNhbGx5IGFkanVzdCB0aGUgbnVtYmVyIG9mIGRlc2lyZWQgdGhyZWFkcywKKyAgICAvLyBhY2NvcmRpbmcgdG8gdGhlIG1ldGhvZCBzcGVjaWZpZWQgYnkgZHluYW1pY19tb2RlLgorICAgIC8vCisgICAgbmV3X250aHJlYWRzID0gc2V0X250aHJlYWRzOworICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKSApIHsKKyAgICAgICAgOworICAgIH0KKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfbG9hZF9iYWxhbmNlICkgeworICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoIHJvb3QsIHNldF9udGhyZWFkcyApOworICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA9PSAxICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgbG9hZCBiYWxhbmNlIHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gMSB0aHJlYWRcbiIsCisgICAgICAgICAgICAgIG1hc3Rlcl90aWQgKSk7CisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA8IHNldF9udGhyZWFkcyApIHsKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGxvYWQgYmFsYW5jZSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgIG1hc3Rlcl90aWQsIG5ld19udGhyZWFkcyApKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfdGhyZWFkX2xpbWl0ICkgeworICAgICAgICBuZXdfbnRocmVhZHMgPSBfX2ttcF9hdmFpbF9wcm9jIC0gX19rbXBfbnRoICsgKHJvb3QtPnIucl9hY3RpdmUgPyAxCisgICAgICAgICAgOiByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyk7CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDw9IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCB0aHJlYWQgbGltaXQgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIGlmICggbmV3X250aHJlYWRzIDwgc2V0X250aHJlYWRzICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgdGhyZWFkIGxpbWl0IHJlZHVjZWQgcmVzZXJ2YXRpb24gdG8gJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCwgbmV3X250aHJlYWRzICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgbmV3X250aHJlYWRzID0gc2V0X250aHJlYWRzOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3JhbmRvbSApIHsKKyAgICAgICAgaWYgKCBzZXRfbnRocmVhZHMgPiAyICkgeworICAgICAgICAgICAgbmV3X250aHJlYWRzID0gX19rbXBfZ2V0X3JhbmRvbSggcGFyZW50X3RlYW0tPnQudF90aHJlYWRzW21hc3Rlcl90aWRdICk7CisgICAgICAgICAgICBuZXdfbnRocmVhZHMgPSAoIG5ld19udGhyZWFkcyAlIHNldF9udGhyZWFkcyApICsgMTsKKyAgICAgICAgICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZXNlcnZlX3RocmVhZHM6IFQjJWQgZHluYW1pYyByYW5kb20gcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aWQgKSk7CisgICAgICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG5ld19udGhyZWFkcyA8IHNldF9udGhyZWFkcyApIHsKKyAgICAgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBkeW5hbWljIHJhbmRvbSByZWR1Y2VkIHJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGlkLCBuZXdfbnRocmVhZHMgKSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKyAgICB9CisKKyAgICAvLworICAgIC8vIFJlc3BlY3QgS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIE9NUF9USFJFQURfTElNSVQuCisgICAgLy8KKyAgICBpZiAoIF9fa21wX250aCArIG5ld19udGhyZWFkcyAtICggcm9vdC0+ci5yX2FjdGl2ZSA/IDEgOgorICAgICAgcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MgKSA+IF9fa21wX21heF9udGggKSB7CisgICAgICAgIGludCB0bF9udGhyZWFkcyA9IF9fa21wX21heF9udGggLSBfX2ttcF9udGggKyAoIHJvb3QtPnIucl9hY3RpdmUgPyAxIDoKKyAgICAgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApOworICAgICAgICBpZiAoIHRsX250aHJlYWRzIDw9IDAgKSB7CisgICAgICAgICAgICB0bF9udGhyZWFkcyA9IDE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBJZiBkeW4tdmFyIGlzIGZhbHNlLCBlbWl0IGEgMS10aW1lIHdhcm5pbmcuCisgICAgICAgIC8vCisgICAgICAgIGlmICggISBnZXRfX2R5bmFtaWNfMiggcGFyZW50X3RlYW0sIG1hc3Rlcl90aWQgKQorICAgICAgICAgICYmICggISBfX2ttcF9yZXNlcnZlX3dhcm4gKSApIHsKKyAgICAgICAgICAgIF9fa21wX3Jlc2VydmVfd2FybiA9IDE7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEZvcm1UaHJUZWFtLCBzZXRfbnRocmVhZHMsIHRsX250aHJlYWRzICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggVW5zZXRfQUxMX1RIUkVBRFMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHRsX250aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3Jlc2VydmVfdGhyZWFkczogVCMlZCBLTVBfQUxMX1RIUkVBRFMgcmVkdWNlZCByZXNlcnZhdGlvbiB0byAxIHRocmVhZFxuIiwKKyAgICAgICAgICAgICAgbWFzdGVyX3RpZCApKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIEtNUF9BTExfVEhSRUFEUyByZWR1Y2VkIHJlc2VydmF0aW9uIHRvICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgbWFzdGVyX3RpZCwgdGxfbnRocmVhZHMgKSk7CisgICAgICAgIG5ld19udGhyZWFkcyA9IHRsX250aHJlYWRzOworICAgIH0KKworICAgIC8vCisgICAgLy8gQ2hlY2sgaWYgdGhlIHRocmVhZHMgYXJyYXkgaXMgbGFyZ2UgZW5vdWdoLCBvciBuZWVkcyBleHBhbmRpbmcuCisgICAgLy8KKyAgICAvLyBTZWUgY29tbWVudCBpbiBfX2ttcF9yZWdpc3Rlcl9yb290KCkgYWJvdXQgdGhlIGFkanVzdG1lbnQgaWYKKyAgICAvLyBfX2ttcF90aHJlYWRzWzBdID09IE5VTEwuCisgICAgLy8KKyAgICBjYXBhY2l0eSA9IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgaWYgKCBUQ1JfUFRSKF9fa21wX3RocmVhZHNbMF0pID09IE5VTEwgKSB7CisgICAgICAgIC0tY2FwYWNpdHk7CisgICAgfQorICAgIGlmICggX19rbXBfbnRoICsgbmV3X250aHJlYWRzIC0gKCByb290LT5yLnJfYWN0aXZlID8gMSA6CisgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApID4gY2FwYWNpdHkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIEV4cGFuZCB0aGUgdGhyZWFkcyBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgaW50IHNsb3RzUmVxdWlyZWQgPSBfX2ttcF9udGggKyBuZXdfbnRocmVhZHMgLSAoIHJvb3QtPnIucl9hY3RpdmUgPyAxIDoKKyAgICAgICAgICByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyApIC0gY2FwYWNpdHk7CisgICAgICAgIGludCBzbG90c0FkZGVkID0gX19rbXBfZXhwYW5kX3RocmVhZHMoc2xvdHNSZXF1aXJlZCwgc2xvdHNSZXF1aXJlZCk7CisgICAgICAgIGlmICggc2xvdHNBZGRlZCA8IHNsb3RzUmVxdWlyZWQgKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gVGhlIHRocmVhZHMgYXJyYXkgd2FzIG5vdCBleHBhbmRlZCBlbm91Z2guCisgICAgICAgICAgICAvLworICAgICAgICAgICAgbmV3X250aHJlYWRzIC09ICggc2xvdHNSZXF1aXJlZCAtIHNsb3RzQWRkZWQgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIG5ld19udGhyZWFkcyA+PSAxICk7CisKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBJZiBkeW4tdmFyIGlzIGZhbHNlLCBlbWl0IGEgMS10aW1lIHdhcm5pbmcuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAhIGdldF9fZHluYW1pY18yKCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCApCisgICAgICAgICAgICAgICYmICggISBfX2ttcF9yZXNlcnZlX3dhcm4gKSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAxOworICAgICAgICAgICAgICAgIGlmICggX19rbXBfdHBfY2FjaGVkICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgc2V0X250aHJlYWRzLCBuZXdfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFNldF9BTExfVEhSRUFEUFJJVkFURSwgX19rbXBfdHBfY2FwYWNpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRGb3JtVGhyVGVhbSwgc2V0X250aHJlYWRzLCBuZXdfbnRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIFN5c3RlbUxpbWl0T25UaHJlYWRzICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKworICAgIGlmICggbmV3X250aHJlYWRzID09IDEgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIHNlcmlhbGl6aW5nIHRlYW0gYWZ0ZXIgcmVjbGFpbWluZyBkZWFkIHJvb3RzIGFuZCByZWNoZWNraW5nOyByZXF1ZXN0ZWQgJWQgdGhyZWFkc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIHNldF9udGhyZWFkcyApICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVzZXJ2ZV90aHJlYWRzOiBUIyVkIGFsbG9jYXRpbmcgJWQgdGhyZWFkczsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld19udGhyZWFkcywgc2V0X250aHJlYWRzICkpOworICAgIHJldHVybiBuZXdfbnRocmVhZHM7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIGFsbG9jYXRlIHRocmVhZHMgZnJvbSB0aGUgdGhyZWFkIHBvb2wgYW5kIGFzc2lnbiB0aGVtIHRvIHRoZSBuZXcgdGVhbSAqLworLyogd2UgYXJlIGFzc3VyZWQgdGhhdCB0aGVyZSBhcmUgZW5vdWdoIHRocmVhZHMgYXZhaWxhYmxlLCBiZWNhdXNlIHdlCisgKiBjaGVja2VkIG9uIHRoYXQgZWFybGllciB3aXRoaW4gY3JpdGljYWwgc2VjdGlvbiBmb3Jram9pbiAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZm9ya190ZWFtX3RocmVhZHMoIGttcF9yb290X3QgKnJvb3QsIGttcF90ZWFtX3QgKnRlYW0sCisgICAgICAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqbWFzdGVyX3RoLCBpbnQgbWFzdGVyX2d0aWQgKQoreworICAgIGludCAgICAgICAgIGk7CisgICAgaW50IHVzZV9ob3RfdGVhbTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9mb3JrX3RlYW1fdGhyZWFkczogbmV3X25wcm9jcyA9ICVkXG4iLCB0ZWFtLT50LnRfbnByb2MgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1hc3Rlcl9ndGlkID09IF9fa21wX2dldF9ndGlkKCkgKTsKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIGZpcnN0LCBsZXQncyBzZXR1cCB0aGUgbWFzdGVyIHRocmVhZCAqLworICAgIG1hc3Rlcl90aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gMDsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gICAgICAgICAgICA9IHRlYW07CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jICAgICAgPSB0ZWFtLT50LnRfbnByb2M7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX21hc3RlciAgICAgPSBtYXN0ZXJfdGg7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSBGQUxTRTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2Rpc3BhdGNoICAgICAgICA9ICYgdGVhbS0+dC50X2Rpc3BhdGNoWyAwIF07CisKKyAgICAvKiBtYWtlIHN1cmUgd2UgYXJlIG5vdCB0aGUgb3B0aW1pemVkIGhvdCB0ZWFtICovCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICB1c2VfaG90X3RlYW0gPSAwOworICAgIGttcF9ob3RfdGVhbV9wdHJfdCAqaG90X3RlYW1zID0gbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXM7CisgICAgaWYoIGhvdF90ZWFtcyApIHsgIC8vIGhvdCB0ZWFtcyBhcnJheSBpcyBub3QgYWxsb2NhdGVkIGlmIEtNUF9IT1RfVEVBTVNfTUFYX0xFVkVMPTAKKyAgICAgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCAtIDE7ICAgIC8vIGluZGV4IGluIGFycmF5IG9mIGhvdCB0ZWFtcworICAgICAgICBpZiggbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgIC8vIGFyZSB3ZSBpbnNpZGUgdGhlIHRlYW1zPworICAgICAgICAgICAgaWYoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXMgPiAxICkgeworICAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWwgPT0gdGVhbS0+dC50X2xldmVsICkgeworICAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl93b3JrZXJzIGJlZm9yZSB0aGUgcGFyYWxsZWwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAvLyB0ZWFtLT50LnRfbGV2ZWwgd2lsbCBiZSBpbmNyZWFzZWQgaW5zaWRlIHBhcmFsbGVsCisgICAgICAgIH0KKyAgICAgICAgaWYoIGxldmVsIDwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCApIHsKKyAgICAgICAgICAgIGlmKCBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICkgeworICAgICAgICAgICAgICAgIC8vIGhvdCB0ZWFtIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkIGZvciBnaXZlbiBsZXZlbAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSA9PSB0ZWFtKTsKKyAgICAgICAgICAgICAgICB1c2VfaG90X3RlYW0gPSAxOyAvLyB0aGUgdGVhbSBpcyByZWFkeSB0byB1c2UKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMDsgLy8gQUM6IHRocmVhZHMgYXJlIG5vdCBhbGxvY2F0ZWQgeWV0CisgICAgICAgICAgICAgICAgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSA9IHRlYW07IC8vIHJlbWVtYmVyIG5ldyBob3QgdGVhbQorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdXNlX2hvdF90ZWFtID0gMDsKKyAgICAgICAgfQorICAgIH0KKyNlbHNlCisgICAgdXNlX2hvdF90ZWFtID0gdGVhbSA9PSByb290LT5yLnJfaG90X3RlYW07CisjZW5kaWYKKyAgICBpZiAoICF1c2VfaG90X3RlYW0gKSB7CisKKyAgICAgICAgLyogaW5zdGFsbCB0aGUgbWFzdGVyIHRocmVhZCAqLworICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgMCBdICAgID0gbWFzdGVyX3RoOworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG1hc3Rlcl90aCwgdGVhbSwgMCwgbWFzdGVyX2d0aWQgKTsKKworICAgICAgICAvKiBub3csIGluc3RhbGwgdGhlIHdvcmtlciB0aHJlYWRzICovCisgICAgICAgIGZvciAoIGk9MSA7ICBpIDwgdGVhbS0+dC50X25wcm9jIDsgaSsrICkgeworCisgICAgICAgICAgICAvKiBmb3JrIG9yIHJlYWxsb2NhdGUgYSBuZXcgdGhyZWFkIGFuZCBpbnN0YWxsIGl0IGluIHRlYW0gKi8KKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX2FsbG9jYXRlX3RocmVhZCggcm9vdCwgdGVhbSwgaSApOworICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGkgXSA9IHRocjsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRociApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyLT50aC50aF90ZWFtID09IHRlYW0gKTsKKyAgICAgICAgICAgIC8qIGFsaWduIHRlYW0gYW5kIHRocmVhZCBhcnJpdmVkIHN0YXRlcyAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfdGVhbV90aHJlYWRzOiBUIyVkKCVkOiVkKSBpbml0IGFycml2ZWQgVCMlZCglZDolZCkgam9pbiA9JWxsdSwgcGxhaW49JWxsdVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCAwLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgMCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGlkKCBpLCB0ZWFtICksIHRlYW0tPnQudF9pZCwgaSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGJzX3BsYWluX2JhcnJpZXIgXS5iX2Fycml2ZWQgKSApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrOworICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19sZXZlbCAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX2xldmVsOworICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19zaXplICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemU7CisjZW5kaWYKKyAgICAgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSB0aHJlYWRzJyBiYXJyaWVyIGRhdGEuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gdGVhbS0+dC50X3RocmVhZHNbIGkgXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX2Fycml2ZWQgICAgICAgID0gdGVhbS0+dC50X2JhclsgYiBdLmJfYXJyaXZlZDsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgYmFsaWduWyBiIF0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IHRlYW0tPnQudF9iYXJbIGIgXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH07IC8vIGZvciBiCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworI2VuZGlmCisKKyAgICB9CisKKyAgICBLTVBfTUIoKTsKK30KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKy8vCisvLyBQcm9wYWdhdGUgYW55IGNoYW5nZXMgdG8gdGhlIGZsb2F0aW5nIHBvaW50IGNvbnRyb2wgcmVnaXN0ZXJzIG91dCB0byB0aGUgdGVhbQorLy8gV2UgdHJ5IHRvIGF2b2lkIHVubmVjZXNzYXJ5IHdyaXRlcyB0byB0aGUgcmVsZXZhbnQgY2FjaGUgbGluZSBpbiB0aGUgdGVhbSBzdHJ1Y3R1cmUsCisvLyBzbyB3ZSBkb24ndCBtYWtlIGNoYW5nZXMgdW5sZXNzIHRoZXkgYXJlIG5lZWRlZC4KKy8vCitpbmxpbmUgc3RhdGljIHZvaWQKK3Byb3BhZ2F0ZUZQQ29udHJvbChrbXBfdGVhbV90ICogdGVhbSkKK3sKKyAgICBpZiAoIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApIHsKKyAgICAgICAga21wX2ludDE2IHg4N19mcHVfY29udHJvbF93b3JkOworICAgICAgICBrbXBfdWludDMyIG14Y3NyOworCisgICAgICAgIC8vIEdldCBtYXN0ZXIgdmFsdWVzIG9mIEZQVSBjb250cm9sIGZsYWdzIChib3RoIFg4NyBhbmQgdmVjdG9yKQorICAgICAgICBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCggJng4N19mcHVfY29udHJvbF93b3JkICk7CisgICAgICAgIF9fa21wX3N0b3JlX214Y3NyKCAmbXhjc3IgKTsKKyAgICAgICAgbXhjc3IgJj0gS01QX1g4Nl9NWENTUl9NQVNLOworCisgICAgICAgIC8vIFRoZXJlIGlzIG5vIHBvaW50IGxvb2tpbmcgYXQgdF9mcF9jb250cm9sX3NhdmVkIGhlcmUuCisgICAgICAgIC8vIElmIGl0IGlzIFRSVUUsIHdlIHN0aWxsIGhhdmUgdG8gdXBkYXRlIHRoZSB2YWx1ZXMgaWYgdGhleSBhcmUgZGlmZmVyZW50IGZyb20gdGhvc2Ugd2Ugbm93IGhhdmUuCisgICAgICAgIC8vIElmIGl0IGlzIEZBTFNFIHdlIGRpZG4ndCBzYXZlIGFueXRoaW5nIHlldCwgYnV0IG91ciBvYmplY3RpdmUgaXMgdGhlIHNhbWUuIFdlIGhhdmUgdG8gZW5zdXJlCisgICAgICAgIC8vIHRoYXQgdGhlIHZhbHVlcyBpbiB0aGUgdGVhbSBhcmUgdGhlIHNhbWUgYXMgdGhvc2Ugd2UgaGF2ZS4KKyAgICAgICAgLy8gU28sIHRoaXMgY29kZSBhY2hpZXZlcyB3aGF0IHdlIG5lZWQgd2hldGhlciBvciBub3QgdF9mcF9jb250cm9sX3NhdmVkIGlzIHRydWUuCisgICAgICAgIC8vIEJ5IGNoZWNraW5nIHdoZXRoZXIgdGhlIHZhbHVlIG5lZWRzIHVwZGF0aW5nIHdlIGF2b2lkIHVubmVjZXNzYXJ5IHdyaXRlcyB0aGF0IHdvdWxkIHB1dCB0aGUKKyAgICAgICAgLy8gY2FjaGUtbGluZSBpbnRvIGEgd3JpdHRlbiBzdGF0ZSwgY2F1c2luZyBhbGwgdGhyZWFkcyBpbiB0aGUgdGVhbSB0byBoYXZlIHRvIHJlYWQgaXQgYWdhaW4uCisgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X3g4N19mcHVfY29udHJvbF93b3JkLCB4ODdfZnB1X2NvbnRyb2xfd29yZCk7CisgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X214Y3NyLCBteGNzcik7CisgICAgICAgIC8vIEFsdGhvdWdoIHdlIGRvbid0IHVzZSB0aGlzIHZhbHVlLCBvdGhlciBjb2RlIGluIHRoZSBydW50aW1lIHdhbnRzIHRvIGtub3cgd2hldGhlciBpdCBzaG91bGQgcmVzdG9yZSB0aGVtLgorICAgICAgICAvLyBTbyB3ZSBtdXN0IGVuc3VyZSBpdCBpcyBjb3JyZWN0LgorICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkLCBUUlVFKTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIC8vIFNpbWlsYXJseSBoZXJlLiBEb24ndCB3cml0ZSB0byB0aGlzIGNhY2hlLWxpbmUgaW4gdGhlIHRlYW0gc3RydWN0dXJlIHVubGVzcyB3ZSBoYXZlIHRvLgorICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkLCBGQUxTRSk7CisgICAgfQorfQorCisvLyBEbyB0aGUgb3Bwb3NpdGUsIHNldHRpbmcgdGhlIGhhcmR3YXJlIHJlZ2lzdGVycyB0byB0aGUgdXBkYXRlZCB2YWx1ZXMgZnJvbSB0aGUgdGVhbS4KK2lubGluZSBzdGF0aWMgdm9pZAordXBkYXRlSFdGUENvbnRyb2woa21wX3RlYW1fdCAqIHRlYW0pCit7CisgICAgaWYgKCBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgJiYgdGVhbS0+dC50X2ZwX2NvbnRyb2xfc2F2ZWQgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE9ubHkgcmVzZXQgdGhlIGZwIGNvbnRyb2wgcmVncyBpZiB0aGV5IGhhdmUgYmVlbiBjaGFuZ2VkIGluIHRoZSB0ZWFtLgorICAgICAgICAvLyB0aGUgcGFyYWxsZWwgcmVnaW9uIHRoYXQgd2UgYXJlIGV4aXRpbmcuCisgICAgICAgIC8vCisgICAgICAgIGttcF9pbnQxNiB4ODdfZnB1X2NvbnRyb2xfd29yZDsKKyAgICAgICAga21wX3VpbnQzMiBteGNzcjsKKyAgICAgICAgX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ4ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgICAgICBfX2ttcF9zdG9yZV9teGNzciggJm14Y3NyICk7CisgICAgICAgIG14Y3NyICY9IEtNUF9YODZfTVhDU1JfTUFTSzsKKworICAgICAgICBpZiAoIHRlYW0tPnQudF94ODdfZnB1X2NvbnRyb2xfd29yZCAhPSB4ODdfZnB1X2NvbnRyb2xfd29yZCApIHsKKyAgICAgICAgICAgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKyAgICAgICAgICAgIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoICZ0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICAgICAgfQorCisgICAgICAgIGlmICggdGVhbS0+dC50X214Y3NyICE9IG14Y3NyICkgeworICAgICAgICAgICAgX19rbXBfbG9hZF9teGNzciggJnRlYW0tPnQudF9teGNzciApOworICAgICAgICB9CisgICAgfQorfQorI2Vsc2UKKyMgZGVmaW5lIHByb3BhZ2F0ZUZQQ29udHJvbCh4KSAoKHZvaWQpMCkKKyMgZGVmaW5lIHVwZGF0ZUhXRlBDb250cm9sKHgpICAoKHZvaWQpMCkKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApOyAvLyBmb3J3YXJkIGRlY2xhcmF0aW9uCisKKy8qCisgKiBSdW4gYSBwYXJhbGxlbCByZWdpb24gdGhhdCBoYXMgYmVlbiBzZXJpYWxpemVkLCBzbyBydW5zIG9ubHkgaW4gYSB0ZWFtIG9mIHRoZSBzaW5nbGUgbWFzdGVyIHRocmVhZC4KKyAqLwordm9pZAorX19rbXBfc2VyaWFsaXplZF9wYXJhbGxlbChpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyOworICAgIGttcF90ZWFtX3QgKnNlcmlhbF90ZWFtOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBjYWxsZWQgYnkgVCMlZFxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyAgICAvKiBTa2lwIGFsbCB0aGlzIGNvZGUgZm9yIGF1dG9wYXIgc2VyaWFsaXplZCBsb29wcyBzaW5jZSBpdCByZXN1bHRzIGluCisgICAgICAgdW5hY2NlcHRhYmxlIG92ZXJoZWFkICovCisgICAgaWYoIGxvYyAhPSBOVUxMICYmIChsb2MtPmZsYWdzICYgS01QX0lERU5UX0FVVE9QQVIgKSApCisgICAgICAgIHJldHVybjsKKworICAgIGlmKCAhIFRDUl80KCBfX2ttcF9pbml0X3BhcmFsbGVsICkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICB0aGlzX3RociAgICAgPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgc2VyaWFsX3RlYW0gID0gdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtOworCisgICAgLyogdXRpbGl6ZSB0aGUgc2VyaWFsaXplZCB0ZWFtIGhlbGQgYnkgdGhpcyB0aHJlYWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbSApOworICAgIEtNUF9NQigpOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID09IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9PSBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcHVzaGluZyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwLCBuZXcgdGFza190ZWFtID0gTlVMTFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0sIHRoaXNfdGhyLT50aC50aF90ZWFtICkgKTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSA9IE5VTEw7CisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQ7CisgICAgaWYgKCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSBpZiAoIHByb2NfYmluZCA9PSBwcm9jX2JpbmRfZGVmYXVsdCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTm8gcHJvY19iaW5kIGNsYXVzZSB3YXMgc3BlY2lmaWVkLCBzbyB1c2UgdGhlIGN1cnJlbnQgdmFsdWUKKyAgICAgICAgLy8gb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhpcyBwYXJhbGxlbCByZWdpb24uCisgICAgICAgIC8vCisgICAgICAgIHByb2NfYmluZCA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgIH0KKyAgICAvLworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIC8vCisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgaWYoIHRoaXNfdGhyLT50aC50aF90ZWFtICE9IHNlcmlhbF90ZWFtICkgeworICAgICAgICAvLyBOZXN0ZWQgbGV2ZWwgd2lsbCBiZSBhbiBpbmRleCBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5CisgICAgICAgIGludCBsZXZlbCA9IHRoaXNfdGhyLT50aC50aF90ZWFtLT50LnRfbGV2ZWw7CisKKyAgICAgICAgaWYoIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgICAgIC8qIHRoaXMgc2VyaWFsIHRlYW0gd2FzIGFscmVhZHkgdXNlZAorICAgICAgICAgICAgICogVE9ETyBpbmNyZWFzZSBwZXJmb3JtYW5jZSBieSBtYWtpbmcgdGhpcyBsb2NrcyBtb3JlIHNwZWNpZmljICovCisgICAgICAgICAgICBrbXBfdGVhbV90ICpuZXdfdGVhbTsKKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQgPSBfX29tcHRfcGFyYWxsZWxfaWRfbmV3KGdsb2JhbF90aWQpOworI2VuZGlmCisKKyAgICAgICAgICAgIG5ld190ZWFtID0gX19rbXBfYWxsb2NhdGVfdGVhbSh0aGlzX3Roci0+dGgudGhfcm9vdCwgMSwgMSwKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmQsCisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCBuZXdfdGVhbSApOworCisgICAgICAgICAgICAvKiBzZXR1cCBuZXcgc2VyaWFsaXplZCB0ZWFtIGFuZCBpbnN0YWxsIGl0ICovCisgICAgICAgICAgICBuZXdfdGVhbS0+dC50X3RocmVhZHNbMF0gPSB0aGlzX3RocjsKKyAgICAgICAgICAgIG5ld190ZWFtLT50LnRfcGFyZW50ID0gdGhpc190aHItPnRoLnRoX3RlYW07CisgICAgICAgICAgICBzZXJpYWxfdGVhbSA9IG5ld190ZWFtOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW07CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgYWxsb2NhdGVkIG5ldyBzZXJpYWwgdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBzZXJpYWxfdGVhbSApICk7CisKKworICAgICAgICAgICAgLyogVE9ETyB0aGUgYWJvdmUgYnJlYWtzIHRoZSByZXF1aXJlbWVudCB0aGF0IGlmIHdlIHJ1biBvdXQgb2YKKyAgICAgICAgICAgICAqIHJlc291cmNlcywgdGhlbiB3ZSBjYW4gc3RpbGwgZ3VhcmFudGVlIHRoYXQgc2VyaWFsaXplZCB0ZWFtcworICAgICAgICAgICAgICogYXJlIG9rLCBzaW5jZSB3ZSBtYXkgbmVlZCB0byBhbGxvY2F0ZSBhIG5ldyBvbmUgKi8KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjJWQgcmV1c2luZyBjYWNoZWQgc2VyaWFsIHRlYW0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgc2VyaWFsX3RlYW0gKSApOworICAgICAgICB9CisKKyAgICAgICAgLyogd2UgaGF2ZSB0byBpbml0aWFsaXplIHRoaXMgc2VyaWFsIHRlYW0gKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggc2VyaWFsX3RlYW0tPnQudF90aHJlYWRzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9PSB0aGlzX3RociApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBzZXJpYWxfdGVhbSApOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2lkZW50ICAgICAgICAgPSBsb2M7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfc2VyaWFsaXplZCAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbnByb2MgICAgICAgICA9IDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfcGFyZW50ICAgICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3NjaGVkICAgICAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X3NjaGVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbSAgICAgICAgICAgPSBzZXJpYWxfdGVhbTsKKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9tYXN0ZXJfdGlkICAgID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkOworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWw6IFQjZCBjdXJ0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDA7CisKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3Rociwgc2VyaWFsX3RlYW0sIDAgKTsKKworICAgICAgICAvKiBUT0RPOiBHRUg6IGRvIHRoZSBJQ1ZzIHdvcmsgZm9yIG5lc3RlZCBzZXJpYWxpemVkIHRlYW1zPyAgRG9uJ3Qgd2UgbmVlZCBhbiBpbXBsaWNpdCB0YXNrIGZvcgorICAgICAgICAgICBlYWNoIHNlcmlhbGl6ZWQgdGFzayByZXByZXNlbnRlZCBieSB0ZWFtLT50LnRfc2VyaWFsaXplZD8gKi8KKyAgICAgICAgY29weV9pY3ZzKAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLAorICAgICAgICAgICAgICAgICAgJiB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgICAgICAvLyBUaHJlYWQgdmFsdWUgZXhpc3RzIGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZm9yIHRoZSBuZXh0IG5lc3RlZCBsZXZlbAorICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgudXNlZCAmJiAoIGxldmVsICsgMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCApICkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5ucHJvYyA9IF9fa21wX25lc3RlZF9udGgubnRoWyBsZXZlbCArIDEgXTsKKyAgICAgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kCisgICAgICAgICAgICAgICAgPSBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbIGxldmVsICsgMSBdOworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICBzZXJpYWxfdGVhbS0+dC50X3BrZm4gPSAobWljcm90YXNrX3QpKCB+MCApOyAvLyBGb3IgdGhlIGRlYnVnZ2VyLgorI2VuZGlmCisgICAgICAgIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9IDA7CisKKyAgICAgICAgLyogc2V0IHRocmVhZCBjYWNoZSB2YWx1ZXMgKi8KKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbnByb2MgICAgID0gMTsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3RlYW1fbWFzdGVyICAgID0gdGhpc190aHI7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgPSAxOworCisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfbGV2ZWwgICAgICAgID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9sZXZlbCArIDE7CisgICAgICAgIHNlcmlhbF90ZWFtLT50LnRfYWN0aXZlX2xldmVsID0gc2VyaWFsX3RlYW0tPnQudF9wYXJlbnQtPnQudF9hY3RpdmVfbGV2ZWw7CisKKyAgICAgICAgcHJvcGFnYXRlRlBDb250cm9sIChzZXJpYWxfdGVhbSk7CisKKyAgICAgICAgLyogY2hlY2sgaWYgd2UgbmVlZCB0byBhbGxvY2F0ZSBkaXNwYXRjaCBidWZmZXJzIHN0YWNrICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaCk7CisgICAgICAgIGlmICggIXNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgeworICAgICAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXIgPSAoZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKikKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICk7CisgICAgICAgIH0KKyAgICAgICAgdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaDsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3Qgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ2xvYmFsX3RpZCk7CisgICAgICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZChzZXJpYWxfdGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgICBLTVBfTUIoKTsKKworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIHRoaXMgc2VyaWFsaXplZCB0ZWFtIGlzIGFscmVhZHkgYmVpbmcgdXNlZCwKKyAgICAgICAgICogdGhhdCdzIGZpbmUsIGp1c3QgYWRkIGFub3RoZXIgbmVzdGVkIGxldmVsICovCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF90ZWFtID09IHNlcmlhbF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkcyApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzZXJpYWxfdGVhbS0+dC50X3RocmVhZHNbMF0gPT0gdGhpc190aHIgKTsKKyAgICAgICAgKysgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICAgICAgaW50IGxldmVsID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgLy8gVGhyZWFkIHZhbHVlIGV4aXN0cyBpbiB0aGUgbmVzdGVkIG50aHJlYWRzIGFycmF5IGZvciB0aGUgbmV4dCBuZXN0ZWQgbGV2ZWwKKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgJiYgKCBsZXZlbCArIDEgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSApIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgPSBfX2ttcF9uZXN0ZWRfbnRoLm50aFsgbGV2ZWwgKyAxIF07CisgICAgICAgIH0KKyAgICAgICAgc2VyaWFsX3RlYW0tPnQudF9sZXZlbCsrOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsOiBUIyVkIGluY3JlYXNpbmcgbmVzdGluZyBsZXZlbCBvZiBzZXJpYWwgdGVhbSAlcCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsIHNlcmlhbF90ZWFtLCBzZXJpYWxfdGVhbS0+dC50X2xldmVsICkgKTsKKworICAgICAgICAvKiBhbGxvY2F0ZS9wdXNoIGRpc3BhdGNoIGJ1ZmZlcnMgc3RhY2sgKi8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICAgICAgeworICAgICAgICAgICAgZGlzcGF0Y2hfcHJpdmF0ZV9pbmZvX3QgKiBkaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKQorICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIGRpc3BhdGNoX3ByaXZhdGVfaW5mb190ICkgKTsKKyAgICAgICAgICAgIGRpc3BfYnVmZmVyLT5uZXh0ID0gc2VyaWFsX3RlYW0tPnQudF9kaXNwYXRjaC0+dGhfZGlzcF9idWZmZXI7CisgICAgICAgICAgICBzZXJpYWxfdGVhbS0+dC50X2Rpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IGRpc3BfYnVmZmVyOworICAgICAgICB9CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9IHNlcmlhbF90ZWFtLT50LnRfZGlzcGF0Y2g7CisKKyAgICAgICAgS01QX01CKCk7CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wdXNoX3BhcmFsbGVsKCBnbG9iYWxfdGlkLCBOVUxMICk7CisKK30KKworLyogbW9zdCBvZiB0aGUgd29yayBmb3IgYSBmb3JrICovCisvKiByZXR1cm4gdHJ1ZSBpZiB3ZSByZWFsbHkgd2VudCBwYXJhbGxlbCwgZmFsc2UgaWYgc2VyaWFsaXplZCAqLworaW50CitfX2ttcF9mb3JrX2NhbGwoCisgICAgaWRlbnRfdCAgICogbG9jLAorICAgIGludCAgICAgICAgIGd0aWQsCisgICAgZW51bSBmb3JrX2NvbnRleHRfZSAgY2FsbF9jb250ZXh0LCAvLyBJbnRlbCwgR05VLCAuLi4KKyAgICBrbXBfaW50MzIgICBhcmdjLAorI2lmIE9NUFRfU1VQUE9SVAorICAgIHZvaWQgICAgICAgKnVud3JhcHBlZF90YXNrLAorI2VuZGlmCisgICAgbWljcm90YXNrX3QgbWljcm90YXNrLAorICAgIGxhdW5jaF90ICAgIGludm9rZXIsCisvKiBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYgKi8KKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICB2YV9saXN0ICAgKiBhcAorI2Vsc2UKKyAgICB2YV9saXN0ICAgICBhcAorI2VuZGlmCisgICAgKQoreworICAgIHZvaWQgICAgICAgICAgKiphcmd2OworICAgIGludCAgICAgICAgICAgICBpOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGlkOworICAgIGludCAgICAgICAgICAgICBtYXN0ZXJfdGhpc19jb25zOworICAgIGttcF90ZWFtX3QgICAgICp0ZWFtOworICAgIGttcF90ZWFtX3QgICAgICpwYXJlbnRfdGVhbTsKKyAgICBrbXBfaW5mb190ICAgICAqbWFzdGVyX3RoOworICAgIGttcF9yb290X3QgICAgICpyb290OworICAgIGludCAgICAgICAgICAgICBudGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX2FjdGl2ZTsKKyAgICBpbnQgICAgICAgICAgICAgbWFzdGVyX3NldF9udW10aHJlYWRzOworICAgIGludCAgICAgICAgICAgICBsZXZlbDsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCAgICAgICAgICAgICBhY3RpdmVfbGV2ZWw7CisgICAgaW50ICAgICAgICAgICAgIHRlYW1zX2xldmVsOworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKipwX2hvdF90ZWFtczsKKyNlbmRpZgorICAgIHsgLy8gS01QX1RJTUVfQkxPQ0sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2ZvcmtfY2FsbCk7CisgICAgS01QX0NPVU5UX1ZBTFVFKE9NUF9QQVJBTExFTF9hcmdzLCBhcmdjKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgaWYgKCBfX2ttcF9zdGtwYWRkaW5nID4gMCAmJiAgX19rbXBfcm9vdFtndGlkXSAhPSBOVUxMICkgeworICAgICAgICAvKiBTb21lIHN5c3RlbXMgcHJlZmVyIHRoZSBzdGFjayBmb3IgdGhlIHJvb3QgdGhyZWFkKHMpIHRvIHN0YXJ0IHdpdGggKi8KKyAgICAgICAgLyogc29tZSBnYXAgZnJvbSB0aGUgcGFyZW50IHN0YWNrIHRvIHByZXZlbnQgZmFsc2Ugc2hhcmluZy4gKi8KKyAgICAgICAgdm9pZCAqZHVtbXkgPSBLTVBfQUxMT0NBKF9fa21wX3N0a3BhZGRpbmcpOworICAgICAgICAvKiBUaGVzZSAyIGxpbmVzIGJlbG93IGFyZSBzbyB0aGlzIGRvZXMgbm90IGdldCBvcHRpbWl6ZWQgb3V0ICovCisgICAgICAgIGlmICggX19rbXBfc3RrcGFkZGluZyA+IEtNUF9NQVhfU1RLUEFERElORyApCisgICAgICAgICAgICBfX2ttcF9zdGtwYWRkaW5nICs9IChzaG9ydCkoKGttcF9pbnQ2NClkdW1teSk7CisgICAgfQorCisgICAgLyogaW5pdGlhbGl6ZSBpZiBuZWVkZWQgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOyAvLyBBQzogcG90ZW50aWFsbHkgdW5zYWZlLCBub3QgaW4gc3luYyB3aXRoIHNodXRkb3duCisgICAgaWYoICEgVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKQorICAgICAgICBfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplKCk7CisKKyAgICAvKiBzZXR1cCBjdXJyZW50IGRhdGEgKi8KKyAgICBtYXN0ZXJfdGggICAgID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOyAvLyBBQzogcG90ZW50aWFsbHkgdW5zYWZlLCBub3QgaW4gc3luYyB3aXRoIHNodXRkb3duCisgICAgcGFyZW50X3RlYW0gICA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbTsKKyAgICBtYXN0ZXJfdGlkICAgID0gbWFzdGVyX3RoLT50aC50aF9pbmZvLmRzLmRzX3RpZDsKKyAgICBtYXN0ZXJfdGhpc19jb25zID0gbWFzdGVyX3RoLT50aC50aF9sb2NhbC50aGlzX2NvbnN0cnVjdDsKKyAgICByb290ICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF9yb290OworICAgIG1hc3Rlcl9hY3RpdmUgPSByb290LT5yLnJfYWN0aXZlOworICAgIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA9IG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQ7CisgICAgb21wdF90YXNrX2lkX3Qgb21wdF90YXNrX2lkOworICAgIG9tcHRfZnJhbWVfdCAqb21wdF9mcmFtZTsKKyAgICBvbXB0X3Rhc2tfaWRfdCBteV90YXNrX2lkOworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgb21wdF9wYXJhbGxlbF9pZCA9IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoZ3RpZCk7CisgICAgICAgIG9tcHRfdGFza19pZCA9IF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbCgwKTsKKyAgICAgICAgb21wdF9mcmFtZSA9IF9fb21wdF9nZXRfdGFza19mcmFtZV9pbnRlcm5hbCgwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8vIE5lc3RlZCBsZXZlbCB3aWxsIGJlIGFuIGluZGV4IGluIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkKKyAgICBsZXZlbCAgICAgICAgID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyAgICBhY3RpdmVfbGV2ZWwgID0gcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWw7IC8vIGlzIHVzZWQgdG8gbGF1bmNoIG5vbi1zZXJpYWwgdGVhbXMgZXZlbiBpZiBuZXN0ZWQgaXMgbm90IGFsbG93ZWQKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRlYW1zX2xldmVsICAgID0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbDsgLy8gbmVlZGVkIHRvIGNoZWNrIG5lc3RpbmcgaW5zaWRlIHRoZSB0ZWFtcworI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICBwX2hvdF90ZWFtcyAgID0gJm1hc3Rlcl90aC0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCAqcF9ob3RfdGVhbXMgPT0gTlVMTCAmJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMCApIHsKKyAgICAgICAgKnBfaG90X3RlYW1zID0gKGttcF9ob3RfdGVhbV9wdHJfdCopX19rbXBfYWxsb2NhdGUoCisgICAgICAgICAgICAgICAgc2l6ZW9mKGttcF9ob3RfdGVhbV9wdHJfdCkgKiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsKTsKKyAgICAgICAgKCpwX2hvdF90ZWFtcylbMF0uaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgICAgICgqcF9ob3RfdGVhbXMpWzBdLmhvdF90ZWFtX250aCA9IDE7IC8vIGl0IGlzIGVpdGhlciBhY3R1YWwgb3Igbm90IG5lZWRlZCAod2hlbiBhY3RpdmVfbGV2ZWwgPiAwKQorICAgIH0KKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW4pKSB7CisgICAgICAgIGludCB0ZWFtX3NpemUgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luKSgKKyAgICAgICAgICAgIG9tcHRfdGFza19pZCwgb21wdF9mcmFtZSwgb21wdF9wYXJhbGxlbF9pZCwKKyAgICAgICAgICAgIHRlYW1fc2l6ZSwgdW53cmFwcGVkX3Rhc2ssIE9NUFRfSU5WT0tFUihjYWxsX2NvbnRleHQpKTsKKyAgICB9CisjZW5kaWYKKworICAgIG1hc3Rlcl90aC0+dGgudGhfaWRlbnQgPSBsb2M7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgJiYKKyAgICAgICAgIGFwICYmIG1pY3JvdGFzayAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmIGxldmVsID09IHRlYW1zX2xldmVsICkgeworICAgICAgICAvLyBBQzogVGhpcyBpcyBzdGFydCBvZiBwYXJhbGxlbCB0aGF0IGlzIG5lc3RlZCBpbnNpZGUgdGVhbXMgY29uc3RydWN0LgorICAgICAgICAvLyAgICAgVGhlIHRlYW0gaXMgYWN0dWFsIChob3QpLCBhbGwgd29ya2VycyBhcmUgcmVhZHkgYXQgdGhlIGZvcmsgYmFycmllci4KKyAgICAgICAgLy8gICAgIE5vIGxvY2sgbmVlZGVkIHRvIGluaXRpYWxpemUgdGhlIHRlYW0gYSBiaXQsIHRoZW4gZnJlZSB3b3JrZXJzLgorICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2lkZW50ID0gbG9jOworICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHBhcmVudF90ZWFtLCBUUlVFICk7CisgICAgICAgIHBhcmVudF90ZWFtLT50LnRfYXJnYyAgPSBhcmdjOworICAgICAgICBhcmd2ID0gKHZvaWQqKilwYXJlbnRfdGVhbS0+dC50X2FyZ3Y7CisgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8qIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NiAqLworI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAqYXJndisrID0gdmFfYXJnKCBhcCwgdm9pZCAqICk7CisjZW5kaWYKKyAgICAgICAgLyogSW5jcmVtZW50IG91ciBuZXN0ZWQgZGVwdGggbGV2ZWxzLCBidXQgbm90IGluY3JlYXNlIHRoZSBzZXJpYWxpemF0aW9uICovCisgICAgICAgIGlmICggcGFyZW50X3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgaW4gc2VyaWFsaXplZCBwYXJhbGxlbAorICAgICAgICAgICAgX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwobG9jLCBndGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZCA+IDEgKTsKKyAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfc2VyaWFsaXplZC0tOyAvLyBBQzogbmVlZCB0aGlzIGluIG9yZGVyIGVucXVpcnkgZnVuY3Rpb25zCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgY29ycmVjdGx5LCB3aWxsIHJlc3RvcmUgYXQgam9pbiB0aW1lCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIHZvaWQgKmR1bW15OworICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgLyogT01QVCBpbXBsaWNpdCB0YXNrIGJlZ2luICovCisgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSBwYXJlbnRfdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIG1pY3JvdGFzaywgZ3RpZCwgMCwgYXJnYywgcGFyZW50X3RlYW0tPnQudF9hcmd2CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBleGl0X3J1bnRpbWVfcAorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG9tcHRfdGFza19pZCk7CisgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNsZWFyIHRoZSB0YXNrIGlkIG9ubHkgYWZ0ZXIgdW5saW5raW5nIHRoZSB0YXNrCisgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IG9tcHRfdGFza19pZF9ub25lOworI2VuZGlmCisKKyAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICBPTVBUX0lOVk9LRVIoY2FsbF9jb250ZXh0KSk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiBUUlVFOworICAgICAgICB9CisKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9wa2ZuICA9IG1pY3JvdGFzazsKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgcGFyZW50X3RlYW0tPnQub21wdF90ZWFtX2luZm8ubWljcm90YXNrID0gdW53cmFwcGVkX3Rhc2s7CisjZW5kaWYKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9pbnZva2UgPSBpbnZva2VyOworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyKikgJnJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArKzsKKyAgICAgICAgcGFyZW50X3RlYW0tPnQudF9sZXZlbCArKzsKKworICAgICAgICAvKiBDaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIHRlYW0gaWYgcmVxdWVzdGVkICovCisgICAgICAgIGlmICggbWFzdGVyX3NldF9udW10aHJlYWRzICkgeyAgIC8vIFRoZSBwYXJhbGxlbCBoYXMgbnVtX3RocmVhZHMgY2xhdXNlCisgICAgICAgICAgICBpZiAoIG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA8IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfc2l6ZS5udGggKSB7CisgICAgICAgICAgICAgICAgLy8gQUM6IG9ubHkgY2FuIHJlZHVjZSB0aGUgbnVtYmVyIG9mIHRocmVhZHMgZHluYW1pY2FsbHksIGNhbm5vdCBpbmNyZWFzZQorICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gcGFyZW50X3RlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgICAgIHBhcmVudF90ZWFtLT50LnRfbnByb2MgPSBtYXN0ZXJfc2V0X251bXRocmVhZHM7CisgICAgICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBtYXN0ZXJfc2V0X251bXRocmVhZHM7ICsraSApIHsKKyAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkc1tpXS0+dGgudGhfdGVhbV9ucHJvYyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkczsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgLy8gS2VlcCBleHRyYSB0aHJlYWRzIGhvdCBpbiB0aGUgdGVhbSBmb3IgcG9zc2libGUgbmV4dCBwYXJhbGxlbHMKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgfQorCisjaWYgVVNFX0RFQlVHR0VSCisgICAgaWYgKCBfX2ttcF9kZWJ1Z2dpbmcgKSB7ICAgIC8vIExldCBkZWJ1Z2dlciBvdmVycmlkZSBudW1iZXIgb2YgdGhyZWFkcy4KKyAgICAgICAgaW50IG50aCA9IF9fa21wX29tcF9udW1fdGhyZWFkcyggbG9jICk7CisgICAgICAgIGlmICggbnRoID4gMCApIHsgICAgICAgIC8vIDAgbWVhbnMgZGVidWdnZXIgZG9lcyBub3Qgd2FudCB0byBjaGFuZ2UgbnVtYmVyIG9mIHRocmVhZHMuCisgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHMgPSBudGg7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyNlbmRpZgorCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBiZWZvcmUgaW50ZXJuYWwgZm9yazogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLCByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RoLCBndGlkICkgKTsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCBwYXJlbnRfdGVhbSApOworICAgICAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogYWZ0ZXIgaW50ZXJuYWwgZm9yazogcm9vdD0lcCwgdGVhbT0lcCwgbWFzdGVyX3RoPSVwLCBndGlkPSVkXG4iLCByb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RoLCBndGlkICkgKTsKKworICAgICAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgaW52b2tlIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwYXJlbnRfdGVhbS0+dC50X2lkLCBwYXJlbnRfdGVhbS0+dC50X3BrZm4gKSApOworCisgICAgICAgIHsKKyAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgICAgIGlmICghIHBhcmVudF90ZWFtLT50LnRfaW52b2tlKCBndGlkICkpIHsKKyAgICAgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgImNhbm5vdCBpbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQoJWQ6MCkgZG9uZSBtaWNyb3Rhc2sgPSAlcFxuIiwKKyAgICAgICAgICAgIGd0aWQsIHBhcmVudF90ZWFtLT50LnRfaWQsIHBhcmVudF90ZWFtLT50LnRfcGtmbiApICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9IC8vIFBhcmFsbGVsIGNsb3NlbHkgbmVzdGVkIGluIHRlYW1zIGNvbnN0cnVjdAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNpZiBLTVBfREVCVUcKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA+PSBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApIHsKKyAgICAgICAgbnRocmVhZHMgPSAxOworICAgIH0gZWxzZSB7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgaW50IGVudGVyX3RlYW1zID0gKChhcD09TlVMTCAmJiBhY3RpdmVfbGV2ZWw9PTApfHwoYXAgJiYgdGVhbXNfbGV2ZWw+MCAmJiB0ZWFtc19sZXZlbD09bGV2ZWwpKTsKKyNlbmRpZgorICAgICAgICBudGhyZWFkcyA9IG1hc3Rlcl9zZXRfbnVtdGhyZWFkcyA/CisgICAgICAgICAgICBtYXN0ZXJfc2V0X251bXRocmVhZHMgOiBnZXRfX25wcm9jXzIoIHBhcmVudF90ZWFtLCBtYXN0ZXJfdGlkICk7IC8vIFRPRE86IGdldCBucHJvYyBkaXJlY3RseSBmcm9tIGN1cnJlbnQgdGFzaworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIG5lZWQgdG8gdGFrZSBmb3Jram9pbiBsb2NrPyAobm8gbmVlZCBmb3Igc2VyaWFsaXplZCBwYXJhbGxlbCBvdXQgb2YgdGVhbXMgY29uc3RydWN0KS4KKyAgICAgICAgLy8gVGhpcyBjb2RlIG1vdmVkIGhlcmUgZnJvbSBfX2ttcF9yZXNlcnZlX3RocmVhZHMoKSB0byBzcGVlZHVwIG5lc3RlZCBzZXJpYWxpemVkIHBhcmFsbGVscy4KKyAgICAgICAgaWYgKG50aHJlYWRzID4gMSkgeworICAgICAgICAgICAgaWYgKCAoICFnZXRfX25lc3RlZChtYXN0ZXJfdGgpICYmIChyb290LT5yLnJfaW5fcGFyYWxsZWwKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICYmICFlbnRlcl90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICApICkgfHwgKCBfX2ttcF9saWJyYXJ5ID09IGxpYnJhcnlfc2VyaWFsICkgKSB7CisgICAgICAgICAgICAgICAgS0NfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsaXppbmcgdGVhbTsgcmVxdWVzdGVkICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG50aHJlYWRzICkpOworICAgICAgICAgICAgICAgIG50aHJlYWRzID0gMTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoIG50aHJlYWRzID4gMSApIHsKKyAgICAgICAgICAgIC8qIGRldGVybWluZSBob3cgbWFueSBuZXcgdGhyZWFkcyB3ZSBjYW4gdXNlICovCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgICAgICBudGhyZWFkcyA9IF9fa21wX3Jlc2VydmVfdGhyZWFkcyhyb290LCBwYXJlbnRfdGVhbSwgbWFzdGVyX3RpZCwgbnRocmVhZHMKKyNpZiBPTVBfNDBfRU5BQkxFRAorLyogQUM6IElmIHdlIGV4ZWN1dGUgdGVhbXMgZnJvbSBwYXJhbGxlbCByZWdpb24gKG9uIGhvc3QpLCB0aGVuIHRlYW1zIHNob3VsZCBiZSBjcmVhdGVkCisgICBidXQgZWFjaCBjYW4gb25seSBoYXZlIDEgdGhyZWFkIGlmIG5lc3RpbmcgaXMgZGlzYWJsZWQuIElmIHRlYW1zIGNhbGxlZCBmcm9tIHNlcmlhbCByZWdpb24sCisgICB0aGVuIHRlYW1zIGFuZCB0aGVpciB0aHJlYWRzIHNob3VsZCBiZSBjcmVhdGVkIHJlZ2FyZGxlc3Mgb2YgdGhlIG5lc3Rpbmcgc2V0dGluZy4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLCBlbnRlcl90ZWFtcworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBpZiAoIG50aHJlYWRzID09IDEgKSB7CisgICAgICAgICAgICAgICAgLy8gRnJlZSBsb2NrIGZvciBzaW5nbGUgdGhyZWFkIGV4ZWN1dGlvbiBoZXJlOworICAgICAgICAgICAgICAgIC8vIGZvciBtdWx0aS10aHJlYWQgZXhlY3V0aW9uIGl0IHdpbGwgYmUgZnJlZWQgbGF0ZXIKKyAgICAgICAgICAgICAgICAvLyBhZnRlciB0ZWFtIG9mIHRocmVhZHMgY3JlYXRlZCBhbmQgaW5pdGlhbGl6ZWQKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMCApOworCisgICAgLyogSWYgd2UgdGVtcG9yYXJpbHkgY2hhbmdlZCB0aGUgc2V0IG51bWJlciBvZiB0aHJlYWRzIHRoZW4gcmVzdG9yZSBpdCBub3cgKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisKKyAgICAvKiBjcmVhdGUgYSBzZXJpYWxpemVkIHBhcmFsbGVsIHJlZ2lvbj8gKi8KKyAgICBpZiAoIG50aHJlYWRzID09IDEgKSB7CisgICAgICAgIC8qIGpvc2ggdG9kbzogaHlwb3RoZXRpY2FsIHF1ZXN0aW9uOiB3aGF0IGRvIHdlIGRvIGZvciBPUyBYKj8gKi8KKyNpZiBLTVBfT1NfTElOVVggJiYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KQorICAgICAgICB2b2lkICogICBhcmdzWyBhcmdjIF07CisjZWxzZQorICAgICAgICB2b2lkICogKiBhcmdzID0gKHZvaWQqKikgS01QX0FMTE9DQSggYXJnYyAqIHNpemVvZiggdm9pZCAqICkgKTsKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgKCBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAqLworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsaXppbmcgcGFyYWxsZWwgcmVnaW9uXG4iLCBndGlkICkpOworCisgICAgICAgIF9fa21wY19zZXJpYWxpemVkX3BhcmFsbGVsKGxvYywgZ3RpZCk7CisKKyAgICAgICAgaWYgKCBjYWxsX2NvbnRleHQgPT0gZm9ya19jb250ZXh0X2ludGVsICkgeworICAgICAgICAgICAgLyogVE9ETyB0aGlzIHN1Y2tzLCB1c2UgdGhlIGNvbXBpbGVyIGl0c2VsZiB0byBwYXNzIGFyZ3MhIDopICovCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfaWRlbnQgPSBsb2M7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIGlmICggIWFwICkgeworICAgICAgICAgICAgICAgIC8vIHJldmVydCBjaGFuZ2UgbWFkZSBpbiBfX2ttcGNfc2VyaWFsaXplZF9wYXJhbGxlbCgpCisgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gR2V0IGFyZ3MgZnJvbSBwYXJlbnQgdGVhbSBmb3IgdGVhbXMgY29uc3RydWN0CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICB2b2lkICpkdW1teTsKKyAgICAgICAgICAgICAgICB2b2lkICoqZXhpdF9ydW50aW1lX3A7CisKKyAgICAgICAgICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgbHdfdGFza3RlYW07CisKKyAgICAgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIF9fb21wdF9sd190YXNrdGVhbV9pbml0KCZsd190YXNrdGVhbSwgbWFzdGVyX3RoLCBndGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworICAgICAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KGd0aWQpOworICAgICAgICAgICAgICAgICAgICBleGl0X3J1bnRpbWVfcCA9ICYobHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluaygmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCk7CisKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgICAgIG15X3Rhc2tfaWQgPSBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgICAgIC8qIE9NUFQgc3RhdGUgKi8KKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgICAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhPTVBfcGFyYWxsZWwpOworICAgICAgICAgICAgICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhJTVBMSUNJVF9UQVNLKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrLCBndGlkLCAwLCBhcmdjLCBwYXJlbnRfdGVhbS0+dC50X2FyZ3YKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKworI2lmIE9NUFRfVFJBQ0UKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwgb21wdF90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX3VubGluayhtYXN0ZXJfdGgpOworICAgICAgICAgICAgICAgICAgICAvLyByZXNldCBjbGVhciB0aGUgdGFzayBpZCBvbmx5IGFmdGVyIHVubGlua2luZyB0aGUgdGFzaworICAgICAgICAgICAgICAgICAgICBsd190YXNrdGVhbS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gb21wdF90YXNrX2lkX25vbmU7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkLCBvbXB0X3Rhc2tfaWQsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9JTlZPS0VSKGNhbGxfY29udGV4dCkpOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfb3ZlcmhlYWQ7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICB9IGVsc2UgaWYgKCBtaWNyb3Rhc2sgPT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgICAgIHRlYW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgICAgICAgICAgICAgLy90ZWFtLT50LnRfcGtmbiA9IG1pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaW52b2tlID0gaW52b2tlcjsKKyAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIFRSVUUgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYXJnYyA9IGFyZ2M7CisgICAgICAgICAgICAgICAgYXJndiA9ICh2b2lkKiopIHRlYW0tPnQudF9hcmd2OworICAgICAgICAgICAgICAgIGlmICggYXAgKSB7CisgICAgICAgICAgICAgICAgICAgIGZvciggaT1hcmdjLTE7IGkgPj0gMDsgLS1pICkKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorIyBpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoICphcCwgdm9pZCAqICk7CisjIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyMgZW5kaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBmb3IoIGk9MDsgaSA8IGFyZ2M7ICsraSApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBHZXQgYXJncyBmcm9tIHBhcmVudCB0ZWFtIGZvciB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3ZbaV0gPSBwYXJlbnRfdGVhbS0+dC50X2FyZ3ZbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIC8vIEFDOiByZXZlcnQgY2hhbmdlIG1hZGUgaW4gX19rbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwoKQorICAgICAgICAgICAgICAgIC8vICAgICBiZWNhdXNlIGluaXRpYWwgY29kZSBpbiB0ZWFtcyBzaG91bGQgaGF2ZSBsZXZlbD0wCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsLS07CisgICAgICAgICAgICAgICAgLy8gQUM6IGNhbGwgc3BlY2lhbCBpbnZva2VyIGZvciBvdXRlciAicGFyYWxsZWwiIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgICAgICBpbnZva2VyKGd0aWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgICAgICAgICBhcmd2ID0gYXJnczsKKyAgICAgICAgICAgICAgICBmb3IoIGk9YXJnYy0xOyBpID49IDA7IC0taSApCisvLyBUT0RPOiByZXZlcnQgd29ya2Fyb3VuZCBmb3IgSW50ZWwoUikgNjQgdHJhY2tlciAjOTYKKyNpZiAoS01QX0FSQ0hfWDg2XzY0IHx8IEtNUF9BUkNIX0FSTSB8fCBLTVBfQVJDSF9BQVJDSDY0KSAmJiBLTVBfT1NfTElOVVgKKyAgICAgICAgICAgICAgICAgICAgKmFyZ3YrKyA9IHZhX2FyZyggKmFwLCB2b2lkICogKTsKKyNlbHNlCisgICAgICAgICAgICAgICAgICAgICphcmd2KysgPSB2YV9hcmcoIGFwLCB2b2lkICogKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIEtNUF9NQigpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgdm9pZCAqZHVtbXk7CisgICAgICAgICAgICAgICAgdm9pZCAqKmV4aXRfcnVudGltZV9wOworCisgICAgICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90IGx3X3Rhc2t0ZWFtOworCisgICAgICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1faW5pdCgmbHdfdGFza3RlYW0sIG1hc3Rlcl90aCwgZ3RpZCwKKyAgICAgICAgICAgICAgICAgICAgICAgIHVud3JhcHBlZF90YXNrLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgbHdfdGFza3RlYW0ub21wdF90YXNrX2luZm8udGFza19pZCA9IF9fb21wdF90YXNrX2lkX25ldyhndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSk7CisKKyAgICAgICAgICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2xpbmsoJmx3X3Rhc2t0ZWFtLCBtYXN0ZXJfdGgpOworCisjaWYgT01QVF9UUkFDRQorICAgICAgICAgICAgICAgICAgICAvKiBPTVBUIGltcGxpY2l0IHRhc2sgYmVnaW4gKi8KKyAgICAgICAgICAgICAgICAgICAgbXlfdGFza19pZCA9IGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQ7CisgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkID0gb21wdF9wYXJhbGxlbF9pZDsKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW4pKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICAgICAgLyogT01QVCBzdGF0ZSAqLworICAgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmZHVtbXk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2ssIGd0aWQsIDAsIGFyZ2MsIGFyZ3MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyNpZiBPTVBUX1RSQUNFCisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZCkoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQsIG15X3Rhc2tfaWQpOworICAgICAgICAgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKG1hc3Rlcl90aCk7CisgICAgICAgICAgICAgICAgICAgIC8vIHJlc2V0IGNsZWFyIHRoZSB0YXNrIGlkIG9ubHkgYWZ0ZXIgdW5saW5raW5nIHRoZSB0YXNrCisgICAgICAgICAgICAgICAgICAgIGx3X3Rhc2t0ZWFtLm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBvbXB0X3Rhc2tfaWRfbm9uZTsKKworICAgICAgICAgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWQsIG9tcHRfdGFza19pZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBPTVBUX0lOVk9LRVIoY2FsbF9jb250ZXh0KSk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIGNhbGxfY29udGV4dCA9PSBmb3JrX2NvbnRleHRfZ251ICkgeworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90ICpsd3QgPSAob21wdF9sd190YXNrdGVhbV90ICopCisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKG9tcHRfbHdfdGFza3RlYW1fdCkpOworICAgICAgICAgICAgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQobHd0LCBtYXN0ZXJfdGgsIGd0aWQsCisgICAgICAgICAgICAgICAgdW53cmFwcGVkX3Rhc2ssIG9tcHRfcGFyYWxsZWxfaWQpOworCisgICAgICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQgPSBfX29tcHRfdGFza19pZF9uZXcoZ3RpZCk7CisgICAgICAgICAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisgICAgICAgICAgICBfX29tcHRfbHdfdGFza3RlYW1fbGluayhsd3QsIG1hc3Rlcl90aCk7CisjZW5kaWYKKworICAgICAgICAgICAgLy8gd2Ugd2VyZSBjYWxsZWQgZnJvbSBHTlUgbmF0aXZlIGNvZGUKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IFQjJWQgc2VyaWFsIGV4aXRcbiIsIGd0aWQgKSk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggY2FsbF9jb250ZXh0IDwgZm9ya19jb250ZXh0X2xhc3QsICJfX2ttcF9mb3JrX2NhbGw6IHVua25vd24gZm9ya19jb250ZXh0IHBhcmFtZXRlciIgKTsKKyAgICAgICAgfQorCisKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCBzZXJpYWwgZXhpdFxuIiwgZ3RpZCApKTsKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisKKyAgICAvLyBHRUg6IG9ubHkgbW9kaWZ5IHRoZSBleGVjdXRpbmcgZmxhZyBpbiB0aGUgY2FzZSB3aGVuIG5vdCBzZXJpYWxpemVkCisgICAgLy8gICAgICBzZXJpYWxpemVkIGNhc2UgaXMgaGFuZGxlZCBpbiBrbXBjX3NlcmlhbGl6ZWRfcGFyYWxsZWwKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2ZvcmtfY2FsbDogcGFyZW50X3RlYW1fYWNsZXZlbD0lZCwgbWFzdGVyX3RoPSVwLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heF9hY2xldmVsPSVkXG4iLAorICAgICAgICAgICAgICAgICAgcGFyZW50X3RlYW0tPnQudF9hY3RpdmVfbGV2ZWwsIG1hc3Rlcl90aCwgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgLy8gVE9ETzogR0VIIC0gY2Fubm90IGRvIHRoaXMgYXNzZXJ0aW9uIGJlY2F1c2Ugcm9vdCB0aHJlYWQgbm90IHNldCB1cCBhcyBleGVjdXRpbmcKKyAgICAvLyBLTVBfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDEgKTsKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwgbGV2ZWwgPiB0ZWFtc19sZXZlbCApCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIC8qIEluY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVsICovCisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgfQorCisgICAgLy8gU2VlIGlmIHdlIG5lZWQgdG8gbWFrZSBhIGNvcHkgb2YgdGhlIElDVnMuCisgICAgaW50IG50aHJlYWRzX2ljdiA9IG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm5wcm9jOworICAgIGlmICgobGV2ZWwrMSA8IF9fa21wX25lc3RlZF9udGgudXNlZCkgJiYgKF9fa21wX25lc3RlZF9udGgubnRoW2xldmVsKzFdICE9IG50aHJlYWRzX2ljdikpIHsKKyAgICAgICAgbnRocmVhZHNfaWN2ID0gX19rbXBfbmVzdGVkX250aC5udGhbbGV2ZWwrMV07CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudGhyZWFkc19pY3YgPSAwOyAgLy8gZG9uJ3QgdXBkYXRlCisgICAgfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvLyBGaWd1cmUgb3V0IHRoZSBwcm9jX2JpbmRfcG9saWN5IGZvciB0aGUgbmV3IHRlYW0uCisgICAga21wX3Byb2NfYmluZF90IHByb2NfYmluZCA9IG1hc3Rlcl90aC0+dGgudGhfc2V0X3Byb2NfYmluZDsKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kX2ljdiA9IHByb2NfYmluZF9kZWZhdWx0OyAvLyBwcm9jX2JpbmRfZGVmYXVsdCBtZWFucyBkb24ndCB1cGRhdGUKKyAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnByb2NfYmluZCA9PSBwcm9jX2JpbmRfZmFsc2UgKSB7CisgICAgICAgIHByb2NfYmluZCA9IHByb2NfYmluZF9mYWxzZTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGlmIChwcm9jX2JpbmQgPT0gcHJvY19iaW5kX2RlZmF1bHQpIHsKKyAgICAgICAgICAgIC8vIE5vIHByb2NfYmluZCBjbGF1c2Ugc3BlY2lmaWVkOyB1c2UgY3VycmVudCBwcm9jLWJpbmQtdmFyIGZvciB0aGlzIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgICAgICAgcHJvY19iaW5kID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kOworICAgICAgICB9CisgICAgICAgIC8qIGVsc2U6IFRoZSBwcm9jX2JpbmQgcG9saWN5IHdhcyBzcGVjaWZpZWQgZXhwbGljaXRseSBvbiBwYXJhbGxlbCBjbGF1c2UuIFRoaXMKKyAgICAgICAgICAgb3ZlcnJpZGVzIHByb2MtYmluZC12YXIgZm9yIHRoaXMgcGFyYWxsZWwgcmVnaW9uLCBidXQgZG9lcyBub3QgY2hhbmdlIHByb2MtYmluZC12YXIuICovCisgICAgICAgIC8vIEZpZ3VyZSB0aGUgdmFsdWUgb2YgcHJvYy1iaW5kLXZhciBmb3IgdGhlIGNoaWxkIHRocmVhZHMuCisgICAgICAgIGlmICgobGV2ZWwrMSA8IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCkKKyAgICAgICAgICAgICYmIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbbGV2ZWwrMV0gIT0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMucHJvY19iaW5kKSkgeworICAgICAgICAgICAgcHJvY19iaW5kX2ljdiA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tsZXZlbCsxXTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8vIFJlc2V0IGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbgorICAgIG1hc3Rlcl90aC0+dGgudGhfc2V0X3Byb2NfYmluZCA9IHByb2NfYmluZF9kZWZhdWx0OworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBpZiAoKG50aHJlYWRzX2ljdiA+IDApCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgfHwgKHByb2NfYmluZF9pY3YgIT0gcHJvY19iaW5kX2RlZmF1bHQpCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgKSB7CisgICAgICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgbmV3X2ljdnM7CisgICAgICAgIGNvcHlfaWN2cygmbmV3X2ljdnMsICZtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyk7CisgICAgICAgIG5ld19pY3ZzLm5leHQgPSBOVUxMOworICAgICAgICBpZiAobnRocmVhZHNfaWN2ID4gMCkgeworICAgICAgICAgICAgbmV3X2ljdnMubnByb2MgPSBudGhyZWFkc19pY3Y7CisgICAgICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmIChwcm9jX2JpbmRfaWN2ICE9IHByb2NfYmluZF9kZWZhdWx0KSB7CisgICAgICAgICAgICBuZXdfaWN2cy5wcm9jX2JpbmQgPSBwcm9jX2JpbmRfaWN2OworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBwYXJhbGxlbCB0ZWFtICovCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBiZWZvcmUgX19rbXBfYWxsb2NhdGVfdGVhbVxuIiApICk7CisgICAgICAgIHRlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKHJvb3QsIG50aHJlYWRzLCBudGhyZWFkcywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbmV3X2ljdnMsIGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvKiBhbGxvY2F0ZSBhIG5ldyBwYXJhbGxlbCB0ZWFtICovCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZm9ya19jYWxsOiBiZWZvcmUgX19rbXBfYWxsb2NhdGVfdGVhbVxuIiApICk7CisgICAgICAgIHRlYW0gPSBfX2ttcF9hbGxvY2F0ZV90ZWFtKHJvb3QsIG50aHJlYWRzLCBudGhyZWFkcywKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZCwKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByb2NfYmluZCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMsIGFyZ2MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKG1hc3Rlcl90aCkgKTsKKyAgICB9CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9mb3JrX2NhbGw6IGFmdGVyIF9fa21wX2FsbG9jYXRlX3RlYW0gLSB0ZWFtID0gJXBcbiIsIHRlYW0gKSApOworCisgICAgLyogc2V0dXAgdGhlIG5ldyB0ZWFtICovCisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfbWFzdGVyX3RpZCwgbWFzdGVyX3RpZCk7CisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfbWFzdGVyX3RoaXNfY29ucywgbWFzdGVyX3RoaXNfY29ucyk7CisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfaWRlbnQsIGxvYyk7CisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfcGFyZW50LCBwYXJlbnRfdGVhbSk7CisgICAgS01QX0NIRUNLX1VQREFURV9TWU5DKHRlYW0tPnQudF9wa2ZuLCBtaWNyb3Rhc2spOworI2lmIE9NUFRfU1VQUE9SVAorICAgIEtNUF9DSEVDS19VUERBVEVfU1lOQyh0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLm1pY3JvdGFzaywgdW53cmFwcGVkX3Rhc2spOworI2VuZGlmCisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfaW52b2tlLCBpbnZva2VyKTsgIC8qIFRPRE8gbW92ZSB0aGlzIHRvIHJvb3QsIG1heWJlICovCisgICAgLy8gVE9ETzogcGFyZW50X3RlYW0tPnQudF9sZXZlbCA9PSBJTlRfTUFYID8/PworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwgbGV2ZWwgPiB0ZWFtc19sZXZlbCApIHsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICBpbnQgbmV3X2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbCArIDE7CisgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2xldmVsLCBuZXdfbGV2ZWwpOworICAgICAgICBuZXdfbGV2ZWwgPSBwYXJlbnRfdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCArIDE7CisgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2FjdGl2ZV9sZXZlbCwgbmV3X2xldmVsKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEFDOiBEbyBub3QgaW5jcmVhc2UgcGFyYWxsZWwgbGV2ZWwgYXQgc3RhcnQgb2YgdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICBpbnQgbmV3X2xldmVsID0gcGFyZW50X3RlYW0tPnQudF9sZXZlbDsKKyAgICAgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfbGV2ZWwsIG5ld19sZXZlbCk7CisgICAgICAgIG5ld19sZXZlbCA9IHBhcmVudF90ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwsIG5ld19sZXZlbCk7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAga21wX3Jfc2NoZWRfdCBuZXdfc2NoZWQgPSBnZXRfX3NjaGVkXzIocGFyZW50X3RlYW0sIG1hc3Rlcl90aWQpOworICAgIGlmICh0ZWFtLT50LnRfc2NoZWQucl9zY2hlZF90eXBlICE9IG5ld19zY2hlZC5yX3NjaGVkX3R5cGUgfHwgdGVhbS0+dC50X3NjaGVkLmNodW5rICE9IG5ld19zY2hlZC5jaHVuaykKKyAgICAgICAgdGVhbS0+dC50X3NjaGVkID0gbmV3X3NjaGVkOyAvLyBzZXQgbWFzdGVyJ3Mgc2NoZWR1bGUgYXMgbmV3IHJ1bi10aW1lIHNjaGVkdWxlCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X2NhbmNlbF9yZXF1ZXN0LCBjYW5jZWxfbm9yZXEpOworI2VuZGlmCisKKyAgICAvLyBVcGRhdGUgdGhlIGZsb2F0aW5nIHBvaW50IHJvdW5kaW5nIGluIHRoZSB0ZWFtIGlmIHJlcXVpcmVkLgorICAgIHByb3BhZ2F0ZUZQQ29udHJvbCh0ZWFtKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIFNldCBtYXN0ZXIncyB0YXNrIHRlYW0gdG8gdGVhbSdzIHRhc2sgdGVhbS4gVW5sZXNzIHRoaXMgaXMgaG90IHRlYW0sIGl0IHNob3VsZCBiZSBOVUxMLgorI2lmIDAKKyAgICAgICAgLy8gUGF0Y2ggb3V0IGFuIGFzc2VydGlvbiB0aGF0IHRyaXBzIHdoaWxlIHRoZSBydW50aW1lIHNlZW1zIHRvIG9wZXJhdGUgY29ycmVjdGx5LgorICAgICAgICAvLyBBdm9pZGluZyB0aGUgcHJlY29uZGl0aW9ucyB0aGF0IGNhdXNlIHRoZSBhc3NlcnRpb24gdG8gdHJpcCBoYXMgYmVlbiBwcm9taXNlZCBhcyBhIGZvcnRoY29taW5nIHBhdGNoLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtID09IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0pOworI2VuZGlmCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZm9ya19jYWxsOiBNYXN0ZXIgVCMlZCBwdXNoaW5nIHRhc2tfdGVhbSAlcCAvIHRlYW0gJXAsIG5ldyB0YXNrX3RlYW0gJXAgLyB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICBwYXJlbnRfdGVhbSwgdGVhbS0+dC50X3Rhc2tfdGVhbVttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVdLCB0ZWFtICkgKTsKKworICAgICAgICBpZiAoIGFjdGl2ZV9sZXZlbCB8fCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSApIHsKKyAgICAgICAgICAgIC8vIFRha2UgYSBtZW1vIG9mIG1hc3RlcidzIHRhc2tfc3RhdGUKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2spOworICAgICAgICAgICAgaWYgKG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3AgPj0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6KSB7IC8vIGluY3JlYXNlIHNpemUKKyAgICAgICAgICAgICAgICBrbXBfdWludDMyIG5ld19zaXplID0gMiptYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7CisgICAgICAgICAgICAgICAga21wX3VpbnQ4ICpvbGRfc3RhY2ssICpuZXdfc3RhY2s7CisgICAgICAgICAgICAgICAga21wX3VpbnQzMiBpOworICAgICAgICAgICAgICAgIG5ld19zdGFjayA9IChrbXBfdWludDggKilfX2ttcF9hbGxvY2F0ZShuZXdfc2l6ZSk7CisgICAgICAgICAgICAgICAgZm9yIChpPTA7IGk8bWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6OyArK2kpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV3X3N0YWNrW2ldID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbaV07CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGZvciAoaT1tYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3o7IGk8bmV3X3NpemU7ICsraSkgeyAvLyB6ZXJvLWluaXQgcmVzdCBvZiBzdGFjaworICAgICAgICAgICAgICAgICAgICBuZXdfc3RhY2tbaV0gPSAwOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBvbGRfc3RhY2sgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayA9IG5ld19zdGFjazsKKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfc3RhY2tfc3ogPSBuZXdfc2l6ZTsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlKG9sZF9zdGFjayk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvLyBTdG9yZSBtYXN0ZXIncyB0YXNrX3N0YXRlIG9uIHN0YWNrCisgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZTsKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3ArKzsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYgKHRlYW0gPT0gbWFzdGVyX3RoLT50aC50aF9ob3RfdGVhbXNbYWN0aXZlX2xldmVsXS5ob3RfdGVhbSkgeyAvLyBSZXN0b3JlIG1hc3RlcidzIG5lc3RlZCBzdGF0ZSBpZiBuZXN0ZWQgaG90IHRlYW0KKyAgICAgICAgICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGUgPSBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFja1ttYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworI2VuZGlmCisgICAgICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgIH0KKyNpZiAhS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCgobWFzdGVyX3RoLT50aC50aF90YXNrX3RlYW0gPT0gTlVMTCkgfHwgKHRlYW0gPT0gcm9vdC0+ci5yX2hvdF90ZWFtKSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZm9ya19jYWxsOiBUIyVkKCVkOiVkKS0+KCVkOjApIGNyZWF0ZWQgYSB0ZWFtIG9mICVkIHRocmVhZHNcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgcGFyZW50X3RlYW0tPnQudF9pZCwgdGVhbS0+dC50X21hc3Rlcl90aWQsIHRlYW0tPnQudF9pZCwgdGVhbS0+dC50X25wcm9jICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gIT0gcm9vdC0+ci5yX2hvdF90ZWFtIHx8CisgICAgICAgICAgICAgICAgICAgICAgKCB0ZWFtLT50LnRfbWFzdGVyX3RpZCA9PSAwICYmCisgICAgICAgICAgICAgICAgICAgICAgICAoIHRlYW0tPnQudF9wYXJlbnQgPT0gcm9vdC0+ci5yX3Jvb3RfdGVhbSB8fCB0ZWFtLT50LnRfcGFyZW50LT50LnRfc2VyaWFsaXplZCApICkpOworICAgIEtNUF9NQigpOworCisgICAgLyogbm93LCBzZXR1cCB0aGUgYXJndW1lbnRzICovCisgICAgYXJndiA9ICh2b2lkKiopdGVhbS0+dC50X2FyZ3Y7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpZiAoIGFwICkgeworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgICAgIGZvciAoIGk9YXJnYy0xOyBpID49IDA7IC0taSApIHsKKy8vIFRPRE86IHJldmVydCB3b3JrYXJvdW5kIGZvciBJbnRlbChSKSA2NCB0cmFja2VyICM5NgorI2lmIChLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfQVJNIHx8IEtNUF9BUkNIX0FBUkNINjQpICYmIEtNUF9PU19MSU5VWAorICAgICAgICAgICAgdm9pZCAqbmV3X2FyZ3YgPSB2YV9hcmcoKmFwLCB2b2lkICopOworI2Vsc2UKKyAgICAgICAgICAgIHZvaWQgKm5ld19hcmd2ID0gdmFfYXJnKGFwLCB2b2lkICopOworI2VuZGlmCisgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKCphcmd2LCBuZXdfYXJndik7CisgICAgICAgICAgICBhcmd2Kys7CisgICAgICAgIH0KKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIH0gZWxzZSB7CisgICAgICAgIGZvciAoIGk9MDsgaSA8IGFyZ2M7ICsraSApIHsKKyAgICAgICAgICAgIC8vIEdldCBhcmdzIGZyb20gcGFyZW50IHRlYW0gZm9yIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgS01QX0NIRUNLX1VQREFURShhcmd2W2ldLCB0ZWFtLT50LnRfcGFyZW50LT50LnRfYXJndltpXSk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIC8qIG5vdyBhY3R1YWxseSBmb3JrIHRoZSB0aHJlYWRzICovCisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZSwgbWFzdGVyX2FjdGl2ZSk7CisgICAgaWYgKCFyb290LT5yLnJfYWN0aXZlKSAvLyBPbmx5IGRvIGFzc2lnbm1lbnQgaWYgaXQgcHJldmVudHMgY2FjaGUgcGluZy1wb25nCisgICAgICAgIHJvb3QtPnIucl9hY3RpdmUgPSBUUlVFOworCisgICAgX19rbXBfZm9ya190ZWFtX3RocmVhZHMoIHJvb3QsIHRlYW0sIG1hc3Rlcl90aCwgZ3RpZCApOworICAgIF9fa21wX3NldHVwX2ljdl9jb3B5KCB0ZWFtLCBudGhyZWFkcywgJm1hc3Rlcl90aC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLCBsb2MgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG1hc3Rlcl90aC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbDsKKyNlbmRpZgorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgPT0gMSAvLyBvbmx5IHJlcG9ydCBmcmFtZXMgYXQgbGV2ZWwgMQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAmJiAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgLy8gbm90IGluIHRlYW1zIGNvbnN0cnVjdAorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICkgeworI2lmIFVTRV9JVFRfTk9USUZZCisgICAgICAgIGlmICggKCBfX2l0dF9mcmFtZV9zdWJtaXRfdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgICggX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyB8fCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAxICkgKQorICAgICAgICB7CisgICAgICAgICAgICBrbXBfdWludDY0IHRtcF90aW1lID0gMDsKKyAgICAgICAgICAgIGlmICggX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgKQorICAgICAgICAgICAgICAgIHRtcF90aW1lID0gX19pdHRfZ2V0X3RpbWVzdGFtcCgpOworICAgICAgICAgICAgLy8gSW50ZXJuYWwgZm9yayAtIHJlcG9ydCBmcmFtZSBiZWdpbgorICAgICAgICAgICAgbWFzdGVyX3RoLT50aC50aF9mcmFtZV90aW1lICA9IHRtcF90aW1lOworICAgICAgICAgICAgaWYgKCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICkKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcmVnaW9uX3RpbWUgPSB0bXBfdGltZTsKKyAgICAgICAgfSBlbHNlIC8vIG9ubHkgb25lIG5vdGlmaWNhdGlvbiBzY2hlbWUgKGVpdGhlciAic3VibWl0IiBvciAiZm9ya2luZy9qb2luZWQiLCBub3QgYm90aCkKKyNlbmRpZiAvKiBVU0VfSVRUX05PVElGWSAqLworICAgICAgICBpZiAoICggX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIHx8IEtNUF9JVFRfREVCVUcgKSAmJgorICAgICAgICAgICAgIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyAmJiAhX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKQorICAgICAgICB7IC8vIE1hcmsgc3RhcnQgb2YgInBhcmFsbGVsIiByZWdpb24gZm9yIFZUdW5lLgorICAgICAgICAgICAgX19rbXBfaXR0X3JlZ2lvbl9mb3JraW5nKGd0aWQsIHRlYW0tPnQudF9ucHJvYywgMCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgLyogbm93IGdvIG9uIGFuZCBkbyB0aGUgd29yayAqLworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gPT0gX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbSApOworICAgIEtNUF9NQigpOworICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiByb290PSVwLCB0ZWFtPSVwLCBtYXN0ZXJfdGg9JXAsIGd0aWQ9JWRcbiIsCisgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICB0ZWFtLT50LnRfc3RhY2tfaWQgPSBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpOyAvLyBjcmVhdGUgbmV3IHN0YWNrIHN0aXRjaGluZyBpZCBiZWZvcmUgZW50ZXJpbmcgZm9yayBiYXJyaWVyCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCBhcCApICAgLy8gQUM6IHNraXAgX19rbXBfaW50ZXJuYWxfZm9yayBhdCB0ZWFtcyBjb25zdHJ1Y3QsIGxldCBvbmx5IG1hc3RlciB0aHJlYWRzIGV4ZWN1dGUKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIHsKKyAgICAgICAgX19rbXBfaW50ZXJuYWxfZm9yayggbG9jLCBndGlkLCB0ZWFtICk7CisgICAgICAgIEtGX1RSQUNFKDEwLCAoIl9fa21wX2ludGVybmFsX2ZvcmsgOiBhZnRlciA6IHJvb3Q9JXAsIHRlYW09JXAsIG1hc3Rlcl90aD0lcCwgZ3RpZD0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICByb290LCB0ZWFtLCBtYXN0ZXJfdGgsIGd0aWQpKTsKKyAgICB9CisKKyAgICBpZiAoY2FsbF9jb250ZXh0ID09IGZvcmtfY29udGV4dF9nbnUpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogcGFyYWxsZWwgZXhpdCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisKKyAgICAvKiBJbnZva2UgbWljcm90YXNrIGZvciBNQVNURVIgdGhyZWFkICovCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBpbnZva2UgbWljcm90YXNrID0gJXBcbiIsCisgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfcGtmbiApICk7CisgICAgfSAgLy8gRU5EIG9mIHRpbWVyIEtNUF9mb3JrX2NhbGwgYmxvY2sKKworICAgIHsKKyAgICAgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BhcmFsbGVsKTsKKyAgICAgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgICAgIC8vIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX21hc3Rlcl9pbnZva2UpOworICAgICAgICBpZiAoISB0ZWFtLT50LnRfaW52b2tlKCBndGlkICkpIHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQyKCAwLCAiY2Fubm90IGludm9rZSBtaWNyb3Rhc2sgZm9yIE1BU1RFUiB0aHJlYWQiICk7CisgICAgICAgIH0KKyAgICB9CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2ZvcmtfY2FsbDogVCMlZCglZDowKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICBndGlkLCB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9wa2ZuICkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mb3JrX2NhbGw6IHBhcmFsbGVsIGV4aXQgVCMlZFxuIiwgZ3RpZCApKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBUUlVFOworfQorCisjaWYgT01QVF9TVVBQT1JUCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX2pvaW5fcmVzdG9yZV9zdGF0ZSgKKyAgICBrbXBfaW5mb190ICp0aHJlYWQsCisgICAga21wX3RlYW1fdCAqdGVhbSkKK3sKKyAgICAvLyByZXN0b3JlIHN0YXRlIG91dHNpZGUgdGhlIHJlZ2lvbgorICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby5zdGF0ZSA9ICgodGVhbS0+dC50X3NlcmlhbGl6ZWQpID8KKyAgICAgICAgb21wdF9zdGF0ZV93b3JrX3NlcmlhbCA6IG9tcHRfc3RhdGVfd29ya19wYXJhbGxlbCk7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfam9pbl9vbXB0KAorICAgIGttcF9pbmZvX3QgKnRocmVhZCwKKyAgICBrbXBfdGVhbV90ICp0ZWFtLAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgICBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQpCit7CisgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKSB7CisgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9wYXJhbGxlbF9lbmQpKAorICAgICAgICAgICAgcGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwgT01QVF9JTlZPS0VSKGZvcmtfY29udGV4dCkpOworICAgIH0KKworICAgIF9fa21wX2pvaW5fcmVzdG9yZV9zdGF0ZSh0aHJlYWQsdGVhbSk7Cit9CisjZW5kaWYKKwordm9pZAorX19rbXBfam9pbl9jYWxsKGlkZW50X3QgKmxvYywgaW50IGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICwgZW51bSBmb3JrX2NvbnRleHRfZSBmb3JrX2NvbnRleHQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICAgICAsIGludCBleGl0X3RlYW1zCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKykKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soS01QX2pvaW5fY2FsbCk7CisgICAga21wX3RlYW1fdCAgICAgKnRlYW07CisgICAga21wX3RlYW1fdCAgICAgKnBhcmVudF90ZWFtOworICAgIGttcF9pbmZvX3QgICAgICptYXN0ZXJfdGg7CisgICAga21wX3Jvb3RfdCAgICAgKnJvb3Q7CisgICAgaW50ICAgICAgICAgICAgIG1hc3Rlcl9hY3RpdmU7CisgICAgaW50ICAgICAgICAgICAgIGk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfam9pbl9jYWxsOiBlbnRlciBUIyVkXG4iLCBndGlkICkpOworCisgICAgLyogc2V0dXAgY3VycmVudCBkYXRhICovCisgICAgbWFzdGVyX3RoICAgICA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICByb290ICAgICAgICAgID0gbWFzdGVyX3RoLT50aC50aF9yb290OworICAgIHRlYW0gICAgICAgICAgPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW07CisgICAgcGFyZW50X3RlYW0gICA9IHRlYW0tPnQudF9wYXJlbnQ7CisKKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2lkZW50ID0gbG9jOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBtYXN0ZXJfdGgtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgIH0KKyNlbmRpZgorCisjaWYgS01QX0RFQlVHCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9qb2luX2NhbGw6IFQjJWQsIG9sZCB0ZWFtID0gJXAgb2xkIHRhc2tfdGVhbSA9ICVwLCB0aF90YXNrX3RlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCBtYXN0ZXJfdGggKSwgdGVhbSwKKyAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0sIG1hc3Rlcl90aC0+dGgudGhfdGFza190ZWFtKSApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9PSB0ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV0gKTsKKyAgICB9CisjZW5kaWYKKworICAgIGlmKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApIHsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgLy8gV2UgYXJlIGluIHRlYW1zIGNvbnN0cnVjdAorICAgICAgICAgICAgaW50IGxldmVsID0gdGVhbS0+dC50X2xldmVsOworICAgICAgICAgICAgaW50IHRsZXZlbCA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICBpZiAoIGxldmVsID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICAvLyBBQzogd2UgaGF2ZW4ndCBpbmNyZW1lbnRlZCBpdCBlYXJsaWVyIGF0IHN0YXJ0IG9mIHRlYW1zIGNvbnN0cnVjdCwKKyAgICAgICAgICAgICAgICAvLyAgICAgc28gZG8gaXQgaGVyZSAtIGF0IHRoZSBlbmQgb2YgdGVhbXMgY29uc3RydWN0CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X2xldmVsKys7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBsZXZlbCA9PSB0bGV2ZWwgKyAxICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiB3ZSBhcmUgZXhpdGluZyBwYXJhbGxlbCBpbnNpZGUgdGVhbXMsIG5lZWQgdG8gaW5jcmVtZW50IHNlcmlhbGl6YXRpb24KKyAgICAgICAgICAgICAgICAvLyAgICAgaW4gb3JkZXIgdG8gcmVzdG9yZSBpdCBpbiB0aGUgbmV4dCBjYWxsIHRvIF9fa21wY19lbmRfc2VyaWFsaXplZF9wYXJhbGxlbAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zZXJpYWxpemVkKys7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICBfX2ttcGNfZW5kX3NlcmlhbGl6ZWRfcGFyYWxsZWwoIGxvYywgZ3RpZCApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIF9fa21wX2pvaW5fcmVzdG9yZV9zdGF0ZShtYXN0ZXJfdGgsIHBhcmVudF90ZWFtKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIG1hc3Rlcl9hY3RpdmUgPSB0ZWFtLT50LnRfbWFzdGVyX2FjdGl2ZTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCFleGl0X3RlYW1zKQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisgICAgeworICAgICAgICAvLyBBQzogTm8gYmFycmllciBmb3IgaW50ZXJuYWwgdGVhbXMgYXQgZXhpdCBmcm9tIHRlYW1zIGNvbnN0cnVjdC4KKyAgICAgICAgLy8gICAgIEJ1dCB0aGVyZSBpcyBiYXJyaWVyIGZvciBleHRlcm5hbCB0ZWFtIChsZWFndWUpLgorICAgICAgICBfX2ttcF9pbnRlcm5hbF9qb2luKCBsb2MsIGd0aWQsIHRlYW0gKTsKKyAgICB9CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBlbHNlIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlID0gMDsgLy8gQUM6IG5vIHRhc2tpbmcgaW4gdGVhbXMgKG91dCBvZiBhbnkgcGFyYWxsZWwpCisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICBLTVBfTUIoKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCA9IHRlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisjZW5kaWYKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGRlc3Ryb3kgdGhlIHN0YWNrIHN0aXRjaGluZyBpZCBhZnRlciBqb2luIGJhcnJpZXIKKyAgICB9CisKKyAgICAvLyBNYXJrIGVuZCBvZiAicGFyYWxsZWwiIHJlZ2lvbiBmb3IgVlR1bmUuCisgICAgaWYgKCB0ZWFtLT50LnRfYWN0aXZlX2xldmVsID09IDEKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgJiYgIW1hc3Rlcl90aC0+dGgudGhfdGVhbXNfbWljcm90YXNrIC8qIG5vdCBpbiB0ZWFtcyBjb25zdHJ1Y3QgKi8KKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICApIHsKKyAgICAgICAgbWFzdGVyX3RoLT50aC50aF9pZGVudCA9IGxvYzsKKyAgICAgICAgLy8gb25seSBvbmUgbm90aWZpY2F0aW9uIHNjaGVtZSAoZWl0aGVyICJzdWJtaXQiIG9yICJmb3JraW5nL2pvaW5lZCIsIG5vdCBib3RoKQorICAgICAgICBpZiAoICggX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciB8fCBLTVBfSVRUX0RFQlVHICkgJiYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMyApCisgICAgICAgICAgICBfX2ttcF9pdHRfZnJhbWVfc3VibWl0KCBndGlkLCB0ZWFtLT50LnRfcmVnaW9uX3RpbWUsIG1hc3Rlcl90aC0+dGgudGhfZnJhbWVfdGltZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsIGxvYywgbWFzdGVyX3RoLT50aC50aF90ZWFtX25wcm9jLCAxICk7CisgICAgICAgIGVsc2UgaWYgKCAoIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgfHwgS01QX0lUVF9ERUJVRyApICYmCisgICAgICAgICAgICAhIF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlICYmIF9fa21wX2Zvcmtqb2luX2ZyYW1lcyApCisgICAgICAgICAgICBfX2ttcF9pdHRfcmVnaW9uX2pvaW5lZCggZ3RpZCApOworICAgIH0gLy8gYWN0aXZlX2xldmVsID09IDEKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmICggbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgJiYKKyAgICAgICAgICFleGl0X3RlYW1zICYmCisgICAgICAgICB0ZWFtLT50LnRfcGtmbiAhPSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyICYmCisgICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgPT0gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbCArIDEgKSB7CisgICAgICAgIC8vIEFDOiBXZSBuZWVkIHRvIGxlYXZlIHRoZSB0ZWFtIHN0cnVjdHVyZSBpbnRhY3QgYXQgdGhlIGVuZAorICAgICAgICAvLyAgICAgb2YgcGFyYWxsZWwgaW5zaWRlIHRoZSB0ZWFtcyBjb25zdHJ1Y3QsIHNvIHRoYXQgYXQgdGhlIG5leHQKKyAgICAgICAgLy8gICAgIHBhcmFsbGVsIHNhbWUgKGhvdCkgdGVhbSB3b3Jrcywgb25seSBhZGp1c3QgbmVzdGluZyBsZXZlbHMKKworICAgICAgICAvKiBEZWNyZW1lbnQgb3VyIG5lc3RlZCBkZXB0aCBsZXZlbCAqLworICAgICAgICB0ZWFtLT50LnRfbGV2ZWwgLS07CisgICAgICAgIHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLS07CisgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisKKyAgICAgICAgLyogUmVzdG9yZSBudW1iZXIgb2YgdGhyZWFkcyBpbiB0aGUgdGVhbSBpZiBuZWVkZWQgKi8KKyAgICAgICAgaWYgKCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2MgPCBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1zX3NpemUubnRoICkgeworICAgICAgICAgICAgaW50IG9sZF9udW0gPSBtYXN0ZXJfdGgtPnRoLnRoX3RlYW1fbnByb2M7CisgICAgICAgICAgICBpbnQgbmV3X251bSA9IG1hc3Rlcl90aC0+dGgudGhfdGVhbXNfc2l6ZS5udGg7CisgICAgICAgICAgICBrbXBfaW5mb190ICoqb3RoZXJfdGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gbmV3X251bTsKKyAgICAgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgb2xkX251bTsgKytpICkgeworICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZHNbaV0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnVtOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gQWRqdXN0IHN0YXRlcyBvZiBub24tdXNlZCB0aHJlYWRzIG9mIHRoZSB0ZWFtCisgICAgICAgICAgICBmb3IgKCBpID0gb2xkX251bTsgaSA8IG5ld19udW07ICsraSApIHsKKyAgICAgICAgICAgICAgICAvLyBSZS1pbml0aWFsaXplIHRocmVhZCdzIGJhcnJpZXIgZGF0YS4KKyAgICAgICAgICAgICAgICBpbnQgYjsKKyAgICAgICAgICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBvdGhlcl90aHJlYWRzW2ldLT50aC50aF9iYXI7CisgICAgICAgICAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnblsgYiBdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gU3luY2hyb25pemUgdGhyZWFkJ3MgdGFzayBzdGF0ZQorICAgICAgICAgICAgICAgICAgICBvdGhlcl90aHJlYWRzW2ldLT50aC50aF90YXNrX3N0YXRlID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIF9fa21wX2pvaW5fb21wdChtYXN0ZXJfdGgsIHBhcmVudF90ZWFtLCBwYXJhbGxlbF9pZCwgZm9ya19jb250ZXh0KTsKKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLyogZG8gY2xlYW51cCBhbmQgcmVzdG9yZSB0aGUgcGFyZW50IHRlYW0gKi8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2luZm8gLmRzLmRzX3RpZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIG1hc3Rlcl90aC0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSB0ZWFtLT50LnRfbWFzdGVyX3RoaXNfY29uczsKKworICAgIG1hc3Rlcl90aC0+dGgudGhfZGlzcGF0Y2ggPQorICAgICAgICAgICAgICAgICYgcGFyZW50X3RlYW0tPnQudF9kaXNwYXRjaFsgdGVhbS0+dC50X21hc3Rlcl90aWQgXTsKKworICAgIC8qIGpjOiBUaGUgZm9sbG93aW5nIGxvY2sgaGFzIGluc3RydWN0aW9ucyB3aXRoIFJFTCBhbmQgQUNRIHNlbWFudGljcywKKyAgICAgICBzZXBhcmF0aW5nIHRoZSBwYXJhbGxlbCB1c2VyIGNvZGUgY2FsbGVkIGluIHRoaXMgcGFyYWxsZWwgcmVnaW9uCisgICAgICAgZnJvbSB0aGUgc2VyaWFsIHVzZXIgY29kZSBjYWxsZWQgYWZ0ZXIgdGhpcyBmdW5jdGlvbiByZXR1cm5zLgorICAgICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgaWYgKCAhbWFzdGVyX3RoLT50aC50aF90ZWFtc19taWNyb3Rhc2sgfHwgdGVhbS0+dC50X2xldmVsID4gbWFzdGVyX3RoLT50aC50aF90ZWFtc19sZXZlbCApCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB7CisgICAgICAgIC8qIERlY3JlbWVudCBvdXIgbmVzdGVkIGRlcHRoIGxldmVsICovCisgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIqKSAmcm9vdC0+ci5yX2luX3BhcmFsbGVsICk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9pbl9wYXJhbGxlbCA+PSAwICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmKG9tcHRfZW5hYmxlZCl7CisgICAgICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oMCk7CisgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKSB7CisgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgIHBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgICAgICB9CisgICAgICAgIHRhc2tfaW5mby0+ZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgdGFza19pbmZvLT50YXNrX2lkID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9qb2luX2NhbGwxOiBUIyVkLCB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIG1hc3Rlcl90aCwgdGVhbSApICk7CisgICAgX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCggbWFzdGVyX3RoICk7CisKKyNpZiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBSZXN0b3JlIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24uCisgICAgLy8KKyAgICBtYXN0ZXJfdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gdGVhbS0+dC50X2ZpcnN0X3BsYWNlOworICAgIG1hc3Rlcl90aC0+dGgudGhfbGFzdF9wbGFjZSA9IHRlYW0tPnQudF9sYXN0X3BsYWNlOworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICB1cGRhdGVIV0ZQQ29udHJvbCAodGVhbSk7CisKKyAgICBpZiAoIHJvb3QtPnIucl9hY3RpdmUgIT0gbWFzdGVyX2FjdGl2ZSApCisgICAgICAgIHJvb3QtPnIucl9hY3RpdmUgPSBtYXN0ZXJfYWN0aXZlOworCisgICAgX19rbXBfZnJlZV90ZWFtKCByb290LCB0ZWFtIFVTRV9ORVNURURfSE9UX0FSRyhtYXN0ZXJfdGgpICk7IC8vIHRoaXMgd2lsbCBmcmVlIHdvcmtlciB0aHJlYWRzCisKKyAgICAvKiB0aGlzIHJhY2Ugd2FzIGZ1biB0byBmaW5kLiAgbWFrZSBzdXJlIHRoZSBmb2xsb3dpbmcgaXMgaW4gdGhlIGNyaXRpY2FsCisgICAgICogcmVnaW9uIG90aGVyd2lzZSBhc3NlcnRpb25zIG1heSBmYWlsIG9jY2FzaW9uYWxseSBzaW5jZSB0aGUgb2xkIHRlYW0KKyAgICAgKiBtYXkgYmUgcmVhbGxvY2F0ZWQgYW5kIHRoZSBoaWVyYXJjaHkgYXBwZWFycyBpbmNvbnNpc3RlbnQuICBpdCBpcworICAgICAqIGFjdHVhbGx5IHNhZmUgdG8gcnVuIGFuZCB3b24ndCBjYXVzZSBhbnkgYnVncywgYnV0IHdpbGwgY2F1c2UgdGhvc2UKKyAgICAgKiBhc3NlcnRpb24gZmFpbHVyZXMuICBpdCdzIG9ubHkgb25lIGRlcmVmJmFzc2lnbiBzbyBtaWdodCBhcyB3ZWxsIHB1dCB0aGlzCisgICAgICogaW4gdGhlIGNyaXRpY2FsIHJlZ2lvbiAqLworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbSAgICAgICAgPSAgIHBhcmVudF90ZWFtOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9ucHJvYyAgPSAgIHBhcmVudF90ZWFtLT50LnRfbnByb2M7CisgICAgbWFzdGVyX3RoLT50aC50aF90ZWFtX21hc3RlciA9ICAgcGFyZW50X3RlYW0tPnQudF90aHJlYWRzWzBdOworICAgIG1hc3Rlcl90aC0+dGgudGhfdGVhbV9zZXJpYWxpemVkID0gcGFyZW50X3RlYW0tPnQudF9zZXJpYWxpemVkOworCisgICAgLyogcmVzdG9yZSBzZXJpYWxpemVkIHRlYW0sIGlmIG5lZWQgYmUgKi8KKyAgICBpZiggcGFyZW50X3RlYW0tPnQudF9zZXJpYWxpemVkICYmCisgICAgICAgIHBhcmVudF90ZWFtICE9IG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gJiYKKyAgICAgICAgcGFyZW50X3RlYW0gIT0gcm9vdC0+ci5yX3Jvb3RfdGVhbSApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgbWFzdGVyX3RoLT50aC50aF9zZXJpYWxfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfc2VyaWFsX3RlYW0gPSBwYXJlbnRfdGVhbTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICBpZiAobWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlX3RvcCA+IDApIHsgLy8gUmVzdG9yZSB0YXNrIHN0YXRlIGZyb20gbWVtbyBzdGFjaworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfbWVtb19zdGFjayk7CisgICAgICAgICAgICAvLyBSZW1lbWJlciBtYXN0ZXIncyBzdGF0ZSBpZiB3ZSByZS11c2UgdGhpcyBuZXN0ZWQgaG90IHRlYW0KKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdID0gbWFzdGVyX3RoLT50aC50aF90YXNrX3N0YXRlOworICAgICAgICAgICAgLS1tYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfc3RhdGVfdG9wOyAvLyBwb3AKKyAgICAgICAgICAgIC8vIE5vdyByZXN0b3JlIHN0YXRlIGF0IHRoaXMgbGV2ZWwKKyAgICAgICAgICAgIG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZSA9IG1hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV90b3BdOworICAgICAgICB9CisgICAgICAgIC8vIENvcHkgdGhlIHRhc2sgdGVhbSBmcm9tIHRoZSBwYXJlbnQgdGVhbSB0byB0aGUgbWFzdGVyIHRocmVhZAorICAgICAgICBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSA9IHBhcmVudF90ZWFtLT50LnRfdGFza190ZWFtW21hc3Rlcl90aC0+dGgudGhfdGFza19zdGF0ZV07CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfam9pbl9jYWxsOiBNYXN0ZXIgVCMlZCByZXN0b3JpbmcgdGFza190ZWFtICVwIC8gdGVhbSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIG1hc3Rlcl90aCApLCBtYXN0ZXJfdGgtPnRoLnRoX3Rhc2tfdGVhbSwgcGFyZW50X3RlYW0gKSApOworICAgIH0KKworICAgICAvLyBUT0RPOiBHRUggLSBjYW5ub3QgZG8gdGhpcyBhc3NlcnRpb24gYmVjYXVzZSByb290IHRocmVhZCBub3Qgc2V0IHVwIGFzIGV4ZWN1dGluZworICAgICAvLyBLTVBfQVNTRVJUKCBtYXN0ZXJfdGgtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICAgbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBfX2ttcF9qb2luX29tcHQobWFzdGVyX3RoLCBwYXJlbnRfdGVhbSwgcGFyYWxsZWxfaWQsIGZvcmtfY29udGV4dCk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfam9pbl9jYWxsOiBleGl0IFQjJWRcbiIsIGd0aWQgKSk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIENoZWNrIHdoZXRoZXIgd2Ugc2hvdWxkIHB1c2ggYW4gaW50ZXJuYWwgY29udHJvbCByZWNvcmQgb250byB0aGUKKyAgIHNlcmlhbCB0ZWFtIHN0YWNrLiAgSWYgc28sIGRvIGl0LiAgKi8KK3ZvaWQKK19fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMgKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKworICAgIGlmICggdGhyZWFkLT50aC50aF90ZWFtICE9IHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYgKHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPiAxKSB7CisgICAgICAgIGludCBwdXNoID0gMDsKKworICAgICAgICBpZiAodGhyZWFkLT50aC50aF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPT0gTlVMTCkgeworICAgICAgICAgICAgcHVzaCA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wLT5zZXJpYWxfbmVzdGluZ19sZXZlbCAhPQorICAgICAgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9zZXJpYWxpemVkICkgeworICAgICAgICAgICAgICAgIHB1c2ggPSAxOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChwdXNoKSB7ICAvKiBwdXNoIGEgcmVjb3JkIG9uIHRoZSBzZXJpYWwgdGVhbSdzIHN0YWNrICovCisgICAgICAgICAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90ICogY29udHJvbCA9IChrbXBfaW50ZXJuYWxfY29udHJvbF90ICopIF9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfaW50ZXJuYWxfY29udHJvbF90KSk7CisKKyAgICAgICAgICAgIGNvcHlfaWN2cyggY29udHJvbCwgJiB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cyApOworCisgICAgICAgICAgICBjb250cm9sLT5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IHRocmVhZC0+dGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQ7CisKKyAgICAgICAgICAgIGNvbnRyb2wtPm5leHQgPSB0aHJlYWQtPnRoLnRoX3RlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gY29udHJvbDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2hhbmdlcyBzZXRfbnByb2MgKi8KK3ZvaWQKK19fa21wX3NldF9udW1fdGhyZWFkcyggaW50IG5ld19udGgsIGludCBndGlkICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9zZXRfbnVtX3RocmVhZHM6IG5ldyBfX2ttcF9udGggPSAlZFxuIiwgbmV3X250aCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgaWYgKG5ld19udGggPCAxKQorICAgICAgICBuZXdfbnRoID0gMTsKKyAgICBlbHNlIGlmIChuZXdfbnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbmV3X250aCA9IF9fa21wX21heF9udGg7CisKKyAgICBLTVBfQ09VTlRfVkFMVUUoT01QX3NldF9udW10aHJlYWRzLCBuZXdfbnRoKTsKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzW2d0aWRdOworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICBzZXRfX25wcm9jKCB0aHJlYWQsIG5ld19udGggKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBvbXBfc2V0X251bV90aHJlYWRzKCkgY2FsbCB3aWxsIGNhdXNlIHRoZSBob3QgdGVhbSBzaXplIHRvIGJlCisgICAgLy8gcmVkdWNlZCAoaW4gdGhlIGFic2VuY2Ugb2YgYSBudW1fdGhyZWFkcyBjbGF1c2UpLCB0aGVuIHJlZHVjZSBpdCBub3csCisgICAgLy8gcmF0aGVyIHRoYW4gd2FpdGluZyBmb3IgdGhlIG5leHQgcGFyYWxsZWwgcmVnaW9uLgorICAgIC8vCisgICAgcm9vdCA9IHRocmVhZC0+dGgudGhfcm9vdDsKKyAgICBpZiAoIF9fa21wX2luaXRfcGFyYWxsZWwgJiYgKCAhIHJvb3QtPnIucl9hY3RpdmUgKQorICAgICAgJiYgKCByb290LT5yLnJfaG90X3RlYW0tPnQudF9ucHJvYyA+IG5ld19udGggKQorI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAmJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICYmICFfX2ttcF9ob3RfdGVhbXNfbW9kZQorI2VuZGlmCisgICAgKSB7CisgICAgICAgIGttcF90ZWFtX3QgKmhvdF90ZWFtID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgICAgICBpbnQgZjsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgIC8vIFJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZS4KKyAgICAgICAgZm9yICggZiA9IG5ld19udGg7ICBmIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgZisrICkgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaG90X3RlYW0tPnQudF90aHJlYWRzW2ZdICE9IE5VTEwgKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICAvLyBXaGVuIGRlY3JlYXNpbmcgdGVhbSBzaXplLCB0aHJlYWRzIG5vIGxvbmdlciBpbiB0aGUgdGVhbSBzaG91bGQgdW5yZWYgdGFzayB0ZWFtLgorICAgICAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWVfdGhyZWFkKCBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0gKTsKKyAgICAgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSA9ICBOVUxMOworICAgICAgICB9CisgICAgICAgIGhvdF90ZWFtLT50LnRfbnByb2MgPSBuZXdfbnRoOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIGlmKCB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtcyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtID09IHRocmVhZC0+dGgudGhfaG90X3RlYW1zWzBdLmhvdF90ZWFtICk7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2hvdF90ZWFtc1swXS5ob3RfdGVhbV9udGggPSBuZXdfbnRoOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfZm9ya2pvaW5fbG9jayApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIFVwZGF0ZSB0aGUgdF9ucHJvYyBmaWVsZCBpbiB0aGUgdGhyZWFkcyB0aGF0IGFyZSBzdGlsbCBhY3RpdmUuCisgICAgICAgIC8vCisgICAgICAgIGZvciggZj0wIDsgZiA8IG5ld19udGg7IGYrKyApIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGhvdF90ZWFtLT50LnRfdGhyZWFkc1tmXSAhPSBOVUxMICk7CisgICAgICAgICAgICBob3RfdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPSBuZXdfbnRoOworICAgICAgICB9CisgICAgICAgIC8vIFNwZWNpYWwgZmxhZyBpbiBjYXNlIG9tcF9zZXRfbnVtX3RocmVhZHMoKSBjYWxsCisgICAgICAgIGhvdF90ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID0gLTE7CisgICAgfQorfQorCisvKiBDaGFuZ2VzIG1heF9hY3RpdmVfbGV2ZWxzICovCit2b2lkCitfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHMoIGludCBndGlkLCBpbnQgbWF4X2FjdGl2ZV9sZXZlbHMgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzOiBuZXcgbWF4X2FjdGl2ZV9sZXZlbHMgZm9yIHRocmVhZCAlZCA9ICglZClcbiIsIGd0aWQsIG1heF9hY3RpdmVfbGV2ZWxzICkgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbWF4X2FjdGl2ZV9sZXZlbHMKKyAgICBpZiggbWF4X2FjdGl2ZV9sZXZlbHMgPCAwICkgeworICAgICAgICBLTVBfV0FSTklORyggQWN0aXZlTGV2ZWxzTmVnYXRpdmUsIG1heF9hY3RpdmVfbGV2ZWxzICk7CisgICAgICAgIC8vIFdlIGlnbm9yZSB0aGlzIGNhbGwgaWYgdGhlIHVzZXIgaGFzIHNwZWNpZmllZCBhIG5lZ2F0aXZlIHZhbHVlLgorICAgICAgICAvLyBUaGUgY3VycmVudCBzZXR0aW5nIHdvbid0IGJlIGNoYW5nZWQuIFRoZSBsYXN0IHZhbGlkIHNldHRpbmcgd2lsbCBiZSB1c2VkLgorICAgICAgICAvLyBBIHdhcm5pbmcgd2lsbCBiZSBpc3N1ZWQgKGlmIHdhcm5pbmdzIGFyZSBhbGxvd2VkIGFzIGNvbnRyb2xsZWQgYnkgdGhlIEtNUF9XQVJOSU5HUyBlbnYgdmFyKS4KKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zZXRfbWF4X2FjdGl2ZV9sZXZlbHM6IHRoZSBjYWxsIGlzIGlnbm9yZWQ6IG5ldyBtYXhfYWN0aXZlX2xldmVscyBmb3IgdGhyZWFkICVkID0gKCVkKVxuIiwgZ3RpZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBtYXhfYWN0aXZlX2xldmVscyA8PSBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQgKSB7CisgICAgICAgIC8vIGl0J3MgT0ssIHRoZSBtYXhfYWN0aXZlX2xldmVscyBpcyB3aXRoaW4gdGhlIHZhbGlkIHJhbmdlOiBbIDA7IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCBdCisgICAgICAgIC8vIFdlIGFsbG93IGEgemVybyB2YWx1ZS4gKGltcGxlbWVudGF0aW9uIGRlZmluZWQgYmVoYXZpb3IpCisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEFjdGl2ZUxldmVsc0V4Y2VlZExpbWl0LCBtYXhfYWN0aXZlX2xldmVscywgS01QX01BWF9BQ1RJVkVfTEVWRUxTX0xJTUlUICApOworICAgICAgICBtYXhfYWN0aXZlX2xldmVscyA9IEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVDsKKyAgICAgICAgLy8gQ3VycmVudCB1cHBlciBsaW1pdCBpcyBNQVhfSU5ULiAoaW1wbGVtZW50YXRpb24gZGVmaW5lZCBiZWhhdmlvcikKKyAgICAgICAgLy8gSWYgdGhlIGlucHV0IGV4Y2VlZHMgdGhlIHVwcGVyIGxpbWl0LCB3ZSBjb3JyZWN0IHRoZSBpbnB1dCB0byBiZSB0aGUgdXBwZXIgbGltaXQuIChpbXBsZW1lbnRhdGlvbiBkZWZpbmVkIGJlaGF2aW9yKQorICAgICAgICAvLyBBY3R1YWxseSwgdGhlIGZsb3cgc2hvdWxkIG5ldmVyIGdldCBoZXJlIHVudGlsIHdlIHVzZSBNQVhfSU5UIGxpbWl0LgorICAgIH0KKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3NldF9tYXhfYWN0aXZlX2xldmVsczogYWZ0ZXIgdmFsaWRhdGlvbjogbmV3IG1heF9hY3RpdmVfbGV2ZWxzIGZvciB0aHJlYWQgJWQgPSAoJWQpXG4iLCBndGlkLCBtYXhfYWN0aXZlX2xldmVscyApICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBfX2ttcF9zYXZlX2ludGVybmFsX2NvbnRyb2xzKCB0aHJlYWQgKTsKKworICAgIHNldF9fbWF4X2FjdGl2ZV9sZXZlbHMoIHRocmVhZCwgbWF4X2FjdGl2ZV9sZXZlbHMgKTsKKworfQorCisvKiBHZXRzIG1heF9hY3RpdmVfbGV2ZWxzICovCitpbnQKK19fa21wX2dldF9tYXhfYWN0aXZlX2xldmVscyggaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfZ2V0X21heF9hY3RpdmVfbGV2ZWxzOiB0aHJlYWQgJWRcbiIsIGd0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2dldF9tYXhfYWN0aXZlX2xldmVsczogdGhyZWFkICVkLCBjdXJ0YXNrPSVwLCBjdXJ0YXNrX21heGFjbGV2ZWw9JWRcbiIsCisgICAgICAgIGd0aWQsIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLCB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzay0+dGRfaWN2cy5tYXhfYWN0aXZlX2xldmVscyApICk7CisgICAgcmV0dXJuIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLm1heF9hY3RpdmVfbGV2ZWxzOworfQorCisvKiBDaGFuZ2VzIGRlZl9zY2hlZF92YXIgSUNWIHZhbHVlcyAocnVuLXRpbWUgc2NoZWR1bGUga2luZCBhbmQgY2h1bmspICovCit2b2lkCitfX2ttcF9zZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgY2h1bmsgKQoreworICAgIGttcF9pbmZvX3QgKnRocmVhZDsKKy8vICAgIGttcF90ZWFtX3QgKnRlYW07CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfc2V0X3NjaGVkdWxlOiBuZXcgc2NoZWR1bGUgZm9yIHRocmVhZCAlZCA9ICglZCwgJWQpXG4iLCBndGlkLCAoaW50KWtpbmQsIGNodW5rICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICAvLyBDaGVjayBpZiB0aGUga2luZCBwYXJhbWV0ZXIgaXMgdmFsaWQsIGNvcnJlY3QgaWYgbmVlZGVkLgorICAgIC8vIFZhbGlkIHBhcmFtZXRlcnMgc2hvdWxkIGZpdCBpbiBvbmUgb2YgdHdvIGludGVydmFscyAtIHN0YW5kYXJkIG9yIGV4dGVuZGVkOgorICAgIC8vICAgICAgIDxsb3dlcj4sIDx2YWxpZD4sIDx1cHBlcl9zdGQ+LCA8bG93ZXJfZXh0PiwgPHZhbGlkPiwgPHVwcGVyPgorICAgIC8vIDIwMDgtMDEtMjU6IDAsICAxIC0gNCwgICAgICAgNSwgICAgICAgICAxMDAsICAgICAxMDEgLSAxMDIsIDEwMworICAgIGlmICgga2luZCA8PSBrbXBfc2NoZWRfbG93ZXIgfHwga2luZCA+PSBrbXBfc2NoZWRfdXBwZXIgfHwKKyAgICAgICAoIGtpbmQgPD0ga21wX3NjaGVkX2xvd2VyX2V4dCAmJiBraW5kID49IGttcF9zY2hlZF91cHBlcl9zdGQgKSApCisgICAgeworICAgICAgICAvLyBUT0RPOiBIaW50IG5lZWRzIGF0dGVudGlvbiBpbiBjYXNlIHdlIGNoYW5nZSB0aGUgZGVmYXVsdCBzY2hlZHVsZS4KKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICBLTVBfTVNHKCBTY2hlZHVsZUtpbmRPdXRPZlJhbmdlLCBraW5kICksCisgICAgICAgICAgICBLTVBfSE5UKCBEZWZhdWx0U2NoZWR1bGVLaW5kVXNlZCwgInN0YXRpYywgbm8gY2h1bmsiICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgICAgICBraW5kID0ga21wX3NjaGVkX2RlZmF1bHQ7CisgICAgICAgIGNodW5rID0gMDsgICAgICAgICAvLyBpZ25vcmUgY2h1bmsgdmFsdWUgaW4gY2FzZSBvZiBiYWQga2luZAorICAgIH0KKworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIF9fa21wX3NhdmVfaW50ZXJuYWxfY29udHJvbHMoIHRocmVhZCApOworCisgICAgaWYgKCBraW5kIDwga21wX3NjaGVkX3VwcGVyX3N0ZCApIHsKKyAgICAgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9zdGF0aWMgJiYgY2h1bmsgPCBLTVBfREVGQVVMVF9DSFVOSyApIHsKKyAgICAgICAgICAgIC8vIGRpZmZlciBzdGF0aWMgY2h1bmtlZCB2cy4gdW5jaHVua2VkOgorICAgICAgICAgICAgLy8gY2h1bmsgc2hvdWxkIGJlIGludmFsaWQgdG8gaW5kaWNhdGUgdW5jaHVua2VkIHNjaGVkdWxlICh3aGljaCBpcyB0aGUgZGVmYXVsdCkKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLnJfc2NoZWRfdHlwZSA9IGttcF9zY2hfc3RhdGljOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc2NoX21hcFsga2luZCAtIGttcF9zY2hlZF9sb3dlciAtIDEgXTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIC8vICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlID0KKyAgICAgICAgICAgIF9fa21wX3NjaF9tYXBbIGtpbmQgLSBrbXBfc2NoZWRfbG93ZXJfZXh0ICsga21wX3NjaGVkX3VwcGVyX3N0ZCAtIGttcF9zY2hlZF9sb3dlciAtIDIgXTsKKyAgICB9CisgICAgaWYgKCBraW5kID09IGttcF9zY2hlZF9hdXRvICkgeworICAgICAgICAvLyBpZ25vcmUgcGFyYW1ldGVyIGNodW5rIGZvciBzY2hlZHVsZSBhdXRvCisgICAgICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQuY2h1bmsgPSBjaHVuazsKKyAgICB9Cit9CisKKy8qIEdldHMgZGVmX3NjaGVkX3ZhciBJQ1YgdmFsdWVzICovCit2b2lkCitfX2ttcF9nZXRfc2NoZWR1bGUoIGludCBndGlkLCBrbXBfc2NoZWRfdCAqIGtpbmQsIGludCAqIGNodW5rICkKK3sKKyAgICBrbXBfaW5mb190ICAgICAqdGhyZWFkOworICAgIGVudW0gc2NoZWRfdHlwZSB0aF90eXBlOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2dldF9zY2hlZHVsZTogdGhyZWFkICVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisKKyAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICB0aF90eXBlID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuc2NoZWQucl9zY2hlZF90eXBlOworCisgICAgc3dpdGNoICggdGhfdHlwZSApIHsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpYzsKKyAgICAgICAgKmNodW5rID0gMDsgICAvLyBjaHVuayB3YXMgbm90IHNldCwgdHJ5IHRvIHNob3cgdGhpcyBmYWN0IHZpYSB6ZXJvIHZhbHVlCisgICAgICAgIHJldHVybjsKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX3N0YXRpYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfZHluYW1pYzsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkOgorICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2d1aWRlZDsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICpraW5kID0ga21wX3NjaGVkX2F1dG87CisgICAgICAgIGJyZWFrOworICAgIGNhc2Uga21wX3NjaF90cmFwZXpvaWRhbDoKKyAgICAgICAgKmtpbmQgPSBrbXBfc2NoZWRfdHJhcGV6b2lkYWw7CisgICAgICAgIGJyZWFrOworLyoKKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAqa2luZCA9IGttcF9zY2hlZF9zdGF0aWNfc3RlYWw7CisgICAgICAgIGJyZWFrOworKi8KKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfRkFUQUwoIFVua25vd25TY2hlZHVsaW5nVHlwZSwgdGhfdHlwZSApOworICAgIH0KKworICAgICpjaHVuayA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrLT50ZF9pY3ZzLnNjaGVkLmNodW5rOworfQorCitpbnQKK19fa21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtKCBpbnQgZ3RpZCwgaW50IGxldmVsICkgeworCisgICAgaW50IGlpLCBkZDsKKyAgICBrbXBfdGVhbV90ICp0ZWFtOworICAgIGttcF9pbmZvX3QgKnRocjsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAwOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICBpZiggaWkgPT0gbGV2ZWwgKSByZXR1cm4gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworCisgICAgZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsKKyAgICBsZXZlbCsrOworICAgIHdoaWxlKCBpaSA+IGxldmVsICkKKyAgICB7CisgICAgICAgIGZvciggZGQgPSB0ZWFtLT50LnRfc2VyaWFsaXplZDsgKCBkZCA+IDAgKSAmJiAoIGlpID4gbGV2ZWwgKTsgZGQtLSwgaWktLSApCisgICAgICAgIHsKKyAgICAgICAgfQorICAgICAgICBpZiggKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBkZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOworICAgICAgICAgICAgaWktLTsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiAoIGRkID4gMSApID8gKCAwICkgOiAoIHRlYW0tPnQudF9tYXN0ZXJfdGlkICk7Cit9CisKK2ludAorX19rbXBfZ2V0X3RlYW1fc2l6ZSggaW50IGd0aWQsIGludCBsZXZlbCApIHsKKworICAgIGludCBpaSwgZGQ7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aHI7CisKKyAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfZ2V0X3RlYW1fc2l6ZTogdGhyZWFkICVkICVkXG4iLCBndGlkLCBsZXZlbCApKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworCisgICAgLy8gdmFsaWRhdGUgbGV2ZWwKKyAgICBpZiggbGV2ZWwgPT0gMCApIHJldHVybiAxOworICAgIGlmKCBsZXZlbCA8IDAgKSByZXR1cm4gLTE7CisgICAgdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIHRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgaWkgPSB0ZWFtLT50LnRfbGV2ZWw7CisgICAgaWYoIGxldmVsID4gaWkgKSByZXR1cm4gLTE7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApIHsKKyAgICAgICAgLy8gQUM6IHdlIGFyZSBpbiB0ZWFtcyByZWdpb24gd2hlcmUgbXVsdGlwbGUgbmVzdGVkIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICBpbnQgdGxldmVsID0gdGhyLT50aC50aF90ZWFtc19sZXZlbDsgLy8gdGhlIGxldmVsIG9mIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICAgICAgaWYoIGxldmVsIDw9IHRsZXZlbCApIHsgLy8gb3RoZXJ3aXNlIHVzdWFsIGFsZ29yaXRobSB3b3JrcyAod2lsbCBub3QgdG91Y2ggdGhlIHRlYW1zKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggaWkgPj0gdGxldmVsICk7CisgICAgICAgICAgICAvLyBBQzogQXMgd2UgbmVlZCB0byBwYXNzIGJ5IHRoZSB0ZWFtcyBsZWFndWUsIHdlIG5lZWQgdG8gYXJ0aWZpY2lhbGx5IGluY3JlYXNlIGlpCisgICAgICAgICAgICBpZiAoIGlpID09IHRsZXZlbCApIHsKKyAgICAgICAgICAgICAgICBpaSArPSAyOyAvLyB0aHJlZSB0ZWFtcyBoYXZlIHNhbWUgbGV2ZWwKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWkgKys7ICAgLy8gdHdvIHRlYW1zIGhhdmUgc2FtZSBsZXZlbAorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorI2VuZGlmCisKKyAgICB3aGlsZSggaWkgPiBsZXZlbCApCisgICAgeworICAgICAgICBmb3IoIGRkID0gdGVhbS0+dC50X3NlcmlhbGl6ZWQ7ICggZGQgPiAwICkgJiYgKCBpaSA+IGxldmVsICk7IGRkLS0sIGlpLS0gKQorICAgICAgICB7CisgICAgICAgIH0KKyAgICAgICAgaWYoIHRlYW0tPnQudF9zZXJpYWxpemVkICYmICggIWRkICkgKSB7CisgICAgICAgICAgICB0ZWFtID0gdGVhbS0+dC50X3BhcmVudDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmKCBpaSA+IGxldmVsICkgeworICAgICAgICAgICAgdGVhbSA9IHRlYW0tPnQudF9wYXJlbnQ7CisgICAgICAgICAgICBpaS0tOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHRlYW0tPnQudF9ucHJvYzsKK30KKwora21wX3Jfc2NoZWRfdAorX19rbXBfZ2V0X3NjaGVkdWxlX2dsb2JhbCgpIHsKKy8vIFRoaXMgcm91dGluZSBjcmVhdGVkIGJlY2F1c2UgcGFpcnMgKF9fa21wX3NjaGVkLCBfX2ttcF9jaHVuaykgYW5kIChfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZCkKKy8vIG1heSBiZSBjaGFuZ2VkIGJ5IGttcF9zZXRfZGVmYXVsdHMgaW5kZXBlbmRlbnRseS4gU28gb25lIGNhbiBnZXQgdGhlIHVwZGF0ZWQgc2NoZWR1bGUgaGVyZS4KKworICAgIGttcF9yX3NjaGVkX3Qgcl9zY2hlZDsKKworICAgIC8vIGNyZWF0ZSBzY2hlZHVsZSBmcm9tIDQgZ2xvYmFsczogX19rbXBfc2NoZWQsIF9fa21wX2NodW5rLCBfX2ttcF9zdGF0aWMsIF9fa21wX2d1aWRlZAorICAgIC8vIF9fa21wX3NjaGVkIHNob3VsZCBrZWVwIG9yaWdpbmFsIHZhbHVlLCBzbyB0aGF0IHVzZXIgY2FuIHNldCBLTVBfU0NIRURVTEUgbXVsdGlwbGUgdGltZXMsCisgICAgLy8gYW5kIHRodXMgaGF2ZSBkaWZmZXJlbnQgcnVuLXRpbWUgc2NoZWR1bGVzIGluIGRpZmZlcmVudCByb290cyAoZXZlbiBpbiBPTVAgMi41KQorICAgIGlmICggX19rbXBfc2NoZWQgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgIHJfc2NoZWQucl9zY2hlZF90eXBlID0gX19rbXBfc3RhdGljOyAvLyByZXBsYWNlIFNUQVRJQyB3aXRoIG1vcmUgZGV0YWlsZWQgc2NoZWR1bGUgKGJhbGFuY2VkIG9yIGdyZWVkeSkKKyAgICB9IGVsc2UgaWYgKCBfX2ttcF9zY2hlZCA9PSBrbXBfc2NoX2d1aWRlZF9jaHVua2VkICkgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX2d1aWRlZDsgLy8gcmVwbGFjZSBHVUlERUQgd2l0aCBtb3JlIGRldGFpbGVkIHNjaGVkdWxlIChpdGVyYXRpdmUgb3IgYW5hbHl0aWNhbCkKKyAgICB9IGVsc2UgeworICAgICAgICByX3NjaGVkLnJfc2NoZWRfdHlwZSA9IF9fa21wX3NjaGVkOyAgLy8gKFNUQVRJQ19DSFVOS0VEKSwgb3IgKERZTkFNSUNfQ0hVTktFRCksIG9yIG90aGVyCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9jaHVuayA8IEtNUF9ERUZBVUxUX0NIVU5LICkgeyAvLyBfX2ttcF9jaHVuayBtYXkgYmUgd3JvbmcgaGVyZSAoaWYgaXQgd2FzIG5vdCBldmVyIHNldCkKKyAgICAgICAgcl9zY2hlZC5jaHVuayA9IEtNUF9ERUZBVUxUX0NIVU5LOworICAgIH0gZWxzZSB7CisgICAgICAgIHJfc2NoZWQuY2h1bmsgPSBfX2ttcF9jaHVuazsKKyAgICB9CisKKyAgICByZXR1cm4gcl9zY2hlZDsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKgorICogQWxsb2NhdGUgKHJlYWxsb2MgPT0gRkFMU0UpICogb3IgcmVhbGxvY2F0ZSAocmVhbGxvYyA9PSBUUlVFKQorICogYXQgbGVhc3QgYXJnYyBudW1iZXIgb2YgKnRfYXJndiBlbnRyaWVzIGZvciB0aGUgcmVxdWVzdGVkIHRlYW0uCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGludCBhcmdjLCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgcmVhbGxvYyApCit7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgaWYoICFyZWFsbG9jIHx8IGFyZ2MgPiB0ZWFtLT50LnRfbWF4X2FyZ2MgKSB7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBuZWVkZWQgZW50cmllcz0lZCwgY3VycmVudCBlbnRyaWVzPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgYXJnYywgKCByZWFsbG9jICkgPyB0ZWFtLT50LnRfbWF4X2FyZ2MgOiAwICkpOworICAgICAgICAvKiBpZiBwcmV2aW91c2x5IGFsbG9jYXRlZCBoZWFwIHNwYWNlIGZvciBhcmdzLCBmcmVlIHRoZW0gKi8KKyAgICAgICAgaWYgKCByZWFsbG9jICYmIHRlYW0tPnQudF9hcmd2ICE9ICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0gKQorICAgICAgICAgICAgX19rbXBfZnJlZSggKHZvaWQgKikgdGVhbS0+dC50X2FyZ3YgKTsKKworICAgICAgICBpZiAoIGFyZ2MgPD0gS01QX0lOTElORV9BUkdWX0VOVFJJRVMgKSB7CisgICAgICAgICAgICAvKiB1c2UgdW51c2VkIHNwYWNlIGluIHRoZSBjYWNoZSBsaW5lIGZvciBhcmd1bWVudHMgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9IEtNUF9JTkxJTkVfQVJHVl9FTlRSSUVTOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBpbmxpbmUgYWxsb2NhdGUgJWQgYXJndiBlbnRyaWVzXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIHRlYW0tPnQudF9tYXhfYXJnYyApKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9hcmd2ID0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXTsKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggLTEsICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbMF0sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZ0ZWFtLT50LnRfaW5saW5lX2FyZ3ZbS01QX0lOTElORV9BUkdWX0VOVFJJRVNdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoc2l6ZW9mKHZvaWQgKikgKiBLTVBfSU5MSU5FX0FSR1ZfRU5UUklFUyksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0ZWFtXyVkLnRfaW5saW5lX2FyZ3YiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaW4gdGhlIGhlYXAgKi8KKyAgICAgICAgICAgIHRlYW0tPnQudF9tYXhfYXJnYyA9ICggYXJnYyA8PSAoS01QX01JTl9NQUxMT0NfQVJHVl9FTlRSSUVTID4+IDEgKSkgPworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NSU5fTUFMTE9DX0FSR1ZfRU5UUklFUyA6IDIgKiBhcmdjOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCAiX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzOiB0ZWFtICVkOiBkeW5hbWljIGFsbG9jYXRlICVkIGFyZ3YgZW50cmllc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCB0ZWFtLT50LnRfbWF4X2FyZ2MgKSk7CisgICAgICAgICAgICB0ZWFtLT50LnRfYXJndiAgICAgPSAodm9pZCoqKSBfX2ttcF9wYWdlX2FsbG9jYXRlKCBzaXplb2Yodm9pZCopICogdGVhbS0+dC50X21heF9hcmdjICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0b3JhZ2VfbWFwX2d0aWQoIC0xLCAmdGVhbS0+dC50X2FyZ3ZbMF0sICZ0ZWFtLT50LnRfYXJndlt0ZWFtLT50LnRfbWF4X2FyZ2NdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Yodm9pZCAqKSAqIHRlYW0tPnQudF9tYXhfYXJnYywgInRlYW1fJWQudF9hcmd2IiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtLCBpbnQgbWF4X250aCkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgbnVtX2Rpc3BfYnVmZiA9IG1heF9udGggPiAxID8gX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgOiAyOworICAgIHRlYW0tPnQudF90aHJlYWRzID0gKGttcF9pbmZvX3QqKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfaW5mb190KikgKiBtYXhfbnRoICk7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyID0gKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QqKQorICAgICAgICBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGRpc3BhdGNoX3NoYXJlZF9pbmZvX3QpICogbnVtX2Rpc3BfYnVmZiApOworICAgIHRlYW0tPnQudF9kaXNwYXRjaCA9IChrbXBfZGlzcF90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZihrbXBfZGlzcF90KSAqIG1heF9udGggKTsKKyAgICB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Rhc2tkYXRhX3QpICogbWF4X250aCApOworICAgIHRlYW0tPnQudF9tYXhfbnByb2MgPSBtYXhfbnRoOworCisgICAgLyogc2V0dXAgZGlzcGF0Y2ggYnVmZmVycyAqLworICAgIGZvcihpID0gMCA7IGkgPCBudW1fZGlzcF9idWZmOyArK2kpIHsKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmJ1ZmZlcl9pbmRleCA9IGk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyW2ldLmRvYWNyb3NzX2J1Zl9pZHggPSBpOworI2VuZGlmCisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90ZWFtX2FycmF5cyhrbXBfdGVhbV90ICp0ZWFtKSB7CisgICAgLyogTm90ZTogdGhpcyBkb2VzIG5vdCBmcmVlIHRoZSB0aHJlYWRzIGluIHRfdGhyZWFkcyAoX19rbXBfZnJlZV90aHJlYWRzKSAqLworICAgIGludCBpOworICAgIGZvciAoIGkgPSAwOyBpIDwgdGVhbS0+dC50X21heF9ucHJvYzsgKysgaSApIHsKKyAgICAgICAgaWYgKCB0ZWFtLT50LnRfZGlzcGF0Y2hbIGkgXS50aF9kaXNwX2J1ZmZlciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggdGVhbS0+dC50X2Rpc3BhdGNoWyBpIF0udGhfZGlzcF9idWZmZXIgKTsKKyAgICAgICAgICAgIHRlYW0tPnQudF9kaXNwYXRjaFsgaSBdLnRoX2Rpc3BfYnVmZmVyID0gTlVMTDsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBmb3IKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF90aHJlYWRzKTsKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9kaXNwX2J1ZmZlcik7CisgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcGF0Y2gpOworICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGEpOworICAgIHRlYW0tPnQudF90aHJlYWRzICAgICA9IE5VTEw7CisgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyID0gTlVMTDsKKyAgICB0ZWFtLT50LnRfZGlzcGF0Y2ggICAgPSBOVUxMOworICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhID0gMDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3JlYWxsb2NhdGVfdGVhbV9hcnJheXMoa21wX3RlYW1fdCAqdGVhbSwgaW50IG1heF9udGgpIHsKKyAgICBrbXBfaW5mb190ICoqb2xkVGhyZWFkcyA9IHRlYW0tPnQudF90aHJlYWRzOworCisgICAgX19rbXBfZnJlZSh0ZWFtLT50LnRfZGlzcF9idWZmZXIpOworICAgIF9fa21wX2ZyZWUodGVhbS0+dC50X2Rpc3BhdGNoKTsKKyAgICBfX2ttcF9mcmVlKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhKTsKKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyh0ZWFtLCBtYXhfbnRoKTsKKworICAgIEtNUF9NRU1DUFkodGVhbS0+dC50X3RocmVhZHMsIG9sZFRocmVhZHMsIHRlYW0tPnQudF9ucHJvYyAqIHNpemVvZiAoa21wX2luZm9fdCopKTsKKworICAgIF9fa21wX2ZyZWUob2xkVGhyZWFkcyk7Cit9CisKK3N0YXRpYyBrbXBfaW50ZXJuYWxfY29udHJvbF90CitfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoIHZvaWQgKSB7CisKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPiAwICk7CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3QgZ19pY3ZzID0geworICAgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy9pbnQgc2VyaWFsX25lc3RpbmdfbGV2ZWw7IC8vY29ycmVzcG9uZHMgdG8gdGhlIHZhbHVlIG9mIHRoZSB0aF90ZWFtX3NlcmlhbGl6ZWQgZmllbGQKKyAgICAgIChrbXBfaW50OClfX2ttcF9kZmx0X25lc3RlZCwgICAgICAgICAgICAvL2ludCBuZXN0ZWQ7ICAgICAgICAgICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBuZXN0ZWQgcGFyYWxsZWxpc20gKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgZHluYW1pYyBhZGp1c3RtZW50IG9mIHRocmVhZHMgKHBlciB0aHJlYWQpCisgICAgICAoa21wX2ludDgpX19rbXBfZW52X2Jsb2NrdGltZSwgICAgICAgICAgLy9pbnQgYnRfc2V0OyAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3Igd2hldGhlciBibG9ja3RpbWUgaXMgZXhwbGljaXRseSBzZXQKKyAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lLCAgICAgICAgIC8vaW50IGJsb2NrdGltZTsgICAgICAgICAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIGJsb2NrdGltZQorICAgICAgX19rbXBfYnRfaW50ZXJ2YWxzLCAgICAgICAgICAgLy9pbnQgYnRfaW50ZXJ2YWxzOyAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgYmxvY2t0aW1lIGludGVydmFscworICAgICAgX19rbXBfZGZsdF90ZWFtX250aCwgICAgICAgICAgLy9pbnQgbnByb2M7ICAgICAgICAgICAgICAgIC8vaW50ZXJuYWwgY29udHJvbCBmb3IgIyBvZiB0aHJlYWRzIGZvciBuZXh0IHBhcmFsbGVsIHJlZ2lvbiAocGVyIHRocmVhZCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICh1c2UgYSBtYXggdWIgb24gdmFsdWUgaWYgX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZSBub3QgY2FsbGVkIHlldCkKKyAgICAgIF9fa21wX2RmbHRfbWF4X2FjdGl2ZV9sZXZlbHMsIC8vaW50IG1heF9hY3RpdmVfbGV2ZWxzOyAgICAvL2ludGVybmFsIGNvbnRyb2wgZm9yIG1heF9hY3RpdmVfbGV2ZWxzCisgICAgICByX3NjaGVkLCAgICAgICAgICAgICAgICAgICAgICAvL2ttcF9yX3NjaGVkX3Qgc2NoZWQ7ICAgICAgLy9pbnRlcm5hbCBjb250cm9sIGZvciBydW50aW1lIHNjaGVkdWxlIHtzY2hlZCxjaHVua30gcGFpcgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgIE5VTEwgICAgICAgICAgICAgICAgICAgICAgICAgIC8vc3RydWN0IGttcF9pbnRlcm5hbF9jb250cm9sICpuZXh0OworICAgIH07CisKKyAgICByZXR1cm4gZ19pY3ZzOworfQorCitzdGF0aWMga21wX2ludGVybmFsX2NvbnRyb2xfdAorX19rbXBfZ2V0X3hfZ2xvYmFsX2ljdnMoIGNvbnN0IGttcF90ZWFtX3QgKnRlYW0gKSB7CisKKyAgICBrbXBfaW50ZXJuYWxfY29udHJvbF90IGd4X2ljdnM7CisgICAgZ3hfaWN2cy5zZXJpYWxfbmVzdGluZ19sZXZlbCA9IDA7IC8vIHByb2JhYmx5ID10ZWFtLT50LnRfc2VyaWFsIGxpa2UgaW4gc2F2ZV9pbnRlcl9jb250cm9scworICAgIGNvcHlfaWN2cyggJiBneF9pY3ZzLCAmIHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMgKTsKKyAgICBneF9pY3ZzLm5leHQgPSBOVUxMOworCisgICAgcmV0dXJuIGd4X2ljdnM7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbml0aWFsaXplX3Jvb3QoIGttcF9yb290X3QgKnJvb3QgKQoreworICAgIGludCAgICAgICAgICAgZjsKKyAgICBrbXBfdGVhbV90ICAgKnJvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICAgKmhvdF90ZWFtOworICAgIGludCAgICAgICAgICAgaG90X3RlYW1fbWF4X250aDsKKyAgICBrbXBfcl9zY2hlZF90IHJfc2NoZWQgPSBfX2ttcF9nZXRfc2NoZWR1bGVfZ2xvYmFsKCk7IC8vIGdldCBjdXJyZW50IHN0YXRlIG9mIHNjaGVkdWxpbmcgZ2xvYmFscworICAgIGttcF9pbnRlcm5hbF9jb250cm9sX3Qgcl9pY3ZzID0gX19rbXBfZ2V0X2dsb2JhbF9pY3ZzKCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCApOworICAgIEtNUF9BU1NFUlQoICEgcm9vdC0+ci5yX2JlZ2luICk7CisKKyAgICAvKiBzZXR1cCB0aGUgcm9vdCBzdGF0ZSBzdHJ1Y3R1cmUgKi8KKyAgICBfX2ttcF9pbml0X2xvY2soICZyb290LT5yLnJfYmVnaW5fbG9jayApOworICAgIHJvb3QtPnIucl9iZWdpbiAgICAgICAgPSBGQUxTRTsKKyAgICByb290LT5yLnJfYWN0aXZlICAgICAgID0gRkFMU0U7CisgICAgcm9vdC0+ci5yX2luX3BhcmFsbGVsICA9IDA7CisgICAgcm9vdC0+ci5yX2Jsb2NrdGltZSAgICA9IF9fa21wX2RmbHRfYmxvY2t0aW1lOworICAgIHJvb3QtPnIucl9uZXN0ZWQgICAgICAgPSBfX2ttcF9kZmx0X25lc3RlZDsKKworICAgIC8qIHNldHVwIHRoZSByb290IHRlYW0gZm9yIHRoaXMgdGFzayAqLworICAgIC8qIGFsbG9jYXRlIHRoZSByb290IHRlYW0gc3RydWN0dXJlICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3Jvb3Q6IGJlZm9yZSByb290X3RlYW1cbiIgKSApOworCisgICAgcm9vdF90ZWFtID0KKyAgICAgICAgX19rbXBfYWxsb2NhdGVfdGVhbSgKKyAgICAgICAgICAgIHJvb3QsCisgICAgICAgICAgICAxLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG5ld19ucHJvYworICAgICAgICAgICAgMSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXhfbnByb2MKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgIDAsIC8vIHJvb3QgcGFyYWxsZWwgaWQKKyNlbmRpZgorI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0sCisjZW5kaWYKKyAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAwICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGFyZ2MKKyAgICAgICAgICAgIFVTRV9ORVNURURfSE9UX0FSRyhOVUxMKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIHRocmVhZCBpcyB1bmtub3duCisgICAgICAgICk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgLy8gTm9uLU5VTEwgdmFsdWUgc2hvdWxkIGJlIGFzc2lnbmVkIHRvIG1ha2UgdGhlIGRlYnVnZ2VyIGRpc3BsYXkgdGhlIHJvb3QgdGVhbS4KKyAgICBUQ1dfU1lOQ19QVFIocm9vdF90ZWFtLT50LnRfcGtmbiwgKG1pY3JvdGFza190KSggfiAwICkpOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgcm9vdF90ZWFtID0gJXBcbiIsIHJvb3RfdGVhbSApICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gcm9vdF90ZWFtOworICAgIHJvb3RfdGVhbS0+dC50X2NvbnRyb2xfc3RhY2tfdG9wID0gTlVMTDsKKworICAgIC8qIGluaXRpYWxpemUgcm9vdCB0ZWFtICovCisgICAgcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IE5VTEw7CisgICAgcm9vdF90ZWFtLT50LnRfbnByb2MgICAgICA9IDE7CisgICAgcm9vdF90ZWFtLT50LnRfc2VyaWFsaXplZCA9IDE7CisgICAgLy8gVE9ETz8/Pzogcm9vdF90ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBfX2ttcF9kZmx0X21heF9hY3RpdmVfbGV2ZWxzOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIHJvb3RfdGVhbS0+dC50X3NjaGVkLmNodW5rICAgICAgICA9IHJfc2NoZWQuY2h1bms7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2luaXRpYWxpemVfcm9vdDogaW5pdCByb290IHRlYW0gJWQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHJvb3RfdGVhbS0+dC50X2lkLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkpOworCisgICAgLyogc2V0dXAgdGhlICBob3QgdGVhbSBmb3IgdGhpcyB0YXNrICovCisgICAgLyogYWxsb2NhdGUgdGhlIGhvdCB0ZWFtIHN0cnVjdHVyZSAqLworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV9yb290OiBiZWZvcmUgaG90X3RlYW1cbiIgKSApOworCisgICAgaG90X3RlYW0gPQorICAgICAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtKAorICAgICAgICAgICAgcm9vdCwKKyAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gbmV3X25wcm9jCisgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICogMiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIG1heF9ucHJvYworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSwKKyNlbmRpZgorICAgICAgICAgICAgJnJfaWN2cywKKyAgICAgICAgICAgIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gYXJnYworICAgICAgICAgICAgVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBtYXN0ZXIgdGhyZWFkIGlzIHVua25vd24KKyAgICAgICAgKTsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfcm9vdDogYWZ0ZXIgaG90X3RlYW0gPSAlcFxuIiwgaG90X3RlYW0gKSApOworCisgICAgcm9vdC0+ci5yX2hvdF90ZWFtID0gaG90X3RlYW07CisgICAgcm9vdF90ZWFtLT50LnRfY29udHJvbF9zdGFja190b3AgPSBOVUxMOworCisgICAgLyogZmlyc3QtdGltZSBpbml0aWFsaXphdGlvbiAqLworICAgIGhvdF90ZWFtLT50LnRfcGFyZW50ID0gcm9vdF90ZWFtOworCisgICAgLyogaW5pdGlhbGl6ZSBob3QgdGVhbSAqLworICAgIGhvdF90ZWFtX21heF9udGggPSBob3RfdGVhbS0+dC50X21heF9ucHJvYzsKKyAgICBmb3IgKCBmID0gMDsgZiA8IGhvdF90ZWFtX21heF9udGg7ICsrIGYgKSB7CisgICAgICAgIGhvdF90ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICB9OyAvLyBmb3IKKyAgICBob3RfdGVhbS0+dC50X25wcm9jID0gMTsKKyAgICAvLyBUT0RPPz8/OiBob3RfdGVhbS0+dC50X21heF9hY3RpdmVfbGV2ZWxzID0gX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVsczsKKyAgICBob3RfdGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSA9IHJfc2NoZWQucl9zY2hlZF90eXBlOworICAgIGhvdF90ZWFtLT50LnRfc2NoZWQuY2h1bmsgICAgICAgID0gcl9zY2hlZC5jaHVuazsKKyAgICBob3RfdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDA7Cit9CisKKyNpZmRlZiBLTVBfREVCVUcKKworCit0eXBlZGVmIHN0cnVjdCBrbXBfdGVhbV9saXN0X2l0ZW0geworICAgIGttcF90ZWFtX3AgY29uc3QgKiAgICAgICAgICAgZW50cnk7CisgICAgc3RydWN0IGttcF90ZWFtX2xpc3RfaXRlbSAqICBuZXh0OworfSBrbXBfdGVhbV9saXN0X2l0ZW1fdDsKK3R5cGVkZWYga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBrbXBfdGVhbV9saXN0X3Q7CisKKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCAgICAvLyBBZGQgdGVhbSB0byBsaXN0IG9mIHRlYW1zLgorICAgIGttcF90ZWFtX2xpc3RfdCAgICAgbGlzdCwgICAgICAgIC8vIExpc3Qgb2YgdGVhbXMuCisgICAga21wX3RlYW1fcCBjb25zdCAqICB0ZWFtICAgICAgICAgLy8gVGVhbSB0byBhZGQuCispIHsKKworICAgIC8vIExpc3QgbXVzdCB0ZXJtaW5hdGUgd2l0aCBpdGVtIHdoZXJlIGJvdGggZW50cnkgYW5kIG5leHQgYXJlIE5VTEwuCisgICAgLy8gVGVhbSBpcyBhZGRlZCB0byB0aGUgbGlzdCBvbmx5IG9uY2UuCisgICAgLy8gTGlzdCBpcyBzb3J0ZWQgaW4gYXNjZW5kaW5nIG9yZGVyIGJ5IHRlYW0gaWQuCisgICAgLy8gVGVhbSBpZCBpcyAqbm90KiBhIGtleS4KKworICAgIGttcF90ZWFtX2xpc3RfdCBsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGlzdCAhPSBOVUxMICk7CisgICAgaWYgKCB0ZWFtID09IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHRlYW0tPnQudF9wYXJlbnQgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGVhbS0+dC50X25leHRfcG9vbCApOworCisgICAgLy8gU2VhcmNoIGxpc3QgZm9yIHRoZSB0ZWFtLgorICAgIGwgPSBsaXN0OworICAgIHdoaWxlICggbC0+bmV4dCAhPSBOVUxMICYmIGwtPmVudHJ5ICE9IHRlYW0gKSB7CisgICAgICAgIGwgPSBsLT5uZXh0OworICAgIH07IC8vIHdoaWxlCisgICAgaWYgKCBsLT5uZXh0ICE9IE5VTEwgKSB7CisgICAgICAgIHJldHVybjsgIC8vIFRlYW0gaGFzIGJlZW4gYWRkZWQgYmVmb3JlLCBleGl0LgorICAgIH07IC8vIGlmCisKKyAgICAvLyBUZWFtIGlzIG5vdCBmb3VuZC4gU2VhcmNoIGxpc3QgYWdhaW4gZm9yIGluc2VydGlvbiBwb2ludC4KKyAgICBsID0gbGlzdDsKKyAgICB3aGlsZSAoIGwtPm5leHQgIT0gTlVMTCAmJiBsLT5lbnRyeS0+dC50X2lkIDw9IHRlYW0tPnQudF9pZCApIHsKKyAgICAgICAgbCA9IGwtPm5leHQ7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vIEluc2VydCB0ZWFtLgorICAgIHsKKyAgICAgICAga21wX3RlYW1fbGlzdF9pdGVtX3QgKiBpdGVtID0KKyAgICAgICAgICAgIChrbXBfdGVhbV9saXN0X2l0ZW1fdCAqKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggIGttcF90ZWFtX2xpc3RfaXRlbV90ICkgKTsKKyAgICAgICAgKiBpdGVtID0gKiBsOworICAgICAgICBsLT5lbnRyeSA9IHRlYW07CisgICAgICAgIGwtPm5leHQgID0gaXRlbTsKKyAgICB9CisKK30KKworc3RhdGljIHZvaWQKK19fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKAorICAgIGNoYXIgY29uc3QgKiAgICAgICB0aXRsZSwKKyAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbQorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0ZWFtICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZiggIiUyeCAlcFxuIiwgdGVhbS0+dC50X2lkLCB0ZWFtICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCgKKyAgICBjaGFyIGNvbnN0ICogICAgICAgdGl0bGUsCisgICAga21wX2luZm9fcCBjb25zdCAqIHRocmVhZAorCispIHsKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIHRpdGxlICk7CisgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiJTJkICVwXG4iLCB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgdGhyZWFkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiIC0gKG5pbClcbiIgKTsKKyAgICB9OyAvLyBpZgorfQorCit2b2lkCitfX2ttcF9wcmludF9zdHJ1Y3R1cmUoCisgICAgdm9pZAorKSB7CisKKyAgICBrbXBfdGVhbV9saXN0X3QgbGlzdDsKKworICAgIC8vIEluaXRpYWxpemUgbGlzdCBvZiB0ZWFtcy4KKyAgICBsaXN0ID0gKGttcF90ZWFtX2xpc3RfaXRlbV90ICopS01QX0lOVEVSTkFMX01BTExPQyggc2l6ZW9mKCBrbXBfdGVhbV9saXN0X2l0ZW1fdCApICk7CisgICAgbGlzdC0+ZW50cnkgPSBOVUxMOworICAgIGxpc3QtPm5leHQgID0gTlVMTDsKKworICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5HbG9iYWwgVGhyZWFkIFRhYmxlXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICIlMmQiLCBndGlkICk7CisgICAgICAgICAgICBpZiAoIF9fa21wX3RocmVhZHMgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIF9fa21wX3Jvb3QgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICIgJXAiLCBfX2ttcF9yb290WyBndGlkIF0gKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBfX2ttcF9wcmludGYoICJcbiIgKTsKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9CisKKyAgICAvLyBQcmludCBvdXQgX19rbXBfdGhyZWFkcyBhcnJheS4KKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGhyZWFkc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF90aHJlYWRzICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfaW5mb190IGNvbnN0ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICAgICAgaWYgKCB0aHJlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICJHVElEICUyZCAlcDpcbiIsIGd0aWQsIHRocmVhZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgT3VyIFJvb3Q6ICAgICAgICAlcFxuIiwgdGhyZWFkLT50aC50aF9yb290ICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICAgIiAgICBPdXIgVGVhbTogICAgICIsICAgICAgICB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIFNlcmlhbCBUZWFtOiAgIiwgICAgICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFRocmVhZHM6ICAgICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfdGVhbV9ucHJvYyApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90aHJlYWQoICIgICAgTWFzdGVyOiAgICAgICAiLCAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtX21hc3RlciApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgU2VyaWFsaXplZD86ICAlMmRcbiIsICAgdGhyZWFkLT50aC50aF90ZWFtX3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBOUHJvYzogICAgJTJkXG4iLCAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jICk7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIFNldCBQcm9jIEJpbmQ6ICUyZFxuIiwgIHRocmVhZC0+dGgudGhfc2V0X3Byb2NfYmluZCApOworI2VuZGlmCisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiAgICBOZXh0IGluIHBvb2w6ICIsICAgICAgICB0aHJlYWQtPnRoLnRoX25leHRfcG9vbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCB0aHJlYWQtPnRoLnRoX3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbV9hY2N1bSggbGlzdCwgdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJUaHJlYWRzIGFycmF5IGlzIG5vdCBhbGxvY2F0ZWQuXG4iICk7CisgICAgfTsgLy8gaWYKKworICAgIC8vIFByaW50IG91dCBfX2ttcF9yb290IGFycmF5LgorICAgIF9fa21wX3ByaW50ZiggIlxuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5VYmVyc1xuLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iICk7CisgICAgaWYgKCBfX2ttcF9yb290ICE9IE5VTEwgKSB7CisgICAgICAgIGludCBndGlkOworICAgICAgICBmb3IgKCBndGlkID0gMDsgZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGd0aWQgKSB7CisgICAgICAgICAgICBrbXBfcm9vdF90IGNvbnN0ICogcm9vdCA9IF9fa21wX3Jvb3RbIGd0aWQgXTsKKyAgICAgICAgICAgIGlmICggcm9vdCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIkdUSUQgJTJkICVwOlxuIiwgZ3RpZCwgcm9vdCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICIgICAgUm9vdCBUZWFtOiAgICAiLCAgICAgIHJvb3QtPnIucl9yb290X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGVhbSggICAiICAgIEhvdCBUZWFtOiAgICAgIiwgICAgICByb290LT5yLnJfaG90X3RlYW0gKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAiICAgIFViZXIgVGhyZWFkOiAgIiwgICAgICByb290LT5yLnJfdWJlcl90aHJlYWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAgICAgICAiICAgIEFjdGl2ZT86ICAgICAgJTJkXG4iLCByb290LT5yLnJfYWN0aXZlICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICAgIiAgICBOZXN0ZWQ/OiAgICAgICUyZFxuIiwgcm9vdC0+ci5yX25lc3RlZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAgICIgICAgSW4gUGFyYWxsZWw6ICAlMmRcbiIsIHJvb3QtPnIucl9pbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtX2FjY3VtKCBsaXN0LCByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW1fYWNjdW0oIGxpc3QsIHJvb3QtPnIucl9ob3RfdGVhbSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yIGd0aWQKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9wcmludGYoICJVYmVycyBhcnJheSBpcyBub3QgYWxsb2NhdGVkLlxuIiApOworICAgIH07IC8vIGlmCisKKyAgICBfX2ttcF9wcmludGYoICJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuVGVhbXNcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIiApOworICAgIHdoaWxlICggbGlzdC0+bmV4dCAhPSBOVUxMICkgeworICAgICAgICBrbXBfdGVhbV9wIGNvbnN0ICogdGVhbSA9IGxpc3QtPmVudHJ5OworICAgICAgICBpbnQgaTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAiVGVhbSAlMnggJXA6XG4iLCB0ZWFtLT50LnRfaWQsIHRlYW0gKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgUGFyZW50IFRlYW06ICAgICAgIiwgICAgICB0ZWFtLT50LnRfcGFyZW50ICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIE1hc3RlciBUSUQ6ICAgICAgICUyZFxuIiwgdGVhbS0+dC50X21hc3Rlcl90aWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTWF4IHRocmVhZHM6ICAgICAgJTJkXG4iLCB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggICAgICAgICAgICAgICAiICAgIExldmVscyBvZiBzZXJpYWw6ICUyZFxuIiwgdGVhbS0+dC50X3NlcmlhbGl6ZWQgKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCAgICAgICAgICAgICAgICIgICAgTnVtYmVyIHRocmVhZHM6ICAgJTJkXG4iLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGkgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoICAgICAgICAgICAiICAgIFRocmVhZCAlMmQ6ICAgICAgIiwgaSApOworICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RocmVhZCggIiIsIHRlYW0tPnQudF90aHJlYWRzWyBpIF0gKTsKKyAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlX3RlYW0oICIgICAgTmV4dCBpbiBwb29sOiAgICAgIiwgICAgICB0ZWFtLT50LnRfbmV4dF9wb29sICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworICAgICAgICBsaXN0ID0gbGlzdC0+bmV4dDsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUHJpbnQgb3V0IF9fa21wX3RocmVhZF9wb29sIGFuZCBfX2ttcF90ZWFtX3Bvb2wuCisgICAgX19rbXBfcHJpbnRmKCAiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblBvb2xzXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIgKTsKKyAgICBfX2ttcF9wcmludF9zdHJ1Y3R1cmVfdGhyZWFkKCAgICJUaHJlYWQgcG9vbDogICAgICAgICAgIiwgKGttcF9pbmZvX3QgKilfX2ttcF90aHJlYWRfcG9vbCApOworICAgIF9fa21wX3ByaW50X3N0cnVjdHVyZV90ZWFtKCAgICAgIlRlYW0gcG9vbDogICAgICAgICAgICAiLCAoa21wX3RlYW1fdCAqKV9fa21wX3RlYW1fcG9vbCApOworICAgIF9fa21wX3ByaW50ZiggIlxuIiApOworCisgICAgLy8gRnJlZSB0ZWFtIGxpc3QuCisgICAgd2hpbGUgKCBsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgIGttcF90ZWFtX2xpc3RfaXRlbV90ICogaXRlbSA9IGxpc3Q7CisgICAgICAgIGxpc3QgPSBsaXN0LT5uZXh0OworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggaXRlbSApOworICAgIH07IC8vIHdoaWxlCisKK30KKworI2VuZGlmCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBTdHVmZiBmb3IgcGVyLXRocmVhZCBmYXN0IHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisvLyAgVGFibGUgb2YgcHJpbWVzCisKK3N0YXRpYyBjb25zdCB1bnNpZ25lZCBfX2ttcF9wcmltZXNbXSA9IHsKKyAgMHg5ZTM3NzliMSwgMHhmZmU2Y2M1OSwgMHgyMTA5ZjZkZCwgMHg0Mzk3N2FiNSwKKyAgMHhiYTU3MDNmNSwgMHhiNDk1YTg3NywgMHhlMTYyNjc0MSwgMHg3OTY5NWU2YiwKKyAgMHhiYzk4YzA5ZiwgMHhkNWJlZTJiMywgMHgyODc0ODhmOSwgMHgzYWYxODIzMSwKKyAgMHg5Njc3Y2Q0ZCwgMHhiZTNhNjkyOSwgMHhhZGM2YTg3NywgMHhkY2YwNjc0YiwKKyAgMHhiZTRkNmZlOSwgMHg1ZjE1ZTIwMSwgMHg5OWFmYzNmZCwgMHhmM2YxNjgwMSwKKyAgMHhlMjIyY2ZmZiwgMHgyNGJhNWZkYiwgMHgwNjIwNDUyZCwgMHg3OWYxNDllMywKKyAgMHhjOGI5M2Y0OSwgMHg5NzI3MDJjZCwgMHhiMDdkZDgyNywgMHg2Yzk3ZDVlZCwKKyAgMHgwODVhM2Q2MSwgMHg0NmViNWVhNywgMHgzZDk5MTBlZCwgMHgyZTY4N2I1YiwKKyAgMHgyOTYwOTIyNywgMHg2ZWIwODFmMSwgMHgwOTU0YzRlMSwgMHg5ZDExNGRiOSwKKyAgMHg1NDJhY2ZhOSwgMHhiM2U2YmQ3YiwgMHgwNzQyZDkxNywgMHhlOWYzZmZhNywKKyAgMHg1NDU4MWVkYiwgMHhmMjQ4MGY0NSwgMHgwYmI5Mjg4ZiwgMHhlZjFhZmZjNywKKyAgMHg4NWZhMGNhNywgMHgzY2NjMTRkYiwgMHhlNmJhZjM0YiwgMHgzNDMzNzdmNywKKyAgMHg1Y2ExOTAzMSwgMHhlNmQ5MjkzYiwgMHhmMGE5ZjM5MSwgMHg1ZDJlOTgwYiwKKyAgMHhmYzQxMTA3MywgMHhjMzc0OTM2MywgMHhiODkyZDgyOSwgMHgzNTQ5MzY2YiwKKyAgMHg2Mjk3NTBhZCwgMHhiOTgyOTRlNSwgMHg4OTJkOTQ4MywgMHhjMjM1YmFmMywKKyAgMHgzZDI0MDJhMywgMHg2YmRlZjNjOSwgMHhiZWMzMzNjZCwgMHg0MGM5NTIwZgorfTsKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF9nZXRfcmFuZG9tOiBHZXQgYSByYW5kb20gbnVtYmVyIHVzaW5nIGEgbGluZWFyIGNvbmdydWVudGlhbCBtZXRob2QuCisKK3Vuc2lnbmVkIHNob3J0CitfX2ttcF9nZXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgeCA9IHRocmVhZC0+dGgudGhfeDsKKyAgdW5zaWduZWQgc2hvcnQgciA9IHg+PjE2OworCisgIHRocmVhZC0+dGgudGhfeCA9IHgqdGhyZWFkLT50aC50aF9hKzE7CisKKyAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2V0X3JhbmRvbTogVEhSRUFEOiAlZCwgUkVUVVJOOiAldVxuIiwKKyAgICAgICAgIHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQsIHIpICk7CisKKyAgcmV0dXJuIHI7Cit9CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9pbml0X3JhbmRvbTogSW5pdGlhbGl6ZSBhIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yCisKK3ZvaWQKK19fa21wX2luaXRfcmFuZG9tKCBrbXBfaW5mb190ICogdGhyZWFkICkKK3sKKyAgdW5zaWduZWQgc2VlZCA9IHRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgdGhyZWFkLT50aC50aF9hID0gX19rbXBfcHJpbWVzW3NlZWQlKHNpemVvZihfX2ttcF9wcmltZXMpL3NpemVvZihfX2ttcF9wcmltZXNbMF0pKV07CisgIHRocmVhZC0+dGgudGhfeCA9IChzZWVkKzEpKnRocmVhZC0+dGgudGhfYSsxOworICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9pbml0X3JhbmRvbTogVEhSRUFEOiAldTsgQTogJXVcbiIsIHNlZWQsIHRocmVhZC0+dGgudGhfYSkgKTsKK30KKworCisjaWYgS01QX09TX1dJTkRPV1MKKy8qIHJlY2xhaW0gYXJyYXkgZW50cmllcyBmb3Igcm9vdCB0aHJlYWRzIHRoYXQgYXJlIGFscmVhZHkgZGVhZCwgcmV0dXJucyBudW1iZXIgcmVjbGFpbWVkICovCitzdGF0aWMgaW50CitfX2ttcF9yZWNsYWltX2RlYWRfcm9vdHModm9pZCkgeworICAgIGludCBpLCByID0gMDsKKworICAgIGZvcihpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsraSkgeworICAgICAgICBpZiggS01QX1VCRVJfR1RJRCggaSApICYmCisgICAgICAgICAgIV9fa21wX3N0aWxsX3J1bm5pbmcoKGttcF9pbmZvX3QgKilUQ1JfU1lOQ19QVFIoX19rbXBfdGhyZWFkc1tpXSkpICYmCisgICAgICAgICAgIV9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKSB7IC8vIEFDOiByZWNsYWltIG9ubHkgcm9vdHMgZGllZCBpbiBub24tYWN0aXZlIHN0YXRlCisgICAgICAgICAgICByICs9IF9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQoaSk7CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIHI7Cit9CisjZW5kaWYKKworLyoKKyAgIFRoaXMgZnVuY3Rpb24gYXR0ZW1wdHMgdG8gY3JlYXRlIGZyZWUgZW50cmllcyBpbiBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290LCBhbmQgcmV0dXJucyB0aGUgbnVtYmVyIG9mCisgICBmcmVlIGVudHJpZXMgZ2VuZXJhdGVkLgorCisgICBGb3IgV2luZG93cyogT1Mgc3RhdGljIGxpYnJhcnksIHRoZSBmaXJzdCBtZWNoYW5pc20gdXNlZCBpcyB0byByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZQorICAgYWxyZWFkeSBkZWFkLgorCisgICBPbiBhbGwgcGxhdGZvcm1zLCBleHBhbnNpb24gaXMgYXR0ZW1wdGVkIG9uIHRoZSBhcnJheXMgX19rbXBfdGhyZWFkc18gYW5kIF9fa21wX3Jvb3QsIHdpdGggYXBwcm9wcmlhdGUKKyAgIHVwZGF0ZSB0byBfX2ttcF90aHJlYWRzX2NhcGFjaXR5LiAgQXJyYXkgY2FwYWNpdHkgaXMgaW5jcmVhc2VkIGJ5IGRvdWJsaW5nIHdpdGggY2xpcHBpbmcgdG8KKyAgICBfX2ttcF90cF9jYXBhY2l0eSwgaWYgdGhyZWFkcHJpdmF0ZSBjYWNoZSBhcnJheSBoYXMgYmVlbiBjcmVhdGVkLgorICAgU3luY2hyb25pemF0aW9uIHdpdGggX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkIGlzIGRvbmUgdXNpbmcgX19rbXBfdHBfY2FjaGVkX2xvY2suCisKKyAgIEFmdGVyIGFueSBkZWFkIHJvb3QgcmVjbGFtYXRpb24sIGlmIHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MgYXJyYXkgZXhwYW5zaW9uIHRvIHJlc3VsdCBpbiB0aGUgZ2VuZXJhdGlvbgorICAgb2YgYSB0b3RhbCBvZiBuV2lzaCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4gIElmIG5vdCwgYnV0IHRoZSBjbGlwcGluZyB2YWx1ZSBhbGxvd3MKKyAgIGFycmF5IGV4cGFuc2lvbiB0byByZXN1bHQgaW4gdGhlIGdlbmVyYXRpb24gb2YgYSB0b3RhbCBvZiBuTmVlZCBmcmVlIHNsb3RzLCB0aGUgZnVuY3Rpb24gZG9lcyB0aGF0IGV4cGFuc2lvbi4KKyAgIE90aGVyd2lzZSwgbm90aGluZyBpcyBkb25lIGJleW9uZCB0aGUgcG9zc2libGUgaW5pdGlhbCByb290IHRocmVhZCByZWNsYW1hdGlvbi4gIEhvd2V2ZXIsIGlmIG5OZWVkIGlzIHplcm8sCisgICBhIGJlc3QtZWZmb3J0IGF0dGVtcHQgaXMgbWFkZSB0byBmdWxmaWwgbldpc2ggYXMgZmFyIGFzIHBvc3NpYmxlLCBpLmUuIHRoZSBmdW5jdGlvbiB3aWxsIGF0dGVtcHQgdG8gY3JlYXRlCisgICBhcyBtYW55IGZyZWUgc2xvdHMgYXMgcG9zc2libGUgdXAgdG8gbldpc2guCisKKyAgIElmIGFueSBhcmd1bWVudCBpcyBuZWdhdGl2ZSwgdGhlIGJlaGF2aW9yIGlzIHVuZGVmaW5lZC4KKyovCitzdGF0aWMgaW50CitfX2ttcF9leHBhbmRfdGhyZWFkcyhpbnQgbldpc2gsIGludCBuTmVlZCkgeworICAgIGludCBhZGRlZCA9IDA7CisgICAgaW50IG9sZF90cF9jYWNoZWQ7CisgICAgaW50IF9fa21wX2FjdHVhbF9tYXhfbnRoOworCisgICAgaWYobk5lZWQgPiBuV2lzaCkgLyogbm9ybWFsaXplIHRoZSBhcmd1bWVudHMgKi8KKyAgICAgICAgbldpc2ggPSBuTmVlZDsKKyNpZiBLTVBfT1NfV0lORE9XUyAmJiAhZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKy8qIG9ubHkgZm9yIFdpbmRvd3Mgc3RhdGljIGxpYnJhcnkgKi8KKyAgICAvKiByZWNsYWltIGFycmF5IGVudHJpZXMgZm9yIHJvb3QgdGhyZWFkcyB0aGF0IGFyZSBhbHJlYWR5IGRlYWQgKi8KKyAgICBhZGRlZCA9IF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOworCisgICAgaWYobk5lZWQpIHsKKyAgICAgICAgbk5lZWQgLT0gYWRkZWQ7CisgICAgICAgIGlmKG5OZWVkIDwgMCkKKyAgICAgICAgICAgIG5OZWVkID0gMDsKKyAgICB9CisgICAgaWYobldpc2gpIHsKKyAgICAgICAgbldpc2ggLT0gYWRkZWQ7CisgICAgICAgIGlmKG5XaXNoIDwgMCkKKyAgICAgICAgICAgIG5XaXNoID0gMDsKKyAgICB9CisjZW5kaWYKKyAgICBpZihuV2lzaCA8PSAwKQorICAgICAgICByZXR1cm4gYWRkZWQ7CisKKyAgICB3aGlsZSgxKSB7CisgICAgICAgIGludCBuVGFyZ2V0OworICAgICAgICBpbnQgbWluaW11bVJlcXVpcmVkQ2FwYWNpdHk7CisgICAgICAgIGludCBuZXdDYXBhY2l0eTsKKyAgICAgICAga21wX2luZm9fdCAqKm5ld1RocmVhZHM7CisgICAgICAgIGttcF9yb290X3QgKipuZXdSb290OworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdGUgdGhhdCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGlzIG5vdCBib3VuZGVkIGJ5IF9fa21wX21heF9udGguCisgICAgICAgIC8vIElmIF9fa21wX21heF9udGggaXMgc2V0IHRvIHNvbWUgdmFsdWUgbGVzcyB0aGFuIF9fa21wX3N5c19tYXhfbnRoCisgICAgICAgIC8vIGJ5IHRoZSB1c2VyIHZpYSBPTVBfVEhSRUFEX0xJTUlULCB0aGVuIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgbWF5CisgICAgICAgIC8vIGJlY29tZSA+IF9fa21wX21heF9udGggaW4gb25lIG9mIHR3byB3YXlzOgorICAgICAgICAvLworICAgICAgICAvLyAxKSBUaGUgaW5pdGlhbGl6YXRpb24gdGhyZWFkIChndGlkID0gMCkgZXhpdHMuICBfX2ttcF90aHJlYWRzWzBdCisgICAgICAgIC8vICAgIG1heSBub3QgYmUgcmVzdXNlZCBieSBhbm90aGVyIHRocmVhZCwgc28gd2UgbWF5IG5lZWQgdG8gaW5jcmVhc2UKKyAgICAgICAgLy8gICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSB0byBfX2ttcF9tYXhfdGhyZWFkcyArIDEuCisgICAgICAgIC8vCisgICAgICAgIC8vIDIpIE5ldyBmb3JlaWduIHJvb3QocykgYXJlIGVuY291bnRlcmVkLiAgV2UgYWx3YXlzIHJlZ2lzdGVyIG5ldworICAgICAgICAvLyAgICBmb3JlaWduIHJvb3RzLiAgVGhpcyBtYXkgY2F1c2UgYSBzbWFsbGVyICMgb2YgdGhyZWFkcyB0byBiZQorICAgICAgICAvLyAgICBhbGxvY2F0ZWQgYXQgc3Vic2VxdWVudCBwYXJhbGxlbCByZWdpb25zLCBidXQgdGhlIHdvcmtlciB0aHJlYWRzCisgICAgICAgIC8vICAgIGhhbmcgYXJvdW5kIChhbmQgZXZlbnR1YWxseSBnbyB0byBzbGVlcCkgYW5kIG5lZWQgc2xvdHMgaW4gdGhlCisgICAgICAgIC8vICAgIF9fa21wX3RocmVhZHNbXSBhcnJheS4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gQW55d2F5LCB0aGF0IGlzIHRoZSByZWFzb24gZm9yIG1vdmluZyB0aGUgY2hlY2sgdG8gc2VlIGlmCisgICAgICAgIC8vIF9fa21wX21heF90aHJlYWRzIHdhcyBleGNlZWRlZCBpbnRvIF9fa21wX3Jlc2VlcnZlX3RocmVhZHMoKQorICAgICAgICAvLyBpbnN0ZWFkIG9mIGhhdmluZyBpdCBwZXJmb3JtZWQgaGVyZS4gLUJCCisgICAgICAgIC8vCisgICAgICAgIG9sZF90cF9jYWNoZWQgPSBfX2ttcF90cF9jYWNoZWQ7CisgICAgICAgIF9fa21wX2FjdHVhbF9tYXhfbnRoID0gb2xkX3RwX2NhY2hlZCA/IF9fa21wX3RwX2NhcGFjaXR5IDogX19rbXBfc3lzX21heF9udGg7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfYWN0dWFsX21heF9udGggPj0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSk7CisKKyAgICAgICAgLyogY29tcHV0ZSBleHBhbnNpb24gaGVhZHJvb20gdG8gY2hlY2sgaWYgd2UgY2FuIGV4cGFuZCBhbmQgd2hldGhlciB0byBhaW0gZm9yIG5XaXNoIG9yIG5OZWVkICovCisgICAgICAgIG5UYXJnZXQgPSBuV2lzaDsKKyAgICAgICAgaWYoX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDwgblRhcmdldCkgeworICAgICAgICAgICAgLyogY2FuJ3QgZnVsZmlsIG5XaXNoLCBzbyB0cnkgbk5lZWQgKi8KKyAgICAgICAgICAgIGlmKG5OZWVkKSB7CisgICAgICAgICAgICAgICAgblRhcmdldCA9IG5OZWVkOworICAgICAgICAgICAgICAgIGlmKF9fa21wX2FjdHVhbF9tYXhfbnRoIC0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSA8IG5UYXJnZXQpIHsKKyAgICAgICAgICAgICAgICAgICAgLyogcG9zc2libGUgZXhwYW5zaW9uIHRvbyBzbWFsbCAtLSBnaXZlIHVwICovCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLyogYmVzdC1lZmZvcnQgKi8KKyAgICAgICAgICAgICAgICBuVGFyZ2V0ID0gX19rbXBfYWN0dWFsX21heF9udGggLSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICAgICAgICAgIGlmKCFuVGFyZ2V0KSB7CisgICAgICAgICAgICAgICAgICAgIC8qIGNhbiBleHBhbmQgYXQgYWxsIC0tIGdpdmUgdXAgKi8KKyAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIG1pbmltdW1SZXF1aXJlZENhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eSArIG5UYXJnZXQ7CisKKyAgICAgICAgbmV3Q2FwYWNpdHkgPSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OworICAgICAgICBkb3sKKyAgICAgICAgICAgIG5ld0NhcGFjaXR5ID0KKyAgICAgICAgICAgICAgICBuZXdDYXBhY2l0eSA8PSAoX19rbXBfYWN0dWFsX21heF9udGggPj4gMSkgPworICAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSA8PCAxKSA6CisgICAgICAgICAgICAgICAgX19rbXBfYWN0dWFsX21heF9udGg7CisgICAgICAgIH0gd2hpbGUobmV3Q2FwYWNpdHkgPCBtaW5pbXVtUmVxdWlyZWRDYXBhY2l0eSk7CisgICAgICAgIG5ld1RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSgoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpICogbmV3Q2FwYWNpdHkgKyBDQUNIRV9MSU5FKTsKKyAgICAgICAgbmV3Um9vdCA9IChrbXBfcm9vdF90KiopICgoY2hhciopbmV3VGhyZWFkcyArIHNpemVvZihrbXBfaW5mb190KikgKiBuZXdDYXBhY2l0eSApOworICAgICAgICBLTVBfTUVNQ1BZKG5ld1RocmVhZHMsIF9fa21wX3RocmVhZHMsIF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKiBzaXplb2Yoa21wX2luZm9fdCopKTsKKyAgICAgICAgS01QX01FTUNQWShuZXdSb290LCBfX2ttcF9yb290LCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisgICAgICAgIG1lbXNldChuZXdUaHJlYWRzICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9pbmZvX3QqKSk7CisgICAgICAgIG1lbXNldChuZXdSb290ICsgX19rbXBfdGhyZWFkc19jYXBhY2l0eSwgMCwKKyAgICAgICAgICAgICAgIChuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHkpICogc2l6ZW9mKGttcF9yb290X3QqKSk7CisKKyAgICAgICAgaWYoIW9sZF90cF9jYWNoZWQgJiYgX19rbXBfdHBfY2FjaGVkICYmIG5ld0NhcGFjaXR5ID4gX19rbXBfdHBfY2FwYWNpdHkpIHsKKyAgICAgICAgICAgIC8qIF9fa21wX3RwX2NhY2hlZCBoYXMgY2hhbmdlZCwgaS5lLiBfX2ttcGNfdGhyZWFkcHJpdmF0ZV9jYWNoZWQgaGFzIGFsbG9jYXRlZCBhIHRocmVhZHByaXZhdGUgY2FjaGUKKyAgICAgICAgICAgICAgIHdoaWxlIHdlIHdlcmUgYWxsb2NhdGluZyB0aGUgZXhwYW5kZWQgYXJyYXksIGFuZCBvdXIgbmV3IGNhcGFjaXR5IGlzIGxhcmdlciB0aGFuIHRoZSB0aHJlYWRwcml2YXRlCisgICAgICAgICAgICAgICBjYWNoZSBjYXBhY2l0eSwgc28gd2Ugc2hvdWxkIGRlYWxsb2NhdGUgdGhlIGV4cGFuZGVkIGFycmF5cyBhbmQgdHJ5IGFnYWluLiAgVGhpcyBpcyB0aGUgZmlyc3QgY2hlY2sKKyAgICAgICAgICAgICAgIG9mIGEgZG91YmxlLWNoZWNrIHBhaXIuCisgICAgICAgICAgICAqLworICAgICAgICAgICAgX19rbXBfZnJlZShuZXdUaHJlYWRzKTsKKyAgICAgICAgICAgIGNvbnRpbnVlOyAvKiBzdGFydCBvdmVyIGFuZCB0cnkgYWdhaW4gKi8KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgIGlmKCFvbGRfdHBfY2FjaGVkICYmIF9fa21wX3RwX2NhY2hlZCAmJiBuZXdDYXBhY2l0eSA+IF9fa21wX3RwX2NhcGFjaXR5KSB7CisgICAgICAgICAgICAvKiBTYW1lIGNoZWNrIGFzIGFib3ZlLCBidXQgdGhpcyB0aW1lIHdpdGggdGhlIGxvY2sgc28gd2UgY2FuIGJlIHN1cmUgaWYgd2UgY2FuIHN1Y2NlZWQuICovCisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICBfX2ttcF9mcmVlKG5ld1RocmVhZHMpOworICAgICAgICAgICAgY29udGludWU7IC8qIHN0YXJ0IG92ZXIgYW5kIHRyeSBhZ2FpbiAqLworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLyogc3VjY2VzcyAqLworICAgICAgICAgICAgLy8gX19rbXBfZnJlZSggX19rbXBfdGhyZWFkcyApOyAvLyBBVFQ6IEl0IGxlYWRzIHRvIGNyYXNoLiBOZWVkIHRvIGJlIGludmVzdGlnYXRlZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAqKGttcF9pbmZvX3QqKnZvbGF0aWxlKikmX19rbXBfdGhyZWFkcyA9IG5ld1RocmVhZHM7CisgICAgICAgICAgICAqKGttcF9yb290X3QqKnZvbGF0aWxlKikmX19rbXBfcm9vdCA9IG5ld1Jvb3Q7CisgICAgICAgICAgICBhZGRlZCArPSBuZXdDYXBhY2l0eSAtIF9fa21wX3RocmVhZHNfY2FwYWNpdHk7CisgICAgICAgICAgICAqKHZvbGF0aWxlIGludCopJl9fa21wX3RocmVhZHNfY2FwYWNpdHkgPSBuZXdDYXBhY2l0eTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIGJyZWFrOyAvKiBzdWNjZWVkZWQsIHNvIHdlIGNhbiBleGl0IHRoZSBsb29wICovCisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIGFkZGVkOworfQorCisvKiByZWdpc3RlciB0aGUgY3VycmVudCB0aHJlYWQgYXMgYSByb290IHRocmVhZCBhbmQgb2J0YWluIG91ciBndGlkICovCisvKiB3ZSBtdXN0IGhhdmUgdGhlIF9fa21wX2luaXR6X2xvY2sgaGVsZCBhdCB0aGlzIHBvaW50ICovCisvKiBBcmd1bWVudCBUUlVFIG9ubHkgaWYgYXJlIHRoZSB0aHJlYWQgdGhhdCBjYWxscyBmcm9tIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCkgKi8KK2ludAorX19rbXBfcmVnaXN0ZXJfcm9vdCggaW50IGluaXRpYWxfdGhyZWFkICkKK3sKKyAgICBrbXBfaW5mb190ICpyb290X3RocmVhZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworICAgIGludCAgICAgICAgIGd0aWQ7CisgICAgaW50ICAgICAgICAgY2FwYWNpdHk7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfcmVnaXN0ZXJfcm9vdDogZW50ZXJlZFxuIikpOworICAgIEtNUF9NQigpOworCisKKyAgICAvKgorICAgICAgICAyMDA3LTAzLTAyOgorCisgICAgICAgIElmIGluaXRpYWwgdGhyZWFkIGRpZCBub3QgaW52b2tlIE9wZW5NUCBSVEwgeWV0LCBhbmQgdGhpcyB0aHJlYWQgaXMgbm90IGFuIGluaXRpYWwgb25lLAorICAgICAgICAiX19rbXBfYWxsX250aCA+PSBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IiBjb25kaXRpb24gZG9lcyBub3Qgd29yayBhcyBleHBlY3RlZCAtLSBpdCBtYXkKKyAgICAgICAgcmV0dXJuIGZhbHNlICh0aGF0IG1lYW5zIHRoZXJlIGlzIGF0IGxlYXN0IG9uZSBlbXB0eSBzbG90IGluIF9fa21wX3RocmVhZHMgYXJyYXkpLCBidXQgaXQKKyAgICAgICAgaXMgcG9zc2libGUgdGhlIG9ubHkgZnJlZSBzbG90IGlzICMwLCB3aGljaCBpcyByZXNlcnZlZCBmb3IgaW5pdGlhbCB0aHJlYWQgYW5kIHNvIGNhbm5vdCBiZQorICAgICAgICB1c2VkIGZvciB0aGlzIG9uZS4gRm9sbG93aW5nIGNvZGUgd29ya2Fyb3VuZHMgdGhpcyBidWcuCisKKyAgICAgICAgSG93ZXZlciwgcmlnaHQgc29sdXRpb24gc2VlbXMgdG8gYmUgbm90IHJlc2VydmluZyBzbG90ICMwIGZvciBpbml0aWFsIHRocmVhZCBiZWNhdXNlOgorICAgICAgICAgICAgKDEpIHRoZXJlIGlzIG5vIG1hZ2ljIGluIHNsb3QgIzAsCisgICAgICAgICAgICAoMikgd2UgY2Fubm90IGRldGVjdCBpbml0aWFsIHRocmVhZCByZWxpYWJseSAodGhlIGZpcnN0IHRocmVhZCB3aGljaCBkb2VzIHNlcmlhbAorICAgICAgICAgICAgICAgIGluaXRpYWxpemF0aW9uIG1heSBiZSBub3QgYSByZWFsIGluaXRpYWwgdGhyZWFkKS4KKyAgICAqLworICAgIGNhcGFjaXR5ID0gX19rbXBfdGhyZWFkc19jYXBhY2l0eTsKKyAgICBpZiAoICEgaW5pdGlhbF90aHJlYWQgJiYgVENSX1BUUihfX2ttcF90aHJlYWRzWzBdKSA9PSBOVUxMICkgeworICAgICAgICAtLSBjYXBhY2l0eTsKKyAgICB9OyAvLyBpZgorCisgICAgLyogc2VlIGlmIHRoZXJlIGFyZSB0b28gbWFueSB0aHJlYWRzICovCisgICAgaWYgKCBfX2ttcF9hbGxfbnRoID49IGNhcGFjaXR5ICYmICFfX2ttcF9leHBhbmRfdGhyZWFkcyggMSwgMSApICkgeworICAgICAgICBpZiAoIF9fa21wX3RwX2NhY2hlZCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU2V0X0FMTF9USFJFQURQUklWQVRFLCBfX2ttcF90cF9jYXBhY2l0eSApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFBvc3NpYmxlU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudFJlZ2lzdGVyTmV3VGhyZWFkICksCisgICAgICAgICAgICAgICAgS01QX0hOVCggU3lzdGVtTGltaXRPblRocmVhZHMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKKyAgICAvKiBmaW5kIGFuIGF2YWlsYWJsZSB0aHJlYWQgc2xvdCAqLworICAgIC8qIERvbid0IHJlYXNzaWduIHRoZSB6ZXJvIHNsb3Qgc2luY2Ugd2UgbmVlZCB0aGF0IHRvIG9ubHkgYmUgdXNlZCBieSBpbml0aWFsCisgICAgICAgdGhyZWFkICovCisgICAgZm9yKCBndGlkPShpbml0aWFsX3RocmVhZCA/IDAgOiAxKSA7IFRDUl9QVFIoX19rbXBfdGhyZWFkc1tndGlkXSkgIT0gTlVMTCA7IGd0aWQrKyApCisgICAgICAgIDsKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF9yZWdpc3Rlcl9yb290OiBmb3VuZCBzbG90IGluIHRocmVhZHMgYXJyYXk6IFQjJWRcbiIsIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggZ3RpZCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8qIHVwZGF0ZSBnbG9iYWwgYWNjb3VudGluZyAqLworICAgIF9fa21wX2FsbF9udGggKys7CisgICAgVENXXzQoX19rbXBfbnRoLCBfX2ttcF9udGggKyAxKTsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICAgICAgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBzZXR1cCB0aGlzIG5ldyBoaWVyYXJjaHkgKi8KKyAgICBpZiggISAoIHJvb3QgPSBfX2ttcF9yb290W2d0aWRdICkpIHsKKyAgICAgICAgcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF0gPSAoa21wX3Jvb3RfdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX3Jvb3RfdCkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfcm9vdF90ZWFtICk7CisgICAgfQorCisgICAgX19rbXBfaW5pdGlhbGl6ZV9yb290KCByb290ICk7CisKKyAgICAvKiBzZXR1cCBuZXcgcm9vdCB0aHJlYWQgc3RydWN0dXJlICovCisgICAgaWYoIHJvb3QtPnIucl91YmVyX3RocmVhZCApIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSByb290LT5yLnJfdWJlcl90aHJlYWQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcm9vdF90aHJlYWQgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50X3RocmVhZF9zdG9yYWdlX21hcCggcm9vdF90aHJlYWQsIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICByb290X3RocmVhZC0+dGgudGhfaW5mbyAuZHMuZHNfZ3RpZCA9IGd0aWQ7CisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9yb290ID0gIHJvb3Q7CisgICAgICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfY29ucyA9IF9fa21wX2FsbG9jYXRlX2NvbnNfc3RhY2soIGd0aWQgKTsKKyAgICAgICAgfQorICAgICAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2Zhc3RfbWVtb3J5KCByb290X3RocmVhZCApOworICAgICAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICAgICAgI2lmIEtNUF9VU0VfQkdFVAorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSA9PSBOVUxMICk7CisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX2JnZXQoIHJvb3RfdGhyZWFkICk7CisgICAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9pbml0X3JhbmRvbSggcm9vdF90aHJlYWQgKTsgIC8vIEluaXRpYWxpemUgcmFuZG9tIG51bWJlciBnZW5lcmF0b3IKKyAgICB9CisKKyAgICAvKiBzZXR1cCB0aGUgc2VyaWFsIHRlYW0gaGVsZCBpbiByZXNlcnZlIGJ5IHRoZSByb290IHRocmVhZCAqLworICAgIGlmKCAhIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApIHsKKyAgICAgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfZ2xvYmFsX2ljdnMoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBiZWZvcmUgc2VyaWFsX3RlYW1cbiIgKSApOworCisgICAgICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSA9IF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCggcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWdpc3Rlcl9yb290OiBhZnRlciBzZXJpYWxfdGVhbSA9ICVwXG4iLAorICAgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtICkgKTsKKworICAgIC8qIGRyb3Agcm9vdF90aHJlYWQgaW50byBwbGFjZSAqLworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW2d0aWRdLCByb290X3RocmVhZCk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3QtPnIucl9ob3RfdGVhbSAtPnQudF90aHJlYWRzWzBdID0gcm9vdF90aHJlYWQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX3NlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IHJvb3RfdGhyZWFkOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbS0+dC50X3NlcmlhbGl6ZWQgPSAwOyAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IHJvb3RfdGhyZWFkOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgdGhyZWFkLCBnZXQgaXQgcmVhZHkgdG8gZ28gKi8KKyAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIHJvb3RfdGhyZWFkLCByb290LT5yLnJfcm9vdF90ZWFtLCAwLCBndGlkICk7CisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBUUlVFKTsKKworICAgIC8qIHByZXBhcmUgdGhlIG1hc3RlciB0aHJlYWQgZm9yIGdldF9ndGlkKCkgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgICAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9jcmVhdGVfd29ya2VyKCBndGlkLCByb290X3RocmVhZCwgX19rbXBfc3Rrc2l6ZSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkgPT0gZ3RpZCApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3JlZ2lzdGVyX3Jvb3Q6IFQjJWQgaW5pdCBUIyVkKCVkOiVkKSBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggMCwgcm9vdC0+ci5yX2hvdF90ZWFtICksCisgICAgICAgICAgICAgICAgICAgIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2lkLCAwLCBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFLAorICAgICAgICAgICAgICAgICAgICBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICkgKTsKKyAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICBpbnQgYjsKKyAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfYmFyWyBiIF0uYmIuYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICByb290X3RocmVhZC0+dGgudGhfYmFyWyBiIF0uYmIuYl93b3JrZXJfYXJyaXZlZCA9IDA7CisjZW5kaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9ob3RfdGVhbS0+dC50X2JhclsgYnNfZm9ya2pvaW5fYmFycmllciBdLmJfYXJyaXZlZCA9PSBLTVBfSU5JVF9CQVJSSUVSX1NUQVRFICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgcm9vdF90aHJlYWQtPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9uZXdfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIHJvb3RfdGhyZWFkLT50aC50aF9maXJzdF9wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgcm9vdF90aHJlYWQtPnRoLnRoX2xhc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworIyBlbmRpZgorCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIFRSVUUgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgX19rbXBfcm9vdF9jb3VudGVyICsrOworCisgICAgS01QX01CKCk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKworICAgIHJldHVybiBndGlkOworfQorCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKK3N0YXRpYyBpbnQKK19fa21wX2ZyZWVfaG90X3RlYW1zKCBrbXBfcm9vdF90ICpyb290LCBrbXBfaW5mb190ICp0aHIsIGludCBsZXZlbCwgY29uc3QgaW50IG1heF9sZXZlbCApCit7CisgICAgaW50IGksIG4sIG50aDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtcyA9IHRoci0+dGgudGhfaG90X3RlYW1zOworICAgIGlmKCAhaG90X3RlYW1zIHx8ICFob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGV2ZWwgPCBtYXhfbGV2ZWwgKTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbTsKKyAgICBudGggPSBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aDsKKyAgICBuID0gbnRoIC0gMTsgICAgICAgICAgICAgICAgICAgLy8gbWFzdGVyIGlzIG5vdCBmcmVlZAorICAgIGlmKCBsZXZlbCA8IG1heF9sZXZlbCAtIDEgKSB7CisgICAgICAgIGZvciggaSA9IDA7IGkgPCBudGg7ICsraSApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICAgICAgICBuICs9IF9fa21wX2ZyZWVfaG90X3RlYW1zKCByb290LCB0aCwgbGV2ZWwgKyAxLCBtYXhfbGV2ZWwgKTsKKyAgICAgICAgICAgIGlmKCBpID4gMCAmJiB0aC0+dGgudGhfaG90X3RlYW1zICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9ob3RfdGVhbXMgKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaG90X3RlYW1zID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHRlYW0sIE5VTEwgKTsKKyAgICByZXR1cm4gbjsKK30KKyNlbmRpZgorCisvKiBSZXNldHMgYSByb290IHRocmVhZCBhbmQgY2xlYXIgaXRzIHJvb3QgYW5kIGhvdCB0ZWFtcy4KKyAgIFJldHVybnMgdGhlIG51bWJlciBvZiBfX2ttcF90aHJlYWRzIGVudHJpZXMgZGlyZWN0bHkgYW5kIGluZGlyZWN0bHkgZnJlZWQuCisqLworc3RhdGljIGludAorX19rbXBfcmVzZXRfcm9vdChpbnQgZ3RpZCwga21wX3Jvb3RfdCAqcm9vdCkKK3sKKyAgICBrbXBfdGVhbV90ICogcm9vdF90ZWFtID0gcm9vdC0+ci5yX3Jvb3RfdGVhbTsKKyAgICBrbXBfdGVhbV90ICogaG90X3RlYW0gID0gcm9vdC0+ci5yX2hvdF90ZWFtOworICAgIGludCAgICAgICAgICBuICAgICAgICAgPSBob3RfdGVhbS0+dC50X25wcm9jOworICAgIGludCBpOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggISByb290LT5yLnJfYWN0aXZlICk7CisKKyAgICByb290LT5yLnJfcm9vdF90ZWFtID0gTlVMTDsKKyAgICByb290LT5yLnJfaG90X3RlYW0gID0gTlVMTDsKKyAgICAgICAgLy8gX19rbXBfZnJlZV90ZWFtKCkgZG9lcyBub3QgZnJlZSBob3QgdGVhbXMsIHNvIHdlIGhhdmUgdG8gY2xlYXIgcl9ob3RfdGVhbSBiZWZvcmUgY2FsbAorICAgICAgICAvLyB0byBfX2ttcF9mcmVlX3RlYW0oKS4KKyAgICBfX2ttcF9mcmVlX3RlYW0oIHJvb3QsIHJvb3RfdGVhbSBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGlmKCBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsID4gMCApIHsgIC8vIG5lZWQgdG8gZnJlZSBuZXN0ZWQgaG90IHRlYW1zIGFuZCB0aGVpciB0aHJlYWRzIGlmIGFueQorICAgICAgICBmb3IoIGkgPSAwOyBpIDwgaG90X3RlYW0tPnQudF9ucHJvYzsgKytpICkgeworICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSBob3RfdGVhbS0+dC50X3RocmVhZHNbaV07CisgICAgICAgICAgICBpZiggX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCA+IDEgKSB7CisgICAgICAgICAgICAgICAgbiArPSBfX2ttcF9mcmVlX2hvdF90ZWFtcyggcm9vdCwgdGgsIDEsIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0aC0+dGgudGhfaG90X3RlYW1zICkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRoLT50aC50aF9ob3RfdGVhbXMgKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfaG90X3RlYW1zID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2ZyZWVfdGVhbSggcm9vdCwgaG90X3RlYW0gVVNFX05FU1RFRF9IT1RfQVJHKE5VTEwpICk7CisKKyAgICAvLworICAgIC8vIEJlZm9yZSB3ZSBjYW4gcmVhcCB0aGUgdGhyZWFkLCB3ZSBuZWVkIHRvIG1ha2UgY2VydGFpbiB0aGF0IGFsbAorICAgIC8vIG90aGVyIHRocmVhZHMgaW4gdGhlIHRlYW1zIHRoYXQgaGFkIHRoaXMgcm9vdCBhcyBhbmNlc3RvciBoYXZlIHN0b3BwZWQgdHJ5aW5nIHRvIHN0ZWFsIHRhc2tzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApIHsKKyAgICAgICAgX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKCk7CisgICAgfQorCisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIC8qIENsb3NlIEhhbmRsZSBvZiByb290IGR1cGxpY2F0ZWQgaW4gX19rbXBfY3JlYXRlX3dvcmtlciAodHIgIzYyOTE5KSAqLworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVzZXRfcm9vdDogZnJlZSBoYW5kbGUsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgIChMUFZPSUQpJihyb290LT5yLnJfdWJlcl90aHJlYWQtPnRoKSwKKyAgICAgICAgICAgIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICBfX2ttcF9mcmVlX2hhbmRsZSggcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApOworICAgICNlbmRpZiAvKiBLTVBfT1NfV0lORE9XUyAqLworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2VuZCkpIHsKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcF9nZXRfZ3RpZCgpOworICAgICAgICBfX29tcHRfdGhyZWFkX2VuZChvbXB0X3RocmVhZF9pbml0aWFsLCBndGlkKTsKKyAgICB9CisjZW5kaWYKKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7IC8vIF9fa21wX3JlYXBfdGhyZWFkIHdpbGwgZGVjcmVtZW50IF9fa21wX2FsbF9udGguCisgICAgX19rbXBfcmVhcF90aHJlYWQoIHJvb3QtPnIucl91YmVyX3RocmVhZCwgMSApOworCisgICAgICAgIC8vIFdlIGNhbm90IHB1dCByb290IHRocmVhZCB0byBfX2ttcF90aHJlYWRfcG9vbCwgc28gd2UgaGF2ZSB0byByZWFwIGl0IGlzdGVhZCBvZiBmcmVlaW5nLgorICAgIHJvb3QtPnIucl91YmVyX3RocmVhZCA9IE5VTEw7CisgICAgLyogbWFyayByb290IGFzIG5vIGxvbmdlciBpbiB1c2UgKi8KKyAgICByb290LT5yLnJfYmVnaW4gPSBGQUxTRTsKKworICAgIHJldHVybiBuOworfQorCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGludCBndGlkICkKK3sKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGVudGVyIFQjJWRcbiIsIGd0aWQgKSk7CisgICAgLyogdGhpcyBsb2NrIHNob3VsZCBiZSBvaywgc2luY2UgdW5yZWdpc3Rlcl9yb290X2N1cnJlbnRfdGhyZWFkIGlzIG5ldmVyIGNhbGxlZCBkdXJpbmcKKyAgICAgKiBhbmQgYWJvcnQsIG9ubHkgZHVyaW5nIGEgbm9ybWFsIGNsb3NlLiAgZnVydGhlcm1vcmUsIGlmIHlvdSBoYXZlIHRoZQorICAgICAqIGZvcmtqb2luIGxvY2ssIHlvdSBzaG91bGQgbmV2ZXIgdHJ5IHRvIGdldCB0aGUgaW5pdHogbG9jayAqLworCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IGFscmVhZHkgZmluaXNoZWQsIGV4aXRpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBrbXBfcm9vdF90ICpyb290ID0gX19rbXBfcm9vdFtndGlkXTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggcm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290ICk7CisgICAgS01QX0FTU0VSVCggcm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSApOworCisKKyAgICBLTVBfTUIoKTsKKworI2lmIE9NUF80NV9FTkFCTEVECisgICBrbXBfaW5mb190ICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgIGttcF90ZWFtX3QgKiB0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAga21wX3Rhc2tfdGVhbV90ICogICB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKworICAgLy8gd2UgbmVlZCB0byB3YWl0IGZvciB0aGUgcHJveHkgdGFza3MgYmVmb3JlIGZpbmlzaGluZyB0aGUgdGhyZWFkCisgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICYmIHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgIC8vIHRoZSBydW50aW1lIGlzIHNodXR0aW5nIGRvd24gc28gd2Ugd29uJ3QgcmVwb3J0IGFueSBldmVudHMKKyAgICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV91bmRlZmluZWQ7CisjZW5kaWYKKyAgICAgICAgX19rbXBfdGFza190ZWFtX3dhaXQodGhyZWFkLCB0ZWFtIFVTRV9JVFRfQlVJTERfQVJHKE5VTEwpKTsKKyAgIH0KKyNlbmRpZgorCisgICAgX19rbXBfcmVzZXRfcm9vdChndGlkLCByb290KTsKKworICAgIC8qIGZyZWUgdXAgdGhpcyB0aHJlYWQgc2xvdCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9ETkUgKTsKKyNpZmRlZiBLTVBfVERBVEFfR1RJRAorICAgIF9fa21wX2d0aWQgPSBLTVBfR1RJRF9ETkU7CisjZW5kaWYKKworICAgIEtNUF9NQigpOworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQ6IFQjJWQgdW5yZWdpc3RlcmVkXG4iLCBndGlkICkpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKK30KKworI2lmIEtNUF9PU19XSU5ET1dTCisvKiBfX2ttcF9mb3Jram9pbl9sb2NrIG11c3QgYmUgYWxyZWFkeSBoZWxkCisgICBVbnJlZ2lzdGVycyBhIHJvb3QgdGhyZWFkIHRoYXQgaXMgbm90IHRoZSBjdXJyZW50IHRocmVhZC4gIFJldHVybnMgdGhlIG51bWJlciBvZgorICAgX19rbXBfdGhyZWFkcyBlbnRyaWVzIGZyZWVkIGFzIGEgcmVzdWx0LgorICovCitzdGF0aWMgaW50CitfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAga21wX3Jvb3RfdCAqcm9vdCA9IF9fa21wX3Jvb3RbZ3RpZF07CisgICAgaW50IHI7CisKKyAgICBLQV9UUkFDRSggMSwgKCJfX2ttcF91bnJlZ2lzdGVyX3Jvb3Rfb3RoZXJfdGhyZWFkOiBlbnRlciBUIyVkXG4iLCBndGlkICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHMgJiYgX19rbXBfdGhyZWFkc1tndGlkXSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSk7CisgICAgS01QX0FTU0VSVCggcm9vdCA9PSBfX2ttcF90aHJlYWRzW2d0aWRdLT50aC50aF9yb290ICk7CisgICAgS01QX0FTU0VSVCggcm9vdC0+ci5yX2FjdGl2ZSA9PSBGQUxTRSApOworCisgICAgciA9IF9fa21wX3Jlc2V0X3Jvb3QoZ3RpZCwgcm9vdCk7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX3VucmVnaXN0ZXJfcm9vdF9vdGhlcl90aHJlYWQ6IFQjJWQgdW5yZWdpc3RlcmVkXG4iLCBndGlkICkpOworICAgIHJldHVybiByOworfQorI2VuZGlmCisKKyNpZiBLTVBfREVCVUcKK3ZvaWQgX19rbXBfdGFza19pbmZvKCkgeworCisgICAga21wX2ludDMyIGd0aWQgICAgICAgPSBfX2ttcF9lbnRyeV9ndGlkKCk7CisgICAga21wX2ludDMyIHRpZCAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICk7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAqc3RlYW0gICAgPSB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW07CisgICAga21wX3RlYW1fdCAqdGVhbSAgICAgPSB0aGlzX3Roci0+dGgudGhfdGVhbTsKKworICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Rhc2tfaW5mbzogZ3RpZD0lZCB0aWQ9JWQgdF90aHJlYWQ9JXAgdGVhbT0lcCBjdXJ0YXNrPSVwIHB0YXNrPSVwXG4iLAorICAgICAgICBndGlkLCB0aWQsIHRoaXNfdGhyLCB0ZWFtLCB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrLCB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVt0aWRdLnRkX3BhcmVudCApOworfQorI2VuZGlmIC8vIEtNUF9ERUJVRworCisvKiBUT0RPIG9wdGltaXplIHdpdGggb25lIGJpZyBtZW1jbHIsIHRha2Ugb3V0IHdoYXQgaXNuJ3QgbmVlZGVkLAorICogc3BsaXQgcmVzcG9uc2liaWxpdHkgdG8gd29ya2VycyBhcyBtdWNoIGFzIHBvc3NpYmxlLCBhbmQgZGVsYXkKKyAqIGluaXRpYWxpemF0aW9uIG9mIGZlYXR1cmVzIGFzIG11Y2ggYXMgcG9zc2libGUgICovCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IGd0aWQgKQoreworICAgIC8qIHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgaXMgc2V0dXAgaW4ga21wX2FsbG9jYXRlX3RocmVhZC9jcmVhdGVfd29ya2VyCisgICAgICogdGhpc190aHItPnRoLnRoX3NlcmlhbF90ZWFtIGlzIHNldHVwIGluIF9fa21wX2FsbG9jYXRlX3RocmVhZCAqLworICAgIGttcF9pbmZvX3QgKm1hc3RlciA9IHRlYW0tPnQudF90aHJlYWRzWzBdOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfc2VyaWFsX3RlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BhdGNoICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyLT50aC50aF9yb290ICk7CisKKyAgICBLTVBfTUIoKTsKKworICAgIFRDV19TWU5DX1BUUih0aGlzX3Roci0+dGgudGhfdGVhbSwgdGVhbSk7CisKKyAgICB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgID0gdGlkOworICAgIHRoaXNfdGhyLT50aC50aF9zZXRfbnByb2MgICAgICAgPSAwOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGhpc190aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgICA9IHByb2NfYmluZF9kZWZhdWx0OworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgdGhpc190aHItPnRoLnRoX25ld19wbGFjZSAgICAgICA9IHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3BsYWNlOworIyBlbmRpZgorI2VuZGlmCisgICAgdGhpc190aHItPnRoLnRoX3Jvb3QgICAgICAgICAgICA9IG1hc3Rlci0+dGgudGhfcm9vdDsKKworICAgIC8qIHNldHVwIHRoZSB0aHJlYWQncyBjYWNoZSBvZiB0aGUgdGVhbSBzdHJ1Y3R1cmUgKi8KKyAgICB0aGlzX3Roci0+dGgudGhfdGVhbV9ucHJvYyAgICAgID0gdGVhbS0+dC50X25wcm9jOworICAgIHRoaXNfdGhyLT50aC50aF90ZWFtX21hc3RlciAgICAgPSBtYXN0ZXI7CisgICAgdGhpc190aHItPnRoLnRoX3RlYW1fc2VyaWFsaXplZCA9IHRlYW0tPnQudF9zZXJpYWxpemVkOworICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3NsZWVwX2xvYywgTlVMTCk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YSApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX2luZm8xOiBUIyVkOiVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgZ3RpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2sgKSApOworCisgICAgX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCB0aGlzX3Roci0+dGgudGhfdGVhbV9tYXN0ZXItPnRoLnRoX2lkZW50LCB0aGlzX3RociwgdGVhbSwgdGlkLCBUUlVFICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX2luaXRpYWxpemVfaW5mbzI6IFQjJWQ6JWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCBndGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayApICk7CisgICAgLy8gVE9ETzogSW5pdGlhbGl6ZSBJQ1ZzIGZyb20gcGFyZW50OyBHRUggLSBpc24ndCB0aGF0IGFscmVhZHkgZG9uZSBpbiBfX2ttcF9pbml0aWFsaXplX3RlYW0oKT8KKworICAgIC8qIFRPRE8gbm8gd29ya3NoYXJpbmcgaW4gc3BlY3VsYXRpdmUgdGhyZWFkcyAqLworICAgIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCAgICAgID0gJnRlYW0tPnQudF9kaXNwYXRjaFsgdGlkIF07CisKKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSAwOworCisjaWZkZWYgQlVJTERfVFYKKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwudHZfZGF0YSA9IDA7CisjZW5kaWYKKworICAgIGlmICggISB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiApIHsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX3ByaV9jb21tb24gPSAoc3RydWN0IGNvbW1vbl90YWJsZSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKHN0cnVjdCBjb21tb25fdGFibGUpICk7CisgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICBfX2ttcF9wcmludF9zdG9yYWdlX21hcF9ndGlkKAorICAgICAgICAgICAgICAgIGd0aWQsIHRoaXNfdGhyLT50aC50aF9wcmlfY29tbW9uLCB0aGlzX3Roci0+dGgudGhfcHJpX2NvbW1vbiArIDEsCisgICAgICAgICAgICAgICAgc2l6ZW9mKCBzdHJ1Y3QgY29tbW9uX3RhYmxlICksICJ0aF8lZC50aF9wcmlfY29tbW9uXG4iLCBndGlkCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICB0aGlzX3Roci0+dGgudGhfcHJpX2hlYWQgPSBOVUxMOworICAgIH07IC8vIGlmCisKKyAgICAvKiBJbml0aWFsaXplIGR5bmFtaWMgZGlzcGF0Y2ggKi8KKyAgICB7CisgICAgICAgIHZvbGF0aWxlIGttcF9kaXNwX3QgKmRpc3BhdGNoID0gdGhpc190aHItPnRoLnRoX2Rpc3BhdGNoOworICAgICAgICAvKgorICAgICAgICAgKiBVc2UgdGVhbSBtYXhfbnByb2Mgc2luY2UgdGhpcyB3aWxsIG5ldmVyIGNoYW5nZSBmb3IgdGhlIHRlYW0uCisgICAgICAgICAqLworICAgICAgICBzaXplX3QgZGlzcF9zaXplID0gc2l6ZW9mKCBkaXNwYXRjaF9wcml2YXRlX2luZm9fdCApICoKKyAgICAgICAgICAgICggdGVhbS0+dC50X21heF9ucHJvYyA9PSAxID8gMSA6IF9fa21wX2Rpc3BhdGNoX251bV9idWZmZXJzICk7CisgICAgICAgIEtEX1RSQUNFKCAxMCwgKCJfX2ttcF9pbml0aWFsaXplX2luZm86IFQjJWQgbWF4X25wcm9jOiAlZFxuIiwgZ3RpZCwgdGVhbS0+dC50X21heF9ucHJvYyApICk7CisgICAgICAgIEtNUF9BU1NFUlQoIGRpc3BhdGNoICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9kaXNwYXRjaCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aWQgXSApOworCisgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2luZGV4ID0gMDsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICBkaXNwYXRjaC0+dGhfZG9hY3Jvc3NfYnVmX2lkeCA9IDA7CisjZW5kaWYKKyAgICAgICAgaWYoICEgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyICkgIHsKKyAgICAgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlciA9IChkaXNwYXRjaF9wcml2YXRlX2luZm9fdCAqKSBfX2ttcF9hbGxvY2F0ZSggZGlzcF9zaXplICk7CisKKyAgICAgICAgICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRfc3RvcmFnZV9tYXBfZ3RpZCggZ3RpZCwgJmRpc3BhdGNoLT50aF9kaXNwX2J1ZmZlclsgMCBdLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAmZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWyB0ZWFtLT50LnRfbWF4X25wcm9jID09IDEgPyAxIDogX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGlzcF9zaXplLCAidGhfJWQudGhfZGlzcGF0Y2gudGhfZGlzcF9idWZmZXIgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiKHRlYW1fJWQudF9kaXNwYXRjaFslZF0udGhfZGlzcF9idWZmZXIpIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGVhbS0+dC50X2lkLCBndGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBtZW1zZXQoICYgZGlzcGF0Y2gtPnRoX2Rpc3BfYnVmZmVyWzBdLCAnXDAnLCBkaXNwX3NpemUgKTsKKyAgICAgICAgfQorCisgICAgICAgIGRpc3BhdGNoLT50aF9kaXNwYXRjaF9wcl9jdXJyZW50ID0gMDsKKyAgICAgICAgZGlzcGF0Y2gtPnRoX2Rpc3BhdGNoX3NoX2N1cnJlbnQgPSAwOworCisgICAgICAgIGRpc3BhdGNoLT50aF9kZW9fZmNuID0gMDsgICAgICAgICAgICAgLyogT1JERVJFRCAgICAgKi8KKyAgICAgICAgZGlzcGF0Y2gtPnRoX2R4b19mY24gPSAwOyAgICAgICAgICAgICAvKiBFTkQgT1JERVJFRCAqLworICAgIH0KKworICAgIHRoaXNfdGhyLT50aC50aF9uZXh0X3Bvb2wgPSBOVUxMOworCisgICAgaWYgKCF0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrKSB7CisgICAgICAgIHNpemVfdCBpOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrID0gKGttcF91aW50OCAqKSBfX2ttcF9hbGxvY2F0ZSggNCpzaXplb2Yoa21wX3VpbnQ4KSApOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV90b3AgPSAwOworICAgICAgICB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zeiA9IDQ7CisgICAgICAgIGZvciAoaT0wOyBpPHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX3N0YWNrX3N6OyArK2kpIC8vIHplcm8gaW5pdCB0aGUgc3RhY2sKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbaV0gPSAwOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoICF0aGlzX3Roci0+dGgudGhfc3Bpbl9oZXJlICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX25leHRfd2FpdGluZyA9PSAwICk7CisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiBhbGxvY2F0ZSBhIG5ldyB0aHJlYWQgZm9yIHRoZSByZXF1ZXN0aW5nIHRlYW0uICB0aGlzIGlzIG9ubHkgY2FsbGVkIGZyb20gd2l0aGluIGEKKyAqIGZvcmtqb2luIGNyaXRpY2FsIHNlY3Rpb24uICB3ZSB3aWxsIGZpcnN0IHRyeSB0byBnZXQgYW4gYXZhaWxhYmxlIHRocmVhZCBmcm9tIHRoZQorICogdGhyZWFkIHBvb2wuICBpZiBub25lIGlzIGF2YWlsYWJsZSwgd2Ugd2lsbCBmb3JrIGEgbmV3IG9uZSBhc3N1bWluZyB3ZSBhcmUgYWJsZQorICogdG8gY3JlYXRlIGEgbmV3IG9uZS4gIHRoaXMgc2hvdWxkIGJlIGFzc3VyZWQsIGFzIHRoZSBjYWxsZXIgc2hvdWxkIGNoZWNrIG9uIHRoaXMKKyAqIGZpcnN0LgorICovCitrbXBfaW5mb190ICoKK19fa21wX2FsbG9jYXRlX3RocmVhZCgga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSwgaW50IG5ld190aWQgKQoreworICAgIGttcF90ZWFtX3QgICpzZXJpYWxfdGVhbTsKKyAgICBrbXBfaW5mb190ICAqbmV3X3RocjsKKyAgICBpbnQgICAgICAgICAgbmV3X2d0aWQ7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpICkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QgJiYgdGVhbSApOworI2lmICFLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIEtNUF9ERUJVR19BU1NFUlQoIEtNUF9NQVNURVJfR1RJRCggX19rbXBfZ2V0X2d0aWQoKSApKTsKKyNlbmRpZgorICAgIEtNUF9NQigpOworCisgICAgLyogZmlyc3QsIHRyeSB0byBnZXQgb25lIGZyb20gdGhlIHRocmVhZCBwb29sICovCisgICAgaWYgKCBfX2ttcF90aHJlYWRfcG9vbCApIHsKKworICAgICAgICBuZXdfdGhyID0gKGttcF9pbmZvX3QqKV9fa21wX3RocmVhZF9wb29sOworICAgICAgICBfX2ttcF90aHJlYWRfcG9vbCA9ICh2b2xhdGlsZSBrbXBfaW5mb190ICopIG5ld190aHItPnRoLnRoX25leHRfcG9vbDsKKyAgICAgICAgaWYgKCBuZXdfdGhyID09IF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCApIHsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgVENXXzQobmV3X3Roci0+dGgudGhfaW5fcG9vbCwgRkFMU0UpOworICAgICAgICAvLworICAgICAgICAvLyBEb24ndCB0b3VjaCB0aF9hY3RpdmVfaW5fcG9vbCBvciB0aF9hY3RpdmUuCisgICAgICAgIC8vIFRoZSB3b3JrZXIgdGhyZWFkIGFkanVzdHMgdGhvc2UgZmxhZ3MgYXMgaXQgc2xlZXBzL2F3YWtlbnMuCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3RocmVhZF9wb29sX250aC0tOworCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKyAgICAgICAgS01QX0FTU0VSVCggICAgICAgISBuZXdfdGhyLT50aC50aF90ZWFtICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfbnRoID49IDAgKTsKKworICAgICAgICAvKiBzZXR1cCB0aGUgdGhyZWFkIHN0cnVjdHVyZSAqLworICAgICAgICBfX2ttcF9pbml0aWFsaXplX2luZm8oIG5ld190aHIsIHRlYW0sIG5ld190aWQsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBuZXdfdGhyLT50aC50aF9zZXJpYWxfdGVhbSApOworCisgICAgICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoICsgMSk7CisKKyAgICAgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZSA9IDA7CisgICAgICAgIG5ld190aHItPnRoLnRoX3Rhc2tfc3RhdGVfdG9wID0gMDsKKyAgICAgICAgbmV3X3Roci0+dGgudGhfdGFza19zdGF0ZV9zdGFja19zeiA9IDQ7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgICAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gemVybyBpZiBuZWNlc3NhciAgICAgIHkgKi8KKyAgICAgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5vdCBoYXZlIG9jY3VycmVkIHlldCAqLworICAgICAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyNpZiBLTVBfREVCVUcKKyAgICAgICAgLy8gSWYgdGhyZWFkIGVudGVyZWQgcG9vbCB2aWEgX19rbXBfZnJlZV90aHJlYWQsIHdhaXRfZmxhZyBzaG91bGQgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcuCisgICAgICAgIGludCBiOworICAgICAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgICAgICAgIGZvciggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNlbmRpZgorCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IFQjJWQgdXNpbmcgdGhyZWFkICVwIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIG5ld190aHIsIG5ld190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApKTsKKworICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgcmV0dXJuIG5ld190aHI7CisgICAgfQorCisKKyAgICAvKiBubywgd2VsbCBmb3JrIGEgbmV3IG9uZSAqLworICAgIEtNUF9BU1NFUlQoIF9fa21wX250aCAgICA9PSBfX2ttcF9hbGxfbnRoICk7CisgICAgS01QX0FTU0VSVCggX19rbXBfYWxsX250aCA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKTsKKworICAgIC8vCisgICAgLy8gSWYgdGhpcyBpcyB0aGUgZmlyc3Qgd29ya2VyIHRocmVhZCB0aGUgUlRMIGlzIGNyZWF0aW5nLCB0aGVuIGFsc28KKyAgICAvLyBsYXVuY2ggdGhlIG1vbml0b3IgdGhyZWFkLiAgV2UgdHJ5IHRvIGRvIHRoaXMgYXMgZWFybHkgYXMgcG9zc2libGUuCisgICAgLy8KKyAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoICEgVENSXzQoIF9fa21wX2luaXRfbW9uaXRvciApICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJiZWZvcmUgX19rbXBfY3JlYXRlX21vbml0b3JcbiIgKSApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMSApOworICAgICAgICAgICAgX19rbXBfY3JlYXRlX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwLCAoICJhZnRlciBfX2ttcF9jcmVhdGVfbW9uaXRvclxuIiApICk7CisgICAgICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICAvLyBBQzogd2FpdCB1bnRpbCBtb25pdG9yIGhhcyBzdGFydGVkLiBUaGlzIGlzIGEgZml4IGZvciBDUTIzMjgwOC4KKyAgICAgICAgICAgICAgICAvLyAgICAgVGhlIHJlYXNvbiBpcyB0aGF0IGlmIHRoZSBsaWJyYXJ5IGlzIGxvYWRlZC91bmxvYWRlZCBpbiBhIGxvb3Agd2l0aCBzbWFsbCAocGFyYWxsZWwpCisgICAgICAgICAgICAgICAgLy8gICAgIHdvcmsgaW4gYmV0d2VlbiwgdGhlbiB0aGVyZSBpcyBoaWdoIHByb2JhYmlsaXR5IHRoYXQgbW9uaXRvciB0aHJlYWQgc3RhcnRlZCBhZnRlcgorICAgICAgICAgICAgICAgIC8vICAgICB0aGUgbGlicmFyeSBzaHV0ZG93bi4gQXQgc2h1dGRvd24gaXQgaXMgdG9vIGxhdGUgdG8gY29wZSB3aXRoIHRoZSBwcm9ibGVtLCBiZWNhdXNlCisgICAgICAgICAgICAgICAgLy8gICAgIHdoZW4gdGhlIG1hc3RlciBpcyBpbiBEbGxNYWluIChwcm9jZXNzIGRldGFjaCkgdGhlIG1vbml0b3IgaGFzIG5vIGNoYW5jZXMgdG8gc3RhcnQKKyAgICAgICAgICAgICAgICAvLyAgICAgKGl0IGlzIGJsb2NrZWQpLCBhbmQgbWFzdGVyIGhhcyBubyBtZWFucyB0byBpbmZvcm0gdGhlIG1vbml0b3IgdGhhdCB0aGUgbGlicmFyeSBoYXMgZ29uZSwKKyAgICAgICAgICAgICAgICAvLyAgICAgYmVjYXVzZSBhbGwgdGhlIG1lbW9yeSB3aGljaCB0aGUgbW9uaXRvciBjYW4gYWNjZXNzIGlzIGdvaW5nIHRvIGJlIHJlbGVhc2VkL3Jlc2V0LgorICAgICAgICAgICAgICAgIHdoaWxlICggVENSXzQoX19rbXBfaW5pdF9tb25pdG9yKSA8IDIgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ZSUVMRCggVFJVRSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAsICggImFmdGVyIG1vbml0b3IgdGhyZWFkIGhhcyBzdGFydGVkXG4iICkgKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgfQorCisgICAgS01QX01CKCk7CisgICAgZm9yKCBuZXdfZ3RpZD0xIDsgVENSX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSkgIT0gTlVMTDsgKytuZXdfZ3RpZCApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X2d0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ICk7CisgICAgfQorCisgICAgLyogYWxsb2NhdGUgc3BhY2UgZm9yIGl0LiAqLworICAgIG5ld190aHIgPSAoa21wX2luZm9fdCopIF9fa21wX2FsbG9jYXRlKCBzaXplb2Yoa21wX2luZm9fdCkgKTsKKworICAgIFRDV19TWU5DX1BUUihfX2ttcF90aHJlYWRzW25ld19ndGlkXSwgbmV3X3Rocik7CisKKyAgICBpZiAoIF9fa21wX3N0b3JhZ2VfbWFwICkgeworICAgICAgICBfX2ttcF9wcmludF90aHJlYWRfc3RvcmFnZV9tYXAoIG5ld190aHIsIG5ld19ndGlkICk7CisgICAgfQorCisgICAgLyogYWRkIHRoZSByZXNlcnZlIHNlcmlhbGl6ZWQgdGVhbSwgaW5pdGlhbGl6ZWQgZnJvbSB0aGUgdGVhbSdzIG1hc3RlciB0aHJlYWQgKi8KKyAgICB7CisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCByX2ljdnMgPSBfX2ttcF9nZXRfeF9nbG9iYWxfaWN2cyggdGVhbSApOworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBiZWZvcmUgdGhfc2VyaWFsL3NlcmlhbF90ZWFtXG4iICkgKTsKKworICAgIG5ld190aHItPnRoLnRoX3NlcmlhbF90ZWFtID0gc2VyaWFsX3RlYW0gPQorICAgICAgICAoa21wX3RlYW1fdCopIF9fa21wX2FsbG9jYXRlX3RlYW0oIHJvb3QsIDEsIDEsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCwgLy8gcm9vdCBwYXJhbGxlbCBpZAorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcm9jX2JpbmRfZGVmYXVsdCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICZyX2ljdnMsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMCBVU0VfTkVTVEVEX0hPVF9BUkcoTlVMTCkgKTsKKyAgICB9CisgICAgS01QX0FTU0VSVCAoIHNlcmlhbF90ZWFtICk7CisgICAgc2VyaWFsX3RlYW0tPnQudF9zZXJpYWxpemVkID0gMDsgICAvLyBBQzogdGhlIHRlYW0gY3JlYXRlZCBpbiByZXNlcnZlLCBub3QgZm9yIGV4ZWN1dGlvbiAoaXQgaXMgdW51c2VkIGZvciBub3cpLgorICAgIHNlcmlhbF90ZWFtLT50LnRfdGhyZWFkc1swXSA9IG5ld190aHI7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9hbGxvY2F0ZV90aHJlYWQ6IGFmdGVyIHRoX3NlcmlhbC9zZXJpYWxfdGVhbSA6IG5ld190aHI9JXBcbiIsCisgICAgICBuZXdfdGhyICkgKTsKKworICAgIC8qIHNldHVwIHRoZSB0aHJlYWQgc3RydWN0dXJlcyAqLworICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggbmV3X3RociwgdGVhbSwgbmV3X3RpZCwgbmV3X2d0aWQgKTsKKworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9mYXN0X21lbW9yeSggbmV3X3RociApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X3Roci0+dGgudGhfbG9jYWwuYmdldF9kYXRhID09IE5VTEwgKTsKKyAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV9iZ2V0KCBuZXdfdGhyICk7CisgICAgI2VuZGlmCisKKyAgICBfX2ttcF9pbml0X3JhbmRvbSggbmV3X3RociApOyAgLy8gSW5pdGlhbGl6ZSByYW5kb20gbnVtYmVyIGdlbmVyYXRvcgorCisgICAgLyogSW5pdGlhbGl6ZSB0aGVzZSBvbmx5IG9uY2Ugd2hlbiB0aHJlYWQgaXMgZ3JhYmJlZCBmb3IgYSB0ZWFtIGFsbG9jYXRpb24gKi8KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGluaXQgZ28gZm9yaz0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2dldF9ndGlkKCksIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisKKyAgICBpbnQgYjsKKyAgICBrbXBfYmFsaWduX3QgKiBiYWxpZ24gPSBuZXdfdGhyLT50aC50aF9iYXI7CisgICAgZm9yKGI9MDsgYjxic19sYXN0X2JhcnJpZXI7ICsrYikgeworICAgICAgICBiYWxpZ25bYl0uYmIuYl9nbyA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisgICAgICAgIGJhbGlnbltiXS5iYi50ZWFtID0gTlVMTDsKKyAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX05PVF9XQUlUSU5HOworICAgICAgICBiYWxpZ25bYl0uYmIudXNlX29uY29yZV9iYXJyaWVyID0gMDsKKyAgICB9CisKKyAgICBuZXdfdGhyLT50aC50aF9zcGluX2hlcmUgPSBGQUxTRTsKKyAgICBuZXdfdGhyLT50aC50aF9uZXh0X3dhaXRpbmcgPSAwOworCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIG5ld190aHItPnRoLnRoX2N1cnJlbnRfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX25ld19wbGFjZSA9IEtNUF9QTEFDRV9VTkRFRklORUQ7CisgICAgbmV3X3Roci0+dGgudGhfZmlyc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworICAgIG5ld190aHItPnRoLnRoX2xhc3RfcGxhY2UgPSBLTVBfUExBQ0VfVU5ERUZJTkVEOworI2VuZGlmCisKKyAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9pbl9wb29sLCBGQUxTRSk7CisgICAgbmV3X3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICBUQ1dfNChuZXdfdGhyLT50aC50aF9hY3RpdmUsIFRSVUUpOworCisgICAgLyogYWRqdXN0IHRoZSBnbG9iYWwgY291bnRlcnMgKi8KKyAgICBfX2ttcF9hbGxfbnRoICsrOworICAgIF9fa21wX250aCArKzsKKworICAgIC8vCisgICAgLy8gaWYgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSBpcyBzZXQsIHRoZW4gd2UgdXNlIG1ldGhvZCAjMSAoc3Agc2VhcmNoKQorICAgIC8vIGZvciBsb3cgbnVtYmVycyBvZiBwcm9jcywgYW5kIG1ldGhvZCAjMiAoa2V5ZWQgQVBJIGNhbGwpIGZvciBoaWdoZXIKKyAgICAvLyBudW1iZXJzIG9mIHByb2NzLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9hZGp1c3RfZ3RpZF9tb2RlICkgeworICAgICAgICBpZiAoIF9fa21wX2FsbF9udGggPj0gX19rbXBfdGxzX2d0aWRfbWluICkgeworICAgICAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpICE9IDIpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgaWYgKFRDUl80KF9fa21wX2d0aWRfbW9kZSkgIT0gMSApIHsKKyAgICAgICAgICAgICAgICBUQ1dfNChfX2ttcF9ndGlkX21vZGUsIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gemVybyBpZiBuZWNlc3NhcnkgICAgICAgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbm90IGhhdmUgb2NjdXJyZWQgeWV0ICovCisgICAgaWYgKCAhX19rbXBfZW52X2Jsb2NrdGltZSAmJiAoIF9fa21wX2F2YWlsX3Byb2MgPiAwICkgKSB7CisgICAgICAgIGlmICggX19rbXBfbnRoID4gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBUUlVFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICAvKiBhY3R1YWxseSBmb3JrIGl0IGFuZCBjcmVhdGUgdGhlIG5ldyB3b3JrZXIgdGhyZWFkICovCisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYmVmb3JlIF9fa21wX2NyZWF0ZV93b3JrZXI6ICVwXG4iLCBuZXdfdGhyICkpOworICAgIF9fa21wX2NyZWF0ZV93b3JrZXIoIG5ld19ndGlkLCBuZXdfdGhyLCBfX2ttcF9zdGtzaXplICk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoIl9fa21wX2FsbG9jYXRlX3RocmVhZDogYWZ0ZXIgX19rbXBfY3JlYXRlX3dvcmtlcjogJXBcbiIsIG5ld190aHIgKSk7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGhyZWFkOiBUIyVkIGZvcmtlZCBUIyVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCBuZXdfZ3RpZCApKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gbmV3X3RocjsKK30KKworLyoKKyAqIHJlaW5pdGlhbGl6ZSB0ZWFtIGZvciByZXVzZS4KKyAqCisgKiBUaGUgaG90IHRlYW0gY29kZSBjYWxscyB0aGlzIGNhc2UgYXQgZXZlcnkgZm9yayBiYXJyaWVyLCBzbyBFUENDIGJhcnJpZXIKKyAqIHRlc3QgYXJlIGV4dHJlbWVseSBzZW5zaXRpdmUgdG8gY2hhbmdlcyBpbiBpdCwgZXNwLiB3cml0ZXMgdG8gdGhlIHRlYW0KKyAqIHN0cnVjdCwgd2hpY2ggY2F1c2UgYSBjYWNoZSBpbnZhbGlkYXRpb24gaW4gYWxsIHRocmVhZHMuCisgKgorICogSUYgWU9VIFRPVUNIIFRISVMgUk9VVElORSwgUlVOIEVQQ0MgQyBTWU5DQkVOQ0ggT04gQSBCSUctSVJPTiBNQUNISU5FISEhCisgKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9yZWluaXRpYWxpemVfdGVhbSgga21wX3RlYW1fdCAqdGVhbSwga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsIGlkZW50X3QgKmxvYyApIHsKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtOiBlbnRlciB0aGlzX3RocmVhZD0lcCB0ZWFtPSVwXG4iLAorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSAmJiBuZXdfaWN2cyk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAhIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgfHwgbmV3X2ljdnMtPm5wcm9jICk7CisgICAgS01QX0NIRUNLX1VQREFURSh0ZWFtLT50LnRfaWRlbnQsIGxvYyk7CisKKyAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9pZCwgS01QX0dFTl9URUFNX0lEKCkpOworCisgICAgLy8gQ29weSBJQ1ZzIHRvIHRoZSBtYXN0ZXIgdGhyZWFkJ3MgaW1wbGljaXQgdGFza2RhdGEKKyAgICBfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soIGxvYywgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0sIDAsIEZBTFNFICk7CisgICAgY29weV9pY3ZzKCZ0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVswXS50ZF9pY3ZzLCBuZXdfaWN2cyk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtOiBleGl0IHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzWzBdLCB0ZWFtICkgKTsKK30KKworCisvKiBpbml0aWFsaXplIHRoZSB0ZWFtIGRhdGEgc3RydWN0dXJlCisgKiB0aGlzIGFzc3VtZXMgdGhlIHRfdGhyZWFkcyBhbmQgdF9tYXhfbnByb2MgYXJlIGFscmVhZHkgc2V0CisgKiBhbHNvLCB3ZSBkb24ndCB0b3VjaCB0aGUgYXJndW1lbnRzICovCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdGlhbGl6ZV90ZWFtKAorICAgIGttcF90ZWFtX3QgKiB0ZWFtLAorICAgIGludCAgICAgICAgICBuZXdfbnByb2MsCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqIG5ld19pY3ZzLAorICAgIGlkZW50X3QgKiAgICAgICAgICAgICAgICBsb2MKKykgeworICAgIEtGX1RSQUNFKCAxMCwgKCAiX19rbXBfaW5pdGlhbGl6ZV90ZWFtOiBlbnRlcjogdGVhbT0lcFxuIiwgdGVhbSApICk7CisKKyAgICAvKiB2ZXJpZnkgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jIDw9IHRlYW0tPnQudF9tYXhfbnByb2MgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkcyApOworICAgIEtNUF9NQigpOworCisgICAgdGVhbS0+dC50X21hc3Rlcl90aWQgID0gMDsgICAgLyogbm90IG5lZWRlZCAqLworICAgIC8qIHRlYW0tPnQudF9tYXN0ZXJfYmFyOyAgICAgICAgbm90IG5lZWRlZCAqLworICAgIHRlYW0tPnQudF9zZXJpYWxpemVkICA9IG5ld19ucHJvYyA+IDEgPyAwIDogMTsKKyAgICB0ZWFtLT50LnRfbnByb2MgICAgICAgPSBuZXdfbnByb2M7CisKKyAgICAvKiB0ZWFtLT50LnRfcGFyZW50ICAgICA9IE5VTEw7IFRPRE8gbm90IG5lZWRlZCAmIHdvdWxkIG1lc3MgdXAgaG90IHRlYW0gKi8KKyAgICB0ZWFtLT50LnRfbmV4dF9wb29sICAgPSBOVUxMOworICAgIC8qIG1lbXNldCggdGVhbS0+dC50X3RocmVhZHMsIDAsIHNpemVvZihrbXBfaW5mb190KikqbmV3X25wcm9jICk7IHdvdWxkIG1lc3MgdXAgaG90IHRlYW0gKi8KKworICAgIFRDV19TWU5DX1BUUih0ZWFtLT50LnRfcGtmbiwgTlVMTCk7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtLT50LnRfaW52b2tlICAgICAgPSBOVUxMOyAvKiBub3QgbmVlZGVkICovCisKKyAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgICAgICAgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgdGVhbS0+dC50X3NjaGVkICAgICAgID0gbmV3X2ljdnMtPnNjaGVkOworCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIHRlYW0tPnQudF9mcF9jb250cm9sX3NhdmVkID0gRkFMU0U7IC8qIG5vdCBuZWVkZWQgKi8KKyAgICB0ZWFtLT50LnRfeDg3X2ZwdV9jb250cm9sX3dvcmQgPSAwOyAvKiBub3QgbmVlZGVkICovCisgICAgdGVhbS0+dC50X214Y3NyID0gMDsgICAgICAgICAgICAgICAgLyogbm90IG5lZWRlZCAqLworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIHRlYW0tPnQudF9jb25zdHJ1Y3QgICA9IDA7CisgICAgX19rbXBfaW5pdF9sb2NrKCAmIHRlYW0tPnQudF9zaW5nbGVfbG9jayApOworCisgICAgdGVhbS0+dC50X29yZGVyZWQgLmR0LnRfdmFsdWUgPSAwOworICAgIHRlYW0tPnQudF9tYXN0ZXJfYWN0aXZlID0gRkFMU0U7CisKKyAgICBtZW1zZXQoICYgdGVhbS0+dC50X3Rhc2txLCAnXDAnLCBzaXplb2YoIGttcF90YXNrcV90ICkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgdGVhbS0+dC50X2NvcHlwcml2X2RhdGEgPSBOVUxMOyAgLyogbm90IG5lY2Vzc2FyeSwgYnV0IG5pY2UgZm9yIGRlYnVnZ2luZyAqLworI2VuZGlmCisgICAgdGVhbS0+dC50X2NvcHlpbl9jb3VudGVyID0gMDsgICAgLyogZm9yIGJhcnJpZXItZnJlZSBjb3B5aW4gaW1wbGVtZW50YXRpb24gKi8KKworICAgIHRlYW0tPnQudF9jb250cm9sX3N0YWNrX3RvcCA9IE5VTEw7CisKKyAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIGxvYyApOworCisgICAgS01QX01CKCk7CisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbml0aWFsaXplX3RlYW06IGV4aXQ6IHRlYW09JXBcbiIsIHRlYW0gKSApOworfQorCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKy8qIFNldHMgZnVsbCBtYXNrIGZvciB0aHJlYWQgYW5kIHJldHVybnMgb2xkIG1hc2ssIG5vIGNoYW5nZXMgdG8gc3RydWN0dXJlcy4gKi8KK3N0YXRpYyB2b2lkCitfX2ttcF9zZXRfdGhyZWFkX2FmZmluaXR5X21hc2tfZnVsbF90bXAoIGttcF9hZmZpbl9tYXNrX3QgKm9sZF9tYXNrICkKK3sKKyAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIGlmICggb2xkX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHN0YXR1cyA9IF9fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIG9sZF9tYXNrLCBUUlVFICk7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENoYW5nZVRocmVhZEFmZk1hc2tFcnJvciApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggX19rbXBfYWZmaW5fZnVsbE1hc2ssIFRSVUUgKTsKKyAgICB9Cit9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLy8KKy8vIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoKSBpcyB0aGUgaGVhcnQgb2YgdGhlIE9wZW5NUCA0LjAgYWZmaW5pdHkgbWVjaGFuaXNtLgorLy8gSXQgY2FsY3VsYXRzIHRoZSB3b3JrZXIgKyBtYXN0ZXIgdGhyZWFkJ3MgcGFydGl0aW9uIGJhc2VkIHVwb24gdGhlIHBhcmVudAorLy8gdGhyZWFkJ3MgcGFydGl0aW9uLCBhbmQgYmluZHMgZWFjaCB3b3JrZXIgdG8gYSB0aHJlYWQgaW4gdGhlaXIgcGFydGl0aW9uLgorLy8gVGhlIG1hc3RlciB0aHJlYWQncyBwYXJ0aXRpb24gc2hvdWxkIGFscmVhZHkgaW5jbHVkZSBpdHMgY3VycmVudCBiaW5kaW5nLgorLy8KK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCBrbXBfdGVhbV90ICp0ZWFtLCBpbnQgdXBkYXRlX21hc3Rlcl9vbmx5ICkKK3sKKyAgICAvLworICAgIC8vIENvcHkgdGhlIG1hc3RlciB0aHJlYWQncyBwbGFjZSBwYXJ0aW9uIHRvIHRoZSB0ZWFtIHN0cnVjdAorICAgIC8vCisgICAga21wX2luZm9fdCAqbWFzdGVyX3RoID0gdGVhbS0+dC50X3RocmVhZHNbMF07CisgICAgS01QX0RFQlVHX0FTU0VSVCggbWFzdGVyX3RoICE9IE5VTEwgKTsKKyAgICBrbXBfcHJvY19iaW5kX3QgcHJvY19iaW5kID0gdGVhbS0+dC50X3Byb2NfYmluZDsKKyAgICBpbnQgZmlyc3RfcGxhY2UgPSBtYXN0ZXJfdGgtPnRoLnRoX2ZpcnN0X3BsYWNlOworICAgIGludCBsYXN0X3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9sYXN0X3BsYWNlOworICAgIGludCBtYXN0ZXJzX3BsYWNlID0gbWFzdGVyX3RoLT50aC50aF9jdXJyZW50X3BsYWNlOworICAgIHRlYW0tPnQudF9maXJzdF9wbGFjZSA9IGZpcnN0X3BsYWNlOworICAgIHRlYW0tPnQudF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBlbnRlcjogcHJvY19iaW5kID0gJWQgVCMlZCglZDowKSBib3VuZCB0byBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgIHByb2NfYmluZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbMF0gKSwgdGVhbS0+dC50X2lkLAorICAgICAgIG1hc3RlcnNfcGxhY2UsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlICkgKTsKKworICAgIHN3aXRjaCAoIHByb2NfYmluZCApIHsKKworICAgICAgICBjYXNlIHByb2NfYmluZF9kZWZhdWx0OgorICAgICAgICAvLworICAgICAgICAvLyBzZXJpYWwgdGVhbXMgbWlnaHQgaGF2ZSB0aGUgcHJvY19iaW5kIHBvbGljeSBzZXQgdG8KKyAgICAgICAgLy8gcHJvY19iaW5kX2RlZmF1bHQuICBJdCBkb2Vzbid0IG1hdHRlciwgYXMgd2UgZG9uJ3QKKyAgICAgICAgLy8gcmViaW5kIHRoZSBtYXN0ZXIgdGhyZWFkIGZvciBhbnkgcHJvY19iaW5kIHBvbGljeS4KKyAgICAgICAgLy8KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X25wcm9jID09IDEgKTsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfbWFzdGVyOgorICAgICAgICB7CisgICAgICAgICAgICBpbnQgZjsKKyAgICAgICAgICAgIGludCBuX3RoID0gdGVhbS0+dC50X25wcm9jOworICAgICAgICAgICAgZm9yICggZiA9IDE7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2xhc3RfcGxhY2UgPSBsYXN0X3BsYWNlOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBtYXN0ZXI6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCBtYXN0ZXJzX3BsYWNlLCBmaXJzdF9wbGFjZSwgbGFzdF9wbGFjZSApICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgIHsKKyAgICAgICAgICAgIGludCBmOworICAgICAgICAgICAgaW50IG5fdGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgICAgICAgICBpbnQgbl9wbGFjZXM7CisgICAgICAgICAgICBpZiAoIGZpcnN0X3BsYWNlIDw9IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBsYXN0X3BsYWNlIC0gZmlyc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbl9wbGFjZXMgPSBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSBmaXJzdF9wbGFjZSArIGxhc3RfcGxhY2UgKyAxOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBuX3RoIDw9IG5fcGxhY2VzICkgeworICAgICAgICAgICAgICAgIGludCBwbGFjZSA9IG1hc3RlcnNfcGxhY2U7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDE7IGYgPCBuX3RoOyBmKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRoID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoICE9IE5VTEwgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworCisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMDAsICgiX19rbXBfcGFydGl0aW9uX3BsYWNlczogY2xvc2U6IFQjJWQoJWQ6JWQpIHBsYWNlICVkIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgcGxhY2UsIGZpcnN0X3BsYWNlLCBsYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBpbnQgUywgcmVtLCBnYXAsIHNfY291bnQ7CisgICAgICAgICAgICAgICAgUyA9IG5fdGggLyBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICByZW0gPSBuX3RoIC0gKCBTICogbl9wbGFjZXMgKTsKKyAgICAgICAgICAgICAgICBnYXAgPSByZW0gPiAwID8gbl9wbGFjZXMvcmVtIDogbl9wbGFjZXM7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgZ2FwX2N0ID0gZ2FwOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgbl90aDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9sYXN0X3BsYWNlID0gbGFzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX25ld19wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBzX2NvdW50Kys7CisKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAoc19jb3VudCA9PSBTKSAmJiByZW0gJiYgKGdhcF9jdCA9PSBnYXApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90aGluZywgYWRkIGFuIGV4dHJhIHRocmVhZCB0byBwbGFjZSBvbiBuZXh0IGl0ZXJhdGlvbgorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoc19jb3VudCA9PSBTKzEpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3ZSBhZGRlZCBhbiBleHRyYSB0aHJlYWQgdG8gdGhpcyBwbGFjZTsgbW92ZSB0byBuZXh0IHBsYWNlCisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSBmaXJzdF9wbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSsrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBnYXBfY3QgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgcmVtLS07CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoc19jb3VudCA9PSBTKSB7IC8vIHBsYWNlIGZ1bGw7IGRvbid0IGFkZCBleHRyYQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IGNsb3NlOiBUIyVkKCVkOiVkKSBwbGFjZSAlZCBwYXJ0aXRpb24gPSBbJWQsJWRdXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzW2ZdICksCisgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLCBmaXJzdF9wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICBsYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhY2UgPT0gbWFzdGVyc19wbGFjZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgcHJvY19iaW5kX3NwcmVhZDoKKyAgICAgICAgeworICAgICAgICAgICAgaW50IGY7CisgICAgICAgICAgICBpbnQgbl90aCA9IHRlYW0tPnQudF9ucHJvYzsKKyAgICAgICAgICAgIGludCBuX3BsYWNlczsKKyAgICAgICAgICAgIGludCB0aGlkeDsKKyAgICAgICAgICAgIGlmICggZmlyc3RfcGxhY2UgPD0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IGxhc3RfcGxhY2UgLSBmaXJzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBuX3BsYWNlcyA9IF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIGZpcnN0X3BsYWNlICsgbGFzdF9wbGFjZSArIDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG5fdGggPD0gbl9wbGFjZXMgKSB7CisgICAgICAgICAgICAgICAgaW50IHBsYWNlID0gbWFzdGVyc19wbGFjZTsKKyAgICAgICAgICAgICAgICBpbnQgUyA9IG5fcGxhY2VzL25fdGg7CisgICAgICAgICAgICAgICAgaW50IHNfY291bnQsIHJlbSwgZ2FwLCBnYXBfY3Q7CisgICAgICAgICAgICAgICAgcmVtID0gbl9wbGFjZXMgLSBuX3RoKlM7CisgICAgICAgICAgICAgICAgZ2FwID0gcmVtID8gbl90aC9yZW0gOiAxOworICAgICAgICAgICAgICAgIGdhcF9jdCA9IGdhcDsKKyAgICAgICAgICAgICAgICB0aGlkeCA9IG5fdGg7CisgICAgICAgICAgICAgICAgaWYgKHVwZGF0ZV9tYXN0ZXJfb25seSA9PSAxKQorICAgICAgICAgICAgICAgICAgICB0aGlkeCA9IDE7CisgICAgICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0aGlkeDsgZisrICkgeworICAgICAgICAgICAgICAgICAgICBrbXBfaW5mb190ICp0aCA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0aCAhPSBOVUxMICk7CisKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2ZpcnN0X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9uZXdfcGxhY2UgPSBwbGFjZTsKKyAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDE7CisgICAgICAgICAgICAgICAgICAgIHdoaWxlIChzX2NvdW50IDwgUykgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBpZiAocmVtICYmIChnYXBfY3QgPT0gZ2FwKSkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIHJlbS0tOworICAgICAgICAgICAgICAgICAgICAgICAgZ2FwX2N0ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICBnYXBfY3QrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIHBsYWNlID09IGxhc3RfcGxhY2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCBwbGFjZSA9PSAoaW50KShfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgLSAxKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSApLAorICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgZiwgdGgtPnRoLnRoX25ld19wbGFjZSwKKyAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdXBkYXRlX21hc3Rlcl9vbmx5IHx8IHBsYWNlID09IG1hc3RlcnNfcGxhY2UgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIGludCBTLCByZW0sIGdhcCwgc19jb3VudDsKKyAgICAgICAgICAgICAgICBTID0gbl90aCAvIG5fcGxhY2VzOworICAgICAgICAgICAgICAgIHNfY291bnQgPSAwOworICAgICAgICAgICAgICAgIHJlbSA9IG5fdGggLSAoIFMgKiBuX3BsYWNlcyApOworICAgICAgICAgICAgICAgIGdhcCA9IHJlbSA+IDAgPyBuX3BsYWNlcy9yZW0gOiBuX3BsYWNlczsKKyAgICAgICAgICAgICAgICBpbnQgcGxhY2UgPSBtYXN0ZXJzX3BsYWNlOworICAgICAgICAgICAgICAgIGludCBnYXBfY3QgPSBnYXA7CisgICAgICAgICAgICAgICAgdGhpZHggPSBuX3RoOworICAgICAgICAgICAgICAgIGlmICh1cGRhdGVfbWFzdGVyX29ubHkgPT0gMSkKKyAgICAgICAgICAgICAgICAgICAgdGhpZHggPSAxOworICAgICAgICAgICAgICAgIGZvciAoIGYgPSAwOyBmIDwgdGhpZHg7IGYrKyApIHsKKyAgICAgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGggPSB0ZWFtLT50LnRfdGhyZWFkc1tmXTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGggIT0gTlVMTCApOworCisgICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9maXJzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbGFzdF9wbGFjZSA9IHBsYWNlOworICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfbmV3X3BsYWNlID0gcGxhY2U7CisgICAgICAgICAgICAgICAgICAgIHNfY291bnQrKzsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIChzX2NvdW50ID09IFMpICYmIHJlbSAmJiAoZ2FwX2N0ID09IGdhcCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBkbyBub3RoaW5nLCBhZGQgYW4gZXh0cmEgdGhyZWFkIHRvIHBsYWNlIG9uIG5leHQgaXRlcmF0aW9uCisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIChzX2NvdW50ID09IFMrMSkgJiYgcmVtICYmIChnYXBfY3QgPT0gZ2FwKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIGFkZGVkIGFuIGV4dHJhIHRocmVhZCB0byB0aGlzIHBsYWNlOyBtb3ZlIG9uIHRvIG5leHQgcGxhY2UKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggcGxhY2UgPT0gbGFzdF9wbGFjZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBwbGFjZSA9IGZpcnN0X3BsYWNlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIHBsYWNlID09IChpbnQpKF9fa21wX2FmZmluaXR5X251bV9tYXNrcyAtIDEpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlKys7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBzX2NvdW50ID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCA9IDE7CisgICAgICAgICAgICAgICAgICAgICAgICByZW0tLTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmIChzX2NvdW50ID09IFMpIHsgLy8gcGxhY2UgaXMgZnVsbDsgZG9uJ3QgYWRkIGV4dHJhIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBwbGFjZSA9PSBsYXN0X3BsYWNlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBsYWNlID0gZmlyc3RfcGxhY2U7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggcGxhY2UgPT0gKGludCkoX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzIC0gMSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UgPSAwOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGxhY2UrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGdhcF9jdCsrOworICAgICAgICAgICAgICAgICAgICAgICAgc19jb3VudCA9IDA7CisgICAgICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAwLCAoIl9fa21wX3BhcnRpdGlvbl9wbGFjZXM6IHNwcmVhZDogVCMlZCglZDolZCkgcGxhY2UgJWQgcGFydGl0aW9uID0gWyVkLCVkXVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbZl0gKSwKKyAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2lkLCBmLCB0aC0+dGgudGhfbmV3X3BsYWNlLAorICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfZmlyc3RfcGxhY2UsIHRoLT50aC50aF9sYXN0X3BsYWNlKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB1cGRhdGVfbWFzdGVyX29ubHkgfHwgcGxhY2UgPT0gbWFzdGVyc19wbGFjZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9wYXJ0aXRpb25fcGxhY2VzOiBleGl0IFQjJWRcbiIsIHRlYW0tPnQudF9pZCApICk7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKy8qIGFsbG9jYXRlIGEgbmV3IHRlYW0gZGF0YSBzdHJ1Y3R1cmUgdG8gdXNlLiAgdGFrZSBvbmUgb2ZmIG9mIHRoZSBmcmVlIHBvb2wgaWYgYXZhaWxhYmxlICovCitrbXBfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3RlYW0oIGttcF9yb290X3QgKnJvb3QsIGludCBuZXdfbnByb2MsIGludCBtYXhfbnByb2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGFyYWxsZWxfaWQsCisjZW5kaWYKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGttcF9wcm9jX2JpbmRfdCBuZXdfcHJvY19iaW5kLAorI2VuZGlmCisgICAga21wX2ludGVybmFsX2NvbnRyb2xfdCAqbmV3X2ljdnMsCisgICAgaW50IGFyZ2MgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKm1hc3RlcikgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhLTVBfYWxsb2NhdGVfdGVhbSk7CisgICAgaW50IGY7CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBpbnQgdXNlX2hvdF90ZWFtID0gISByb290LT5yLnJfYWN0aXZlOworICAgIGludCBsZXZlbCA9IDA7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogY2FsbGVkXG4iKSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbmV3X25wcm9jID49MSAmJiBhcmdjID49MCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIG1heF9ucHJvYyA+PSBuZXdfbnByb2MgKTsKKyAgICBLTVBfTUIoKTsKKworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAga21wX2hvdF90ZWFtX3B0cl90ICpob3RfdGVhbXM7CisgICAgaWYoIG1hc3RlciApIHsKKyAgICAgICAgdGVhbSA9IG1hc3Rlci0+dGgudGhfdGVhbTsKKyAgICAgICAgbGV2ZWwgPSB0ZWFtLT50LnRfYWN0aXZlX2xldmVsOworICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSAmJiAoICAgICAgICAgICAgIC8vICN0ZWFtcyA+IDEKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfcGtmbiA9PSAobWljcm90YXNrX3QpX19rbXBfdGVhbXNfbWFzdGVyIHx8IC8vIGlubmVyIGZvcmsgb2YgdGhlIHRlYW1zCisgICAgICAgICAgICAgICAgbWFzdGVyLT50aC50aF90ZWFtc19sZXZlbCA8IHRlYW0tPnQudF9sZXZlbCApICkgeyAgICAvLyBvciBuZXN0ZWQgcGFyYWxsZWwgaW5zaWRlIHRoZSB0ZWFtcworICAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIG5vdCBpbmNyZW1lbnQgaWYgI3RlYW1zPT0xLCBvciBmb3Igb3V0ZXIgZm9yayBvZiB0aGUgdGVhbXM7IGluY3JlbWVudCBvdGhlcndpc2UKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBob3RfdGVhbXMgPSBtYXN0ZXItPnRoLnRoX2hvdF90ZWFtczsKKyAgICAgICAgaWYoIGxldmVsIDwgX19rbXBfaG90X3RlYW1zX21heF9sZXZlbCAmJiBob3RfdGVhbXMgJiYgaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbSApCisgICAgICAgIHsgICAvLyBob3QgdGVhbSBoYXMgYWxyZWFkeSBiZWVuIGFsbG9jYXRlZCBmb3IgZ2l2ZW4gbGV2ZWwKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICB1c2VfaG90X3RlYW0gPSAwOworICAgICAgICB9CisgICAgfQorI2VuZGlmCisgICAgLy8gT3B0aW1pemF0aW9uIHRvIHVzZSBhICJob3QiIHRlYW0KKyAgICBpZiggdXNlX2hvdF90ZWFtICYmIG5ld19ucHJvYyA+IDEgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld19ucHJvYyA9PSBtYXhfbnByb2MgKTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICB0ZWFtID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbTsKKyNlbHNlCisgICAgICAgIHRlYW0gPSAgcm9vdC0+ci5yX2hvdF90ZWFtOworI2VuZGlmCisjaWYgS01QX0RFQlVHCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtWzBdID0gJXAgdGFza190ZWFtWzFdID0gJXAgYmVmb3JlIHJlaW5pdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0sIHRlYW0tPnQudF90YXNrX3RlYW1bMV0gKSk7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8vIEhhcyB0aGUgbnVtYmVyIG9mIHRocmVhZHMgY2hhbmdlZD8KKyAgICAgICAgLyogTGV0J3MgYXNzdW1lIHRoZSBtb3N0IGNvbW1vbiBjYXNlIGlzIHRoYXQgdGhlIG51bWJlciBvZiB0aHJlYWRzIGlzIHVuY2hhbmdlZCwgYW5kCisgICAgICAgICAgIHB1dCB0aGF0IGNhc2UgZmlyc3QuICovCisgICAgICAgIGlmICh0ZWFtLT50LnRfbnByb2MgPT0gbmV3X25wcm9jKSB7IC8vIENoZWNrIGNoYW5nZXMgaW4gbnVtYmVyIG9mIHRocmVhZHMKKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiByZXVzaW5nIGhvdCB0ZWFtXG4iICkpOworICAgICAgICAgICAgLy8gVGhpcyBjYXNlIGNhbiBtZWFuIHRoYXQgb21wX3NldF9udW1fdGhyZWFkcygpIHdhcyBjYWxsZWQgYW5kIHRoZSBob3QgdGVhbSBzaXplCisgICAgICAgICAgICAvLyB3YXMgYWxyZWFkeSByZWR1Y2VkLCBzbyB3ZSBjaGVjayB0aGUgc3BlY2lhbCBmbGFnCisgICAgICAgICAgICBpZiAoIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPT0gLTEgKSB7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X3NpemVfY2hhbmdlZCwgMCk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIFRPRE8/Pz86IHRlYW0tPnQudF9tYXhfYWN0aXZlX2xldmVscyA9IG5ld19tYXhfYWN0aXZlX2xldmVsczsKKyAgICAgICAgICAgIGttcF9yX3NjaGVkX3QgbmV3X3NjaGVkID0gbmV3X2ljdnMtPnNjaGVkOworICAgICAgICAgICAgaWYgKHRlYW0tPnQudF9zY2hlZC5yX3NjaGVkX3R5cGUgIT0gbmV3X3NjaGVkLnJfc2NoZWRfdHlwZSB8fAorICAgICAgICAgICAgICAgIHRlYW0tPnQudF9zY2hlZC5jaHVuayAhPSBuZXdfc2NoZWQuY2h1bmspCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NjaGVkID0gbmV3X3NjaGVkOyAvLyBzZXQgbWFzdGVyJ3Mgc2NoZWR1bGUgYXMgbmV3IHJ1bi10aW1lIHNjaGVkdWxlCisKKyAgICAgICAgICAgIF9fa21wX3JlaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfaWN2cywgcm9vdC0+ci5yX3ViZXJfdGhyZWFkLT50aC50aF9pZGVudCApOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTI6IFQjJWQsIHRoaXNfdGhyZWFkPSVwIHRlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAwLCB0ZWFtLT50LnRfdGhyZWFkc1swXSwgdGVhbSApICk7CisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIGlmICggKCB0ZWFtLT50LnRfc2l6ZV9jaGFuZ2VkID09IDAgKQorICAgICAgICAgICAgICAmJiAoIHRlYW0tPnQudF9wcm9jX2JpbmQgPT0gbmV3X3Byb2NfYmluZCApICkgeworICAgICAgICAgICAgICAgIGlmIChuZXdfcHJvY19iaW5kID09IHByb2NfYmluZF9zcHJlYWQpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyh0ZWFtLCAxKTsgLy8gYWRkIGZsYWcgdG8gdXBkYXRlIG9ubHkgbWFzdGVyIGZvciBzcHJlYWQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDIwMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiByZXVzaW5nIGhvdCB0ZWFtICMlZCBiaW5kaW5nczogcHJvY19iaW5kID0gJWQsIHBhcnRpdGlvbiA9IFslZCwlZF1cbiIsCisgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIG5ld19wcm9jX2JpbmQsIHRlYW0tPnQudF9maXJzdF9wbGFjZSwKKyAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9sYXN0X3BsYWNlICkgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X3Byb2NfYmluZCwgbmV3X3Byb2NfYmluZCk7CisgICAgICAgICAgICAgICAgX19rbXBfcGFydGl0aW9uX3BsYWNlcyggdGVhbSApOworICAgICAgICAgICAgfQorIyBlbHNlCisgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9wcm9jX2JpbmQsIG5ld19wcm9jX2JpbmQpOworIyBlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmKCB0ZWFtLT50LnRfbnByb2MgPiBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogZGVjcmVhc2luZyBob3QgdGVhbSB0aHJlYWQgY291bnQgdG8gJWRcbiIsIG5ld19ucHJvYyApKTsKKworICAgICAgICAgICAgdGVhbS0+dC50X3NpemVfY2hhbmdlZCA9IDE7CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGlmKCBfX2ttcF9ob3RfdGVhbXNfbW9kZSA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vIEFDOiBzYXZlZCBudW1iZXIgb2YgdGhyZWFkcyBzaG91bGQgY29ycmVzcG9uZCB0byB0ZWFtJ3MgdmFsdWUgaW4gdGhpcyBtb2RlLAorICAgICAgICAgICAgICAgIC8vIGNhbiBiZSBiaWdnZXIgaW4gbW9kZSAxLCB3aGVuIGhvdCB0ZWFtIGhhcyBzb21lIHRocmVhZHMgaW4gcmVzZXJ2ZQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGggPT0gdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgICAgICAgICBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA9IG5ld19ucHJvYzsKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgICAgIC8qIHJlbGVhc2UgdGhlIGV4dHJhIHRocmVhZHMgd2UgZG9uJ3QgbmVlZCBhbnkgbW9yZSAqLworICAgICAgICAgICAgICAgIGZvciggZiA9IG5ld19ucHJvYyAgOyAgZiA8IHRlYW0tPnQudF9ucHJvYyAgOyAgZisrICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdoZW4gZGVjcmVhc2luZyB0ZWFtIHNpemUsIHRocmVhZHMgbm8gbG9uZ2VyIGluIHRoZSB0ZWFtIHNob3VsZCB1bnJlZiB0YXNrIHRlYW0uCisgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gKF9fa21wX2hvdF90ZWFtc19tb2RlID09IDApCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIHRlYW0tPnQudF9ucHJvYyA9ICBuZXdfbnByb2M7CisgICAgICAgICAgICAvLyBUT0RPPz8/OiB0ZWFtLT50LnRfbWF4X2FjdGl2ZV9sZXZlbHMgPSBuZXdfbWF4X2FjdGl2ZV9sZXZlbHM7CisgICAgICAgICAgICBpZiAodGVhbS0+dC50X3NjaGVkLnJfc2NoZWRfdHlwZSAhPSBuZXdfaWN2cy0+c2NoZWQucl9zY2hlZF90eXBlIHx8CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3NjaGVkLmNodW5rICE9IG5ld19pY3ZzLT5zY2hlZC5jaHVuaykKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfc2NoZWQgPSBuZXdfaWN2cy0+c2NoZWQ7CisgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIHJvb3QtPnIucl91YmVyX3RocmVhZC0+dGgudGhfaWRlbnQgKTsKKworICAgICAgICAgICAgLyogdXBkYXRlIHRoZSByZW1haW5pbmcgdGhyZWFkcyAqLworICAgICAgICAgICAgZm9yKGYgPSAwOyBmIDwgbmV3X25wcm9jOyArK2YpIHsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vIHJlc3RvcmUgdGhlIGN1cnJlbnQgdGFzayBzdGF0ZSBvZiB0aGUgbWFzdGVyIHRocmVhZDogc2hvdWxkIGJlIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgICAgICAgICBLRl9UUkFDRSggMTAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogVCMlZCwgdGhpc190aHJlYWQ9JXAgdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgMCwgdGVhbS0+dC50X3RocmVhZHNbMF0sIHRlYW0gKSApOworCisgICAgICAgICAgICBfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoIHRlYW0tPnQudF90aHJlYWRzWyAwIF0sIHRlYW0sIDAgKTsKKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7IGYrKyApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIEtNUF9DSEVDS19VUERBVEUodGVhbS0+dC50X3Byb2NfYmluZCwgbmV3X3Byb2NfYmluZCk7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgICAgIF9fa21wX3BhcnRpdGlvbl9wbGFjZXMoIHRlYW0gKTsKKyMgZW5kaWYKKyNlbmRpZgorICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyB0ZWFtLT50LnRfbnByb2MgPCBuZXdfbnByb2MKKyNpZiBLTVBfT1NfTElOVVggJiYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAga21wX2FmZmluX21hc2tfdCAqb2xkX21hc2s7CisgICAgICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgS01QX0NQVV9BTExPQyhvbGRfbWFzayk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IGluY3JlYXNpbmcgaG90IHRlYW0gdGhyZWFkIGNvdW50IHRvICVkXG4iLCBuZXdfbnByb2MgKSk7CisKKyAgICAgICAgICAgIHRlYW0tPnQudF9zaXplX2NoYW5nZWQgPSAxOworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIGludCBhdmFpbF90aHJlYWRzID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7CisgICAgICAgICAgICBpZiggbmV3X25wcm9jIDwgYXZhaWxfdGhyZWFkcyApCisgICAgICAgICAgICAgICAgYXZhaWxfdGhyZWFkcyA9IG5ld19ucHJvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKipvdGhlcl90aHJlYWRzID0gdGVhbS0+dC50X3RocmVhZHM7CisgICAgICAgICAgICBmb3IgKCBmID0gdGVhbS0+dC50X25wcm9jOyBmIDwgYXZhaWxfdGhyZWFkczsgKytmICkgeworICAgICAgICAgICAgICAgIC8vIEFkanVzdCBiYXJyaWVyIGRhdGEgb2YgcmVzZXJ2ZWQgdGhyZWFkcyAoaWYgYW55KSBvZiB0aGUgdGVhbQorICAgICAgICAgICAgICAgIC8vIE90aGVyIGRhdGEgd2lsbCBiZSBzZXQgaW4gX19rbXBfaW5pdGlhbGl6ZV9pbmZvKCkgYmVsb3cuCisgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAga21wX2JhbGlnbl90ICogYmFsaWduID0gb3RoZXJfdGhyZWFkc1tmXS0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiICkgeworICAgICAgICAgICAgICAgICAgICBiYWxpZ25bYl0uYmIuYl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX2Fycml2ZWQ7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoYmFsaWduW2JdLmJiLndhaXRfZmxhZyAhPSBLTVBfQkFSUklFUl9QQVJFTlRfRkxBRyk7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICAgICAgICAgIGJhbGlnbltiXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhcltiXS5iX3RlYW1fYXJyaXZlZDsKKyNlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCBob3RfdGVhbXNbbGV2ZWxdLmhvdF90ZWFtX250aCA+PSBuZXdfbnByb2MgKSB7CisgICAgICAgICAgICAgICAgLy8gd2UgaGF2ZSBhbGwgbmVlZGVkIHRocmVhZHMgaW4gcmVzZXJ2ZSwgbm8gbmVlZCB0byBhbGxvY2F0ZSBhbnkKKyAgICAgICAgICAgICAgICAvLyB0aGlzIG9ubHkgcG9zc2libGUgaW4gbW9kZSAxLCBjYW5ub3QgaGF2ZSByZXNlcnZlZCB0aHJlYWRzIGluIG1vZGUgMAorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoX19rbXBfaG90X3RlYW1zX21vZGUgPT0gMSk7CisgICAgICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gbmV3X25wcm9jOyAgICAgICAgICAgICAgICAgICAgIC8vIGp1c3QgZ2V0IHJlc2VydmVkIHRocmVhZHMgaW52b2x2ZWQKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gd2UgbWF5IGhhdmUgc29tZSB0aHJlYWRzIGluIHJlc2VydmUsIGJ1dCBub3QgZW5vdWdoCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X25wcm9jID0gaG90X3RlYW1zW2xldmVsXS5ob3RfdGVhbV9udGg7IC8vIGdldCByZXNlcnZlZCB0aHJlYWRzIGludm9sdmVkIGlmIGFueQorICAgICAgICAgICAgICAgIGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW1fbnRoID0gbmV3X25wcm9jOyAgICAgICAvLyBhZGp1c3QgaG90IHRlYW0gbWF4IHNpemUKKyNlbmRpZiAvLyBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgICAgICAgICAgaWYodGVhbS0+dC50X21heF9ucHJvYyA8IG5ld19ucHJvYykgeworICAgICAgICAgICAgICAgIC8qIHJlYWxsb2NhdGUgbGFyZ2VyIGFycmF5cyAqLworICAgICAgICAgICAgICAgIF9fa21wX3JlYWxsb2NhdGVfdGVhbV9hcnJheXModGVhbSwgbmV3X25wcm9jKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWluaXRpYWxpemVfdGVhbSggdGVhbSwgbmV3X2ljdnMsIE5VTEwgKTsKKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICAvKiBUZW1wb3JhcmlseSBzZXQgZnVsbCBtYXNrIGZvciBtYXN0ZXIgdGhyZWFkIGJlZm9yZQorICAgICAgICAgICAgICAgY3JlYXRpb24gb2Ygd29ya2Vycy4gVGhlIHJlYXNvbiBpcyB0aGF0IHdvcmtlcnMgaW5oZXJpdAorICAgICAgICAgICAgICAgdGhlIGFmZmluaXR5IGZyb20gbWFzdGVyLCBzbyBpZiBhIGxvdCBvZiB3b3JrZXJzIGFyZQorICAgICAgICAgICAgICAgY3JlYXRlZCBvbiB0aGUgc2luZ2xlIGNvcmUgcXVpY2tseSwgdGhleSBkb24ndCBnZXQKKyAgICAgICAgICAgICAgIGEgY2hhbmNlIHRvIHNldCB0aGVpciBvd24gYWZmaW5pdHkgZm9yIGEgbG9uZyB0aW1lLgorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIF9fa21wX3NldF90aHJlYWRfYWZmaW5pdHlfbWFza19mdWxsX3RtcCggb2xkX21hc2sgKTsKKyNlbmRpZgorCisgICAgICAgICAgICAvKiBhbGxvY2F0ZSBuZXcgdGhyZWFkcyBmb3IgdGhlIGhvdCB0ZWFtICovCisgICAgICAgICAgICBmb3IoIGYgPSB0ZWFtLT50LnRfbnByb2MgIDsgIGYgPCBuZXdfbnByb2MgIDsgIGYrKyApIHsKKyAgICAgICAgICAgICAgICBrbXBfaW5mb190ICogbmV3X3dvcmtlciA9IF9fa21wX2FsbG9jYXRlX3RocmVhZCggcm9vdCwgdGVhbSwgZiApOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG5ld193b3JrZXIgKTsKKyAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdID0gbmV3X3dvcmtlcjsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgVCMlZCBhcnJpdmVkOiBqb2luPSVsbHUsIHBsYWluPSVsbHVcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApLCB0ZWFtLT50LnRfaWQsIGYsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbYnNfZm9ya2pvaW5fYmFycmllcl0uYl9hcnJpdmVkLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyW2JzX3BsYWluX2JhcnJpZXJdLmJfYXJyaXZlZCApICk7CisKKyAgICAgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhIGZvciBuZXcgdGhyZWFkcy4KKyAgICAgICAgICAgICAgICAgICAgaW50IGI7CisgICAgICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IG5ld193b3JrZXItPnRoLnRoX2JhcjsKKyAgICAgICAgICAgICAgICAgICAgZm9yKCBiID0gMDsgYiA8IGJzX2xhc3RfYmFycmllcjsgKysgYiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChiYWxpZ25bYl0uYmIud2FpdF9mbGFnICE9IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfd29ya2VyX2Fycml2ZWQgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQ7CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBpZiAoIEtNUF9BRkZJTklUWV9DQVBBQkxFKCkgKSB7CisgICAgICAgICAgICAgICAgLyogUmVzdG9yZSBpbml0aWFsIG1hc3RlciB0aHJlYWQncyBhZmZpbml0eSBtYXNrICovCisgICAgICAgICAgICAgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eSggb2xkX21hc2ssIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfQ1BVX0ZSRUUob2xkX21hc2spOworICAgICAgICAgICAgfQorI2VuZGlmCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIH0gLy8gZW5kIG9mIGNoZWNrIG9mIHRfbnByb2MgdnMuIG5ld19ucHJvYyB2cy4gaG90X3RlYW1fbnRoCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKyAgICAgICAgICAgIC8qIG1ha2Ugc3VyZSBldmVyeW9uZSBpcyBzeW5jcm9uaXplZCAqLworICAgICAgICAgICAgaW50IG9sZF9ucHJvYyA9IHRlYW0tPnQudF9ucHJvYzsgLy8gc2F2ZSBvbGQgdmFsdWUgYW5kIHVzZSB0byB1cGRhdGUgb25seSBuZXcgdGhyZWFkcyBiZWxvdworICAgICAgICAgICAgX19rbXBfaW5pdGlhbGl6ZV90ZWFtKCB0ZWFtLCBuZXdfbnByb2MsIG5ld19pY3ZzLCByb290LT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX2lkZW50ICk7CisKKyAgICAgICAgICAgIC8qIHJlaW5pdGlhbGl6ZSB0aGUgdGhyZWFkcyAqLworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0ZWFtLT50LnRfbnByb2MgPT0gbmV3X25wcm9jKTsKKyAgICAgICAgICAgIGZvciAoZj0wOyAgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgIF9fa21wX2luaXRpYWxpemVfaW5mbyggdGVhbS0+dC50X3RocmVhZHNbIGYgXSwgdGVhbSwgZiwgX19rbXBfZ3RpZF9mcm9tX3RpZCggZiwgdGVhbSApICk7CisgICAgICAgICAgICBpZiAobGV2ZWwpIHsgLy8gc2V0IHRoX3Rhc2tfc3RhdGUgZm9yIG5ldyB0aHJlYWRzIGluIG5lc3RlZCBob3QgdGVhbQorICAgICAgICAgICAgICAgIC8vIF9fa21wX2luaXRpYWxpemVfaW5mbygpIG5vIGxvbmdlciB6ZXJvZXMgdGhfdGFza19zdGF0ZSwgc28gd2Ugc2hvdWxkIG9ubHkgbmVlZCB0byBzZXQgdGhlCisgICAgICAgICAgICAgICAgLy8gdGhfdGFza19zdGF0ZSBmb3IgdGhlIG5ldyB0aHJlYWRzLiB0aF90YXNrX3N0YXRlIGZvciBtYXN0ZXIgdGhyZWFkIHdpbGwgbm90IGJlIGFjY3VyYXRlIHVudGlsCisgICAgICAgICAgICAgICAgLy8gYWZ0ZXIgdGhpcyBpbiBfX2ttcF9mb3JrX2NhbGwoKSwgc28gd2UgbG9vayB0byB0aGUgbWFzdGVyJ3MgbWVtb19zdGFjayB0byBnZXQgdGhlIGNvcnJlY3QgdmFsdWUuCisgICAgICAgICAgICAgICAgZm9yIChmPW9sZF9ucHJvYzsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9IHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2tbbGV2ZWxdOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7IC8vIHNldCB0aF90YXNrX3N0YXRlIGZvciBuZXcgdGhyZWFkcyBpbiBub24tbmVzdGVkIGhvdCB0ZWFtCisgICAgICAgICAgICAgICAgaW50IG9sZF9zdGF0ZSA9IHRlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF90YXNrX3N0YXRlOyAvLyBjb3B5IG1hc3RlcidzIHN0YXRlCisgICAgICAgICAgICAgICAgZm9yIChmPW9sZF9ucHJvYzsgZiA8IHRlYW0tPnQudF9ucHJvYzsgKytmKQorICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGFza19zdGF0ZSA9IG9sZF9zdGF0ZTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggZiA9IDA7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHNbZl0gJiYKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbZl0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisgICAgICAgICAgICB9CisjZW5kaWYKKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9wcm9jX2JpbmQsIG5ld19wcm9jX2JpbmQpOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgICAgICBfX2ttcF9wYXJ0aXRpb25fcGxhY2VzKCB0ZWFtICk7CisjIGVuZGlmCisjZW5kaWYKKyAgICAgICAgfSAvLyBDaGVjayBjaGFuZ2VzIGluIG51bWJlciBvZiB0aHJlYWRzCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBrbXBfaW5mb190ICptYXN0ZXIgPSB0ZWFtLT50LnRfdGhyZWFkc1swXTsKKyAgICAgICAgaWYoIG1hc3Rlci0+dGgudGhfdGVhbXNfbWljcm90YXNrICkgeworICAgICAgICAgICAgZm9yKCBmID0gMTsgZiA8IG5ld19ucHJvYzsgKytmICkgeworICAgICAgICAgICAgICAgIC8vIHByb3BhZ2F0ZSB0ZWFtcyBjb25zdHJ1Y3Qgc3BlY2lmaWMgaW5mbyB0byB3b3JrZXJzCisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqdGhyID0gdGVhbS0+dC50X3RocmVhZHNbZl07CisgICAgICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX21pY3JvdGFzazsKKyAgICAgICAgICAgICAgICB0aHItPnRoLnRoX3RlYW1zX2xldmVsICAgICA9IG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWw7CisgICAgICAgICAgICAgICAgdGhyLT50aC50aF90ZWFtc19zaXplICAgICAgPSBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgIGlmKCBsZXZlbCApIHsKKyAgICAgICAgICAgIC8vIFN5bmMgYmFycmllciBzdGF0ZSBmb3IgbmVzdGVkIGhvdCB0ZWFtcywgbm90IG5lZWRlZCBmb3Igb3V0ZXJtb3N0IGhvdCB0ZWFtLgorICAgICAgICAgICAgZm9yKCBmID0gMTsgZiA8IG5ld19ucHJvYzsgKytmICkgeworICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKnRociA9IHRlYW0tPnQudF90aHJlYWRzW2ZdOworICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGttcF9iYWxpZ25fdCAqIGJhbGlnbiA9IHRoci0+dGgudGhfYmFyOworICAgICAgICAgICAgICAgIGZvciggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICAgICAgICAgIGJhbGlnblsgYiBdLmJiLmJfYXJyaXZlZCAgICAgICAgPSB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGJhbGlnbltiXS5iYi53YWl0X2ZsYWcgIT0gS01QX0JBUlJJRVJfUEFSRU5UX0ZMQUcpOworI2lmIFVTRV9ERUJVR0dFUgorICAgICAgICAgICAgICAgICAgICBiYWxpZ25bIGIgXS5iYi5iX3dvcmtlcl9hcnJpdmVkID0gdGVhbS0+dC50X2JhclsgYiBdLmJfdGVhbV9hcnJpdmVkOworI2VuZGlmCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworICAgICAgICAvKiByZWFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgaWYgbmVjZXNzYXJ5ICovCisgICAgICAgIF9fa21wX2FsbG9jX2FyZ3ZfZW50cmllcyggYXJnYywgdGVhbSwgVFJVRSApOworICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9hcmdjLCBhcmdjKTsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlIGhvdCB0ZWFtIHJlLXVzZXMgdGhlIHByZXZpb3VzIHRhc2sgdGVhbSwKKyAgICAgICAgLy8gaWYgdW50b3VjaGVkIGR1cmluZyB0aGUgcHJldmlvdXMgcmVsZWFzZS0+Z2F0aGVyIHBoYXNlLgorICAgICAgICAvLworCisgICAgICAgIEtGX1RSQUNFKCAxMCwgKCAiIGhvdF90ZWFtID0gJXBcbiIsIHRlYW0gKSApOworCisjaWYgS01QX0RFQlVHCisgICAgICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfYWxsb2NhdGVfdGVhbTogaG90IHRlYW0gdGFza190ZWFtWzBdID0gJXAgdGFza190ZWFtWzFdID0gJXAgYWZ0ZXIgcmVpbml0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSwgdGVhbS0+dC50X3Rhc2tfdGVhbVsxXSApKTsKKyAgICAgICAgfQorI2VuZGlmCisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgX19vbXB0X3RlYW1fYXNzaWduX2lkKHRlYW0sIG9tcHRfcGFyYWxsZWxfaWQpOworI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgcmV0dXJuIHRlYW07CisgICAgfQorCisgICAgLyogbmV4dCwgbGV0J3MgdHJ5IHRvIHRha2Ugb25lIGZyb20gdGhlIHRlYW0gcG9vbCAqLworICAgIEtNUF9NQigpOworICAgIGZvciggdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfdGVhbV9wb29sIDsgKHRlYW0pIDsgKQorICAgIHsKKyAgICAgICAgLyogVE9ETzogY29uc2lkZXIgcmVzaXppbmcgdW5kZXJzaXplZCB0ZWFtcyBpbnN0ZWFkIG9mIHJlYXBpbmcgdGhlbSwgbm93IHRoYXQgd2UgaGF2ZSBhIHJlc2l6aW5nIG1lY2hhbmlzbSAqLworICAgICAgICBpZiAoIHRlYW0tPnQudF9tYXhfbnByb2MgPj0gbWF4X25wcm9jICkgeworICAgICAgICAgICAgLyogdGFrZSB0aGlzIHRlYW0gZnJvbSB0aGUgdGVhbSBwb29sICovCisgICAgICAgICAgICBfX2ttcF90ZWFtX3Bvb2wgPSB0ZWFtLT50LnRfbmV4dF9wb29sOworCisgICAgICAgICAgICAvKiBzZXR1cCB0aGUgdGVhbSBmb3IgZnJlc2ggdXNlICovCisgICAgICAgICAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwgKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBzZXR0aW5nIHRhc2tfdGVhbVswXSAlcCBhbmQgdGFza190ZWFtWzFdICVwIHRvIE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRlYW0tPnQudF90YXNrX3RlYW1bMF0sICZ0ZWFtLT50LnRfdGFza190ZWFtWzFdKSApOworICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVswXSA9IE5VTEw7CisgICAgICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtWzFdID0gTlVMTDsKKworICAgICAgICAgICAgLyogcmVhbGxvY2F0ZSBzcGFjZSBmb3IgYXJndW1lbnRzIGlmIG5lY2Vzc2FyeSAqLworICAgICAgICAgICAgX19rbXBfYWxsb2NfYXJndl9lbnRyaWVzKCBhcmdjLCB0ZWFtLCBUUlVFICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfVVBEQVRFKHRlYW0tPnQudF9hcmdjLCBhcmdjKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHRlYW0gJWQgaW5pdCBhcnJpdmVkOiBqb2luPSV1LCBwbGFpbj0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfaWQsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUsIEtNUF9JTklUX0JBUlJJRVJfU1RBVEUgKSk7CisgICAgICAgICAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICAgICAgICAgIGludCBiOworICAgICAgICAgICAgICAgIGZvciAoIGIgPSAwOyBiIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBiKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9iYXJbIGIgXS5iX2Fycml2ZWQgICAgICAgID0gS01QX0lOSVRfQkFSUklFUl9TVEFURTsKKyNpZiBVU0VfREVCVUdHRVIKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2JhclsgYiBdLmJfbWFzdGVyX2Fycml2ZWQgPSAwOworICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQgICA9IDA7CisjZW5kaWYKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjZW5kaWYKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX2FsbG9jYXRlX3RlYW06IHVzaW5nIHRlYW0gZnJvbSBwb29sICVkLlxuIiwgdGVhbS0+dC50X2lkICkpOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBfX29tcHRfdGVhbV9hc3NpZ25faWQodGVhbSwgb21wdF9wYXJhbGxlbF9pZCk7CisjZW5kaWYKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIHJldHVybiB0ZWFtOworICAgICAgICB9CisKKyAgICAgICAgLyogcmVhcCB0ZWFtIGlmIGl0IGlzIHRvbyBzbWFsbCwgdGhlbiBsb29wIGJhY2sgYW5kIGNoZWNrIHRoZSBuZXh0IG9uZSAqLworICAgICAgICAvKiBub3Qgc3VyZSBpZiB0aGlzIGlzIHdpc2UsIGJ1dCwgd2lsbCBiZSByZWRvbmUgZHVyaW5nIHRoZSBob3QtdGVhbXMgcmV3cml0ZS4gKi8KKyAgICAgICAgLyogVE9ETzogVXNlIHRlY2huaXF1ZSB0byBmaW5kIHRoZSByaWdodCBzaXplIGhvdC10ZWFtLCBkb24ndCByZWFwIHRoZW0gKi8KKyAgICAgICAgdGVhbSA9ICBfX2ttcF9yZWFwX3RlYW0oIHRlYW0gKTsKKyAgICAgICAgX19rbXBfdGVhbV9wb29sID0gdGVhbTsKKyAgICB9CisKKyAgICAvKiBub3RoaW5nIGF2YWlsYWJsZSBpbiB0aGUgcG9vbCwgbm8gbWF0dGVyLCBtYWtlIGEgbmV3IHRlYW0hICovCisgICAgS01QX01CKCk7CisgICAgdGVhbSA9IChrbXBfdGVhbV90KikgX19rbXBfYWxsb2NhdGUoIHNpemVvZigga21wX3RlYW1fdCApICk7CisKKyAgICAvKiBhbmQgc2V0IGl0IHVwICovCisgICAgdGVhbS0+dC50X21heF9ucHJvYyAgID0gbWF4X25wcm9jOworICAgIC8qIE5PVEUgd2VsbCwgZm9yIHNvbWUgcmVhc29uIGFsbG9jYXRpbmcgb25lIGJpZyBidWZmZXIgYW5kIGRpdmlkaW5nIGl0CisgICAgICogdXAgc2VlbXMgdG8gcmVhbGx5IGh1cnQgcGVyZm9ybWFuY2UgYSBsb3Qgb24gdGhlIFA0LCBzbywgbGV0J3Mgbm90IHVzZQorICAgICAqIHRoaXMuLi4gKi8KKyAgICBfX2ttcF9hbGxvY2F0ZV90ZWFtX2FycmF5cyggdGVhbSwgbWF4X25wcm9jICk7CisKKyAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2FsbG9jYXRlX3RlYW06IG1ha2luZyBhIG5ldyB0ZWFtXG4iICkgKTsKKyAgICBfX2ttcF9pbml0aWFsaXplX3RlYW0oIHRlYW0sIG5ld19ucHJvYywgbmV3X2ljdnMsIE5VTEwgKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfYWxsb2NhdGVfdGVhbTogc2V0dGluZyB0YXNrX3RlYW1bMF0gJXAgYW5kIHRhc2tfdGVhbVsxXSAlcCB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAmdGVhbS0+dC50X3Rhc2tfdGVhbVswXSwgJnRlYW0tPnQudF90YXNrX3RlYW1bMV0gKSApOworICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMF0gPSBOVUxMOyAgICAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorICAgIHRlYW0tPnQudF90YXNrX3RlYW1bMV0gPSBOVUxMOyAgICAvLyB0byBiZSByZW1vdmVkLCBhcyBfX2ttcF9hbGxvY2F0ZSB6ZXJvZXMgbWVtb3J5LCBubyBuZWVkIHRvIGR1cGxpY2F0ZQorCisgICAgaWYgKCBfX2ttcF9zdG9yYWdlX21hcCApIHsKKyAgICAgICAgX19rbXBfcHJpbnRfdGVhbV9zdG9yYWdlX21hcCggInRlYW0iLCB0ZWFtLCB0ZWFtLT50LnRfaWQsIG5ld19ucHJvYyApOworICAgIH0KKworICAgIC8qIGFsbG9jYXRlIHNwYWNlIGZvciBhcmd1bWVudHMgKi8KKyAgICBfX2ttcF9hbGxvY19hcmd2X2VudHJpZXMoIGFyZ2MsIHRlYW0sIEZBTFNFICk7CisgICAgdGVhbS0+dC50X2FyZ2MgICAgICAgID0gYXJnYzsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiB0ZWFtICVkIGluaXQgYXJyaXZlZDogam9pbj0ldSwgcGxhaW49JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pZCwgS01QX0lOSVRfQkFSUklFUl9TVEFURSwgS01QX0lOSVRfQkFSUklFUl9TVEFURSApKTsKKyAgICB7IC8vIEluaXRpYWxpemUgYmFycmllciBkYXRhLgorICAgICAgICBpbnQgYjsKKyAgICAgICAgZm9yICggYiA9IDA7IGIgPCBic19sYXN0X2JhcnJpZXI7ICsrIGIgKSB7CisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9hcnJpdmVkICAgICAgICA9IEtNUF9JTklUX0JBUlJJRVJfU1RBVEU7CisjaWYgVVNFX0RFQlVHR0VSCisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl9tYXN0ZXJfYXJyaXZlZCA9IDA7CisgICAgICAgICAgICB0ZWFtLT50LnRfYmFyWyBiIF0uYl90ZWFtX2Fycml2ZWQgICA9IDA7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0KKworI2lmIE9NUF80MF9FTkFCTEVECisgICAgdGVhbS0+dC50X3Byb2NfYmluZCA9IG5ld19wcm9jX2JpbmQ7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fb21wdF90ZWFtX2Fzc2lnbl9pZCh0ZWFtLCBvbXB0X3BhcmFsbGVsX2lkKTsKKyAgICB0ZWFtLT50Lm9tcHRfc2VyaWFsaXplZF90ZWFtX2luZm8gPSBOVUxMOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9hbGxvY2F0ZV90ZWFtOiBkb25lIGNyZWF0aW5nIGEgbmV3IHRlYW0gJWQuXG4iLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICByZXR1cm4gdGVhbTsKK30KKworLyogVE9ETyBpbXBsZW1lbnQgaG90LXRlYW1zIGF0IGFsbCBsZXZlbHMgKi8KKy8qIFRPRE8gaW1wbGVtZW50IGxhenkgdGhyZWFkIHJlbGVhc2Ugb24gZGVtYW5kIChkaXNiYW5kIHJlcXVlc3QpICovCisKKy8qIGZyZWUgdGhlIHRlYW0uICByZXR1cm4gaXQgdG8gdGhlIHRlYW0gcG9vbC4gIHJlbGVhc2UgYWxsIHRoZSB0aHJlYWRzCisgKiBhc3NvY2lhdGVkIHdpdGggaXQgKi8KK3ZvaWQKK19fa21wX2ZyZWVfdGVhbSgga21wX3Jvb3RfdCAqcm9vdCwga21wX3RlYW1fdCAqdGVhbSAgVVNFX05FU1RFRF9IT1RfQVJHKGttcF9pbmZvX3QgKm1hc3RlcikgKQoreworICAgIGludCBmOworICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9mcmVlX3RlYW06IFQjJWQgZnJlZWluZyB0ZWFtICVkXG4iLCBfX2ttcF9nZXRfZ3RpZCgpLCB0ZWFtLT50LnRfaWQgKSk7CisKKyAgICAvKiB2ZXJpZnkgc3RhdGUgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCByb290ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0tPnQudF9ucHJvYyA8PSB0ZWFtLT50LnRfbWF4X25wcm9jICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgKTsKKworICAgIGludCB1c2VfaG90X3RlYW0gPSB0ZWFtID09IHJvb3QtPnIucl9ob3RfdGVhbTsKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIGludCBsZXZlbDsKKyAgICBrbXBfaG90X3RlYW1fcHRyX3QgKmhvdF90ZWFtczsKKyAgICBpZiggbWFzdGVyICkgeworICAgICAgICBsZXZlbCA9IHRlYW0tPnQudF9hY3RpdmVfbGV2ZWwgLSAxOworICAgICAgICBpZiggbWFzdGVyLT50aC50aF90ZWFtc19taWNyb3Rhc2sgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGluIHRlYW1zIGNvbnN0cnVjdD8KKyAgICAgICAgICAgIGlmKCBtYXN0ZXItPnRoLnRoX3RlYW1zX3NpemUubnRlYW1zID4gMSApIHsKKyAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl9tYXN0ZXJzCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdGVhbS0+dC50X3BrZm4gIT0gKG1pY3JvdGFza190KV9fa21wX3RlYW1zX21hc3RlciAmJgorICAgICAgICAgICAgICAgIG1hc3Rlci0+dGgudGhfdGVhbXNfbGV2ZWwgPT0gdGVhbS0+dC50X2xldmVsICkgeworICAgICAgICAgICAgICAgICsrbGV2ZWw7IC8vIGxldmVsIHdhcyBub3QgaW5jcmVhc2VkIGluIHRlYW1zIGNvbnN0cnVjdCBmb3IgdGVhbV9vZl93b3JrZXJzIGJlZm9yZSB0aGUgcGFyYWxsZWwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAvLyB0ZWFtLT50LnRfbGV2ZWwgd2lsbCBiZSBpbmNyZWFzZWQgaW5zaWRlIHBhcmFsbGVsCisgICAgICAgIH0KKyAgICAgICAgaG90X3RlYW1zID0gbWFzdGVyLT50aC50aF9ob3RfdGVhbXM7CisgICAgICAgIGlmKCBsZXZlbCA8IF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtID09IGhvdF90ZWFtc1tsZXZlbF0uaG90X3RlYW0gKTsKKyAgICAgICAgICAgIHVzZV9ob3RfdGVhbSA9IDE7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworICAgIC8qIHRlYW0gaXMgZG9uZSB3b3JraW5nICovCisgICAgVENXX1NZTkNfUFRSKHRlYW0tPnQudF9wa2ZuLCBOVUxMKTsgLy8gSW1wb3J0YW50IGZvciBEZWJ1Z2dpbmcgU3VwcG9ydCBMaWJyYXJ5LgorICAgIHRlYW0tPnQudF9jb3B5aW5fY291bnRlciA9IDA7IC8vIGluaXQgY291bnRlciBmb3IgcG9zc2libGUgcmV1c2UKKyAgICAvLyBEbyBub3QgcmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSB0byBOVUxMIGZvciBob3QgdGVhbXMuCisKKyAgICAvKiBpZiB3ZSBhcmUgbm9uLWhvdCB0ZWFtLCByZWxlYXNlIG91ciB0aHJlYWRzICovCisgICAgaWYoICEgdXNlX2hvdF90ZWFtICkgeworICAgICAgICBpZiAoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICkgeworICAgICAgICAgICAgLy8gRGVsZXRlIHRhc2sgdGVhbXMKKyAgICAgICAgICAgIGludCB0dF9pZHg7CisgICAgICAgICAgICBmb3IgKHR0X2lkeD0wOyB0dF9pZHg8MjsgKyt0dF9pZHgpIHsKKyAgICAgICAgICAgICAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IHRlYW0tPnQudF90YXNrX3RlYW1bdHRfaWR4XTsKKyAgICAgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICBmb3IgKGY9MDsgZjx0ZWFtLT50LnRfbnByb2M7ICsrZikgeyAvLyBIYXZlIGFsbCB0aHJlYWRzIHVucmVmIHRhc2sgdGVhbXMKKyAgICAgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90aHJlYWRzW2ZdLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90ZWFtOiBUIyVkIGRlYWN0aXZhdGluZyB0YXNrX3RlYW0gJXAgb24gdGVhbSAlZFxuIiwgX19rbXBfZ2V0X2d0aWQoKSwgdGFza190ZWFtLCB0ZWFtLT50LnRfaWQgKSApOworI2lmIEtNUF9ORVNURURfSE9UX1RFQU1TCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2ZyZWVfdGFza190ZWFtKCBtYXN0ZXIsIHRhc2tfdGVhbSApOworI2VuZGlmCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF90YXNrX3RlYW1bdHRfaWR4XSA9IE5VTEw7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gUmVzZXQgcG9pbnRlciB0byBwYXJlbnQgdGVhbSBvbmx5IGZvciBub24taG90IHRlYW1zLgorICAgICAgICB0ZWFtLT50LnRfcGFyZW50ID0gTlVMTDsKKyAgICAgICAgdGVhbS0+dC50X2xldmVsID0gMDsKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9IDA7CisKKyAgICAgICAgLyogZnJlZSB0aGUgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgZm9yICggZiA9IDE7IGYgPCB0ZWFtLT50LnRfbnByb2M7ICsrIGYgKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1sgZiBdICk7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3RocmVhZCggdGVhbS0+dC50X3RocmVhZHNbIGYgXSApOworICAgICAgICAgICAgdGVhbS0+dC50X3RocmVhZHNbIGYgXSA9IE5VTEw7CisgICAgICAgIH0KKworICAgICAgICAvKiBwdXQgdGhlIHRlYW0gYmFjayBpbiB0aGUgdGVhbSBwb29sICovCisgICAgICAgIC8qIFRPRE8gbGltaXQgc2l6ZSBvZiB0ZWFtIHBvb2wsIGNhbGwgcmVhcF90ZWFtIGlmIHBvb2wgdG9vIGxhcmdlICovCisgICAgICAgIHRlYW0tPnQudF9uZXh0X3Bvb2wgID0gKGttcF90ZWFtX3QqKSBfX2ttcF90ZWFtX3Bvb2w7CisgICAgICAgIF9fa21wX3RlYW1fcG9vbCAgICAgICAgPSAodm9sYXRpbGUga21wX3RlYW1fdCopIHRlYW07CisgICAgfQorCisgICAgS01QX01CKCk7Cit9CisKKworLyogcmVhcCB0aGUgdGVhbS4gIGRlc3Ryb3kgaXQsIHJlY2xhaW0gYWxsIGl0cyByZXNvdXJjZXMgYW5kIGZyZWUgaXRzIG1lbW9yeSAqLwora21wX3RlYW1fdCAqCitfX2ttcF9yZWFwX3RlYW0oIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF90ZWFtX3QgKm5leHRfcG9vbCA9IHRlYW0tPnQudF9uZXh0X3Bvb2w7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BhdGNoICAgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2Rpc3BfYnVmZmVyICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X3RocmVhZHMgICAgICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGVhbS0+dC50X2FyZ3YgICAgICAgICk7CisKKyAgICAvKiBUT0RPIGNsZWFuIHRoZSB0aHJlYWRzIHRoYXQgYXJlIGEgcGFydCBvZiB0aGlzPyAqLworCisgICAgLyogZnJlZSBzdHVmZiAqLworCisgICAgX19rbXBfZnJlZV90ZWFtX2FycmF5cyggdGVhbSApOworICAgIGlmICggdGVhbS0+dC50X2FyZ3YgIT0gJnRlYW0tPnQudF9pbmxpbmVfYXJndlswXSApCisgICAgICAgIF9fa21wX2ZyZWUoICh2b2lkKikgdGVhbS0+dC50X2FyZ3YgKTsKKyAgICBfX2ttcF9mcmVlKCB0ZWFtICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gbmV4dF9wb29sOworfQorCisvLworLy8gRnJlZSB0aGUgdGhyZWFkLiAgRG9uJ3QgcmVhcCBpdCwganVzdCBwbGFjZSBpdCBvbiB0aGUgcG9vbCBvZiBhdmFpbGFibGUKKy8vIHRocmVhZHMuCisvLworLy8gQ2hhbmdlcyBmb3IgUXVhZCBpc3N1ZSA1Mjc4NDU6IFdlIG5lZWQgYSBwcmVkaWN0YWJsZSBPTVAgdGlkIDwtPiBndGlkCisvLyBiaW5kaW5nIGZvciB0aGUgYWZmaW5pdHkgbWVjaGFuaXNtIHRvIGJlIHVzZWZ1bC4KKy8vCisvLyBOb3csIHdlIGFsd2F5cyBrZWVwIHRoZSBmcmVlIGxpc3QgKF9fa21wX3RocmVhZF9wb29sKSBzb3J0ZWQgYnkgZ3RpZC4KKy8vIEhvd2V2ZXIsIHdlIHdhbnQgdG8gYXZvaWQgYSBwb3RlbnRpYWwgcGVyZm9ybWFuY2UgcHJvYmxlbSBieSBhbHdheXMKKy8vIHNjYW5uaW5nIHRocm91Z2ggdGhlIGxpc3QgdG8gZmluZCB0aGUgY29ycmVjdCBwb2ludCBhdCB3aGljaCB0byBpbnNlcnQKKy8vIHRoZSB0aHJlYWQgKHBvdGVudGlhbCBOKioyIGJlaGF2aW9yKS4gIFRvIGRvIHRoaXMgd2Uga2VlcCB0cmFjayBvZiB0aGUKKy8vIGxhc3QgcGxhY2UgYSB0aHJlYWQgc3RydWN0IHdhcyBpbnNlcnRlZCAoX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0KS4KKy8vIFdpdGggc2luZ2xlLWxldmVsIHBhcmFsbGVsaXNtLCB0aHJlYWRzIHdpbGwgYWx3YXlzIGJlIGFkZGVkIHRvIHRoZSB0YWlsCisvLyBvZiB0aGUgbGlzdCwga2VwdCB0cmFjayBvZiBieSBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQuICBXaXRoIG5lc3RlZAorLy8gcGFyYWxsZWxpc20sIGFsbCBiZXRzIGFyZSBvZmYgYW5kIHdlIG1heSBuZWVkIHRvIHNjYW4gdGhyb3VnaCB0aGUgZW50aXJlCisvLyBmcmVlIGxpc3QuCisvLworLy8gVGhpcyBjaGFuZ2UgYWxzbyBoYXMgYSBwb3RlbnRpYWxseSBsYXJnZSBwZXJmb3JtYW5jZSBiZW5lZml0LCBmb3Igc29tZQorLy8gYXBwbGljYXRpb25zLiAgUHJldmlvdXNseSwgYXMgdGhyZWFkcyB3ZXJlIGZyZWVkIGZyb20gdGhlIGhvdCB0ZWFtLCB0aGV5CisvLyB3b3VsZCBiZSBwbGFjZWQgYmFjayBvbiB0aGUgZnJlZSBsaXN0IGluIGludmVyc2Ugb3JkZXIuICBJZiB0aGUgaG90IHRlYW0KKy8vIGdyZXcgYmFjayB0byBpdCdzIG9yaWdpbmFsIHNpemUsIHRoZW4gdGhlIGZyZWVkIHRocmVhZCB3b3VsZCBiZSBwbGFjZWQKKy8vIGJhY2sgb24gdGhlIGhvdCB0ZWFtIGluIHJldmVyc2Ugb3JkZXIuICBUaGlzIGNvdWxkIGNhdXNlIGJhZCBjYWNoZQorLy8gbG9jYWxpdHkgcHJvYmxlbXMgb24gcHJvZ3JhbXMgd2hlcmUgdGhlIHNpemUgb2YgdGhlIGhvdCB0ZWFtIHJlZ3VsYXJseQorLy8gZ3JldyBhbmQgc2hydW5rLgorLy8KKy8vIE5vdywgZm9yIHNpbmdsZS1sZXZlbCBwYXJhbGxlbGlzbSwgdGhlIE9NUCB0aWQgaXMgYWx3YXkgPT0gZ3RpZC4KKy8vCit2b2lkCitfX2ttcF9mcmVlX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aCApCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX2luZm9fdCAqKnNjYW47CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfZnJlZV90aHJlYWQ6IFQjJWQgcHV0dGluZyBUIyVkIGJhY2sgb24gZnJlZSBwb29sLlxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9nZXRfZ3RpZCgpLCB0aGlzX3RoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3RoICk7CisKKyAgICAvLyBXaGVuIG1vdmluZyB0aHJlYWQgdG8gcG9vbCwgc3dpdGNoIHRocmVhZCB0byB3YWl0IG9uIG93biBiX2dvIGZsYWcsIGFuZCB1bmluaXRpYWxpemVkIChOVUxMIHRlYW0pLgorICAgIGludCBiOworICAgIGttcF9iYWxpZ25fdCAqYmFsaWduID0gdGhpc190aC0+dGgudGhfYmFyOworICAgIGZvciAoYj0wOyBiPGJzX2xhc3RfYmFycmllcjsgKytiKSB7CisgICAgICAgIGlmIChiYWxpZ25bYl0uYmIud2FpdF9mbGFnID09IEtNUF9CQVJSSUVSX1BBUkVOVF9GTEFHKQorICAgICAgICAgICAgYmFsaWduW2JdLmJiLndhaXRfZmxhZyA9IEtNUF9CQVJSSUVSX1NXSVRDSF9UT19PV05fRkxBRzsKKyAgICAgICAgYmFsaWduW2JdLmJiLnRlYW0gPSBOVUxMOworICAgIH0KKyAgICB0aGlzX3RoLT50aC50aF90YXNrX3N0YXRlID0gMDsKKworICAgIC8qIHB1dCB0aHJlYWQgYmFjayBvbiB0aGUgZnJlZSBwb29sICovCisgICAgVENXX1BUUih0aGlzX3RoLT50aC50aF90ZWFtLCBOVUxMKTsKKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX3Jvb3QsIE5VTEwpOworICAgIFRDV19QVFIodGhpc190aC0+dGgudGhfZGlzcGF0Y2gsIE5VTEwpOyAgICAgICAgICAgICAgIC8qIE5PVCBORUVERUQgKi8KKworICAgIC8vCisgICAgLy8gSWYgdGhlIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCBpcyBhbHJlYWR5IHBhc3QgdGhlIG5ldyBpbnNlcnQKKyAgICAvLyBwb2ludCwgdGhlbiB3ZSBuZWVkIHRvIHJlLXNjYW4gdGhlIGVudGlyZSBsaXN0LgorICAgIC8vCisgICAgZ3RpZCA9IHRoaXNfdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBpZiAoIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCAhPSBOVUxMICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbCAhPSBOVUxMICk7CisgICAgICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0LT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPiBndGlkICkgeworICAgICAgICAgICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9IE5VTEw7CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIFNjYW4gZG93biB0aGUgbGlzdCB0byBmaW5kIHRoZSBwbGFjZSB0byBpbnNlcnQgdGhlIHRocmVhZC4KKyAgICAvLyBzY2FuIGlzIHRoZSBhZGRyZXNzIG9mIGEgbGluayBpbiB0aGUgbGlzdCwgcG9zc2libHkgdGhlIGFkZHJlc3Mgb2YKKyAgICAvLyBfX2ttcF90aHJlYWRfcG9vbCBpdHNlbGYuCisgICAgLy8KKyAgICAvLyBJbiB0aGUgYWJzZW5jZSBvZiBuZXN0ZWQgcGFyYWxsaXNtLCB0aGUgZm9yIGxvb3Agd2lsbCBoYXZlIDAgaXRlcmF0aW9ucy4KKyAgICAvLworICAgIGlmICggX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ICE9IE5VTEwgKSB7CisgICAgICAgIHNjYW4gPSAmKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQtPnRoLnRoX25leHRfcG9vbCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgc2NhbiA9IChrbXBfaW5mb190ICoqKSZfX2ttcF90aHJlYWRfcG9vbDsKKyAgICB9CisgICAgZm9yICg7ICggKnNjYW4gIT0gTlVMTCApICYmICggKCpzY2FuKS0+dGgudGhfaW5mby5kcy5kc19ndGlkIDwgZ3RpZCApOworICAgICAgc2NhbiA9ICYoICgqc2NhbiktPnRoLnRoX25leHRfcG9vbCApICk7CisKKyAgICAvLworICAgIC8vIEluc2VydCB0aGUgbmV3IGVsZW1lbnQgb24gdGhlIGxpc3QsIGFuZCBzZXQgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0CisgICAgLy8gdG8gaXRzIGFkZHJlc3MuCisgICAgLy8KKyAgICBUQ1dfUFRSKHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbCwgKnNjYW4pOworICAgIF9fa21wX3RocmVhZF9wb29sX2luc2VydF9wdCA9ICpzY2FuID0gdGhpc190aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbCA9PSBOVUxMICkKKyAgICAgIHx8ICggdGhpc190aC0+dGgudGhfaW5mby5kcy5kc19ndGlkCisgICAgICA8IHRoaXNfdGgtPnRoLnRoX25leHRfcG9vbC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBUQ1dfNCh0aGlzX3RoLT50aC50aF9pbl9wb29sLCBUUlVFKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbF9udGgrKzsKKworICAgIFRDV180KF9fa21wX250aCwgX19rbXBfbnRoIC0gMSk7CisKKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgIC8qIEFkanVzdCBibG9ja3RpbWUgYmFjayB0byB1c2VyIHNldHRpbmcgb3IgZGVmYXVsdCBpZiBuZWNlc3NhcnkgKi8KKyAgICAvKiBNaWRkbGUgaW5pdGlhbGl6YXRpb24gbWlnaHQgbmV2ZXIgaGF2ZSBvY2N1cnJlZCAgICAgICAgICAgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA8PSBfX2ttcF9hdmFpbF9wcm9jICkgeworICAgICAgICAgICAgX19rbXBfemVyb19idCA9IEZBTFNFOworICAgICAgICB9CisgICAgfQorI2VuZGlmIC8qIEtNUF9BREpVU1RfQkxPQ0tUSU1FICovCisKKyAgICBLTVBfTUIoKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZCAqCitfX2ttcF9sYXVuY2hfdGhyZWFkKCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgIGd0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworLyogICAgdm9pZCAgICAgICAgICAgICAgICAgKnN0YWNrX2RhdGE7Ki8KKyAgICBrbXBfdGVhbV90ICooKnZvbGF0aWxlIHB0ZWFtKTsKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIHN0YXJ0XG4iLCBndGlkICkgKTsKKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC50aF9jb25zID0gX19rbXBfYWxsb2NhdGVfY29uc19zdGFjayggZ3RpZCApOyAgLy8gQVRUOiBNZW1vcnkgbGVhaz8KKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IDA7CisgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLmlkbGVfZnJhbWUgPSBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pKSB7CisgICAgICAgICAgICBfX29tcHRfdGhyZWFkX2JlZ2luKG9tcHRfdGhyZWFkX3dvcmtlciwgZ3RpZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKworICAgIC8qIFRoaXMgaXMgdGhlIHBsYWNlIHdoZXJlIHRocmVhZHMgd2FpdCBmb3Igd29yayAqLworICAgIHdoaWxlKCAhIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyID09IF9fa21wX3RocmVhZHNbIGd0aWQgXSApOworICAgICAgICBLTVBfTUIoKTsKKworICAgICAgICAvKiB3YWl0IGZvciB3b3JrIHRvIGRvICovCisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIHdhaXRpbmcgZm9yIHdvcmtcbiIsIGd0aWQgKSk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX2lkbGU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIC8qIE5vIHRpZCB5ZXQgc2luY2Ugbm90IHBhcnQgb2YgYSB0ZWFtICovCisgICAgICAgIF9fa21wX2ZvcmtfYmFycmllciggZ3RpZCwgS01QX0dUSURfRE5FICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX292ZXJoZWFkOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICBwdGVhbSA9IChrbXBfdGVhbV90ICooKikpKCYgdGhpc190aHItPnRoLnRoX3RlYW0pOworCisgICAgICAgIC8qIGhhdmUgd2UgYmVlbiBhbGxvY2F0ZWQ/ICovCisgICAgICAgIGlmICggVENSX1NZTkNfUFRSKCpwdGVhbSkgJiYgIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7CisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICBvbXB0X3Rhc2tfaW5mb190ICp0YXNrX2luZm87CisgICAgICAgICAgICBvbXB0X3BhcmFsbGVsX2lkX3QgbXlfcGFyYWxsZWxfaWQ7CisgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgdGFza19pbmZvID0gX19vbXB0X2dldF90YXNraW5mbygwKTsKKyAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCA9ICgqcHRlYW0pLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKiB3ZSB3ZXJlIGp1c3Qgd29rZW4gdXAsIHNvIHJ1biBvdXIgbmV3IHRhc2sgKi8KKyAgICAgICAgICAgIGlmICggVENSX1NZTkNfUFRSKCgqcHRlYW0pLT50LnRfcGtmbikgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBpbnQgcmM7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfbGF1bmNoX3RocmVhZDogVCMlZCglZDolZCkgaW52b2tlIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgKCpwdGVhbSktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgKCpwdGVhbSktPnQudF9wa2ZuKSk7CisKKyAgICAgICAgICAgICAgICB1cGRhdGVIV0ZQQ29udHJvbCAoKnB0ZWFtKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgICAgICAgICAgdGhpc190aHItPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBvbXB0X3N0YXRlX3dvcmtfcGFyYWxsZWw7CisgICAgICAgICAgICAgICAgICAgIC8vIEluaXRpYWxpemUgT01QVCB0YXNrIGlkIGZvciBpbXBsaWNpdCB0YXNrLgorICAgICAgICAgICAgICAgICAgICBpbnQgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKTsKKyAgICAgICAgICAgICAgICAgICAgdGFza19pbmZvLT50YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KHRpZCk7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgICAgICAgICBLTVBfU1RPUF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIoVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3ApOworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKFVTRVJfd29ya2VyX2ludm9rZSk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKE9NUF9wYXJhbGxlbCk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKElNUExJQ0lUX1RBU0spOworICAgICAgICAgICAgICAgICAgICByYyA9ICgqcHRlYW0pLT50LnRfaW52b2tlKCBndGlkICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIoVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3ApOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIG5vIGZyYW1lIHNldCB3aGlsZSBvdXRzaWRlIHRhc2sgKi8KKyAgICAgICAgICAgICAgICAgICAgdGFza19pbmZvLT5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworCisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV9vdmVyaGVhZDsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkKCVkOiVkKSBkb25lIG1pY3JvdGFzayA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgKCpwdGVhbSktPnQudF9pZCwgX19rbXBfdGlkX2Zyb21fZ3RpZChndGlkKSwgKCpwdGVhbSktPnQudF9wa2ZuKSk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAvKiBqb2luIGJhcnJpZXIgYWZ0ZXIgcGFyYWxsZWwgcmVnaW9uICovCisgICAgICAgICAgICBfX2ttcF9qb2luX2JhcnJpZXIoIGd0aWQgKTsKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICAgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQpKSB7CisgICAgICAgICAgICAgICAgICAgIC8vIGRvbid0IGFjY2VzcyAqcHRlYW0gaGVyZTogaXQgbWF5IGhhdmUgYWxyZWFkeSBiZWVuIGZyZWVkCisgICAgICAgICAgICAgICAgICAgIC8vIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGJlaGluZCB0aGUgYmFycmllciAocG9zc2libGUgcmFjZSkKKyAgICAgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKSgKKyAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB0YXNrX2luZm8tPmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IDA7CisgICAgICAgICAgICAgICAgdGFza19pbmZvLT50YXNrX2lkID0gMDsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9CisgICAgfQorICAgIFRDUl9TWU5DX1BUUigoaW50cHRyX3QpX19rbXBfZ2xvYmFsLmcuZ19kb25lKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9lbmQpKSB7CisgICAgICAgIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3dvcmtlciwgZ3RpZCk7CisgICAgfQorI2VuZGlmCisKKyAgICB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAvKiBydW4gdGhlIGRlc3RydWN0b3JzIGZvciB0aGUgdGhyZWFkcHJpdmF0ZSBkYXRhIGZvciB0aGlzIHRocmVhZCAqLworICAgIF9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQoIGd0aWQgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfdGhyZWFkOiBUIyVkIGRvbmVcbiIsIGd0aWQgKSApOworICAgIEtNUF9NQigpOworICAgIHJldHVybiB0aGlzX3RocjsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2Rlc3QoIHZvaWQgKnNwZWNpZmljX2d0aWQgKQoreworICAgICNpZiBLTVBfQ09NUElMRVJfSUNDCisgICAgICAgICNwcmFnbWEgd2FybmluZyggcHVzaCApCisgICAgICAgICNwcmFnbWEgd2FybmluZyggZGlzYWJsZTogIDgxMCApIC8vIGNvbnZlcnNpb24gZnJvbSAidm9pZCAqIiB0byAiaW50IiBtYXkgbG9zZSBzaWduaWZpY2FudCBiaXRzCisgICAgI2VuZGlmCisgICAgLy8gTWFrZSBzdXJlIG5vIHNpZ25pZmljYW50IGJpdHMgYXJlIGxvc3QKKyAgICBpbnQgZ3RpZCA9IChrbXBfaW50cHRyX3Qpc3BlY2lmaWNfZ3RpZCAtIDE7CisgICAgI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAgICAgI3ByYWdtYSB3YXJuaW5nKCBwb3AgKQorICAgICNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDMwLCAoIl9fa21wX2ludGVybmFsX2VuZF9kZXN0OiBUIyVkXG4iLCBndGlkKSk7CisgICAgLyogTk9URTogdGhlIGd0aWQgaXMgc3RvcmVkIGFzIGdpdGQrMSBpbiB0aGUgdGhyZWFkLWxvY2FsLXN0b3JhZ2UKKyAgICAgKiB0aGlzIGlzIGJlY2F1c2UgMCBpcyByZXNlcnZlZCBmb3IgdGhlIG5vdGhpbmctc3RvcmVkIGNhc2UgKi8KKworICAgIC8qIGpvc2g6IE9uZSByZWFzb24gZm9yIHNldHRpbmcgdGhlIGd0aWQgc3BlY2lmaWMgZGF0YSBldmVuIHdoZW4gaXQgaXMgYmVpbmcKKyAgICAgICBkZXN0cm95ZWQgYnkgcHRocmVhZCBpcyB0byBhbGxvdyBndGlkIGxvb2t1cCB0aHJvdWdoIHRocmVhZCBzcGVjaWZpYyBkYXRhCisgICAgICAgKF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljKS4gIFNvbWUgb2YgdGhlIGNvZGUsIGVzcGVjaWFsbHkgc3RhdCBjb2RlLAorICAgICAgIHRoYXQgZ2V0cyBleGVjdXRlZCBpbiB0aGUgY2FsbCB0byBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkLCBhY3R1YWxseQorICAgICAgIGdldHMgdGhlIGd0aWQgdGhyb3VnaCB0aGUgdGhyZWFkIHNwZWNpZmljIGRhdGEuICBTZXR0aW5nIGl0IGhlcmUgc2VlbXMKKyAgICAgICByYXRoZXIgaW5lbGVnYW50IGFuZCBwZXJoYXBzIHdyb25nLCBidXQgYWxsb3dzIF9fa21wX2ludGVybmFsX2VuZF90aHJlYWQKKyAgICAgICB0byBydW4gc21vb3RobHkuCisgICAgICAgdG9kbzogZ2V0IHJpZCBvZiB0aGlzIGFmdGVyIHdlIHJlbW92ZSB0aGUgZGVwZW5kZW5jZSBvbgorICAgICAgIF9fa21wX2d0aWRfZ2V0X3NwZWNpZmljCisgICAgKi8KKyAgICBpZihndGlkID49IDAgJiYgS01QX1VCRVJfR1RJRChndGlkKSkKKyAgICAgICAgX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWMoIGd0aWQgKTsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgX19rbXBfZ3RpZCA9IGd0aWQ7CisgICAgI2VuZGlmCisgICAgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZCggZ3RpZCApOworfQorCisjaWYgS01QX09TX1VOSVggJiYgS01QX0RZTkFNSUNfTElCCisKKy8vIDIwMDktMDktMDggKGxldik6IEl0IGxvb2tzIHRoZSBkZXN0cnVjdG9yIGRvZXMgbm90IHdvcmsuIEluIHNpbXBsZSB0ZXN0IGNhc2VzIGRlc3RydWN0b3JzIHdvcmsKKy8vIHBlcmZlY3RseSwgYnV0IGluIHJlYWwgbGlib21wLnNvIEkgaGF2ZSBubyBldmlkZW5jZSBpdCBpcyBldmVyIGNhbGxlZC4gSG93ZXZlciwgLWZpbmkgbGlua2VyCisvLyBvcHRpb24gaW4gbWFrZWZpbGUubWsgd29ya3MgZmluZS4KKworX19hdHRyaWJ1dGVfXygoIGRlc3RydWN0b3IgKSkKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9kdG9yKCB2b2lkICkKK3sKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCk7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9maW5pKCB2b2lkICkKK3sKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfYXRleGl0KCk7Cit9CisKKyNlbmRpZgorCisvKiBbV2luZG93c10gam9zaDogd2hlbiB0aGUgYXRleGl0IGhhbmRsZXIgaXMgY2FsbGVkLCB0aGVyZSBtYXkgc3RpbGwgYmUgbW9yZSB0aGFuIG9uZSB0aHJlYWQgYWxpdmUgKi8KK3ZvaWQKK19fa21wX2ludGVybmFsX2VuZF9hdGV4aXQoIHZvaWQgKQoreworICAgIEtBX1RSQUNFKCAzMCwgKCAiX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdFxuIiApICk7CisgICAgLyogW1dpbmRvd3NdCisgICAgICAgam9zaDogaWRlYWxseSwgd2Ugd2FudCB0byBjb21wbGV0ZWx5IHNodXRkb3duIHRoZSBsaWJyYXJ5IGluIHRoaXMgYXRleGl0IGhhbmRsZXIsIGJ1dAorICAgICAgIHN0YXQgY29kZSB0aGF0IGRlcGVuZHMgb24gdGhyZWFkIHNwZWNpZmljIGRhdGEgZm9yIGd0aWQgZmFpbHMgYmVjYXVzZSB0aGF0IGRhdGEgYmVjb21lcworICAgICAgIHVuYXZhaWxhYmxlIGF0IHNvbWUgcG9pbnQgZHVyaW5nIHRoZSBzaHV0ZG93biwgc28gd2UgY2FsbCBfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkCisgICAgICAgaW5zdGVhZC4gIFdlIHNob3VsZCBldmVudHVhbGx5IHJlbW92ZSB0aGUgZGVwZW5kZW5jeSBvbiBfX2ttcF9nZXRfc3BlY2lmaWNfZ3RpZCBpbiB0aGUKKyAgICAgICBzdGF0IGNvZGUgYW5kIHVzZSBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSB0byBjbGVhbmx5IHNodXRkb3duIHRoZSBsaWJyYXJ5LgorCisvLyBUT0RPOiBDYW4gc29tZSBvZiB0aGlzIGNvbW1lbnQgYWJvdXQgR1ZTIGJlIHJlbW92ZWQ/CisgICAgICAgSSBzdXNwZWN0IHRoYXQgdGhlIG9mZmVuZGluZyBzdGF0IGNvZGUgaXMgZXhlY3V0ZWQgd2hlbiB0aGUgY2FsbGluZyB0aHJlYWQgdHJpZXMgdG8KKyAgICAgICBjbGVhbiB1cCBhIGRlYWQgcm9vdCB0aHJlYWQncyBkYXRhIHN0cnVjdHVyZXMsIHJlc3VsdGluZyBpbiBHVlMgY29kZSB0cnlpbmcgdG8gY2xvc2UKKyAgICAgICB0aGUgR1ZTIHN0cnVjdHVyZXMgZm9yIHRoYXQgdGhyZWFkLCBidXQgc2luY2UgdGhlIHN0YXQgY29kZSB1c2VzCisgICAgICAgX19rbXBfZ2V0X3NwZWNpZmljX2d0aWQgdG8gZ2V0IHRoZSBndGlkIHdpdGggdGhlIGFzc3VtcHRpb24gdGhhdCB0aGUgY2FsbGluZyB0aHJlYWQgaXMKKyAgICAgICBjbGVhbmluZyB1cCBpdHNlbGYgaW5zdGVhZCBvZiBhbm90aGVyIHRocmVhZCwgaXQgZ2V0cyBjb25mdXNlZC4gIFRoaXMgaGFwcGVucyBiZWNhdXNlCisgICAgICAgYWxsb3dpbmcgYSB0aHJlYWQgdG8gdW5yZWdpc3RlciBhbmQgY2xlYW51cCBhbm90aGVyIHRocmVhZCBpcyBhIHJlY2VudCBtb2RpZmljYXRpb24gZm9yCisgICAgICAgYWRkcmVzc2luZyBhbiBpc3N1ZSB3aXRoIE1heG9uIENpbmVtYTRELiAgQmFzZWQgb24gdGhlIGN1cnJlbnQgZGVzaWduICgyMDA1MDcyMiksIGEKKyAgICAgICB0aHJlYWQgbWF5IGVuZCB1cCB0cnlpbmcgdG8gdW5yZWdpc3RlciBhbm90aGVyIHRocmVhZCBvbmx5IGlmIHRocmVhZCBkZWF0aCBkb2VzIG5vdAorICAgICAgIHRyaWdnZXIgdGhlIGNhbGxpbmcgb2YgX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZC4gIEZvciBMaW51eCogT1MsIHRoZXJlIGlzIHRoZSB0aHJlYWQKKyAgICAgICBzcGVjaWZpYyBkYXRhIGRlc3RydWN0b3IgZnVuY3Rpb24gdG8gZGV0ZWN0IHRocmVhZCBkZWF0aC4gIEZvciBXaW5kb3dzIGR5bmFtaWMsIHRoZXJlCisgICAgICAgaXMgRGxsTWFpbihUSFJFQURfREVUQUNIKS4gIEZvciBXaW5kb3dzIHN0YXRpYywgdGhlcmUgaXMgbm90aGluZy4gIFRodXMsIHRoZQorICAgICAgIHdvcmthcm91bmQgaXMgYXBwbGljYWJsZSBvbmx5IGZvciBXaW5kb3dzIHN0YXRpYyBzdGF0IGxpYnJhcnkuCisgICAgKi8KKyAgICBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeSggLTEgKTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfY2xvc2VfY29uc29sZSgpOworICAgICNlbmRpZgorfQorCitzdGF0aWMgdm9pZAorX19rbXBfcmVhcF90aHJlYWQoCisgICAga21wX2luZm9fdCAqIHRocmVhZCwKKyAgICBpbnQgaXNfcm9vdAorKSB7CisKKyAgICAvLyBJdCBpcyBhc3N1bWVkIF9fa21wX2Zvcmtqb2luX2xvY2sgaXMgYWNxdWlyZWQuCisKKyAgICBpbnQgZ3RpZDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZCAhPSBOVUxMICk7CisKKyAgICBndGlkID0gdGhyZWFkLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisKKyAgICBpZiAoICEgaXNfcm9vdCApIHsKKworICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgLyogQXNzdW1lIHRoZSB0aHJlYWRzIGFyZSBhdCB0aGUgZm9yayBiYXJyaWVyIGhlcmUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9yZWFwX3RocmVhZDogcmVsZWFzaW5nIFQjJWQgZnJvbSBmb3JrIGJhcnJpZXIgZm9yIHJlYXBcbiIsIGd0aWQgKSApOworICAgICAgICAgICAgLyogTmVlZCByZWxlYXNlIGZlbmNlIGhlcmUgdG8gcHJldmVudCBzZWcgZmF1bHRzIGZvciB0cmVlIGZvcmtqb2luIGJhcnJpZXIgKEdFSCkgKi8KKyAgICAgICAgICAgIGttcF9mbGFnXzY0IGZsYWcoJnRocmVhZC0+dGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9nbywgdGhyZWFkKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfNjQoJmZsYWcpOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIFRlcm1pbmF0ZSBPUyB0aHJlYWQuCisgICAgICAgIF9fa21wX3JlYXBfd29ya2VyKCB0aHJlYWQgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBUaGUgdGhyZWFkIHdhcyBraWxsZWQgYXN5bmNocm9ub3VzbHkuICBJZiBpdCB3YXMgYWN0aXZlbHkKKyAgICAgICAgLy8gc3Bpbm5pbmcgaW4gdGhlIHRocmVhZCBwb29sLCBkZWNyZW1lbnQgdGhlIGdsb2JhbCBjb3VudC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gVGhlcmUgaXMgYSBzbWFsbCB0aW1pbmcgaG9sZSBoZXJlIC0gaWYgdGhlIHdvcmtlciB0aHJlYWQgd2FzCisgICAgICAgIC8vIGp1c3Qgd2FraW5nIHVwIGFmdGVyIHNsZWVwaW5nIGluIHRoZSBwb29sLCBoYWQgcmVzZXQgaXQncworICAgICAgICAvLyB0aF9hY3RpdmVfaW5fcG9vbCBmbGFnIGJ1dCBub3QgZGVjcmVtZW50ZWQgdGhlIGdsb2JhbCBjb3VudGVyCisgICAgICAgIC8vIF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggeWV0LCB0aGVuIHRoZSBnbG9iYWwgY291bnRlcgorICAgICAgICAvLyBtaWdodCBub3QgZ2V0IHVwZGF0ZWQuCisgICAgICAgIC8vCisgICAgICAgIC8vIEN1cnJlbnRseSwgdGhpcyBjYW4gb25seSBoYXBwZW4gYXMgdGhlIGxpYnJhcnkgaXMgdW5sb2FkZWQsCisgICAgICAgIC8vIHNvIHRoZXJlIGFyZSBubyBoYXJtZnVsIHNpZGUgZWZmZWN0cy4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2FjdGl2ZV9pbl9wb29sICkgeworICAgICAgICAgICAgdGhyZWFkLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9ERUMzMigKKyAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPj0gMCApOworICAgICAgICB9CisKKyAgICAgICAgLy8gRGVjcmVtZW50ICMgb2YgW3dvcmtlcl0gdGhyZWFkcyBpbiB0aGUgcG9vbC4KKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkX3Bvb2xfbnRoID4gMCApOworICAgICAgICAtLV9fa21wX3RocmVhZF9wb29sX250aDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gRnJlZSB0aGUgZmFzdCBtZW1vcnkgZm9yIHRhc2tpbmcKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2ZyZWVfZmFzdF9tZW1vcnkoIHRocmVhZCApOworICAgICNlbmRpZiAvKiBVU0VfRkFTVF9NRU1PUlkgKi8KKworICAgIF9fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCggdGhyZWFkICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRzWyBndGlkIF0gPT0gdGhyZWFkICk7CisgICAgVENXX1NZTkNfUFRSKF9fa21wX3RocmVhZHNbZ3RpZF0sIE5VTEwpOworCisgICAgLS0gX19rbXBfYWxsX250aDsKKyAgICAvLyBfX2ttcF9udGggd2FzIGRlY3JlbWVudGVkIHdoZW4gdGhyZWFkIGlzIGFkZGVkIHRvIHRoZSBwb29sLgorCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIGJhY2sgdG8gdXNlciBzZXR0aW5nIG9yIGRlZmF1bHQgaWYgbmVjZXNzYXJ5ICovCisgICAgLyogTWlkZGxlIGluaXRpYWxpemF0aW9uIG1pZ2h0IG5ldmVyIGhhdmUgb2NjdXJyZWQgICAgICAgICAgICAgICAgKi8KKyAgICBpZiAoICFfX2ttcF9lbnZfYmxvY2t0aW1lICYmICggX19rbXBfYXZhaWxfcHJvYyA+IDAgKSApIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYXZhaWxfcHJvYyA+IDAgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9udGggPD0gX19rbXBfYXZhaWxfcHJvYyApIHsKKyAgICAgICAgICAgIF9fa21wX3plcm9fYnQgPSBGQUxTRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogZnJlZSB0aGUgbWVtb3J5IGJlaW5nIHVzZWQgKi8KKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBpZiAoIHRocmVhZC0+dGgudGhfY29ucyApIHsKKyAgICAgICAgICAgIF9fa21wX2ZyZWVfY29uc19zdGFjayggdGhyZWFkLT50aC50aF9jb25zICk7CisgICAgICAgICAgICB0aHJlYWQtPnRoLnRoX2NvbnMgPSBOVUxMOworICAgICAgICB9OyAvLyBpZgorICAgIH0KKworICAgIGlmICggdGhyZWFkLT50aC50aF9wcmlfY29tbW9uICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX2ZyZWUoIHRocmVhZC0+dGgudGhfcHJpX2NvbW1vbiApOworICAgICAgICB0aHJlYWQtPnRoLnRoX3ByaV9jb21tb24gPSBOVUxMOworICAgIH07IC8vIGlmCisKKyAgICBpZiAodGhyZWFkLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgIT0gTlVMTCkgeworICAgICAgICBfX2ttcF9mcmVlKHRocmVhZC0+dGgudGhfdGFza19zdGF0ZV9tZW1vX3N0YWNrKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3N0YXRlX21lbW9fc3RhY2sgPSBOVUxMOworICAgIH0KKworICAgICNpZiBLTVBfVVNFX0JHRVQKKyAgICAgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2xvY2FsLmJnZXRfZGF0YSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZmluYWxpemVfYmdldCggdGhyZWFkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgaWYgKCB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgIT0gTlVMTCApIHsKKyAgICAgICAgS01QX0NQVV9GUkVFKCB0aHJlYWQtPnRoLnRoX2FmZmluX21hc2sgKTsKKyAgICAgICAgdGhyZWFkLT50aC50aF9hZmZpbl9tYXNrID0gTlVMTDsKKyAgICB9OyAvLyBpZgorI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgIF9fa21wX3JlYXBfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSApOworICAgIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0gPSBOVUxMOworICAgIF9fa21wX2ZyZWUoIHRocmVhZCApOworCisgICAgS01QX01CKCk7CisKK30gLy8gX19rbXBfcmVhcF90aHJlYWQKKworc3RhdGljIHZvaWQKK19fa21wX2ludGVybmFsX2VuZCh2b2lkKQoreworICAgIGludCBpOworCisgICAgLyogRmlyc3QsIHVucmVnaXN0ZXIgdGhlIGxpYnJhcnkgKi8KKyAgICBfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoKTsKKworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAvKiBJbiBXaW4gc3RhdGljIGxpYnJhcnksIHdlIGNhbid0IHRlbGwgd2hlbiBhIHJvb3QgYWN0dWFsbHkgZGllcywgc28gd2UKKyAgICAgICAgICAgcmVjbGFpbSB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGZvciBhbnkgcm9vdCB0aHJlYWRzIHRoYXQgaGF2ZSBkaWVkIGJ1dCBub3QKKyAgICAgICAgICAgdW5yZWdpc3RlcmVkIHRoZW1zZWx2ZXMsIGluIG9yZGVyIHRvIHNodXQgZG93biBjbGVhbmx5LgorICAgICAgICAgICBJbiBXaW4gZHluYW1pYyBsaWJyYXJ5IHdlIGFsc28gY2FuJ3QgdGVsbCB3aGVuIGEgdGhyZWFkIGRpZXMuCisgICAgICAgICovCisgICAgICAgIF9fa21wX3JlY2xhaW1fZGVhZF9yb290cygpOyAvLyBBQzogbW92ZWQgaGVyZSB0byBhbHdheXMgY2xlYW4gcmVzb3VyY2VzIG9mIGRlYWQgcm9vdHMKKyAgICAjZW5kaWYKKworICAgIGZvciggaT0wIDsgaTxfX2ttcF90aHJlYWRzX2NhcGFjaXR5IDsgaSsrICkKKyAgICAgICAgaWYoIF9fa21wX3Jvb3RbaV0gKQorICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbaV0tPnIucl9hY3RpdmUgKQorICAgICAgICAgICAgICAgIGJyZWFrOworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKworICAgIGlmICggaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHkgKSB7CisgICAgICAgIC8vIDIwMDktMDktMDggKGxldik6IE90aGVyIGFsaXZlIHJvb3RzIGZvdW5kLiBXaHkgZG8gd2Uga2lsbCB0aGUgbW9uaXRvcj8/CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8vCisgICAgICAgIC8vIE5lZWQgdG8gY2hlY2sgdGhhdCBtb25pdG9yIHdhcyBpbml0aWFsaXplZCBiZWZvcmUgcmVhcGluZyBpdC4KKyAgICAgICAgLy8gSWYgd2UgYXJlIGNhbGxlZCBmb3JtIF9fa21wX2F0Zm9ya19jaGlsZCAod2hpY2ggc2V0cworICAgICAgICAvLyBfX2ttcF9pbml0X3BhcmFsbGVsID0gMCksIHRoZW4gX19rbXBfbW9uaXRvciB3aWxsIGFwcGVhciB0bworICAgICAgICAvLyBjb250YWluIHZhbGlkIGRhdGEsIGJ1dCBpdCBpcyBvbmx5IHZhbGlkIGluIHRoZSBwYXJlbnQgcHJvY2VzcywKKyAgICAgICAgLy8gbm90IHRoZSBjaGlsZC4KKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmV3IGJlaGF2aW9yICgyMDEwMDgpOiBpbnN0ZWFkIG9mIGtleWluZyBvZmYgb2YgdGhlIGZsYWcKKyAgICAgICAgLy8gX19rbXBfaW5pdF9wYXJhbGxlbCwgdGhlIG1vbml0b3IgdGhyZWFkIGNyZWF0aW9uIGlzIGtleWVkIG9mZgorICAgICAgICAvLyBvZiB0aGUgbmV3IGZsYWcgX19rbXBfaW5pdF9tb25pdG9yLgorICAgICAgICAvLworICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX21vbml0b3JfbG9jayApOworICAgICAgICBpZiAoIFRDUl80KCBfX2ttcF9pbml0X21vbml0b3IgKSApIHsKKyAgICAgICAgICAgIF9fa21wX3JlYXBfbW9uaXRvciggJiBfX2ttcF9tb25pdG9yICk7CisgICAgICAgICAgICBUQ1dfNCggX19rbXBfaW5pdF9tb25pdG9yLCAwICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZDogbW9uaXRvciByZWFwZWRcbiIgKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIFRPRE8gbW92ZSB0aGlzIHRvIGNsZWFudXAgY29kZSAqLworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAvKiBtYWtlIHN1cmUgdGhhdCBldmVyeXRoaW5nIGhhcyBwcm9wZXJseSBlbmRlZCAqLworICAgICAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyBpKysgKSB7CisgICAgICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbaV0gKSB7CisvLyAgICAgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggISBLTVBfVUJFUl9HVElEKCBpICkgKTsgICAgICAgICAvLyBBQzogdGhlcmUgY2FuIGJlIHViZXIgdGhyZWFkcyBhbGl2ZSBoZXJlCisgICAgICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoICEgX19rbXBfcm9vdFtpXS0+ci5yX2FjdGl2ZSApOyAgLy8gVE9ETzogY2FuIHRoZXkgYmUgYWN0aXZlPworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLy8gUmVhcCB0aGUgd29ya2VyIHRocmVhZHMuCisgICAgICAgIC8vIFRoaXMgaXMgdmFsaWQgZm9yIG5vdywgYnV0IGJlIGNhcmVmdWwgaWYgdGhyZWFkcyBhcmUgcmVhcGVkIHNvb25lci4KKyAgICAgICAgd2hpbGUgKCBfX2ttcF90aHJlYWRfcG9vbCAhPSBOVUxMICkgeyAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB0aHJlYWQgaW4gdGhlIHBvb2wuCisgICAgICAgICAgICAvLyBHZXQgdGhlIG5leHQgdGhyZWFkIGZyb20gdGhlIHBvb2wuCisgICAgICAgICAgICBrbXBfaW5mb190ICogdGhyZWFkID0gKGttcF9pbmZvX3QgKikgX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbCA9IHRocmVhZC0+dGgudGhfbmV4dF9wb29sOworICAgICAgICAgICAgLy8gUmVhcCBpdC4KKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfbmV4dF9wb29sID0gTlVMTDsKKyAgICAgICAgICAgIHRocmVhZC0+dGgudGhfaW5fcG9vbCA9IEZBTFNFOworICAgICAgICAgICAgX19rbXBfcmVhcF90aHJlYWQoIHRocmVhZCwgMCApOworICAgICAgICB9OyAvLyB3aGlsZQorICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPSBOVUxMOworCisgICAgICAgIC8vIFJlYXAgdGVhbXMuCisgICAgICAgIHdoaWxlICggX19rbXBfdGVhbV9wb29sICE9IE5VTEwgKSB7ICAgICAvLyBMb29wIHRocnUgYWxsIHRoZSB0ZWFtcyBpbiB0aGUgcG9vbC4KKyAgICAgICAgICAgIC8vIEdldCB0aGUgbmV4dCB0ZWFtIGZyb20gdGhlIHBvb2wuCisgICAgICAgICAgICBrbXBfdGVhbV90ICogdGVhbSA9IChrbXBfdGVhbV90ICopIF9fa21wX3RlYW1fcG9vbDsKKyAgICAgICAgICAgIF9fa21wX3RlYW1fcG9vbCA9IHRlYW0tPnQudF9uZXh0X3Bvb2w7CisgICAgICAgICAgICAvLyBSZWFwIGl0LgorICAgICAgICAgICAgdGVhbS0+dC50X25leHRfcG9vbCA9IE5VTEw7CisgICAgICAgICAgICBfX2ttcF9yZWFwX3RlYW0oIHRlYW0gKTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKworICAgICAgICBfX2ttcF9yZWFwX3Rhc2tfdGVhbXMoICk7CisKKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArKyBpICkgeworICAgICAgICAgICAgLy8gVEJEOiBBZGQgc29tZSBjaGVja2luZy4uLgorICAgICAgICAgICAgLy8gU29tZXRoaW5nIGxpa2UgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGhyZWFkWyBpIF0gPT0gTlVMTCApOworICAgICAgICB9CisKKyAgICAgICAgLyogTWFrZSBzdXJlIGFsbCB0aHJlYWRwcml2YXRlIGRlc3RydWN0b3JzIGdldCBydW4gYnkgam9pbmluZyB3aXRoIGFsbCB3b3JrZXIKKyAgICAgICAgICAgdGhyZWFkcyBiZWZvcmUgcmVzZXR0aW5nIHRoaXMgZmxhZyAqLworICAgICAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZDogYWxsIHdvcmtlcnMgcmVhcGVkXG4iICkgKTsKKyAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2VlIG5vdGUgYWJvdmU6IE9uZSBvZiB0aGUgcG9zc2libGUgZml4ZXMgZm9yIENRMTM4NDM0IC8gQ1ExNDAxMjYKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRklYTUU6IHB1c2ggYm90aCBjb2RlIGZyYWdtZW50cyBkb3duIGFuZCBDU0UgdGhlbT8KKyAgICAgICAgLy8gcHVzaCB0aGVtIGludG8gX19rbXBfY2xlYW51cCgpID8KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF9tb25pdG9yX2xvY2sgKTsKKyAgICAgICAgaWYgKCBUQ1JfNCggX19rbXBfaW5pdF9tb25pdG9yICkgKSB7CisgICAgICAgICAgICBfX2ttcF9yZWFwX21vbml0b3IoICYgX19rbXBfbW9uaXRvciApOworICAgICAgICAgICAgVENXXzQoIF9fa21wX2luaXRfbW9uaXRvciwgMCApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmQ6IG1vbml0b3IgcmVhcGVkXG4iICkgKTsKKworICAgIH0gLyogZWxzZSAhX19rbXBfZ2xvYmFsLnRfYWN0aXZlICovCisgICAgVENXXzQoX19rbXBfaW5pdF9ndGlkLCBGQUxTRSk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9jbGVhbnVwKCk7CisjaWYgT01QVF9TVVBQT1JUCisgICAgb21wdF9maW5pKCk7CisjZW5kaWYKK30KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnkoIGludCBndGlkX3JlcSApCit7CisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYWFudCwKKyAgICAvLyBiZWNhdXNlIHRoZSBuZXh0IGNoZWNrIHdpbGwgd29yayBpbiBhbnkgY2FzZS4KKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDExLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBmaW5kIG91dCB3aG8gd2UgYXJlIGFuZCB3aGF0IHdlIHNob3VsZCBkbyAqLworICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSAoZ3RpZF9yZXE+PTApID8gZ3RpZF9yZXEgOiBfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpOworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogIV9fa21wX2luaXRfcnVudGltZSwgc3lzdGVtIGFscmVhZHkgc2h1dGRvd25cbiIgKSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0gZWxzZSBpZiggZ3RpZCA9PSBLTVBfR1RJRF9NT05JVE9SICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBtb25pdG9yIHRocmVhZCwgZ3RpZCBub3QgcmVnaXN0ZXJlZCwgb3Igc3lzdGVtIHNodXRkb3duXG4iICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9IGVsc2UgaWYoIGd0aWQgPT0gS01QX0dUSURfRE5FICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSwgYnV0IHdlIG1heSBzdGlsbCBzaHV0ZG93biB0aGUgbGlicmFyeSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAgICAgLyogdW5yZWdpc3RlciBvdXJzZWx2ZXMgYXMgYW4gdWJlciB0aHJlYWQuICBndGlkIGlzIG5vIGxvbmdlciB2YWxpZCAqLworICAgICAgICAgICAgaWYoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl9hY3RpdmUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9IC0xOworICAgICAgICAgICAgICAgIFRDV19TWU5DXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IHJvb3Qgc3RpbGwgYWN0aXZlLCBhYm9ydCBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF9saWJyYXJ5OiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIHdvcmtlciB0aHJlYWRzIG1heSBjYWxsIHRoaXMgZnVuY3Rpb24gdGhyb3VnaCB0aGUgYXRleGl0IGhhbmRsZXIsIGlmIHRoZXkgY2FsbCBleGl0KCkgKi8KKyAgICAgICAgICAgIC8qIEZvciBub3csIHNraXAgdGhlIHVzdWFsIHN1YnNlcXVlbnQgcHJvY2Vzc2luZyBhbmQganVzdCBkdW1wIHRoZSBkZWJ1ZyBidWZmZXIuCisgICAgICAgICAgICAgICBUT0RPOiBkbyBhIHRob3JvdWdoIHNodXRkb3duIGluc3RlYWQKKyAgICAgICAgICAgICovCisgICAgICAgICAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX2RlYnVnX2J1ZmZlciggKTsKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIC8qIHN5bmNocm9uaXplIHRoZSB0ZXJtaW5hdGlvbiBwcm9jZXNzICovCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIC8qIGhhdmUgd2UgYWxyZWFkeSBmaW5pc2hlZCAqLworICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX2xpYnJhcnk6IGFib3J0LCBleGl0aW5nXG4iICkpOworICAgICAgICAvKiBUT0RPIGFib3J0PyAqLworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpIHx8ICFfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIFdlIG5lZWQgdGhpcyBsb2NrIHRvIGVuZm9yY2UgbXV0ZXggYmV0d2VlbiB0aGlzIHJlYWRpbmcgb2YKKyAgICAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGFuZCB0aGUgd3JpdGluZyBieSBfX2ttcF9yZWdpc3Rlcl9yb290LgorICAgICAgIEFsdGVybmF0aXZlbHksIHdlIGNhbiB1c2UgYSBjb3VudGVyIG9mIHJvb3RzIHRoYXQgaXMKKyAgICAgICBhdG9taWNhbGx5IHVwZGF0ZWQgYnkgX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWRfcmVnLAorICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGFuZCBfX2ttcF9pbnRlcm5hbF9lbmRfKi4KKyAgICAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICAvKiBub3cgd2UgY2FuIHNhZmVseSBjb25kdWN0IHRoZSBhY3R1YWwgdGVybWluYXRpb24gKi8KKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeTogZXhpdFxuIiApICk7CisKKyAgICAjaWZkZWYgRFVNUF9ERUJVR19PTl9FWElUCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkKKyAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCk7CisgICAgI2VuZGlmCisKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgX19rbXBfY2xvc2VfY29uc29sZSgpOworICAgICNlbmRpZgorCisgICAgX19rbXBfZmluaV9hbGxvY2F0b3IoKTsKKworfSAvLyBfX2ttcF9pbnRlcm5hbF9lbmRfbGlicmFyeQorCit2b2lkCitfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkKCBpbnQgZ3RpZF9yZXEgKQoreworICAgIGludCBpOworCisgICAgLyogaWYgd2UgaGF2ZSBhbHJlYWR5IGNsZWFuZWQgdXAsIGRvbid0IHRyeSBhZ2FpbiwgaXQgd291bGRuJ3QgYmUgcHJldHR5ICovCisgICAgLyogdGhpcyBzaG91bGRuJ3QgYmUgYSByYWNlIGNvbmRpdGlvbiBiZWNhdXNlIF9fa21wX2ludGVybmFsX2VuZCgpIGlzIHRoZQorICAgICAqIG9ubHkgcGxhY2UgdG8gY2xlYXIgX19rbXBfc2VyaWFsX2luaXQgKi8KKyAgICAvKiB3ZSdsbCBjaGVjayB0aGlzIGxhdGVyIHRvbywgYWZ0ZXIgd2UgZ2V0IHRoZSBsb2NrICovCisgICAgLy8gMjAwOS0wOS0wNjogV2UgZG8gbm90IHNldCBnX2Fib3J0IHdpdGhvdXQgc2V0dGluZyBnX2RvbmUuIFRoaXMgY2hlY2sgbG9va3MgcmVkdW5kYW50LAorICAgIC8vIGJlY2F1c2UgdGhlIG5leHQgY2hlY2sgd2lsbCB3b3JrIGluIGFueSBjYXNlLgorICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkgeworICAgICAgICBLQV9UUkFDRSggMTEsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWJvcnQsIGV4aXRpbmdcbiIgKSk7CisgICAgICAgIC8qIFRPRE8gYWJvcnQ/ICovCisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgaWYoIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgfHwgIV9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogYWxyZWFkeSBmaW5pc2hlZFxuIiApKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgLyogZmluZCBvdXQgd2hvIHdlIGFyZSBhbmQgd2hhdCB3ZSBzaG91bGQgZG8gKi8KKyAgICB7CisgICAgICAgIGludCBndGlkID0gKGd0aWRfcmVxPj0wKSA/IGd0aWRfcmVxIDogX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IGVudGVyIFQjJWQgICglZClcbiIsIGd0aWQsIGd0aWRfcmVxICkpOworICAgICAgICBpZiggZ3RpZCA9PSBLTVBfR1RJRF9TSFVURE9XTiApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiAhX19rbXBfaW5pdF9ydW50aW1lLCBzeXN0ZW0gYWxyZWFkeSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZDogbW9uaXRvciB0aHJlYWQsIGd0aWQgbm90IHJlZ2lzdGVyZWQsIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfSBlbHNlIGlmKCBndGlkID09IEtNUF9HVElEX0RORSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBndGlkIG5vdCByZWdpc3RlcmVkIG9yIHN5c3RlbSBzaHV0ZG93blxuIiApKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIC8qIHdlIGRvbid0IGtub3cgd2hvIHdlIGFyZSAqLworICAgICAgICB9IGVsc2UgaWYoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSkgeworICAgICAgICAvKiB1bnJlZ2lzdGVyIG91cnNlbHZlcyBhcyBhbiB1YmVyIHRocmVhZC4gIGd0aWQgaXMgbm8gbG9uZ2VyIHZhbGlkICovCisgICAgICAgICAgICBpZiggX19rbXBfcm9vdFtndGlkXS0+ci5yX2FjdGl2ZSApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gLTE7CisgICAgICAgICAgICAgICAgVENXX1NZTkNfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiByb290IHN0aWxsIGFjdGl2ZSwgYWJvcnQgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiB1bnJlZ2lzdGVyaW5nIHNpYmxpbmcgVCMlZFxuIiwgZ3RpZCApKTsKKyAgICAgICAgICAgICAgICBfX2ttcF91bnJlZ2lzdGVyX3Jvb3RfY3VycmVudF90aHJlYWQoIGd0aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8qIGp1c3QgYSB3b3JrZXIgdGhyZWFkLCBsZXQncyBsZWF2ZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgVCMlZFxuIiwgZ3RpZCApKTsKKworICAgICAgICAgICAgaWYgKCBndGlkID49IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHdvcmtlciB0aHJlYWQgZG9uZSwgZXhpdGluZyBUIyVkXG4iLCBndGlkICkpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgICNpZiBkZWZpbmVkIEtNUF9EWU5BTUlDX0xJQgorICAgIC8vIEFDOiBsZXRzIG5vdCBzaHV0ZG93biB0aGUgTGludXgqIE9TIGR5bmFtaWMgbGlicmFyeSBhdCB0aGUgZXhpdCBvZiB1YmVyIHRocmVhZCwKKyAgICAvLyAgICAgYmVjYXVzZSB3ZSB3aWxsIGJldHRlciBzaHV0ZG93biBsYXRlciBpbiB0aGUgbGlicmFyeSBkZXN0cnVjdG9yLgorICAgIC8vICAgICBUaGUgcmVhc29uIG9mIHRoaXMgY2hhbmdlIGlzIHBlcmZvcm1hbmNlIHByb2JsZW0gd2hlbiBub24tb3Blbm1wIHRocmVhZAorICAgIC8vICAgICBpbiBhIGxvb3AgZm9ya3MgYW5kIGpvaW5zIG1hbnkgb3Blbm1wIHRocmVhZHMuIFdlIGNhbiBzYXZlIGEgbG90IG9mIHRpbWUKKyAgICAvLyAgICAga2VlcGluZyB3b3JrZXIgdGhyZWFkcyBhbGl2ZSB1bnRpbCB0aGUgcHJvZ3JhbSBzaHV0ZG93bi4KKyAgICAvLyBPTTogUmVtb3ZlZCBMaW51eCogT1MgcmVzdHJpY3Rpb24gdG8gZml4IHRoZSBjcmFzaCBvbiBPUyBYKiAoRFBEMjAwMjM5OTY2KSBhbmQKKyAgICAvLyAgICAgV2luZG93cyhEUEQyMDAyODc0NDMpIHRoYXQgb2NjdXJzIHdoZW4gdXNpbmcgY3JpdGljYWwgc2VjdGlvbnMgZnJvbSBmb3JlaWduIHRocmVhZHMuCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0aW5nIFQjJWRcbiIsIGd0aWRfcmVxKSApOworICAgICAgICByZXR1cm47CisgICAgI2VuZGlmCisgICAgLyogc3luY2hyb25pemUgdGhlIHRlcm1pbmF0aW9uIHByb2Nlc3MgKi8KKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworCisgICAgLyogaGF2ZSB3ZSBhbHJlYWR5IGZpbmlzaGVkICovCisgICAgaWYoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBhYm9ydCwgZXhpdGluZ1xuIiApKTsKKyAgICAgICAgLyogVE9ETyBhYm9ydD8gKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSB8fCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvKiBXZSBuZWVkIHRoaXMgbG9jayB0byBlbmZvcmNlIG11dGV4IGJldHdlZW4gdGhpcyByZWFkaW5nIG9mCisgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSBhbmQgdGhlIHdyaXRpbmcgYnkgX19rbXBfcmVnaXN0ZXJfcm9vdC4KKyAgICAgICBBbHRlcm5hdGl2ZWx5LCB3ZSBjYW4gdXNlIGEgY291bnRlciBvZiByb290cyB0aGF0IGlzCisgICAgICAgYXRvbWljYWxseSB1cGRhdGVkIGJ5IF9fa21wX2dldF9nbG9iYWxfdGhyZWFkX2lkX3JlZywKKyAgICAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSBhbmQgX19rbXBfaW50ZXJuYWxfZW5kXyouCisgICAgKi8KKworICAgIC8qIHNob3VsZCB3ZSBmaW5pc2ggdGhlIHJ1bi10aW1lPyAgYXJlIGFsbCBzaWJsaW5ncyBkb25lPyAqLworICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7ICsrIGkgKSB7CisgICAgICAgIGlmICggS01QX1VCRVJfR1RJRCggaSApICkgeworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2ludGVybmFsX2VuZF90aHJlYWQ6IHJlbWFpbmluZyBzaWJsaW5nIHRhc2s6IGd0aWQ9PSVkXG4iLCBpICkpOworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2Zvcmtqb2luX2xvY2sgKTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH07CisgICAgfQorCisgICAgLyogbm93IHdlIGNhbiBzYWZlbHkgY29uZHVjdCB0aGUgYWN0dWFsIHRlcm1pbmF0aW9uICovCisKKyAgICBfX2ttcF9pbnRlcm5hbF9lbmQoKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9mb3Jram9pbl9sb2NrICk7CisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9pbnRlcm5hbF9lbmRfdGhyZWFkOiBleGl0IFQjJWRcbiIsIGd0aWRfcmVxICkgKTsKKworICAgICNpZmRlZiBEVU1QX0RFQlVHX09OX0VYSVQKKyAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKQorICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAjZW5kaWYKK30gLy8gX19rbXBfaW50ZXJuYWxfZW5kX3RocmVhZAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKworc3RhdGljIGxvbmcgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgLy8gUmFuZG9tIHZhbHVlIHVzZWQgdG8gaW5kaWNhdGUgbGlicmFyeSBpbml0aWFsaXphdGlvbi4KK3N0YXRpYyBjaGFyICogX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworICAgIC8vIFZhbHVlIHRvIGJlIHNhdmVkIGluIGVudiB2YXIgX19LTVBfUkVHSVNURVJFRF9MSUJfPHBpZD4uCisKKworc3RhdGljIGlubGluZQorY2hhciAqCitfX2ttcF9yZWdfc3RhdHVzX25hbWUoKSB7CisgICAgLyoKKyAgICAgICAgT24gUkhFTCAzdTUgaWYgbGlua2VkIHN0YXRpY2FsbHksIGdldHBpZCgpIHJldHVybnMgZGlmZmVyZW50IHZhbHVlcyBpbiBlYWNoIHRocmVhZC4KKyAgICAgICAgSWYgcmVnaXN0cmF0aW9uIGFuZCB1bnJlZ2lzdHJhdGlvbiBnbyBpbiBkaWZmZXJlbnQgdGhyZWFkcyAob21wX21pc2Nfb3RoZXJfcm9vdF9leGl0LmNwcCB0ZXN0IGNhc2UpLAorICAgICAgICB0aGUgbmFtZSBvZiByZWdpc3RlcmVkX2xpYl9lbnYgZW52IHZhciBjYW4gbm90IGJlIGZvdW5kLCBiZWNhdXNlIHRoZSBuYW1lIHdpbGwgY29udGFpbiBkaWZmZXJlbnQgcGlkLgorICAgICovCisgICAgcmV0dXJuIF9fa21wX3N0cl9mb3JtYXQoICJfX0tNUF9SRUdJU1RFUkVEX0xJQl8lZCIsIChpbnQpIGdldHBpZCgpICk7Cit9IC8vIF9fa21wX3JlZ19zdGF0dXNfZ2V0CisKKwordm9pZAorX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKAorICAgIHZvaWQKKykgeworCisgICAgY2hhciAqIG5hbWUgICA9IF9fa21wX3JlZ19zdGF0dXNfbmFtZSgpOyAgLy8gTmFtZSBvZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUuCisgICAgaW50ICAgIGRvbmUgICA9IDA7CisgICAgdW5pb24geworICAgICAgICBkb3VibGUgZHRpbWU7CisgICAgICAgIGxvbmcgICBsdGltZTsKKyAgICB9IHRpbWU7CisgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9yZWFkX3N5c3RlbV90aW1lKCAmIHRpbWUuZHRpbWUgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDB4Q0FGRTAwMDBMIHwgKCB0aW1lLmx0aW1lICYgMHgwMDAwRkZGRkwgKTsKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fc3RyID0KKyAgICAgICAgX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICIlcC0lbHgtJXMiLAorICAgICAgICAgICAgJiBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZywKKyAgICAgICAgICAgIF9fa21wX3JlZ2lzdHJhdGlvbl9mbGFnLAorICAgICAgICAgICAgS01QX0xJQlJBUllfRklMRQorICAgICAgICApOworCisgICAgS0FfVFJBQ0UoIDUwLCAoICJfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXA6ICVzPVwiJXNcIlxuIiwgbmFtZSwgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApICk7CisKKyAgICB3aGlsZSAoICEgZG9uZSApIHsKKworICAgICAgICBjaGFyICogdmFsdWUgID0gTlVMTDsgLy8gQWN0dWFsIHZhbHVlIG9mIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZS4KKworICAgICAgICAvLyBTZXQgZW52aXJvbm1lbnQgdmFyaWFibGUsIGJ1dCBkbyBub3Qgb3ZlcndyaXRlIGlmIGl0IGlzIGV4aXN0LgorICAgICAgICBfX2ttcF9lbnZfc2V0KCBuYW1lLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyLCAwICk7CisgICAgICAgIC8vIENoZWNrIHRoZSB2YXJpYWJsZSBpcyB3cml0dGVuLgorICAgICAgICB2YWx1ZSA9IF9fa21wX2Vudl9nZXQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICYmIHN0cmNtcCggdmFsdWUsIF9fa21wX3JlZ2lzdHJhdGlvbl9zdHIgKSA9PSAwICkgeworCisgICAgICAgICAgICBkb25lID0gMTsgICAgLy8gT2ssIGVudmlyb25tZW50IHZhcmlhYmxlIHNldCBzdWNjZXNzZnVsbHksIGV4aXQgdGhlIGxvb3AuCisKKyAgICAgICAgfSBlbHNlIHsKKworICAgICAgICAgICAgLy8gT29wcy4gV3JpdGUgZmFpbGVkLiBBbm90aGVyIGNvcHkgb2YgT3Blbk1QIFJUTCBpcyBpbiBtZW1vcnkuCisgICAgICAgICAgICAvLyBDaGVjayB3aGV0aGVyIGl0IGFsaXZlIG9yIGRlYWQuCisgICAgICAgICAgICBpbnQgICAgbmVpZ2hib3IgPSAwOyAvLyAwIC0tIHVua25vd24gc3RhdHVzLCAxIC0tIGFsaXZlLCAyIC0tIGRlYWQuCisgICAgICAgICAgICBjaGFyICogdGFpbCAgICAgICAgICA9IHZhbHVlOworICAgICAgICAgICAgY2hhciAqIGZsYWdfYWRkcl9zdHIgPSBOVUxMOworICAgICAgICAgICAgY2hhciAqIGZsYWdfdmFsX3N0ciAgPSBOVUxMOworICAgICAgICAgICAgY2hhciBjb25zdCAqIGZpbGVfbmFtZSAgICAgPSBOVUxMOworICAgICAgICAgICAgX19rbXBfc3RyX3NwbGl0KCB0YWlsLCAnLScsICYgZmxhZ19hZGRyX3N0ciwgJiB0YWlsICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHRhaWwsICctJywgJiBmbGFnX3ZhbF9zdHIsICAmIHRhaWwgKTsKKyAgICAgICAgICAgIGZpbGVfbmFtZSA9IHRhaWw7CisgICAgICAgICAgICBpZiAoIHRhaWwgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBsb25nICogZmxhZ19hZGRyID0gMDsKKyAgICAgICAgICAgICAgICBsb25nICAgZmxhZ192YWwgID0gMDsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX2FkZHJfc3RyLCAiJXAiLCAgJiBmbGFnX2FkZHIgKTsKKyAgICAgICAgICAgICAgICBLTVBfU1NDQU5GKCBmbGFnX3ZhbF9zdHIsICAiJWx4IiwgJiBmbGFnX3ZhbCAgKTsKKyAgICAgICAgICAgICAgICBpZiAoIGZsYWdfYWRkciAhPSAwICYmIGZsYWdfdmFsICE9IDAgJiYgc3RyY21wKCBmaWxlX25hbWUsICIiICkgIT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QsIGNoZWNrIHdoZXRoZXIgZW52aXJvbm1lbnQtZW5jb2RlZCBhZGRyZXNzIGlzIG1hcHBlZCBpbnRvIGFkZHIgc3BhY2UuCisgICAgICAgICAgICAgICAgICAgIC8vIElmIHNvLCBkZXJlZmVyZW5jZSBpdCB0byBzZWUgaWYgaXQgc3RpbGwgaGFzIHRoZSByaWdodCB2YWx1ZS4KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2lzX2FkZHJlc3NfbWFwcGVkKCBmbGFnX2FkZHIgKSAmJiAqIGZsYWdfYWRkciA9PSBmbGFnX3ZhbCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIG5laWdoYm9yID0gMTsKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIElmIG5vdCwgdGhlbiB3ZSBrbm93IHRoZSBvdGhlciBjb3B5IG9mIHRoZSBsaWJyYXJ5IGlzIG5vIGxvbmdlciBydW5uaW5nLgorICAgICAgICAgICAgICAgICAgICAgICAgbmVpZ2hib3IgPSAyOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgc3dpdGNoICggbmVpZ2hib3IgKSB7CisgICAgICAgICAgICAgICAgY2FzZSAwIDogICAgICAvLyBDYW5ub3QgcGFyc2UgZW52aXJvbm1lbnQgdmFyaWFibGUgLS0gbmVpZ2hib3Igc3RhdHVzIHVua25vd24uCisgICAgICAgICAgICAgICAgICAgIC8vIEFzc3VtZSBpdCBpcyB0aGUgaW5jb21wYXRpYmxlIGZvcm1hdCBvZiBmdXR1cmUgdmVyc2lvbiBvZiB0aGUgbGlicmFyeS4KKyAgICAgICAgICAgICAgICAgICAgLy8gQXNzdW1lIHRoZSBvdGhlciBsaWJyYXJ5IGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBXQVJOKCAuLi4gKTsgLy8gVE9ETzogSXNzdWUgYSB3YXJuaW5nLgorICAgICAgICAgICAgICAgICAgICBmaWxlX25hbWUgPSAidW5rbm93biBsaWJyYXJ5IjsKKyAgICAgICAgICAgICAgICAgICAgLy8gQXR0ZW50aW9uISBGYWxsaW5nIHRvIHRoZSBuZXh0IGNhc2UuIFRoYXQncyBpbnRlbnRpb25hbC4KKyAgICAgICAgICAgICAgICBjYXNlIDEgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGFsaXZlLgorICAgICAgICAgICAgICAgICAgICAvLyBDaGVjayBpdCBpcyBhbGxvd2VkLgorICAgICAgICAgICAgICAgICAgICBjaGFyICogZHVwbGljYXRlX29rID0gX19rbXBfZW52X2dldCggIktNUF9EVVBMSUNBVEVfTElCX09LIiApOworICAgICAgICAgICAgICAgICAgICBpZiAoICEgX19rbXBfc3RyX21hdGNoX3RydWUoIGR1cGxpY2F0ZV9vayApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgLy8gVGhhdCdzIG5vdCBhbGxvd2VkLiBJc3N1ZSBmYXRhbCBlcnJvci4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX01TRyggRHVwbGljYXRlTGlicmFyeSwgS01QX0xJQlJBUllfRklMRSwgZmlsZV9uYW1lICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggRHVwbGljYXRlTGlicmFyeSApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggZHVwbGljYXRlX29rICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rID0gMTsKKyAgICAgICAgICAgICAgICAgICAgZG9uZSA9IDE7ICAgIC8vIEV4aXQgdGhlIGxvb3AuCisgICAgICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgICAgICBjYXNlIDIgOiB7ICAgIC8vIE5laWdoYm9yIGlzIGRlYWQuCisgICAgICAgICAgICAgICAgICAgIC8vIENsZWFyIHRoZSB2YXJpYWJsZSBhbmQgdHJ5IHRvIHJlZ2lzdGVyIGxpYnJhcnkgYWdhaW4uCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgICAgICAgICAgICAgIH0gIGJyZWFrOworICAgICAgICAgICAgICAgIGRlZmF1bHQgOiB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIDAgKTsKKyAgICAgICAgICAgICAgICB9IGJyZWFrOworICAgICAgICAgICAgfTsgLy8gc3dpdGNoCisKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopIHZhbHVlICk7CisKKyAgICB9OyAvLyB3aGlsZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSBuYW1lICk7CisKK30gLy8gZnVuYyBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAKKworCit2b2lkCitfX2ttcF91bnJlZ2lzdGVyX2xpYnJhcnkoIHZvaWQgKSB7CisKKyAgICBjaGFyICogbmFtZSAgPSBfX2ttcF9yZWdfc3RhdHVzX25hbWUoKTsKKyAgICBjaGFyICogdmFsdWUgPSBfX2ttcF9lbnZfZ2V0KCBuYW1lICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyAhPSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgIT0gTlVMTCApOworICAgIGlmICggdmFsdWUgIT0gTlVMTCAmJiBzdHJjbXAoIHZhbHVlLCBfX2ttcF9yZWdpc3RyYXRpb25fc3RyICkgPT0gMCApIHsKKyAgICAgICAgLy8gT2ssIHRoaXMgaXMgb3VyIHZhcmlhYmxlLiBEZWxldGUgaXQuCisgICAgICAgIF9fa21wX2Vudl91bnNldCggbmFtZSApOworICAgIH07IC8vIGlmCisKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfcmVnaXN0cmF0aW9uX3N0ciApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCB2YWx1ZSApOworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBuYW1lICk7CisKKyAgICBfX2ttcF9yZWdpc3RyYXRpb25fZmxhZyA9IDA7CisgICAgX19rbXBfcmVnaXN0cmF0aW9uX3N0ciAgPSBOVUxMOworCit9IC8vIF9fa21wX3VucmVnaXN0ZXJfbGlicmFyeQorCisKKy8vIEVuZCBvZiBMaWJyYXJ5IHJlZ2lzdHJhdGlvbiBzdHVmZi4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorCitzdGF0aWMgdm9pZCBfX2ttcF9jaGVja19taWNfdHlwZSgpCit7CisgICAga21wX2NwdWlkX3QgY3B1aWRfc3RhdGUgPSB7MH07CisgICAga21wX2NwdWlkX3QgKiBjc19wID0gJmNwdWlkX3N0YXRlOworICAgIF9fa21wX3g4Nl9jcHVpZCgxLCAwLCBjc19wKTsKKyAgICAvLyBXZSBkb24ndCBzdXBwb3J0IG1pYzEgYXQgdGhlIG1vbWVudAorICAgIGlmKCAoY3NfcC0+ZWF4ICYgMHhmZjApID09IDB4QjEwICkgeworICAgICAgICBfX2ttcF9taWNfdHlwZSA9IG1pYzI7CisgICAgfSBlbHNlIGlmKCAoY3NfcC0+ZWF4ICYgMHhmMGZmMCkgPT0gMHg1MDY3MCApIHsKKyAgICAgICAgX19rbXBfbWljX3R5cGUgPSBtaWMzOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX21pY190eXBlID0gbm9uX21pYzsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpbnQgaSwgZ3RpZDsKKyAgICBpbnQgc2l6ZTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZW50ZXJcbiIgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfaW50MzIgKSA9PSA0ICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2l6ZW9mKCBrbXBfdWludDMyICkgPT0gNCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX2ludDY0ICkgPT0gOCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemVvZigga21wX3VpbnQ2NCApID09IDggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF9pbnRwdHJfdCApID09IHNpemVvZiggdm9pZCAqICkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfcHJlX2luaXQoKTsKKyNlbmRpZgorCisgICAgX19rbXBfdmFsaWRhdGVfbG9ja3MoKTsKKworICAgIC8qIEluaXRpYWxpemUgaW50ZXJuYWwgbWVtb3J5IGFsbG9jYXRvciAqLworICAgIF9fa21wX2luaXRfYWxsb2NhdG9yKCk7CisKKyAgICAvKiBSZWdpc3RlciB0aGUgbGlicmFyeSBzdGFydHVwIHZpYSBhbiBlbnZpcm9ubWVudCB2YXJpYWJsZQorICAgICAgIGFuZCBjaGVjayB0byBzZWUgd2hldGhlciBhbm90aGVyIGNvcHkgb2YgdGhlIGxpYnJhcnkgaXMgYWxyZWFkeQorICAgICAgIHJlZ2lzdGVyZWQuICovCisKKyAgICBfX2ttcF9yZWdpc3Rlcl9saWJyYXJ5X3N0YXJ0dXAoICk7CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gb2YgbGlicmFyeSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogcmVpbml0aWFsaXphdGlvbiBvZiBsaWJyYXJ5XG4iICkgKTsKKyAgICB9CisKKyAgICBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID0gMDsKKyAgICBUQ1dfU1lOQ180KF9fa21wX2dsb2JhbC5nLmdfZG9uZSwgRkFMU0UpOworCisgICAgLyogaW5pdGlhbGl6ZSB0aGUgbG9ja3MgKi8KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX0RFQlVHX0FEQVBUSVZFX0xPQ0tTCisgICAgX19rbXBfaW5pdF9zcGVjdWxhdGl2ZV9zdGF0cygpOworI2VuZGlmCisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIF9fa21wX2luaXRfdGFzX2xvY2soICYgX19rbXBfc3RhdHNfbG9jayApOworI2VuZGlmCisgICAgX19rbXBfaW5pdF9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrICAgICApOworICAgIF9fa21wX2luaXRfcXVldWluZ19sb2NrKCAmIF9fa21wX2Rpc3BhdGNoX2xvY2sgKTsKKyAgICBfX2ttcF9pbml0X2xvY2soICYgX19rbXBfZGVidWdfbG9jayAgICAgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9jayAgICAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzFpICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMmkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja180aSAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzRyICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfOGkgICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja184ciAgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzhjICApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMTByICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18xNnIgKTsKKyAgICBfX2ttcF9pbml0X2F0b21pY19sb2NrKCAmIF9fa21wX2F0b21pY19sb2NrXzE2YyApOworICAgIF9fa21wX2luaXRfYXRvbWljX2xvY2soICYgX19rbXBfYXRvbWljX2xvY2tfMjBjICk7CisgICAgX19rbXBfaW5pdF9hdG9taWNfbG9jayggJiBfX2ttcF9hdG9taWNfbG9ja18zMmMgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX2Zvcmtqb2luX2xvY2sgICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiBfX2ttcF9leGl0X2xvY2sgICAgICApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICYgX19rbXBfbW9uaXRvcl9sb2NrICAgKTsKKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmIF9fa21wX3RwX2NhY2hlZF9sb2NrICk7CisKKyAgICAvKiBjb25kdWN0IGluaXRpYWxpemF0aW9uIGFuZCBpbml0aWFsIHNldHVwIG9mIGNvbmZpZ3VyYXRpb24gKi8KKworICAgIF9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgX19rbXBfY2hlY2tfbWljX3R5cGUoKTsKKyNlbmRpZgorCisgICAgLy8gU29tZSBnbG9iYWwgdmFyaWFibGUgaW5pdGlhbGl6YXRpb24gbW92ZWQgaGVyZSBmcm9tIGttcF9lbnZfaW5pdGlhbGl6ZSgpCisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2RpYWcgPSAwOworI2VuZGlmCisgICAgX19rbXBfYWJvcnRfZGVsYXkgPSAwOworCisgICAgLy8gRnJvbSBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKQorICAgIC8qIGFzc3VtZSB0aGUgZW50aXJlIG1hY2hpbmUgd2lsbCBiZSB1c2VkICovCisgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIGlmKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGhfdWIgPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKyAgICBfX2ttcF9tYXhfbnRoID0gX19rbXBfc3lzX21heF9udGg7CisKKyAgICAvLyBUaHJlZSB2YXJzIGJlbG93IG1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQkxPQ0tUSU1FIiBwYXJ0CisgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfREVGQVVMVF9CTE9DS1RJTUU7CisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgLy8gRnJvbSAiS01QX0xJQlJBUlkiIHBhcnQgb2YgX19rbXBfZW52X2luaXRpYWxpemUoKQorICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgLy8gRnJvbSBLTVBfU0NIRURVTEUgaW5pdGlhbGl6YXRpb24KKyAgICBfX2ttcF9zdGF0aWMgPSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDsKKyAgICAvLyBBQzogZG8gbm90IHVzZSBhbmFseXRpY2FsIGhlcmUsIGJlY2F1c2UgaXQgaXMgbm9uLW1vbm90b25vdXMKKyAgICAvL19fa21wX2d1aWRlZCA9IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOworICAgIC8vX19rbXBfYXV0byA9IGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDsgLy8gQUM6IGl0IGlzIHRoZSBkZWZhdWx0LCBubyBuZWVkIHRvIHJlcGVhdGUgYXNzaWdubWVudAorICAgIC8vIEJhcnJpZXIgaW5pdGlhbGl6YXRpb24uIE1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIEJhcnJpZXIgYnJhbmNoIGJpdCBjb250cm9sIGFuZCBiYXJyaWVyIG1ldGhvZAorICAgIC8vIGNvbnRyb2wgcGFydHMKKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiICgoaW50KTEpCisgICAgICAgICNkZWZpbmUga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmIgKChpbnQpMSkKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX3BhdCBicF9oeXBlcl9iYXIKKyAgICAgICAgI2RlZmluZSBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfcmVsZWFzZV9wYXQgYnBfaHlwZXJfYmFyCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgZm9yICggaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0cyBbIGkgXSA9IF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBpIF0gPSBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXRfZGZsdDsKKyAgICAgICAgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXRfZGZsdDsKKyAgICAgICAgI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgICAgIGlmKCBpID09IGJzX3JlZHVjdGlvbl9iYXJyaWVyICkgeyAvLyB0ZXN0ZWQgYW5kIGNvbmZpcm1lZCBvbiBBTFRJWCBvbmx5ICggbGluXzY0ICk6IGh5cGVyLDEKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9iYjsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfYmI7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuIFsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQ7CisgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgaSBdID0ga21wX3JlZHVjdGlvbl9iYXJyaWVyX3JlbGVhc2VfcGF0OworICAgICAgICB9CisgICAgICAgICNlbmRpZiAvLyBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgIH0KKyAgICAjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX3BhdAorICAgICAgICAjdW5kZWYga21wX3JlZHVjdGlvbl9iYXJyaWVyX2dhdGhlcl9wYXQKKyAgICAgICAgI3VuZGVmIGttcF9yZWR1Y3Rpb25fYmFycmllcl9yZWxlYXNlX2JiCisgICAgICAgICN1bmRlZiBrbXBfcmVkdWN0aW9uX2JhcnJpZXJfZ2F0aGVyX2JiCisgICAgI2VuZGlmIC8vIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgaWYgKF9fa21wX21pY190eXBlID09IG1pYzIpIHsgLy8gS05DCisgICAgICAgIC8vIEFDOiBwbGFuZT0zLDIsIGZvcmtqb2luPTIsMSBhcmUgb3B0aW1hbCBmb3IgMjQwIHRocmVhZHMgb24gS05DCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgYnNfcGxhaW5fYmFycmllciBdID0gMzsgIC8vIHBsYWluIGdhdGhlcgorICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGJzX2Zvcmtqb2luX2JhcnJpZXIgXSA9IDE7ICAvLyBmb3Jram9pbiByZWxlYXNlCisgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm4gWyBic19mb3Jram9pbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfZm9ya2pvaW5fYmFycmllciBdID0gYnBfaGllcmFyY2hpY2FsX2JhcjsKKyAgICB9CisjaWYgS01QX0ZBU1RfUkVEVUNUSU9OX0JBUlJJRVIKKyAgICBpZiAoX19rbXBfbWljX3R5cGUgPT0gbWljMikgeyAvLyBLTkMKKyAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGJzX3JlZHVjdGlvbl9iYXJyaWVyIF0gPSBicF9oaWVyYXJjaGljYWxfYmFyOworICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfcGF0dGVyblsgYnNfcmVkdWN0aW9uX2JhcnJpZXIgXSA9IGJwX2hpZXJhcmNoaWNhbF9iYXI7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIC8vIEZyb20gS01QX0NIRUNLUyBpbml0aWFsaXphdGlvbgorI2lmZGVmIEtNUF9ERUJVRworICAgIF9fa21wX2Vudl9jaGVja3MgPSBUUlVFOyAgIC8qIGRldmVsb3BtZW50IHZlcnNpb25zIGhhdmUgdGhlIGV4dHJhIGNoZWNrcyAqLworI2Vsc2UKKyAgICBfX2ttcF9lbnZfY2hlY2tzID0gRkFMU0U7ICAvKiBwb3J0IHZlcnNpb25zIGRvIG5vdCBoYXZlIHRoZSBleHRyYSBjaGVja3MgKi8KKyNlbmRpZgorCisgICAgLy8gRnJvbSAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiBpbml0aWFsaXphdGlvbgorICAgIF9fa21wX2ZvcmVpZ25fdHAgPSBUUlVFOworCisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljID0gRkFMU0U7CisgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2RlZmF1bHQ7CisKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggTlVMTCApOworCisgICAgLy8gUHJpbnQgYWxsIG1lc3NhZ2VzIGluIG1lc3NhZ2UgY2F0YWxvZyBmb3IgdGVzdGluZyBwdXJwb3Nlcy4KKyAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIGNoYXIgY29uc3QgKiB2YWwgPSBfX2ttcF9lbnZfZ2V0KCAiS01QX0RVTVBfQ0FUQUxPRyIgKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggdmFsICkgKSB7CisgICAgICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBidWZmZXIgKTsKKyAgICAgICAgICAgIF9fa21wX2kxOG5fZHVtcF9jYXRhbG9nKCAmIGJ1ZmZlciApOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiJXMiLCBidWZmZXIuc3RyICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgYnVmZmVyICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIF9fa21wX2Vudl9mcmVlKCAmIHZhbCApOworICAgICNlbmRpZgorCisgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgIC8vIE1vdmVkIGhlcmUgZnJvbSBfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpICJLTVBfQUxMX1RIUkVBRFBSSVZBVEUiIHBhcnQKKyAgICBfX2ttcF90cF9jYXBhY2l0eSA9IF9fa21wX2RlZmF1bHRfdHBfY2FwYWNpdHkoX19rbXBfZGZsdF90ZWFtX250aF91YiwgX19rbXBfbWF4X250aCwgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCk7CisKKyAgICAvLyBJZiB0aGUgbGlicmFyeSBpcyBzaHV0IGRvd24gcHJvcGVybHksIGJvdGggcG9vbHMgbXVzdCBiZSBOVUxMLiBKdXN0IGluIGNhc2UsIHNldCB0aGVtCisgICAgLy8gdG8gTlVMTCAtLSBzb21lIG1lbW9yeSBtYXkgbGVhaywgYnV0IHN1YnNlcXVlbnQgY29kZSB3aWxsIHdvcmsgZXZlbiBpZiBwb29scyBhcmUgbm90IGZyZWVkLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZF9wb29sID09IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90aHJlYWRfcG9vbF9pbnNlcnRfcHQgPT0gTlVMTCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RlYW1fcG9vbCAgID09IE5VTEwgKTsKKyAgICBfX2ttcF90aHJlYWRfcG9vbCA9IE5VTEw7CisgICAgX19rbXBfdGhyZWFkX3Bvb2xfaW5zZXJ0X3B0ID0gTlVMTDsKKyAgICBfX2ttcF90ZWFtX3Bvb2wgICA9IE5VTEw7CisKKyAgICAvKiBBbGxvY2F0ZSBhbGwgb2YgdGhlIHZhcmlhYmxlIHNpemVkIHJlY29yZHMgKi8KKyAgICAvKiBOT1RFOiBfX2ttcF90aHJlYWRzX2NhcGFjaXR5IGVudHJpZXMgYXJlIGFsbG9jYXRlZCwgYnV0IHRoZSBhcnJheXMgYXJlIGV4cGFuZGFibGUgKi8KKyAgICAvKiBTaW5jZSBhbGxvY2F0aW9uIGlzIGNhY2hlLWFsaWduZWQsIGp1c3QgYWRkIGV4dHJhIHBhZGRpbmcgYXQgdGhlIGVuZCAqLworICAgIHNpemUgPSAoc2l6ZW9mKGttcF9pbmZvX3QqKSArIHNpemVvZihrbXBfcm9vdF90KikpKl9fa21wX3RocmVhZHNfY2FwYWNpdHkgKyBDQUNIRV9MSU5FOworICAgIF9fa21wX3RocmVhZHMgPSAoa21wX2luZm9fdCoqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZSApOworICAgIF9fa21wX3Jvb3QgICAgPSAoa21wX3Jvb3RfdCoqKSAoKGNoYXIqKV9fa21wX3RocmVhZHMgKyBzaXplb2Yoa21wX2luZm9fdCopICogX19rbXBfdGhyZWFkc19jYXBhY2l0eSApOworCisgICAgLyogaW5pdCB0aHJlYWQgY291bnRzICovCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfYWxsX250aCA9PSAwICk7IC8vIEFzc2VydHMgZmFpbCBpZiB0aGUgbGlicmFyeSBpcyByZWluaXRpYWxpemluZyBhbmQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9udGggPT0gMCApOyAgICAgLy8gc29tZXRoaW5nIHdhcyB3cm9uZyBpbiB0ZXJtaW5hdGlvbi4KKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBfX2ttcF9udGggICAgID0gMDsKKworICAgIC8qIHNldHVwIHRoZSB1YmVyIG1hc3RlciB0aHJlYWQgYW5kIGhpZXJhcmNoeSAqLworICAgIGd0aWQgPSBfX2ttcF9yZWdpc3Rlcl9yb290KCBUUlVFICk7CisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplICBUIyVkXG4iLCBndGlkICkpOworICAgIEtNUF9BU1NFUlQoIEtNUF9VQkVSX0dUSUQoIGd0aWQgKSApOworICAgIEtNUF9BU1NFUlQoIEtNUF9JTklUSUFMX0dUSUQoIGd0aWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBfX2ttcF9jb21tb25faW5pdGlhbGl6ZSgpOworCisgICAgI2lmIEtNUF9PU19VTklYCisgICAgICAgIC8qIGludm9rZSB0aGUgY2hpbGQgZm9yayBoYW5kbGVyICovCisgICAgICAgIF9fa21wX3JlZ2lzdGVyX2F0Zm9yaygpOworICAgICNlbmRpZgorCisgICAgI2lmICEgZGVmaW5lZCBLTVBfRFlOQU1JQ19MSUIKKyAgICAgICAgeworICAgICAgICAgICAgLyogSW52b2tlIHRoZSBleGl0IGhhbmRsZXIgd2hlbiB0aGUgcHJvZ3JhbSBmaW5pc2hlcywgb25seSBmb3Igc3RhdGljIGxpYnJhcnkuCisgICAgICAgICAgICAgICBGb3IgZHluYW1pYyBsaWJyYXJ5LCB3ZSBhbHJlYWR5IGhhdmUgX2ZpbmkgYW5kIERsbE1haW4uCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCByYyA9IGF0ZXhpdCggX19rbXBfaW50ZXJuYWxfZW5kX2F0ZXhpdCApOworICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX2ZhdGFsLCBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiYXRleGl0KCkiICksIEtNUF9FUlIoIHJjICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICAjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgICAgICNpZiBLTVBfT1NfVU5JWAorICAgICAgICAgICAgLyogTk9URTogbWFrZSBzdXJlIHRoYXQgdGhpcyBpcyBjYWxsZWQgYmVmb3JlIHRoZSB1c2VyIGluc3RhbGxzCisgICAgICAgICAgICAgKiAgICAgICAgICB0aGVpciBvd24gc2lnbmFsIGhhbmRsZXJzIHNvIHRoYXQgdGhlIHVzZXIgaGFuZGxlcnMKKyAgICAgICAgICAgICAqICAgICAgICAgIGFyZSBjYWxsZWQgZmlyc3QuICB0aGlzIHdheSB0aGV5IGNhbiByZXR1cm4gZmFsc2UsCisgICAgICAgICAgICAgKiAgICAgICAgICBub3QgY2FsbCBvdXIgaGFuZGxlciwgYXZvaWQgdGVybWluYXRpbmcgdGhlIGxpYnJhcnksCisgICAgICAgICAgICAgKiAgICAgICAgICBhbmQgY29udGludWUgZXhlY3V0aW9uIHdoZXJlIHRoZXkgbGVmdCBvZmYuICovCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIEZBTFNFICk7CisgICAgICAgICNlbmRpZiAvKiBLTVBfT1NfVU5JWCAqLworICAgICAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggVFJVRSApOworICAgICAgICAjZW5kaWYgLyogS01QX09TX1dJTkRPV1MgKi8KKyAgICAjZW5kaWYKKworICAgIC8qIHdlIGhhdmUgZmluaXNoZWQgdGhlIHNlcmlhbCBpbml0aWFsaXphdGlvbiAqLworICAgIF9fa21wX2luaXRfY291bnRlciArKzsKKworICAgIF9fa21wX2luaXRfc2VyaWFsID0gVFJVRTsKKworICAgIGlmIChfX2ttcF9zZXR0aW5ncykgeworICAgICAgICBfX2ttcF9lbnZfcHJpbnQoKTsKKyAgICB9CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGlmIChfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludF8yKCk7CisgICAgfQorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBvbXB0X3Bvc3RfaW5pdCgpOworI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX3NlcmlhbF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfc2VyaWFsICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X3NlcmlhbCApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19zZXJpYWxfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSggdm9pZCApCit7CisgICAgaW50IGksIGo7CisgICAgaW50IHByZXZfZGZsdF90ZWFtX250aDsKKworICAgIGlmKCAhX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX21pZGRsZV9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisKKyAgICAvLworICAgIC8vIFNhdmUgdGhlIHByZXZpb3VzIHZhbHVlIGZvciB0aGUgX19rbXBfZGZsdF90ZWFtX250aCBzbyB0aGF0CisgICAgLy8gd2UgY2FuIGF2b2lkIHNvbWUgcmVpbml0aWFsaXphdGlvbiBpZiBpdCBoYXNuJ3QgY2hhbmdlZC4KKyAgICAvLworICAgIHByZXZfZGZsdF90ZWFtX250aCA9IF9fa21wX2RmbHRfdGVhbV9udGg7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKCkgd2lsbCB0cnkgdG8gc2V0IF9fa21wX25jb3JlcyB0byB0aGUKKyAgICAvLyBudW1iZXIgb2YgY29yZXMgb24gdGhlIG1hY2hpbmUuCisgICAgLy8KKyAgICBfX2ttcF9hZmZpbml0eV9pbml0aWFsaXplKCk7CisKKyAgICAvLworICAgIC8vIFJ1biB0aHJvdWdoIHRoZSBfX2ttcF90aHJlYWRzIGFycmF5IGFuZCBzZXQgdGhlIGFmZmluaXR5IG1hc2sKKyAgICAvLyBmb3IgZWFjaCByb290IHRocmVhZCB0aGF0IGlzIGN1cnJlbnRseSByZWdpc3RlcmVkIHdpdGggdGhlIFJUTC4KKyAgICAvLworICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgaSsrICkgeworICAgICAgICBpZiAoIFRDUl9QVFIoIF9fa21wX3RocmVhZHNbIGkgXSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9zZXRfaW5pdF9tYXNrKCBpLCBUUlVFICk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworCisgICAgS01QX0FTU0VSVCggX19rbXBfeHByb2MgPiAwICk7CisgICAgaWYgKCBfX2ttcF9hdmFpbF9wcm9jID09IDAgKSB7CisgICAgICAgIF9fa21wX2F2YWlsX3Byb2MgPSBfX2ttcF94cHJvYzsKKyAgICB9CisKKyAgICAvLyBJZiB0aGVyZSB3ZXJlIGVtcHR5IHBsYWNlcyBpbiBudW1fdGhyZWFkcyBsaXN0IChPTVBfTlVNX1RIUkVBRFM9LCwyLDMpLCBjb3JyZWN0IHRoZW0gbm93CisgICAgaiA9IDA7CisgICAgd2hpbGUgKCAoIGogPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSAmJiAhIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9udGgubnRoWyBqIF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIGorKzsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2RmbHRfdGVhbV9udGggPT0gMCApIHsKKyNpZmRlZiBLTVBfREZMVF9OVEhfQ09SRVMKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNjb3JlcworICAgICAgICAvLworICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfbmNvcmVzOworICAgICAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IHNldHRpbmcgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25jb3JlcyAoJWQpXG4iLAorICAgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggKSApOworI2Vsc2UKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRGVmYXVsdCAjdGhyZWFkcyA9ICNhdmFpbGFibGUgT1MgcHJvY3MKKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX2F2YWlsX3Byb2M7CisgICAgICAgIEtBX1RSQUNFKCAyMCwgKCJfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZTogc2V0dGluZyBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfYXZhaWxfcHJvYyglZClcbiIsCisgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCApICk7CisjZW5kaWYgLyogS01QX0RGTFRfTlRIX0NPUkVTICovCisgICAgfQorCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIF9fa21wX2RmbHRfdGVhbV9udGggPSBLTVBfTUlOX05USDsKKyAgICB9CisgICAgaWYoIF9fa21wX2RmbHRfdGVhbV9udGggPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX3N5c19tYXhfbnRoOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUncyBubyBoYXJtIGluIGNvbnRpbnVpbmcgaWYgdGhlIGZvbGxvd2luZyBjaGVjayBmYWlscywKKyAgICAvLyBidXQgaXQgaW5kaWNhdGVzIGFuIGVycm9yIGluIHRoZSBwcmV2aW91cyBsb2dpYy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2RmbHRfdGVhbV9udGggPD0gX19rbXBfZGZsdF90ZWFtX250aF91YiApOworCisgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoICE9IHByZXZfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUnVuIHRocm91Z2ggdGhlIF9fa21wX3RocmVhZHMgYXJyYXkgYW5kIHNldCB0aGUgbnVtIHRocmVhZHMgaWN2CisgICAgICAgIC8vIGZvciBlYWNoIHJvb3QgdGhyZWFkIHRoYXQgaXMgY3VycmVudGx5IHJlZ2lzdGVyZWQgd2l0aCB0aGUgUlRMCisgICAgICAgIC8vICh3aGljaCBoYXMgbm90IGFscmVhZHkgZXhwbGljaXRseSBzZXQgaXRzIG50aHJlYWRzLXZhciB3aXRoIGEKKyAgICAgICAgLy8gY2FsbCB0byBvbXBfc2V0X251bV90aHJlYWRzKCkpLgorICAgICAgICAvLworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3RocmVhZHNfY2FwYWNpdHk7IGkrKyApIHsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IF9fa21wX3RocmVhZHNbIGkgXTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkID09IE5VTEwgKSBjb250aW51ZTsKKyAgICAgICAgICAgIGlmICggdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMubnByb2MgIT0gMCApIGNvbnRpbnVlOworCisgICAgICAgICAgICBzZXRfX25wcm9jKCBfX2ttcF90aHJlYWRzWyBpIF0sIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfbWlkZGxlX2luaXRpYWxpemU6IGZpbmFsIHZhbHVlIGZvciBfX2ttcF9kZmx0X3RlYW1fbnRoID0gJWRcbiIsCisgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoKSApOworCisjaWZkZWYgS01QX0FESlVTVF9CTE9DS1RJTUUKKyAgICAvKiBBZGp1c3QgYmxvY2t0aW1lIHRvIHplcm8gaWYgbmVjZXNzYXJ5ICovCisgICAgLyogbm93IHRoYXQgX19rbXBfYXZhaWxfcHJvYyBpcyBzZXQgICAgICAqLworICAgIGlmICggIV9fa21wX2Vudl9ibG9ja3RpbWUgJiYgKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hdmFpbF9wcm9jID4gMCApOworICAgICAgICBpZiAoIF9fa21wX250aCA+IF9fa21wX2F2YWlsX3Byb2MgKSB7CisgICAgICAgICAgICBfX2ttcF96ZXJvX2J0ID0gVFJVRTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgLyogd2UgaGF2ZSBmaW5pc2hlZCBtaWRkbGUgaW5pdGlhbGl6YXRpb24gKi8KKyAgICBUQ1dfU1lOQ180KF9fa21wX2luaXRfbWlkZGxlLCBUUlVFKTsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZTogZXhpdFxuIiApICk7Cit9CisKK3ZvaWQKK19fa21wX21pZGRsZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiAoIF9fa21wX2luaXRfbWlkZGxlICkgeworICAgICAgICByZXR1cm47CisgICAgfQorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisgICAgaWYgKCBfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9kb19taWRkbGVfaW5pdGlhbGl6ZSgpOworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKK3ZvaWQKK19fa21wX3BhcmFsbGVsX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOyAgICAgIC8vIHRoaXMgbWlnaHQgYmUgYSBuZXcgcm9vdAorCisgICAgLyogc3luY2hyb25pemUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gKGZvciBzaWJsaW5nKSAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHJldHVybjsKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsgcmV0dXJuOyB9CisKKyAgICAvKiBUT0RPIHJlaW5pdGlhbGl6YXRpb24gYWZ0ZXIgd2UgaGF2ZSBhbHJlYWR5IHNodXQgZG93biAqLworICAgIGlmKCBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcGFyYWxsZWxfaW5pdGlhbGl6ZTogYXR0ZW1wdCB0byBpbml0IHdoaWxlIHNodXR0aW5nIGRvd25cbiIgKSApOworICAgICAgICBfX2ttcF9pbmZpbml0ZV9sb29wKCk7CisgICAgfQorCisgICAgLyogamM6IFRoZSBsb2NrIF9fa21wX2luaXR6X2xvY2sgaXMgYWxyZWFkeSBoZWxkLCBzbyBjYWxsaW5nIF9fa21wX3NlcmlhbF9pbml0aWFsaXplCisgICAgICAgICAgIHdvdWxkIGNhdXNlIGEgZGVhZGxvY2suICBTbyB3ZSBjYWxsIF9fa21wX2RvX3NlcmlhbF9pbml0aWFsaXplIGRpcmVjdGx5LgorICAgICovCisgICAgaWYoICFfX2ttcF9pbml0X21pZGRsZSApIHsKKyAgICAgICAgX19rbXBfZG9fbWlkZGxlX2luaXRpYWxpemUoKTsKKyAgICB9CisKKyAgICAvKiBiZWdpbiBpbml0aWFsaXphdGlvbiAqLworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBlbnRlclxuIiApICk7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTYXZlIHRoZSBGUCBjb250cm9sIHJlZ3MuCisgICAgLy8gV29ya2VyIHRocmVhZHMgd2lsbCBzZXQgdGhlaXJzIHRvIHRoZXNlIHZhbHVlcyBhdCB0aHJlYWQgc3RhcnR1cC4KKyAgICAvLworICAgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCAmX19rbXBfaW5pdF94ODdfZnB1X2NvbnRyb2xfd29yZCApOworICAgIF9fa21wX3N0b3JlX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworICAgIF9fa21wX2luaXRfbXhjc3IgJj0gS01QX1g4Nl9NWENTUl9NQVNLOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmIEtNUF9PU19VTklYCisjIGlmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIC8qICBtdXN0IGJlIGFmdGVyIF9fa21wX3NlcmlhbF9pbml0aWFsaXplICAqLworICAgIF9fa21wX2luc3RhbGxfc2lnbmFscyggVFJVRSApOworIyBlbmRpZgorI2VuZGlmCisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoKTsKKworI2lmIGRlZmluZWQoVVNFX0xPQURfQkFMQU5DRSkKKyAgICBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfZGVmYXVsdCApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2xvYWRfYmFsYW5jZTsKKyAgICB9CisjZWxzZQorICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPT0gZHluYW1pY19kZWZhdWx0ICkgeworICAgICAgICBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0OworICAgIH0KKyNlbmRpZgorCisgICAgaWYgKCBfX2ttcF92ZXJzaW9uICkgeworICAgICAgICBfX2ttcF9wcmludF92ZXJzaW9uXzIoKTsKKyAgICB9CisKKyAgICAvKiB3ZSBoYXZlIGZpbmlzaGVkIHBhcmFsbGVsIGluaXRpYWxpemF0aW9uICovCisgICAgVENXX1NZTkNfNChfX2ttcF9pbml0X3BhcmFsbGVsLCBUUlVFKTsKKworICAgIEtNUF9NQigpOworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9wYXJhbGxlbF9pbml0aWFsaXplOiBleGl0XG4iICkgKTsKKworICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX3J1bl9iZWZvcmVfaW52b2tlZF90YXNrKCBpbnQgZ3RpZCwgaW50IHRpZCwga21wX2luZm9fdCAqdGhpc190aHIsCisgIGttcF90ZWFtX3QgKnRlYW0gKQoreworICAgIGttcF9kaXNwX3QgKmRpc3BhdGNoOworCisgICAgS01QX01CKCk7CisKKyAgICAvKiBub25lIG9mIHRoZSB0aHJlYWRzIGhhdmUgZW5jb3VudGVyZWQgYW55IGNvbnN0cnVjdHMsIHlldC4gKi8KKyAgICB0aGlzX3Roci0+dGgudGhfbG9jYWwudGhpc19jb25zdHJ1Y3QgPSAwOworI2lmIEtNUF9DQUNIRV9NQU5BR0UKKyAgICBLTVBfQ0FDSEVfUFJFRkVUQ0goICZ0aGlzX3Roci0+dGgudGhfYmFyWyBic19mb3Jram9pbl9iYXJyaWVyIF0uYmIuYl9hcnJpdmVkICk7CisjZW5kaWYgLyogS01QX0NBQ0hFX01BTkFHRSAqLworICAgIGRpc3BhdGNoID0gKGttcF9kaXNwX3QgKilUQ1JfUFRSKHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZGlzcGF0Y2ggKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcGF0Y2ggKTsKKyAgICAvL0tNUF9ERUJVR19BU1NFUlQoIHRoaXNfdGhyLT50aC50aF9kaXNwYXRjaCA9PSAmdGVhbS0+dC50X2Rpc3BhdGNoWyB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc190aWQgXSApOworCisgICAgZGlzcGF0Y2gtPnRoX2Rpc3BfaW5kZXggPSAwOyAgICAvKiByZXNldCB0aGUgZGlzcGF0Y2ggYnVmZmVyIGNvdW50ZXIgKi8KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGRpc3BhdGNoLT50aF9kb2Fjcm9zc19idWZfaWR4ID0gMDsgLyogcmVzZXQgdGhlIGRvYWNyb3NzIGRpc3BhdGNoIGJ1ZmZlciBjb3VudGVyICovCisjZW5kaWYKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcHVzaF9wYXJhbGxlbCggZ3RpZCwgdGVhbS0+dC50X2lkZW50ICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKwordm9pZAorX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggaW50IGd0aWQsIGludCB0aWQsIGttcF9pbmZvX3QgKnRoaXNfdGhyLAorICBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBpZiggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgX19rbXBfcG9wX3BhcmFsbGVsKCBndGlkLCB0ZWFtLT50LnRfaWRlbnQgKTsKK30KKworaW50CitfX2ttcF9pbnZva2VfdGFza19mdW5jKCBpbnQgZ3RpZCApCit7CisgICAgaW50ICAgICAgICAgIHJjOworICAgIGludCAgICAgICAgICB0aWQgICAgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfaW5mb190ICAqdGhpc190aHIgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3RlYW1fdCAgKnRlYW0gICAgID0gdGhpc190aHItPnRoLnRoX3RlYW07CisKKyAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBpZiAoIF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGVfcHRyICkgeworICAgICAgICBfX2ttcF9pdHRfc3RhY2tfY2FsbGVlX2VudGVyKCAoX19pdHRfY2FsbGVyKXRlYW0tPnQudF9zdGFja19pZCApOyAvLyBpbmZvcm0gaXR0bm90aWZ5IGFib3V0IGVudGVyaW5nIHVzZXIncyBjb2RlCisgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0lOVk9LSU5HKCk7CisjZW5kaWYKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIHZvaWQgKmR1bW15OworICAgIHZvaWQgKipleGl0X3J1bnRpbWVfcDsKKyAgICBvbXB0X3Rhc2tfaWRfdCBteV90YXNrX2lkOworICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKworICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgZXhpdF9ydW50aW1lX3AgPSAmKHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0uCisgICAgICAgICAgICBvbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUpOworICAgIH0gZWxzZSB7CisgICAgICAgIGV4aXRfcnVudGltZV9wID0gJmR1bW15OworICAgIH0KKworI2lmIE9NUFRfVFJBQ0UKKyAgICBteV90YXNrX2lkID0gdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgIG15X3BhcmFsbGVsX2lkID0gdGVhbS0+dC5vbXB0X3RlYW1faW5mby5wYXJhbGxlbF9pZDsKKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbikoCisgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgfQorI2VuZGlmCisjZW5kaWYKKworICAgIHsKKyAgICAgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3BhcmFsbGVsKTsKKyAgICAgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soSU1QTElDSVRfVEFTSyk7CisgICAgICAgIHJjID0gX19rbXBfaW52b2tlX21pY3JvdGFzayggKG1pY3JvdGFza190KSBUQ1JfU1lOQ19QVFIodGVhbS0+dC50X3BrZm4pLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRpZCwgKGludCkgdGVhbS0+dC50X2FyZ2MsICh2b2lkICoqKSB0ZWFtLT50LnRfYXJndgorI2lmIE9NUFRfU1VQUE9SVAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICwgZXhpdF9ydW50aW1lX3AKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgfQorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIGlmICggX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgKSB7CisgICAgICAgIF9fa21wX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoIChfX2l0dF9jYWxsZXIpdGVhbS0+dC50X3N0YWNrX2lkICk7IC8vIGluZm9ybSBpdHRub3RpZnkgYWJvdXQgbGVhdmluZyB1c2VyJ3MgY29kZQorICAgIH0KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgX19rbXBfcnVuX2FmdGVyX2ludm9rZWRfdGFzayggZ3RpZCwgdGlkLCB0aGlzX3RociwgdGVhbSApOworCisgICAgcmV0dXJuIHJjOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX3RlYW1zX21hc3RlciggaW50IGd0aWQgKQoreworICAgIC8vIFRoaXMgcm91dGluZSBpcyBjYWxsZWQgYnkgYWxsIG1hc3RlciB0aHJlYWRzIGluIHRlYW1zIGNvbnN0cnVjdAorICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyLT50aC50aF90ZWFtOworICAgIGlkZW50X3QgICAgICpsb2MgPSAgdGVhbS0+dC50X2lkZW50OworICAgIHRoci0+dGgudGhfc2V0X25wcm9jID0gdGhyLT50aC50aF90ZWFtc19zaXplLm50aDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoci0+dGgudGhfc2V0X25wcm9jICk7CisgICAgS0FfVFJBQ0UoIDIwLCAoIl9fa21wX3RlYW1zX21hc3RlcjogVCMlZCwgVGlkICVkLCBtaWNyb3Rhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApLCB0aHItPnRoLnRoX3RlYW1zX21pY3JvdGFzayApICk7CisgICAgLy8gTGF1bmNoIGxlYWd1ZSBvZiB0ZWFtcyBub3csIGJ1dCBub3QgbGV0IHdvcmtlcnMgZXhlY3V0ZQorICAgIC8vICh0aGV5IGhhbmcgb24gZm9yayBiYXJyaWVyIHVudGlsIG5leHQgcGFyYWxsZWwpCisjaWYgSU5DTFVERV9TU0NfTUFSS1MKKyAgICBTU0NfTUFSS19GT1JLSU5HKCk7CisjZW5kaWYKKyAgICBfX2ttcF9mb3JrX2NhbGwoIGxvYywgZ3RpZCwgZm9ya19jb250ZXh0X2ludGVsLAorICAgICAgICAgICAgdGVhbS0+dC50X2FyZ2MsCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAodm9pZCAqKXRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrLCAgICAgIC8vICJ1bndyYXBwZWQiIHRhc2sKKyNlbmRpZgorICAgICAgICAgICAgKG1pY3JvdGFza190KXRoci0+dGgudGhfdGVhbXNfbWljcm90YXNrLCAvLyAid3JhcHBlZCIgdGFzaworICAgICAgICAgICAgVk9MQVRJTEVfQ0FTVChsYXVuY2hfdCkgX19rbXBfaW52b2tlX3Rhc2tfZnVuYywKKyAgICAgICAgICAgIE5VTEwgKTsKKyNpZiBJTkNMVURFX1NTQ19NQVJLUworICAgIFNTQ19NQVJLX0pPSU5JTkcoKTsKKyNlbmRpZgorCisgICAgLy8gQUM6IGxhc3QgcGFyYW1ldGVyICIxIiBlbGltaW5hdGVzIGpvaW4gYmFycmllciB3aGljaCB3b24ndCB3b3JrIGJlY2F1c2UKKyAgICAvLyB3b3JrZXIgdGhyZWFkcyBhcmUgaW4gYSBmb3JrIGJhcnJpZXIgd2FpdGluZyBmb3IgbW9yZSBwYXJhbGxlbCByZWdpb25zCisgICAgX19rbXBfam9pbl9jYWxsKCBsb2MsIGd0aWQKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICAgICAgLCBmb3JrX2NvbnRleHRfaW50ZWwKKyNlbmRpZgorICAgICAgICAsIDEgKTsKK30KKworaW50CitfX2ttcF9pbnZva2VfdGVhbXNfbWFzdGVyKCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgICp0ZWFtICAgICA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICNpZiBLTVBfREVCVUcKKyAgICBpZiAoICFfX2ttcF90aHJlYWRzW2d0aWRdLT4gdGgudGhfdGVhbS0+dC50X3NlcmlhbGl6ZWQgKQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodm9pZCopX19rbXBfdGhyZWFkc1tndGlkXS0+IHRoLnRoX3RlYW0tPnQudF9wa2ZuID09ICh2b2lkKilfX2ttcF90ZWFtc19tYXN0ZXIgKTsKKyAgICAjZW5kaWYKKyAgICBfX2ttcF9ydW5fYmVmb3JlX2ludm9rZWRfdGFzayggZ3RpZCwgMCwgdGhpc190aHIsIHRlYW0gKTsKKyAgICBfX2ttcF90ZWFtc19tYXN0ZXIoIGd0aWQgKTsKKyAgICBfX2ttcF9ydW5fYWZ0ZXJfaW52b2tlZF90YXNrKCBndGlkLCAwLCB0aGlzX3RociwgdGVhbSApOworICAgIHJldHVybiAxOworfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKy8qIHRoaXMgc2V0cyB0aGUgcmVxdWVzdGVkIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24KKyAqIGVuY291bnRlcmVkIGJ5IHRoaXMgdGVhbSAqLworLyogc2luY2UgdGhpcyBzaG91bGQgYmUgZW5jbG9zZWQgaW4gdGhlIGZvcmtqb2luIGNyaXRpY2FsIHNlY3Rpb24gaXQKKyAqIHNob3VsZCBhdm9pZCByYWNlIGNvbmRpdGlvbnMgd2l0aCBhc3N5bW1ldHJpY2FsIG5lc3RlZCBwYXJhbGxlbGlzbSAqLworCit2b2lkCitfX2ttcF9wdXNoX251bV90aHJlYWRzKCBpZGVudF90ICppZCwgaW50IGd0aWQsIGludCBudW1fdGhyZWFkcyApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKworICAgIGlmKCBudW1fdGhyZWFkcyA+IDAgKQorICAgICAgICB0aHItPnRoLnRoX3NldF9ucHJvYyA9IG51bV90aHJlYWRzOworfQorCisjaWYgT01QXzQwX0VOQUJMRUQKKworLyogdGhpcyBzZXRzIHRoZSByZXF1ZXN0ZWQgbnVtYmVyIG9mIHRlYW1zIGZvciB0aGUgdGVhbXMgcmVnaW9uIGFuZC9vcgorICogdGhlIG51bWJlciBvZiB0aHJlYWRzIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gZW5jb3VudGVyZWQgICovCit2b2lkCitfX2ttcF9wdXNoX251bV90ZWFtcyggaWRlbnRfdCAqaWQsIGludCBndGlkLCBpbnQgbnVtX3RlYW1zLCBpbnQgbnVtX3RocmVhZHMgKQoreworICAgIGttcF9pbmZvX3QgKnRociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1fdGVhbXMgPj0gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1fdGhyZWFkcyA+PSAwKTsKKworICAgIGlmKCBudW1fdGVhbXMgPT0gMCApCisgICAgICAgIG51bV90ZWFtcyA9IDE7ICAgIC8vIGRlZmF1bHQgbnVtYmVyIG9mIHRlYW1zIGlzIDEuCisgICAgaWYoIG51bV90ZWFtcyA+IF9fa21wX21heF9udGggKSB7IC8vIGlmIHRvbyBtYW55IHRlYW1zIHJlcXVlc3RlZD8KKyAgICAgICAgaWYgKCAhX19rbXBfcmVzZXJ2ZV93YXJuICkgeworICAgICAgICAgICAgX19rbXBfcmVzZXJ2ZV93YXJuID0gMTsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Rm9ybVRoclRlYW0sIG51bV90ZWFtcywgX19rbXBfbWF4X250aCApLAorICAgICAgICAgICAgICAgIEtNUF9ITlQoIFVuc2V0X0FMTF9USFJFQURTICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgbnVtX3RlYW1zID0gX19rbXBfbWF4X250aDsKKyAgICB9CisgICAgLy8gU2V0IG51bWJlciBvZiB0ZWFtcyAobnVtYmVyIG9mIHRocmVhZHMgaW4gdGhlIG91dGVyICJwYXJhbGxlbCIgb2YgdGhlIHRlYW1zKQorICAgIHRoci0+dGgudGhfc2V0X25wcm9jID0gdGhyLT50aC50aF90ZWFtc19zaXplLm50ZWFtcyA9IG51bV90ZWFtczsKKworICAgIC8vIFJlbWVtYmVyIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmb3IgaW5uZXIgcGFyYWxsZWwgcmVnaW9ucworICAgIGlmKCBudW1fdGhyZWFkcyA9PSAwICkgeworICAgICAgICBpZiggIVRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApCisgICAgICAgICAgICBfX2ttcF9taWRkbGVfaW5pdGlhbGl6ZSgpOyAgLy8gZ2V0IF9fa21wX2F2YWlsX3Byb2MgY2FsY3VsYXRlZAorICAgICAgICBudW1fdGhyZWFkcyA9IF9fa21wX2F2YWlsX3Byb2MgLyBudW1fdGVhbXM7CisgICAgICAgIGlmKCBudW1fdGVhbXMgKiBudW1fdGhyZWFkcyA+IF9fa21wX21heF9udGggKSB7CisgICAgICAgICAgICAvLyBhZGp1c3QgbnVtX3RocmVhZHMgdy9vIHdhcm5pbmcgYXMgaXQgaXMgbm90IHVzZXIgc2V0dGluZworICAgICAgICAgICAgbnVtX3RocmVhZHMgPSBfX2ttcF9tYXhfbnRoIC8gbnVtX3RlYW1zOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYoIG51bV90ZWFtcyAqIG51bV90aHJlYWRzID4gX19rbXBfbWF4X250aCApIHsKKyAgICAgICAgICAgIGludCBuZXdfdGhyZWFkcyA9IF9fa21wX21heF9udGggLyBudW1fdGVhbXM7CisgICAgICAgICAgICBpZiAoICFfX2ttcF9yZXNlcnZlX3dhcm4gKSB7IC8vIHVzZXIgYXNrZWQgZm9yIHRvbyBtYW55IHRocmVhZHMKKyAgICAgICAgICAgICAgICBfX2ttcF9yZXNlcnZlX3dhcm4gPSAxOyAgLy8gdGhhdCBjb25mbGljdHMgd2l0aCBPTVBfVEhSRUFEX0xJTUlUCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEZvcm1UaHJUZWFtLCBudW1fdGhyZWFkcywgbmV3X3RocmVhZHMgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggVW5zZXRfQUxMX1RIUkVBRFMgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgbnVtX3RocmVhZHMgPSBuZXdfdGhyZWFkczsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aHItPnRoLnRoX3RlYW1zX3NpemUubnRoID0gbnVtX3RocmVhZHM7Cit9CisKKworLy8KKy8vIFNldCB0aGUgcHJvY19iaW5kIHZhciB0byB1c2UgaW4gdGhlIGZvbGxvd2luZyBwYXJhbGxlbCByZWdpb24uCisvLwordm9pZAorX19rbXBfcHVzaF9wcm9jX2JpbmQoIGlkZW50X3QgKmlkLCBpbnQgZ3RpZCwga21wX3Byb2NfYmluZF90IHByb2NfYmluZCApCit7CisgICAga21wX2luZm9fdCAqdGhyID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICB0aHItPnRoLnRoX3NldF9wcm9jX2JpbmQgPSBwcm9jX2JpbmQ7Cit9CisKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisvKiBMYXVuY2ggdGhlIHdvcmtlciB0aHJlYWRzIGludG8gdGhlIG1pY3JvdGFzay4gKi8KKwordm9pZAorX19rbXBfaW50ZXJuYWxfZm9yayggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZjsKKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRlYW0gKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKKyAgICBLTVBfQVNTRVJUKCAgICAgICBLTVBfTUFTVEVSX0dUSUQoZ3RpZCkgKTsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIHRlYW0tPnQudF9jb25zdHJ1Y3QgPSAwOyAgICAgICAgICAvKiBubyBzaW5nbGUgZGlyZWN0aXZlcyBzZWVuIHlldCAqLworICAgIHRlYW0tPnQudF9vcmRlcmVkLmR0LnRfdmFsdWUgPSAwOyAvKiB0aHJlYWQgMCBlbnRlcnMgdGhlIG9yZGVyZWQgc2VjdGlvbiBmaXJzdCAqLworCisgICAgLyogUmVzZXQgdGhlIGlkZW50aWZpZXJzIG9uIHRoZSBkaXNwYXRjaCBidWZmZXIgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfZGlzcF9idWZmZXIgKTsKKyAgICBpZiAoIHRlYW0tPnQudF9tYXhfbnByb2MgPiAxICkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8ICBfX2ttcF9kaXNwYXRjaF9udW1fYnVmZmVyczsgKytpKSB7CisgICAgICAgICAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXJbIGkgXS5idWZmZXJfaW5kZXggPSBpOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgICAgICAgICB0ZWFtLT50LnRfZGlzcF9idWZmZXJbaV0uZG9hY3Jvc3NfYnVmX2lkeCA9IGk7CisjZW5kaWYKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHRlYW0tPnQudF9kaXNwX2J1ZmZlclsgMCBdLmJ1ZmZlcl9pbmRleCA9IDA7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgdGVhbS0+dC50X2Rpc3BfYnVmZmVyWzBdLmRvYWNyb3NzX2J1Zl9pZHggPSAwOworI2VuZGlmCisgICAgfQorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS01QX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBmb3IoIGY9MCA7IGY8dGVhbS0+dC50X25wcm9jIDsgZisrICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtLT50LnRfdGhyZWFkc1tmXSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICB0ZWFtLT50LnRfdGhyZWFkc1tmXS0+dGgudGhfdGVhbV9ucHJvYyA9PSB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAvKiByZWxlYXNlIHRoZSB3b3JrZXIgdGhyZWFkcyBzbyB0aGV5IG1heSBiZWdpbiB3b3JraW5nICovCisgICAgX19rbXBfZm9ya19iYXJyaWVyKCBndGlkLCAwICk7Cit9CisKKwordm9pZAorX19rbXBfaW50ZXJuYWxfam9pbiggaWRlbnRfdCAqaWQsIGludCBndGlkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0ZWFtICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhpc190aHItPnRoLnRoX3RlYW0gID09ICB0ZWFtICk7CisgICAgS01QX0FTU0VSVCggICAgICAgS01QX01BU1RFUl9HVElEKGd0aWQpICk7CisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAvKiBKb2luIGJhcnJpZXIgYWZ0ZXIgZm9yayAqLworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaWYgKF9fa21wX3RocmVhZHNbZ3RpZF0gJiYgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYyAhPSB0ZWFtLT50LnRfbnByb2MgKSB7CisgICAgICAgIF9fa21wX3ByaW50ZigiR1RJRDogJWQsIF9fa21wX3RocmVhZHNbJWRdPSVwXG4iLGd0aWQsIGd0aWQsIF9fa21wX3RocmVhZHNbZ3RpZF0pOworICAgICAgICBfX2ttcF9wcmludGYoIl9fa21wX3RocmVhZHNbJWRdLT50aC50aF90ZWFtX25wcm9jPSVkLCBURUFNOiAlcCwgdGVhbS0+dC50X25wcm9jPSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfdGhyZWFkc1tndGlkXS0+dGgudGhfdGVhbV9ucHJvYywgdGVhbSwgdGVhbS0+dC50X25wcm9jKTsKKyAgICAgICAgX19rbXBfcHJpbnRfc3RydWN0dXJlKCk7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbZ3RpZF0gJiYKKyAgICAgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHNbZ3RpZF0tPnRoLnRoX3RlYW1fbnByb2MgPT0gdGVhbS0+dC50X25wcm9jICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBfX2ttcF9qb2luX2JhcnJpZXIoIGd0aWQgKTsgIC8qIHdhaXQgZm9yIGV2ZXJ5b25lICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLTVBfQVNTRVJUKCB0aGlzX3Roci0+dGgudGhfdGVhbSAgPT0gIHRlYW0gKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgVVNFX0xPQURfQkFMQU5DRQorCisvLworLy8gUmV0dXJuIHRoZSB3b3JrZXIgdGhyZWFkcyBhY3RpdmVseSBzcGlubmluZyBpbiB0aGUgaG90IHRlYW0sIGlmIHdlCisvLyBhcmUgYXQgdGhlIG91dGVybW9zdCBsZXZlbCBvZiBwYXJhbGxlbGlzbS4gIE90aGVyd2lzZSwgcmV0dXJuIDAuCisvLworc3RhdGljIGludAorX19rbXBfYWN0aXZlX2hvdF90ZWFtX25wcm9jKCBrbXBfcm9vdF90ICpyb290ICkKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgcmV0dmFsOworICAgIGttcF90ZWFtX3QgKmhvdF90ZWFtOworCisgICAgaWYgKCByb290LT5yLnJfYWN0aXZlICkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaG90X3RlYW0gPSByb290LT5yLnJfaG90X3RlYW07CisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgcmV0dXJuIGhvdF90ZWFtLT50LnRfbnByb2MgLSAxOyAgLy8gRG9uJ3QgY291bnQgbWFzdGVyIHRocmVhZAorICAgIH0KKworICAgIC8vCisgICAgLy8gU2tpcCB0aGUgbWFzdGVyIHRocmVhZCAtIGl0IGlzIGFjY291bnRlZCBmb3IgZWxzZXdoZXJlLgorICAgIC8vCisgICAgcmV0dmFsID0gMDsKKyAgICBmb3IgKCBpID0gMTsgaSA8IGhvdF90ZWFtLT50LnRfbnByb2M7IGkrKyApIHsKKyAgICAgICAgaWYgKCBob3RfdGVhbS0+dC50X3RocmVhZHNbaV0tPnRoLnRoX2FjdGl2ZSApIHsKKyAgICAgICAgICAgIHJldHZhbCsrOworICAgICAgICB9CisgICAgfQorICAgIHJldHVybiByZXR2YWw7Cit9CisKKy8vCisvLyBQZXJmb3JtIGFuIGF1dG9tYXRpYyBhZGp1c3RtZW50IHRvIHRoZSBudW1iZXIgb2YKKy8vIHRocmVhZHMgdXNlZCBieSB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisvLworc3RhdGljIGludAorX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jKCBrbXBfcm9vdF90ICpyb290LCBpbnQgc2V0X25wcm9jICkKK3sKKyAgICBpbnQgcmV0dmFsOworICAgIGludCBwb29sX2FjdGl2ZTsKKyAgICBpbnQgaG90X3RlYW1fYWN0aXZlOworICAgIGludCB0ZWFtX2N1cnJfYWN0aXZlOworICAgIGludCBzeXN0ZW1fYWN0aXZlOworCisgICAgS0JfVFJBQ0UoIDIwLCAoIl9fa21wX2xvYWRfYmFsYW5jZV9ucHJvYzogY2FsbGVkIHJvb3Q6JXAgc2V0X25wcm9jOiVkXG4iLAorICAgICAgICAgICAgICAgIHJvb3QsIHNldF9ucHJvYyApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcm9vdCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHJvb3QtPnIucl9yb290X3RlYW0tPnQudF90aHJlYWRzWzBdLT50aC50aF9jdXJyZW50X3Rhc2stPnRkX2ljdnMuZHluYW1pYyA9PSBUUlVFICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggc2V0X25wcm9jID4gMSApOworCisgICAgaWYgKCBzZXRfbnByb2MgPT0gMSkgeworICAgICAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiBzZXJpYWwgZXhlY3V0aW9uLlxuIiApICk7CisgICAgICAgIHJldHVybiAxOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhyZWFkcyB0aGF0IGFyZSBhY3RpdmUgaW4gdGhlIHRocmVhZCBwb29sLCBhY3RpdmUgaW4gdGhlIGhvdCB0ZWFtCisgICAgLy8gZm9yIHRoaXMgcGFydGljdWxhciByb290IChpZiB3ZSBhcmUgYXQgdGhlIG91dGVyIHBhciBsZXZlbCksIGFuZAorICAgIC8vIHRoZSBjdXJyZW50bHkgZXhlY3V0aW5nIHRocmVhZCAodG8gYmVjb21lIHRoZSBtYXN0ZXIpIGFyZSBhdmFpbGFibGUKKyAgICAvLyB0byBhZGQgdG8gdGhlIG5ldyB0ZWFtLCBidXQgYXJlIGN1cnJlbnRseSBjb250cmlidXRpbmcgdG8gdGhlIHN5c3RlbQorICAgIC8vIGxvYWQsIGFuZCBtdXN0IGJlIGFjY291bnRlZCBmb3IuCisgICAgLy8KKyAgICBwb29sX2FjdGl2ZSA9IFRDUl80KF9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgIGhvdF90ZWFtX2FjdGl2ZSA9IF9fa21wX2FjdGl2ZV9ob3RfdGVhbV9ucHJvYyggcm9vdCApOworICAgIHRlYW1fY3Vycl9hY3RpdmUgPSBwb29sX2FjdGl2ZSArIGhvdF90ZWFtX2FjdGl2ZSArIDE7CisKKyAgICAvLworICAgIC8vIENoZWNrIHRoZSBzeXN0ZW0gbG9hZC4KKyAgICAvLworICAgIHN5c3RlbV9hY3RpdmUgPSBfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBfX2ttcF9hdmFpbF9wcm9jICsgdGVhbV9jdXJyX2FjdGl2ZSApOworICAgIEtCX1RSQUNFKCAzMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IHN5c3RlbSBhY3RpdmUgPSAlZCBwb29sIGFjdGl2ZSA9ICVkIGhvdCB0ZWFtIGFjdGl2ZSA9ICVkXG4iLAorICAgICAgc3lzdGVtX2FjdGl2ZSwgcG9vbF9hY3RpdmUsIGhvdF90ZWFtX2FjdGl2ZSApICk7CisKKyAgICBpZiAoIHN5c3RlbV9hY3RpdmUgPCAwICkgeworICAgICAgICAvLworICAgICAgICAvLyBUaGVyZSB3YXMgYW4gZXJyb3IgcmVhZGluZyB0aGUgbmVjZXNzYXJ5IGluZm8gZnJvbSAvcHJvYywKKyAgICAgICAgLy8gc28gdXNlIHRoZSB0aHJlYWQgbGltaXQgYWxnb3JpdGhtIGluc3RlYWQuICBPbmNlIHdlIHNldAorICAgICAgICAvLyBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9IGR5bmFtaWNfdGhyZWFkX2xpbWl0LAorICAgICAgICAvLyB3ZSBzaG91bGRuJ3Qgd2luZCB1cCBnZXR0aW5nIGJhY2sgaGVyZS4KKyAgICAgICAgLy8KKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICAgICAgS01QX1dBUk5JTkcoIENhbnRMb2FkQmFsVXNpbmcsICJLTVBfRFlOQU1JQ19NT0RFPXRocmVhZCBsaW1pdCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBNYWtlIHRoaXMgY2FsbCBiZWhhdmUgbGlrZSB0aGUgdGhyZWFkIGxpbWl0IGFsZ29yaXRobS4KKyAgICAgICAgLy8KKyAgICAgICAgcmV0dmFsID0gX19rbXBfYXZhaWxfcHJvYyAtIF9fa21wX250aCArIChyb290LT5yLnJfYWN0aXZlID8gMQorICAgICAgICAgIDogcm9vdC0+ci5yX2hvdF90ZWFtLT50LnRfbnByb2MpOworICAgICAgICBpZiAoIHJldHZhbCA+IHNldF9ucHJvYyApIHsKKyAgICAgICAgICAgIHJldHZhbCA9IHNldF9ucHJvYzsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHJldHZhbCA8IEtNUF9NSU5fTlRIICkgeworICAgICAgICAgICAgcmV0dmFsID0gS01QX01JTl9OVEg7CisgICAgICAgIH0KKworICAgICAgICBLQl9UUkFDRSggMjAsICgiX19rbXBfbG9hZF9iYWxhbmNlX25wcm9jOiB0aHJlYWQgbGltaXQgZXhpdC4gcmV0dmFsOiVkXG4iLCByZXR2YWwgKSApOworICAgICAgICByZXR1cm4gcmV0dmFsOworICAgIH0KKworICAgIC8vCisgICAgLy8gVGhlcmUgaXMgYSBzbGlnaHQgZGVsYXkgaW4gdGhlIGxvYWQgYmFsYW5jZSBhbGdvcml0aG0gaW4gZGV0ZWN0aW5nCisgICAgLy8gbmV3IHJ1bm5pbmcgcHJvY3MuICBUaGUgcmVhbCBzeXN0ZW0gbG9hZCBhdCB0aGlzIGluc3RhbnQgc2hvdWxkIGJlCisgICAgLy8gYXQgbGVhc3QgYXMgbGFyZ2UgYXMgdGhlICNhY3RpdmUgb21wIHRocmVhZCB0aGF0IGFyZSBhdmFpbGFibGUgdG8KKyAgICAvLyBhZGQgdG8gdGhlIHRlYW0uCisgICAgLy8KKyAgICBpZiAoIHN5c3RlbV9hY3RpdmUgPCB0ZWFtX2N1cnJfYWN0aXZlICkgeworICAgICAgICBzeXN0ZW1fYWN0aXZlID0gdGVhbV9jdXJyX2FjdGl2ZTsKKyAgICB9CisgICAgcmV0dmFsID0gX19rbXBfYXZhaWxfcHJvYyAtIHN5c3RlbV9hY3RpdmUgKyB0ZWFtX2N1cnJfYWN0aXZlOworICAgIGlmICggcmV0dmFsID4gc2V0X25wcm9jICkgeworICAgICAgICByZXR2YWwgPSBzZXRfbnByb2M7CisgICAgfQorICAgIGlmICggcmV0dmFsIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgIHJldHZhbCA9IEtNUF9NSU5fTlRIOworICAgIH0KKworICAgIEtCX1RSQUNFKCAyMCwgKCJfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2M6IGV4aXQuIHJldHZhbDolZFxuIiwgcmV0dmFsICkgKTsKKyAgICByZXR1cm4gcmV0dmFsOworfSAvLyBfX2ttcF9sb2FkX2JhbGFuY2VfbnByb2MoKQorCisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiBOT1RFOiB0aGlzIGlzIGNhbGxlZCB3aXRoIHRoZSBfX2ttcF9pbml0X2xvY2sgaGVsZCAqLwordm9pZAorX19rbXBfY2xlYW51cCggdm9pZCApCit7CisgICAgaW50IGY7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY2xlYW51cDogZW50ZXJcbiIgKSApOworCisgICAgaWYgKFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpKSB7CisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgICAgIF9fa21wX3JlbW92ZV9zaWduYWxzKCk7CisjZW5kaWYKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9wYXJhbGxlbCwgRkFMU0UpOworICAgIH0KKworICAgIGlmIChUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkpIHsKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfY2xlYW51cF9oaWVyYXJjaHkoKTsKKyAgICAgICAgVENXXzQoX19rbXBfaW5pdF9taWRkbGUsIEZBTFNFKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY2xlYW51cDogZ28gc2VyaWFsIGNsZWFudXBcbiIgKSApOworCisgICAgaWYgKF9fa21wX2luaXRfc2VyaWFsKSB7CisgICAgICAgIF9fa21wX3J1bnRpbWVfZGVzdHJveSgpOworICAgICAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICAgIH0KKworICAgIGZvciAoIGYgPSAwOyBmIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgZisrICkgeworICAgICAgICBpZiAoIF9fa21wX3Jvb3RbIGYgXSAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfZnJlZSggX19rbXBfcm9vdFsgZiBdICk7CisgICAgICAgICAgICBfX2ttcF9yb290WyBmIF0gPSBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIF9fa21wX2ZyZWUoIF9fa21wX3RocmVhZHMgKTsKKyAgICAvLyBfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290IHdlcmUgYWxsb2NhdGVkIGF0IG9uY2UsIGFzIHNpbmdsZSBibG9jaywgc28gdGhlcmUgaXMgbm8gbmVlZCBpbgorICAgIC8vIGZyZWVpbmcgX19rbXBfcm9vdC4KKyAgICBfX2ttcF90aHJlYWRzID0gTlVMTDsKKyAgICBfX2ttcF9yb290ICAgID0gTlVMTDsKKyAgICBfX2ttcF90aHJlYWRzX2NhcGFjaXR5ID0gMDsKKworI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfY2xlYW51cF9pbmRpcmVjdF91c2VyX2xvY2tzKCk7CisjZWxzZQorICAgIF9fa21wX2NsZWFudXBfdXNlcl9sb2NrcygpOworI2VuZGlmCisKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKikgX19rbXBfY3B1aW5mb19maWxlICk7CisgICAgICAgIF9fa21wX2NwdWluZm9fZmlsZSA9IE5VTEw7CisgICAgI2VuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKworICAgI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICAgICBfX2ttcF9wcmludF9zcGVjdWxhdGl2ZV9zdGF0cygpOworICAgI2VuZGlmCisgICAjZW5kaWYKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggX19rbXBfbmVzdGVkX250aC5udGggKTsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLm50aCA9IE5VTEw7CisgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gMDsKKyAgICBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgPSAwOworCisgICAgX19rbXBfaTE4bl9jYXRjbG9zZSgpOworCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQoKTsKKyAgICBfX2ttcF9zdGF0c19saXN0LmRlYWxsb2NhdGUoKTsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NsZWFudXA6IGV4aXRcbiIgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitpbnQKK19fa21wX2lnbm9yZV9tcHBiZWcoIHZvaWQgKQoreworICAgIGNoYXIgKmVudjsKKworICAgIGlmICgoZW52ID0gZ2V0ZW52KCAiS01QX0lHTk9SRV9NUFBCRUciICkpICE9IE5VTEwpIHsKKyAgICAgICAgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggZW52ICkpCisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIC8vIEJ5IGRlZmF1bHQgX19rbXBjX2JlZ2luKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK2ludAorX19rbXBfaWdub3JlX21wcGVuZCggdm9pZCApCit7CisgICAgY2hhciAqZW52OworCisgICAgaWYgKChlbnYgPSBnZXRlbnYoICJLTVBfSUdOT1JFX01QUEVORCIgKSkgIT0gTlVMTCkgeworICAgICAgICBpZiAoX19rbXBfc3RyX21hdGNoX2ZhbHNlKCBlbnYgKSkKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICB9CisgICAgLy8gQnkgZGVmYXVsdCBfX2ttcGNfZW5kKCkgaXMgbm8tb3AuCisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3ZvaWQKK19fa21wX2ludGVybmFsX2JlZ2luKCB2b2lkICkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBrbXBfcm9vdF90ICpyb290OworCisgICAgLyogdGhpcyBpcyBhIHZlcnkgaW1wb3J0YW50IHN0ZXAgYXMgaXQgd2lsbCByZWdpc3RlciBuZXcgc2libGluZyB0aHJlYWRzCisgICAgICogYW5kIGFzc2lnbiB0aGVzZSBuZXcgdWJlciB0aHJlYWRzIGEgbmV3IGd0aWQgKi8KKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHJvb3QgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3Jvb3Q7CisgICAgS01QX0FTU0VSVCggS01QX1VCRVJfR1RJRCggZ3RpZCApKTsKKworICAgIGlmKCByb290LT5yLnJfYmVnaW4gKSByZXR1cm47CisgICAgX19rbXBfYWNxdWlyZV9sb2NrKCAmcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICBpZiggcm9vdC0+ci5yX2JlZ2luICkgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIHJvb3QtPnIucl9iZWdpbiA9IFRSVUU7CisKKyAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgcm9vdC0+ci5yX2JlZ2luX2xvY2ssIGd0aWQgKTsKK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF91c2VyX3NldF9saWJyYXJ5IChlbnVtIGxpYnJhcnlfdHlwZSBhcmcpCit7CisgICAgaW50IGd0aWQ7CisgICAga21wX3Jvb3RfdCAqcm9vdDsKKyAgICBrbXBfaW5mb190ICp0aHJlYWQ7CisKKyAgICAvKiBmaXJzdCwgbWFrZSBzdXJlIHdlIGFyZSBpbml0aWFsaXplZCBzbyB3ZSBjYW4gZ2V0IG91ciBndGlkICovCisKKyAgICBndGlkID0gX19rbXBfZW50cnlfZ3RpZCgpOworICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKworICAgIHJvb3QgPSB0aHJlYWQtPnRoLnRoX3Jvb3Q7CisKKyAgICBLQV9UUkFDRSggMjAsICgiX19rbXBfdXNlcl9zZXRfbGlicmFyeTogZW50ZXIgVCMlZCwgYXJnOiAlZCwgJWRcbiIsIGd0aWQsIGFyZywgbGlicmFyeV9zZXJpYWwgKSk7CisgICAgaWYgKHJvb3QtPnIucl9pbl9wYXJhbGxlbCkgeyAvKiBNdXN0IGJlIGNhbGxlZCBpbiBzZXJpYWwgc2VjdGlvbiBvZiB0b3AtbGV2ZWwgdGhyZWFkICovCisgICAgICAgIEtNUF9XQVJOSU5HKCBTZXRMaWJyYXJ5SW5jb3JyZWN0Q2FsbCApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgc3dpdGNoICggYXJnICkgeworICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgMSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgIHRocmVhZC0+dGgudGhfc2V0X25wcm9jID0gMDsKKyAgICAgICAgc2V0X19ucHJvYyggdGhyZWFkLCBfX2ttcF9kZmx0X3RlYW1fbnRoID8gX19rbXBfZGZsdF90ZWFtX250aCA6IF9fa21wX2RmbHRfdGVhbV9udGhfdWIgKTsKKyAgICAgICAgYnJlYWs7CisgICAgY2FzZSBsaWJyYXJ5X3Rocm91Z2hwdXQgOgorICAgICAgICB0aHJlYWQtPnRoLnRoX3NldF9ucHJvYyA9IDA7CisgICAgICAgIHNldF9fbnByb2MoIHRocmVhZCwgX19rbXBfZGZsdF90ZWFtX250aCA/IF9fa21wX2RmbHRfdGVhbV9udGggOiBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViICk7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkxpYnJhcnlUeXBlLCBhcmcgKTsKKyAgICB9CisKKyAgICBfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKCBhcmcgKTsKK30KKwordm9pZAorX19rbXBfYXV4X3NldF9zdGFja3NpemUoIHNpemVfdCBhcmcgKQoreworICAgIGlmICghIF9fa21wX2luaXRfc2VyaWFsKQorICAgICAgICBfX2ttcF9zZXJpYWxfaW5pdGlhbGl6ZSgpOworCisjaWYgS01QX09TX0RBUldJTgorICAgIGlmIChhcmcgJiAoMHgxMDAwIC0gMSkpIHsKKyAgICAgICAgYXJnICY9IH4oMHgxMDAwIC0gMSk7CisgICAgICAgIGlmKGFyZyArIDB4MTAwMCkgLyogY2hlY2sgZm9yIG92ZXJmbG93IGlmIHdlIHJvdW5kIHVwICovCisgICAgICAgICAgICBhcmcgKz0gMHgxMDAwOworICAgIH0KKyNlbmRpZgorICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9pbml0el9sb2NrICk7CisKKyAgICAvKiBvbmx5IGNoYW5nZSB0aGUgZGVmYXVsdCBzdGFja3NpemUgYmVmb3JlIHRoZSBmaXJzdCBwYXJhbGxlbCByZWdpb24gKi8KKyAgICBpZiAoISBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSkgeworICAgICAgICBzaXplX3QgdmFsdWUgPSBhcmc7ICAgICAgIC8qIGFyZ3VtZW50IGlzIGluIGJ5dGVzICovCisKKyAgICAgICAgaWYgKHZhbHVlIDwgX19rbXBfc3lzX21pbl9zdGtzaXplICkKKyAgICAgICAgICAgIHZhbHVlID0gX19rbXBfc3lzX21pbl9zdGtzaXplIDsKKyAgICAgICAgZWxzZSBpZiAodmFsdWUgPiBLTVBfTUFYX1NUS1NJWkUpCisgICAgICAgICAgICB2YWx1ZSA9IEtNUF9NQVhfU1RLU0laRTsKKworICAgICAgICBfX2ttcF9zdGtzaXplID0gdmFsdWU7CisKKyAgICAgICAgX19rbXBfZW52X3N0a3NpemUgPSBUUlVFOyAgICAvKiB3YXMgS01QX1NUQUNLU0laRSBzcGVjaWZpZWQ/ICovCisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX2luaXR6X2xvY2sgKTsKK30KKworLyogc2V0IHRoZSBiZWhhdmlvdXIgb2YgdGhlIHJ1bnRpbWUgbGlicmFyeSAqLworLyogVE9ETyB0aGlzIGNhbiBjYXVzZSBzb21lIG9kZCBiZWhhdmlvdXIgd2l0aCBzaWJsaW5nIHBhcmFsbGVsaXNtLi4uICovCit2b2lkCitfX2ttcF9hdXhfc2V0X2xpYnJhcnkgKGVudW0gbGlicmFyeV90eXBlIGFyZykKK3sKKyAgICBfX2ttcF9saWJyYXJ5ID0gYXJnOworCisgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICBjYXNlIGxpYnJhcnlfc2VyaWFsIDoKKyAgICAgICAgeworICAgICAgICAgICAgS01QX0lORk9STSggTGlicmFyeUlzU2VyaWFsICk7CisgICAgICAgICAgICAodm9pZCkgX19rbXBfY2hhbmdlX2xpYnJhcnkoIFRSVUUgKTsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggVFJVRSApOworICAgICAgICBicmVhazsKKyAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6CisgICAgICAgICh2b2lkKSBfX2ttcF9jaGFuZ2VfbGlicmFyeSggRkFMU0UgKTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKyAgICAgICAgS01QX0ZBVEFMKCBVbmtub3duTGlicmFyeVR5cGUsIGFyZyApOworICAgIH0KK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfYXV4X3NldF9ibG9ja3RpbWUgKGludCBhcmcsIGttcF9pbmZvX3QgKnRocmVhZCwgaW50IHRpZCkKK3sKKyAgICBpbnQgYmxvY2t0aW1lID0gYXJnOyAgICAgICAgLyogYXJndW1lbnQgaXMgaW4gbWlsbGlzZWNvbmRzICovCisgICAgaW50IGJ0X2ludGVydmFsczsKKyAgICBpbnQgYnRfc2V0OworCisgICAgX19rbXBfc2F2ZV9pbnRlcm5hbF9jb250cm9scyggdGhyZWFkICk7CisKKyAgICAvKiBOb3JtYWxpemUgYW5kIHNldCBibG9ja3RpbWUgZm9yIHRoZSB0ZWFtcyAqLworICAgIGlmIChibG9ja3RpbWUgPCBLTVBfTUlOX0JMT0NLVElNRSkKKyAgICAgICAgYmxvY2t0aW1lID0gS01QX01JTl9CTE9DS1RJTUU7CisgICAgZWxzZSBpZiAoYmxvY2t0aW1lID4gS01QX01BWF9CTE9DS1RJTUUpCisgICAgICAgIGJsb2NrdGltZSA9IEtNUF9NQVhfQkxPQ0tUSU1FOworCisgICAgc2V0X19ibG9ja3RpbWVfdGVhbSggdGhyZWFkLT50aC50aF90ZWFtLCB0aWQsIGJsb2NrdGltZSApOworICAgIHNldF9fYmxvY2t0aW1lX3RlYW0oIHRocmVhZC0+dGgudGhfc2VyaWFsX3RlYW0sIDAsIGJsb2NrdGltZSApOworCisgICAgLyogQ2FsY3VsYXRlIGFuZCBzZXQgYmxvY2t0aW1lIGludGVydmFscyBmb3IgdGhlIHRlYW1zICovCisgICAgYnRfaW50ZXJ2YWxzID0gS01QX0lOVEVSVkFMU19GUk9NX0JMT0NLVElNRShibG9ja3RpbWUsIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisKKyAgICBzZXRfX2J0X2ludGVydmFsc190ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYnRfaW50ZXJ2YWxzICk7CisgICAgc2V0X19idF9pbnRlcnZhbHNfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfaW50ZXJ2YWxzICk7CisKKyAgICAvKiBTZXQgd2hldGhlciBibG9ja3RpbWUgaGFzIGJlZW4gc2V0IHRvICJUUlVFIiAqLworICAgIGJ0X3NldCA9IFRSVUU7CisKKyAgICBzZXRfX2J0X3NldF90ZWFtKCB0aHJlYWQtPnRoLnRoX3RlYW0sIHRpZCwgYnRfc2V0ICk7CisgICAgc2V0X19idF9zZXRfdGVhbSggdGhyZWFkLT50aC50aF9zZXJpYWxfdGVhbSwgMCwgYnRfc2V0ICk7CisgICAgS0ZfVFJBQ0UoMTAsICggImttcF9zZXRfYmxvY2t0aW1lOiBUIyVkKCVkOiVkKSwgYmxvY2t0aW1lPSVkLCBidF9pbnRlcnZhbHM9JWQsIG1vbml0b3JfdXBkYXRlcz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aWQodGlkLCB0aHJlYWQtPnRoLnRoX3RlYW0pLAorICAgICAgICAgICAgICAgICAgdGhyZWFkLT50aC50aF90ZWFtLT50LnRfaWQsIHRpZCwgYmxvY2t0aW1lLCBidF9pbnRlcnZhbHMsIF9fa21wX21vbml0b3Jfd2FrZXVwcyApICk7Cit9CisKK3ZvaWQKK19fa21wX2F1eF9zZXRfZGVmYXVsdHMoCisgICAgY2hhciBjb25zdCAqIHN0ciwKKyAgICBpbnQgICAgICAgICAgbGVuCispIHsKKyAgICBpZiAoICEgX19rbXBfaW5pdF9zZXJpYWwgKSB7CisgICAgICAgIF9fa21wX3NlcmlhbF9pbml0aWFsaXplKCk7CisgICAgfTsKKyAgICBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggc3RyICk7CisKKyAgICBpZiAoX19rbXBfc2V0dGluZ3MKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICB8fCBfX2ttcF9kaXNwbGF5X2VudiB8fCBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyAgICAgICAgKSB7CisgICAgICAgIF9fa21wX2Vudl9wcmludCgpOworICAgIH0KK30gLy8gX19rbXBfYXV4X3NldF9kZWZhdWx0cworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqIGludGVybmFsIGZhc3QgcmVkdWN0aW9uIHJvdXRpbmVzCisgKi8KKworUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVAorX19rbXBfZGV0ZXJtaW5lX3JlZHVjdGlvbl9tZXRob2QoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsCisgICAgICAgIGttcF9pbnQzMiBudW1fdmFycywgc2l6ZV90IHJlZHVjZV9zaXplLCB2b2lkICpyZWR1Y2VfZGF0YSwgdm9pZCAoKnJlZHVjZV9mdW5jKSh2b2lkICpsaHNfZGF0YSwgdm9pZCAqcmhzX2RhdGEpLAorICAgICAgICBrbXBfY3JpdGljYWxfbmFtZSAqbGNrICkKK3sKKworICAgIC8vIERlZmF1bHQgcmVkdWN0aW9uIG1ldGhvZDogY3JpdGljYWwgY29uc3RydWN0ICggbGNrICE9IE5VTEwsIGxpa2UgaW4gY3VycmVudCBQQVJPUFQgKQorICAgIC8vIElmICggcmVkdWNlX2RhdGEhPU5VTEwgJiYgcmVkdWNlX2Z1bmMhPU5VTEwgKTogdGhlIHRyZWUtcmVkdWN0aW9uIG1ldGhvZCBjYW4gYmUgc2VsZWN0ZWQgYnkgUlRMCisgICAgLy8gSWYgbG9jLT5mbGFncyBjb250YWlucyBLTVBfSURFTlRfQVRPTUlDX1JFRFVDRSwgdGhlIGF0b21pYyByZWR1Y2UgbWV0aG9kIGNhbiBiZSBzZWxlY3RlZCBieSBSVEwKKyAgICAvLyBGaW5hbGx5LCBpdCdzIHVwIHRvIE9wZW5NUCBSVEwgdG8gbWFrZSBhIGRlY2lzaW9uIG9uIHdoaWNoIG1ldGhvZCB0byBzZWxlY3QgYW1vbmcgZ2VuZXJhdGVkIGJ5IFBBUk9QVC4KKworICAgIFBBQ0tFRF9SRURVQ1RJT05fTUVUSE9EX1QgcmV0dmFsOworCisgICAgaW50IHRlYW1fc2l6ZTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIGxvYyApOyAgICAvLyBpdCB3b3VsZCBiZSBuaWNlIHRvIHRlc3QgKCBsb2MgIT0gMCApCisgICAgS01QX0RFQlVHX0FTU0VSVCggbGNrICk7ICAgIC8vIGl0IHdvdWxkIGJlIG5pY2UgdG8gdGVzdCAoIGxjayAhPSAwICkKKworICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQgKCAoIGxvYy0+ZmxhZ3MgJiAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKSA9PSAoIEtNUF9JREVOVF9BVE9NSUNfUkVEVUNFICkgKQorICAgICNkZWZpbmUgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEICAgKCAoIHJlZHVjZV9kYXRhICkgJiYgKCByZWR1Y2VfZnVuYyApICkKKworICAgIHJldHZhbCA9IGNyaXRpY2FsX3JlZHVjZV9ibG9jazsKKworICAgIHRlYW1fc2l6ZSA9IF9fa21wX2dldF90ZWFtX251bV90aHJlYWRzKCBnbG9iYWxfdGlkICk7IC8vIGFub3RoZXIgY2hvaWNlIG9mIGdldHRpbmcgYSB0ZWFtIHNpemUgKCB3aXRoIDEgZHluYW1pYyBkZWZlcmVuY2UgKSBpcyBzbG93ZXIKKworICAgIGlmKCB0ZWFtX3NpemUgPT0gMSApIHsKKworICAgICAgICByZXR2YWwgPSBlbXB0eV9yZWR1Y2VfYmxvY2s7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgIGludCBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgIGludCB0cmVlX2F2YWlsYWJsZSAgID0gRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVEOworCisgICAgICAgICNpZiBLTVBfQVJDSF9YODZfNjQgfHwgS01QX0FSQ0hfUFBDNjQgfHwgS01QX0FSQ0hfQUFSQ0g2NAorCisgICAgICAgICAgICAjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTgorCisJICAgIGludCB0ZWFtc2l6ZV9jdXRvZmYgPSA0OworCisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgIHRlYW1zaXplX2N1dG9mZiA9IDg7CisgICAgICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAgICAgaWYoIHRyZWVfYXZhaWxhYmxlICkgeworICAgICAgICAgICAgICAgICAgICBpZiggdGVhbV9zaXplIDw9IHRlYW1zaXplX2N1dG9mZiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgcmV0dmFsID0gVFJFRV9SRURVQ0VfQkxPQ0tfV0lUSF9SRURVQ1RJT05fQkFSUklFUjsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIGF0b21pY19hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisgICAgICAgICAgICAjZW5kaWYgLy8gS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgfHwgS01QX09TX1dJTkRPV1MgfHwgS01QX09TX0RBUldJTgorCisgICAgICAgICNlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9BUk0gfHwgS01QX0FSQ0hfQUFSQ0gKKworICAgICAgICAgICAgI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUworCisgICAgICAgICAgICAgICAgLy8gYmFzaWMgdHVuaW5nCisKKyAgICAgICAgICAgICAgICBpZiggYXRvbWljX2F2YWlsYWJsZSApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYoIG51bV92YXJzIDw9IDIgKSB7IC8vICYmICggdGVhbV9zaXplIDw9IDggKSBkdWUgdG8gZmFsc2Utc2hhcmluZyA/Pz8KKyAgICAgICAgICAgICAgICAgICAgICAgIHJldHZhbCA9IGF0b21pY19yZWR1Y2VfYmxvY2s7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2VsaWYgS01QX09TX0RBUldJTgorCisgICAgICAgICAgICAgICAgaWYoIGF0b21pY19hdmFpbGFibGUgJiYgKCBudW1fdmFycyA8PSAzICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBhdG9taWNfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggdHJlZV9hdmFpbGFibGUgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCAoIHJlZHVjZV9zaXplID4gKCA5ICogc2l6ZW9mKCBrbXBfcmVhbDY0ICkgKSApICYmICggcmVkdWNlX3NpemUgPCAoIDIwMDAgKiBzaXplb2YoIGttcF9yZWFsNjQgKSApICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICByZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1BMQUlOX0JBUlJJRVI7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8vIG90aGVyd2lzZTogdXNlIGNyaXRpY2FsIHNlY3Rpb24KKworICAgICAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgICAgICAjZXJyb3IgIlVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MiCisgICAgICAgICAgICAjZW5kaWYKKworICAgICAgICAjZWxzZQorICAgICAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIGFyY2hpdGVjdHVyZSIKKyAgICAgICAgI2VuZGlmCisKKyAgICB9CisKKyAgICAvLyBLTVBfRk9SQ0VfUkVEVUNUSU9OCisKKyAgICAvLyBJZiB0aGUgdGVhbSBpcyBzZXJpYWxpemVkICh0ZWFtX3NpemUgPT0gMSksIGlnbm9yZSB0aGUgZm9yY2VkIHJlZHVjdGlvbgorICAgIC8vIG1ldGhvZCBhbmQgc3RheSB3aXRoIHRoZSB1bnN5bmNocm9uaXplZCBtZXRob2QgKGVtcHR5X3JlZHVjZV9ibG9jaykKKyAgICBpZiggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCAhPSByZWR1Y3Rpb25fbWV0aG9kX25vdF9kZWZpbmVkICYmIHRlYW1fc2l6ZSAhPSAxKSB7CisKKyAgICAgICAgUEFDS0VEX1JFRFVDVElPTl9NRVRIT0RfVCBmb3JjZWRfcmV0dmFsOworCisgICAgICAgIGludCBhdG9taWNfYXZhaWxhYmxlLCB0cmVlX2F2YWlsYWJsZTsKKworICAgICAgICBzd2l0Y2goICggZm9yY2VkX3JldHZhbCA9IF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgKSApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNhc2UgY3JpdGljYWxfcmVkdWNlX2Jsb2NrOgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIGxjayApOyAgICAgICAgICAgICAgLy8gbGNrIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgYXRvbWljX3JlZHVjZV9ibG9jazoKKyAgICAgICAgICAgICAgICBhdG9taWNfYXZhaWxhYmxlID0gRkFTVF9SRURVQ1RJT05fQVRPTUlDX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggYXRvbWljX2F2YWlsYWJsZSApOyAvLyBhdG9taWNfYXZhaWxhYmxlIHNob3VsZCBiZSAhPSAwCisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgIGNhc2UgdHJlZV9yZWR1Y2VfYmxvY2s6CisgICAgICAgICAgICAgICAgdHJlZV9hdmFpbGFibGUgPSBGQVNUX1JFRFVDVElPTl9UUkVFX01FVEhPRF9HRU5FUkFURUQ7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggdHJlZV9hdmFpbGFibGUgKTsgICAvLyB0cmVlX2F2YWlsYWJsZSBzaG91bGQgYmUgIT0gMAorICAgICAgICAgICAgICAgICNpZiBLTVBfRkFTVF9SRURVQ1RJT05fQkFSUklFUgorICAgICAgICAgICAgICAgIGZvcmNlZF9yZXR2YWwgPSBUUkVFX1JFRFVDRV9CTE9DS19XSVRIX1JFRFVDVElPTl9CQVJSSUVSOworICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICBkZWZhdWx0OgorICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsgLy8gInVuc3VwcG9ydGVkIG1ldGhvZCBzcGVjaWZpZWQiCisgICAgICAgIH0KKworICAgICAgICByZXR2YWwgPSBmb3JjZWRfcmV0dmFsOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoICJyZWR1Y3Rpb24gbWV0aG9kIHNlbGVjdGVkPSUwOHhcbiIsIHJldHZhbCApICk7CisKKyAgICAjdW5kZWYgRkFTVF9SRURVQ1RJT05fVFJFRV9NRVRIT0RfR0VORVJBVEVECisgICAgI3VuZGVmIEZBU1RfUkVEVUNUSU9OX0FUT01JQ19NRVRIT0RfR0VORVJBVEVECisKKyAgICByZXR1cm4gKCByZXR2YWwgKTsKK30KKworLy8gdGhpcyBmdW5jdGlvbiBpcyBmb3IgdGVzdGluZyBzZXQvZ2V0L2RldGVybWluZSByZWR1Y2UgbWV0aG9kCitrbXBfaW50MzIKK19fa21wX2dldF9yZWR1Y2VfbWV0aG9kKCB2b2lkICkgeworICAgIHJldHVybiAoICggX19rbXBfZW50cnlfdGhyZWFkKCktPnRoLnRoX2xvY2FsLnBhY2tlZF9yZWR1Y3Rpb25fbWV0aG9kICkgPj4gOCApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc2FmZV9jX2FwaS5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zYWZlX2NfYXBpLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWZlYWY4YwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc2FmZV9jX2FwaS5oCkBAIC0wLDAgKzEsNjIgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9TQUZFX0NfQVBJX0gKKyNkZWZpbmUgS01QX1NBRkVfQ19BUElfSAorCisvLworLy8gUmVwbGFjZW1lbnQgZm9yIGJhbm5lZCBDIEFQSQorLy8KKworLy8gTm90IGV2ZXJ5IHVuc2FmZSBjYWxsIGxpc3RlZCBoZXJlIGlzIGhhbmRsZWQgbm93LCBidXQga2VlcGluZyBldmVyeXRoaW5nCisvLyBpbiBvbmUgcGxhY2Ugc2hvdWxkIGJlIGhhbmR5IGZvciBmdXR1cmUgbWFpbnRlbmFuY2UuCisjaWYgS01QX09TX1dJTkRPV1MKKworIyBkZWZpbmUgUlNJWkVfTUFYX1NUUiAoIDRVTCA8PCAxMCApIC8vIDRLQgorCisvLyBfbWFsbG9jYSB3YXMgc3VnZ2VzdGVkLCBidXQgaXQgaXMgbm90IGEgZHJvcC1pbiByZXBsYWNlbWVudCBmb3IgX2FsbG9jYQorIyBkZWZpbmUgS01QX0FMTE9DQSAgICAgICAgICAgICAgICAgIF9hbGxvY2EKKworIyBkZWZpbmUgS01QX01FTUNQWV9TICAgICAgICAgICAgICAgIG1lbWNweV9zCisjIGRlZmluZSBLTVBfU05QUklOVEYgICAgICAgICAgICAgICAgc3ByaW50Zl9zCisjIGRlZmluZSBLTVBfU1NDQU5GICAgICAgICAgICAgICAgICAgc3NjYW5mX3MKKyMgZGVmaW5lIEtNUF9TVFJDUFlfUyAgICAgICAgICAgICAgICBzdHJjcHlfcworIyBkZWZpbmUgS01QX1NUUk5DUFlfUyAgICAgICAgICAgICAgIHN0cm5jcHlfcworCisvLyBVc2UgdGhpcyBvbmx5IHdoZW4gYnVmZmVyIHNpemUgaXMgdW5rbm93bgorIyBkZWZpbmUgS01QX01FTUNQWShkc3QsIHNyYywgY250KSAgIG1lbWNweV9zKGRzdCwgY250LCBzcmMsIGNudCkKKworIyBkZWZpbmUgS01QX1NUUkxFTihzdHIpICAgICAgICAgICAgIHN0cm5sZW5fcyhzdHIsIFJTSVpFX01BWF9TVFIpCisKKy8vIFVzZSB0aGlzIG9ubHkgd2hlbiBidWZmZXIgc2l6ZSBpcyB1bmtub3duCisjIGRlZmluZSBLTVBfU1RSTkNQWShkc3QsIHNyYywgY250KSAgc3RybmNweV9zKGRzdCwgY250LCBzcmMsIGNudCkKKworLy8gX1RSVU5DQVRFIGluc3VyZXMgYnVmZmVyIHNpemUgPiBtYXggc3RyaW5nIHRvIHByaW50LgorIyBkZWZpbmUgS01QX1ZTTlBSSU5URihkc3QsIGNudCwgZm10LCBhcmcpICB2c25wcmludGZfcyhkc3QsIGNudCwgX1RSVU5DQVRFLCBmbXQsIGFyZykKKworI2Vsc2UgLy8gS01QX09TX1dJTkRPV1MKKworLy8gRm9yIG5vdywgdGhlc2UgbWFjcm9zIHVzZSB0aGUgZXhpc3RpbmcgQVBJLgorCisjIGRlZmluZSBLTVBfQUxMT0NBICAgICAgICAgICAgICAgICAgICAgICAgIGFsbG9jYQorIyBkZWZpbmUgS01QX01FTUNQWV9TKGRzdCwgYnN6LCBzcmMsIGNudCkgICBtZW1jcHkoZHN0LCBzcmMsIGNudCkKKyMgZGVmaW5lIEtNUF9TTlBSSU5URiAgICAgICAgICAgICAgICAgICAgICAgc25wcmludGYKKyMgZGVmaW5lIEtNUF9TU0NBTkYgICAgICAgICAgICAgICAgICAgICAgICAgc3NjYW5mCisjIGRlZmluZSBLTVBfU1RSQ1BZX1MoZHN0LCBic3osIHNyYykgICAgICAgIHN0cmNweShkc3QsIHNyYykKKyMgZGVmaW5lIEtNUF9TVFJOQ1BZX1MoZHN0LCBic3osIHNyYywgY250KSAgc3RybmNweShkc3QsIHNyYywgY250KQorIyBkZWZpbmUgS01QX1ZTTlBSSU5URiAgICAgICAgICAgICAgICAgICAgICB2c25wcmludGYKKyMgZGVmaW5lIEtNUF9TVFJOQ1BZICAgICAgICAgICAgICAgICAgICAgICAgc3RybmNweQorIyBkZWZpbmUgS01QX1NUUkxFTiAgICAgICAgICAgICAgICAgICAgICAgICBzdHJsZW4KKyMgZGVmaW5lIEtNUF9NRU1DUFkgICAgICAgICAgICAgICAgICAgICAgICAgbWVtY3B5CisKKyNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworCisjZW5kaWYgLy8gS01QX1NBRkVfQ19BUElfSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAgYi9yYzMvcnVudGltZS9zcmMva21wX3NjaGVkLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNmYzMDgxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zY2hlZC5jcHAKQEAgLTAsMCArMSw5NzQgQEAKKy8qCisgKiBrbXBfc2NoZWQuYyAtLSBzdGF0aWMgc2NoZWR1bGluZyAtLSBpdGVyYXRpb24gaW5pdGlhbGl6YXRpb24KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworLyoKKyAqIFN0YXRpYyBzY2hlZHVsaW5nIGluaXRpYWxpemF0aW9uLgorICoKKyAqIE5PVEU6IHRlYW0tPnQudF9ucHJvYyBpcyBhIGNvbnN0YW50IGluc2lkZSBvZiBhbnkgZGlzcGF0Y2ggbG9vcCwgaG93ZXZlcgorICogICAgICAgaXQgbWF5IGNoYW5nZSB2YWx1ZXMgYmV0d2VlbiBwYXJhbGxlbCByZWdpb25zLiAgX19rbXBfbWF4X250aAorICogICAgICAgaXMgdGhlIGxhcmdlc3QgdmFsdWUgX19rbXBfbnRoIG1heSB0YWtlLCAxIGlzIHRoZSBzbWFsbGVzdC4KKyAqCisgKi8KKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKworI2lmIE9NUFRfU1VQUE9SVAorI2luY2x1ZGUgIm9tcHQtc3BlY2lmaWMuaCIKKyNlbmRpZgorCisvLyB0ZW1wbGF0ZSBmb3IgdHlwZSBsaW1pdHMKK3RlbXBsYXRlPCB0eXBlbmFtZSBUID4KK3N0cnVjdCBpX21heG1pbiB7CisgICAgc3RhdGljIGNvbnN0IFQgbXg7CisgICAgc3RhdGljIGNvbnN0IFQgbW47Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IGludCBteCA9IDB4N2ZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IGludCBtbiA9IDB4ODAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCB1bnNpZ25lZCBpbnQgPiB7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBteCA9IDB4ZmZmZmZmZmY7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGludCBtbiA9IDB4MDAwMDAwMDA7Cit9OwordGVtcGxhdGU8Pgorc3RydWN0IGlfbWF4bWluPCBsb25nIGxvbmcgPiB7CisgICAgc3RhdGljIGNvbnN0IGxvbmcgbG9uZyBteCA9IDB4N2ZmZmZmZmZmZmZmZmZmZkxMOworICAgIHN0YXRpYyBjb25zdCBsb25nIGxvbmcgbW4gPSAweDgwMDAwMDAwMDAwMDAwMDBMTDsKK307Cit0ZW1wbGF0ZTw+CitzdHJ1Y3QgaV9tYXhtaW48IHVuc2lnbmVkIGxvbmcgbG9uZyA+IHsKKyAgICBzdGF0aWMgY29uc3QgdW5zaWduZWQgbG9uZyBsb25nIG14ID0gMHhmZmZmZmZmZmZmZmZmZmZmTEw7CisgICAgc3RhdGljIGNvbnN0IHVuc2lnbmVkIGxvbmcgbG9uZyBtbiA9IDB4MDAwMDAwMDAwMDAwMDAwMExMOworfTsKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2lmZGVmIEtNUF9ERUJVRworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyB0ZW1wbGF0ZSBmb3IgZGVidWcgcHJpbnRzIHNwZWNpZmljYXRpb24gKCBkLCB1LCBsbGQsIGxsdSApCisgICAgY2hhciBjb25zdCAqIHRyYWl0c190PCBpbnQgPjo6c3BlYyA9ICJkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGludCA+OjpzcGVjID0gInUiOworICAgIGNoYXIgY29uc3QgKiB0cmFpdHNfdDwgbG9uZyBsb25nID46OnNwZWMgPSAibGxkIjsKKyAgICBjaGFyIGNvbnN0ICogdHJhaXRzX3Q8IHVuc2lnbmVkIGxvbmcgbG9uZyA+OjpzcGVjID0gImxsdSI7CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyNlbmRpZgorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZm9yX3N0YXRpY19pbml0KAorICAgIGlkZW50X3QgICAgICAgICAgICAgICAgICAgICAgICAgICpsb2MsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgIHNjaGVkdHlwZSwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwbG93ZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAqcHN0cmlkZSwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgaW5jciwKKyAgICB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgY2h1bmsKKykgeworICAgIEtNUF9DT1VOVF9CTE9DSyhPTVBfRk9SX3N0YXRpYyk7CisgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soRk9SX3N0YXRpY19zY2hlZHVsaW5nKTsKKworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICAvKiAgdGhpcyBhbGwgaGFzIHRvIGJlIGNoYW5nZWQgYmFjayB0byBUSUQgYW5kIHN1Y2guLiAqLworICAgIHJlZ2lzdGVyIGttcF9pbnQzMiAgIGd0aWQgPSBnbG9iYWxfdGlkOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRpZDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICBudGg7CisgICAgcmVnaXN0ZXIgVVQgICAgICAgICAgdHJpcF9jb3VudDsKKyAgICByZWdpc3RlciBrbXBfdGVhbV90ICp0ZWFtOworICAgIHJlZ2lzdGVyIGttcF9pbmZvX3QgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICBvbXB0X3RlYW1faW5mb190ICp0ZWFtX2luZm8gPSBOVUxMOworICAgIG9tcHRfdGFza19pbmZvX3QgKnRhc2tfaW5mbyA9IE5VTEw7CisKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIC8vIE9ubHkgZnVsbHkgaW5pdGlhbGl6ZSB2YXJpYWJsZXMgbmVlZGVkIGJ5IE9NUFQgaWYgT01QVCBpcyBlbmFibGVkLgorICAgICAgICB0ZWFtX2luZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKDAsIE5VTEwpOworICAgICAgICB0YXNrX2luZm8gPSBfX29tcHRfZ2V0X3Rhc2tpbmZvKDApOworICAgIH0KKyNlbmRpZgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggcGxhc3RpdGVyICYmIHBsb3dlciAmJiBwdXBwZXIgJiYgcHN0cmlkZSApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0IGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyUlZCBzY2hlZD0lJWQgbGl0ZXI9JSVkIGl0ZXI9KCUlJXMsIiBcCisgICAgICAgICAgICAiICUlJXMsICUlJXMpIGluY3I9JSUlcyBjaHVuaz0lJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGdsb2JhbF90aWQsIHNjaGVkdHlwZSwgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlLCBpbmNyLCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgaWYgKCBpbmNyID09IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jclplcm9Qcm9oaWJpdGVkLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIC8qIHNwZWNpYWwgaGFuZGxpbmcgZm9yIHplcm8tdHJpcCBsb29wcyAqLworICAgIGlmICggaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSApIHsKKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSBGQUxTRTsKKyAgICAgICAgLyogbGVhdmUgcHVwcGVyIGFuZCBwbG93ZXIgc2V0IHRvIGVudGlyZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBzdHJpZGUgPSBpbmNyOyAgIC8qIHZhbHVlIHNob3VsZCBuZXZlciBiZSB1c2VkICovCisJLy8gICAgICAgICpwbG93ZXIgPSAqcHVwcGVyIC0gaW5jcjsgICAvLyBsZXQgY29tcGlsZXIgYnlwYXNzIHRoZSBpbGxlZ2FsIGxvb3AgKGxpa2UgZm9yKGk9MTtpPDEwO2ktLSkpICBUSElTIExJTkUgQ0FVU0VEIHNoYXBlMkYvaF90ZXN0c18xLmYgVE8gSEFWRSBBIEZBSUxVUkUgT04gQSBaRVJPLVRSSVAgTE9PUCAobG93ZXI9MSxcCisJICB1cHBlcj0wLHN0cmlkZT0xKSAtIEpQSCBKdW5lIDIzLCAyMDA5LgorICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDooWkVSTyBUUklQKSBsaXRlcj0lJWQgbG93ZXI9JSUlcyB1cHBlcj0lJSVzIHN0cmlkZSA9ICUlJXMgc2lnbmVkPzwlcz4sIGxvYyA9ICUlc1xuIiwKKyAgICAgICAgICAgICAgICB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjLCB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlLCBsb2MtPnBzb3VyY2UgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgS01QX0NPVU5UX1ZBTFVFIChGT1Jfc3RhdGljX2l0ZXJhdGlvbnMsIDApOworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgLy8gQWx0aG91Z2ggdGhlcmUgYXJlIHNjaGVkdWxlIGVudW1lcmF0aW9ucyBhYm92ZSBrbXBfb3JkX3VwcGVyIHdoaWNoIGFyZSBub3Qgc2NoZWR1bGVzIGZvciAiZGlzdHJpYnV0ZSIsCisgICAgLy8gdGhlIG9ubHkgb25lcyB3aGljaCBhcmUgdXNlZnVsIGFyZSBkeW5hbWljLCBzbyBjYW5ub3QgYmUgc2VlbiBoZXJlLCBzaW5jZSB0aGlzIGNvZGVwYXRoIGlzIG9ubHkgZXhlY3V0ZWQKKyAgICAvLyBmb3Igc3RhdGljIHNjaGVkdWxlcy4KKyAgICBpZiAoIHNjaGVkdHlwZSA+IGttcF9vcmRfdXBwZXIgKSB7CisgICAgICAgIC8vIHdlIGFyZSBpbiBESVNUUklCVVRFIGNvbnN0cnVjdAorICAgICAgICBzY2hlZHR5cGUgKz0ga21wX3NjaF9zdGF0aWMgLSBrbXBfZGlzdHJpYnV0ZV9zdGF0aWM7ICAgICAgLy8gQUM6IGNvbnZlcnQgdG8gdXN1YWwgc2NoZWR1bGUgdHlwZQorICAgICAgICB0aWQgID0gdGgtPnRoLnRoX3RlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW0tPnQudF9wYXJlbnQ7CisgICAgfSBlbHNlCisgICAgI2VuZGlmCisgICAgeworICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworICAgICAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgfQorCisgICAgLyogZGV0ZXJtaW5lIGlmICJmb3IiIGxvb3AgaXMgYW4gYWN0aXZlIHdvcmtzaGFyaW5nIGNvbnN0cnVjdCAqLworICAgIGlmICggdGVhbSAtPiB0LnRfc2VyaWFsaXplZCApIHsKKyAgICAgICAgLyogc2VyaWFsaXplZCBwYXJhbGxlbCwgZWFjaCB0aHJlYWQgZXhlY3V0ZXMgd2hvbGUgaXRlcmF0aW9uIHNwYWNlICovCisgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAqcGxhc3RpdGVyID0gVFJVRTsKKyAgICAgICAgLyogbGVhdmUgcHVwcGVyIGFuZCBwbG93ZXIgc2V0IHRvIGVudGlyZSBpdGVyYXRpb24gc3BhY2UgKi8KKyAgICAgICAgKnBzdHJpZGUgPSAoaW5jciA+IDApID8gKCpwdXBwZXIgLSAqcGxvd2VyICsgMSkgOiAoLSgqcGxvd2VyIC0gKnB1cHBlciArIDEpKTsKKworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogKHNlcmlhbCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBudGggPSB0ZWFtLT50LnRfbnByb2M7CisgICAgaWYgKCBudGggPT0gMSApIHsKKyAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICpwbGFzdGl0ZXIgPSBUUlVFOworICAgICAgICAqcHN0cmlkZSA9IChpbmNyID4gMCkgPyAoKnB1cHBlciAtICpwbG93ZXIgKyAxKSA6ICgtKCpwbG93ZXIgLSAqcHVwcGVyICsgMSkpOworICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAgICAgLy8gY3JlYXRlIGZvcm1hdCBzcGVjaWZpZXJzIGJlZm9yZSB0aGUgZGVidWcgb3V0cHV0CisgICAgICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogKHNlcmlhbCkgbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzXG4iLAorICAgICAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjICk7CisgICAgICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgKnBsYXN0aXRlciwgKnBsb3dlciwgKnB1cHBlciwgKnBzdHJpZGUgKSApOworICAgICAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgICAgIH0KKyAgICAgICAgI2VuZGlmCisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfbG9vcF9iZWdpbikpIHsKKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgICAgICB0ZWFtX2luZm8tPnBhcmFsbGVsX2lkLCB0YXNrX2luZm8tPnRhc2tfaWQsCisgICAgICAgICAgICAgICAgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8qIGNvbXB1dGUgdHJpcCBjb3VudCAqLworICAgIGlmICggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZiAoaW5jciA9PSAtMSkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnBsb3dlciAtICpwdXBwZXIgKyAxOworICAgIH0gZWxzZSBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcHVwcGVyIC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICB9IGVsc2UgeworICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSgqcGxvd2VyIC0gKnB1cHBlcikgLyAoLWluY3IpICsgMTsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgLyogdHJpcGNvdW50IG92ZXJmbG93PyAqLworICAgICAgICBpZiAoIHRyaXBfY291bnQgPT0gMCAmJiAqcHVwcGVyICE9ICpwbG93ZXIgKSB7CisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNJdGVyYXRpb25SYW5nZVRvb0xhcmdlLCBjdF9wZG8sIGxvYyApOworICAgICAgICB9CisgICAgfQorICAgIEtNUF9DT1VOVF9WQUxVRSAoRk9SX3N0YXRpY19pdGVyYXRpb25zLCB0cmlwX2NvdW50KTsKKworICAgIC8qIGNvbXB1dGUgcmVtYWluaW5nIHBhcmFtZXRlcnMgKi8KKyAgICBzd2l0Y2ggKCBzY2hlZHR5cGUgKSB7CisgICAgY2FzZSBrbXBfc2NoX3N0YXRpYzoKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKCB0cmlwX2NvdW50IDwgbnRoICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgfHwgXAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgICAgICAgICApOyAvLyBVbmtub3duIHN0YXRpYyBzY2hlZHVsaW5nIHR5cGUuCisgICAgICAgICAgICAgICAgaWYgKCB0aWQgPCB0cmlwX2NvdW50ICkgeworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciA9ICpwbG93ZXIgKyB0aWQgKiBpbmNyOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IHRyaXBfY291bnQgLSAxICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBzbWFsbF9jaHVuayA9IHRyaXBfY291bnQgLyBudGg7CisgICAgICAgICAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGV4dHJhcyA9IHRyaXBfY291bnQgJSBudGg7CisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgKz0gaW5jciAqICggdGlkICogc21hbGxfY2h1bmsgKyAoIHRpZCA8IGV4dHJhcyA/IHRpZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgc21hbGxfY2h1bmsgKiBpbmNyIC0gKCB0aWQgPCBleHRyYXMgPyAwIDogaW5jciApOworICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IG50aCAtIDEgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIGJpZ19jaHVua19pbmNfY291bnQgPSAoIHRyaXBfY291bnQvbnRoICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCAoIHRyaXBfY291bnQgJSBudGggKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgcmVnaXN0ZXIgVCBvbGRfdXBwZXIgPSAqcHVwcGVyOworCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IHRpZCAqIGJpZ19jaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgYmlnX2NodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5jciA+IDAgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8ICpwbG93ZXIgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPD0gb2xkX3VwcGVyICYmICpwdXBwZXIgPiBvbGRfdXBwZXIgLSBpbmNyOworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyID4gb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICAgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcHVwcGVyID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9IGlfbWF4bWluPCBUID46Om1uOworICAgICAgICAgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA+PSBvbGRfdXBwZXIgJiYgKnB1cHBlciA8IG9sZF91cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPCBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFNUIHNwYW47CisgICAgICAgICAgICBpZiAoIGNodW5rIDwgMSApIHsKKyAgICAgICAgICAgICAgICBjaHVuayA9IDE7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBzdHJpZGUgPSBzcGFuICogbnRoOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKHRpZCA9PSAoKHRyaXBfY291bnQgLSAxKS8oIFVUICljaHVuaykgJSBudGgpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfYmFsYW5jZWRfY2h1bmtlZDoKKyAgICAgICAgeworICAgICAgICAgICAgcmVnaXN0ZXIgVCBvbGRfdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgLy8gcm91bmQgdXAgdG8gbWFrZSBzdXJlIHRoZSBjaHVuayBpcyBlbm91Z2ggdG8gY292ZXIgYWxsIGl0ZXJhdGlvbnMKKyAgICAgICAgICAgIHJlZ2lzdGVyIFVUIHNwYW4gPSAodHJpcF9jb3VudCtudGgtMSkgLyBudGg7CisKKyAgICAgICAgICAgIC8vIHBlcmZvcm0gY2h1bmsgYWRqdXN0bWVudAorICAgICAgICAgICAgY2h1bmsgPSAoc3BhbiArIGNodW5rIC0gMSkgJiB+KGNodW5rLTEpOworCisgICAgICAgICAgICBzcGFuID0gY2h1bmsgKiBpbmNyOworICAgICAgICAgICAgKnBsb3dlciA9ICpwbG93ZXIgKyAoc3BhbiAqIHRpZCk7CisgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIHNwYW4gLSBpbmNyOworICAgICAgICAgICAgaWYgKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgaWYgKCAqcHVwcGVyID4gb2xkX3VwcGVyICkgKnB1cHBlciA9IG9sZF91cHBlcjsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICBpZiAoICpwdXBwZXIgPCBvbGRfdXBwZXIgKSAqcHVwcGVyID0gb2xkX3VwcGVyOworCisgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAoIHRpZCA9PSAoKHRyaXBfY291bnQgLSAxKS8oIFVUICljaHVuaykgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisjZW5kaWYKKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMiggMCwgIl9fa21wY19mb3Jfc3RhdGljX2luaXQ6IHVua25vd24gc2NoZWR1bGluZyB0eXBlIiApOworICAgICAgICBicmVhazsKKyAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgLy8gUmVwb3J0IGxvb3AgbWV0YWRhdGEKKyAgICBpZiAoIEtNUF9NQVNURVJfVElEKHRpZCkgJiYgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAmJiBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSA9PSAzICYmCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayA9PSBOVUxMICYmCisjZW5kaWYKKyAgICAgICAgdGVhbS0+dC50X2FjdGl2ZV9sZXZlbCA9PSAxICkKKyAgICB7CisgICAgICAgIGttcF91aW50NjQgY3VyX2NodW5rID0gY2h1bms7CisgICAgICAgIC8vIENhbGN1bGF0ZSBjaHVuayBpbiBjYXNlIGl0IHdhcyBub3Qgc3BlY2lmaWVkOyBpdCBpcyBzcGVjaWZpZWQgZm9yIGttcF9zY2hfc3RhdGljX2NodW5rZWQKKyAgICAgICAgaWYgKCBzY2hlZHR5cGUgPT0ga21wX3NjaF9zdGF0aWMgKSB7CisgICAgICAgICAgICBjdXJfY2h1bmsgPSB0cmlwX2NvdW50IC8gbnRoICsgKCAoIHRyaXBfY291bnQgJSBudGggKSA/IDEgOiAwKTsKKyAgICAgICAgfQorICAgICAgICAvLyAwIC0gInN0YXRpYyIgc2NoZWR1bGUKKyAgICAgICAgX19rbXBfaXR0X21ldGFkYXRhX2xvb3AobG9jLCAwLCB0cmlwX2NvdW50LCBjdXJfY2h1bmspOworICAgIH0KKyNlbmRpZgorICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICB7CisgICAgICAgIGNvbnN0IGNoYXIgKiBidWZmOworICAgICAgICAvLyBjcmVhdGUgZm9ybWF0IHNwZWNpZmllcnMgYmVmb3JlIHRoZSBkZWJ1ZyBvdXRwdXQKKyAgICAgICAgYnVmZiA9IF9fa21wX3N0cl9mb3JtYXQoCisgICAgICAgICAgICAiX19rbXBjX2Zvcl9zdGF0aWNfaW5pdDogbGl0ZXI9JSVkIGxvd2VyPSUlJXMgdXBwZXI9JSUlcyBzdHJpZGUgPSAlJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsICpwbGFzdGl0ZXIsICpwbG93ZXIsICpwdXBwZXIsICpwc3RyaWRlICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZyZWUoICZidWZmICk7CisgICAgfQorICAgICNlbmRpZgorICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZm9yX3N0YXRpY19pbml0OiBUIyVkIHJldHVyblxuIiwgZ2xvYmFsX3RpZCApICk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2xvb3BfYmVnaW4pKSB7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luKSgKKyAgICAgICAgICAgIHRlYW1faW5mby0+cGFyYWxsZWxfaWQsIHRhc2tfaW5mby0+dGFza19pZCwgdGVhbV9pbmZvLT5taWNyb3Rhc2spOworICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuOworfQorCit0ZW1wbGF0ZTwgdHlwZW5hbWUgVCA+CitzdGF0aWMgdm9pZAorX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgc2NoZWR1bGUsCisgICAga21wX2ludDMyICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciwKKyAgICBUICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxvd2VyLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwdXBwZXIsCisgICAgVCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgKnBzdHJpZGUsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGluY3IsCisgICAgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6c2lnbmVkX3QgIGNodW5rCispIHsKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX0RJU1RSSUJVVEUpOworICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICByZWdpc3RlciBrbXBfdWludDMyICB0aWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRoOworICAgIHJlZ2lzdGVyIGttcF91aW50MzIgIHRlYW1faWQ7CisgICAgcmVnaXN0ZXIga21wX3VpbnQzMiAgbnRlYW1zOworICAgIHJlZ2lzdGVyIFVUICAgICAgICAgIHRyaXBfY291bnQ7CisgICAgcmVnaXN0ZXIga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICogdGg7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwbGFzdGl0ZXIgJiYgcGxvd2VyICYmIHB1cHBlciAmJiBwdXBwZXJEaXN0ICYmIHBzdHJpZGUgKTsKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0IGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IFQjJSVkIHNjaGVkTG9vcD0lJWQgbGl0ZXI9JSVkICJcCisgICAgICAgICAgICAiaXRlcj0oJSUlcywgJSUlcywgJSUlcykgY2h1bms9JSUlcyBzaWduZWQ/PCVzPlxuIiwKKyAgICAgICAgICAgIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMsIHRyYWl0c190PCBTVCA+OjpzcGVjLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFNUID46OnNwZWMsIHRyYWl0c190PCBUID46OnNwZWMgKTsKKyAgICAgICAgS0RfVFJBQ0UoMTAwLCAoIGJ1ZmYsIGd0aWQsIHNjaGVkdWxlLCAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgICAqcGxvd2VyLCAqcHVwcGVyLCBpbmNyLCBjaHVuayApICk7CisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmYnVmZiApOworICAgIH0KKyAgICAjZW5kaWYKKworICAgIGlmKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBndGlkLCBjdF9wZG8sIGxvYyApOworICAgICAgICBpZiggaW5jciA9PSAwICkgeworICAgICAgICAgICAgX19rbXBfZXJyb3JfY29uc3RydWN0KCBrbXBfaTE4bl9tc2dfQ25zTG9vcEluY3JaZXJvUHJvaGliaXRlZCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgICAgICBpZiggaW5jciA+IDAgPyAoKnB1cHBlciA8ICpwbG93ZXIpIDogKCpwbG93ZXIgPCAqcHVwcGVyKSApIHsKKyAgICAgICAgICAgIC8vIFRoZSBsb29wIGlzIGlsbGVnYWwuCisgICAgICAgICAgICAvLyBTb21lIHplcm8tdHJpcCBsb29wcyBtYWludGFpbmVkIGJ5IGNvbXBpbGVyLCBlLmcuOgorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7KytpKSAvLyBsb3dlciA+PSB1cHBlciAtIHJ1bi10aW1lIGNoZWNrCisgICAgICAgICAgICAvLyAgIGZvcihpPTA7aT4xMDstLWkpIC8vIGxvd2VyIDw9IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOysraSkgLy8gaW5jciA+IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MTA7aTwwOy0taSkgLy8gaW5jciA8IDAgICAgICAgLSBjb21waWxlLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vIENvbXBpbGVyIGRvZXMgbm90IGNoZWNrIHRoZSBmb2xsb3dpbmcgaWxsZWdhbCBsb29wczoKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPDEwO2krPWluY3IpIC8vIHdoZXJlIGluY3I8MAorICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPjA7aS09aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICBfX2ttcF9lcnJvcl9jb25zdHJ1Y3QoIGttcF9pMThuX21zZ19DbnNMb29wSW5jcklsbGVnYWwsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICB9CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIHRoID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBudGggPSB0aC0+dGgudGhfdGVhbV9ucHJvYzsKKyAgICB0ZWFtID0gdGgtPnRoLnRoX3RlYW07CisgICAgI2lmIE9NUF80MF9FTkFCTEVECisgICAgS01QX0RFQlVHX0FTU0VSVCh0aC0+dGgudGhfdGVhbXNfbWljcm90YXNrKTsgICAvLyB3ZSBhcmUgaW4gdGhlIHRlYW1zIGNvbnN0cnVjdAorICAgIG50ZWFtcyA9IHRoLT50aC50aF90ZWFtc19zaXplLm50ZWFtczsKKyAgICAjZW5kaWYKKyAgICB0ZWFtX2lkID0gdGVhbS0+dC50X21hc3Rlcl90aWQ7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGVhbXMgPT0gdGVhbS0+dC50X3BhcmVudC0+dC50X25wcm9jKTsKKworICAgIC8vIGNvbXB1dGUgZ2xvYmFsIHRyaXAgY291bnQKKyAgICBpZiggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gKnB1cHBlciAtICpwbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZihpbmNyID09IC0xKSB7CisgICAgICAgIHRyaXBfY291bnQgPSAqcGxvd2VyIC0gKnB1cHBlciArIDE7CisgICAgfSBlbHNlIGlmICggaW5jciA+IDAgKSB7CisgICAgICAgIC8vIHVwcGVyLWxvd2VyIGNhbiBleGNlZWQgdGhlIGxpbWl0IG9mIHNpZ25lZCB0eXBlCisgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwdXBwZXIgLSAqcGxvd2VyKSAvIGluY3IgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwbG93ZXIgLSAqcHVwcGVyKSAvICgtaW5jcikgKyAxOworICAgIH0KKworICAgICpwc3RyaWRlID0gKnB1cHBlciAtICpwbG93ZXI7ICAvLyBqdXN0IGluIGNhc2UgKGNhbiBiZSB1bnVzZWQpCisgICAgaWYoIHRyaXBfY291bnQgPD0gbnRlYW1zICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSB8fCBcCisgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfYmFsYW5jZWQKKyAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAvLyBvbmx5IG1hc3RlcnMgb2Ygc29tZSB0ZWFtcyBnZXQgc2luZ2xlIGl0ZXJhdGlvbiwgb3RoZXIgdGhyZWFkcyBnZXQgbm90aGluZworICAgICAgICBpZiggdGVhbV9pZCA8IHRyaXBfY291bnQgJiYgdGlkID09IDAgKSB7CisgICAgICAgICAgICAqcHVwcGVyID0gKnB1cHBlckRpc3QgPSAqcGxvd2VyID0gKnBsb3dlciArIHRlYW1faWQgKiBpbmNyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgKnB1cHBlckRpc3QgPSAqcHVwcGVyOworICAgICAgICAgICAgKnBsb3dlciA9ICpwdXBwZXIgKyBpbmNyOyAvLyBjb21waWxlciBzaG91bGQgc2tpcCBsb29wIGJvZHkKKyAgICAgICAgfQorICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGlkID09IDAgJiYgdGVhbV9pZCA9PSB0cmlwX2NvdW50IC0gMSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8vIEdldCB0aGUgdGVhbSdzIGNodW5rIGZpcnN0IChlYWNoIHRlYW0gZ2V0cyBhdCBtb3N0IG9uZSBjaHVuaykKKyAgICAgICAgaWYoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZCApIHsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFVUIGNodW5rRCA9IHRyaXBfY291bnQgLyBudGVhbXM7CisgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRlYW1zOworICAgICAgICAgICAgKnBsb3dlciArPSBpbmNyICogKCB0ZWFtX2lkICogY2h1bmtEICsgKCB0ZWFtX2lkIDwgZXh0cmFzID8gdGVhbV9pZCA6IGV4dHJhcyApICk7CisgICAgICAgICAgICAqcHVwcGVyRGlzdCA9ICpwbG93ZXIgKyBjaHVua0QgKiBpbmNyIC0gKCB0ZWFtX2lkIDwgZXh0cmFzID8gMCA6IGluY3IgKTsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICggdGVhbV9pZCA9PSBudGVhbXMgLSAxICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgKCB0cmlwX2NvdW50IC8gbnRlYW1zICsgKCAoIHRyaXBfY291bnQgJSBudGVhbXMgKSA/IDEgOiAwKSApICogaW5jcjsKKyAgICAgICAgICAgIHJlZ2lzdGVyIFQgdXBwZXIgPSAqcHVwcGVyOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2dyZWVkeSApOworICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICpwbG93ZXIgKz0gdGVhbV9pZCAqIGNodW5rX2luY19jb3VudDsKKyAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gKnBsb3dlciArIGNodW5rX2luY19jb3VudCAtIGluY3I7CisgICAgICAgICAgICAvLyBDaGVjay9jb3JyZWN0IGJvdW5kcyBpZiBuZWVkZWQKKyAgICAgICAgICAgIGlmKCBpbmNyID4gMCApIHsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlckRpc3QgPCAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlckRpc3QgPSBpX21heG1pbjwgVCA+OjpteDsKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gKnBsb3dlciA8PSB1cHBlciAmJiAqcHVwcGVyRGlzdCA+IHVwcGVyIC0gaW5jcjsKKyAgICAgICAgICAgICAgICBpZiggKnB1cHBlckRpc3QgPiB1cHBlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gdXBwZXI7IC8vIHRyYWNrZXIgQzczMjU4CisgICAgICAgICAgICAgICAgaWYoICpwbG93ZXIgPiAqcHVwcGVyRGlzdCApIHsKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwdXBwZXJEaXN0OyAgLy8gbm8gaXRlcmF0aW9ucyBhdmFpbGFibGUgZm9yIHRoZSB0ZWFtCisgICAgICAgICAgICAgICAgICAgIGdvdG8gZW5kOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0ID4gKnBsb3dlciApCisgICAgICAgICAgICAgICAgICAgICpwdXBwZXJEaXN0ID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgaWYoIHBsYXN0aXRlciAhPSBOVUxMICkKKyAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9ICpwbG93ZXIgPj0gdXBwZXIgJiYgKnB1cHBlckRpc3QgPCB1cHBlciAtIGluY3I7CisgICAgICAgICAgICAgICAgaWYoICpwdXBwZXJEaXN0IDwgdXBwZXIgKQorICAgICAgICAgICAgICAgICAgICAqcHVwcGVyRGlzdCA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgIGlmKCAqcGxvd2VyIDwgKnB1cHBlckRpc3QgKSB7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcHVwcGVyRGlzdDsgIC8vIG5vIGl0ZXJhdGlvbnMgYXZhaWxhYmxlIGZvciB0aGUgdGVhbQorICAgICAgICAgICAgICAgICAgICBnb3RvIGVuZDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLy8gR2V0IHRoZSBwYXJhbGxlbCBsb29wIGNodW5rIG5vdyAoZm9yIHRocmVhZCkKKyAgICAgICAgLy8gY29tcHV0ZSB0cmlwIGNvdW50IGZvciB0ZWFtJ3MgY2h1bmsKKyAgICAgICAgaWYoIGluY3IgPT0gMSApIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAqcHVwcGVyRGlzdCAtICpwbG93ZXIgKyAxOworICAgICAgICB9IGVsc2UgaWYoaW5jciA9PSAtMSkgeworICAgICAgICAgICAgdHJpcF9jb3VudCA9ICpwbG93ZXIgLSAqcHVwcGVyRGlzdCArIDE7CisgICAgICAgIH0gZWxzZSBpZiAoIGluY3IgPiAxICkgeworICAgICAgICAgICAgLy8gdXBwZXItbG93ZXIgY2FuIGV4Y2VlZCB0aGUgbGltaXQgb2Ygc2lnbmVkIHR5cGUKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwdXBwZXJEaXN0IC0gKnBsb3dlcikgLyBpbmNyICsgMTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKCpwbG93ZXIgLSAqcHVwcGVyRGlzdCkgLyAoLWluY3IpICsgMTsKKyAgICAgICAgfQorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0cmlwX2NvdW50ICk7CisgICAgICAgIHN3aXRjaCggc2NoZWR1bGUgKSB7CisgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgIHsKKyAgICAgICAgICAgIGlmKCB0cmlwX2NvdW50IDw9IG50aCApIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5IHx8IFwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkCisgICAgICAgICAgICAgICAgKTsgLy8gVW5rbm93biBzdGF0aWMgc2NoZWR1bGluZyB0eXBlLgorICAgICAgICAgICAgICAgIGlmKCB0aWQgPCB0cmlwX2NvdW50ICkKKyAgICAgICAgICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgPSAqcGxvd2VyICsgdGlkICogaW5jcjsKKyAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICpwbG93ZXIgPSAqcHVwcGVyICsgaW5jcjsgLy8gbm8gaXRlcmF0aW9ucyBhdmFpbGFibGUKKyAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICBpZiggKnBsYXN0aXRlciAhPSAwICYmICEoIHRpZCA9PSB0cmlwX2NvdW50IC0gMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICpwbGFzdGl0ZXIgPSAwOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBjaHVua0wgPSB0cmlwX2NvdW50IC8gbnRoOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBVVCBleHRyYXMgPSB0cmlwX2NvdW50ICUgbnRoOworICAgICAgICAgICAgICAgICAgICAqcGxvd2VyICs9IGluY3IgKiAodGlkICogY2h1bmtMICsgKHRpZCA8IGV4dHJhcyA/IHRpZCA6IGV4dHJhcykpOworICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gKnBsb3dlciArIGNodW5rTCAqIGluY3IgLSAodGlkIDwgZXh0cmFzID8gMCA6IGluY3IpOworICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKCB0aWQgPT0gbnRoIC0gMSApICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIGNodW5rX2luY19jb3VudCA9CisgICAgICAgICAgICAgICAgICAgICAgICAoIHRyaXBfY291bnQgLyBudGggKyAoICggdHJpcF9jb3VudCAlIG50aCApID8gMSA6IDApICkgKiBpbmNyOworICAgICAgICAgICAgICAgICAgICByZWdpc3RlciBUIHVwcGVyID0gKnB1cHBlckRpc3Q7CisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3N0YXRpYyA9PSBrbXBfc2NoX3N0YXRpY19ncmVlZHkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVua25vd24gc3RhdGljIHNjaGVkdWxpbmcgdHlwZS4KKyAgICAgICAgICAgICAgICAgICAgKnBsb3dlciArPSB0aWQgKiBjaHVua19pbmNfY291bnQ7CisgICAgICAgICAgICAgICAgICAgICpwdXBwZXIgPSAqcGxvd2VyICsgY2h1bmtfaW5jX2NvdW50IC0gaW5jcjsKKyAgICAgICAgICAgICAgICAgICAgaWYoIGluY3IgPiAwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPCAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bXg7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISgqcGxvd2VyIDw9IHVwcGVyICYmICpwdXBwZXIgPiB1cHBlciAtIGluY3IpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA+IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7Ly90cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYoICpwdXBwZXIgPiAqcGxvd2VyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gaV9tYXhtaW48IFQgPjo6bW47CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggcGxhc3RpdGVyICE9IE5VTEwgKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAqcGxhc3RpdGVyICE9IDAgJiYgISgqcGxvd2VyID49IHVwcGVyICYmICpwdXBwZXIgPCB1cHBlciAtIGluY3IpICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKnBsYXN0aXRlciA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiggKnB1cHBlciA8IHVwcGVyICkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqcHVwcGVyID0gdXBwZXI7Ly90cmFja2VyIEM3MzI1OAorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICB7CisgICAgICAgICAgICByZWdpc3RlciBTVCBzcGFuOworICAgICAgICAgICAgaWYoIGNodW5rIDwgMSApCisgICAgICAgICAgICAgICAgY2h1bmsgPSAxOworICAgICAgICAgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAgICAgICAgICpwc3RyaWRlID0gc3BhbiAqIG50aDsKKyAgICAgICAgICAgICpwbG93ZXIgPSAqcGxvd2VyICsgKHNwYW4gKiB0aWQpOworICAgICAgICAgICAgKnB1cHBlciA9ICpwbG93ZXIgKyBzcGFuIC0gaW5jcjsKKyAgICAgICAgICAgIGlmKCBwbGFzdGl0ZXIgIT0gTlVMTCApCisgICAgICAgICAgICAgICAgaWYoICpwbGFzdGl0ZXIgIT0gMCAmJiAhKHRpZCA9PSAoKHRyaXBfY291bnQgLSAxKSAvICggVVQgKWNodW5rKSAlIG50aCkgKQorICAgICAgICAgICAgICAgICAgICAqcGxhc3RpdGVyID0gMDsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBLTVBfQVNTRVJUMiggMCwgIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdDogdW5rbm93biBsb29wIHNjaGVkdWxpbmcgdHlwZSIgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorICAgIGVuZDo7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCgKKyAgICAgICAgICAgICJfX2ttcGNfZGlzdF9mb3Jfc3RhdGljX2luaXQ6IGxhc3Q9JSVkIGxvPSUlJXMgdXA9JSUlcyB1cERpc3Q9JSUlcyAiXAorICAgICAgICAgICAgInN0cmlkZT0lJSVzIHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywKKyAgICAgICAgICAgIHRyYWl0c190PCBTVCA+OjpzcGVjLCB0cmFpdHNfdDwgVCA+OjpzcGVjICk7CisgICAgICAgIEtEX1RSQUNFKDEwMCwgKCBidWZmLCAqcGxhc3RpdGVyLCAqcGxvd2VyLCAqcHVwcGVyLCAqcHVwcGVyRGlzdCwgKnBzdHJpZGUgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdDogVCMlZCByZXR1cm5cbiIsIGd0aWQgKSApOworICAgIHJldHVybjsKK30KKwordGVtcGxhdGU8IHR5cGVuYW1lIFQgPgorc3RhdGljIHZvaWQKK19fa21wX3RlYW1fc3RhdGljX2luaXQoCisgICAgaWRlbnRfdCAgICAgICAgICAgICAgICAgICAgICAgICAgKmxvYywKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICAgICAgICAqcF9sYXN0LAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX2xiLAorICAgIFQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpwX3ViLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICpwX3N0LAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBpbmNyLAorICAgIHR5cGVuYW1lIHRyYWl0c190PCBUID46OnNpZ25lZF90ICBjaHVuaworKSB7CisgICAgLy8gVGhlIHJvdXRpbmUgcmV0dXJucyB0aGUgZmlyc3QgY2h1bmsgZGlzdHJpYnV0ZWQgdG8gdGhlIHRlYW0gYW5kCisgICAgLy8gc3RyaWRlIGZvciBuZXh0IGNodW5rcyBjYWxjdWxhdGlvbi4KKyAgICAvLyBMYXN0IGl0ZXJhdGlvbiBmbGFnIHNldCBmb3IgdGhlIHRlYW0gdGhhdCB3aWxsIGV4ZWN1dGUKKyAgICAvLyB0aGUgbGFzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3AuCisgICAgLy8gVGhlIHJvdXRpbmUgaXMgY2FsbGVkIGZvciBkaXN0X3NjaGVkdWUoc3RhdGljLGNodW5rKSBvbmx5LgorICAgIHR5cGVkZWYgdHlwZW5hbWUgdHJhaXRzX3Q8IFQgPjo6dW5zaWduZWRfdCAgVVQ7CisgICAgdHlwZWRlZiB0eXBlbmFtZSB0cmFpdHNfdDwgVCA+OjpzaWduZWRfdCAgICBTVDsKKyAgICBrbXBfdWludDMyICB0ZWFtX2lkOworICAgIGttcF91aW50MzIgIG50ZWFtczsKKyAgICBVVCAgICAgICAgICB0cmlwX2NvdW50OworICAgIFQgICAgICAgICAgIGxvd2VyOworICAgIFQgICAgICAgICAgIHVwcGVyOworICAgIFNUICAgICAgICAgIHNwYW47CisgICAga21wX3RlYW1fdCAqdGVhbTsKKyAgICBrbXBfaW5mb190ICp0aDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHBfbGFzdCAmJiBwX2xiICYmIHBfdWIgJiYgcF9zdCApOworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcF90ZWFtX3N0YXRpY19pbml0IGNhbGxlZCAoJWQpXG4iLCBndGlkKSk7CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCggIl9fa21wX3RlYW1fc3RhdGljX2luaXQgZW50ZXI6IFQjJSVkIGxpdGVyPSUlZCAiXAorICAgICAgICAgICAgIml0ZXI9KCUlJXMsICUlJXMsICUlJXMpIGNodW5rICUlJXM7IHNpZ25lZD88JXM+XG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgKnBfbGFzdCwgKnBfbGIsICpwX3ViLCAqcF9zdCwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCisKKyAgICBsb3dlciA9ICpwX2xiOworICAgIHVwcGVyID0gKnBfdWI7CisgICAgaWYoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgaWYoIGluY3IgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNyWmVyb1Byb2hpYml0ZWQsIGN0X3BkbywgbG9jICk7CisgICAgICAgIH0KKyAgICAgICAgaWYoIGluY3IgPiAwID8gKHVwcGVyIDwgbG93ZXIpIDogKGxvd2VyIDwgdXBwZXIpICkgeworICAgICAgICAgICAgLy8gVGhlIGxvb3AgaXMgaWxsZWdhbC4KKyAgICAgICAgICAgIC8vIFNvbWUgemVyby10cmlwIGxvb3BzIG1haW50YWluZWQgYnkgY29tcGlsZXIsIGUuZy46CisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k8MDsrK2kpIC8vIGxvd2VyID49IHVwcGVyIC0gcnVuLXRpbWUgY2hlY2sKKyAgICAgICAgICAgIC8vICAgZm9yKGk9MDtpPjEwOy0taSkgLy8gbG93ZXIgPD0gdXBwZXIgLSBydW4tdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k+MTA7KytpKSAvLyBpbmNyID4gMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gICBmb3IoaT0xMDtpPDA7LS1pKSAvLyBpbmNyIDwgMCAgICAgICAtIGNvbXBpbGUtdGltZSBjaGVjaworICAgICAgICAgICAgLy8gQ29tcGlsZXIgZG9lcyBub3QgY2hlY2sgdGhlIGZvbGxvd2luZyBpbGxlZ2FsIGxvb3BzOgorICAgICAgICAgICAgLy8gICBmb3IoaT0wO2k8MTA7aSs9aW5jcikgLy8gd2hlcmUgaW5jcjwwCisgICAgICAgICAgICAvLyAgIGZvcihpPTEwO2k+MDtpLT1pbmNyKSAvLyB3aGVyZSBpbmNyPDAKKyAgICAgICAgICAgIF9fa21wX2Vycm9yX2NvbnN0cnVjdCgga21wX2kxOG5fbXNnX0Nuc0xvb3BJbmNySWxsZWdhbCwgY3RfcGRvLCBsb2MgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICB0aCA9IF9fa21wX3RocmVhZHNbZ3RpZF07CisgICAgdGVhbSA9IHRoLT50aC50aF90ZWFtOworICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgIEtNUF9ERUJVR19BU1NFUlQodGgtPnRoLnRoX3RlYW1zX21pY3JvdGFzayk7ICAgLy8gd2UgYXJlIGluIHRoZSB0ZWFtcyBjb25zdHJ1Y3QKKyAgICBudGVhbXMgPSB0aC0+dGgudGhfdGVhbXNfc2l6ZS5udGVhbXM7CisgICAgI2VuZGlmCisgICAgdGVhbV9pZCA9IHRlYW0tPnQudF9tYXN0ZXJfdGlkOworICAgIEtNUF9ERUJVR19BU1NFUlQobnRlYW1zID09IHRlYW0tPnQudF9wYXJlbnQtPnQudF9ucHJvYyk7CisKKyAgICAvLyBjb21wdXRlIHRyaXAgY291bnQKKyAgICBpZiggaW5jciA9PSAxICkgeworICAgICAgICB0cmlwX2NvdW50ID0gdXBwZXIgLSBsb3dlciArIDE7CisgICAgfSBlbHNlIGlmKGluY3IgPT0gLTEpIHsKKyAgICAgICAgdHJpcF9jb3VudCA9IGxvd2VyIC0gdXBwZXIgKyAxOworICAgIH0gZWxzZSBpZiAoIGluY3IgPiAwICkgeworICAgICAgICAvLyB1cHBlci1sb3dlciBjYW4gZXhjZWVkIHRoZSBsaW1pdCBvZiBzaWduZWQgdHlwZQorICAgICAgICB0cmlwX2NvdW50ID0gKFVUKSh1cHBlciAtIGxvd2VyKSAvIGluY3IgKyAxOworICAgIH0gZWxzZSB7CisgICAgICAgIHRyaXBfY291bnQgPSAoVVQpKGxvd2VyIC0gdXBwZXIpIC8gKC1pbmNyKSArIDE7CisgICAgfQorICAgIGlmKCBjaHVuayA8IDEgKQorICAgICAgICBjaHVuayA9IDE7CisgICAgc3BhbiA9IGNodW5rICogaW5jcjsKKyAgICAqcF9zdCA9IHNwYW4gKiBudGVhbXM7CisgICAgKnBfbGIgPSBsb3dlciArIChzcGFuICogdGVhbV9pZCk7CisgICAgKnBfdWIgPSAqcF9sYiArIHNwYW4gLSBpbmNyOworICAgIGlmICggcF9sYXN0ICE9IE5VTEwgKQorICAgICAgICAqcF9sYXN0ID0gKHRlYW1faWQgPT0gKCh0cmlwX2NvdW50IC0gMSkvKFVUKWNodW5rKSAlIG50ZWFtcyk7CisgICAgLy8gQ29ycmVjdCB1cHBlciBib3VuZCBpZiBuZWVkZWQKKyAgICBpZiggaW5jciA+IDAgKSB7CisgICAgICAgIGlmKCAqcF91YiA8ICpwX2xiICkgLy8gb3ZlcmZsb3c/CisgICAgICAgICAgICAqcF91YiA9IGlfbWF4bWluPCBUID46Om14OworICAgICAgICBpZiggKnBfdWIgPiB1cHBlciApCisgICAgICAgICAgICAqcF91YiA9IHVwcGVyOyAvLyB0cmFja2VyIEM3MzI1OAorICAgIH0gZWxzZSB7ICAgLy8gaW5jciA8IDAKKyAgICAgICAgaWYoICpwX3ViID4gKnBfbGIgKQorICAgICAgICAgICAgKnBfdWIgPSBpX21heG1pbjwgVCA+OjptbjsKKyAgICAgICAgaWYoICpwX3ViIDwgdXBwZXIgKQorICAgICAgICAgICAgKnBfdWIgPSB1cHBlcjsgLy8gdHJhY2tlciBDNzMyNTgKKyAgICB9CisgICAgI2lmZGVmIEtNUF9ERUJVRworICAgIHsKKyAgICAgICAgY29uc3QgY2hhciAqIGJ1ZmY7CisgICAgICAgIC8vIGNyZWF0ZSBmb3JtYXQgc3BlY2lmaWVycyBiZWZvcmUgdGhlIGRlYnVnIG91dHB1dAorICAgICAgICBidWZmID0gX19rbXBfc3RyX2Zvcm1hdCggIl9fa21wX3RlYW1fc3RhdGljX2luaXQgZXhpdDogVCMlJWQgdGVhbSUldSBsaXRlcj0lJWQgIlwKKyAgICAgICAgICAgICJpdGVyPSglJSVzLCAlJSVzLCAlJSVzKSBjaHVuayAlJSVzXG4iLAorICAgICAgICAgICAgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFQgPjo6c3BlYywgdHJhaXRzX3Q8IFNUID46OnNwZWMsCisgICAgICAgICAgICB0cmFpdHNfdDwgU1QgPjo6c3BlYyApOworICAgICAgICBLRF9UUkFDRSgxMDAsICggYnVmZiwgZ3RpZCwgdGVhbV9pZCwgKnBfbGFzdCwgKnBfbGIsICpwX3ViLCAqcF9zdCwgY2h1bmsgKSApOworICAgICAgICBfX2ttcF9zdHJfZnJlZSggJmJ1ZmYgKTsKKyAgICB9CisgICAgI2VuZGlmCit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK2V4dGVybiAiQyIgeworCisvKiEKK0Bpbmdyb3VwIFdPUktfU0hBUklORworQHBhcmFtICAgIGxvYyAgICAgICBTb3VyY2UgY29kZSBsb2NhdGlvbgorQHBhcmFtICAgIGd0aWQgICAgICBHbG9iYWwgdGhyZWFkIGlkIG9mIHRoaXMgdGhyZWFkCitAcGFyYW0gICAgc2NoZWR0eXBlICBTY2hlZHVsaW5nIHR5cGUKK0BwYXJhbSAgICBwbGFzdGl0ZXIgUG9pbnRlciB0byB0aGUgImxhc3QgaXRlcmF0aW9uIiBmbGFnCitAcGFyYW0gICAgcGxvd2VyICAgIFBvaW50ZXIgdG8gdGhlIGxvd2VyIGJvdW5kCitAcGFyYW0gICAgcHVwcGVyICAgIFBvaW50ZXIgdG8gdGhlIHVwcGVyIGJvdW5kCitAcGFyYW0gICAgcHN0cmlkZSAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZQorQHBhcmFtICAgIGluY3IgICAgICBMb29wIGluY3JlbWVudAorQHBhcmFtICAgIGNodW5rICAgICBUaGUgY2h1bmsgc2l6ZQorCitFYWNoIG9mIHRoZSBmb3VyIGZ1bmN0aW9ucyBoZXJlIGFyZSBpZGVudGljYWwgYXBhcnQgZnJvbSB0aGUgYXJndW1lbnQgdHlwZXMuCisKK1RoZSBmdW5jdGlvbnMgY29tcHV0ZSB0aGUgdXBwZXIgYW5kIGxvd2VyIGJvdW5kcyBhbmQgc3RyaWRlIHRvIGJlIHVzZWQgZm9yIHRoZSBzZXQgb2YgaXRlcmF0aW9ucwordG8gYmUgZXhlY3V0ZWQgYnkgdGhlIGN1cnJlbnQgdGhyZWFkIGZyb20gdGhlIHN0YXRpY2FsbHkgc2NoZWR1bGVkIGxvb3AgdGhhdCBpcyBkZXNjcmliZWQgYnkgdGhlCitpbml0aWFsIHZhbHVlcyBvZiB0aGUgYm91bmRzLCBzdHJpZGUsIGluY3JlbWVudCBhbmQgY2h1bmsgc2l6ZS4KKworQHsKKyovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQoIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHR5cGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiAqcGxvd2VyLCBrbXBfaW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oCisgICAgICAgICAgICAgICAgICAgICAgbG9jLCBndGlkLCBzY2hlZHR5cGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19mb3Jfc3RhdGljX2luaXRfNAorICovCit2b2lkCitfX2ttcGNfZm9yX3N0YXRpY19pbml0XzR1KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfdWludDMyICpwbG93ZXIsIGttcF91aW50MzIgKnB1cHBlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgKnBzdHJpZGUsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIF9fa21wX2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQzMiA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84KCBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR0eXBlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfaW50NjQgKnBsb3dlciwga21wX2ludDY0ICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF9pbnQ2NCA+KAorICAgICAgICAgICAgICAgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR0eXBlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Zvcl9zdGF0aWNfaW5pdF84dSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdHlwZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX3VpbnQ2NCAqcGxvd2VyLCBrbXBfdWludDY0ICpwdXBwZXIsCisgICAgICAgICAgICAgICAgICAgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50NjQgPigKKyAgICAgICAgICAgICAgICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdHlwZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKy8qIQorQH0KKyovCisKKy8qIQorQGluZ3JvdXAgV09SS19TSEFSSU5HCitAcGFyYW0gICAgbG9jICAgICAgIFNvdXJjZSBjb2RlIGxvY2F0aW9uCitAcGFyYW0gICAgZ3RpZCAgICAgIEdsb2JhbCB0aHJlYWQgaWQgb2YgdGhpcyB0aHJlYWQKK0BwYXJhbSAgICBzY2hlZHVsZSAgU2NoZWR1bGluZyB0eXBlIGZvciB0aGUgcGFyYWxsZWwgbG9vcAorQHBhcmFtICAgIHBsYXN0aXRlciBQb2ludGVyIHRvIHRoZSAibGFzdCBpdGVyYXRpb24iIGZsYWcKK0BwYXJhbSAgICBwbG93ZXIgICAgUG9pbnRlciB0byB0aGUgbG93ZXIgYm91bmQKK0BwYXJhbSAgICBwdXBwZXIgICAgUG9pbnRlciB0byB0aGUgdXBwZXIgYm91bmQgb2YgbG9vcCBjaHVuaworQHBhcmFtICAgIHB1cHBlckQgICBQb2ludGVyIHRvIHRoZSB1cHBlciBib3VuZCBvZiBkaXN0X2NodW5rCitAcGFyYW0gICAgcHN0cmlkZSAgIFBvaW50ZXIgdG8gdGhlIHN0cmlkZSBmb3IgcGFyYWxsZWwgbG9vcAorQHBhcmFtICAgIGluY3IgICAgICBMb29wIGluY3JlbWVudAorQHBhcmFtICAgIGNodW5rICAgICBUaGUgY2h1bmsgc2l6ZSBmb3IgdGhlIHBhcmFsbGVsIGxvb3AKKworRWFjaCBvZiB0aGUgZm91ciBmdW5jdGlvbnMgaGVyZSBhcmUgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIGFyZ3VtZW50IHR5cGVzLgorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZXMgdG8gYmUgdXNlZCBmb3IgdGhlIHNldCBvZiBpdGVyYXRpb25zCit0byBiZSBleGVjdXRlZCBieSB0aGUgY3VycmVudCB0aHJlYWQgZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZXMsIGluY3JlbWVudCBhbmQgY2h1bmtzIGZvciBwYXJhbGxlbCBsb29wIGFuZCBkaXN0cmlidXRlCitjb25zdHJ1Y3RzLgorCitAeworKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX2ludDMyICpwbG93ZXIsIGttcF9pbnQzMiAqcHVwcGVyLCBrbXBfaW50MzIgKnB1cHBlckQsCisgICAga21wX2ludDMyICpwc3RyaWRlLCBrbXBfaW50MzIgaW5jciwga21wX2ludDMyIGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oCisgICAgICAgIGxvYywgZ3RpZCwgc2NoZWR1bGUsIHBsYXN0aXRlciwgcGxvd2VyLCBwdXBwZXIsIHB1cHBlckQsIHBzdHJpZGUsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY19kaXN0X2Zvcl9zdGF0aWNfaW5pdF80dSgKKyAgICBpZGVudF90ICpsb2MsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgc2NoZWR1bGUsIGttcF9pbnQzMiAqcGxhc3RpdGVyLAorICAgIGttcF91aW50MzIgKnBsb3dlciwga21wX3VpbnQzMiAqcHVwcGVyLCBrbXBfdWludDMyICpwdXBwZXJELAorICAgIGttcF9pbnQzMiAqcHN0cmlkZSwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgX19rbXBfZGlzdF9mb3Jfc3RhdGljX2luaXQ8IGttcF91aW50MzIgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzgoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyIHNjaGVkdWxlLCBrbXBfaW50MzIgKnBsYXN0aXRlciwKKyAgICBrbXBfaW50NjQgKnBsb3dlciwga21wX2ludDY0ICpwdXBwZXIsIGttcF9pbnQ2NCAqcHVwcGVyRCwKKyAgICBrbXBfaW50NjQgKnBzdHJpZGUsIGttcF9pbnQ2NCBpbmNyLCBrbXBfaW50NjQgY2h1bmsgKQoreworICAgIF9fa21wX2Rpc3RfZm9yX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPigKKyAgICAgICAgbG9jLCBndGlkLCBzY2hlZHVsZSwgcGxhc3RpdGVyLCBwbG93ZXIsIHB1cHBlciwgcHVwcGVyRCwgcHN0cmlkZSwgaW5jciwgY2h1bmsgKTsKK30KKworLyohCisgU2VlIEByZWYgX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX2Rpc3RfZm9yX3N0YXRpY19pbml0Xzh1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBzY2hlZHVsZSwga21wX2ludDMyICpwbGFzdGl0ZXIsCisgICAga21wX3VpbnQ2NCAqcGxvd2VyLCBrbXBfdWludDY0ICpwdXBwZXIsIGttcF91aW50NjQgKnB1cHBlckQsCisgICAga21wX2ludDY0ICpwc3RyaWRlLCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBfX2ttcF9kaXN0X2Zvcl9zdGF0aWNfaW5pdDwga21wX3VpbnQ2NCA+KAorICAgICAgICBsb2MsIGd0aWQsIHNjaGVkdWxlLCBwbGFzdGl0ZXIsIHBsb3dlciwgcHVwcGVyLCBwdXBwZXJELCBwc3RyaWRlLCBpbmNyLCBjaHVuayApOworfQorLyohCitAfQorKi8KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gQXV4aWxpYXJ5IHJvdXRpbmVzIGZvciBEaXN0cmlidXRlIFBhcmFsbGVsIExvb3AgY29uc3RydWN0IGltcGxlbWVudGF0aW9uCisvLyAgICBUcmFuc2ZlciBjYWxsIHRvIHRlbXBsYXRlPCB0eXBlIFQgPgorLy8gICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdCggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwKKy8vICAgICAgICBpbnQgKnBfbGFzdCwgVCAqbGIsIFQgKnViLCBTVCAqc3QsIFNUIGluY3IsIFNUIGNodW5rICkKKworLyohCitAaW5ncm91cCBXT1JLX1NIQVJJTkcKK0B7CitAcGFyYW0gbG9jIFNvdXJjZSBsb2NhdGlvbgorQHBhcmFtIGd0aWQgR2xvYmFsIHRocmVhZCBpZAorQHBhcmFtIHBfbGFzdCBwb2ludGVyIHRvIGxhc3QgaXRlcmF0aW9uIGZsYWcKK0BwYXJhbSBwX2xiICBwb2ludGVyIHRvIExvd2VyIGJvdW5kCitAcGFyYW0gcF91YiAgcG9pbnRlciB0byBVcHBlciBib3VuZAorQHBhcmFtIHBfc3QgIFN0ZXAgKG9yIGluY3JlbWVudCBpZiB5b3UgcHJlZmVyKQorQHBhcmFtIGluY3IgIExvb3AgaW5jcmVtZW50CitAcGFyYW0gY2h1bmsgVGhlIGNodW5rIHNpemUgdG8gYmxvY2sgd2l0aAorCitUaGUgZnVuY3Rpb25zIGNvbXB1dGUgdGhlIHVwcGVyIGFuZCBsb3dlciBib3VuZHMgYW5kIHN0cmlkZSB0byBiZSB1c2VkIGZvciB0aGUgc2V0IG9mIGl0ZXJhdGlvbnMKK3RvIGJlIGV4ZWN1dGVkIGJ5IHRoZSBjdXJyZW50IHRlYW0gZnJvbSB0aGUgc3RhdGljYWxseSBzY2hlZHVsZWQgbG9vcCB0aGF0IGlzIGRlc2NyaWJlZCBieSB0aGUKK2luaXRpYWwgdmFsdWVzIG9mIHRoZSBib3VuZHMsIHN0cmlkZSwgaW5jcmVtZW50IGFuZCBjaHVuayBmb3IgdGhlIGRpc3RyaWJ1dGUgY29uc3RydWN0IGFzIHBhcnQgb2YKK2NvbXBvc2l0ZSBkaXN0cmlidXRlIHBhcmFsbGVsIGxvb3AgY29uc3RydWN0LgorVGhlc2UgZnVuY3Rpb25zIGFyZSBhbGwgaWRlbnRpY2FsIGFwYXJ0IGZyb20gdGhlIHR5cGVzIG9mIHRoZSBhcmd1bWVudHMuCisqLworCit2b2lkCitfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF9pbnQzMiAqcF9sYiwga21wX2ludDMyICpwX3ViLCBrbXBfaW50MzIgKnBfc3QsIGttcF9pbnQzMiBpbmNyLCBrbXBfaW50MzIgY2h1bmsgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX2luaXRfc2VyaWFsICk7CisgICAgX19rbXBfdGVhbV9zdGF0aWNfaW5pdDwga21wX2ludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0XzR1KAorICAgIGlkZW50X3QgKmxvYywga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiAqcF9sYXN0LAorICAgIGttcF91aW50MzIgKnBfbGIsIGttcF91aW50MzIgKnBfdWIsIGttcF9pbnQzMiAqcF9zdCwga21wX2ludDMyIGluY3IsIGttcF9pbnQzMiBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfdWludDMyID4oIGxvYywgZ3RpZCwgcF9sYXN0LCBwX2xiLCBwX3ViLCBwX3N0LCBpbmNyLCBjaHVuayApOworfQorCisvKiEKKyBTZWUgQHJlZiBfX2ttcGNfdGVhbV9zdGF0aWNfaW5pdF80CisgKi8KK3ZvaWQKK19fa21wY190ZWFtX3N0YXRpY19pbml0XzgoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX2ludDY0ICpwX2xiLCBrbXBfaW50NjQgKnBfdWIsIGttcF9pbnQ2NCAqcF9zdCwga21wX2ludDY0IGluY3IsIGttcF9pbnQ2NCBjaHVuayApCit7CisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfaW5pdF9zZXJpYWwgKTsKKyAgICBfX2ttcF90ZWFtX3N0YXRpY19pbml0PCBrbXBfaW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisKKy8qIQorIFNlZSBAcmVmIF9fa21wY190ZWFtX3N0YXRpY19pbml0XzQKKyAqLwordm9pZAorX19rbXBjX3RlYW1fc3RhdGljX2luaXRfOHUoCisgICAgaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ3RpZCwga21wX2ludDMyICpwX2xhc3QsCisgICAga21wX3VpbnQ2NCAqcF9sYiwga21wX3VpbnQ2NCAqcF91Yiwga21wX2ludDY0ICpwX3N0LCBrbXBfaW50NjQgaW5jciwga21wX2ludDY0IGNodW5rICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9pbml0X3NlcmlhbCApOworICAgIF9fa21wX3RlYW1fc3RhdGljX2luaXQ8IGttcF91aW50NjQgPiggbG9jLCBndGlkLCBwX2xhc3QsIHBfbGIsIHBfdWIsIHBfc3QsIGluY3IsIGNodW5rICk7Cit9CisvKiEKK0B9CisqLworCit9IC8vIGV4dGVybiAiQyIKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkYThiYmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmMKQEAgLTAsMCArMSw1NjM2IEBACisvKgorICoga21wX3NldHRpbmdzLmMgLS0gSW5pdGlhbGl6ZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9lbnZpcm9ubWVudC5oIgorI2luY2x1ZGUgImttcF9hdG9taWMuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9zZXR0aW5ncy5oIgorI2luY2x1ZGUgImttcF9pMThuLmgiCisjaW5jbHVkZSAia21wX2xvY2suaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKworc3RhdGljIGludCBfX2ttcF9lbnZfdG9QcmludCggY2hhciBjb25zdCAqIG5hbWUsIGludCBmbGFnICk7CisKK2Jvb2wgX19rbXBfZW52X2Zvcm1hdCA9IDA7IC8vIDAgLSBvbGQgZm9ybWF0OyAxIC0gbmV3IGZvcm1hdAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHN0cmluZyBmdW5jdGlvbnMuIFN1YmplY3QgdG8gbW92ZSB0byBrbXBfc3RyLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgZG91YmxlCitfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggY2hhciBjb25zdCAqIHMgKQoreworICAgIGRvdWJsZSByZXN1bHQ7CisKKyAgICBpZiAoIEtNUF9TU0NBTkYoIHMsICIlbGYiLCAmcmVzdWx0ICkgPCAxICkgeworICAgICAgICByZXN1bHQgPSAwLjA7CisgICAgfQorCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworI2lmZGVmIEtNUF9ERUJVRworc3RhdGljIHVuc2lnbmVkIGludAorX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKGNoYXIgKmRlc3QsIGNoYXIgY29uc3QgKiBzcmMsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwpIHsKKyAgICB1bnNpZ25lZCBpbnQgaTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuOyBpKyspIHsKKyAgICAgICAgaWYgKCgqc3JjID09ICdcMCcpIHx8ICgqc3JjID09IHNlbnRpbmVsKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgKihkZXN0KyspID0gKihzcmMrKyk7CisgICAgfQorICAgICpkZXN0ID0gJ1wwJzsKKyAgICByZXR1cm4gaTsKK30KKyNlbmRpZgorCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF93aXRoX3NlbnRpbmVsKCBjaGFyIGNvbnN0ICogYSwgY2hhciBjb25zdCAqIGIsIHNpemVfdCBsZW4sIGNoYXIgc2VudGluZWwgKSB7CisgICAgc2l6ZV90IGwgPSAwOworCisgICAgaWYoYSA9PSBOVUxMKQorICAgICAgICBhID0gIiI7CisgICAgaWYoYiA9PSBOVUxMKQorICAgICAgICBiID0gIiI7CisgICAgd2hpbGUoKmEgJiYgKmIgJiYgKmIgIT0gc2VudGluZWwpIHsKKyAgICAgICAgY2hhciBjYSA9ICphLCBjYiA9ICpiOworCisgICAgICAgIGlmKGNhID49ICdhJyAmJiBjYSA8PSAneicpCisgICAgICAgICAgICBjYSAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNhICE9IGNiKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICArK2w7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gbCA+PSBsZW47Cit9CisKKy8vCisvLyBFeHBlY3RlZCB1c2FnZToKKy8vICAgICB0b2tlbiBpcyB0aGUgdG9rZW4gdG8gY2hlY2sgZm9yLgorLy8gICAgIGJ1ZiBpcyB0aGUgc3RyaW5nIGJlaW5nIHBhcnNlZC4KKy8vICAgICAqZW5kIHJldHVybnMgdGhlIGNoYXIgYWZ0ZXIgdGhlIGVuZCBvZiB0aGUgdG9rZW4uCisvLyAgICAgICAgaXQgaXMgbm90IG1vZGlmaWVkIHVubGVzcyBhIG1hdGNoIG9jY3Vycy4KKy8vCisvLworLy8gRXhhbXBsZSAxOgorLy8KKy8vICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJ0b2tlbiIsIGJ1ZiwgKmVuZCkgeworLy8gICAgICAgICA8ZG8gc29tZXRoaW5nPgorLy8gICAgICAgICBidWYgPSBlbmQ7CisvLyAgICAgfQorLy8KKy8vICBFeGFtcGxlIDI6CisvLworLy8gICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoInRva2VuIiwgYnVmLCAqZW5kKSB7CisvLyAgICAgICAgIGNoYXIgKnNhdmUgPSAqKmVuZDsKKy8vICAgICAgICAgKiplbmQgPSBzZW50aW5lbDsKKy8vICAgICAgICAgPHVzZSBhbnkgb2YgdGhlIF9fa21wKl93aXRoX3NlbnRpbmVsKCkgZnVuY3Rpb25zPgorLy8gICAgICAgICAqKmVuZCA9IHNhdmU7CisvLyAgICAgICAgIGJ1ZiA9IGVuZDsKKy8vICAgICB9CisvLworCitzdGF0aWMgaW50CitfX2ttcF9tYXRjaF9zdHIoIGNoYXIgY29uc3QgKnRva2VuLCBjaGFyIGNvbnN0ICpidWYsIGNvbnN0IGNoYXIgKiplbmQpIHsKKworICAgIEtNUF9BU1NFUlQodG9rZW4gIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChidWYgIT0gTlVMTCk7CisgICAgS01QX0FTU0VSVChlbmQgIT0gTlVMTCk7CisKKyAgICB3aGlsZSAoKnRva2VuICYmICpidWYpIHsKKyAgICAgICAgY2hhciBjdCA9ICp0b2tlbiwgY2IgPSAqYnVmOworCisgICAgICAgIGlmKGN0ID49ICdhJyAmJiBjdCA8PSAneicpCisgICAgICAgICAgICBjdCAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmKGNiID49ICdhJyAmJiBjYiA8PSAneicpCisgICAgICAgICAgICBjYiAtPSAnYScgLSAnQSc7CisgICAgICAgIGlmIChjdCAhPSBjYikKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgKyt0b2tlbjsKKyAgICAgICAgKytidWY7CisgICAgfQorICAgIGlmICgqdG9rZW4pIHsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICAqZW5kID0gYnVmOworICAgIHJldHVybiBUUlVFOworfQorCisKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kNGsoIHNpemVfdCBzaXplICkgeworICAgIHNpemVfdCBfNGsgPSA0ICogMTAyNDsKKyAgICBpZiAoIHNpemUgJiAoIF80ayAtIDEgKSApIHsKKyAgICAgICAgc2l6ZSAmPSB+ICggXzRrIC0gMSApOworICAgICAgICBpZiAoIHNpemUgPD0gS01QX1NJWkVfVF9NQVggLSBfNGsgKSB7CisgICAgICAgICAgICBzaXplICs9IF80azsgICAgLy8gUm91bmQgdXAgaWYgdGhlcmUgaXMgbm8gb3ZlcmZsb3cuCisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gc2l6ZTsKK30gLy8gX19rbXBfcm91bmQ0aworCisKKy8qCisgICAgSGVyZSwgbXVsdGlwbGllcnMgYXJlIGxpa2UgX19rbXBfY29udmVydF90b19zZWNvbmRzLCBidXQgZmxvYXRpbmctcG9pbnQKKyAgICB2YWx1ZXMgYXJlIGFsbG93ZWQsIGFuZCB0aGUgcmV0dXJuIHZhbHVlIGlzIGluIG1pbGxpc2Vjb25kcy4gIFRoZSBkZWZhdWx0CisgICAgbXVsdGlwbGllciBpcyBtaWxsaXNlY29uZHMuICBSZXR1cm5zIElOVF9NQVggb25seSBpZiB0aGUgdmFsdWUgc3BlY2lmaWVkCisgICAgbWF0Y2hlcyAiaW5maW5pdCoiLiAgUmV0dXJucyAtMSBpZiBzcGVjaWZpZWQgc3RyaW5nIGlzIGludmFsaWQuCisqLworaW50CitfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqIGRhdGEgKQoreworICAgIGludCByZXQsIG52YWx1ZXMsIGZhY3RvcjsKKyAgICBjaGFyIG11bHQsIGV4dHJhOworICAgIGRvdWJsZSB2YWx1ZTsKKworICAgIGlmIChkYXRhID09IE5VTEwpIHJldHVybiAoLTEpOworICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAiaW5maW5pdCIsIC0xLCBkYXRhKSkgcmV0dXJuIChJTlRfTUFYKTsKKyAgICB2YWx1ZSA9IChkb3VibGUpIDAuMDsKKyAgICBtdWx0ID0gJ1wwJzsKKyAgICBudmFsdWVzID0gS01QX1NTQ0FORiAoZGF0YSwgIiVsZiVjJWMiLCAmdmFsdWUsICZtdWx0LCAmZXh0cmEpOworICAgIGlmIChudmFsdWVzIDwgMSkgcmV0dXJuICgtMSk7CisgICAgaWYgKG52YWx1ZXMgPT0gMSkgbXVsdCA9ICdcMCc7CisgICAgaWYgKG52YWx1ZXMgPT0gMykgcmV0dXJuICgtMSk7CisKKyAgICBpZiAodmFsdWUgPCAwKSAgICByZXR1cm4gKC0xKTsKKworICAgIHN3aXRjaCAobXVsdCkgeworICAgIGNhc2UgJ1wwJzoKKyAgICAgICAgLyogIGRlZmF1bHQgaXMgbWlsbGlzZWNvbmRzICAqLworICAgICAgICBmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdzJzogY2FzZSAnUyc6CisgICAgICAgIGZhY3RvciA9IDEwMDA7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ20nOiBjYXNlICdNJzoKKyAgICAgICAgZmFjdG9yID0gMTAwMCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdoJzogY2FzZSAnSCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiA2MCAqIDYwOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdkJzogY2FzZSAnRCc6CisgICAgICAgIGZhY3RvciA9IDEwMDAgKiAyNCAqIDYwICogNjA7CisgICAgICAgIGJyZWFrOworICAgIGRlZmF1bHQ6CisgICAgICAgIHJldHVybiAoLTEpOworICAgIH0KKworICAgIGlmICggdmFsdWUgPj0gKCAoSU5UX01BWC0xKSAvIGZhY3RvcikgKQorICAgICAgICByZXQgPSBJTlRfTUFYLTE7ICAgICAgICAvKiBEb24ndCBhbGxvdyBpbmZpbml0ZSB2YWx1ZSBoZXJlICovCisgICAgZWxzZQorICAgICAgICByZXQgPSAoaW50KSAodmFsdWUgKiAoZG91YmxlKSBmYWN0b3IpOyAgLyogdHJ1bmNhdGUgdG8gaW50ICAqLworCisgICAgcmV0dXJuIHJldDsKK30KKworCitzdGF0aWMgaW50CitfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoIGNoYXIgY29uc3QgKiBhLCBjaGFyIGNvbnN0ICogYiwgY2hhciBzZW50aW5lbCApIHsKKyAgICBpZihhID09IE5VTEwpCisgICAgICAgIGEgPSAiIjsKKyAgICBpZihiID09IE5VTEwpCisgICAgICAgIGIgPSAiIjsKKyAgICB3aGlsZSgqYSAmJiAqYiAmJiAqYiAhPSBzZW50aW5lbCkgeworICAgICAgICBjaGFyIGNhID0gKmEsIGNiID0gKmI7CisKKyAgICAgICAgaWYoY2EgPj0gJ2EnICYmIGNhIDw9ICd6JykKKyAgICAgICAgICAgIGNhIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2IgPj0gJ2EnICYmIGNiIDw9ICd6JykKKyAgICAgICAgICAgIGNiIC09ICdhJyAtICdBJzsKKyAgICAgICAgaWYoY2EgIT0gY2IpCisgICAgICAgICAgICByZXR1cm4gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmI7CisgICAgICAgICsrYTsKKyAgICAgICAgKytiOworICAgIH0KKyAgICByZXR1cm4gKmEgPworICAgICAgICAoKmIgJiYgKmIgIT0gc2VudGluZWwpID8gKGludCkodW5zaWduZWQgY2hhcikqYSAtIChpbnQpKHVuc2lnbmVkIGNoYXIpKmIgOiAxIDoKKyAgICAgICAgKCpiICYmICpiICE9IHNlbnRpbmVsKSA/IC0xIDogMDsKK30KKworCisvLyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisvLyBUYWJsZSBzdHJ1Y3R1cmVzIGFuZCBoZWxwZXIgZnVuY3Rpb25zLgorLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zZXR0aW5nICAgICAgICBrbXBfc2V0dGluZ190OwordHlwZWRlZiBzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgICAga21wX3N0Z19zc19kYXRhX3Q7Cit0eXBlZGVmIHN0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSAgICBrbXBfc3RnX3dwX2RhdGFfdDsKK3R5cGVkZWYgc3RydWN0IF9fa21wX3N0Z19mcl9kYXRhICAgIGttcF9zdGdfZnJfZGF0YV90OworCit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcGFyc2VfZnVuY190ICkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICk7Cit0eXBlZGVmIHZvaWQgKCAqIGttcF9zdGdfcHJpbnRfZnVuY190ICkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApOworCitzdHJ1Y3QgX19rbXBfc2V0dGluZyB7CisgICAgY2hhciBjb25zdCAqICAgICAgICAgbmFtZTsgICAgICAgIC8vIE5hbWUgb2Ygc2V0dGluZyAoZW52aXJvbm1lbnQgdmFyaWFibGUpLgorICAgIGttcF9zdGdfcGFyc2VfZnVuY190IHBhcnNlOyAgICAgICAvLyBQYXJzZXIgZnVuY3Rpb24uCisgICAga21wX3N0Z19wcmludF9mdW5jX3QgcHJpbnQ7ICAgICAgIC8vIFByaW50IGZ1bmN0aW9uLgorICAgIHZvaWQgKiAgICAgICAgICAgICAgIGRhdGE7ICAgICAgICAvLyBEYXRhIHBhc3NlZCB0byBwYXJzZXIgYW5kIHByaW50ZXIuCisgICAgaW50ICAgICAgICAgICAgICAgICAgc2V0OyAgICAgICAgIC8vIFZhcmlhYmxlIHNldCBkdXJpbmcgdGhpcyAic2Vzc2lvbiIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gICAgIChfX2ttcF9lbnZfaW5pdGlhbGl6ZSgpIG9yIGttcF9zZXRfZGVmYXVsdHMoKSBjYWxsKS4KKyAgICBpbnQgICAgICAgICAgICAgICAgICBkZWZpbmVkOyAgICAgLy8gVmFyaWFibGUgc2V0IGluIGFueSAic2Vzc2lvbiIuCit9OyAvLyBzdHJ1Y3QgX19rbXBfc2V0dGluZworCitzdHJ1Y3QgX19rbXBfc3RnX3NzX2RhdGEgeworICAgIHNpemVfdCAgICAgICAgICAgICBmYWN0b3I7ICAvLyBEZWZhdWx0IGZhY3RvcjogMSBmb3IgS01QX1NUQUNLU0laRSwgMTAyNCBmb3Igb3RoZXJzLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z19zc19kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfd3BfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIG9tcDsgICAgIC8vIDAgLS0gS01QX0xJQlJBUlksIDEgLS0gT01QX1dBSVRfUE9MSUNZLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHM7ICAvLyBBcnJheSBvZiBwb2ludGVycyB0byByaXZhbHMgKGluY2x1ZGluZyBpdHNlbGYpLgorfTsgLy8gc3RydWN0IF9fa21wX3N0Z193cF9kYXRhCisKK3N0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YSB7CisgICAgaW50ICAgICAgICAgICAgICAgIGZvcmNlOyAgLy8gMCAtLSBLTVBfREVURVJNSU5JU1RJQ19SRURVQ1RJT04sIDEgLS0gS01QX0ZPUkNFX1JFRFVDVElPTi4KKyAgICBrbXBfc2V0dGluZ190ICogKiAgcml2YWxzOyAgLy8gQXJyYXkgb2YgcG9pbnRlcnMgdG8gcml2YWxzIChpbmNsdWRpbmcgaXRzZWxmKS4KK307IC8vIHN0cnVjdCBfX2ttcF9zdGdfZnJfZGF0YQorCitzdGF0aWMgaW50CitfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCAgICAgICAgICAvLyAwIC0tIE9rLCAxIC0tIGVycm9ycyBmb3VuZC4KKyAgICBjaGFyIGNvbnN0ICogICAgICAgbmFtZSwgICAgIC8vIE5hbWUgb2YgdmFyaWFibGUuCisgICAgY2hhciBjb25zdCAqICAgICAgIHZhbHVlLCAgICAvLyBWYWx1ZSBvZiB0aGUgdmFyaWFibGUuCisgICAga21wX3NldHRpbmdfdCAqICogIHJpdmFscyAgICAvLyBMaXN0IG9mIHJpdmFsIHNldHRpbmdzICh0aGUgbGlzdCBtdXN0IGluY2x1ZGUgY3VycmVudCBvbmUpLgorKTsKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBIZWxwZXIgcGFyc2UgZnVuY3Rpb25zLgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Jvb2woCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGludCAqICAgICAgICBvdXQKKykgeworICAgIGlmICggX19rbXBfc3RyX21hdGNoX3RydWUoIHZhbHVlICkgKSB7CisgICAgICAgICogb3V0ID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKF9fa21wX3N0cl9tYXRjaF9mYWxzZSggdmFsdWUgKSApIHsKKyAgICAgICAgKiBvdXQgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgIEtNUF9NU0coIEJhZEJvb2xWYWx1ZSwgbmFtZSwgdmFsdWUgKSwKKyAgICAgICAgICAgIEtNUF9ITlQoIFZhbGlkQm9vbFZhbHVlcyApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfYm9vbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIHNpemVfdCAgICAgICBzaXplX21pbiwKKyAgICBzaXplX3QgICAgICAgc2l6ZV9tYXgsCisgICAgaW50ICogICAgICAgIGlzX3NwZWNpZmllZCwKKyAgICBzaXplX3QgKiAgICAgb3V0LAorICAgIHNpemVfdCAgICAgICBmYWN0b3IKKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgPSBOVUxMOworICAgICNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgIHNpemVfbWluID0gX19rbXBfcm91bmQ0ayggc2l6ZV9taW4gKTsKKyAgICAgICAgc2l6ZV9tYXggPSBfX2ttcF9yb3VuZDRrKCBzaXplX21heCApOworICAgICNlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgaWYgKCBpc19zcGVjaWZpZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogaXNfc3BlY2lmaWVkID0gMTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX3RvX3NpemUoIHZhbHVlLCBvdXQsIGZhY3RvciwgJiBtc2cgKTsKKyAgICAgICAgaWYgKCBtc2cgPT0gTlVMTCApIHsKKyAgICAgICAgICAgIGlmICggKiBvdXQgPiBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29MYXJnZSApOworICAgICAgICAgICAgfSBlbHNlIGlmICggKiBvdXQgPCBzaXplX21pbiApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWluOworICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggVmFsdWVUb29TbWFsbCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAjaWYgS01QX09TX0RBUldJTgorICAgICAgICAgICAgICAgICAgICBzaXplX3Qgcm91bmQ0ayA9IF9fa21wX3JvdW5kNGsoICogb3V0ICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggKiBvdXQgIT0gcm91bmQ0ayApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICogb3V0ID0gcm91bmQ0azsKKyAgICAgICAgICAgICAgICAgICAgICAgIG1zZyA9IEtNUF9JMThOX1NUUiggTm90TXVsdGlwbGU0SyApOworICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICNlbmRpZgorICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGludGVnZXIgb3ZlcmZsb3cgb2NjdXJyZWQsICogb3V0ID09IEtNUF9TSVpFX1RfTUFYLiBDdXQgaXQgdG8gc2l6ZV9tYXggc2lsZW50bHkuCisgICAgICAgICAgICBpZiAoICogb3V0IDwgc2l6ZV9taW4gKSB7CisgICAgICAgICAgICAgICAgKiBvdXQgPSBzaXplX21heDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCAqIG91dCA+ICBzaXplX21heCApIHsKKyAgICAgICAgICAgICAgICAqIG91dCA9IHNpemVfbWF4OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAga21wX3N0cl9idWZfdCBidWY7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoICYgYnVmLCAqIG91dCApOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIG5hbWUsIHZhbHVlLCBtc2cgKTsKKyAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3N0cl9WYWx1ZSwgbmFtZSwgYnVmLnN0ciApOworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZiApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9zaXplCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0cigKKyAgICBjaGFyIGNvbnN0ICogICAgICBuYW1lLAorICAgIGNoYXIgY29uc3QgKiAgICAgIHZhbHVlLAorICAgIGNoYXIgY29uc3QgKiAqICAgIG91dAorKSB7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogb3V0ICk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCB2YWx1ZSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RyCisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbnQoCisgICAgY2hhciBjb25zdCAqIG5hbWUsICAgLy8gSTogTmFtZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSAodXNlZCBpbiB3YXJuaW5nIG1lc3NhZ2VzKS4KKyAgICBjaGFyIGNvbnN0ICogdmFsdWUsICAvLyBJOiBWYWx1ZSBvZiBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byBwYXJzZS4KKyAgICBpbnQgICAgICAgICAgbWluLCAgICAvLyBJOiBNaW1pbmFsIGFsbG93ZWQgdmFsdWUuCisgICAgaW50ICAgICAgICAgIG1heCwgICAgLy8gSTogTWF4aW11bSBhbGxvd2VkIHZhbHVlLgorICAgIGludCAqICAgICAgICBvdXQgICAgIC8vIE86IE91dHB1dCAocGFyc2VkKSB2YWx1ZS4KKykgeworICAgIGNoYXIgY29uc3QgKiBtc2cgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgdWludCA9ICogb3V0OworICAgIF9fa21wX3N0cl90b191aW50KCB2YWx1ZSwgJiB1aW50LCAmIG1zZyApOworICAgIGlmICggbXNnID09IE5VTEwgKSB7CisgICAgICAgIGlmICggdWludCA8ICh1bnNpZ25lZCBpbnQpbWluICkgeworICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9IGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgIHVpbnQgPSBtYXg7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gSWYgb3ZlcmZsb3cgb2NjdXJyZWQgbXNnIGNvbnRhaW5zIGVycm9yIG1lc3NhZ2UgYW5kIHVpbnQgaXMgdmVyeSBiaWcuIEN1dCB0bXAgaXQKKyAgICAgICAgLy8gdG8gSU5UX01BWC4KKyAgICAgICAgaWYgKCB1aW50IDwgKHVuc2lnbmVkIGludCltaW4gKSB7CisgICAgICAgICAgICB1aW50ID0gbWluOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCB1aW50ID4gKHVuc2lnbmVkIGludCltYXggKSB7CisgICAgICAgICAgICB1aW50ID0gbWF4OworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgaWYgKCBtc2cgIT0gTlVMTCApIHsKKyAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VTaXplSW50V2FybiwgbmFtZSwgdmFsdWUsIG1zZyApOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlIiBLTVBfVUlOVDY0X1NQRUMgIiIsIHVpbnQgKTsKKyAgICAgICAgS01QX0lORk9STSggVXNpbmdfdWludDY0X1ZhbHVlLCBuYW1lLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSggJmJ1ZiApOworICAgIH07IC8vIGlmCisgICAgKiBvdXQgPSB1aW50OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW50CisKKworI2lmIEtNUF9ERUJVR19BREFQVElWRV9MT0NLUworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9maWxlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBjaGFyICogICAgICAgc3VmZml4LAorICAgIGNoYXIgKiAqICAgICBvdXQKKykgeworICAgIGNoYXIgYnVmZmVyWzI1Nl07CisgICAgY2hhciAqdDsKKyAgICBpbnQgaGFzU3VmZml4OworICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAodm9pZCAqKSAqIG91dCApOworICAgIHQgPSAoY2hhciAqKSBzdHJyY2hyKHZhbHVlLCAnLicpOworICAgIGhhc1N1ZmZpeCA9IHQgJiYgX19rbXBfc3RyX2VxZiggdCwgc3VmZml4ICk7CisgICAgdCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyVzIiwgdmFsdWUsIGhhc1N1ZmZpeCA/ICIiIDogc3VmZml4ICk7CisgICAgX19rbXBfZXhwYW5kX2ZpbGVfbmFtZSggYnVmZmVyLCBzaXplb2YoYnVmZmVyKSwgdCk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUodCk7CisgICAgKiBvdXQgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBidWZmZXIgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2ZpbGUKKyNlbmRpZgorCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgY2hhciAqIHBhcl9yYW5nZV90b19wcmludCA9IE5VTEw7CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgIGNoYXIgY29uc3QgKiBuYW1lLAorICAgIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgICBpbnQgKiAgICAgICAgb3V0X3JhbmdlLAorICAgIGNoYXIgKiAgICAgICBvdXRfcm91dGluZSwKKyAgICBjaGFyICogICAgICAgb3V0X2ZpbGUsCisgICAgaW50ICogICAgICAgIG91dF9sYiwKKyAgICBpbnQgKiAgICAgICAgb3V0X3ViCispIHsKKyAgICBzaXplX3QgbGVuID0gS01QX1NUUkxFTiggdmFsdWUgKyAxICk7CisgICAgcGFyX3JhbmdlX3RvX3ByaW50ID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX01BTExPQyggbGVuICsxICk7CisgICAgS01QX1NUUk5DUFlfUyggcGFyX3JhbmdlX3RvX3ByaW50LCBsZW4gKyAxLCB2YWx1ZSwgbGVuICsgMSk7CisgICAgX19rbXBfcGFyX3JhbmdlID0gKzE7CisgICAgX19rbXBfcGFyX3JhbmdlX2xiID0gMDsKKyAgICBfX2ttcF9wYXJfcmFuZ2VfdWIgPSBJTlRfTUFYOworICAgIGZvciAoOzspIHsKKyAgICAgICAgdW5zaWduZWQgaW50IGxlbjsKKyAgICAgICAgaWYgKCggdmFsdWUgPT0gTlVMTCApIHx8ICggKnZhbHVlID09ICdcMCcgKSkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJvdXRpbmUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfcm91dGluZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfUk9VVElORV9MRU4gLSAxLCAnLCcgKTsKKyAgICAgICAgICAgIGlmICggbGVuID09IDAgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZmlsZW5hbWUiLCB2YWx1ZSwgJz0nICkpIHsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJz0nICkgKyAxOworICAgICAgICAgICAgbGVuID0gX19rbXBfcmVhZHN0cl93aXRoX3NlbnRpbmVsKCBvdXRfZmlsZSwKKyAgICAgICAgICAgICAgdmFsdWUsIEtNUF9QQVJfUkFOR0VfRklMRU5BTUVfTEVOIC0gMSwgJywnICk7CisgICAgICAgICAgICBpZiAoIGxlbiA9PSAwKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggInJhbmdlIiwgdmFsdWUsICc9JyApKQorICAgICAgICAgIHx8ICggISBfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJpbmNsX3JhbmdlIiwgdmFsdWUsICc9JyApKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIEtNUF9TU0NBTkYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YiApICE9IDIgKSB7CisgICAgICAgICAgICAgICAgZ290byBwYXJfcmFuZ2VfZXJyb3I7CisgICAgICAgICAgICB9CisgICAgICAgICAgICAqb3V0X3JhbmdlID0gKzE7CisgICAgICAgICAgICB2YWx1ZSA9IHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIHZhbHVlKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoICEgX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZXhjbF9yYW5nZSIsIHZhbHVlLCAnPScgKSkgeworICAgICAgICAgICAgdmFsdWUgPSBzdHJjaHIoIHZhbHVlLCAnPScgKSArIDE7CisgICAgICAgICAgICBpZiAoIEtNUF9TU0NBTkYoIHZhbHVlLCAiJWQ6JWQiLCBvdXRfbGIsIG91dF91YikgIT0gMiApIHsKKyAgICAgICAgICAgICAgICBnb3RvIHBhcl9yYW5nZV9lcnJvcjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgICpvdXRfcmFuZ2UgPSAtMTsKKyAgICAgICAgICAgIHZhbHVlID0gc3RyY2hyKCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgdmFsdWUrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIHBhcl9yYW5nZV9lcnJvcjoKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhclJhbmdlU3ludGF4LCBuYW1lICk7CisgICAgICAgIF9fa21wX3Bhcl9yYW5nZSA9IDA7CisgICAgICAgIGJyZWFrOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZQorI2VuZGlmCisKK2ludAorX19rbXBfaW5pdGlhbF90aHJlYWRzX2NhcGFjaXR5KCBpbnQgcmVxX25wcm9jICkKK3sKKyAgICBpbnQgbnRoID0gMzI7CisKKyAgICAvKiBNSU4oIE1BWCggMzIsIDQgKiAkT01QX05VTV9USFJFQURTLCA0ICogb21wX2dldF9udW1fcHJvY3MoKSApLCBfX2ttcF9tYXhfbnRoKSAqLworICAgIGlmIChudGggPCAoNCAqIHJlcV9ucHJvYykpCisgICAgICAgIG50aCA9ICg0ICogcmVxX25wcm9jKTsKKyAgICBpZiAobnRoIDwgKDQgKiBfX2ttcF94cHJvYykpCisgICAgICAgIG50aCA9ICg0ICogX19rbXBfeHByb2MpOworCisgICAgaWYgKG50aCA+IF9fa21wX21heF9udGgpCisgICAgICAgIG50aCA9IF9fa21wX21heF9udGg7CisKKyAgICByZXR1cm4gbnRoOworfQorCisKK2ludAorX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSggaW50IHJlcV9ucHJvYywgaW50IG1heF9udGgsIGludCBhbGxfdGhyZWFkc19zcGVjaWZpZWQpIHsKKyAgICBpbnQgbnRoID0gMTI4OworCisgICAgaWYoYWxsX3RocmVhZHNfc3BlY2lmaWVkKQorICAgICAgICByZXR1cm4gbWF4X250aDsKKyAgICAvKiBNSU4oIE1BWCAoMTI4LCA0ICogJE9NUF9OVU1fVEhSRUFEUywgNCAqIG9tcF9nZXRfbnVtX3Byb2NzKCkgKSwgX19rbXBfbWF4X250aCApICovCisgICAgaWYgKG50aCA8ICg0ICogcmVxX25wcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiByZXFfbnByb2MpOworICAgIGlmIChudGggPCAoNCAqIF9fa21wX3hwcm9jKSkKKyAgICAgICAgbnRoID0gKDQgKiBfX2ttcF94cHJvYyk7CisKKyAgICBpZiAobnRoID4gX19rbXBfbWF4X250aCkKKyAgICAgICAgbnRoID0gX19rbXBfbWF4X250aDsKKworICAgIHJldHVybiBudGg7Cit9CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gSGVscGVyIHByaW50IGZ1bmN0aW9ucy4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ib29sKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9CT09MOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSA/ICJ0cnVlIiA6ICJmYWxzZSIgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ib29sCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW50KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgaW50IHZhbHVlICkgeworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9JTlQ7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JWRcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW50CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdWludDY0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwga21wX3VpbnQ2NCB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfVUlOVDY0OworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSUiIEtNUF9VSU5UNjRfU1BFQyAiXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3VpbnQ2NAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0cigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfU1RSOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSVzXG4iLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0cgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCBzaXplX3QgdmFsdWUgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnRfc2l6ZSggYnVmZmVyLCB2YWx1ZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9IiwgbmFtZSApOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgdmFsdWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiXG4iICk7CisgICAgICAgIHJldHVybjsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9zaXplCisKKworLy8gPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorLy8gUGFyc2UgYW5kIHByaW50IGZ1bmN0aW9ucy4KKy8vID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FMTF9USFJFQURTLCBLTVBfTUFYX1RIUkVBRFMsIE9NUF9USFJFQURfTElNSVQKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc2V0dGluZ190ICogKiByaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgcmM7CisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIF9fa21wX21heF9udGggPSBfX2ttcF94cHJvYzsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDEsIF9fa21wX3N5c19tYXhfbnRoLCAmIF9fa21wX21heF9udGggKTsKKyAgICAgICAgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA9IDA7CisgICAgfQorICAgIEtfRElBRyggMSwgKCAiX19rbXBfbWF4X250aCA9PSAlZFxuIiwgX19rbXBfbWF4X250aCApICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX21heF9udGggKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9CTE9DS1RJTUUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gX19rbXBfY29udmVydF90b19taWxsaXNlY29uZHMoIHZhbHVlICk7CisgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IDAgKSB7CisgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX0RFRkFVTFRfQkxPQ0tUSU1FOworICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICAgICAgX19rbXBfZW52X2Jsb2NrdGltZSA9IEZBTFNFOyAgLy8gUmV2ZXJ0IHRvIGRlZmF1bHQgYXMgaWYgdmFyIG5vdCBzZXQuCisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA8IEtNUF9NSU5fQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUlOX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIFNtYWxsVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNaW5WYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA+IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF9ibG9ja3RpbWUgPSBLTVBfTUFYX0JMT0NLVElNRTsKKyAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlVmFsdWUsIG5hbWUsIHZhbHVlICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBNYXhWYWx1ZVVzaW5nLCBuYW1lLCBfX2ttcF9kZmx0X2Jsb2NrdGltZSApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBfX2ttcF9lbnZfYmxvY2t0aW1lID0gVFJVRTsgICAgLy8gS01QX0JMT0NLVElNRSB3YXMgc3BlY2lmaWVkLgorICAgIH07IC8vIGlmCisgICAgLy8gY2FsY3VsYXRlIG51bWJlciBvZiBtb25pdG9yIHRocmVhZCB3YWtldXAgaW50ZXJ2YWxzIGNvcnJlc29uZGluZyB0byBibG9ja3RpbWUuCisgICAgX19rbXBfbW9uaXRvcl93YWtldXBzID0gS01QX1dBS0VVUFNfRlJPTV9CTE9DS1RJTUUoIF9fa21wX2RmbHRfYmxvY2t0aW1lLCBfX2ttcF9tb25pdG9yX3dha2V1cHMgKTsKKyAgICBfX2ttcF9idF9pbnRlcnZhbHMgPSBLTVBfSU5URVJWQUxTX0ZST01fQkxPQ0tUSU1FKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSwgX19rbXBfbW9uaXRvcl93YWtldXBzICk7CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9lbnZfYmxvY2t0aW1lID09ICVkXG4iLCBfX2ttcF9lbnZfYmxvY2t0aW1lICkgKTsKKyAgICBpZiAoIF9fa21wX2Vudl9ibG9ja3RpbWUgKSB7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gJWRcbiIsIF9fa21wX2RmbHRfYmxvY2t0aW1lICkgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ibG9ja3RpbWUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ibG9ja3RpbWUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2RmbHRfYmxvY2t0aW1lICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ibG9ja3RpbWUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0RVUExJQ0FURV9MSUJfT0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvKiBhY3R1YWxseSB0aGlzIHZhcmlhYmxlIGlzIG5vdCBzdXBwb3J0ZWQsCisgICAgICAgcHV0IGhlcmUgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBlYXJsaWVyIGJ1aWxkcyBhbmQgZm9yIHN0YXRpYy9keW5hbWljIGNvbWJpbmF0aW9uICovCisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZHVwbGljYXRlX2xpYl9vaygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2R1cGxpY2F0ZV9saWJyYXJ5X29rICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9JTkhFUklUX0ZQX0NPTlRST0wKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2woIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9pbmhlcml0X2ZwX2NvbnRyb2wgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2luaGVyaXRfZnBfY29udHJvbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2luaGVyaXRfZnBfY29udHJvbCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworI2lmIEtNUF9ERUJVRworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2luaGVyaXRfZnBfY29udHJvbCApOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfaW5oZXJpdF9mcF9jb250cm9sCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9MSUJSQVJZLCBPTVBfV0FJVF9QT0xJQ1kKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIGNoYXIgY29uc3QgKmJsb2NrdGltZV9zdHIgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfd3BfZGF0YV90ICogd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKSBkYXRhOworICAgIGludCAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCB3YWl0LT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggd2FpdC0+b21wICkgeworICAgICAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIkFDVElWRSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICAgICAgaWYgKCBibG9ja3RpbWVfc3RyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gS01QX0JMT0NLVElNRSBub3Qgc3BlY2lmaWVkLCBzbyBzZXQgZGVmYXVsdCB0byAiaW5maW5pdGUiLgorICAgICAgICAgICAgICAgIF9fa21wX2RmbHRfYmxvY2t0aW1lID0gS01QX01BWF9CTE9DS1RJTUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggIlBBU1NJVkUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgICAgIGlmICggYmxvY2t0aW1lX3N0ciA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIEtNUF9CTE9DS1RJTUUgbm90IHNwZWNpZmllZCwgc28gc2V0IGRlZmF1bHQgdG8gMC4KKyAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCAic2VyaWFsIiwgMSwgdmFsdWUgKSApIHsgICAgICAgICAgICAgLyogUyAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV9zZXJpYWw7CisgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRocm91Z2hwdXQiLCAyLCB2YWx1ZSApICkgeyAgLyogVEggKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdGhyb3VnaHB1dDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAidHVybmFyb3VuZCIsIDIsIHZhbHVlICkgKSB7ICAvKiBUVSAqLworICAgICAgICAgICBfX2ttcF9saWJyYXJ5ID0gbGlicmFyeV90dXJuYXJvdW5kOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJkZWRpY2F0ZWQiLCAxLCB2YWx1ZSApICkgeyAgIC8qIEQgKi8KKyAgICAgICAgICAgX19rbXBfbGlicmFyeSA9IGxpYnJhcnlfdHVybmFyb3VuZDsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAibXVsdGl1c2VyIiwgMSwgdmFsdWUgKSApIHsgICAvKiBNICovCisgICAgICAgICAgIF9fa21wX2xpYnJhcnkgPSBsaWJyYXJ5X3Rocm91Z2hwdXQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgX19rbXBfYXV4X3NldF9saWJyYXJ5KCBfX2ttcF9saWJyYXJ5ICk7CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3koIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKworICAgIGttcF9zdGdfd3BfZGF0YV90ICogd2FpdCA9IChrbXBfc3RnX3dwX2RhdGFfdCAqKSBkYXRhOworICAgIGNoYXIgY29uc3QgKiAgICAgICAgdmFsdWUgPSBOVUxMOworCisgICAgaWYgKCB3YWl0LT5vbXAgKSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX2xpYnJhcnkgKSB7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJBQ1RJVkUiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV90aHJvdWdocHV0IDogeworICAgICAgICAgICAgICAgIHZhbHVlID0gIlBBU1NJVkUiOworICAgICAgICAgICAgfSBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfSBlbHNlIHsKKyAgICAgICAgc3dpdGNoICggX19rbXBfbGlicmFyeSApIHsKKyAgICAgICAgICAgIGNhc2UgbGlicmFyeV9zZXJpYWwgOiB7CisgICAgICAgICAgICAgICAgdmFsdWUgPSAic2VyaWFsIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdHVybmFyb3VuZCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJ0dXJuYXJvdW5kIjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgICAgICBjYXNlIGxpYnJhcnlfdGhyb3VnaHB1dCA6IHsKKyAgICAgICAgICAgICAgICB2YWx1ZSA9ICJ0aHJvdWdocHV0IjsKKyAgICAgICAgICAgIH0gYnJlYWs7CisgICAgICAgIH07IC8vIHN3aXRjaAorICAgIH07IC8vIGlmCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3kKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX01PTklUT1JfU1RBQ0tTSVpFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbW9uaXRvcl9zdGFja3NpemUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLAorICAgICAgICB2YWx1ZSwKKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLAorICAgICAgICBLTVBfTUFYX1NUS1NJWkUsCisgICAgICAgIE5VTEwsCisgICAgICAgICYgX19rbXBfbW9uaXRvcl9zdGtzaXplLAorICAgICAgICAxCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX21vbml0b3Jfc3RhY2tzaXplCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbW9uaXRvcl9zdGFja3NpemUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfbW9uaXRvcl9zdGtzaXplID4gMCApCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoICBfX2ttcF9tb25pdG9yX3N0a3NpemUgPiAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgX19rbXBfbW9uaXRvcl9zdGtzaXplICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgJiYgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIik7CisgICAgfQorCit9IC8vIF9fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU0VUVElOR1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zZXR0aW5ncyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX3NldHRpbmdzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zZXR0aW5ncworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NldHRpbmdzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfc2V0dGluZ3MgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3NldHRpbmdzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVEFDS1BBRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0YWNrcGFkKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIEtNUF9NSU5fU1RLUEFERElORywgICAgICAgICAgICAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtQQURESU5HLCAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICAmIF9fa21wX3N0a3BhZGRpbmcgICAgICAgICAgICAgICAgLy8gVmFyIHRvIGluaXRpYWxpemUKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja3BhZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfc3RrcGFkZGluZyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLT0ZGU0VUCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gRW52IHZhciBuYW1lCisgICAgICAgIHZhbHVlLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFbnYgdmFyIHZhbHVlCisgICAgICAgIEtNUF9NSU5fU1RLT0ZGU0VULCAgICAgICAgICAgICAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtPRkZTRVQsICAgICAgICAgICAgICAgIC8vIE1heCB2YWx1ZQorICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgJiBfX2ttcF9zdGtvZmZzZXQsICAgICAgICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIDEKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tvZmZzZXQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdGFja29mZnNldCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9zaXplKCBidWZmZXIsIG5hbWUsIF9fa21wX3N0a29mZnNldCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3RhY2tvZmZzZXQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NUQUNLU0laRSwgT01QX1NUQUNLU0laRSwgR09NUF9TVEFDS1NJWkUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zdGFja3NpemUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAga21wX3N0Z19zc19kYXRhX3QgKiAgc3RhY2tzaXplID0gKGttcF9zdGdfc3NfZGF0YV90ICopIGRhdGE7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCBzdGFja3NpemUtPnJpdmFscyApOworICAgIGlmICggcmMgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3N0Z19wYXJzZV9zaXplKAorICAgICAgICBuYW1lLCAgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgbmFtZQorICAgICAgICB2YWx1ZSwgICAgICAgICAgICAgICAgICAgIC8vIEVudiB2YXIgdmFsdWUKKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplLCAgICAvLyBNaW4gdmFsdWUKKyAgICAgICAgS01QX01BWF9TVEtTSVpFLCAgICAgICAgICAvLyBNYXggdmFsdWUKKyAgICAgICAgJiBfX2ttcF9lbnZfc3Rrc2l6ZSwgICAgICAvLworICAgICAgICAmIF9fa21wX3N0a3NpemUsICAgICAgICAgIC8vIFZhciB0byBpbml0aWFsaXplCisgICAgICAgIHN0YWNrc2l6ZS0+ZmFjdG9yCisgICAgKTsKKworfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplCisKKy8vIFRoaXMgZnVuY3Rpb24gaXMgY2FsbGVkIGZvciBwcmludGluZyBib3RoIEtNUF9TVEFDS1NJWkUgKGZhY3RvciBpcyAxKSBhbmQgT01QX1NUQUNLU0laRSAoZmFjdG9yIGlzIDEwMjQpLgorLy8gQ3VycmVudGx5IGl0IGlzIG5vdCBwb3NzaWJsZSB0byBwcmludCBPTVBfU1RBQ0tTSVpFIHZhbHVlIGluIGJ5dGVzLiBXZSBjYW4gY29uc2lkZXIgYWRkaW5nIHRoaXMKKy8vIHBvc3NpYmlsaXR5IGJ5IGEgY3VzdG9tZXIgcmVxdWVzdCBpbiBmdXR1cmUuCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGttcF9zdGdfc3NfZGF0YV90ICogIHN0YWNrc2l6ZSA9IChrbXBfc3RnX3NzX2RhdGFfdCAqKSBkYXRhOworICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoIGJ1ZmZlciwgKF9fa21wX3N0a3NpemUgJSAxMDI0KSA/IF9fa21wX3N0a3NpemUgLyBzdGFja3NpemUtPmZhY3RvciA6IF9fa21wX3N0a3NpemUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzPSIsIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBidWZmZXIsIChfX2ttcF9zdGtzaXplICUgMTAyNCkgPyBfX2ttcF9zdGtzaXplIC8gc3RhY2tzaXplLT5mYWN0b3IgOiBfX2ttcF9zdGtzaXplICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIlxuIiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfVkVSU0lPTgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF92ZXJzaW9uICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV92ZXJzaW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdmVyc2lvbigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3ZlcnNpb24gKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3ZlcnNpb24KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1dBUk5JTkdTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfd2FybmluZ3MoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyApOworICAgIGlmIChfX2ttcF9nZW5lcmF0ZV93YXJuaW5ncyAhPSBrbXBfd2FybmluZ3Nfb2ZmKSB7ICAgLy8gQUM6IHdlIGhhdmUgb25seSAwLzEgdmFsdWVzIGRvY3VtZW50ZWQsCisgICAgICAgIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzID0ga21wX3dhcm5pbmdzX2V4cGxpY2l0OyAvLyAgICAgc28gcmVzZXQgaXQgdG8gZXhwbGljaXQgaW4gb3JkZXIgdG8KKyAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICBkaXN0aW5ndWlzaCBmcm9tIGRlZmF1bHQgc2V0dGluZworfSAvLyBfX2ttcF9lbnZfcGFyc2Vfd2FybmluZ3MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF93YXJuaW5ncygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2dlbmVyYXRlX3dhcm5pbmdzICk7IC8vIEFDOiBUT0RPOiBjaGFuZ2UgdG8gcHJpbnRfaW50PworfSAvLyBfX2ttcF9lbnZfcHJpbnRfd2FybmluZ3MgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vICAgICAobmVlZHMgZG9jdW1lbnRhdGlvbiBjaGFuZ2UpLi4uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9ORVNURUQsIE9NUF9OVU1fVEhSRUFEUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25lc3RlZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RmbHRfbmVzdGVkICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9uZXN0ZWQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZmx0X25lc3RlZCApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbmVzdGVkCisKK3N0YXRpYyB2b2lkCitfX2ttcF9wYXJzZV9uZXN0ZWRfbnVtX3RocmVhZHMoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqZW52LCBrbXBfbmVzdGVkX250aHJlYWRzX3QgKm50aF9hcnJheSApCit7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IGVudjsKKyAgICBjb25zdCBjaGFyICpzY2FuID0gbmV4dDsKKworICAgIGludCB0b3RhbCA9IDA7ICAgICAgICAgIC8vIENvdW50IGVsZW1lbnRzIHRoYXQgd2VyZSBzZXQuIEl0J2xsIGJlIHVzZWQgYXMgYW4gYXJyYXkgc2l6ZQorICAgIGludCBwcmV2X2NvbW1hID0gRkFMU0U7IC8vIEZvciBjb3JyZWN0IHByb2Nlc3Npbmcgc2VxdWVudGlhbCBjb21tYXMKKworICAgIC8vIENvdW50IHRoZSBudW1iZXIgb2YgdmFsdWVzIGluIHRoZSBlbnYuIHZhciBzdHJpbmcKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNLSVBfV1MoIG5leHQgKTsKKworICAgICAgICBpZiAoICpuZXh0ID09ICdcMCcgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBub3QgYW4gaW50ZWdlciBvciBub3QgYSBjb21tYSA9PiBlbmQgb2YgbGlzdAorICAgICAgICBpZiAoICggKCAqbmV4dCA8ICcwJyApIHx8ICggKm5leHQgPiAnOScgKSApICYmICggKm5leHQgIT0nLCcpICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIE50aFN5bnRheEVycm9yLCB2YXIsIGVudiApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaXMgdGhlIGZpc3J0IGNoYXJhY3RlcgorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwIHx8IHByZXZfY29tbWEgKSB7CisgICAgICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHByZXZfY29tbWEgPSBUUlVFOworICAgICAgICAgICAgbmV4dCsrOyAvL3NraXAgJywnCisgICAgICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgYSBkaWdpdAorICAgICAgICBpZiAoICpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScgKSB7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRtcCA9IG5leHQ7CisgICAgICAgICAgICBTS0lQX1dTKCB0bXAgKTsKKyAgICAgICAgICAgIGlmICggKCAqbmV4dCA9PSAnICcgfHwgKm5leHQgPT0gJ1x0JyApICYmICggKnRtcCA+PSAnMCcgJiYgKnRtcCA8PSAnOScgKSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggTnRoU3BhY2VzTm90QWxsb3dlZCwgdmFyLCBlbnYgKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWwgPiAwICk7CisgICAgaWYoIHRvdGFsIDw9IDAgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBOdGhTeW50YXhFcnJvciwgdmFyLCBlbnYgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIHRoZSBuZXN0ZWQgbnRocmVhZHMgYXJyYXkgZXhpc3RzCisgICAgaWYgKCAhIG50aF9hcnJheS0+bnRoICkgeworICAgICAgICAvLyBBbGxvY2F0ZSBhbiBhcnJheSBvZiBkb3VibGUgc2l6ZQorICAgICAgICBudGhfYXJyYXktPm50aCA9ICggaW50ICogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKiB0b3RhbCAqIDIgKTsKKyAgICAgICAgaWYgKCBudGhfYXJyYXktPm50aCA9PSBOVUxMICkgeworICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9CisgICAgICAgIG50aF9hcnJheS0+c2l6ZSA9IHRvdGFsICogMjsKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIG50aF9hcnJheS0+c2l6ZSA8IHRvdGFsICkgeworICAgICAgICAgICAgLy8gSW5jcmVhc2UgdGhlIGFycmF5IHNpemUKKyAgICAgICAgICAgIGRvIHsKKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPnNpemUgKj0gMjsKKyAgICAgICAgICAgIH0gd2hpbGUgKCBudGhfYXJyYXktPnNpemUgPCB0b3RhbCApOworCisgICAgICAgICAgICBudGhfYXJyYXktPm50aCA9IChpbnQgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoCisgICAgICAgICAgICAgICAgbnRoX2FycmF5LT5udGgsIHNpemVvZiggaW50ICkgKiBudGhfYXJyYXktPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggbnRoX2FycmF5LT5udGggPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIG50aF9hcnJheS0+dXNlZCA9IHRvdGFsOworICAgIGludCBpID0gMDsKKworICAgIHByZXZfY29tbWEgPSBGQUxTRTsKKyAgICB0b3RhbCA9IDA7CisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIGFycmF5CisgICAgZm9yICggOyA7ICkgeworICAgICAgICBTS0lQX1dTKCBzY2FuICk7CisgICAgICAgIGlmICggKnNjYW4gPT0gJ1wwJyApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRoZSBuZXh0IGNoYXJhY3RlciBpcyAnLCcKKyAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAvLyAnLCcgaW4gdGhlIGJlZ2lubmluZyBvZiB0aGUgbGlzdAorICAgICAgICAgICAgaWYgKCB0b3RhbCA9PSAwICkgeworICAgICAgICAgICAgICAgIC8vIFRoZSB2YWx1ZSBpcyBzdXBwb3NlZCB0byBiZSBlcXVhbCB0byBfX2ttcF9hdmFpbF9wcm9jIGJ1dCBpdCBpcyB1bmtub3duIGF0IHRoZSBtb21lbnQuCisgICAgICAgICAgICAgICAgLy8gU28gbGV0J3MgcHV0IGEgcGxhY2Vob2xkZXIgKCN0aHJlYWRzID0gMCkgdG8gY29ycmVjdCBpdCBsYXRlci4KKyAgICAgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gMDsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfWVsc2UgaWYgKCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIC8vIE51bSB0aHJlYWRzIGlzIGluaGVyaXRlZCBmcm9tIHRoZSBwcmV2aW91cyBsZXZlbAorICAgICAgICAgICAgICAgIG50aF9hcnJheS0+bnRoW2ldID0gbnRoX2FycmF5LT5udGhbaSAtIDFdOworICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICB0b3RhbCsrOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcHJldl9jb21tYSA9IFRSVUU7CisgICAgICAgICAgICBzY2FuKys7IC8vc2tpcCAnLCcKKyAgICAgICAgICAgIFNLSVBfV1MoIHNjYW4gKTsKKyAgICAgICAgfQorICAgICAgICAvLyBOZXh0IGNoYXJhY3RlciBpcyBhIGRpZ2l0CisgICAgICAgIGlmICggKnNjYW4gPj0gJzAnICYmICpzY2FuIDw9ICc5JyApIHsKKyAgICAgICAgICAgIGludCBudW07CisgICAgICAgICAgICBjb25zdCBjaGFyICpidWYgPSBzY2FuOworICAgICAgICAgICAgY2hhciBjb25zdCAqIG1zZyAgPSBOVUxMOworICAgICAgICAgICAgcHJldl9jb21tYSA9IEZBTFNFOworICAgICAgICAgICAgU0tJUF9ESUdJVFMoIHNjYW4gKTsKKyAgICAgICAgICAgIHRvdGFsKys7CisKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKnNjYW4gKTsKKyAgICAgICAgICAgIGlmICggbnVtIDwgS01QX01JTl9OVEggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb1NtYWxsICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX01JTl9OVEg7CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBudW0gPiBfX2ttcF9zeXNfbWF4X250aCApIHsKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICggbXNnICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gTWVzc2FnZSBpcyBub3QgZW1wdHkuIFByaW50IHdhcm5pbmcuCisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlU2l6ZUludFdhcm4sIHZhciwgZW52LCBtc2cgKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19pbnRfVmFsdWUsIHZhciwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBudGhfYXJyYXktPm50aFtpKytdID0gbnVtOworICAgICAgICB9CisgICAgfQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBUT0RPOiBSZW1vdmUgdGhpcyBvcHRpb24uIE9NUF9OVU1fVEhSRUFEUyBpcyBhIGxpc3Qgb2YgcG9zaXRpdmUgaW50ZWdlcnMhCisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIFRoZSBhcnJheSBvZiAxIGVsZW1lbnQKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGggPSAoIGludCogKUtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZiggaW50ICkgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5zaXplID0gX19rbXBfbmVzdGVkX250aC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX250aC5udGhbMF0gPSBfX2ttcF9kZmx0X3RlYW1fbnRoID0gX19rbXBfZGZsdF90ZWFtX250aF91YiA9IF9fa21wX3hwcm9jOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3BhcnNlX25lc3RlZF9udW1fdGhyZWFkcyggbmFtZSwgdmFsdWUsICYgX19rbXBfbmVzdGVkX250aCApOworICAgICAgICBpZiAoIF9fa21wX25lc3RlZF9udGgubnRoICkgeworICAgICAgICAgICAgX19rbXBfZGZsdF90ZWFtX250aCA9IF9fa21wX25lc3RlZF9udGgubnRoWzBdOworICAgICAgICAgICAgaWYgKCBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViIDwgX19rbXBfZGZsdF90ZWFtX250aCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9kZmx0X3RlYW1fbnRoX3ViID0gX19rbXBfZGZsdF90ZWFtX250aDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH07IC8vIGlmCisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZmx0X3RlYW1fbnRoID09ICVkXG4iLCBfX2ttcF9kZmx0X3RlYW1fbnRoICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX251bV90aHJlYWRzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgKSB7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoICZidWYgKTsKKyAgICAgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfbmVzdGVkX250aC51c2VkOyBpKyspIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIlZCIsIF9fa21wX25lc3RlZF9udGgubnRoW2ldICk7CisgICAgICAgICAgICBpZiAoIGkgPCBfX2ttcF9uZXN0ZWRfbnRoLnVzZWQgLSAxICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICZidWYsICIsIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nJXMnXG4iLCBidWYuc3RyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfZnJlZSgmYnVmKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X251bV90aHJlYWRzCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9wZW5NUCAzLjA6IEtNUF9UQVNLSU5HLCBPTVBfTUFYX0FDVElWRV9MRVZFTFMsCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdGFza2luZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIChpbnQpdHNrbV9tYXgsIChpbnQgKikmX19rbXBfdGFza2luZ19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90YXNraW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdGFza2luZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdGFza2luZ19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF90YXNraW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfdGFza19zdGVhbGluZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIDEsIChpbnQgKikmX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfdGFza19zdGVhbGluZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9tYXhfYWN0aXZlX2xldmVscygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGZsdF9tYXhfYWN0aXZlX2xldmVscyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMKKworI2lmIE9NUF80NV9FTkFCTEVECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPcGVuTVAgNC41OiBPTVBfTUFYX1RBU0tfUFJJT1JJVFkKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWF4X3Rhc2tfcHJpb3JpdHkoY2hhciBjb25zdCAqbmFtZSwgY2hhciBjb25zdCAqdmFsdWUsIHZvaWQgKmRhdGEpIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX1RBU0tfUFJJT1JJVFlfTElNSVQsICZfX2ttcF9tYXhfdGFza19wcmlvcml0eSk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9tYXhfdGFza19wcmlvcml0eQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21heF90YXNrX3ByaW9yaXR5KGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCAqbmFtZSwgdm9pZCAqZGF0YSkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoYnVmZmVyLCBuYW1lLCBfX2ttcF9tYXhfdGFza19wcmlvcml0eSk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9tYXhfdGFza19wcmlvcml0eQorI2VuZGlmIC8vIE9NUF80NV9FTkFCTEVECisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9ESVNQX05VTV9CVUZGRVJTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2Rpc3BfYnVmZmVycyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3NlcmlhbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTZXJpYWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgc2VyaWFsIGluaXRpYWxpemF0aW9uIG9ubHkKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMSwgS01QX01BWF9OVEgsICYgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Rpc3BfYnVmZmVycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Rpc3BfYnVmZmVycygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGlzcGF0Y2hfbnVtX2J1ZmZlcnMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Rpc3BfYnVmZmVycworCisjaWYgS01QX05FU1RFRF9IT1RfVEVBTVMKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9IT1RfVEVBTVNfTUFYX0xFVkVMLCBLTVBfSE9UX1RFQU1TX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIEtNUF9NQVhfQUNUSVZFX0xFVkVMU19MSU1JVCwgJiBfX2ttcF9ob3RfdGVhbXNfbWF4X2xldmVsICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2hvdF90ZWFtc19tYXhfbGV2ZWwgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hvdF90ZWFtc19sZXZlbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfcGFyYWxsZWwpICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52UGFyYWxsZWxXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9ICAgLy8gcmVhZCB2YWx1ZSBiZWZvcmUgZmlyc3QgcGFyYWxsZWwgb25seQorICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfTUFYX0FDVElWRV9MRVZFTFNfTElNSVQsICYgX19rbXBfaG90X3RlYW1zX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2hvdF90ZWFtc19tb2RlCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2hvdF90ZWFtc19tb2RlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbW9kZQorCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0hBTkRMRV9TSUdOQUxTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisJX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2hhbmRsZV9zaWduYWxzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfaGFuZGxlX3NpZ25hbHMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2hhbmRsZV9zaWduYWxzCisKKyNlbmRpZiAvLyBLTVBfSEFORExFX1NJR05BTFMKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1hfREVCVUcsIEtNUF9ERUJVRywgS01QX0RFQlVHX0JVRl8qLCBLTVBfRElBRworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWZkZWYgS01QX0RFQlVHCisKKyNkZWZpbmUgS01QX1NUR19YX0RFQlVHKCB4ICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHN0YXRpYyB2b2lkIF9fa21wX3N0Z19wYXJzZV8jI3gjI19kZWJ1ZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7ICAgICBcCisJX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIElOVF9NQVgsICYga21wXyMjeCMjX2RlYnVnICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIH0gLyogX19rbXBfc3RnX3BhcnNlX3hfZGVidWcgKi8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgc3RhdGljIHZvaWQgX19rbXBfc3RnX3ByaW50XyMjeCMjX2RlYnVnKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7IFwKKwlfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIGttcF8jI3gjI19kZWJ1ZyApOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgfSAvKiBfX2ttcF9zdGdfcHJpbnRfeF9kZWJ1ZyAqLworCitLTVBfU1RHX1hfREVCVUcoIGEgKQorS01QX1NUR19YX0RFQlVHKCBiICkKK0tNUF9TVEdfWF9ERUJVRyggYyApCitLTVBfU1RHX1hfREVCVUcoIGQgKQorS01QX1NUR19YX0RFQlVHKCBlICkKK0tNUF9TVEdfWF9ERUJVRyggZiApCisKKyN1bmRlZiBLTVBfU1RHX1hfREVCVUcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1ZyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IGRlYnVnID0gMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBkZWJ1ZyApOworICAgIGlmICgga21wX2FfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfYV9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfYl9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9iX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9jX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2NfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorICAgIGlmICgga21wX2RfZGVidWcgPCBkZWJ1ZyApIHsKKwlrbXBfZF9kZWJ1ZyA9IGRlYnVnOworICAgIH07IC8vIGlmCisgICAgaWYgKCBrbXBfZV9kZWJ1ZyA8IGRlYnVnICkgeworCWttcF9lX2RlYnVnID0gZGVidWc7CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGttcF9mX2RlYnVnIDwgZGVidWcgKSB7CisJa21wX2ZfZGVidWcgPSBkZWJ1ZzsKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWcKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9kZWJ1Z19idWYgKTsKKyAgICAvLyAhISEgVE9ETzogTW92ZSBidWZmZXIgaW5pdGlhbGl6YXRpb24gb2Ygb2YgdGhpcyBmaWxlISBJdCBtYXkgd29ya3MgaW5jb3JyZWN0bHkgaWYKKyAgICAvLyBLTVBfREVCVUdfQlVGIGlzIHBhcnNlZCBiZWZvcmUgS01QX0RFQlVHX0JVRl9MSU5FUyBvciBLTVBfREVCVUdfQlVGX0NIQVJTLgorICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworCWludCBpOworCWludCBlbGVtZW50cyA9IF9fa21wX2RlYnVnX2J1Zl9saW5lcyAqIF9fa21wX2RlYnVnX2J1Zl9jaGFyczsKKworCS8qIGFsbG9jYXRlIGFuZCBpbml0aWFsaXplIGFsbCBlbnRyaWVzIGluIGRlYnVnIGJ1ZmZlciB0byBlbXB0eSAqLworCV9fa21wX2RlYnVnX2J1ZmZlciA9IChjaGFyICopIF9fa21wX3BhZ2VfYWxsb2NhdGUoIGVsZW1lbnRzICogc2l6ZW9mKCBjaGFyICkgKTsKKwlmb3IgKCBpID0gMDsgaSA8IGVsZW1lbnRzOyBpICs9IF9fa21wX2RlYnVnX2J1Zl9jaGFycyApCisJICAgX19rbXBfZGVidWdfYnVmZmVyW2ldID0gJ1wwJzsKKworCV9fa21wX2RlYnVnX2NvdW50ID0gMDsKKyAgICB9CisgICAgS19ESUFHKCAxLCAoICJfX2ttcF9kZWJ1Z19idWYgPSAlZFxuIiwgX19rbXBfZGVidWdfYnVmICkgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1ZgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RlYnVnX2J1ZiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2F0b21pYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RlYnVnX2J1Zl9hdG9taWMgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfYXRvbWljKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfZGVidWdfYnVmX2F0b21pYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2F0b21pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9jaGFycyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCgKKwluYW1lLAorCXZhbHVlLAorCUtNUF9ERUJVR19CVUZfQ0hBUlNfTUlOLAorCUlOVF9NQVgsCisJJiBfX2ttcF9kZWJ1Z19idWZfY2hhcnMKKyAgICApOworfSAvLyBfX2ttcF9zdGdfZGVidWdfcGFyc2VfYnVmX2NoYXJzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2NoYXJzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfY2hhcnMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9jaGFycworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9saW5lcyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCgKKwluYW1lLAorCXZhbHVlLAorCUtNUF9ERUJVR19CVUZfTElORVNfTUlOLAorCUlOVF9NQVgsCisJJiBfX2ttcF9kZWJ1Z19idWZfbGluZXMKKyAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kZWJ1Z19idWZfbGluZXMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9saW5lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2RpYWcoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBJTlRfTUFYLCAmIGttcF9kaWFnICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9kaWFnCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZGlhZygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwga21wX2RpYWcgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2RpYWcKKworI2VuZGlmIC8vIEtNUF9ERUJVRworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQUxJR05fQUxMT0MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hbGlnbl9hbGxvYyggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgIG5hbWUsCisgICAgICAgIHZhbHVlLAorICAgICAgICBDQUNIRV9MSU5FLAorICAgICAgICBJTlRfTUFYLAorICAgICAgICBOVUxMLAorICAgICAgICAmIF9fa21wX2FsaWduX2FsbG9jLAorICAgICAgICAxCisgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWxpZ25fYWxsb2MoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3NpemUoIGJ1ZmZlciwgbmFtZSwgX19rbXBfYWxpZ25fYWxsb2MgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9QTEFJTl9CQVJSSUVSLCBLTVBfRk9SS0pPSU5fQkFSUklFUiwgS01QX1JFRFVDVElPTl9CQVJSSUVSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIFRPRE86IFJlbW92ZSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWUgdmFyaWJhbGUsIHJlbW92ZSBsb29wcyBmcm9tIHBhcnNlIGFuZCBwcmludAorLy8gICAgICAgZnVuY3Rpb25zLCBwYXNzIHJlcXVpcmVkIGluZm8gdGhyb3VnaCBkYXRhIGFyZ3VtZW50LgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgY29uc3QgY2hhciAqdmFyOworCisgICAgLyogLS0tLS0tLS0tLSBCYXJyaWVyIGJyYW5jaCBiaXQgY29udHJvbCAtLS0tLS0tLS0tLS0gKi8KKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCAoIHN0cmNtcCggdmFyLCBuYW1lKSA9PSAwICkgJiYgKCB2YWx1ZSAhPSAwICkgKSB7CisgICAgICAgICAgICBjaGFyICpjb21tYTsKKworICAgICAgICAgICAgY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKyAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzWyBpIF0gPSAoIGttcF91aW50MzIgKSBfX2ttcF9zdHJfdG9faW50KCB2YWx1ZSwgJywnICk7CisgICAgICAgICAgICAvKiBpcyB0aGVyZSBhIHNwZWNpZmllZCByZWxlYXNlIHBhcmFtZXRlcj8gKi8KKyAgICAgICAgICAgIGlmICggY29tbWEgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IF9fa21wX2JhcnJpZXJfcmVsZWFzZV9iYl9kZmx0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXSA9IChrbXBfdWludDMyKSBfX2ttcF9zdHJfdG9faW50KCBjb21tYSArIDEsIDAgKTsKKworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYmFycmllcl9yZWxlYXNlX2JyYW5jaF9iaXRzWyBpIF0gPiBLTVBfTUFYX0JSQU5DSF9CSVRTICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coIGttcF9tc193YXJuaW5nLCBLTVBfTVNHKCBCYXJyUmVsZWFzZVZhbHVlSW52YWxpZCwgbmFtZSwgY29tbWEgKyAxICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9icmFuY2hfYml0c1sgaSBdID0gX19rbXBfYmFycmllcl9yZWxlYXNlX2JiX2RmbHQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID4gS01QX01BWF9CUkFOQ0hfQklUUyApIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX3VpbnRfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdID0gIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JiX2RmbHQ7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgS19ESUFHKDEsICgiJXMgPT0gJWQsJWRcbiIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdLCBcCisgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9nYXRoZXJfYnJhbmNoX2JpdHMgWyBpIF0sIFwKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pKQorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGNvbnN0IGNoYXIgKnZhcjsKKyAgICBmb3IgKCBpbnQgaT1ic19wbGFpbl9iYXJyaWVyOyBpPGJzX2xhc3RfYmFycmllcjsgaSsrICkgeworICAgICAgICB2YXIgPSBfX2ttcF9iYXJyaWVyX2JyYW5jaF9iaXRfZW52X25hbWVbIGkgXTsKKyAgICAgICAgaWYgKCBzdHJjbXAoIHZhciwgbmFtZSkgPT0gMCAgKSB7CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfYnJhbmNoX2JpdF9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX2JhcnJpZXJfZ2F0aGVyX2JyYW5jaF9iaXRzIFsgaSBdLCBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHMgWyBpIF0pOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BMQUlOX0JBUlJJRVJfUEFUVEVSTiwgS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiwgS01QX1JFRFVDVElPTl9CQVJSSUVSX1BBVFRFUk4KKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworLy8gVE9ETzogUmVtb3ZlIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIHZhcmlhYmxlLCByZW1vdmUgbG9vcHMgZnJvbSBwYXJzZSBhbmQgcHJpbnQgZnVuY3Rpb25zLAorLy8gICAgICAgcGFzcyByZXF1aXJlZCBkYXRhIHRvIGZ1bmN0aW9ucyB0aHJvdWdoIGRhdGEgYXJndW1lbnQuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9wYXR0ZXJuKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgLyogLS0tLS0tLS0tLSBCYXJyaWVyIG1ldGhvZCBjb250cm9sIC0tLS0tLS0tLS0tLSAqLworCisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisKKyAgICAgICAgaWYgKCAoIHN0cmNtcCAoIHZhciwgbmFtZSApID09IDAgKSAmJiAoIHZhbHVlICE9IDAgKSApIHsKKyAgICAgICAgICAgIGludCBqOworICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKworICAgICAgICAgICAgLyogaGFuZGxlIGZpcnN0IHBhcmFtZXRlcjogZ2F0aGVyIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGZvciAoIGogPSBicF9saW5lYXJfYmFyOyBqPGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX21hdGNoX3dpdGhfc2VudGluZWwoIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lW2pdLCB2YWx1ZSwgMSwgJywnICkpIHsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGogPT0gYnBfbGFzdF9iYXIgKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEJhcnJHYXRoZXJWYWx1ZUludmFsaWQsIG5hbWUsIHZhbHVlICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfc3RyX1ZhbHVlLCBuYW1lLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgYnBfbGluZWFyX2JhciBdICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIGhhbmRsZSBzZWNvbmQgcGFyYW1ldGVyOiByZWxlYXNlIHBhdHRlcm4gKi8KKyAgICAgICAgICAgIGlmICggY29tbWEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBmb3IgKCBqID0gYnBfbGluZWFyX2JhcjsgaiA8IGJwX2xhc3RfYmFyOyBqKysgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfc3RyX21hdGNoKCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVtqXSwgMSwgY29tbWEgKyAxICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2JhcnJpZXJfcmVsZWFzZV9wYXR0ZXJuWyBpIF0gPSAoa21wX2Jhcl9wYXRfZSkgajsKKyAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgaWYgKGogPT0gYnBfbGFzdF9iYXIpIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggQmFyclJlbGVhc2VWYWx1ZUludmFsaWQsIG5hbWUsIGNvbW1hICsgMSApLCBfX2ttcF9tc2dfbnVsbCApOworICAgICAgICAgICAgICAgICAgICBLTVBfSU5GT1JNKCBVc2luZ19zdHJfVmFsdWUsIG5hbWUsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lWyBicF9saW5lYXJfYmFyIF0gKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YXI7CisgICAgZm9yICggaW50IGk9YnNfcGxhaW5fYmFycmllcjsgaTxic19sYXN0X2JhcnJpZXI7IGkrKyApIHsKKyAgICAgICAgdmFyID0gX19rbXBfYmFycmllcl9wYXR0ZXJuX2Vudl9uYW1lWyBpIF07CisgICAgICAgIGlmICggc3RyY21wICggdmFyLCBuYW1lICkgPT0gMCApIHsKKyAgICAgICAgICAgIGludCBqID0gX19rbXBfYmFycmllcl9nYXRoZXJfcGF0dGVybiBbIGkgXTsKKyAgICAgICAgICAgIGludCBrID0gX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm4gWyBpIF07CisgICAgICAgICAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9lbnZfbmFtZVsgaSBdICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlcydcbiIsIF9fa21wX2JhcnJpZXJfcGF0dGVybl9uYW1lIFsgaiBdLCBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZSBbIGsgXSk7CisgICAgICAgIH0KKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FCT1JUX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWJvcnRfZGVsYXkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIC8vIFVuaXRzIG9mIEtNUF9ERUxBWV9BQk9SVCBhcmUgc2Vjb25kcywgdW5pdHMgb2YgX19rbXBfYWJvcnRfZGVsYXkgaXMgbWlsbGlzZWNvbmRzLgorICAgIGludCBkZWxheSA9IF9fa21wX2Fib3J0X2RlbGF5IC8gMTAwMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCAvIDEwMDAsICYgZGVsYXkgKTsKKyAgICBfX2ttcF9hYm9ydF9kZWxheSA9IGRlbGF5ICogMTAwMDsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfYWJvcnRfZGVsYXkoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX2Fib3J0X2RlbGF5ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hYm9ydF9kZWxheQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ1BVSU5GT19GSUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfY3B1aW5mb19maWxlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RyKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9jcHVpbmZvX2ZpbGUgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9jcHVpbmZvX2ZpbGUgPT0gJXNcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApICk7CisgICAgI2VuZGlmCit9IC8vX19rbXBfc3RnX3BhcnNlX2NwdWluZm9fZmlsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NwdWluZm9fZmlsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfY3B1aW5mb19maWxlICkgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSclcydcbiIsIF9fa21wX2NwdWluZm9fZmlsZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgICNlbmRpZgorfSAvL19fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0ZPUkNFX1JFRFVDVElPTiwgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAga21wX3N0Z19mcl9kYXRhX3QgKiByZWR1Y3Rpb24gPSAoa21wX3N0Z19mcl9kYXRhX3QgKikgZGF0YTsKKyAgICBpbnQgICAgICAgICAgICAgICAgIHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcmVkdWN0aW9uLT5yaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKyAgICBpZiAoIHJlZHVjdGlvbi0+Zm9yY2UgKSB7CisgICAgICAgIGlmKCB2YWx1ZSAhPSAwICkgeworICAgICAgICAgICAgaWYoIF9fa21wX3N0cl9tYXRjaCggImNyaXRpY2FsIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrOworICAgICAgICAgICAgZWxzZSBpZiggX19rbXBfc3RyX21hdGNoKCAiYXRvbWljIiwgMCwgdmFsdWUgKSApCisgICAgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gYXRvbWljX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgaWYoIF9fa21wX3N0cl9tYXRjaCggInRyZWUiLCAwLCB2YWx1ZSApICkKKyAgICAgICAgICAgICAgIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPSB0cmVlX3JlZHVjZV9ibG9jazsKKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9GQVRBTCggVW5rbm93bkZvcmNlUmVkdWN0aW9uLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICAgICAgaWYoIF9fa21wX2RldGVybV9yZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gdHJlZV9yZWR1Y2VfYmxvY2s7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID0gcmVkdWN0aW9uX21ldGhvZF9ub3RfZGVmaW5lZDsKKyAgICAgICAgfQorICAgIH0KKyAgICBLX0RJQUcoIDEsICggIl9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gJWRcbiIsIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgKSApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisKKyAgICBrbXBfc3RnX2ZyX2RhdGFfdCAqIHJlZHVjdGlvbiA9IChrbXBfc3RnX2ZyX2RhdGFfdCAqKSBkYXRhOworICAgIGlmICggcmVkdWN0aW9uLT5mb3JjZSApIHsKKyAgICAgICAgaWYoIF9fa21wX2ZvcmNlX3JlZHVjdGlvbl9tZXRob2QgPT0gY3JpdGljYWxfcmVkdWNlX2Jsb2NrKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJjcml0aWNhbCIpOworICAgICAgICB9IGVsc2UgaWYgKCBfX2ttcF9mb3JjZV9yZWR1Y3Rpb25fbWV0aG9kID09IGF0b21pY19yZWR1Y2VfYmxvY2sgKSB7CisgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJhdG9taWMiKTsKKyAgICAgICAgfSBlbHNlIGlmICggX19rbXBfZm9yY2VfcmVkdWN0aW9uX21ldGhvZCA9PSB0cmVlX3JlZHVjZV9ibG9jayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInRyZWUiKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9lbnZfZm9ybWF0ICkgeworICAgICAgICAgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUU7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzIiwgbmFtZSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2RldGVybV9yZWQgKTsKKyAgICB9CisKKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9TVE9SQUdFX01BUAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3N0b3JhZ2VfbWFwKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggICJ2ZXJib3NlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfc3RvcmFnZV9tYXAgICAgICAgICA9IFRSVUU7CisgICAgICAgIF9fa21wX3N0b3JhZ2VfbWFwX3ZlcmJvc2UgPSBUUlVFOworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCA9IFRSVUU7CisKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlID0gRkFMU0U7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBfX2ttcF9zdG9yYWdlX21hcCApOyAvLyAhISEKKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9zdGdfcGFyc2Vfc3RvcmFnZV9tYXAKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggX19rbXBfc3RvcmFnZV9tYXBfdmVyYm9zZSB8fCBfX2ttcF9zdG9yYWdlX21hcF92ZXJib3NlX3NwZWNpZmllZCApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAidmVyYm9zZSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9zdG9yYWdlX21hcCApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3N0b3JhZ2VfbWFwCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BTExfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgX19rbXBfYWxsVGhyZWFkc1NwZWNpZmllZCA/IF9fa21wX21heF9udGggOiAxLCBfX2ttcF9tYXhfbnRoLAorICAgICAgICAmIF9fa21wX3RwX2NhcGFjaXR5ICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9hbGxfdGhyZWFkcHJpdmF0ZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FsbF90aHJlYWRwcml2YXRlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF90cF9jYXBhY2l0eSApOworCit9CisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9GT1JFSUdOX1RIUkVBRFNfVEhSRUFEUFJJVkFURQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZm9yZWlnbl90cCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3JlaWduX3RocmVhZHNfdGhyZWFkcHJpdmF0ZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2ZvcmVpZ25fdHAgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlCisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgS01QX1RPUE9MT0dZX01FVEhPRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorLy8KKy8vIFBhcnNlIHRoZSBwcm9jIGlkIGxpc3QuICBSZXR1cm4gVFJVRSBpZiBzdWNjZXNzZnVsLCBGQUxTRSBvdGhlcndpc2UuCisvLworc3RhdGljIGludAorX19rbXBfcGFyc2VfYWZmaW5pdHlfcHJvY19pZF9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwKKyAgICBjb25zdCBjaGFyICoqbmV4dEVudiwgY2hhciAqKnByb2NsaXN0ICkKK3sKKyAgICBjb25zdCBjaGFyICpzY2FuID0gZW52OworICAgIGNvbnN0IGNoYXIgKm5leHQgPSBzY2FuOworICAgIGludCBlbXB0eSA9IFRSVUU7CisKKyAgICAqcHJvY2xpc3QgPSBOVUxMOworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGVuZCwgc3RyaWRlOworCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIG5leHQgPSBzY2FuOworICAgICAgICBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKm5leHQgPT0gJ3snKSB7CisgICAgICAgICAgICBpbnQgbnVtOworICAgICAgICAgICAgbmV4dCsrOyAgICAgLy8gc2tpcCAneycKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgS01QX0FTU0VSVChudW0gPj0gMCk7CisKKyAgICAgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIENoZWNrIGZvciBlbmQgb2Ygc2V0LgorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ30nKSB7CisgICAgICAgICAgICAgICAgICAgIG5leHQrKzsgICAgIC8vIHNraXAgJ30nCisgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gU2tpcCBvcHRpb25hbCBjb21tYS4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBSZWFkIHRoZSBuZXh0IGludGVnZXIgaW4gdGhlIHNldC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICAgICAgICAgIEtNUF9BU1NFUlQobnVtID49IDApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIHsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCgqbmV4dCA8ICcwJykgfHwgKCpuZXh0ID4gJzknKSkgeworICAgICAgICAgICAgaWYgKGVtcHR5KSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlN5bnRheEVycm9yLCB2YXIgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgdGhlIGZpcnN0IGludGVnZXIuCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBzdGFydCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0YXJ0ID49IDApOworICAgICAgICBTS0lQX1dTKG5leHQpOworCisgICAgICAgIC8vCisgICAgICAgIC8vIElmIHRoaXMgaXNuJ3QgYSByYW5nZSwgdGhlbiBnbyBvbi4KKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCpuZXh0ICE9ICctJykgeworICAgICAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNraXAgb3B0aW9uYWwgY29tbWEuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICcsJykgeworICAgICAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUaGlzIGlzIGEgcmFuZ2UuICBTa2lwIG92ZXIgdGhlICctJyBhbmQgcmVhZCBpbiB0aGUgMm5kIGludC4KKyAgICAgICAgLy8KKyAgICAgICAgbmV4dCsrOyAgICAgICAgIC8vIHNraXAgJy0nCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICBpZiAoKCpuZXh0IDwgJzAnKSB8fCAoKm5leHQgPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBlbmQgPSBfX2ttcF9zdHJfdG9faW50KHNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChlbmQgPj0gMCk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQ2hlY2sgZm9yIGEgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBzdHJpZGUgPSAxOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJzonKSB7CisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gQSBzdHJpZGUgaXMgc3BlY2lmaWVkLiAgU2tpcCBvdmVyIHRoZSAnOiIgYW5kIHJlYWQgdGhlIDNyZCBpbnQuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaW50IHNpZ24gPSArMTsKKyAgICAgICAgICAgIG5leHQrKzsgICAgICAgICAvLyBza2lwICc6JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIHNjYW4gPSBuZXh0OworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gPSAtMTsKKyAgICAgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgoKm5leHQgPCAnMCcpIHx8ICgqbmV4dCA+ICc5JykpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIHZhciApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgc3RyaWRlID0gX19rbXBfc3RyX3RvX2ludChzY2FuLCAqbmV4dCk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgICAgIHN0cmlkZSAqPSBzaWduOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gRG8gc29tZSByYW5nZSBjaGVja3MuCisgICAgICAgIC8vCisgICAgICAgIGlmIChzdHJpZGUgPT0gMCkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlplcm9TdHJpZGUsIHZhciApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIGlmIChzdHJpZGUgPiAwKSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPiBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RhcnRHcmVhdGVyRW5kLCB2YXIsIHN0YXJ0LCBlbmQgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBpZiAoc3RhcnQgPCBlbmQpIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3RyaWRlTGVzc1plcm8sIHZhciwgc3RhcnQsIGVuZCApOworICAgICAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBpZiAoKGVuZCAtIHN0YXJ0KSAvIHN0cmlkZSA+IDY1NTM2ICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZlJhbmdlVG9vQmlnLCB2YXIsIGVuZCwgc3RhcnQsIHN0cmlkZSApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgZW1wdHkgPSBGQUxTRTsKKworICAgICAgICAvLworICAgICAgICAvLyBTa2lwIG9wdGlvbmFsIGNvbW1hLgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0KKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgfQorCisgICAgKm5leHRFbnYgPSBuZXh0OworCisgICAgeworICAgICAgICBpbnQgbGVuID0gbmV4dCAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgS01QX01FTUNQWV9TKHJldGxpc3QsIChsZW4rMSkqc2l6ZW9mKGNoYXIpLCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwcm9jbGlzdCA9IHJldGxpc3Q7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCisKKy8vCisvLyBJZiBLTVBfQUZGSU5JVFkgaXMgc3BlY2lmaWVkIHdpdGhvdXQgYSB0eXBlLCB0aGVuCisvLyBfX2ttcF9hZmZpbml0eV9ub3R5cGUgc2hvdWxkIHBvaW50IHRvIGl0cyBzZXR0aW5nLgorLy8KK3N0YXRpYyBrbXBfc2V0dGluZ190ICpfX2ttcF9hZmZpbml0eV9ub3R5cGUgPSBOVUxMOworCitzdGF0aWMgdm9pZAorX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLAorICAgIGVudW0gYWZmaW5pdHlfdHlwZSAgKiBvdXRfdHlwZSwKKyAgICBjaGFyICAgICAgICAgICAgICAgICoqIG91dF9wcm9jbGlzdCwKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X3ZlcmJvc2UsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF93YXJuLAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfcmVzcGVjdCwKKyAgICBlbnVtIGFmZmluaXR5X2dyYW4gICogb3V0X2dyYW4sCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9ncmFuX2xldmVscywKKyAgICBpbnQgICAgICAgICAgICAgICAgICogb3V0X2R1cHMsCisgICAgaW50ICAgICAgICAgICAgICAgICAqIG91dF9jb21wYWN0LAorICAgIGludCAgICAgICAgICAgICAgICAgKiBvdXRfb2Zmc2V0CispCit7CisgICAgY2hhciAqIGJ1ZmZlciA9IE5VTEw7ICAgIC8vIENvcHkgb2YgZW52IHZhciB2YWx1ZS4KKyAgICBjaGFyICogYnVmICAgID0gTlVMTDsgICAgLy8gQnVmZmVyIGZvciBzdHJ0b2tfcigpIGZ1bmN0aW9uLgorICAgIGNoYXIgKiBuZXh0ID0gTlVMTDsgICAgICAvLyBlbmQgb2YgdG9rZW4gLyBzdGFydCBvZiBuZXh0LgorICAgIGNvbnN0IGNoYXIgKiBzdGFydDsgICAgICAvLyBzdGFydCBvZiBjdXJyZW50IHRva2VuIChmb3IgZXJyIG1zZ3MpCisgICAgaW50ICAgIGNvdW50ICA9IDA7ICAgICAgIC8vIENvdW50ZXIgb2YgcGFyc2VkIGludGVnZXIgbnVtYmVycy4KKyAgICBpbnQgICAgbnVtYmVyWyAyIF07ICAgICAgLy8gUGFyc2VkIG51bWJlcnMuCisKKyAgICAvLyBHdWFyZHMuCisgICAgaW50IHR5cGUgICAgICAgICA9IDA7CisgICAgaW50IHByb2NsaXN0ICAgICA9IDA7CisgICAgaW50IG1heF9wcm9jbGlzdCA9IDA7CisgICAgaW50IHZlcmJvc2UgICAgICA9IDA7CisgICAgaW50IHdhcm5pbmdzICAgICA9IDA7CisgICAgaW50IHJlc3BlY3QgICAgICA9IDA7CisgICAgaW50IGdyYW4gICAgICAgICA9IDA7CisgICAgaW50IGR1cHMgICAgICAgICA9IDA7CisKKyAgICBLTVBfQVNTRVJUKCB2YWx1ZSAhPSBOVUxMICk7CisKKyAgICBpZiAoIFRDUl80KF9fa21wX2luaXRfbWlkZGxlKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudk1pZGRsZVdhcm4sIG5hbWUgKTsKKyAgICAgICAgX19rbXBfZW52X3RvUHJpbnQoIG5hbWUsIDAgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgYnVmZmVyID0gX19rbXBfc3RyX2Zvcm1hdCggIiVzIiwgdmFsdWUgKTsgICAgICAgICAvLyBDb3B5IGVudiB2YXIgdG8ga2VlcCBvcmlnaW5hbCBpbnRhY3QuCisgICAgYnVmID0gYnVmZmVyOworICAgIFNLSVBfV1MoYnVmKTsKKworICAgIC8vIEhlbHBlciBtYWNyb3MuCisKKyAgICAvLworICAgIC8vIElmIHdlIHNlZSBhIHBhcnNlIGVycm9yLCBlbWl0IGEgd2FybmluZyBhbmQgc2NhbiB0byB0aGUgbmV4dCAiLCIuCisgICAgLy8KKyAgICAvLyBGSVhNRSAtIHRoZXJlJ3MgZ290IHRvIGJlIGEgYmV0dGVyIHdheSB0byBwcmludCBhbiBlcnJvcgorICAgIC8vIG1lc3NhZ2UsIGhvcGVmdWxseSB3aXRob3V0IG92ZXJ3cml0dGluZyBwZWljZXMgb2YgYnVmLgorICAgIC8vCisgICAgI2RlZmluZSBFTUlUX1dBUk4oc2tpcCxlcnJsaXN0KSBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaGFyIGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBjaCA9ICpuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9ICdcMCc7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfV0FSTklORyBlcnJsaXN0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAqbmV4dCA9IGNoOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoc2tpcCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgaWYgKGNoID09ICcsJykgbmV4dCsrOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBidWYgPSBuZXh0OyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgICNkZWZpbmUgX3NldF9wYXJhbShfZ3VhcmQsX3ZhcixfdmFsKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBfZ3VhcmQgPT0gMCApIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIF92YXIgPSBfdmFsOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgX2d1YXJkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyAgICAjZGVmaW5lIHNldF90eXBlKHZhbCkgICAgICAgICAgX3NldF9wYXJhbSggdHlwZSwgICAgICpvdXRfdHlwZSwgICAgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfdmVyYm9zZSh2YWwpICAgICAgIF9zZXRfcGFyYW0oIHZlcmJvc2UsICAqb3V0X3ZlcmJvc2UsICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3dhcm5pbmdzKHZhbCkgICAgICBfc2V0X3BhcmFtKCB3YXJuaW5ncywgKm91dF93YXJuLCAgICAgICAgdmFsICkKKyAgICAjZGVmaW5lIHNldF9yZXNwZWN0KHZhbCkgICAgICAgX3NldF9wYXJhbSggcmVzcGVjdCwgICpvdXRfcmVzcGVjdCwgICAgIHZhbCApCisgICAgI2RlZmluZSBzZXRfZHVwcyh2YWwpICAgICAgICAgIF9zZXRfcGFyYW0oIGR1cHMsICAgICAqb3V0X2R1cHMsICAgICAgICB2YWwgKQorICAgICNkZWZpbmUgc2V0X3Byb2NsaXN0KHZhbCkgICAgICBfc2V0X3BhcmFtKCBwcm9jbGlzdCwgKm91dF9wcm9jbGlzdCwgICAgdmFsICkKKworICAgICNkZWZpbmUgc2V0X2dyYW4odmFsLGxldmVscykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgaWYgKCBncmFuID09IDAgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3JhbiA9IHZhbDsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgICpvdXRfZ3Jhbl9sZXZlbHMgPSBsZXZlbHM7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggRkFMU0UsICggQWZmUGFyYW1EZWZpbmVkLCBuYW1lLCBzdGFydCApICk7ICAgICAgICAgXAorICAgICAgICAgICAgfTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgZ3JhbjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9CisKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyAhPSBOVUxMICkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisjIGVuZGlmCisKKyAgICB3aGlsZSAoICpidWYgIT0gJ1wwJyApIHsKKyAgICAgICAgc3RhcnQgPSBuZXh0ID0gYnVmOworCisgICAgICAgIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vbmUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X25vbmUgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJzY2F0dGVyIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9zY2F0dGVyICk7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiY29tcGFjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfY29tcGFjdCApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImxvZ2ljYWwiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3R5cGUoIGFmZmluaXR5X2xvZ2ljYWwgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwaHlzaWNhbCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfcGh5c2ljYWwgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJleHBsaWNpdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfZXhwbGljaXQgKTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9pbnRlbDsKKyMgZW5kaWYKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJiYWxhbmNlZCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfdHlwZSggYWZmaW5pdHlfYmFsYW5jZWQgKTsKKyMgIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjICBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImRpc2FibGVkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF90eXBlKCBhZmZpbml0eV9kaXNhYmxlZCApOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoInZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub3ZlcmJvc2UiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3ZlcmJvc2UoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigid2FybmluZ3MiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X3dhcm5pbmdzKCBUUlVFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigibm93YXJuaW5ncyIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfd2FybmluZ3MoIEZBTFNFICk7CisgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggVFJVRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vcmVzcGVjdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBzZXRfcmVzcGVjdCggRkFMU0UgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJkdXBsaWNhdGVzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImR1cHMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgc2V0X2R1cHMoIFRSVUUgKTsKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJub2R1cGxpY2F0ZXMiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KQorICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0cigibm9kdXBzIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgIHNldF9kdXBzKCBGQUxTRSApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoImdyYW51bGFyaXR5IiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkKKyAgICAgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoImdyYW4iLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnPScpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnPScKKyAgICAgICAgICAgIFNLSVBfV1MobmV4dCk7CisKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoX19rbXBfbWF0Y2hfc3RyKCJmaW5lIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9maW5lLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigidGhyZWFkIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl90aHJlYWQsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJjb3JlIiwgYnVmLCAoY29uc3QgY2hhciAqKikmbmV4dCkpIHsKKyAgICAgICAgICAgICAgICBzZXRfZ3JhbiggYWZmaW5pdHlfZ3Jhbl9jb3JlLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigicGFja2FnZSIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fcGFja2FnZSwgLTEgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgfSBlbHNlIGlmIChfX2ttcF9tYXRjaF9zdHIoIm5vZGUiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX25vZGUsIC0xICk7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgICAgICAgICB9IGVsc2UgaWYgKF9fa21wX21hdGNoX3N0cigiZ3JvdXAiLCBidWYsIChjb25zdCBjaGFyICoqKSZuZXh0KSkgeworICAgICAgICAgICAgICAgIHNldF9ncmFuKCBhZmZpbml0eV9ncmFuX2dyb3VwLCAtMSApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisjIGVuZGlmIC8qIEtNUF9HUk9VUCBBRkZJTklUWSAqLworICAgICAgICAgICAgfSBlbHNlIGlmICgoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICBpbnQgbjsKKyAgICAgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG4gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICAgICAgc2V0X2dyYW4oIGFmZmluaXR5X2dyYW5fZGVmYXVsdCwgbiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoX19rbXBfbWF0Y2hfc3RyKCJwcm9jbGlzdCIsIGJ1ZiwgKGNvbnN0IGNoYXIgKiopJm5leHQpKSB7CisgICAgICAgICAgICBjaGFyICp0ZW1wX3Byb2NsaXN0OworCisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICc9JykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICc9JworICAgICAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgICAgIGlmICgqbmV4dCAhPSAnWycpIHsKKyAgICAgICAgICAgICAgICBFTUlUX1dBUk4oIFRSVUUsICggQWZmSW52YWxpZFBhcmFtLCBuYW1lLCBzdGFydCApICk7CisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBuZXh0Kys7ICAgICAgLy8gc2tpcCAnWycKKyAgICAgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QobmFtZSwgYnVmLAorICAgICAgICAgICAgICAoY29uc3QgY2hhciAqKikmbmV4dCwgJnRlbXBfcHJvY2xpc3QpKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyB3YXJuaW5nIGFscmVhZHkgZW1pdHRlZC4KKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIFNLSVBfVE8obmV4dCwgJ10nKTsKKyAgICAgICAgICAgICAgICBpZiAoKm5leHQgPT0gJ10nKSBuZXh0Kys7CisgICAgICAgICAgICAgICAgU0tJUF9UTyhuZXh0LCAnLCcpOworICAgICAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnLCcpIG5leHQrKzsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKCpuZXh0ICE9ICddJykgeworICAgICAgICAgICAgICAgIEVNSVRfV0FSTiggVFJVRSwgKCBBZmZJbnZhbGlkUGFyYW0sIG5hbWUsIHN0YXJ0ICkgKTsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsgICAgICAvLyBza2lwICddJworICAgICAgICAgICAgc2V0X3Byb2NsaXN0KCB0ZW1wX3Byb2NsaXN0ICk7CisgICAgICAgIH0gZWxzZSBpZiAoKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpKSB7CisgICAgICAgICAgICAvLyBQYXJzZSBpbnRlZ2VyIG51bWJlcnMgLS0gcGVybXV0ZSBhbmQgb2Zmc2V0LgorICAgICAgICAgICAgaW50IG47CisgICAgICAgICAgICBuZXh0ID0gYnVmOworICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICBuID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgS01QX0FTU0VSVChuID49IDApOworICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgIGlmICggY291bnQgPCAyICkgeworICAgICAgICAgICAgICAgIG51bWJlclsgY291bnQgXSA9IG47CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZNYW55UGFyYW1zLCBuYW1lLCBzdGFydCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICsrIGNvdW50OworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIEFmZkludmFsaWRQYXJhbSwgbmFtZSwgc3RhcnQgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJywnKSB7CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCpuZXh0ICE9ICdcMCcpIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKnRlbXAgPSBuZXh0OworICAgICAgICAgICAgRU1JVF9XQVJOKCBUUlVFLCAoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHRlbXAgKSApOworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICB9IC8vIHdoaWxlCisKKyAgICAjdW5kZWYgRU1JVF9XQVJOCisgICAgI3VuZGVmIF9zZXRfcGFyYW0KKyAgICAjdW5kZWYgc2V0X3R5cGUKKyAgICAjdW5kZWYgc2V0X3ZlcmJvc2UKKyAgICAjdW5kZWYgc2V0X3dhcm5pbmdzCisgICAgI3VuZGVmIHNldF9yZXNwZWN0CisgICAgI3VuZGVmIHNldF9ncmFudWxhcml0eQorCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlciApOworCisgICAgaWYgKCBwcm9jbGlzdCApIHsKKyAgICAgICAgaWYgKCAhIHR5cGUgKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmUHJvY0xpc3ROb1R5cGUsIG5hbWUgKTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9leHBsaWNpdCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZQcm9jTGlzdE5vdEV4cGxpY2l0LCBuYW1lICk7CisgICAgICAgICAgICBLTVBfQVNTRVJUKCAqb3V0X3Byb2NsaXN0ICE9IE5VTEwgKTsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAqb3V0X3Byb2NsaXN0ICk7CisgICAgICAgICAgICAqb3V0X3Byb2NsaXN0ID0gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKyAgICBzd2l0Y2ggKCAqb3V0X3R5cGUgKSB7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDoKKyAgICAgICAgY2FzZSBhZmZpbml0eV9waHlzaWNhbDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDAgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMSApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTWFueVBhcmFtc0ZvckxvZ2ljLCBuYW1lLCBudW1iZXJbIDEgXSApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfSBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2RlZmF1bHQgKSB7CisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Vc2luZywgIktNUF9BRkZJTklUWSIsICJmaW5lIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisgICAgICAgICAgICAgICAgfSBlbHNlCisjZW5kaWYKKyAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICkgeworICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Vc2luZywgIktNUF9BRkZJTklUWSIsICJjb3JlIiApOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3NjYXR0ZXI6CisgICAgICAgIGNhc2UgYWZmaW5pdHlfY29tcGFjdDogeworICAgICAgICAgICAgaWYgKCBjb3VudCA+IDAgKSB7CisgICAgICAgICAgICAgICAgKm91dF9jb21wYWN0ID0gbnVtYmVyWyAwIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBjb3VudCA+IDEgKSB7CisgICAgICAgICAgICAgICAgKm91dF9vZmZzZXQgPSBudW1iZXJbIDEgXTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHsKKyAgICAgICAgICAgIGlmICggKm91dF9wcm9jbGlzdCA9PSBOVUxMICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1Byb2NMaXN0LCBuYW1lICk7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGNvdW50ID4gMCApIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm9QYXJhbSwgbmFtZSwgImV4cGxpY2l0IiApOworICAgICAgICAgICAgfQorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X25vbmU6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAibm9uZSIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfZGlzYWJsZWQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGlzYWJsZWQiICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9IGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2RlZmF1bHQ6IHsKKyAgICAgICAgICAgIGlmICggY291bnQgPiAwICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZmZOb1BhcmFtLCBuYW1lLCAiZGVmYXVsdCIgKTsKKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH0gYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6IHsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIDAgKTsKKyAgICAgICAgfTsKKyAgICB9OyAvLyBzd2l0Y2gKK30gLy8gX19rbXBfcGFyc2VfYWZmaW5pdHlfZW52CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfYWZmaW5pdHkoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIF9fa21wX3BhcnNlX2FmZmluaXR5X2VudiggbmFtZSwgdmFsdWUsICYgX19rbXBfYWZmaW5pdHlfdHlwZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QsICYgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSwKKyAgICAgICYgX19rbXBfYWZmaW5pdHlfd2FybmluZ3MsICYgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9ncmFuLCAmIF9fa21wX2FmZmluaXR5X2dyYW5fbGV2ZWxzLAorICAgICAgJiBfX2ttcF9hZmZpbml0eV9kdXBzLCAmIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsCisgICAgICAmIF9fa21wX2FmZmluaXR5X29mZnNldCApOworCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hZmZpbml0eQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2FmZmluaXR5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV92ZXJib3NlICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAidmVyYm9zZSIpOworICAgIH0gZWxzZSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJub3ZlcmJvc2UiKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9hZmZpbml0eV93YXJuaW5ncyApIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIndhcm5pbmdzIik7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vd2FybmluZ3MiKTsKKyAgICB9CisgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCIsICJyZXNwZWN0Iik7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAibm9yZXNwZWN0Iik7CisgICAgICAgIH0KKyAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfZ3JhbiApIHsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWRlZmF1bHQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fZmluZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1maW5lLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3RocmVhZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT10aHJlYWQsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZToKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJncmFudWxhcml0eT1jb3JlLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX3BhY2thZ2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZ3JhbnVsYXJpdHk9cGFja2FnZSwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZ3Jhbl9ub2RlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PW5vZGUsIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9ncmFuX2dyb3VwOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImdyYW51bGFyaXR5PWdyb3VwLCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworIyBlbmRpZiAvKiBLTVBfR1JPVVBfQUZGSU5JVFkgKi8KKyAgICAgICAgfQorICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2R1cHMgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywiLCAiZHVwbGljYXRlcyIpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsIiwgIm5vZHVwbGljYXRlcyIpOworICAgICAgICB9CisgICAgfQorICAgIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJkaXNhYmxlZCIgKTsKKyAgICB9CisgICAgZWxzZSBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV90eXBlICl7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfbm9uZToKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgIm5vbmUiKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X3BoeXNpY2FsOgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQiLCAicGh5c2ljYWwiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2xvZ2ljYWw6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCIsICJsb2dpY2FsIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9jb21wYWN0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQsJWQiLCAiY29tcGFjdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2NvbXBhY3QsIF9fa21wX2FmZmluaXR5X29mZnNldCApOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGNhc2UgYWZmaW5pdHlfc2NhdHRlcjoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgInNjYXR0ZXIiLAorICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9jb21wYWN0LCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICBjYXNlIGFmZmluaXR5X2V4cGxpY2l0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXM9WyVzXSwlcyIsICJwcm9jbGlzdCIsCisgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0LCAiZXhwbGljaXQiICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9iYWxhbmNlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkLCVkIiwgImJhbGFuY2VkIiwKKyAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfY29tcGFjdCwgX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kaXNhYmxlZDoKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzIiwgImRpc2FibGVkIik7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgY2FzZSBhZmZpbml0eV9kZWZhdWx0OgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMiLCAiZGVmYXVsdCIpOworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIGRlZmF1bHQ6CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICI8dW5rbm93bj4iKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJ1xuIiApOworfSAvL19fa21wX3N0Z19wcmludF9hZmZpbml0eQorCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgY29uc3QgY2hhciAqIG5leHQgPSBOVUxMOworICAgIGNoYXIgKiB0ZW1wX3Byb2NsaXN0OworICAgIGttcF9zZXR0aW5nX3QgKipyaXZhbHMgPSAoa21wX3NldHRpbmdfdCAqKikgZGF0YTsKKyAgICBpbnQgcmM7CisKKyAgICByYyA9IF9fa21wX3N0Z19jaGVja19yaXZhbHMoIG5hbWUsIHZhbHVlLCByaXZhbHMgKTsKKyAgICBpZiAoIHJjICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZNaWRkbGVXYXJuLCBuYW1lICk7CisgICAgICAgIF9fa21wX2Vudl90b1ByaW50KCBuYW1lLCAwICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMSApOworCisgICAgaWYgKCBfX2ttcF9wYXJzZV9hZmZpbml0eV9wcm9jX2lkX2xpc3QoIG5hbWUsIHZhbHVlLCAmbmV4dCwKKyAgICAgICZ0ZW1wX3Byb2NsaXN0ICkpIHsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdcMCcpIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBHT01QX0NQVV9BRkZJTklUWSA9PiBncmFudWxhcml0eT1maW5lLGV4cGxpY2l0LHByb2NsaXN0PS4uLgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ID0gdGVtcF9wcm9jbGlzdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9leHBsaWNpdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2ZpbmU7CisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjIGVuZGlmCisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmU3ludGF4RXJyb3IsIG5hbWUgKTsKKyAgICAgICAgICAgIGlmICh0ZW1wX3Byb2NsaXN0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSgodm9pZCAqKXRlbXBfcHJvY2xpc3QpOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBXYXJuaW5nIGFscmVhZHkgZW1pdHRlZAorICAgICAgICAvLworICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworIyBlbmRpZgorICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX2dvbXBfY3B1X2FmZmluaXR5CisKKyMgZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisKKworIyBpZiBPTVBfNDBfRU5BQkxFRAorCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK1RoZSBPTVBfUExBQ0VTIHByb2MgaWQgbGlzdCBwYXJzZXIuIEhlcmUgaXMgdGhlIGdyYW1tYXI6CisKK3BsYWNlX2xpc3QgOj0gcGxhY2UKK3BsYWNlX2xpc3QgOj0gcGxhY2UgLCBwbGFjZV9saXN0CitwbGFjZSA6PSBudW0KK3BsYWNlIDo9IHBsYWNlIDogbnVtCitwbGFjZSA6PSBwbGFjZSA6IG51bSA6IHNpZ25lZAorcGxhY2UgOj0geyBzdWJwbGFjZWxpc3QgfQorcGxhY2UgOj0gISBwbGFjZSAgICAgICAgICAgICAgICAgIC8vIChsb3dlc3QgcHJpb3JpdHkpCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlCitzdWJwbGFjZV9saXN0IDo9IHN1YnBsYWNlICwgc3VicGxhY2VfbGlzdAorc3VicGxhY2UgOj0gbnVtCitzdWJwbGFjZSA6PSBudW0gOiBudW0KK3N1YnBsYWNlIDo9IG51bSA6IG51bSA6IHNpZ25lZAorc2lnbmVkIDo9IG51bQorc2lnbmVkIDo9ICsgc2lnbmVkCitzaWduZWQgOj0gLSBzaWduZWQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9zdWJwbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKipzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgZm9yICg7OykgeworICAgICAgICBpbnQgc3RhcnQsIGNvdW50LCBzdHJpZGU7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBpbiB0aGUgc3RhcnRpbmcgcHJvYyBpZAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICAgICAgaWYgKCgqKnNjYW4gPCAnMCcpIHx8ICgqKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgc3RhcnQgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQoc3RhcnQgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgICgqc2NhbikrKzsgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgY291bnQgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKCoqc2NhbiA8ICcwJykgfHwgKCoqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gKnNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChjb3VudCA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgJzonIGFuZCAnfScKKyAgICAgICAgLy8KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgqKnNjYW4gPT0gJ30nKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKipzY2FuID09ICcsJykgeworICAgICAgICAgICAgKCpzY2FuKSsrOyAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqKnNjYW4gIT0gJzonKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgKCpzY2FuKSsrOyAgICAgIC8vIHNraXAgJzonCisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gUmVhZCBzdHJpZGUgcGFyYW1ldGVyCisgICAgICAgIC8vCisgICAgICAgIGludCBzaWduID0gKzE7CisgICAgICAgIGZvciAoOzspIHsKKyAgICAgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICAgICAgaWYgKCoqc2NhbiA9PSAnKycpIHsKKyAgICAgICAgICAgICAgICAoKnNjYW4pKys7IC8vIHNraXAgJysnCisgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKipzY2FuID09ICctJykgeworICAgICAgICAgICAgICAgIHNpZ24gKj0gLTE7CisgICAgICAgICAgICAgICAgKCpzY2FuKSsrOyAvLyBza2lwICctJworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUygqc2Nhbik7CisgICAgICAgIGlmICgoKipzY2FuIDwgJzAnKSB8fCAoKipzY2FuID4gJzknKSkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIG5leHQgPSAqc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoKnNjYW4sICpuZXh0KTsKKyAgICAgICAgS01QX0FTU0VSVChzdHJpZGUgPj0gMCk7CisgICAgICAgICpzY2FuID0gbmV4dDsKKyAgICAgICAgc3RyaWRlICo9IHNpZ247CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyBhbmQgJ30nCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1MoKnNjYW4pOworICAgICAgICBpZiAoKipzY2FuID09ICd9JykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiA9PSAnLCcpIHsKKyAgICAgICAgICAgICgqc2NhbikrKzsgIC8vIHNraXAgJywnCisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKyAgICByZXR1cm4gVFJVRTsKK30KKworc3RhdGljIGludAorX19rbXBfcGFyc2VfcGxhY2UoIGNvbnN0IGNoYXIgKnZhciwgY29uc3QgY2hhciAqKiBzY2FuICkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0OworCisgICAgLy8KKyAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJ3snICchJyBhbmQgbnVtCisgICAgLy8KKyAgICBTS0lQX1dTKCpzY2FuKTsKKyAgICBpZiAoKipzY2FuID09ICd7JykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAneycKKyAgICAgICAgaWYgKCEgX19rbXBfcGFyc2Vfc3VicGxhY2VfbGlzdCh2YXIsIHNjYW4pKSB7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCoqc2NhbiAhPSAnfScpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnfScKKyAgICB9CisgICAgZWxzZSBpZiAoKipzY2FuID09ICchJykgeworICAgICAgICAoKnNjYW4pKys7ICAgICAgLy8gc2tpcCAnIScKKyAgICAgICAgcmV0dXJuIF9fa21wX3BhcnNlX3BsYWNlKHZhciwgc2Nhbik7IC8vJyEnIGhhcyBsb3dlciBwcmVjZWRlbmNlIHRoYW4gJzonCisgICAgfQorICAgIGVsc2UgaWYgKCgqKnNjYW4gPj0gJzAnKSAmJiAoKipzY2FuIDw9ICc5JykpIHsKKyAgICAgICAgbmV4dCA9ICpzY2FuOworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgaW50IHByb2MgPSBfX2ttcF9zdHJfdG9faW50KCpzY2FuLCAqbmV4dCk7CisgICAgICAgIEtNUF9BU1NFUlQocHJvYyA+PSAwKTsKKyAgICAgICAgKnNjYW4gPSBuZXh0OworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF9wYXJzZV9wbGFjZV9saXN0KCBjb25zdCBjaGFyICp2YXIsIGNvbnN0IGNoYXIgKmVudiwgY2hhciAqKnBsYWNlX2xpc3QgKQoreworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSBlbnY7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHNjYW47CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCBzdGFydCwgY291bnQsIHN0cmlkZTsKKworICAgICAgICBpZiAoISBfX2ttcF9wYXJzZV9wbGFjZSh2YXIsICZzY2FuKSkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gdmFsaWQgZm9sbG93IHNldHMgYXJlICcsJyAnOicgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICgqc2NhbiAhPSAnOicpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBzY2FuKys7ICAgICAgICAgLy8gc2tpcCAnOicKKworICAgICAgICAvLworICAgICAgICAvLyBSZWFkIGNvdW50IHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKCpzY2FuIDwgJzAnKSB8fCAoKnNjYW4gPiAnOScpKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgdmFyLCAiXCJ0aHJlYWRzXCIiICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICAgICAgbmV4dCA9IHNjYW47CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKGNvdW50ID49IDApOworICAgICAgICBzY2FuID0gbmV4dDsKKworICAgICAgICAvLworICAgICAgICAvLyB2YWxpZCBmb2xsb3cgc2V0cyBhcmUgJywnICc6JyBhbmQgRU9MCisgICAgICAgIC8vCisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgqc2NhbiA9PSAnXDAnKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBpZiAoKnNjYW4gPT0gJywnKSB7CisgICAgICAgICAgICBzY2FuKys7ICAgICAvLyBza2lwICcsJworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuICE9ICc6JykgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9CisgICAgICAgIHNjYW4rKzsgICAgICAgICAvLyBza2lwICc6JworCisgICAgICAgIC8vCisgICAgICAgIC8vIFJlYWQgc3RyaWRlIHBhcmFtZXRlcgorICAgICAgICAvLworICAgICAgICBpbnQgc2lnbiA9ICsxOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICAgICAgaWYgKCpzY2FuID09ICcrJykgeworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnKycKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICgqc2NhbiA9PSAnLScpIHsKKyAgICAgICAgICAgICAgICBzaWduICo9IC0xOworICAgICAgICAgICAgICAgIHNjYW4rKzsgLy8gc2tpcCAnLScKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIFNLSVBfV1Moc2Nhbik7CisgICAgICAgIGlmICgoKnNjYW4gPCAnMCcpIHx8ICgqc2NhbiA+ICc5JykpIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTeW50YXhFcnJvclVzaW5nLCB2YXIsICJcInRocmVhZHNcIiIgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorICAgICAgICBuZXh0ID0gc2NhbjsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIHN0cmlkZSA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgICAgICBLTVBfQVNTRVJUKHN0cmlkZSA+PSAwKTsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIHN0cmlkZSAqPSBzaWduOworCisgICAgICAgIC8vCisgICAgICAgIC8vIHZhbGlkIGZvbGxvdyBzZXRzIGFyZSAnLCcgYW5kIEVPTAorICAgICAgICAvLworICAgICAgICBTS0lQX1dTKHNjYW4pOworICAgICAgICBpZiAoKnNjYW4gPT0gJ1wwJykgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCpzY2FuID09ICcsJykgeworICAgICAgICAgICAgc2NhbisrOyAgICAgLy8gc2tpcCAnLCcKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIHZhciwgIlwidGhyZWFkc1wiIiApOworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfQorCisgICAgeworICAgICAgICBpbnQgbGVuID0gc2NhbiAtIGVudjsKKyAgICAgICAgY2hhciAqcmV0bGlzdCA9IChjaGFyICopX19rbXBfYWxsb2NhdGUoKGxlbiArIDEpICogc2l6ZW9mKGNoYXIpKTsKKyAgICAgICAgS01QX01FTUNQWV9TKHJldGxpc3QsIChsZW4rMSkqc2l6ZW9mKGNoYXIpLCBlbnYsIGxlbiAqIHNpemVvZihjaGFyKSk7CisgICAgICAgIHJldGxpc3RbbGVuXSA9ICdcMCc7CisgICAgICAgICpwbGFjZV9saXN0ID0gcmV0bGlzdDsKKyAgICB9CisgICAgcmV0dXJuIFRSVUU7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfcGxhY2VzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaW50IGNvdW50OworICAgIGNvbnN0IGNoYXIgKnNjYW4gPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gc2NhbjsKKyAgICBjb25zdCBjaGFyICpraW5kID0gIlwidGhyZWFkc1wiIjsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gSWYgT01QX1BST0NfQklORCBpcyBub3Qgc3BlY2lmaWVkIGJ1dCBPTVBfUExBQ0VTIGlzLAorICAgIC8vIHRoZW4gbGV0IE9NUF9QUk9DX0JJTkQgZGVmYXVsdCB0byB0cnVlLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKworICAgIC8vX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IDA7CisKKyAgICBpZiAoIF9fa21wX21hdGNoX3N0ciggInRocmVhZHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3RocmVhZDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfZHVwcyA9IEZBTFNFOworICAgICAgICBraW5kID0gIlwidGhyZWFkc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggImNvcmVzIiwgc2NhbiwgJm5leHQgKSApIHsKKyAgICAgICAgc2NhbiA9IG5leHQ7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9jb21wYWN0OworICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgIGtpbmQgPSAiXCJjb3Jlc1wiIjsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX21hdGNoX3N0ciggInNvY2tldHMiLCBzY2FuLCAmbmV4dCApICkgeworICAgICAgICBzY2FuID0gbmV4dDsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX3BhY2thZ2U7CisgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAga2luZCA9ICJcInNvY2tldHNcIiI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRSggKHZvaWQgKilfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApOworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgPSBOVUxMOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfcGFyc2VfcGxhY2VfbGlzdCggbmFtZSwgdmFsdWUsICZfX2ttcF9hZmZpbml0eV9wcm9jbGlzdCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2V4cGxpY2l0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2R1cHMgPSBGQUxTRTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID09IHByb2NfYmluZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfdHJ1ZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF90cnVlOworICAgIH0KKworICAgIFNLSVBfV1Moc2Nhbik7CisgICAgaWYgKCAqc2NhbiA9PSAnXDAnICkgeworICAgICAgICByZXR1cm47CisgICAgfQorCisgICAgLy8KKyAgICAvLyBQYXJzZSBvcHRpb24gY291bnQgcGFyYW1ldGVyIGluIHBhcmVudGhlc2VzCisgICAgLy8KKyAgICBpZiAoICpzY2FuICE9ICcoJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFN5bnRheEVycm9yVXNpbmcsIG5hbWUsIGtpbmQgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBzY2FuKys7ICAgICAvLyBza2lwICcoJworCisgICAgU0tJUF9XUyhzY2FuKTsKKyAgICBuZXh0ID0gc2NhbjsKKyAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICBjb3VudCA9IF9fa21wX3N0cl90b19pbnQoc2NhbiwgKm5leHQpOworICAgIEtNUF9BU1NFUlQoY291bnQgPj0gMCk7CisgICAgc2NhbiA9IG5leHQ7CisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gIT0gJyknICkgeworICAgICAgICBLTVBfV0FSTklORyggU3ludGF4RXJyb3JVc2luZywgbmFtZSwga2luZCApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHNjYW4rKzsgICAgIC8vIHNraXAgJyknCisKKyAgICBTS0lQX1dTKHNjYW4pOworICAgIGlmICggKnNjYW4gIT0gJ1wwJyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIFBhcnNlRXh0cmFDaGFyc1dhcm4sIG5hbWUsIHNjYW4gKTsKKyAgICB9CisgICAgX19rbXBfYWZmaW5pdHlfbnVtX3BsYWNlcyA9IGNvdW50OworfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3BsYWNlcygga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZCA9PSAwICkKKyAgICAgIHx8ICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKQorICAgICAgfHwgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPT0gcHJvY19iaW5kX2ZhbHNlICkgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV90eXBlID09IGFmZmluaXR5X2V4cGxpY2l0ICkgeworICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3Byb2NsaXN0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9JyVzJ1xuIiwgX19rbXBfYWZmaW5pdHlfcHJvY2xpc3QgKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjogJXNcbiIsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfY29tcGFjdCApIHsKKyAgICAgICAgaW50IG51bTsKKyAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fbWFza3MgPiAwICkgeworICAgICAgICAgICAgbnVtID0gX19rbXBfYWZmaW5pdHlfbnVtX21hc2tzOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9hZmZpbml0eV9udW1fcGxhY2VzID4gMCApIHsKKyAgICAgICAgICAgIG51bSA9IF9fa21wX2FmZmluaXR5X251bV9wbGFjZXM7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBudW0gPSAwOworICAgICAgICB9CisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3RocmVhZCApIHsKKyAgICAgICAgICAgIGlmICggbnVtID4gMCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMoJWQpJ1xuIiwgbnVtICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI9J3RocmVhZHMnXG4iICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9jb3JlICkgeworICAgICAgICAgICAgaWYgKCBudW0gPiAwICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nY29yZXMoJWQpJyBcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdjb3JlcydcbiIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX3BhY2thZ2UgKSB7CisgICAgICAgICAgICBpZiAoIG51bSA+IDAgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzKCVkKSdcbiIsIG51bSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiPSdzb2NrZXRzJ1xuIiApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiOiAlc1xuIiwgS01QX0kxOE5fU1RSKCBOb3REZWZpbmVkICkgKTsKKyAgICB9Cit9CisKKyMgZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworIyBpZiAoISBPTVBfNDBfRU5BQkxFRCkKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpbnQgZW5hYmxlZDsKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDMuMSwgT01QX1BST0NfQklORCBpcyBzdHJpY3RseSBhIGJvb2xlYW4KKyAgICAvLworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBlbmFibGVkICk7CisgICAgaWYgKCBlbmFibGVkICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIE9NUF9QUk9DX0JJTkQgPT4gZ3JhbnVsYXJpdHk9ZmluZSxzY2F0dGVyIG9uIE1JQworICAgICAgICAgICAgLy8gT01QX1BST0NfQklORCA9PiBncmFudWxhcml0eT1jb3JlLHNjYXR0ZXIgZWxzZXdoZXJlCisgICAgICAgICAgICAvLworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X3NjYXR0ZXI7CisjICBpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgZWxzZQorIyAgZW5kaWYKKyAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisgICAgfQorfSAvLyBfX2ttcF9wYXJzZV9wcm9jX2JpbmQKKworIyBlbmRpZiAvKiBpZiAoISBPTVBfNDBfRU5BQkxFRCkgKi8KKworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwKKyAgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhbGwiLCAxLCB2YWx1ZSApICkgeworICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICB9CisjIGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAieDJhcGljIGlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljX2lkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljLWlkIiwgOSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAieDJhcGljaWQiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDExIiwgMTMsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkX2xlYWZfMTEiLCAxMywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtbGVhZi0xMSIsIDEzLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZjExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYxMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgMTEiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRsZWFmXzExIiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkbGVhZi0xMSIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYxMSIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCAxMSIsIDgsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkXzExIiwgOCwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtMTEiLCA4LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZDExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZiAxMSIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfMTEiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJsZWFmLTExIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibGVhZjExIiwgNiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJhcGljIGlkIiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiYXBpY19pZCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImFwaWMtaWQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJhcGljaWQiLCA2LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmIDQiLCAxMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWRfbGVhZl80IiwgMTIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkLWxlYWYtNCIsIDEyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZCBsZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF9sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZC1sZWFmNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYgNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWZfNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWYtNCIsIDExLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZGxlYWY0IiwgMTAsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkIDQiLCA3LCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJjcHVpZF80IiwgNywgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aWQtNCIsIDcsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImNwdWlkNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYgNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWZfNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWYtNCIsIDYsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxlYWY0IiwgNSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfYXBpY2lkOworICAgIH0KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICIvcHJvYy9jcHVpbmZvIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiY3B1aW5mbyIsIDUsIHZhbHVlICkpIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzsKKyAgICB9CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJncm91cCIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOworICAgIH0KKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImZsYXQiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9mbGF0OworICAgIH0KKyMgaWYgS01QX1VTRV9IV0xPQworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJod2xvYyIsIDEsIHZhbHVlKSApIHsKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfaHdsb2M7CisgICAgfQorIyBlbmRpZgorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3BhcnNlX3RvcG9sb2d5X21ldGhvZAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3RvcG9sb2d5X21ldGhvZCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsCisgIHZvaWQgKiBkYXRhICkgeworIyBpZiBLTVBfREVCVUcKKyAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBOVUxMOworCisgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCApIHsKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQ6CisgICAgICAgIHZhbHVlID0gImRlZmF1bHQiOworICAgICAgICBicmVhazsKKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfYWxsOgorICAgICAgICB2YWx1ZSA9ICJhbGwiOworICAgICAgICBicmVhazsKKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfeDJhcGljaWQ6CisgICAgICAgIHZhbHVlID0gIngyQVBJQyBpZCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgYWZmaW5pdHlfdG9wX21ldGhvZF9hcGljaWQ6CisgICAgICAgIHZhbHVlID0gIkFQSUMgaWQiOworICAgICAgICBicmVhazsKKyMgIGVuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgICAgICBjYXNlIGFmZmluaXR5X3RvcF9tZXRob2RfY3B1aW5mbzoKKyAgICAgICAgdmFsdWUgPSAiY3B1aW5mbyI7CisgICAgICAgIGJyZWFrOworCisjICBpZiBLTVBfR1JPVVBfQUZGSU5JVFkKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwOgorICAgICAgICB2YWx1ZSA9ICJncm91cCI7CisgICAgICAgIGJyZWFrOworIyAgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAgICAgY2FzZSBhZmZpbml0eV90b3BfbWV0aG9kX2ZsYXQ6CisgICAgICAgIHZhbHVlID0gImZsYXQiOworICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgdmFsdWUgKTsKKyAgICB9CisjIGVuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kCisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vCisvLyBPTVBfUFJPQ19CSU5EIC8gYmluZC12YXIgaXMgZnVuY3Rpb25hbCBvbiBhbGwgNC4wIGJ1aWxkcywgaW5jbHVkaW5nIE9TIFgqCisvLyBPTVBfUExBQ0VTIC8gcGxhY2UtcGFydGl0aW9uLXZhciBpcyBub3QuCisvLworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBrbXBfc2V0dGluZ190ICoqcml2YWxzID0gKGttcF9zZXR0aW5nX3QgKiopIGRhdGE7CisgICAgaW50IHJjOworCisgICAgcmMgPSBfX2ttcF9zdGdfY2hlY2tfcml2YWxzKCBuYW1lLCB2YWx1ZSwgcml2YWxzICk7CisgICAgaWYgKCByYyApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIC8vCisgICAgLy8gaW4gT01QIDQuMCBPTVBfUFJPQ19CSU5EIGlzIGEgdmVjdG9yIG9mIHByb2NfYmluZCB0eXBlcy4KKyAgICAvLworICAgIEtNUF9ERUJVR19BU1NFUlQoIChfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgIT0gTlVMTCkKKyAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID4gMCApICk7CisKKyAgICBjb25zdCBjaGFyICpidWYgPSB2YWx1ZTsKKyAgICBjb25zdCBjaGFyICpuZXh0OworICAgIGludCBudW07CisgICAgU0tJUF9XUyggYnVmICk7CisgICAgaWYgKCAoKmJ1ZiA+PSAnMCcpICYmICgqYnVmIDw9ICc5JykgKSB7CisgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgIFNLSVBfRElHSVRTKCBuZXh0ICk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQoIGJ1ZiwgKm5leHQgKTsKKyAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBudW0gPSAtMTsKKyAgICB9CisKKyAgICBuZXh0ID0gYnVmOworICAgIGlmICggX19rbXBfbWF0Y2hfc3RyKCAiZGlzYWJsZWQiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgIGJ1ZiA9IG5leHQ7CisgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworIyBpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9kaXNhYmxlZDsKKyMgZW5kaWYgLyogS01QX0FGRklOSVRZX1NVUFBPUlRFRCAqLworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnVzZWQgPSAxOworICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgfQorICAgIGVsc2UgaWYgKCAoIG51bSA9PSAoaW50KXByb2NfYmluZF9mYWxzZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJmYWxzZSIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisjIGlmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKyAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X25vbmU7CisjIGVuZGlmIC8qIEtNUF9BRkZJTklUWV9TVVBQT1JURUQgKi8KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ZhbHNlOworICAgIH0KKyAgICBlbHNlIGlmICggKCBudW0gPT0gKGludClwcm9jX2JpbmRfdHJ1ZSApCisgICAgICB8fCBfX2ttcF9tYXRjaF9zdHIoICJ0cnVlIiwgYnVmLCAmbmV4dCApICkgeworICAgICAgICBidWYgPSBuZXh0OworICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX3RydWU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICAvLworICAgICAgICAvLyBDb3VudCB0aGUgbnVtYmVyIG9mIHZhbHVlcyBpbiB0aGUgZW52IHZhciBzdHJpbmcKKyAgICAgICAgLy8KKyAgICAgICAgY29uc3QgY2hhciAqc2NhbjsKKyAgICAgICAgaW50IG5lbGVtID0gMTsKKyAgICAgICAgZm9yICggc2NhbiA9IGJ1ZjsgKnNjYW4gIT0gJ1wwJzsgc2NhbisrICkgeworICAgICAgICAgICAgaWYgKCAqc2NhbiA9PSAnLCcgKSB7CisgICAgICAgICAgICAgICAgbmVsZW0rKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8vCisgICAgICAgIC8vIENyZWF0ZSAvIGV4cGFuZCB0aGUgbmVzdGVkIHByb2NfYmluZCBhcnJheSBhcyBuZWVkZWQKKyAgICAgICAgLy8KKyAgICAgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLnNpemUgPCBuZWxlbSApIHsKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlcyA9IChrbXBfcHJvY19iaW5kX3QgKikKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfUkVBTExPQyggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzLAorICAgICAgICAgICAgICAgIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICogbmVsZW0gKTsKKyAgICAgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gbmVsZW07CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gbmVsZW07CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIG5lc3RlZCBwcm9jX2JpbmQgYXJyYXkKKyAgICAgICAgLy8KKyAgICAgICAgaW50IGkgPSAwOworICAgICAgICBmb3IgKDs7KSB7CisgICAgICAgICAgICBlbnVtIGttcF9wcm9jX2JpbmRfdCBiaW5kOworCisgICAgICAgICAgICBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX21hc3RlciApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggIm1hc3RlciIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfbWFzdGVyOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX2Nsb3NlICkKKyAgICAgICAgICAgICAgfHwgX19rbXBfbWF0Y2hfc3RyKCAiY2xvc2UiLCBidWYsICZuZXh0ICkgKSB7CisgICAgICAgICAgICAgICAgYnVmID0gbmV4dDsKKyAgICAgICAgICAgICAgICBTS0lQX1dTKCBidWYgKTsKKyAgICAgICAgICAgICAgICBiaW5kID0gcHJvY19iaW5kX2Nsb3NlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAoICggbnVtID09IChpbnQpcHJvY19iaW5kX3NwcmVhZCApCisgICAgICAgICAgICAgIHx8IF9fa21wX21hdGNoX3N0ciggInNwcmVhZCIsIGJ1ZiwgJm5leHQgKSApIHsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgICAgIGJpbmQgPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIFN0Z0ludmFsaWRWYWx1ZSwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1tpKytdID0gYmluZDsKKyAgICAgICAgICAgIGlmICggaSA+PSBuZWxlbSApIHsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICpidWYgPT0gJywnICk7CisgICAgICAgICAgICBidWYrKzsKKyAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gUmVhZCBuZXh0IHZhbHVlIGlmIGl0IHdhcyBzcGVjaWZpZWQgYXMgYW4gaW50ZWdlcgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCpidWYgPj0gJzAnKSAmJiAoKmJ1ZiA8PSAnOScpICkgeworICAgICAgICAgICAgICAgIG5leHQgPSBidWY7CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMoIG5leHQgKTsKKyAgICAgICAgICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KCBidWYsICpuZXh0ICk7CisgICAgICAgICAgICAgICAgS01QX0FTU0VSVCggbnVtID49IDAgKTsKKyAgICAgICAgICAgICAgICBidWYgPSBuZXh0OworICAgICAgICAgICAgICAgIFNLSVBfV1MoIGJ1ZiApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgbnVtID0gLTE7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgU0tJUF9XUyggYnVmICk7CisgICAgfQorICAgIGlmICggKmJ1ZiAhPSAnXDAnICkgeworICAgICAgICBLTVBfV0FSTklORyggUGFyc2VFeHRyYUNoYXJzV2FybiwgbmFtZSwgYnVmICk7CisgICAgfQorfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwKKyAgdm9pZCAqIGRhdGEgKQoreworICAgIGludCBuZWxlbSA9IF9fa21wX25lc3RlZF9wcm9jX2JpbmQudXNlZDsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBuZWxlbSA9PSAwICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI6ICVzXG4iLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIj0nIiwgbmFtZSApOworICAgICAgICBmb3IgKCBpID0gMDsgaSA8IG5lbGVtOyBpKysgKSB7CisgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbaV0gKSB7CisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfZmFsc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiZmFsc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF90cnVlOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgInRydWUiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9tYXN0ZXI6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAibWFzdGVyIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfY2xvc2U6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiY2xvc2UiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9zcHJlYWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAic3ByZWFkIiApOworICAgICAgICAgICAgICAgIGJyZWFrOworCisgICAgICAgICAgICAgICAgY2FzZSBwcm9jX2JpbmRfaW50ZWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiaW50ZWwiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisKKyAgICAgICAgICAgICAgICBjYXNlIHByb2NfYmluZF9kZWZhdWx0OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgImRlZmF1bHQiICk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIGkgPCBuZWxlbSAtIDEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiLCIgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICInXG4iICk7CisgICAgfQorfQorCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfRFlOQU1JQworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9keW5hbWljKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIChfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWMpICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9keW5hbWljKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKQoreworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pYyApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2R5bmFtaWMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9rbXBfZHluYW1pY19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBUQ1JfNChfX2ttcF9pbml0X3BhcmFsbGVsKSApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudlBhcmFsbGVsV2FybiwgbmFtZSApOworICAgICAgICBfX2ttcF9lbnZfdG9QcmludCggbmFtZSwgMCApOworICAgICAgICByZXR1cm47CisgICAgfQorI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAibG9hZCBiYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZF9iYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZC1iYWxhbmNlIiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAibG9hZGJhbGFuY2UiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJiYWxhbmNlIiwgMSwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX2xvYWRfYmFsYW5jZTsKKyAgICB9CisjZW5kaWYgLyogVVNFX0xPQURfQkFMQU5DRSAqLworICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWQgbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWRfbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWQtbGltaXQiLCAxLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0aHJlYWRsaW1pdCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImxpbWl0IiwgMiwgdmFsdWUgKSApIHsKKyAgICAgICAgX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljX21vZGUgPSBkeW5hbWljX3RocmVhZF9saW1pdDsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggInJhbmRvbSIsIDEsIHZhbHVlICkgKSB7CisgICAgICAgIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID0gZHluYW1pY19yYW5kb207CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30gLy9fX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2ttcF9keW5hbWljX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisjaWYgS01QX0RFQlVHCisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX2RlZmF1bHQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgICVzOiAlcyBcbiIsIG5hbWUsIEtNUF9JMThOX1NUUiggTm90RGVmaW5lZCApICk7CisgICAgfQorIyBpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfbG9hZF9iYWxhbmNlICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJsb2FkIGJhbGFuY2UiICk7CisgICAgfQorIyBlbmRpZiAvKiBVU0VfTE9BRF9CQUxBTkNFICovCisgICAgZWxzZSBpZiAoIF9fa21wX2dsb2JhbC5nLmdfZHluYW1pY19tb2RlID09IGR5bmFtaWNfdGhyZWFkX2xpbWl0ICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsICJ0aHJlYWQgbGltaXQiICk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2R5bmFtaWNfbW9kZSA9PSBkeW5hbWljX3JhbmRvbSApIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAicmFuZG9tIiApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX0FTU0VSVCgwKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9rbXBfZHluYW1pY19tb2RlCisKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xPQURfQkFMQU5DRV9JTlRFUlZBTAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xkX2JhbGFuY2VfaW50ZXJ2YWwoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBkb3VibGUgaW50ZXJ2YWwgPSBfX2ttcF9jb252ZXJ0X3RvX2RvdWJsZSggdmFsdWUgKTsKKyAgICBpZiAoIGludGVydmFsID49IDAgKSB7CisgICAgICAgIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA9IGludGVydmFsOworICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJbnZhbGlkVmFsdWUsIG5hbWUsIHZhbHVlICk7CisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfc3RnX3BhcnNlX2xvYWRfYmFsYW5jZV9pbnRlcnZhbAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2xkX2JhbGFuY2VfaW50ZXJ2YWwoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyNpZiBLTVBfREVCVUcKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0lOC42ZlxuIiwgbmFtZSwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICk7CisjZW5kaWYgLyogS01QX0RFQlVHICovCit9IC8vIF9fa21wX3N0Z19wcmludF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwKKworI2VuZGlmIC8qIFVTRV9MT0FEX0JBTEFOQ0UgKi8KKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfQVRfRk9SSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfYXRfZm9yayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrICk7CisgICAgaWYgKCBfX2ttcF9uZWVkX3JlZ2lzdGVyX2F0Zm9yayApIHsKKyAgICAgICAgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkID0gVFJVRTsKKyAgICB9OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmtfc3BlY2lmaWVkICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9pbml0X2F0X2ZvcmsKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1NDSEVEVUxFCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc2NoZWR1bGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBzaXplX3QgbGVuZ3RoID0gS01QX1NUUkxFTiggdmFsdWUgKTsKKyAgICAgICAgaWYgKCBsZW5ndGggPiBJTlRfTUFYICkgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIExvbmdWYWx1ZSwgbmFtZSApOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgY2hhciAqc2VtaWNvbG9uOworICAgICAgICAgICAgaWYoIHZhbHVlWyBsZW5ndGggLSAxIF0gPT0gJyInIHx8IHZhbHVlWyBsZW5ndGggLTEgXSA9PSAnXCcnICkKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggVW5iYWxhbmNlZFF1b3RlcywgbmFtZSApOworICAgICAgICAgICAgZG8geworICAgICAgICAgICAgICAgIGNoYXIgc2VudGluZWw7CisKKyAgICAgICAgICAgICAgICBzZW1pY29sb24gPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnOycgKTsKKyAgICAgICAgICAgICAgICBpZiggKnZhbHVlICYmIHNlbWljb2xvbiAhPSB2YWx1ZSApIHsKKyAgICAgICAgICAgICAgICAgICAgY2hhciAqY29tbWEgPSAoY2hhciAqKSBzdHJjaHIoIHZhbHVlLCAnLCcgKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoIGNvbW1hICkgeworICAgICAgICAgICAgICAgICAgICAgICAgKytjb21tYTsKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gJywnOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICAgICAgICAgIHNlbnRpbmVsID0gJzsnOworICAgICAgICAgICAgICAgICAgICBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJzdGF0aWMiLCB2YWx1ZSwgc2VudGluZWwgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZ3JlZWR5IiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2dyZWVkeTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSBpZiggIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImJhbGFuY2VkIiwgY29tbWEsICc7JyApICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0YXRpYyA9IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiZ3VpZGVkIiwgdmFsdWUsIHNlbnRpbmVsICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBpZiAoICFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoICJpdGVyYXRpdmUiLCBjb21tYSwgJzsnICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29udGludWU7CisgICAgICAgICAgICAgICAgICAgICAgICB9IGVsc2UgaWYgKCAhX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCAiYW5hbHl0aWNhbCIsIGNvbW1hLCAnOycgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBhbmFseXRpY2FsIG5vdCBhbGxvd2VkIGZvciB0b28gbWFueSB0aHJlYWRzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3VpZGVkID0ga21wX3NjaF9ndWlkZWRfYW5hbHl0aWNhbF9jaHVua2VkOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBJbnZhbGlkQ2xhdXNlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggRW1wdHlDbGF1c2UsIG5hbWUgKTsKKyAgICAgICAgICAgIH0gd2hpbGUgKCAodmFsdWUgPSBzZW1pY29sb24gPyBzZW1pY29sb24gKyAxIDogTlVMTCkgKTsKKyAgICAgICAgfQorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlX19zY2hlZHVsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9zdGF0aWMgPT0ga21wX3NjaF9zdGF0aWNfZ3JlZWR5ICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcyIsICJzdGF0aWMsZ3JlZWR5Iik7CisgICAgfSBlbHNlIGlmICggX19rbXBfc3RhdGljID09IGttcF9zY2hfc3RhdGljX2JhbGFuY2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50ICggYnVmZmVyLCAiJXMiLCAic3RhdGljLGJhbGFuY2VkIik7CisgICAgfQorICAgIGlmICggX19rbXBfZ3VpZGVkID09IGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkICkgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICI7JXMnXG4iLCAiZ3VpZGVkLGl0ZXJhdGl2ZSIpOworICAgIH0gZWxzZSBpZiAoIF9fa21wX2d1aWRlZCA9PSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQgKSB7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIjslcydcbiIsICJndWlkZWQsYW5hbHl0aWNhbCIpOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIE9NUF9TQ0hFRFVMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9zY2hlZHVsZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKQoreworICAgIHNpemVfdCAgICAgIGxlbmd0aDsKKyAgICBpZiggdmFsdWUgKSB7CisgICAgICAgIGxlbmd0aCA9IEtNUF9TVFJMRU4oIHZhbHVlICk7CisgICAgICAgIGlmKCBsZW5ndGggKSB7CisgICAgICAgICAgICBjaGFyICpjb21tYSA9IChjaGFyICopIHN0cmNociggdmFsdWUsICcsJyApOworICAgICAgICAgICAgaWYoIHZhbHVlWyBsZW5ndGggLSAxIF0gPT0gJyInIHx8IHZhbHVlWyBsZW5ndGggLTEgXSA9PSAnXCcnKQorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBVbmJhbGFuY2VkUXVvdGVzLCBuYW1lICk7CisgICAgICAgICAgICAvKiBnZXQgdGhlIHNwZWNpZmllZCBzY2hlZHVsaW5nIHN0eWxlICovCisgICAgICAgICAgICBpZiAoIV9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCgiZHluYW1pYyIsIHZhbHVlLCAnLCcpKSAgICAgICAgICAvKiBEWU5BTUlDICovCisgICAgICAgICAgICAgICAgX19rbXBfc2NoZWQgPSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoImd1aWRlZCIsIHZhbHVlLCAnLCcpKSAgICAgIC8qIEdVSURFRCAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9ndWlkZWRfY2h1bmtlZDsKKy8vIEFDOiBUT0RPOiBhZGQgQVVUTyBzY2hlZHVsZSwgYW5kIHBwcm9iYWJseSByZW1vdmUgVFJBUEVaT0lEQUwgKE9NUCAzLjAgZG9lcyBub3QgYWxsb3cgaXQpCisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJhdXRvIiwgdmFsdWUsICcsJykpIHsgICAgICAgLyogQVVUTyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9hdXRvOworICAgICAgICAgICAgICAgIGlmKCBjb21tYSApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfd2FybmluZywgS01QX01TRyggSWdub3JlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIGNvbW1hID0gTlVMTDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJ0cmFwZXpvaWRhbCIsIHZhbHVlLCAnLCcpKSAvKiBUUkFQRVpPSURBTCAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF90cmFwZXpvaWRhbDsKKyAgICAgICAgICAgIGVsc2UgaWYgKCFfX2ttcF9zdHJjYXNlY21wX3dpdGhfc2VudGluZWwoInN0YXRpYyIsIHZhbHVlLCAnLCcpKSAgICAgIC8qIFNUQVRJQyAqLworICAgICAgICAgICAgICAgIF9fa21wX3NjaGVkID0ga21wX3NjaF9zdGF0aWM7CisjaWYgS01QX1NUQVRJQ19TVEVBTF9FTkFCTEVECisgICAgICAgICAgICBlbHNlIGlmICghX19rbXBfc3RyY2FzZWNtcF93aXRoX3NlbnRpbmVsKCJzdGF0aWNfc3RlYWwiLCB2YWx1ZSwgJywnKSkKKyAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX3N0ZWFsOworI2VuZGlmCisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHZhbHVlID0gTlVMTDsgLyogc2tpcCBwcm9jZXNzaW5nIG9mIGNvbW1hICovCisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiggdmFsdWUgJiYgY29tbWEgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfZW52X2NodW5rID0gVFJVRTsKKworICAgICAgICAgICAgICAgIGlmKF9fa21wX3NjaGVkID09IGttcF9zY2hfc3RhdGljKQorICAgICAgICAgICAgICAgICAgICBfX2ttcF9zY2hlZCA9IGttcF9zY2hfc3RhdGljX2NodW5rZWQ7CisgICAgICAgICAgICAgICAgKytjb21tYTsKKyAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IF9fa21wX3N0cl90b19pbnQoIGNvbW1hLCAwICk7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9jaHVuayA8IDEgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2NodW5rID0gS01QX0RFRkFVTFRfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIEludmFsaWRDaHVuaywgbmFtZSwgY29tbWEgKSwgX19rbXBfbXNnX251bGwgKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBfX2ttcF9jaHVuayApOworLy8gQUM6IG5leHQgYmxvY2sgY29tbWVudGVkIG91dCB1bnRpbCBLTVBfREVGQVVMVF9DSFVOSyAhPSBLTVBfTUlOX0NIVU5LICh0byBpbXByb3ZlIGNvZGUgY292ZXJhZ2UgOikKKy8vICAgICBUaGUgZGVmYXVsdCBjaHVuayBzaXplIGlzIDEgYWNjb3JkaW5nIHRvIHN0YW5kYXJkLCB0aHVzIG1ha2luZyBLTVBfTUlOX0NIVU5LIG5vdCAxIHdlIHdvdWxkIGludHJvZHVjZSBtZXNzOgorLy8gICAgIHdyb25nIGNodW5rIGJlY29tZXMgMSwgYnV0IGl0IHdpbGwgYmUgaW1wb3NzaWJsZSB0byBleHBsaWNpdGVseSBzZXQgMSwgYmVjYXVzZSBpdCBiZWNvbWVzIEtNUF9NSU5fQ0hVTksuLi4KKy8vICAgICAgICAgICAgICAgIH0gZWxzZSBpZiAoIF9fa21wX2NodW5rIDwgS01QX01JTl9DSFVOSyApIHsKKy8vICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NSU5fQ0hVTks7CisgICAgICAgICAgICAgICAgfSBlbHNlIGlmICggX19rbXBfY2h1bmsgPiBLTVBfTUFYX0NIVU5LICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9jaHVuayA9IEtNUF9NQVhfQ0hVTks7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZygga21wX21zX3dhcm5pbmcsIEtNUF9NU0coIExhcmdlQ2h1bmssIG5hbWUsIGNvbW1hICksIF9fa21wX21zZ19udWxsICk7CisgICAgICAgICAgICAgICAgICAgIEtNUF9JTkZPUk0oIFVzaW5nX2ludF9WYWx1ZSwgbmFtZSwgX19rbXBfY2h1bmsgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2ttcF9lbnZfY2h1bmsgPSBGQUxTRTsKKyAgICAgICAgfSBlbHNlCisgICAgICAgICAgICBLTVBfV0FSTklORyggRW1wdHlTdHJpbmcsIG5hbWUgKTsKKyAgICB9CisgICAgS19ESUFHKDEsICgiX19rbXBfc3RhdGljID09ICVkXG4iLCBfX2ttcF9zdGF0aWMpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2d1aWRlZCA9PSAlZFxuIiwgX19rbXBfZ3VpZGVkKSkKKyAgICBLX0RJQUcoMSwgKCJfX2ttcF9zY2hlZCA9PSAlZFxuIiwgX19rbXBfc2NoZWQpKQorICAgIEtfRElBRygxLCAoIl9fa21wX2NodW5rID09ICVkXG4iLCBfX2ttcF9jaHVuaykpCit9IC8vIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBpZiAoIF9fa21wX2NodW5rICkgeworICAgICAgICBzd2l0Y2ggKCBfX2ttcF9zY2hlZCApIHsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9keW5hbWljX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiZHluYW1pYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9ndWlkZWRfaXRlcmF0aXZlX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2FuYWx5dGljYWxfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcywlZCdcbiIsICJndWlkZWQiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAidHJhcGV6b2lkYWwiLCBfX2ttcF9jaHVuayk7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19iYWxhbmNlZDoKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfZ3JlZWR5OgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzLCVkJ1xuIiwgInN0YXRpYyIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWNfc3RlYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAic3RhdGljX3N0ZWFsIiwgX19rbXBfY2h1bmspOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMsJWQnXG4iLCAiYXV0byIsIF9fa21wX2NodW5rKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIHN3aXRjaCAoIF9fa21wX3NjaGVkICkgeworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZDoKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlcydcbiIsICJkeW5hbWljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfZ3VpZGVkX2l0ZXJhdGl2ZV9jaHVua2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2d1aWRlZF9hbmFseXRpY2FsX2NodW5rZWQ6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiZ3VpZGVkIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfdHJhcGV6b2lkYWw6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAidHJhcGV6b2lkYWwiKTsKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIGNhc2Uga21wX3NjaF9zdGF0aWM6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2NodW5rZWQ6CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX2JhbGFuY2VkOgorICAgICAgICAgICAgY2FzZSBrbXBfc2NoX3N0YXRpY19ncmVlZHk6CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAic3RhdGljIik7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICBjYXNlIGttcF9zY2hfc3RhdGljX3N0ZWFsOgorICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiVzJ1xuIiwgInN0YXRpY19zdGVhbCIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgY2FzZSBrbXBfc2NoX2F1dG86CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJXMnXG4iLCAiYXV0byIpOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX3NjaGVkdWxlCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9BVE9NSUNfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2F0b21pY19tb2RlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAvLyBNb2RlczogMCAtLSBkbyBub3QgY2hhbmdlIGRlZmF1bHQ7IDEgLS0gSW50ZWwgcGVyZiBtb2RlLCAyIC0tIEdPTVAgY29tcGF0aWJpbGl0eSBtb2RlLgorICAgIGludCBtb2RlID0gMDsKKyAgICBpbnQgbWF4ICA9IDE7CisgICAgI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICBtYXggPSAyOworICAgICNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID4gMCApIHsKKyAgICAgICAgX19rbXBfYXRvbWljX21vZGUgPSBtb2RlOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9hdG9taWNfbW9kZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2F0b21pY19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9hdG9taWNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQ09OU0lTVEVOQ1lfQ0hFQ0sKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjayggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggImFsbCIsIHZhbHVlLCAwICkgKSB7CisgICAgICAgIC8vIE5vdGUsIHRoaXMgd2lsbCBub3Qgd29yayBmcm9tIGttcF9zZXRfZGVmYXVsdHMgYmVjYXVzZSB0aF9jb25zIHN0YWNrIHdhcyBub3QgYWxsb2NhdGVkCisgICAgICAgIC8vIGZvciBleGlzdGVkIHRocmVhZChzKSB0aHVzIHRoZSBmaXJzdCBfX2ttcF9wdXNoXzxjb25zdHJ1Y3Q+IHdpbGwgYnJlYWsgd2l0aCBhc3NlcnRpb24uCisgICAgICAgIC8vIFRPRE86IGFsbG9jYXRlIHRoX2NvbnMgaWYgY2FsbGVkIGZyb20ga21wX3NldF9kZWZhdWx0cy4KKyAgICAgICAgX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrID0gVFJVRTsKKyAgICB9IGVsc2UgaWYgKCAhIF9fa21wX3N0cmNhc2VjbXBfd2l0aF9zZW50aW5lbCggIm5vbmUiLCB2YWx1ZSwgMCApICkgeworICAgICAgICBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPSBGQUxTRTsKKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0Z19wYXJzZV9jb25zaXN0ZW5jeV9jaGVjaworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisjaWYgS01QX0RFQlVHCisgICAgY29uc3QgY2hhciAqdmFsdWUgPSBOVUxMOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKSB7CisgICAgICAgIHZhbHVlID0gImFsbCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdmFsdWUgPSAibm9uZSI7CisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworfSAvLyBfX2ttcF9zdGdfcHJpbnRfY29uc2lzdGVuY3lfY2hlY2sKKworCisjaWYgVVNFX0lUVF9CVUlMRAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lUVF9QUkVQQVJFX0RFTEFZCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZiBVU0VfSVRUX05PVElGWQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2l0dF9wcmVwYXJlX2RlbGF5KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgLy8gRXhwZXJpbWVudGFsIGNvZGU6IEtNUF9JVFRfUFJFUEFSRV9ERUxBWSBzcGVjaWZpZXMgbnVtYmVydCBvZiBsb29wIGl0ZXJhdGlvbnMuCisgICAgaW50IGRlbGF5ID0gMDsKKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgSU5UX01BWCwgJiBkZWxheSApOworICAgIF9fa21wX2l0dF9wcmVwYXJlX2RlbGF5ID0gZGVsYXk7Cit9IC8vIF9fa21wX3N0cl9wYXJzZV9pdHRfcHJlcGFyZV9kZWxheQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2l0dF9wcmVwYXJlX2RlbGF5KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X3VpbnQ2NCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pdHRfcHJlcGFyZV9kZWxheSApOworCit9IC8vIF9fa21wX3N0cl9wcmludF9pdHRfcHJlcGFyZV9kZWxheQorCisjZW5kaWYgLy8gVVNFX0lUVF9OT1RJRlkKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIEtNUF9NQUxMT0NfUE9PTF9JTkNSCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jciggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX3NpemUoCisgICAgICAgICAgICBuYW1lLAorICAgICAgICAgICAgdmFsdWUsCisgICAgICAgICAgICBLTVBfTUlOX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBLTVBfTUFYX01BTExPQ19QT09MX0lOQ1IsCisgICAgICAgICAgICBOVUxMLAorICAgICAgICAgICAgJiBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyLAorICAgICAgICAgICAgMQorICAgICAgICApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbWFsbG9jX3Bvb2xfaW5jcgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2l6ZSggYnVmZmVyLCBuYW1lLCBfX2ttcF9tYWxsb2NfcG9vbF9pbmNyICk7CisKK30gLy8gX2ttcF9zdGdfcHJpbnRfbWFsbG9jX3Bvb2xfaW5jcgorCisKKyNpZmRlZiBLTVBfREVCVUcKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX1BBUl9SQU5HRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGFyX3JhbmdlKAorICAgICAgICAgICAgbmFtZSwKKyAgICAgICAgICAgIHZhbHVlLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2UsCisgICAgICAgICAgICBfX2ttcF9wYXJfcmFuZ2Vfcm91dGluZSwKKyAgICAgICAgICAgIF9fa21wX3Bhcl9yYW5nZV9maWxlbmFtZSwKKyAgICAgICAgICAgICYgX19rbXBfcGFyX3JhbmdlX2xiLAorICAgICAgICAgICAgJiBfX2ttcF9wYXJfcmFuZ2VfdWIKKyAgICAgICAgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9wYXJfcmFuZ2VfZW52KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaWYgKF9fa21wX3Bhcl9yYW5nZSAhPSAwKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgcGFyX3JhbmdlX3RvX3ByaW50ICk7CisgICAgfQorfSAvLyBfX2ttcF9zdGdfcHJpbnRfcGFyX3JhbmdlX2VudgorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfWUlFTERfQ1lDTEUsIEtNUF9ZSUVMRF9PTiwgS01QX1lJRUxEX09GRgorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX2N5Y2xlKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpbnQgZmxhZyA9IF9fa21wX3lpZWxkX2N5Y2xlOworICAgIF9fa21wX3N0Z19wYXJzZV9ib29sKCBuYW1lLCB2YWx1ZSwgJiBmbGFnICk7CisgICAgX19rbXBfeWllbGRfY3ljbGUgPSBmbGFnOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfY3ljbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wcmludF9ib29sKCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX2N5Y2xlICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDIsIElOVF9NQVgsICYgX19rbXBfeWllbGRfb25fY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX3lpZWxkX29uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24oIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfaW50KCBidWZmZXIsIG5hbWUsIF9fa21wX3lpZWxkX29uX2NvdW50ICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF95aWVsZF9vbgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAyLCBJTlRfTUFYLCAmIF9fa21wX3lpZWxkX29mZl9jb3VudCApOworfSAvLyBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb2ZmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfeWllbGRfb2ZmKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF95aWVsZF9vZmZfY291bnQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0lOSVRfV0FJVCwgS01QX05FWFRfV0FJVAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2luaXRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICBpbnQgd2FpdDsKKyAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgIHdhaXQgPSBfX2ttcF9pbml0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX0lOSVRfV0FJVCwgS01QX01BWF9JTklUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX2luaXRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfaW5pdF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9pbml0ID0gX19rbXBfaW5pdF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfaW5pdF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfaW5pdF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9pbml0X3dhaXQgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2luaXRfd2FpdAorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX25leHRfd2FpdCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgaW50IHdhaXQ7CisgICAgS01QX0FTU0VSVCggKCBfX2ttcF9uZXh0X3dhaXQgJiAxICkgPT0gMCApOworICAgIHdhaXQgPSBfX2ttcF9uZXh0X3dhaXQgLyAyOworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCBLTVBfTUlOX05FWFRfV0FJVCwgS01QX01BWF9ORVhUX1dBSVQsICYgd2FpdCApOworICAgIF9fa21wX25leHRfd2FpdCA9IHdhaXQgKiAyOworICAgIEtNUF9BU1NFUlQoICggX19rbXBfbmV4dF93YWl0ICYgMSApID09IDAgKTsKKyAgICBfX2ttcF95aWVsZF9uZXh0ID0gX19rbXBfbmV4dF93YWl0OworfSAvLyBfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0KCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9uZXh0X3dhaXQgKTsKK30gLy9fX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0CisKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0dUSURfTU9ERQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2d0aWRfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8KKyAgICAvLyBNb2RlczoKKyAgICAvLyAgIDAgLS0gZG8gbm90IGNoYW5nZSBkZWZhdWx0CisgICAgLy8gICAxIC0tIHNwIHNlYXJjaAorICAgIC8vICAgMiAtLSB1c2UgImtleWVkIiBUTFMgdmFyLCBpLmUuCisgICAgLy8gICAgICAgIHB0aHJlYWRfZ2V0c3BlY2lmaWMoTGludXgqIE9TL09TIFgqKSBvciBUbHNHZXRWYWx1ZShXaW5kb3dzKiBPUykKKyAgICAvLyAgIDMgLS0gX19kZWNsc3BlYyh0aHJlYWQpIFRMUyB2YXIgaW4gdGRhdGEgc2VjdGlvbgorICAgIC8vCisgICAgaW50IG1vZGUgPSAwOworICAgIGludCBtYXggID0gMjsKKyAgICAjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICAgICAgbWF4ID0gMzsKKyAgICAjZW5kaWYgLyogS01QX1REQVRBX0dUSUQgKi8KKyAgICBfX2ttcF9zdGdfcGFyc2VfaW50KCBuYW1lLCB2YWx1ZSwgMCwgbWF4LCAmIG1vZGUgKTsKKyAgICAvLyBUT0RPOyBwYXJzZV9pbnQgaXMgbm90IHZlcnkgc3VpdGFibGUgZm9yIHRoaXMgY2FzZS4gSW4gY2FzZSBvZiBvdmVyZmxvdyBpdCBpcyBiZXR0ZXIgdG8gdXNlCisgICAgLy8gMCByYXRoZXIgdGhhdCBtYXggdmFsdWUuCisgICAgaWYgKCBtb2RlID09IDAgKSB7CisgICAgICAgIF9fa21wX2FkanVzdF9ndGlkX21vZGUgPSBUUlVFOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfZ3RpZF9tb2RlID0gbW9kZTsKKyAgICAgICAgX19rbXBfYWRqdXN0X2d0aWRfbW9kZSA9IEZBTFNFOworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9wYXJzZV9ndGlkX21vZGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9ndGlkX21vZGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX2FkanVzdF9ndGlkX21vZGUgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9pbnQoIGJ1ZmZlciwgbmFtZSwgMCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9ndGlkX21vZGUgKTsKKyAgICB9Cit9IC8vIF9fa21wX3N0Z19wcmludF9ndGlkX21vZGUKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX05VTV9MT0NLU19JTl9CTE9DSworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2xvY2tfYmxvY2soIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9pbnQoIG5hbWUsIHZhbHVlLCAwLCBLTVBfSU5UX01BWCwgJiBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKTsKK30gLy8gX19rbXBfc3RyX3BhcnNlX2xvY2tfYmxvY2sKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sb2NrX2Jsb2NrKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9udW1fbG9ja3NfaW5fYmxvY2sgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2xvY2tfYmxvY2sKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0xPQ0tfS0lORAorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyMgZGVmaW5lIEtNUF9TVE9SRV9MT0NLX1NFUShhKSAoX19rbXBfdXNlcl9sb2NrX3NlcSA9IGxvY2tzZXFfIyNhKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9TVE9SRV9MT0NLX1NFUShhKQorI2VuZGlmCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfbG9ja19raW5kKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX2luaXRfdXNlcl9sb2NrcyApIHsKKyAgICAgICAgS01QX1dBUk5JTkcoIEVudkxvY2tXYXJuLCBuYW1lICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggInRhcyIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QgYW5kIHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RfYW5kX3NldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QtYW5kLXNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3QgYW5kc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdF9hbmRzZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0LWFuZHNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmQgc2V0IiwgMiwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAidGVzdGFuZF9zZXQiLCAyLCB2YWx1ZSApCisgICAgICB8fCBfX2ttcF9zdHJfbWF0Y2goICJ0ZXN0YW5kLXNldCIsIDIsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggInRlc3RhbmRzZXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3RhczsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHRhcyk7CisgICAgfQorI2lmIEtNUF9VU0VfRlVURVgKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCAiZnV0ZXgiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBpZiAoIF9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlKCkgKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2Z1dGV4OworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGZ1dGV4KTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBGdXRleE5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJ0aWNrZXQiLCAyLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3RpY2tldDsKKyAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHRpY2tldCk7CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJxdWV1aW5nIiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAicXVldWUiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3F1ZXVpbmc7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICB9CisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImRyZHBhIHRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhX3RpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhLXRpY2tldCIsIDEsIHZhbHVlICkKKyAgICAgIHx8IF9fa21wX3N0cl9tYXRjaCggImRyZHBhdGlja2V0IiwgMSwgdmFsdWUgKQorICAgICAgfHwgX19rbXBfc3RyX21hdGNoKCAiZHJkcGEiLCAxLCB2YWx1ZSApICkgeworICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2RyZHBhOworICAgICAgICBLTVBfU1RPUkVfTE9DS19TRVEoZHJkcGEpOworICAgIH0KKyNpZiBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgZWxzZSBpZiAoIF9fa21wX3N0cl9tYXRjaCggImFkYXB0aXZlIiwgMSwgdmFsdWUgKSAgKSB7CisgICAgICAgIGlmKCBfX2ttcF9jcHVpbmZvLnJ0bSApIHsgLy8gPz8/IElzIGNwdWluZm8gYXZhaWxhYmxlIGhlcmU/CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX2FkYXB0aXZlOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKGFkYXB0aXZlKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBBZGFwdGl2ZU5vdFN1cHBvcnRlZCwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShxdWV1aW5nKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sgJiYgS01QX1VTRV9UU1gKKyAgICBlbHNlIGlmICggX19rbXBfc3RyX21hdGNoKCJydG0iLCAxLCB2YWx1ZSkgKSB7CisgICAgICAgIGlmICggX19rbXBfY3B1aW5mby5ydG0gKSB7CisgICAgICAgICAgICBfX2ttcF91c2VyX2xvY2tfa2luZCA9IGxrX3J0bTsKKyAgICAgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShydG0pOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFkYXB0aXZlTm90U3VwcG9ydGVkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19xdWV1aW5nOworICAgICAgICAgICAgS01QX1NUT1JFX0xPQ0tfU0VRKHF1ZXVpbmcpOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgaWYgKCBfX2ttcF9zdHJfbWF0Y2goImhsZSIsIDEsIHZhbHVlKSApIHsKKyAgICAgICAgX19rbXBfdXNlcl9sb2NrX2tpbmQgPSBsa19obGU7CisgICAgICAgIEtNUF9TVE9SRV9MT0NLX1NFUShobGUpOworICAgIH0KKyNlbmRpZgorICAgIGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyggU3RnSW52YWxpZFZhbHVlLCBuYW1lLCB2YWx1ZSApOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9sb2NrX2tpbmQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBjb25zdCBjaGFyICp2YWx1ZSA9IE5VTEw7CisKKyAgICBzd2l0Y2ggKCBfX2ttcF91c2VyX2xvY2tfa2luZCApIHsKKyAgICAgICAgY2FzZSBsa19kZWZhdWx0OgorICAgICAgICB2YWx1ZSA9ICJkZWZhdWx0IjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa190YXM6CisgICAgICAgIHZhbHVlID0gInRhcyI7CisgICAgICAgIGJyZWFrOworCisjaWYgS01QX1VTRV9GVVRFWAorICAgICAgICBjYXNlIGxrX2Z1dGV4OgorICAgICAgICB2YWx1ZSA9ICJmdXRleCI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSyAmJiBLTVBfVVNFX1RTWAorICAgICAgICBjYXNlIGxrX3J0bToKKyAgICAgICAgdmFsdWUgPSAicnRtIjsKKyAgICAgICAgYnJlYWs7CisKKyAgICAgICAgY2FzZSBsa19obGU6CisgICAgICAgIHZhbHVlID0gImhsZSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisKKyAgICAgICAgY2FzZSBsa190aWNrZXQ6CisgICAgICAgIHZhbHVlID0gInRpY2tldCI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfcXVldWluZzoKKyAgICAgICAgdmFsdWUgPSAicXVldWluZyI7CisgICAgICAgIGJyZWFrOworCisgICAgICAgIGNhc2UgbGtfZHJkcGE6CisgICAgICAgIHZhbHVlID0gImRyZHBhIjsKKyAgICAgICAgYnJlYWs7CisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworICAgICAgICBjYXNlIGxrX2FkYXB0aXZlOgorICAgICAgICB2YWx1ZSA9ICJhZGFwdGl2ZSI7CisgICAgICAgIGJyZWFrOworI2VuZGlmCisgICAgfQorCisgICAgaWYgKCB2YWx1ZSAhPSBOVUxMICkgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIHZhbHVlICk7CisgICAgfQorfQorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfU1BJTl9CQUNLT0ZGX1BBUkFNUworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBLTVBfU1BJTl9CQUNLT0ZGX1BBUkFNUz1tYXhfYmFja29mZlssbWluX3RpY2tdIChtYXggYmFja29mZiBzaXplLCBtaW4gdGljayBmb3IgbWFjaGluZSBwYXVzZSkKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfc3Bpbl9iYWNrb2ZmX3BhcmFtcyhjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiB2YWx1ZSwgdm9pZCogZGF0YSkKK3sKKyAgICBjb25zdCBjaGFyICpuZXh0ID0gdmFsdWU7CisKKyAgICBpbnQgdG90YWwgPSAwOyAgICAgICAgICAvLyBDb3VudCBlbGVtZW50cyB0aGF0IHdlcmUgc2V0LiBJdCdsbCBiZSB1c2VkIGFzIGFuIGFycmF5IHNpemUKKyAgICBpbnQgcHJldl9jb21tYSA9IEZBTFNFOyAvLyBGb3IgY29ycmVjdCBwcm9jZXNzaW5nIHNlcXVlbnRpYWwgY29tbWFzCisgICAgaW50IGk7CisKKyAgICBrbXBfdWludDMyIG1heF9iYWNrb2ZmID0gX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFja29mZjsKKyAgICBrbXBfdWludDMyIG1pbl90aWNrID0gX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5taW5fdGljazsKKworICAgIC8vIFJ1biBvbmx5IDMgaXRlcmF0aW9ucyBiZWNhdXNlIGl0IGlzIGVub3VnaCB0byByZWFkIHR3byB2YWx1ZXMgb3IgZmluZCBhIHN5bnRheCBlcnJvcgorICAgIGZvciAoIGkgPSAwOyBpIDwgMyA7IGkrKykgeworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgT1IgbnVtYmVyIG9mIHZhbHVlcyA+IDIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgaWYgKCAoICggKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScgKSAmJiAqbmV4dCAhPScsJyApIHx8IHRvdGFsID4gMiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTcGFjZXNOb3RBbGxvd2VkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgaWYgKCBudW0gPD0gMCApIHsgLy8gVGhlIG51bWJlciBvZiByZXRyaWVzIHNob3VsZCBiZSA+IDAKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggbnVtID4gS01QX0lOVF9NQVggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX0lOVF9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0b3RhbCA9PSAxICkgeworICAgICAgICAgICAgICAgIG1heF9iYWNrb2ZmID0gbnVtOworICAgICAgICAgICAgfSBlbHNlIGlmKCB0b3RhbCA9PSAyICkgeworICAgICAgICAgICAgICAgIG1pbl90aWNrID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRvdGFsID4gMCApOworICAgIGlmKCB0b3RhbCA8PSAwICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5tYXhfYmFja29mZiA9IG1heF9iYWNrb2ZmOworICAgIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWluX3RpY2sgICAgPSBtaW5fdGljazsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zcGluX2JhY2tvZmZfcGFyYW1zKGttcF9zdHJfYnVmX3QgKmJ1ZmZlciwgY2hhciBjb25zdCogbmFtZSwgdm9pZCogZGF0YSkKK3sKKyAgICBpZiggX19rbXBfZW52X2Zvcm1hdCApIHsKKyAgICAgICAgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWChuYW1lKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlcz0nIiwgbmFtZSApOworICAgIH0KKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIlZCwlZCdcbiIsIF9fa21wX3NwaW5fYmFja29mZl9wYXJhbXMubWF4X2JhY2tvZmYsCisgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3Bpbl9iYWNrb2ZmX3BhcmFtcy5taW5fdGljayApOworfQorCisjaWYgS01QX1VTRV9BREFQVElWRV9MT0NLUworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfQURBUFRJVkVfTE9DS19QUk9QUywgS01QX1NQRUNVTEFUSVZFX1NUQVRTRklMRQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisvLyBQYXJzZSBvdXQgdmFsdWVzIGZvciB0aGUgdHVuYWJsZSBwYXJhbWV0ZXJzIGZyb20gYSBzdHJpbmcgb2YgdGhlIGZvcm0KKy8vIEtNUF9BREFQVElWRV9MT0NLX1BST1BTPW1heF9zb2Z0X3JldHJpZXNbLG1heF9iYWRuZXNzXQorc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9hZGFwdGl2ZV9sb2NrX3Byb3BzKCBjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICp2YWx1ZSwgdm9pZCAqZGF0YSApCit7CisgICAgaW50IG1heF9yZXRyaWVzID0gMDsKKyAgICBpbnQgbWF4X2JhZG5lc3MgPSAwOworCisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworCisgICAgaW50IHRvdGFsID0gMDsgICAgICAgICAgLy8gQ291bnQgZWxlbWVudHMgdGhhdCB3ZXJlIHNldC4gSXQnbGwgYmUgdXNlZCBhcyBhbiBhcnJheSBzaXplCisgICAgaW50IHByZXZfY29tbWEgPSBGQUxTRTsgLy8gRm9yIGNvcnJlY3QgcHJvY2Vzc2luZyBzZXF1ZW50aWFsIGNvbW1hcworICAgIGludCBpOworCisgICAgLy8gU2F2ZSB2YWx1ZXMgaW4gdGhlIHN0cnVjdHVyZSBfX2ttcF9zcGVjdWxhdGl2ZV9iYWNrb2ZmX3BhcmFtcworICAgIC8vIFJ1biBvbmx5IDMgaXRlcmF0aW9ucyBiZWNhdXNlIGl0IGlzIGVub3VnaCB0byByZWFkIHR3byB2YWx1ZXMgb3IgZmluZCBhIHN5bnRheCBlcnJvcgorICAgIGZvciAoIGkgPSAwOyBpIDwgMyA7IGkrKykgeworICAgICAgICBTS0lQX1dTKCBuZXh0ICk7CisKKyAgICAgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkgeworICAgICAgICAgICAgYnJlYWs7CisgICAgICAgIH0KKyAgICAgICAgLy8gTmV4dCBjaGFyYWN0ZXIgaXMgbm90IGFuIGludGVnZXIgb3Igbm90IGEgY29tbWEgT1IgbnVtYmVyIG9mIHZhbHVlcyA+IDIgPT4gZW5kIG9mIGxpc3QKKyAgICAgICAgaWYgKCAoICggKm5leHQgPCAnMCcgfHwgKm5leHQgPiAnOScgKSAmJiAqbmV4dCAhPScsJyApIHx8IHRvdGFsID4gMiApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTeW50YXhFcnJvciwgbmFtZSwgdmFsdWUgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgICAgICAvLyBUaGUgbmV4dCBjaGFyYWN0ZXIgaXMgJywnCisgICAgICAgIGlmICggKm5leHQgPT0gJywnICkgeworICAgICAgICAgICAgLy8gJywnIGlzIHRoZSBmaXNydCBjaGFyYWN0ZXIKKyAgICAgICAgICAgIGlmICggdG90YWwgPT0gMCB8fCBwcmV2X2NvbW1hICkgeworICAgICAgICAgICAgICAgIHRvdGFsKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gVFJVRTsKKyAgICAgICAgICAgIG5leHQrKzsgLy9za2lwICcsJworICAgICAgICAgICAgU0tJUF9XUyggbmV4dCApOworICAgICAgICB9CisgICAgICAgIC8vIE5leHQgY2hhcmFjdGVyIGlzIGEgZGlnaXQKKyAgICAgICAgaWYgKCAqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknICkgeworICAgICAgICAgICAgaW50IG51bTsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIgKmJ1ZiA9IG5leHQ7CisgICAgICAgICAgICBjaGFyIGNvbnN0ICogbXNnICA9IE5VTEw7CisgICAgICAgICAgICBwcmV2X2NvbW1hID0gRkFMU0U7CisgICAgICAgICAgICBTS0lQX0RJR0lUUyggbmV4dCApOworICAgICAgICAgICAgdG90YWwrKzsKKworICAgICAgICAgICAgY29uc3QgY2hhciAqdG1wID0gbmV4dDsKKyAgICAgICAgICAgIFNLSVBfV1MoIHRtcCApOworICAgICAgICAgICAgaWYgKCAoICpuZXh0ID09ICcgJyB8fCAqbmV4dCA9PSAnXHQnICkgJiYgKCAqdG1wID49ICcwJyAmJiAqdG1wIDw9ICc5JyApICkgeworICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZTcGFjZXNOb3RBbGxvd2VkLCBuYW1lLCB2YWx1ZSApOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludCggYnVmLCAqbmV4dCApOworICAgICAgICAgICAgaWYgKCBudW0gPCAwICkgeyAvLyBUaGUgbnVtYmVyIG9mIHJldHJpZXMgc2hvdWxkIGJlID49IDAKKyAgICAgICAgICAgICAgICBtc2cgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vU21hbGwgKTsKKyAgICAgICAgICAgICAgICBudW0gPSAxOworICAgICAgICAgICAgfSBlbHNlIGlmICggbnVtID4gS01QX0lOVF9NQVggKSB7CisgICAgICAgICAgICAgICAgbXNnID0gS01QX0kxOE5fU1RSKCBWYWx1ZVRvb0xhcmdlICk7CisgICAgICAgICAgICAgICAgbnVtID0gS01QX0lOVF9NQVg7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoIG1zZyAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgIC8vIE1lc3NhZ2UgaXMgbm90IGVtcHR5LiBQcmludCB3YXJuaW5nLgorICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBQYXJzZVNpemVJbnRXYXJuLCBuYW1lLCB2YWx1ZSwgbXNnICk7CisgICAgICAgICAgICAgICAgS01QX0lORk9STSggVXNpbmdfaW50X1ZhbHVlLCBuYW1lLCBudW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKCB0b3RhbCA9PSAxICkgeworICAgICAgICAgICAgICAgIG1heF9yZXRyaWVzID0gbnVtOworICAgICAgICAgICAgfSBlbHNlIGlmKCB0b3RhbCA9PSAyICkgeworICAgICAgICAgICAgICAgIG1heF9iYWRuZXNzID0gbnVtOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRvdGFsID4gMCApOworICAgIGlmKCB0b3RhbCA8PSAwICkgeworICAgICAgICBLTVBfV0FSTklORyggRW52U3ludGF4RXJyb3IsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgX19rbXBfYWRhcHRpdmVfYmFja29mZl9wYXJhbXMubWF4X3NvZnRfcmV0cmllcyA9IG1heF9yZXRyaWVzOworICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzID0gbWF4X2JhZG5lc3M7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzKGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApCit7CisgICAgaWYoIF9fa21wX2Vudl9mb3JtYXQgKSB7CisgICAgICAgIEtNUF9TVFJfQlVGX1BSSU5UX05BTUVfRVgobmFtZSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAgJXM9JyIsIG5hbWUgKTsKKyAgICB9CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiJWQsJWQnXG4iLCBfX2ttcF9hZGFwdGl2ZV9iYWNrb2ZmX3BhcmFtcy5tYXhfc29mdF9yZXRyaWVzLAorICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FkYXB0aXZlX2JhY2tvZmZfcGFyYW1zLm1heF9iYWRuZXNzICk7Cit9IC8vIF9fa21wX3N0Z19wcmludF9hZGFwdGl2ZV9sb2NrX3Byb3BzCisKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIF9fa21wX3N0Z19wYXJzZV9maWxlKCBuYW1lLCB2YWx1ZSwgIiIsICYgX19rbXBfc3BlY3VsYXRpdmVfc3RhdHNmaWxlICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBpZiAoIF9fa21wX3N0cl9tYXRjaCggIi0iLCAwLCBfX2ttcF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUgKSAgKSB7CisgICAgICAgIF9fa21wX3N0Z19wcmludF9zdHIoIGJ1ZmZlciwgbmFtZSwgInN0ZG91dCIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RyKCBidWZmZXIsIG5hbWUsIF9fa21wX3NwZWN1bGF0aXZlX3N0YXRzZmlsZSApOworICAgIH0KKworfSAvLyBfX2ttcF9zdGdfcHJpbnRfc3BlY3VsYXRpdmVfc3RhdHNmaWxlCisKKyNlbmRpZiAvLyBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKworI2VuZGlmIC8vIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gS01QX0hXX1NVQlNFVCAod2FzIEtNUF9QTEFDRV9USFJFQURTKQorLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldCggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgLy8gVmFsdWUgZXhhbXBsZTogNUN4MlR4MTVPCisgICAgLy8gV2hpY2ggbWVhbnMgInVzZSA1IGNvcmVzIHdpdGggb2Zmc2V0IDE1LCAyIHRocmVhZHMgcGVyIGNvcmUiCisgICAgLy8gQUM6IGV4dGVuZGVkIHRvIHNvY2tldHMgbGV2ZWwsIGV4YW1wbGVzIG9mCisgICAgLy8gICAgICJ1c2UgMiBzb2NrZXRzIHdpdGggb2Zmc2V0IDYsIDIgY29yZXMgd2l0aCBvZmZzZXQgMiBwZXIgc29ja2V0LCAyIHRocmVhZHMgcGVyIGNvcmUiOgorICAgIC8vICAgICAycyw2bywyYywybywydDsgMnMsNm8sMmMsMnQsMm87IDJzQDYsMmNAMiwydAorICAgIC8vICAgICBUbyBub3QgYnJlYWsgbGVnYWN5IGNvZGUgY29yZS1vZmZzZXQgY2FuIGJlIGxhc3Q7CisgICAgLy8gICAgIHBvc3RmaXggIm8iIG9yIHByZWZpeCBAIGNhbiBiZSBvZmZzZXQgZGVzaWduYXRvci4KKyAgICAvLyBOb3RlOiBub3QgYWxsIHN5bnRheCBlcnJvcnMgYXJlIGFuYWx5emVkLCBzb21lIG1heSBiZSBza2lwcGVkLgorI2RlZmluZSBDSEVDS19ERUxJTShfeCkgICAoKihfeCkgPT0gJywnIHx8ICooX3gpID09ICd4JykKKyAgICBzdGF0aWMgaW50IHBhcnNlZCA9IDA7CisgICAgaW50ICAgICAgICAgbnVtOworICAgIGludCBzaW5nbGVfd2FybmluZyA9IDA7CisgICAgaW50IGZsYWdTID0gMCwgZmxhZ0MgPSAwLCBmbGFnVCA9IDAsIGZsYWdTTyA9IDAsIGZsYWdDTyA9IDA7CisgICAgY29uc3QgY2hhciAqbmV4dCA9IHZhbHVlOworICAgIGNvbnN0IGNoYXIgKnByZXY7CisKKyAgICBpZiggc3RyY21wKG5hbWUsICJLTVBfUExBQ0VfVEhSRUFEUyIpID09IDAgKSB7CisgICAgICAgIEtNUF9JTkZPUk0oRW52VmFyRGVwcmVjYXRlZCxuYW1lLCJLTVBfSFdfU1VCU0VUIik7CisgICAgICAgIGlmKCBwYXJzZWQgPT0gMSApIHsKKyAgICAgICAgICAgIHJldHVybjsgLy8gYWxyZWFkeSBwYXJzZWQgS01QX0hXX1NVQlNFVAorICAgICAgICB9CisgICAgfQorICAgIHBhcnNlZCA9IDE7CisKKyAgICBTS0lQX1dTKG5leHQpOyAgLy8gc2tpcCB3aGl0ZSBzcGFjZXMKKyAgICBpZiAoKm5leHQgPT0gJ1wwJykKKyAgICAgICAgcmV0dXJuOyAgIC8vIG5vIGRhdGEgcHJvdmlkZWQsIHJldGFpbiBkZWZhdWx0IHZhbHVlcworICAgIGlmKCBzdHJjbXAobmFtZSwgIktNUF9QTEFDRV9USFJFQURTIikgPT0gMCApIHsKKyAgICAgICAgS01QX0lORk9STShFbnZWYXJEZXByZWNhdGVkLG5hbWUsIktNUF9IV19TVUJTRVQiKTsKKyAgICAgICAgaWYoIHBhcnNlZCA9PSAxICkgeworICAgICAgICAgICAgcmV0dXJuOyAvLyBhbHJlYWR5IHBhcnNlZCBLTVBfSFdfU1VCU0VUCisgICAgICAgIH0KKyAgICB9CisgICAgcGFyc2VkID0gMTsKKworICAgIFNLSVBfV1MobmV4dCk7ICAvLyBza2lwIHdoaXRlIHNwYWNlcworICAgIGlmICgqbmV4dCA9PSAnXDAnKQorICAgICAgICByZXR1cm47ICAgLy8gbm8gZGF0YSBwcm92aWRlZCwgcmV0YWluIGRlZmF1bHQgdmFsdWVzCisgICAgLy8gR2V0IG51bV9zb2NrZXRzIGZpcnN0IChvciB3aGF0ZXZlciBzcGVjaWZpZWQpCisgICAgaWYgKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpIHsKKyAgICAgICAgcHJldiA9IG5leHQ7CisgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICBudW0gPSBfX2ttcF9zdHJfdG9faW50KHByZXYsICpuZXh0KTsKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICAgICAgaWYgKCpuZXh0ID09ICdzJyB8fCAqbmV4dCA9PSAnUycpIHsgIC8vIGUuZy4gIjJzIgorICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3NvY2tldHMgPSBudW07CisgICAgICAgICAgICBmbGFnUyA9IDE7IC8vIGdvdCBudW0gc29ja2V0cworICAgICAgICAgICAgbmV4dCsrOworICAgICAgICAgICAgaWYgKCpuZXh0ID09ICdAJykgeyAvLyBzb2NrZXQgb2Zmc2V0LCBlLmcuICIyc0A0IgorICAgICAgICAgICAgICAgIGZsYWdTTyA9IDE7CisgICAgICAgICAgICAgICAgcHJldiA9ICsrbmV4dDsgIC8vIGRvbid0IGFsbG93IHNwYWNlcyBmb3Igc2ltcGxpY2l0eQorICAgICAgICAgICAgICAgIGlmICghKCpuZXh0ID49ICcwJyAmJiAqbmV4dCA8PSAnOScpKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIFNLSVBfRElHSVRTKG5leHQpOworICAgICAgICAgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX3NvY2tldF9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ2MnIHx8ICpuZXh0ID09ICdDJykgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX2NvcmVzID0gbnVtOworICAgICAgICAgICAgZmxhZ1MgPSBmbGFnQyA9IDE7IC8vIHNvY2tldHMgd2VyZSBub3Qgc3BlY2lmaWVkIC0gdXNlIGRlZmF1bHQKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnQCcpIHsgLy8gY29yZSBvZmZzZXQsIGUuZy4gIjJjQDYiCisgICAgICAgICAgICAgICAgZmxhZ0NPID0gMTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gKytuZXh0OyAgLy8gZG9uJ3QgYWxsb3cgc3BhY2VzIGZvciBzaW1wbGljaXR5CisgICAgICAgICAgICAgICAgaWYgKCEoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsgLy8gbm8gbGV0dGVyLWRlc2lnbmF0b3IgLSBudW0gY29yZXMKKyAgICAgICAgICAgIGZsYWdTID0gZmxhZ0MgPSAxOyAvLyBzb2NrZXRzIHdlcmUgbm90IHNwZWNpZmllZCAtIHVzZSBkZWZhdWx0CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ3QnIHx8ICpuZXh0ID09ICdUJykgeworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICAvLyBzb2NrZXRzLCBjb3JlcyB3ZXJlIG5vdCBzcGVjaWZpZWQgLSB1c2UgZGVmYXVsdAorICAgICAgICAgICAgcmV0dXJuOyAgIC8vIHdlIGlnbm9yZSBvZmZzZXQgdmFsdWUgaW4gY2FzZSBhbGwgY29yZXMgYXJlIHVzZWQKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnXDAnKSB7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fY29yZXMgPSBudW07CisgICAgICAgICAgICByZXR1cm47ICAgLy8gdGhlIG9ubHkgdmFsdWUgcHJvdmlkZWQgLSBzZXQgbnVtIGNvcmVzCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1MpOyAvLyBudW0gc29ja2V0cyBzaG91bGQgYWxyZWFkeSBiZSBzZXQgaGVyZQorICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCpuZXh0ID09ICdcMCcpCisgICAgICAgIHJldHVybjsgICAvLyAiIG4gICIgLSBzb21ldGhpbmcgbGlrZSB0aGlzCisgICAgaWYgKENIRUNLX0RFTElNKG5leHQpKSB7CisgICAgICAgIG5leHQrKzsgICAvLyBza2lwIGRlbGltaXRlcgorICAgICAgICBTS0lQX1dTKG5leHQpOworICAgIH0KKworICAgIC8vIEdldCBzZWNvbmQgdmFsdWUgKGNvdWxkIGJlIG9mZnNldCwgbnVtX2NvcmVzLCBudW1fdGhyZWFkcykKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ2MnIHx8ICpuZXh0ID09ICdDJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnQyA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIGZsYWdDID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIGlmICgqbmV4dCA9PSAnQCcpIHsgLy8gY29yZSBvZmZzZXQsIGUuZy4gIjJjQDYiCisgICAgICAgICAgICAgICAgZmxhZ0NPID0gMTsKKyAgICAgICAgICAgICAgICBwcmV2ID0gKytuZXh0OyAgLy8gZG9uJ3QgYWxsb3cgc3BhY2VzIGZvciBzaW1wbGljaXR5CisgICAgICAgICAgICAgICAgaWYgKCEoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykpIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgICAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ28nIHx8ICpuZXh0ID09ICdPJykgeyAvLyBvZmZzZXQgc3BlY2lmaWVkCisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldERlcHJlY2F0ZWQpOworICAgICAgICAgICAgc2luZ2xlX3dhcm5pbmcgPSAxOworICAgICAgICAgICAgaWYgKGZsYWdDKSB7IC8vIHdoZXRoZXIgbnVtX2NvcmVzIGFscmVhZHkgc3BlY2lmaWVkIChzb2NrZXRzIHNraXBwZWQpCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ0NPKTsgLy8gZWl0aGVyICJvIiBvciBALCBub3QgYm90aAorICAgICAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFmbGFnU08pOyAvLyBlaXRoZXIgIm8iIG9yIEAsIG5vdCBib3RoCisgICAgICAgICAgICAgICAgX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBmbGFnQyA9IDE7IC8vIG51bV9jb3JlcyBjb3VsZCBiZSBza2lwcGVkID8KKyAgICAgICAgICAgIGZsYWdUID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsgLy8gY2FuIGhhdmUgY29yZS1vZmZzZXQgc3BlY2lmaWVkIGFmdGVyIG51bSB0aHJlYWRzCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ1wwJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnQyk7IC8vIDR4MiBtZWFucyA0IGNvcmVzIDIgdGhyZWFkcyBwZXIgY29yZQorICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICByZXR1cm47ICAgLy8gdHdvIHZhbHVlcyBwcm92aWRlZCB3aXRob3V0IGxldHRlci1kZXNpZ25hdG9yCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCpuZXh0ID09ICdcMCcpCisgICAgICAgIHJldHVybjsgICAvLyAiIE5zLE5jICAiIC0gc29tZXRoaW5nIGxpa2UgdGhpcworICAgIGlmIChDSEVDS19ERUxJTShuZXh0KSkgeworICAgICAgICBuZXh0Kys7ICAgLy8gc2tpcCBkZWxpbWl0ZXIKKyAgICAgICAgU0tJUF9XUyhuZXh0KTsKKyAgICB9CisKKyAgICAvLyBHZXQgdGhpcmQgdmFsdWUgKGNvdWxkIGJlIGNvcmUtb2Zmc2V0LCBudW1fY29yZXMsIG51bV90aHJlYWRzKQorICAgIGlmICgqbmV4dCA+PSAnMCcgJiYgKm5leHQgPD0gJzknKSB7CisgICAgICAgIHByZXYgPSBuZXh0OworICAgICAgICBTS0lQX0RJR0lUUyhuZXh0KTsKKyAgICAgICAgbnVtID0gX19rbXBfc3RyX3RvX2ludChwcmV2LCAqbmV4dCk7CisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgICAgIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBpZiAoZmxhZ0MgPT0gMCkKKyAgICAgICAgICAgICAgICByZXR1cm47IC8vIG51bV9jb3JlcyBjb3VsZCBiZSBza2lwcGVkIChlLmcuIDJzLDRvLDJ0KQorICAgICAgICAgICAgZmxhZ1QgPSAxOworICAgICAgICAgICAgbmV4dCsrOyAvLyBjYW4gaGF2ZSBjb3JlLW9mZnNldCBzcGVjaWZpZWQgbGF0ZXIgKGUuZy4gMnMsMWMsMnQsM28pCisgICAgICAgIH0gZWxzZSBpZiAoKm5leHQgPT0gJ2MnIHx8ICpuZXh0ID09ICdDJykgeworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnQyA9PSAwKTsKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX251bV9jb3JlcyA9IG51bTsKKyAgICAgICAgICAgIGZsYWdDID0gMTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgICAgIC8vS01QX0RFQlVHX0FTU0VSVCgqbmV4dCAhPSAnQCcpOyAvLyBzb2NrZXQgb2Zmc2V0IHVzZWQgIm8iIGRlc2lnbmF0b3IKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAnbycgfHwgKm5leHQgPT0gJ08nKSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldERlcHJlY2F0ZWQpOworICAgICAgICAgICAgc2luZ2xlX3dhcm5pbmcgPSAxOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnQyk7CisgICAgICAgICAgICAvL0tNUF9ERUJVR19BU1NFUlQoIWZsYWdTTyk7IC8vIHNvY2tldCBvZmZzZXQgY291bGRuJ3QgdXNlIEAgZGVzaWduYXRvcgorICAgICAgICAgICAgX19rbXBfcGxhY2VfY29yZV9vZmZzZXQgPSBudW07CisgICAgICAgICAgICBuZXh0Kys7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0gZWxzZSB7CisgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ0MpOworICAgIFNLSVBfV1MobmV4dCk7CisgICAgaWYgKCAqbmV4dCA9PSAnXDAnICkKKyAgICAgICAgICAgIHJldHVybjsKKyAgICBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgfQorCisgICAgLy8gR2V0IDQtdGggdmFsdWUgKGNvdWxkIGJlIGNvcmUtb2Zmc2V0LCBudW1fdGhyZWFkcykKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ28nIHx8ICpuZXh0ID09ICdPJykgeworICAgICAgICAgICAgaWYgKCFzaW5nbGVfd2FybmluZykgeyAvLyB3YXJuIG9uY2UKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldERlcHJlY2F0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghZmxhZ1NPKTsgLy8gc29ja2V0IG9mZnNldCBjb3VsZG4ndCB1c2UgQCBkZXNpZ25hdG9yCisgICAgICAgICAgICBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCA9IG51bTsKKyAgICAgICAgICAgIG5leHQrKzsKKyAgICAgICAgfSBlbHNlIGlmICgqbmV4dCA9PSAndCcgfHwgKm5leHQgPT0gJ1QnKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGZsYWdUID09IDApOworICAgICAgICAgICAgX19rbXBfcGxhY2VfbnVtX3RocmVhZHNfcGVyX2NvcmUgPSBudW07CisgICAgICAgICAgICBmbGFnVCA9IDE7CisgICAgICAgICAgICBuZXh0Kys7IC8vIGNhbiBoYXZlIGNvcmUtb2Zmc2V0IHNwZWNpZmllZCBhZnRlciBudW0gdGhyZWFkcworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldEludmFsaWQsIG5hbWUsIHZhbHVlKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBTS0lQX1dTKG5leHQpOworICAgIGlmICggKm5leHQgPT0gJ1wwJyApCisgICAgICAgIHJldHVybjsKKyAgICBpZiAoQ0hFQ0tfREVMSU0obmV4dCkpIHsKKyAgICAgICAgbmV4dCsrOyAgIC8vIHNraXAgZGVsaW1pdGVyCisgICAgICAgIFNLSVBfV1MobmV4dCk7CisgICAgfQorCisgICAgLy8gR2V0IDUtdGggdmFsdWUgKGNvdWxkIGJlIGNvcmUtb2Zmc2V0LCBudW1fdGhyZWFkcykKKyAgICBpZiAoKm5leHQgPj0gJzAnICYmICpuZXh0IDw9ICc5JykgeworICAgICAgICBwcmV2ID0gbmV4dDsKKyAgICAgICAgU0tJUF9ESUdJVFMobmV4dCk7CisgICAgICAgIG51bSA9IF9fa21wX3N0cl90b19pbnQocHJldiwgKm5leHQpOworICAgICAgICBTS0lQX1dTKG5leHQpOworICAgICAgICBpZiAoKm5leHQgPT0gJ28nIHx8ICpuZXh0ID09ICdPJykgeworICAgICAgICAgICAgaWYgKCFzaW5nbGVfd2FybmluZykgeyAvLyB3YXJuIG9uY2UKKyAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZIV1N1YnNldERlcHJlY2F0ZWQpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChmbGFnVCk7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCFmbGFnU08pOyAvLyBzb2NrZXQgb2Zmc2V0IGNvdWxkbid0IHVzZSBAIGRlc2lnbmF0b3IKKyAgICAgICAgICAgIF9fa21wX3BsYWNlX2NvcmVfb2Zmc2V0ID0gbnVtOworICAgICAgICB9IGVsc2UgaWYgKCpuZXh0ID09ICd0JyB8fCAqbmV4dCA9PSAnVCcpIHsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZ1QgPT0gMCk7CisgICAgICAgICAgICBfX2ttcF9wbGFjZV9udW1fdGhyZWFkc19wZXJfY29yZSA9IG51bTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKEFmZkhXU3Vic2V0SW52YWxpZCwgbmFtZSwgdmFsdWUpOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX1dBUk5JTkcoQWZmSFdTdWJzZXRJbnZhbGlkLCBuYW1lLCB2YWx1ZSk7CisgICAgfQorICAgIHJldHVybjsKKyN1bmRlZiBDSEVDS19ERUxJTQorfQorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2h3X3N1YnNldCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmIChfX2ttcF9wbGFjZV9udW1fc29ja2V0cyArIF9fa21wX3BsYWNlX251bV9jb3JlcyArIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKSB7CisgICAgICAgIGludCBjb21tYSA9IDA7CisgICAgICAgIGttcF9zdHJfYnVmX3QgYnVmOworICAgICAgICBfX2ttcF9zdHJfYnVmX2luaXQoJmJ1Zik7CisgICAgICAgIGlmKF9fa21wX2Vudl9mb3JtYXQpCisgICAgICAgICAgICBLTVBfU1RSX0JVRl9QUklOVF9OQU1FX0VYKG5hbWUpOworICAgICAgICBlbHNlCisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KGJ1ZmZlciwgIiAgICVzPSciLCBuYW1lKTsKKyAgICAgICAgaWYgKF9fa21wX3BsYWNlX251bV9zb2NrZXRzKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlZHMiLCBfX2ttcF9wbGFjZV9udW1fc29ja2V0cyk7CisgICAgICAgICAgICBpZiAoX19rbXBfcGxhY2Vfc29ja2V0X29mZnNldCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJAJWQiLCBfX2ttcF9wbGFjZV9zb2NrZXRfb2Zmc2V0KTsKKyAgICAgICAgICAgIGNvbW1hID0gMTsKKyAgICAgICAgfQorICAgICAgICBpZiAoX19rbXBfcGxhY2VfbnVtX2NvcmVzKSB7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICIlcyVkYyIsIGNvbW1hPyIsIjoiIiwgX19rbXBfcGxhY2VfbnVtX2NvcmVzKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9wbGFjZV9jb3JlX29mZnNldCkKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCZidWYsICJAJWQiLCBfX2ttcF9wbGFjZV9jb3JlX29mZnNldCk7CisgICAgICAgICAgICBjb21tYSA9IDE7CisgICAgICAgIH0KKyAgICAgICAgaWYgKF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKQorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgmYnVmLCAiJXMlZHQiLCBjb21tYT8iLCI6IiIsIF9fa21wX3BsYWNlX251bV90aHJlYWRzX3Blcl9jb3JlKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludChidWZmZXIsICIlcydcbiIsIGJ1Zi5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCZidWYpOworLyoKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICAlczogJXMgXG4iLCBuYW1lLCBLTVBfSTE4Tl9TVFIoIE5vdERlZmluZWQgKSApOworKi8KKyAgICB9Cit9CisKKyNpZiBVU0VfSVRUX0JVSUxECisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SS0pPSU5fRlJBTUVTCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzKCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZm9ya2pvaW5fZnJhbWVzICk7Cit9IC8vIF9fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXMKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXMoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBuYW1lLCB2b2lkICogZGF0YSApIHsKKyAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3Jram9pbl9mcmFtZXMgKTsKK30gLy8gX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lcworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBLTVBfRk9SS0pPSU5fRlJBTUVTX01PREUKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wYXJzZV9mb3Jram9pbl9mcmFtZXNfbW9kZSggY2hhciBjb25zdCAqIG5hbWUsIGNoYXIgY29uc3QgKiB2YWx1ZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3BhcnNlX2ludCggbmFtZSwgdmFsdWUsIDAsIDMsICYgX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lcworCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X2Zvcmtqb2luX2ZyYW1lc19tb2RlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2ludCggYnVmZmVyLCBuYW1lLCBfX2ttcF9mb3Jram9pbl9mcmFtZXNfbW9kZSApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBPTVBfRElTUExBWV9FTlYKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworI2lmIE9NUF80MF9FTkFCTEVECisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2Vfb21wX2Rpc3BsYXlfZW52KCBjaGFyIGNvbnN0ICogbmFtZSwgY2hhciBjb25zdCAqIHZhbHVlLCB2b2lkICogZGF0YSApCit7CisgICAgaWYgKCBfX2ttcF9zdHJfbWF0Y2goICJWRVJCT1NFIiwgMSwgdmFsdWUgKSApCisgICAgeworICAgICAgICBfX2ttcF9kaXNwbGF5X2Vudl92ZXJib3NlID0gVFJVRTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYm9vbCggbmFtZSwgdmFsdWUsICYgX19rbXBfZGlzcGxheV9lbnYgKTsKKyAgICB9CisKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2Vudigga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIG5hbWUsIHZvaWQgKiBkYXRhICkKK3sKKyAgICBpZiAoIF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgKQorICAgIHsKKyAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0ciggYnVmZmVyLCBuYW1lLCAiVkVSQk9TRSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYm9vbCggYnVmZmVyLCBuYW1lLCBfX2ttcF9kaXNwbGF5X2VudiApOworICAgIH0KK30gLy8gX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudgorCitzdGF0aWMgdm9pZAorX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24oIGNoYXIgY29uc3QgKiBuYW1lLCBjaGFyIGNvbnN0ICogdmFsdWUsIHZvaWQgKiBkYXRhICkgeworICAgIGlmICggVENSXzQoX19rbXBfaW5pdF9wYXJhbGxlbCkgKSB7CisgICAgICAgIEtNUF9XQVJOSU5HKCBFbnZQYXJhbGxlbFdhcm4sIG5hbWUgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0gICAvLyByZWFkIHZhbHVlIGJlZm9yZSBmaXJzdCBwYXJhbGxlbCBvbmx5CisgICAgX19rbXBfc3RnX3BhcnNlX2Jvb2woIG5hbWUsIHZhbHVlLCAmIF9fa21wX29tcF9jYW5jZWxsYXRpb24gKTsKK30gLy8gX19rbXBfc3RnX3BhcnNlX29tcF9jYW5jZWxsYXRpb24KKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBjaGFyIGNvbnN0ICogbmFtZSwgdm9pZCAqIGRhdGEgKSB7CisgICAgX19rbXBfc3RnX3ByaW50X2Jvb2woIGJ1ZmZlciwgbmFtZSwgX19rbXBfb21wX2NhbmNlbGxhdGlvbiApOworfSAvLyBfX2ttcF9zdGdfcHJpbnRfb21wX2NhbmNlbGxhdGlvbgorCisjZW5kaWYKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gVGFibGUuCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworc3RhdGljIGttcF9zZXR0aW5nX3QgX19rbXBfc3RnX3RhYmxlW10gPSB7CisKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0JMT0NLVElNRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Jsb2NrdGltZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2Jsb2NrdGltZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EVVBMSUNBVEVfTElCX09LIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kdXBsaWNhdGVfbGliX29rLCAgIF9fa21wX3N0Z19wcmludF9kdXBsaWNhdGVfbGliX29rLCAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTElCUkFSWSIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfd2FpdF9wb2xpY3ksICAgICAgICBfX2ttcF9zdGdfcHJpbnRfd2FpdF9wb2xpY3ksICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX01BWF9USFJFQURTIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsbF90aHJlYWRzLCAgICAgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LCAvLyBGb3IgYmFja3dhcmQgY29tcGF0aWJpbGl0eQorICAgIHsgIktNUF9NT05JVE9SX1NUQUNLU0laRSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9tb25pdG9yX3N0YWNrc2l6ZSwgIF9fa21wX3N0Z19wcmludF9tb25pdG9yX3N0YWNrc2l6ZSwgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU0VUVElOR1MiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc2V0dGluZ3MsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc2V0dGluZ3MsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NUQUNLT0ZGU0VUIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrb2Zmc2V0LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrb2Zmc2V0LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVEFDS1NJWkUiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdGFja3NpemUsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9zdGFja3NpemUsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfU1RBQ0tQQUQiLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2twYWQsICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfc3RhY2twYWQsICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1ZFUlNJT04iLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3ZlcnNpb24sICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3ZlcnNpb24sICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9XQVJOSU5HUyIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV93YXJuaW5ncywgICAgICAgICAgIF9fa21wX3N0Z19wcmludF93YXJuaW5ncywgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKworICAgIHsgIk9NUF9ORVNURUQiLCAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9uZXN0ZWQsICAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9uZXN0ZWQsICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTlVNX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbnVtX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbnVtX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3N0YWNrc2l6ZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3N0YWNrc2l6ZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1RBU0tJTkciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Rhc2tpbmcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3Rhc2tpbmcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9UQVNLX1NURUFMSU5HX0NPTlNUUkFJTlQiLCAgICAgIF9fa21wX3N0Z19wYXJzZV90YXNrX3N0ZWFsaW5nLCAgICAgIF9fa21wX3N0Z19wcmludF90YXNrX3N0ZWFsaW5nLCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfTUFYX0FDVElWRV9MRVZFTFMiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWF4X2FjdGl2ZV9sZXZlbHMsICBfX2ttcF9zdGdfcHJpbnRfbWF4X2FjdGl2ZV9sZXZlbHMsICBOVUxMLCAwLCAwIH0sCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICB7ICJPTVBfTUFYX1RBU0tfUFJJT1JJVFkiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbWF4X3Rhc2tfcHJpb3JpdHksICBfX2ttcF9zdGdfcHJpbnRfbWF4X3Rhc2tfcHJpb3JpdHksICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyAgICB7ICJPTVBfVEhSRUFEX0xJTUlUIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHMsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHMsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiT01QX1dBSVRfUE9MSUNZIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3dhaXRfcG9saWN5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X3dhaXRfcG9saWN5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ESVNQX05VTV9CVUZGRVJTIiwgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kaXNwX2J1ZmZlcnMsICAgICAgIF9fa21wX3N0Z19wcmludF9kaXNwX2J1ZmZlcnMsICAgICAgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfTkVTVEVEX0hPVF9URUFNUworICAgIHsgIktNUF9IT1RfVEVBTVNfTUFYX0xFVkVMIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9ob3RfdGVhbXNfbGV2ZWwsICAgIF9fa21wX3N0Z19wcmludF9ob3RfdGVhbXNfbGV2ZWwsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSE9UX1RFQU1TX01PREUiLCAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaG90X3RlYW1zX21vZGUsICAgICBfX2ttcF9zdGdfcHJpbnRfaG90X3RlYW1zX21vZGUsICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYgLy8gS01QX05FU1RFRF9IT1RfVEVBTVMKKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworICAgIHsgIktNUF9IQU5ETEVfU0lHTkFMUyIsICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9oYW5kbGVfc2lnbmFscywgICAgIF9fa21wX3N0Z19wcmludF9oYW5kbGVfc2lnbmFscywgICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorICAgIHsgIktNUF9JTkhFUklUX0ZQX0NPTlRST0wiLCAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbmhlcml0X2ZwX2NvbnRyb2wsIF9fa21wX3N0Z19wcmludF9pbmhlcml0X2ZwX2NvbnRyb2wsIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX1NUQUNLU0laRSIsICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3RhY2tzaXplLCAgICAgICAgICBOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKworI2lmZGVmIEtNUF9ERUJVRworICAgIHsgIktNUF9BX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9hX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9hX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQl9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYl9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYl9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2NfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9EX0RFQlVHIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kX2RlYnVnLCAgICAgICAgICAgIF9fa21wX3N0Z19wcmludF9kX2RlYnVnLCAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRV9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZV9kZWJ1ZywgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZV9kZWJ1ZywgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZfREVCVUciLCAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZfZGVidWcsICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2ZfZGVidWcsICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVRyIsICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1ZywgICAgICAgICAgICAgIE5VTEwsIC8qIG5vIHByaW50ICovICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFQlVHX0JVRl9BVE9NSUMiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RlYnVnX2J1Zl9hdG9taWMsICAgX19rbXBfc3RnX3ByaW50X2RlYnVnX2J1Zl9hdG9taWMsICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ERUJVR19CVUZfQ0hBUlMiLCAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9kZWJ1Z19idWZfY2hhcnMsICAgIF9fa21wX3N0Z19wcmludF9kZWJ1Z19idWZfY2hhcnMsICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfREVCVUdfQlVGX0xJTkVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZGVidWdfYnVmX2xpbmVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZGVidWdfYnVmX2xpbmVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RJQUciLCAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2RpYWcsICAgICAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2RpYWcsICAgICAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BBUl9SQU5HRSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3Bhcl9yYW5nZV9lbnYsICAgICAgX19rbXBfc3RnX3ByaW50X3Bhcl9yYW5nZV9lbnYsICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9ZSUVMRF9DWUNMRSIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV95aWVsZF9jeWNsZSwgICAgICAgIF9fa21wX3N0Z19wcmludF95aWVsZF9jeWNsZSwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfWUlFTERfT04iLCAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfeWllbGRfb24sICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfeWllbGRfb24sICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1lJRUxEX09GRiIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3lpZWxkX29mZiwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3lpZWxkX29mZiwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorI2VuZGlmIC8vIEtNUF9ERUJVRworCisgICAgeyAiS01QX0FMSUdOX0FMTE9DIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FsaWduX2FsbG9jLCAgICAgICAgX19rbXBfc3RnX3ByaW50X2FsaWduX2FsbG9jLCAgICAgICAgTlVMTCwgMCwgMCB9LAorCisgICAgeyAiS01QX1BMQUlOX0JBUlJJRVIiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9QTEFJTl9CQVJSSUVSX1BBVFRFUk4iLCAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SS0pPSU5fQkFSUklFUiIsICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYmFycmllcl9icmFuY2hfYml0LCBfX2ttcF9zdGdfcHJpbnRfYmFycmllcl9icmFuY2hfYml0LCBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0JBUlJJRVJfUEFUVEVSTiIsICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfcGF0dGVybiwgICAgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfcGF0dGVybiwgICAgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9GQVNUX1JFRFVDVElPTl9CQVJSSUVSCisgICAgeyAiS01QX1JFRFVDVElPTl9CQVJSSUVSIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2JhcnJpZXJfYnJhbmNoX2JpdCwgX19rbXBfc3RnX3ByaW50X2JhcnJpZXJfYnJhbmNoX2JpdCwgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9SRURVQ1RJT05fQkFSUklFUl9QQVRURVJOIiwgICAgIF9fa21wX3N0Z19wYXJzZV9iYXJyaWVyX3BhdHRlcm4sICAgIF9fa21wX3N0Z19wcmludF9iYXJyaWVyX3BhdHRlcm4sICAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisgICAgeyAiS01QX0FCT1JUX0RFTEFZIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Fib3J0X2RlbGF5LCAgICAgICAgX19rbXBfc3RnX3ByaW50X2Fib3J0X2RlbGF5LCAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9DUFVJTkZPX0ZJTEUiLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9jcHVpbmZvX2ZpbGUsICAgICAgIF9fa21wX3N0Z19wcmludF9jcHVpbmZvX2ZpbGUsICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRk9SQ0VfUkVEVUNUSU9OIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9yY2VfcmVkdWN0aW9uLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9yY2VfcmVkdWN0aW9uLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIiwgICAgICAgX19rbXBfc3RnX3BhcnNlX2ZvcmNlX3JlZHVjdGlvbiwgICAgX19rbXBfc3RnX3ByaW50X2ZvcmNlX3JlZHVjdGlvbiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TVE9SQUdFX01BUCIsICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zdG9yYWdlX21hcCwgICAgICAgIF9fa21wX3N0Z19wcmludF9zdG9yYWdlX21hcCwgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQUxMX1RIUkVBRFBSSVZBVEUiLCAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWxsX3RocmVhZHByaXZhdGUsICBfX2ttcF9zdGdfcHJpbnRfYWxsX3RocmVhZHByaXZhdGUsICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUkVJR05fVEhSRUFEU19USFJFQURQUklWQVRFIiwgX19rbXBfc3RnX3BhcnNlX2ZvcmVpZ25fdGhyZWFkc190aHJlYWRwcml2YXRlLCBfX2ttcF9zdGdfcHJpbnRfZm9yZWlnbl90aHJlYWRzX3RocmVhZHByaXZhdGUsICAgICBOVUxMLCAwLCAwIH0sCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgeyAiS01QX0FGRklOSVRZIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2FmZmluaXR5LCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2FmZmluaXR5LCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorIyBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICB7ICJHT01QX0NQVV9BRkZJTklUWSIsICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZ29tcF9jcHVfYWZmaW5pdHksICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmIC8qIEtNUF9HT01QX0NPTVBBVCAqLworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgIHsgIk9NUF9QUk9DX0JJTkQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9wcm9jX2JpbmQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9wcm9jX2JpbmQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJPTVBfUExBQ0VTIiwgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcGxhY2VzLCAgICAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcGxhY2VzLCAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVsc2UKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAvKiBubyBwcmludCAqLyAgICAgICAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICB7ICJLTVBfVE9QT0xPR1lfTUVUSE9EIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfdG9wb2xvZ3lfbWV0aG9kLCAgICBfX2ttcF9zdGdfcHJpbnRfdG9wb2xvZ3lfbWV0aG9kLCAgICBOVUxMLCAwLCAwIH0sCisKKyNlbHNlCisKKyAgICAvLworICAgIC8vIEtNUF9BRkZJTklUWSBpcyBub3Qgc3VwcG9ydGVkIG9uIE9TIFgqLCBub3IgaXMgT01QX1BMQUNFUy4KKyAgICAvLyBPTVBfUFJPQ19CSU5EIGFuZCBwcm9jLWJpbmQtdmFyIGFyZSBzdXBwb3J0ZWQsIGhvd2V2ZXIuCisgICAgLy8KKyMgaWYgT01QXzQwX0VOQUJMRUQKKyAgICB7ICJPTVBfUFJPQ19CSU5EIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfcHJvY19iaW5kLCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfcHJvY19iaW5kLCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisjIGVuZGlmCisKKyNlbmRpZiAvLyBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisKKyAgICB7ICJLTVBfSU5JVF9BVF9GT1JLIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaW5pdF9hdF9mb3JrLCAgICAgICBfX2ttcF9zdGdfcHJpbnRfaW5pdF9hdF9mb3JrLCAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX1NDSEVEVUxFIiwgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX3NjaGVkdWxlLCAgICAgICAgICAgX19rbXBfc3RnX3ByaW50X3NjaGVkdWxlLCAgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9TQ0hFRFVMRSIsICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfc2NoZWR1bGUsICAgICAgIF9fa21wX3N0Z19wcmludF9vbXBfc2NoZWR1bGUsICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfQVRPTUlDX01PREUiLCAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYXRvbWljX21vZGUsICAgICAgICBfX2ttcF9zdGdfcHJpbnRfYXRvbWljX21vZGUsICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0NPTlNJU1RFTkNZX0NIRUNLIiwgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2NvbnNpc3RlbmN5X2NoZWNrLCAgX19rbXBfc3RnX3ByaW50X2NvbnNpc3RlbmN5X2NoZWNrLCAgTlVMTCwgMCwgMCB9LAorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIHsgIktNUF9JVFRfUFJFUEFSRV9ERUxBWSIsICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pdHRfcHJlcGFyZV9kZWxheSwgIF9fa21wX3N0Z19wcmludF9pdHRfcHJlcGFyZV9kZWxheSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZICovCisgICAgeyAiS01QX01BTExPQ19QT09MX0lOQ1IiLCAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX21hbGxvY19wb29sX2luY3IsICAgX19rbXBfc3RnX3ByaW50X21hbGxvY19wb29sX2luY3IsICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9JTklUX1dBSVQiLCAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9pbml0X3dhaXQsICAgICAgICAgIF9fa21wX3N0Z19wcmludF9pbml0X3dhaXQsICAgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfTkVYVF9XQUlUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbmV4dF93YWl0LCAgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbmV4dF93YWl0LCAgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0dUSURfTU9ERSIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2d0aWRfbW9kZSwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2d0aWRfbW9kZSwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9EWU5BTUlDIiwgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfZHluYW1pYywgICAgICAgIF9fa21wX3N0Z19wcmludF9vbXBfZHluYW1pYywgICAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfRFlOQU1JQ19NT0RFIiwgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfa21wX2R5bmFtaWNfbW9kZSwgICBfX2ttcF9zdGdfcHJpbnRfa21wX2R5bmFtaWNfbW9kZSwgICBOVUxMLCAwLCAwIH0sCisKKyNpZmRlZiBVU0VfTE9BRF9CQUxBTkNFCisgICAgeyAiS01QX0xPQURfQkFMQU5DRV9JTlRFUlZBTCIsICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xkX2JhbGFuY2VfaW50ZXJ2YWwsX19rbXBfc3RnX3ByaW50X2xkX2JhbGFuY2VfaW50ZXJ2YWwsTlVMTCwgMCwgMCB9LAorI2VuZGlmCisKKyAgICB7ICJLTVBfTlVNX0xPQ0tTX0lOX0JMT0NLIiwgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfbG9ja19ibG9jaywgICAgICAgICBfX2ttcF9zdGdfcHJpbnRfbG9ja19ibG9jaywgICAgICAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0xPQ0tfS0lORCIsICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2xvY2tfa2luZCwgICAgICAgICAgX19rbXBfc3RnX3ByaW50X2xvY2tfa2luZCwgICAgICAgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIktNUF9TUElOX0JBQ0tPRkZfUEFSQU1TIiwgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9zcGluX2JhY2tvZmZfcGFyYW1zLCBfX2ttcF9zdGdfcHJpbnRfc3Bpbl9iYWNrb2ZmX3BhcmFtcywgTlVMTCwgMCwgMCB9LAorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfQURBUFRJVkVfTE9DS19QUk9QUyIsICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfYWRhcHRpdmVfbG9ja19wcm9wcyxfX2ttcF9zdGdfcHJpbnRfYWRhcHRpdmVfbG9ja19wcm9wcywgIE5VTEwsIDAsIDAgfSwKKyNpZiBLTVBfREVCVUdfQURBUFRJVkVfTE9DS1MKKyAgICB7ICJLTVBfU1BFQ1VMQVRJVkVfU1RBVFNGSUxFIiwgICAgICAgICBfX2ttcF9zdGdfcGFyc2Vfc3BlY3VsYXRpdmVfc3RhdHNmaWxlLF9fa21wX3N0Z19wcmludF9zcGVjdWxhdGl2ZV9zdGF0c2ZpbGUsICBOVUxMLCAwLCAwIH0sCisjZW5kaWYKKyNlbmRpZiAvLyBLTVBfVVNFX0FEQVBUSVZFX0xPQ0tTCisgICAgeyAiS01QX1BMQUNFX1RIUkVBRFMiLCAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2h3X3N1YnNldCwgICAgICBfX2ttcF9zdGdfcHJpbnRfaHdfc3Vic2V0LCAgICAgIE5VTEwsIDAsIDAgfSwKKyAgICB7ICJLTVBfSFdfU1VCU0VUIiwgICAgICAgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfaHdfc3Vic2V0LCAgICAgIF9fa21wX3N0Z19wcmludF9od19zdWJzZXQsICAgICAgTlVMTCwgMCwgMCB9LAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB7ICJLTVBfRk9SS0pPSU5fRlJBTUVTIiwgICAgICAgICAgICAgICBfX2ttcF9zdGdfcGFyc2VfZm9ya2pvaW5fZnJhbWVzLCAgICBfX2ttcF9zdGdfcHJpbnRfZm9ya2pvaW5fZnJhbWVzLCAgICBOVUxMLCAwLCAwIH0sCisgICAgeyAiS01QX0ZPUktKT0lOX0ZSQU1FU19NT0RFIiwgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX2Zvcmtqb2luX2ZyYW1lc19tb2RlLF9fa21wX3N0Z19wcmludF9mb3Jram9pbl9mcmFtZXNfbW9kZSwgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgeyAiT01QX0RJU1BMQVlfRU5WIiwgICAgICAgICAgICAgICAgICAgX19rbXBfc3RnX3BhcnNlX29tcF9kaXNwbGF5X2VudiwgICAgX19rbXBfc3RnX3ByaW50X29tcF9kaXNwbGF5X2VudiwgICAgTlVMTCwgMCwgMCB9LAorICAgIHsgIk9NUF9DQU5DRUxMQVRJT04iLCAgICAgICAgICAgICAgICAgIF9fa21wX3N0Z19wYXJzZV9vbXBfY2FuY2VsbGF0aW9uLCAgIF9fa21wX3N0Z19wcmludF9vbXBfY2FuY2VsbGF0aW9uLCAgIE5VTEwsIDAsIDAgfSwKKyNlbmRpZgorICAgIHsgIiIsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIE5VTEwsIDAsIDAgfQorfTsgLy8gc2V0dGluZ3MKKworc3RhdGljIGludCBjb25zdCBfX2ttcF9zdGdfY291bnQgPSBzaXplb2YoIF9fa21wX3N0Z190YWJsZSApIC8gc2l6ZW9mKCBrbXBfc2V0dGluZ190ICk7CisKK3N0YXRpYyBpbmxpbmUKK2ttcF9zZXR0aW5nX3QgKgorX19rbXBfc3RnX2ZpbmQoIGNoYXIgY29uc3QgKiBuYW1lICkgeworCisgICAgaW50IGk7CisgICAgaWYgKCBuYW1lICE9IE5VTEwgKSB7CisgICAgICAgIGZvciAoIGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICAgICAgaWYgKCBzdHJjbXAoIF9fa21wX3N0Z190YWJsZVsgaSBdLm5hbWUsIG5hbWUgKSA9PSAwICkgeworICAgICAgICAgICAgICAgIHJldHVybiAmIF9fa21wX3N0Z190YWJsZVsgaSBdOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gZm9yCisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gTlVMTDsKKworfSAvLyBfX2ttcF9zdGdfZmluZAorCisKK3N0YXRpYyBpbnQKK19fa21wX3N0Z19jbXAoIHZvaWQgY29uc3QgKiBfYSwgdm9pZCBjb25zdCAqIF9iICkgeworICAgIGttcF9zZXR0aW5nX3QgKiBhID0gKGttcF9zZXR0aW5nX3QgKikgX2E7CisgICAga21wX3NldHRpbmdfdCAqIGIgPSAoa21wX3NldHRpbmdfdCAqKSBfYjsKKworICAgIC8vCisgICAgLy8gUHJvY2VzcyBLTVBfQUZGSU5JVFkgbGFzdC4KKyAgICAvLyBJdCBuZWVkcyB0byBjb21lIGFmdGVyIE9NUF9QTEFDRVMgYW5kIEdPTVBfQ1BVX0FGRklOSVRZLgorICAgIC8vCisgICAgaWYgKCBzdHJjbXAoIGEtPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgaWYgKCBzdHJjbXAoIGItPm5hbWUsICJLTVBfQUZGSU5JVFkiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHJldHVybiAwOworICAgICAgICB9CisgICAgICAgIHJldHVybiAxOworICAgIH0KKyAgICBlbHNlIGlmICggc3RyY21wKCBiLT5uYW1lLCAiS01QX0FGRklOSVRZIiApID09IDAgKSB7CisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisgICAgcmV0dXJuIHN0cmNtcCggYS0+bmFtZSwgYi0+bmFtZSApOworfSAvLyBfX2ttcF9zdGdfY21wCisKKworc3RhdGljIHZvaWQKK19fa21wX3N0Z19pbml0KCB2b2lkCispIHsKKworICAgIHN0YXRpYyBpbnQgaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKCAhIGluaXRpYWxpemVkICkgeworCisgICAgICAgIC8vIFNvcnQgdGFibGUuCisgICAgICAgIHFzb3J0KCBfX2ttcF9zdGdfdGFibGUsIF9fa21wX3N0Z19jb3VudCAtIDEsIHNpemVvZigga21wX3NldHRpbmdfdCApLCBfX2ttcF9zdGdfY21wICk7CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplICpfU1RBQ0tTSVpFIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiS01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gMXN0IHByaW9yaXR5LgorI2lmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGdvbXBfc3RhY2tzaXplID0gX19rbXBfc3RnX2ZpbmQoICJHT01QX1NUQUNLU0laRSIgKTsgICAgICAvLyAybmQgcHJpb3JpdHkuCisjZW5kaWYKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBvbXBfc3RhY2tzaXplICA9IF9fa21wX3N0Z19maW5kKCAiT01QX1NUQUNLU0laRSIgICk7ICAgICAgLy8gM3JkIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgLy8gISEhIENvbXBpbGVyIGRvZXMgbm90IHVuZGVyc3RhbmQgcml2YWxzIGlzIHVzZWQgYW5kIG9wdGltaXplcyBvdXQgYXNzaWdubWVudHMKKyAgICAgICAgICAgIC8vICEhISAgICAgcml2YWxzWyBpICsrIF0gPSAuLi47CisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IGttcF9kYXRhICA9IHsgICAgMSwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z19zc19kYXRhX3QgZ29tcF9kYXRhID0geyAxMDI0LCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyNlbmRpZgorICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfc3NfZGF0YV90IG9tcF9kYXRhICA9IHsgMTAyNCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX3N0YWNrc2l6ZTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGdvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfc3RhY2tzaXplOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfc3RhY2tzaXplLT5kYXRhID0gJiBrbXBfZGF0YTsKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIGlmICggZ29tcF9zdGFja3NpemUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBnb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgZ29tcF9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyNlbmRpZgorICAgICAgICAgICAgb21wX3N0YWNrc2l6ZS0+ZGF0YSA9ICYgb21wX2RhdGE7CisKKyAgICAgICAgfQorCisgICAgICAgIHsgLy8gSW5pdGlhbGl6ZSBLTVBfTElCUkFSWSBhbmQgT01QX1dBSVRfUE9MSUNZIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbGlicmFyeSAgICAgPSBfX2ttcF9zdGdfZmluZCggIktNUF9MSUJSQVJZIiApOyAgICAgICAgLy8gMXN0IHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF93YWl0X3BvbGljeSA9IF9fa21wX3N0Z19maW5kKCAiT01QX1dBSVRfUE9MSUNZIiApOyAgICAvLyAybmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgMyBdOworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfd3BfZGF0YV90IGttcF9kYXRhICA9IHsgMCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBzdGF0aWMga21wX3N0Z193cF9kYXRhX3Qgb21wX2RhdGEgID0geyAxLCAoa21wX3NldHRpbmdfdCAqKilyaXZhbHMgfTsKKyAgICAgICAgICAgIGludCBpID0gMDsKKworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBrbXBfbGlicmFyeTsKKyAgICAgICAgICAgIGlmICggb21wX3dhaXRfcG9saWN5ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfd2FpdF9wb2xpY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisgICAgICAgICAgICBrbXBfbGlicmFyeS0+ZGF0YSAgPSAmIGttcF9kYXRhOworICAgICAgICAgICAgaWYgKCBvbXBfd2FpdF9wb2xpY3kgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBvbXBfd2FpdF9wb2xpY3ktPmRhdGEgPSAmIG9tcF9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKworICAgICAgICB9CisKKyAgICAgICAgeyAvLyBJbml0aWFsaXplIEtNUF9BTExfVEhSRUFEUywgS01QX01BWF9USFJFQURTLCBhbmQgT01QX1RIUkVBRF9MSU1JVCBkYXRhLgorCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2FsbF90aHJlYWRzICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FMTF9USFJFQURTIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfbWF4X3RocmVhZHMgID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfTUFYX1RIUkVBRFMiICApOyAgLy8gMm5kIHByaW9yaXR5LgorICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF90aHJlYWRfbGltaXQgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9USFJFQURfTElNSVQiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisKKyAgICAgICAgICAgIC8vICEhISB2b2xhdGlsZSBrZXl3b3JkIGlzIEludGVsIChSKSBDIENvbXBpbGVyIGJ1ZyBDUTQ5OTA4IHdvcmthcm91bmQuCisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHJpdmFsc1sgNCBdOworICAgICAgICAgICAgaW50IGkgPSAwOworCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9hbGxfdGhyZWFkczsKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX21heF90aHJlYWRzOworICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBvbXBfdGhyZWFkX2xpbWl0OworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2FsbF90aHJlYWRzLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAga21wX21heF90aHJlYWRzLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgaWYgKCBvbXBfdGhyZWFkX2xpbWl0ICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgb21wX3RocmVhZF9saW1pdC0+ZGF0YSA9ICh2b2lkKikmIHJpdmFsczsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfQorCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0FGRklOSVRZLCBHT01QX0NQVV9BRkZJTklUWSwgYW5kIE9NUF9QUk9DX0JJTkQgZGF0YS4KKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIGttcF9hZmZpbml0eSA9IF9fa21wX3N0Z19maW5kKCAiS01QX0FGRklOSVRZIiAgKTsgIC8vIDFzdCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGttcF9hZmZpbml0eSAhPSBOVUxMICk7CisKKyMgaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogZ29tcF9jcHVfYWZmaW5pdHkgPSBfX2ttcF9zdGdfZmluZCggIkdPTVBfQ1BVX0FGRklOSVRZIiAgKTsgIC8vIDJuZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGdvbXBfY3B1X2FmZmluaXR5ICE9IE5VTEwgKTsKKyMgZW5kaWYKKworICAgICAgICAgICAga21wX3NldHRpbmdfdCAqIG9tcF9wcm9jX2JpbmQgPSBfX2ttcF9zdGdfZmluZCggIk9NUF9QUk9DX0JJTkQiICk7ICAvLyAzcmQgcHJpb3JpdHkuCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBvbXBfcHJvY19iaW5kICE9IE5VTEwgKTsKKworICAgICAgICAgICAgLy8gISEhIHZvbGF0aWxlIGtleXdvcmQgaXMgSW50ZWwgKFIpIEMgQ29tcGlsZXIgYnVnIENRNDk5MDggd29ya2Fyb3VuZC4KKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc2V0dGluZ190ICogdm9sYXRpbGUgcml2YWxzWyA0IF07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2FmZmluaXR5OworCisjIGlmZGVmIEtNUF9HT01QX0NPTVBBVAorICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBnb21wX2NwdV9hZmZpbml0eTsKKyAgICAgICAgICAgIGdvbXBfY3B1X2FmZmluaXR5LT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworIyBlbmRpZgorCisgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IG9tcF9wcm9jX2JpbmQ7CisgICAgICAgICAgICBvbXBfcHJvY19iaW5kLT5kYXRhID0gKHZvaWQqKSYgcml2YWxzOworICAgICAgICAgICAgcml2YWxzWyBpICsrIF0gPSBOVUxMOworCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgICAgICBzdGF0aWMga21wX3NldHRpbmdfdCAqIHZvbGF0aWxlIHBsYWNlc19yaXZhbHNbIDQgXTsKKyAgICAgICAgICAgIGkgPSAwOworCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICogb21wX3BsYWNlcyA9IF9fa21wX3N0Z19maW5kKCAiT01QX1BMQUNFUyIgKTsgIC8vIDNyZCBwcmlvcml0eS4KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9tcF9wbGFjZXMgIT0gTlVMTCApOworCisgICAgICAgICAgICBwbGFjZXNfcml2YWxzWyBpICsrIF0gPSBrbXBfYWZmaW5pdHk7CisjICBpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IGdvbXBfY3B1X2FmZmluaXR5OworIyAgZW5kaWYKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IG9tcF9wbGFjZXM7CisgICAgICAgICAgICBvbXBfcGxhY2VzLT5kYXRhID0gKHZvaWQqKSYgcGxhY2VzX3JpdmFsczsKKyAgICAgICAgICAgIHBsYWNlc19yaXZhbHNbIGkgKysgXSA9IE5VTEw7CisjIGVuZGlmCisgICAgICAgIH0KKyNlbHNlCisgICAgLy8gS01QX0FGRklOSVRZIG5vdCBzdXBwb3J0ZWQsIHNvIE9NUF9QUk9DX0JJTkQgaGFzIG5vIHJpdmFscy4KKyAgICAvLyBPTVBfUExBQ0VTIG5vdCBzdXBwb3J0ZWQgeWV0LgorI2VuZGlmIC8vIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgICAgICB7IC8vIEluaXRpYWxpemUgS01QX0RFVEVSTUlOSVNUSUNfUkVEVUNUSU9OIGFuZCBLTVBfRk9SQ0VfUkVEVUNUSU9OIGRhdGEuCisKKyAgICAgICAgICAgIGttcF9zZXR0aW5nX3QgKiBrbXBfZm9yY2VfcmVkICA9IF9fa21wX3N0Z19maW5kKCAiS01QX0ZPUkNFX1JFRFVDVElPTiIgKTsgICAgICAgICAvLyAxc3QgcHJpb3JpdHkuCisgICAgICAgICAgICBrbXBfc2V0dGluZ190ICoga21wX2RldGVybV9yZWQgPSBfX2ttcF9zdGdfZmluZCggIktNUF9ERVRFUk1JTklTVElDX1JFRFVDVElPTiIgKTsgLy8gMm5kIHByaW9yaXR5LgorCisgICAgICAgICAgICAvLyAhISEgdm9sYXRpbGUga2V5d29yZCBpcyBJbnRlbCAoUikgQyBDb21waWxlciBidWcgQ1E0OTkwOCB3b3JrYXJvdW5kLgorICAgICAgICAgICAgc3RhdGljIGttcF9zZXR0aW5nX3QgKiB2b2xhdGlsZSByaXZhbHNbIDMgXTsKKyAgICAgICAgICAgIHN0YXRpYyBrbXBfc3RnX2ZyX2RhdGFfdCBmb3JjZV9kYXRhICAgPSB7IDEsIChrbXBfc2V0dGluZ190ICoqKXJpdmFscyB9OworICAgICAgICAgICAgc3RhdGljIGttcF9zdGdfZnJfZGF0YV90IGRldGVybV9kYXRhICA9IHsgMCwgKGttcF9zZXR0aW5nX3QgKiopcml2YWxzIH07CisgICAgICAgICAgICBpbnQgaSA9IDA7CisKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0ga21wX2ZvcmNlX3JlZDsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICByaXZhbHNbIGkgKysgXSA9IGttcF9kZXRlcm1fcmVkOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgIHJpdmFsc1sgaSArKyBdID0gTlVMTDsKKworICAgICAgICAgICAga21wX2ZvcmNlX3JlZC0+ZGF0YSA9ICYgZm9yY2VfZGF0YTsKKyAgICAgICAgICAgIGlmICgga21wX2RldGVybV9yZWQgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGV0ZXJtX3JlZC0+ZGF0YSAgPSAmIGRldGVybV9kYXRhOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfQorCisgICAgICAgIGluaXRpYWxpemVkID0gMTsKKworICAgIH07IC8vIGlmCisKKyAgICAvLyBSZXNldCBmbGFncy4KKyAgICBpbnQgaTsKKyAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0uc2V0ID0gMDsKKyAgICB9OyAvLyBmb3IKKworfSAvLyBfX2ttcF9zdGdfaW5pdAorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdGdfcGFyc2UoCisgICAgY2hhciBjb25zdCAqIG5hbWUsCisgICAgY2hhciBjb25zdCAqIHZhbHVlCispIHsKKworICAgIC8vIE9uIFdpbmRvd3MqIE9TIHRoZXJlIGFyZSBzb21lIG5hbWVsZXNzIHZhcmlhYmxlcyBsaWtlICJDOj1DOlwiICh5ZWFoLCByZWFsbHkgbmFtZWxlc3MsIHRoZXkgYXJlCisgICAgLy8gcHJlc2VudGVkIGluIGVudmlyb25tZW50IGJsb2NrIGFzICI9Qzo9Q1xcXHgwMD1EOj1EOlxcXHgwMC4uLiIsIHNvIGxldCB1cyBza2lwIHRoZW0uCisgICAgaWYgKCBuYW1lWyAwIF0gPT0gMCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBpZiAoIHZhbHVlICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICAgICAgaWYgKCBzZXR0aW5nICE9IE5VTEwgKSB7CisgICAgICAgICAgICBzZXR0aW5nLT5wYXJzZSggbmFtZSwgdmFsdWUsIHNldHRpbmctPmRhdGEgKTsKKyAgICAgICAgICAgIHNldHRpbmctPmRlZmluZWQgPSAxOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisKK30gLy8gX19rbXBfc3RnX3BhcnNlCisKKworc3RhdGljIGludAorX19rbXBfc3RnX2NoZWNrX3JpdmFscyggICAgICAgICAgLy8gMCAtLSBPaywgMSAtLSBlcnJvcnMgZm91bmQuCisgICAgY2hhciBjb25zdCAqICAgICAgIG5hbWUsICAgICAvLyBOYW1lIG9mIHZhcmlhYmxlLgorICAgIGNoYXIgY29uc3QgKiAgICAgICB2YWx1ZSwgICAgLy8gVmFsdWUgb2YgdGhlIHZhcmlhYmxlLgorICAgIGttcF9zZXR0aW5nX3QgKiAqICByaXZhbHMgICAgLy8gTGlzdCBvZiByaXZhbCBzZXR0aW5ncyAodGhlIGxpc3QgbXVzdCBpbmNsdWRlIGN1cnJlbnQgb25lKS4KKykgeworCisgICAgaWYgKCByaXZhbHMgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorCisgICAgLy8gTG9vcCB0aHJ1IGhpZ2hlciBwcmlvcml0eSBzZXR0aW5ncyAobGlzdGVkIGJlZm9yZSBjdXJyZW50KS4KKyAgICBpbnQgaSA9IDA7CisgICAgZm9yICggOyBzdHJjbXAoIHJpdmFsc1sgaSBdLT5uYW1lLCBuYW1lICkgIT0gMDsgaSsrICkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCByaXZhbHNbIGkgXSAhPSBOVUxMICk7CisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIGlmICggcml2YWxzWyBpIF0gPT0gX19rbXBfYWZmaW5pdHlfbm90eXBlICkgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIElmIEtNUF9BRkZJTklUWSBpcyBzcGVjaWZpZWQgd2l0aG91dCBhIHR5cGUgbmFtZSwKKyAgICAgICAgICAgIC8vIGl0IGRvZXMgbm90IHJpdmFsIE9NUF9QUk9DX0JJTkQgb3IgR09NUF9DUFVfQUZGSU5JVFkuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgIGlmICggcml2YWxzWyBpIF0tPnNldCApIHsKKyAgICAgICAgICAgIEtNUF9XQVJOSU5HKCBTdGdJZ25vcmVkLCBuYW1lLCByaXZhbHNbIGkgXS0+bmFtZSApOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gd2hpbGUKKworICAgICsrIGk7IC8vIFNraXAgY3VycmVudCBzZXR0aW5nLgorICAgIHJldHVybiAwOworCit9OyAvLyBfX2ttcF9zdGdfY2hlY2tfcml2YWxzCisKKworc3RhdGljIGludAorX19rbXBfZW52X3RvUHJpbnQoIGNoYXIgY29uc3QgKiBuYW1lLCBpbnQgZmxhZyApIHsKKyAgICBpbnQgcmMgPSAwOworICAgIGttcF9zZXR0aW5nX3QgKiBzZXR0aW5nID0gX19rbXBfc3RnX2ZpbmQoIG5hbWUgKTsKKyAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgcmMgPSBzZXR0aW5nLT5kZWZpbmVkOworICAgICAgICBpZiAoIGZsYWcgPj0gMCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPmRlZmluZWQgPSBmbGFnOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHJjOworfQorCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdXhfZW52X2luaXRpYWxpemUoIGttcF9lbnZfYmxrX3QqIGJsb2NrICkgeworCisgICAgY2hhciBjb25zdCAqIHZhbHVlOworCisgICAgLyogT01QX05VTV9USFJFQURTICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfTlVNX1RIUkVBRFMiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfbnVtX3RocmVhZHMoIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKyAgICB9CisKKyAgICAvKiBLTVBfQkxPQ0tUSU1FICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJLTVBfQkxPQ0tUSU1FIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZSggX19rbXBfZGZsdF9ibG9ja3RpbWUgKTsKKyAgICB9CisKKyAgICAvKiBPTVBfTkVTVEVEICovCisgICAgdmFsdWUgPSBfX2ttcF9lbnZfYmxrX3ZhciggYmxvY2ssICJPTVBfTkVTVEVEIiApOworICAgIGlmICggdmFsdWUgKSB7CisgICAgICAgIG9tcGNfc2V0X25lc3RlZCggX19rbXBfZGZsdF9uZXN0ZWQgKTsKKyAgICB9CisKKyAgICAvKiBPTVBfRFlOQU1JQyAqLworICAgIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoIGJsb2NrLCAiT01QX0RZTkFNSUMiICk7CisgICAgaWYgKCB2YWx1ZSApIHsKKyAgICAgICAgb21wY19zZXRfZHluYW1pYyggX19rbXBfZ2xvYmFsLmcuZ19keW5hbWljICk7CisgICAgfQorCit9CisKK3ZvaWQKK19fa21wX2Vudl9pbml0aWFsaXplKCBjaGFyIGNvbnN0ICogc3RyaW5nICkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBpbnQgICAgICAgICAgIGk7CisKKyAgICBfX2ttcF9zdGdfaW5pdCgpOworCisgICAgLy8gSGFjayEhIQorICAgIGlmICggc3RyaW5nID09IE5VTEwgKSB7CisgICAgICAgIC8vIF9fa21wX21heF9udGggPSBfX2ttcF9zeXNfbWF4X250aDsKKyAgICAgICAgX19rbXBfdGhyZWFkc19jYXBhY2l0eSA9IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggX19rbXBfZGZsdF90ZWFtX250aF91YiApOworICAgIH07IC8vIGlmCisgICAgX19rbXBfZW52X2Jsa19pbml0KCAmIGJsb2NrLCBzdHJpbmcgKTsKKworICAgIC8vCisgICAgLy8gdXBkYXRlIHRoZSBzZXQgZmxhZyBvbiBhbGwgZW50cmllcyB0aGF0IGhhdmUgYW4gZW52IHZhcgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCggYmxvY2sudmFyc1sgaSBdLm5hbWUgPT0gTlVMTCApCisgICAgICAgICAgfHwgKCAqYmxvY2sudmFyc1sgaSBdLm5hbWUgPT0gJ1wwJykpIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisgICAgICAgIGlmICggYmxvY2sudmFyc1sgaSBdLnZhbHVlID09IE5VTEwgKSB7CisgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgfQorICAgICAgICBrbXBfc2V0dGluZ190ICogc2V0dGluZyA9IF9fa21wX3N0Z19maW5kKCBibG9jay52YXJzWyBpIF0ubmFtZSApOworICAgICAgICBpZiAoIHNldHRpbmcgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIHNldHRpbmctPnNldCA9IDE7CisgICAgICAgIH0KKyAgICB9OyAvLyBmb3IgaQorCisgICAgLy8gV2UgbmVlZCB0byBrbm93IGlmIGJsb2NrdGltZSB3YXMgc2V0IHdoZW4gcHJvY2Vzc2luZyBPTVBfV0FJVF9QT0xJQ1kKKyAgICBibG9ja3RpbWVfc3RyID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssICJLTVBfQkxPQ0tUSU1FIiApOworCisgICAgLy8gU3BlY2lhbCBjYXNlLiBJZiB3ZSBwYXJzZSBlbnZpcm9ubWVudCwgbm90IGEgc3RyaW5nLCBwcm9jZXNzIEtNUF9XQVJOSU5HUyBmaXJzdC4KKyAgICBpZiAoIHN0cmluZyA9PSBOVUxMICkgeworICAgICAgICBjaGFyIGNvbnN0ICogbmFtZSAgPSAiS01QX1dBUk5JTkdTIjsKKyAgICAgICAgY2hhciBjb25zdCAqIHZhbHVlID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssIG5hbWUgKTsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBuYW1lLCB2YWx1ZSApOworICAgIH07IC8vIGlmCisKKyNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgLy8KKyAgICAvLyBTcGVjaWFsIGNhc2UuIEtNUF9BRkZJTklUWSBpcyBub3QgYSByaXZhbCB0byBvdGhlciBhZmZpbml0eSBlbnYgdmFycworICAgIC8vIGlmIG5vIGFmZmluaXR5IHR5cGUgaXMgc3BlY2lmaWVkLiAgV2Ugd2FudCB0byBhbGxvdworICAgIC8vIEtNUF9BRkZJTklUWT1bbm9dLHZlcmJvc2UvW25vXXdhcm5pbmdzL2V0Yy4gIHRvIGJlIGVuYWJsZWQgd2hlbgorICAgIC8vIHNwZWNpZnlpbmcgdGhlIGFmZmluaXR5IHR5cGUgdmlhIEdPTVBfQ1BVX0FGRklOSVRZIG9yIHRoZSBPTVAgNC4wCisgICAgLy8gYWZmaW5pdHkgbWVjaGFuaXNtLgorICAgIC8vCisgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gTlVMTDsKKyAgICBjaGFyIGNvbnN0ICphZmZfc3RyID0gX19rbXBfZW52X2Jsa192YXIoICYgYmxvY2ssICJLTVBfQUZGSU5JVFkiICk7CisgICAgaWYgKCBhZmZfc3RyICE9IE5VTEwgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIENoZWNrIGlmIHRoZSBLTVBfQUZGSU5JVFkgdHlwZSBpcyBzcGVjaWZpZWQgaW4gdGhlIHN0cmluZy4KKyAgICAgICAgLy8gV2UganVzdCBzZWFyY2ggdGhlIHN0cmluZyBmb3IgImNvbXBhY3QiLCAic2NhdHRlciIsIGV0Yy4KKyAgICAgICAgLy8gd2l0aG91dCByZWFsbHkgcGFyc2luZyB0aGUgc3RyaW5nLiAgVGhlIHN5bnRheCBvZiB0aGUKKyAgICAgICAgLy8gS01QX0FGRklOSVRZIGVudiB2YXIgaXMgc3VjaCB0aGF0IG5vbmUgb2YgdGhlIGFmZmluaXR5CisgICAgICAgIC8vIHR5cGUgbmFtZXMgY2FuIGFwcGVhciBhbnl3aGVyZSBvdGhlciB0aGF0IHRoZSB0eXBlCisgICAgICAgIC8vIHNwZWNpZmllciwgZXZlbiBhcyBzdWJzdHJpbmdzLgorICAgICAgICAvLworICAgICAgICAvLyBJIGNhbid0IGZpbmQgYSBjYXNlLWluc2Vuc2l0aXZlIHZlcnNpb24gb2Ygc3Ryc3RyIG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAvLyBVc2UgdGhlIGNhc2Utc2Vuc2l0aXZlIHZlcnNpb24gZm9yIG5vdy4KKyAgICAgICAgLy8KKworIyBpZiBLTVBfT1NfV0lORE9XUworIyAgZGVmaW5lIEZJTkQgc3Ryc3RyCisjIGVsc2UKKyMgIGRlZmluZSBGSU5EIHN0cmNhc2VzdHIKKyMgZW5kaWYKKworICAgICAgICBpZiAoICggRklORCggYWZmX3N0ciwgIm5vbmUiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAicGh5c2ljYWwiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAibG9naWNhbCIgKSA9PSBOVUxMICkKKyAgICAgICAgICAmJiAoIEZJTkQoIGFmZl9zdHIsICJjb21wYWN0IiApID09IE5VTEwgKQorICAgICAgICAgICYmICggRklORCggYWZmX3N0ciwgInNjYXR0ZXIiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiZXhwbGljaXQiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiYmFsYW5jZWQiICkgPT0gTlVMTCApCisgICAgICAgICAgJiYgKCBGSU5EKCBhZmZfc3RyLCAiZGlzYWJsZWQiICkgPT0gTlVMTCApICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfbm90eXBlID0gX19rbXBfc3RnX2ZpbmQoICJLTVBfQUZGSU5JVFkiICApOworICAgICAgICB9CisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIEEgbmV3IGFmZmluaXR5IHR5cGUgaXMgc3BlY2lmaWVkLgorICAgICAgICAgICAgLy8gUmVzZXQgdGhlIGFmZmluaXR5IGZsYWdzIHRvIHRoZWlyIGRlZmF1bHQgdmFsdWVzLAorICAgICAgICAgICAgLy8gaW4gY2FzZSB0aGlzIGlzIGNhbGxlZCBmcm9tIGttcF9zZXRfZGVmYXVsdHMoKS4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQ7CisgICAgICAgIH0KKyMgdW5kZWYgRklORAorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQWxzbyByZXNldCB0aGUgYWZmaW5pdHkgZmxhZ3MgaWYgT01QX1BST0NfQklORCBpcyBzcGVjaWZpZWQuCisgICAgICAgIC8vCisgICAgICAgIGFmZl9zdHIgPSBfX2ttcF9lbnZfYmxrX3ZhciggJiBibG9jaywgIk9NUF9QUk9DX0JJTkQiICk7CisgICAgICAgIGlmICggYWZmX3N0ciAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2RlZmF1bHQ7CisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0OworICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZGVmYXVsdDsKKyAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IGFmZmluaXR5X3Jlc3BlY3RfbWFza19kZWZhdWx0OworICAgICAgICB9CisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgKi8KKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vCisgICAgLy8gU2V0IHVwIHRoZSBuZXN0ZWQgcHJvYyBiaW5kIHR5cGUgdmVjdG9yLgorICAgIC8vCisgICAgaWYgKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXMgPT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID0gKGttcF9wcm9jX2JpbmRfdCAqKQorICAgICAgICAgIEtNUF9JTlRFUk5BTF9NQUxMT0MoIHNpemVvZihrbXBfcHJvY19iaW5kX3QpICk7CisgICAgICAgIGlmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzID09IE5VTEwgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5zaXplID0gMTsKKyAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC51c2VkID0gMTsKKyMgaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZGVmYXVsdDsKKyMgZWxzZQorICAgICAgICAvLyBkZWZhdWx0IHByb2MgYmluZCBpcyBmYWxzZSBpZiBhZmZpbml0eSBub3Qgc3VwcG9ydGVkCisgICAgICAgIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9IHByb2NfYmluZF9mYWxzZTsKKyMgZW5kaWYKKworICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCisgICAgLy8KKyAgICAvLyBOb3cgcHJvY2VzcyBhbGwgb2YgdGhlIHNldHRpbmdzLgorICAgIC8vCisgICAgZm9yICggaSA9IDA7IGkgPCBibG9jay5jb3VudDsgKysgaSApIHsKKyAgICAgICAgX19rbXBfc3RnX3BhcnNlKCBibG9jay52YXJzWyBpIF0ubmFtZSwgYmxvY2sudmFyc1sgaSBdLnZhbHVlICk7CisgICAgfTsgLy8gZm9yIGkKKworICAgIC8vCisgICAgLy8gSWYgdXNlciBsb2NrcyBoYXZlIGJlZW4gYWxsb2NhdGVkIHlldCwgZG9uJ3QgcmVzZXQgdGhlIGxvY2sgdnB0ciB0YWJsZS4KKyAgICAvLworICAgIGlmICggISBfX2ttcF9pbml0X3VzZXJfbG9ja3MgKSB7CisgICAgICAgIGlmICggX19rbXBfdXNlcl9sb2NrX2tpbmQgPT0gbGtfZGVmYXVsdCApIHsKKyAgICAgICAgICAgIF9fa21wX3VzZXJfbG9ja19raW5kID0gbGtfcXVldWluZzsKKyAgICAgICAgfQorI2lmIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgICAgIF9fa21wX2luaXRfZHluYW1pY191c2VyX2xvY2tzKCk7CisjZWxzZQorICAgICAgICBfX2ttcF9zZXRfdXNlcl9sb2NrX3ZwdHJzKCBfX2ttcF91c2VyX2xvY2tfa2luZCApOworI2VuZGlmCisgICAgfQorICAgIGVsc2UgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHJpbmcgIT0gTlVMTCk7IC8vIGttcF9zZXRfZGVmYXVsdHMoKSB3YXMgY2FsbGVkCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3VzZXJfbG9ja19raW5kICE9IGxrX2RlZmF1bHQgKTsKKyAgICAgICAgLy8gQmluZHMgbG9jayBmdW5jdGlvbnMgYWdhaW4gdG8gZm9sbG93IHRoZSB0cmFuc2l0aW9uIGJldHdlZW4gZGlmZmVyZW50CisgICAgICAgIC8vIEtNUF9DT05TSVNURU5DWV9DSEVDSyB2YWx1ZXMuIENhbGxpbmcgdGhpcyBhZ2FpbiBpcyBoYXJtbGVzcyBhcyBsb25nCisgICAgICAgIC8vIGFzIHdlIGRvIG5vdCBhbGxvdyBsb2NrIGtpbmQgY2hhbmdlcyBhZnRlciBtYWtpbmcgYSBjYWxsIHRvIGFueQorICAgICAgICAvLyB1c2VyIGxvY2sgZnVuY3Rpb25zICh0cnVlKS4KKyNpZiBLTVBfVVNFX0RZTkFNSUNfTE9DSworICAgICAgICBfX2ttcF9pbml0X2R5bmFtaWNfdXNlcl9sb2NrcygpOworI2Vsc2UKKyAgICAgICAgX19rbXBfc2V0X3VzZXJfbG9ja192cHRycyggX19rbXBfdXNlcl9sb2NrX2tpbmQgKTsKKyNlbmRpZgorICAgIH0KKworI2lmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworICAgIGlmICggISBUQ1JfNChfX2ttcF9pbml0X21pZGRsZSkgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIERldGVybWluZSBpZiB0aGUgbWFjaGluZS9PUyBpcyBhY3R1YWxseSBjYXBhYmxlIG9mIHN1cHBvcnRpbmcKKyAgICAgICAgLy8gYWZmaW5pdHkuCisgICAgICAgIC8vCisgICAgICAgIGNvbnN0IGNoYXIgKnZhciA9ICJLTVBfQUZGSU5JVFkiOworIyBpZiBLTVBfVVNFX0hXTE9DCisgICAgICAgIGlmKF9fa21wX2h3bG9jX3RvcG9sb2d5ID09IE5VTEwpIHsKKyAgICAgICAgICAgIGlmKGh3bG9jX3RvcG9sb2d5X2luaXQoJl9fa21wX2h3bG9jX3RvcG9sb2d5KSA8IDApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9od2xvY19lcnJvciA9IFRSVUU7CisgICAgICAgICAgICAgICAgaWYoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSkKKyAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoQWZmSHdsb2NFcnJvck9jY3VycmVkLCB2YXIsICJod2xvY190b3BvbG9neV9pbml0KCkiKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmKGh3bG9jX3RvcG9sb2d5X2xvYWQoX19rbXBfaHdsb2NfdG9wb2xvZ3kpIDwgMCkgeworICAgICAgICAgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgICAgICAgICBpZihfX2ttcF9hZmZpbml0eV92ZXJib3NlKQorICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyhBZmZId2xvY0Vycm9yT2NjdXJyZWQsIHZhciwgImh3bG9jX3RvcG9sb2d5X2xvYWQoKSIpOworICAgICAgICAgICAgfQorICAgICAgICB9CisjIGVuZGlmCisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApIHsKKyAgICAgICAgICAgIEtNUF9BRkZJTklUWV9ESVNBQkxFKCk7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoICEgS01QX0FGRklOSVRZX0NBUEFCTEUoKSApIHsKKyMgaWYgS01QX1VTRV9IV0xPQworICAgICAgICAgICAgY29uc3QgaHdsb2NfdG9wb2xvZ3lfc3VwcG9ydCogdG9wb2xvZ3lfc3VwcG9ydCA9IGh3bG9jX3RvcG9sb2d5X2dldF9zdXBwb3J0KF9fa21wX2h3bG9jX3RvcG9sb2d5KTsKKyAgICAgICAgICAgIC8vIElzIHRoZSBzeXN0ZW0gY2FwYWJsZSBvZiBzZXR0aW5nL2dldHRpbmcgdGhpcyB0aHJlYWQncyBhZmZpbml0eT8KKyAgICAgICAgICAgIC8vIGFsc28sIGlzIHRvcG9sb2d5IGRpc2NvdmVyeSBwb3NzaWJsZT8gKHB1IGluZGljYXRlcyBhYmlsaXR5IHRvIGRpc2NvdmVyIHByb2Nlc3NpbmcgdW5pdHMpCisgICAgICAgICAgICAvLyBhbmQgZmluYWxseSwgd2VyZSB0aGVyZSBubyBlcnJvcnMgd2hlbiBjYWxsaW5nIGFueSBod2xvY18qIEFQSSBmdW5jdGlvbnM/CisgICAgICAgICAgICBpZih0b3BvbG9neV9zdXBwb3J0ICYmIHRvcG9sb2d5X3N1cHBvcnQtPmNwdWJpbmQtPnNldF90aGlzdGhyZWFkX2NwdWJpbmQgJiYKKyAgICAgICAgICAgICAgIHRvcG9sb2d5X3N1cHBvcnQtPmNwdWJpbmQtPmdldF90aGlzdGhyZWFkX2NwdWJpbmQgJiYKKyAgICAgICAgICAgICAgIHRvcG9sb2d5X3N1cHBvcnQtPmRpc2NvdmVyeS0+cHUgJiYKKyAgICAgICAgICAgICAgICFfX2ttcF9od2xvY19lcnJvcikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAvLyBlbmFibGVzIGFmZmluaXR5IGFjY29yZGluZyB0byBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpIG1hY3JvCisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0VOQUJMRShUUlVFKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgLy8gaW5kaWNhdGUgdGhhdCBod2xvYyBkaWRuJ3Qgd29yayBhbmQgZGlzYWJsZSBhZmZpbml0eQorICAgICAgICAgICAgICAgIF9fa21wX2h3bG9jX2Vycm9yID0gVFJVRTsKKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgfQorIyBlbHNlCisgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZSggdmFyICk7CisjIGVuZGlmIC8vIEtNUF9VU0VfSFdMT0MKKyAgICAgICAgICAgIGlmICggISBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSApCisgICAgICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQgKSApICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmTm90U3VwcG9ydGVkLCB2YXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2Rpc2FibGVkOworICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IDA7CisgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjIGlmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kaXNhYmxlZCApICB7CisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSBpZiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfdHJ1ZSApIHsKKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICAvLyBPTVBfUFJPQ19CSU5EPXRydWUgbWFwcyB0byBPTVBfUFJPQ19CSU5EPXNwcmVhZC4KKyAgICAgICAgICAgIC8vCisgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfc3ByZWFkOworICAgICAgICB9CisjIGVuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyAgICAgICAgaWYgKCBLTVBfQUZGSU5JVFlfQ0FQQUJMRSgpICkgeworCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gSGFuZGxlIHRoZSBXaW4gNjQgZ3JvdXAgYWZmaW5pdHkgc3R1ZmYgaWYgdGhlcmUgYXJlIG11bHRpcGxlCisgICAgICAgICAgICAvLyBwcm9jZXNzb3IgZ3JvdXBzLCBvciBpZiB0aGUgdXNlciByZXF1ZXN0ZWQgaXQsIGFuZCBPTVAgNC4wCisgICAgICAgICAgICAvLyBhZmZpbml0eSBpcyBub3QgaW4gZWZmZWN0LgorICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIGlmICggKCAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApCisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAmJiAoIF9fa21wX25lc3RlZF9wcm9jX2JpbmQuYmluZF90eXBlc1swXSA9PSBwcm9jX2JpbmRfZGVmYXVsdCApICkKKyMgIGVuZGlmCisgICAgICAgICAgICAgIHx8ICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2dyb3VwICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3Jlc3BlY3RfbWFzayA9IEZBTFNFOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisjICBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfaW50ZWw7CisjICBlbmRpZgorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9ncm91cDsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlIGlmICggX19rbXBfYWZmaW5pdHlfZ3JhbiA9PSBhZmZpbml0eV9ncmFuX2dyb3VwICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9IGFmZmluaXR5X3RvcF9tZXRob2RfZ3JvdXA7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90b3BfbWV0aG9kID0gYWZmaW5pdHlfdG9wX21ldGhvZF9hbGw7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPT0gYWZmaW5pdHlfdG9wX21ldGhvZF9ncm91cCApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2dyb3VwOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UgaWYgKCAoIF9fa21wX2FmZmluaXR5X2dyYW4gIT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fZmluZSApCisgICAgICAgICAgICAgICAgICAgICAgJiYgKCBfX2ttcF9hZmZpbml0eV9ncmFuICE9IGFmZmluaXR5X2dyYW5fdGhyZWFkICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyICpzdHIgPSBOVUxMOworICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoICggX19rbXBfYWZmaW5pdHlfZ3JhbiApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fY29yZTogc3RyID0gImNvcmUiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fcGFja2FnZTogc3RyID0gInBhY2thZ2UiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2dyYW5fbm9kZTogc3RyID0gIm5vZGUiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OiBLTVBfREVCVUdfQVNTRVJUKCAwICk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfV0FSTklORyggQWZmR3JhblRvcEdyb3VwLCB2YXIsIHN0ciApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfZ3JhbiA9IGFmZmluaXR5X2dyYW5fZmluZTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X2dyYW4gPSBhZmZpbml0eV9ncmFuX2NvcmU7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgZWxzZSBpZiAoIF9fa21wX2FmZmluaXR5X2dyYW4gPT0gYWZmaW5pdHlfZ3Jhbl9ncm91cCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKnN0ciA9IE5VTEw7CisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKCBfX2ttcF9hZmZpbml0eV90eXBlICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfcGh5c2ljYWw6IHN0ciA9ICJwaHlzaWNhbCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfbG9naWNhbDogc3RyID0gImxvZ2ljYWwiOyBicmVhazsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIGFmZmluaXR5X2NvbXBhY3Q6IHN0ciA9ICJjb21wYWN0IjsgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSBhZmZpbml0eV9zY2F0dGVyOiBzdHIgPSAic2NhdHRlciI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgYWZmaW5pdHlfZXhwbGljaXQ6IHN0ciA9ICJleHBsaWNpdCI7IGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vIE1JQyBvbiB3aW5kb3dzLCBzbyBubyBhZmZpbml0eV9iYWxhbmNlZCBjYXNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDogS01QX0RFQlVHX0FTU0VSVCggMCApOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1dBUk5JTkcoIEFmZkdyYW5Hcm91cFR5cGUsIHZhciwgc3RyICk7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPT0gYWZmaW5pdHlfcmVzcGVjdF9tYXNrX2RlZmF1bHQgKSB7CisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICBlbHNlCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgPSBUUlVFOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2ludGVsICkKKyAgICAgICAgICAgICAgICAgICYmICggX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdICE9IHByb2NfYmluZF9kZWZhdWx0ICkgKSB7CisgICAgICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfYWZmaW5pdHlfdHlwZSA9IGFmZmluaXR5X2NvbXBhY3Q7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9kdXBzID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorIyBlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdHlwZSA9PSBhZmZpbml0eV9kZWZhdWx0ICkgeworI2lmIE9NUF80MF9FTkFCTEVECisjaWYgS01QX0FSQ0hfWDg2XzY0ICYmIChLTVBfT1NfTElOVVggfHwgS01QX09TX1dJTkRPV1MpCisgICAgICAgICAgICAgICAgICAgIGlmKCBfX2ttcF9taWNfdHlwZSAhPSBub25fbWljICkgeworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbmVzdGVkX3Byb2NfYmluZC5iaW5kX3R5cGVzWzBdID0gcHJvY19iaW5kX2ludGVsOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gPSBwcm9jX2JpbmRfZmFsc2U7CisgICAgICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworI2lmIEtNUF9BUkNIX1g4Nl82NCAmJiAoS01QX09TX0xJTlVYIHx8IEtNUF9PU19XSU5ET1dTKQorICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfbWljX3R5cGUgIT0gbm9uX21pYyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPSBhZmZpbml0eV9zY2F0dGVyOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV90eXBlID0gYWZmaW5pdHlfbm9uZTsKKyAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF9hZmZpbml0eV9ncmFuID09IGFmZmluaXR5X2dyYW5fZGVmYXVsdCApCisgICAgICAgICAgICAgICAgICAmJiAgKCBfX2ttcF9hZmZpbml0eV9ncmFuX2xldmVscyA8IDAgKSApIHsKKyNpZiBLTVBfQVJDSF9YODZfNjQgJiYgKEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfV0lORE9XUykKKyAgICAgICAgICAgICAgICAgICAgaWYoIF9fa21wX21pY190eXBlICE9IG5vbl9taWMgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9maW5lOworICAgICAgICAgICAgICAgICAgICB9IGVsc2UKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hZmZpbml0eV9ncmFuID0gYWZmaW5pdHlfZ3Jhbl9jb3JlOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGlmICggX19rbXBfYWZmaW5pdHlfdG9wX21ldGhvZCA9PSBhZmZpbml0eV90b3BfbWV0aG9kX2RlZmF1bHQgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3RvcF9tZXRob2QgPSBhZmZpbml0eV90b3BfbWV0aG9kX2FsbDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3R5cGUgICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdHlwZSAgICAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV9jb21wYWN0ICAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X2NvbXBhY3QgICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfb2Zmc2V0ICAgICAgID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9vZmZzZXQgICAgICAgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X3ZlcmJvc2UgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfdmVyYm9zZSAgICAgICkgKTsKKyAgICAgICAgS19ESUFHKCAxLCAoICJfX2ttcF9hZmZpbml0eV93YXJuaW5ncyAgICAgPT0gJWRcbiIsIF9fa21wX2FmZmluaXR5X3dhcm5pbmdzICAgICApICk7CisgICAgICAgIEtfRElBRyggMSwgKCAiX19rbXBfYWZmaW5pdHlfcmVzcGVjdF9tYXNrID09ICVkXG4iLCBfX2ttcF9hZmZpbml0eV9yZXNwZWN0X21hc2sgKSApOworICAgICAgICBLX0RJQUcoIDEsICggIl9fa21wX2FmZmluaXR5X2dyYW4gICAgICAgICA9PSAlZFxuIiwgX19rbXBfYWZmaW5pdHlfZ3JhbiAgICAgICAgICkgKTsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpOworIyBpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF9uZXN0ZWRfcHJvY19iaW5kLmJpbmRfdHlwZXNbMF0gIT0gcHJvY19iaW5kX2RlZmF1bHQgKTsKKyMgZW5kaWYKKyAgICB9CisKKyNlbmRpZiAvKiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVEICovCisKKyAgICBpZiAoIF9fa21wX3ZlcnNpb24gKSB7CisgICAgICAgIF9fa21wX3ByaW50X3ZlcnNpb25fMSgpOworICAgIH07IC8vIGlmCisKKyAgICAvLyBQb3N0LWluaXRpYWxpemF0aW9uIHN0ZXA6IHNvbWUgZW52LiB2YXJzIG5lZWQgdGhlaXIgdmFsdWUncyBmdXJ0aGVyIHByb2Nlc3NpbmcKKyAgICBpZiAoIHN0cmluZyAhPSBOVUxMKSB7IC8vIGttcF9zZXRfZGVmYXVsdHMoKSB3YXMgY2FsbGVkCisgICAgICAgIF9fa21wX2F1eF9lbnZfaW5pdGlhbGl6ZSggJmJsb2NrICk7CisgICAgfQorCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisKKyAgICBLTVBfTUIoKTsKKworfSAvLyBfX2ttcF9lbnZfaW5pdGlhbGl6ZQorCisKK3ZvaWQKK19fa21wX2Vudl9wcmludCgpIHsKKworICAgIGttcF9lbnZfYmxrX3QgYmxvY2s7CisgICAgaW50ICAgICAgICAgICBpOworICAgIGttcF9zdHJfYnVmX3QgYnVmZmVyOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsKKyAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsKKworICAgIC8vIFByaW50IHJlYWwgZW52aXJvbm1lbnQgdmFsdWVzLgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4lc1xuXG4iLCBLTVBfSTE4Tl9TVFIoIFVzZXJTZXR0aW5ncyApICApOworICAgIGZvciAoIGkgPSAwOyBpIDwgYmxvY2suY291bnQ7ICsrIGkgKSB7CisgICAgICAgIGNoYXIgY29uc3QgKiBuYW1lICA9IGJsb2NrLnZhcnNbIGkgXS5uYW1lOworICAgICAgICBjaGFyIGNvbnN0ICogdmFsdWUgPSBibG9jay52YXJzWyBpIF0udmFsdWU7CisgICAgICAgIGlmICgKKyAgICAgICAgICAgICggS01QX1NUUkxFTiggbmFtZSApID4gNCAmJiBzdHJuY21wKCBuYW1lLCAiS01QXyIsIDQgKSA9PSAwICkKKyAgICAgICAgICAgIHx8IHN0cm5jbXAoIG5hbWUsICJPTVBfIiwgNCApID09IDAKKyAgICAgICAgICAgICNpZmRlZiBLTVBfR09NUF9DT01QQVQKKyAgICAgICAgICAgICAgICB8fCBzdHJuY21wKCBuYW1lLCAiR09NUF8iLCA1ICkgPT0gMAorICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9HT01QX0NPTVBBVAorICAgICAgICApIHsKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgJXM9JXNcbiIsIG5hbWUsIHZhbHVlICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiIgKTsKKworICAgIC8vIFByaW50IGludGVybmFsIChlZmZlY3RpdmUpIHNldHRpbmdzLgorICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcblxuIiwgS01QX0kxOE5fU1RSKCBFZmZlY3RpdmVTZXR0aW5ncyApICk7CisgICAgZm9yICggaW50IGkgPSAwOyBpIDwgX19rbXBfc3RnX2NvdW50OyArKyBpICkgeworICAgICAgICBpZiAoICBfX2ttcF9zdGdfdGFibGVbIGkgXS5wcmludCAhPSBOVUxMICkgeworICAgICAgICAgICAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQoICYgYnVmZmVyLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5uYW1lLCBfX2ttcF9zdGdfdGFibGVbIGkgXS5kYXRhICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gZm9yCisKKyAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKworICAgIF9fa21wX2Vudl9ibGtfZnJlZSggJiBibG9jayApOworICAgIF9fa21wX3N0cl9idWZfZnJlZSggJiBidWZmZXIgKTsKKworICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworfSAvLyBfX2ttcF9lbnZfcHJpbnQKKworCisjaWYgT01QXzQwX0VOQUJMRUQKK3ZvaWQKK19fa21wX2Vudl9wcmludF8yKCkgeworCisgICAga21wX2Vudl9ibGtfdCBibG9jazsKKyAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKworICAgIF9fa21wX2Vudl9mb3JtYXQgPSAxOworCisgICAgX19rbXBfc3RnX2luaXQoKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICBfX2ttcF9lbnZfYmxrX2luaXQoICYgYmxvY2ssIE5VTEwgKTsKKyAgICBfX2ttcF9lbnZfYmxrX3NvcnQoICYgYmxvY2sgKTsKKworICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiXG4lc1xuIiwgS01QX0kxOE5fU1RSKCBEaXNwbGF5RW52QmVnaW4gKSAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiAgIF9PUEVOTVA9JyVkJ1xuIiwgX19rbXBfb3Blbm1wX3ZlcnNpb24gKTsKKworICAgIGZvciAoIGludCBpID0gMDsgaSA8IF9fa21wX3N0Z19jb3VudDsgKysgaSApIHsKKyAgICAgICAgaWYgKCAgX19rbXBfc3RnX3RhYmxlWyBpIF0ucHJpbnQgIT0gTlVMTCAmJgorICAgICAgICAgICAgICAoICggX19rbXBfZGlzcGxheV9lbnYgJiYgc3RybmNtcCggX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgIk9NUF8iLCA0ICkgPT0gMCApIHx8IF9fa21wX2Rpc3BsYXlfZW52X3ZlcmJvc2UgKSApIHsKKyAgICAgICAgICAgIF9fa21wX3N0Z190YWJsZVsgaSBdLnByaW50KCAmIGJ1ZmZlciwgX19rbXBfc3RnX3RhYmxlWyBpIF0ubmFtZSwgX19rbXBfc3RnX3RhYmxlWyBpIF0uZGF0YSApOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvcgorCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgS01QX0kxOE5fU1RSKCBEaXNwbGF5RW52RW5kICkgICk7CisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICJcbiIgKTsKKworICAgIF9fa21wX3ByaW50ZiggIiVzIiwgYnVmZmVyLnN0ciApOworCisgICAgX19rbXBfZW52X2Jsa19mcmVlKCAmIGJsb2NrICk7CisgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCit9IC8vIF9fa21wX2Vudl9wcmludF8yCisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworLy8gZW5kIG9mIGZpbGUKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zZXR0aW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMzJlNjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3NldHRpbmdzLmgKQEAgLTAsMCArMSw1MCBAQAorLyoKKyAqIGttcF9zZXR0aW5ncy5oIC0tIEluaXRpYWxpemUgZW52aXJvbm1lbnQgdmFyaWFibGVzCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NFVFRJTkdTX0gKKyNkZWZpbmUgS01QX1NFVFRJTkdTX0gKKwordm9pZCBfX2ttcF9yZXNldF9nbG9iYWxfdmFycyggdm9pZCApOwordm9pZCBfX2ttcF9lbnZfaW5pdGlhbGl6ZSggY2hhciBjb25zdCAqICk7Cit2b2lkIF9fa21wX2Vudl9wcmludCgpOworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wX2Vudl9wcmludF8yKCk7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworaW50IF9fa21wX2luaXRpYWxfdGhyZWFkc19jYXBhY2l0eSggaW50IHJlcV9ucHJvYyApOwordm9pZCBfX2ttcF9pbml0X2RmbHRfdGVhbV9udGgoKTsKK2ludCBfX2ttcF9jb252ZXJ0X3RvX21pbGxpc2Vjb25kcyggY2hhciBjb25zdCAqICk7CitpbnQgX19rbXBfZGVmYXVsdF90cF9jYXBhY2l0eSggaW50LCBpbnQsIGludCk7CisKKyNpZiBLTVBfTUlDCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX05BTUUgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcyIsIEtNUF9JMThOX1NUUihEZXZpY2UpLCBuYW1lICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWCh4KSAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSciLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgeCApCisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0JPT0wgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgPyAiVFJVRSIgOiAiRkFMU0UiICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX0lOVCAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJWQnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgS01QX0kxOE5fU1RSKERldmljZSksIG5hbWUsIHZhbHVlICk7CisjZGVmaW5lIEtNUF9TVFJfQlVGX1BSSU5UX1NUUiAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmZmVyLCAiICAlcyAlcz0nJXMnXG4iLCBLTVBfSTE4Tl9TVFIoRGV2aWNlKSwgbmFtZSwgdmFsdWUgKQorI2Vsc2UKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRSAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lICkKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfTkFNRV9FWCh4KSAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSciLCBLTVBfSTE4Tl9TVFIoSG9zdCksIHggKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9CT09MICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSA/ICJUUlVFIiA6ICJGQUxTRSIgKTsKKyNkZWZpbmUgS01QX1NUUl9CVUZfUFJJTlRfSU5UICAgICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCBidWZmZXIsICIgICVzICVzPSclZCdcbiIsIEtNUF9JMThOX1NUUihIb3N0KSwgbmFtZSwgdmFsdWUgKQorI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9VSU5UNjQgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyUiIEtNUF9VSU5UNjRfU1BFQyAiJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApOworI2RlZmluZSBLTVBfU1RSX0JVRl9QUklOVF9TVFIgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoIGJ1ZmZlciwgIiAgJXMgJXM9JyVzJ1xuIiwgS01QX0kxOE5fU1RSKEhvc3QpLCBuYW1lLCB2YWx1ZSApCisjZW5kaWYKKworI2VuZGlmIC8vIEtNUF9TRVRUSU5HU19ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHMuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTY1YTQ4MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHMuY3BwCkBAIC0wLDAgKzEsNzA5IEBACisvKiogQGZpbGUga21wX3N0YXRzLmNwcAorICogU3RhdGlzdGljcyBnYXRoZXJpbmcgYW5kIHByb2Nlc3NpbmcuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX3N0ci5oIgorI2luY2x1ZGUgImttcF9sb2NrLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisKKyNpbmNsdWRlIDxhbGdvcml0aG0+CisjaW5jbHVkZSA8c3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHN0ZGxpYi5oPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gZm9yIGF0ZXhpdAorI2luY2x1ZGUgPGN0aW1lPgorCisjZGVmaW5lIFNUUklOR0laRTIoeCkgI3gKKyNkZWZpbmUgU1RSSU5HSVpFKHgpIFNUUklOR0laRTIoeCkKKworI2RlZmluZSBleHBhbmROYW1lKG5hbWUsZmxhZ3MsaWdub3JlKSAge1NUUklOR0laRShuYW1lKSxmbGFnc30sCitzdGF0SW5mbyB0aW1lU3RhdDo6dGltZXJJbmZvW10gPSB7CisgICAgS01QX0ZPUkVBQ0hfVElNRVIoZXhwYW5kTmFtZSwwKQorICAgIHswLDB9Cit9OworY29uc3Qgc3RhdEluZm8gY291bnRlcjo6Y291bnRlckluZm9bXSA9IHsKKyAgICBLTVBfRk9SRUFDSF9DT1VOVEVSKGV4cGFuZE5hbWUsMCkKKyAgICB7MCwwfQorfTsKKyN1bmRlZiBleHBhbmROYW1lCisKKyNkZWZpbmUgZXhwYW5kTmFtZShpZ25vcmUxLGlnbm9yZTIsaWdub3JlMykgIHswLjAsMC4wLDAuMH0sCitrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cmdiX2NvbG9yIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjp0aW1lckNvbG9ySW5mb1tdID0geworICAgIEtNUF9GT1JFQUNIX1RJTUVSKGV4cGFuZE5hbWUsMCkKKyAgICB7MC4wLDAuMCwwLjB9Cit9OworI3VuZGVmIGV4cGFuZE5hbWUKKworY29uc3Qga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnJnYl9jb2xvciBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6Z2xvYmFsQ29sb3JBcnJheVtdID0geworICAgIHsxLjAsIDAuMCwgMC4wfSwgLy8gcmVkCisgICAgezEuMCwgMC42LCAwLjB9LCAvLyBvcmFuZ2UKKyAgICB7MS4wLCAxLjAsIDAuMH0sIC8vIHllbGxvdworICAgIHswLjAsIDEuMCwgMC4wfSwgLy8gZ3JlZW4KKyAgICB7MC4wLCAwLjAsIDEuMH0sIC8vIGJsdWUKKyAgICB7MC42LCAwLjIsIDAuOH0sIC8vIHB1cnBsZQorICAgIHsxLjAsIDAuMCwgMS4wfSwgLy8gbWFnZW50YQorICAgIHswLjAsIDAuNCwgMC4yfSwgLy8gZGFyayBncmVlbgorICAgIHsxLjAsIDEuMCwgMC42fSwgLy8gbGlnaHQgeWVsbG93CisgICAgezAuNiwgMC40LCAwLjZ9LCAvLyBkaXJ0eSBwdXJwbGUKKyAgICB7MC4wLCAxLjAsIDEuMH0sIC8vIGN5YW4KKyAgICB7MS4wLCAwLjQsIDAuOH0sIC8vIHBpbmsKKyAgICB7MC41LCAwLjUsIDAuNX0sIC8vIGdyZXkKKyAgICB7MC44LCAwLjcsIDAuNX0sIC8vIGJyb3duCisgICAgezAuNiwgMC42LCAxLjB9LCAvLyBsaWdodCBibHVlCisgICAgezEuMCwgMC43LCAwLjV9LCAvLyBwZWFjaAorICAgIHswLjgsIDAuNSwgMS4wfSwgLy8gbGF2ZW5kZXIKKyAgICB7MC42LCAwLjAsIDAuMH0sIC8vIGRhcmsgcmVkCisgICAgezAuNywgMC42LCAwLjB9LCAvLyBnb2xkCisgICAgezAuMCwgMC4wLCAwLjB9ICAvLyBibGFjaworfTsKKworLy8gRW5zdXJlIHRoYXQgdGhlIGF0ZXhpdCBoYW5kbGVyIG9ubHkgcnVucyBvbmNlLgorc3RhdGljIHVpbnQzMl90IHN0YXRzUHJpbnRlZCA9IDA7CisKKy8vIG91dHB1dCBpbnRlcmZhY2UKK3N0YXRpYyBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSBfX2ttcF9zdGF0c19nbG9iYWxfb3V0cHV0OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogc3RhdGlzdGljIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIHN0YXRpc3RpYzo6YWRkU2FtcGxlKGRvdWJsZSBzYW1wbGUpCit7CisgICAgZG91YmxlIGRlbHRhID0gc2FtcGxlIC0gbWVhblZhbDsKKworICAgIHNhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyAxOworICAgIG1lYW5WYWwgICAgID0gbWVhblZhbCArIGRlbHRhL3NhbXBsZUNvdW50OworICAgIG0yICAgICAgICAgID0gbTIgKyBkZWx0YSooc2FtcGxlIC0gbWVhblZhbCk7CisKKyAgICBtaW5WYWwgPSBzdGQ6Om1pbihtaW5WYWwsIHNhbXBsZSk7CisgICAgbWF4VmFsID0gc3RkOjptYXgobWF4VmFsLCBzYW1wbGUpOworfQorCitzdGF0aXN0aWMgJiBzdGF0aXN0aWM6Om9wZXJhdG9yKz0gKGNvbnN0IHN0YXRpc3RpYyAmIG90aGVyKQoreworICAgIGlmIChzYW1wbGVDb3VudCA9PSAwKQorICAgIHsKKyAgICAgICAgKnRoaXMgPSBvdGhlcjsKKyAgICAgICAgcmV0dXJuICp0aGlzOworICAgIH0KKworICAgIHVpbnQ2NF90IG5ld1NhbXBsZUNvdW50ID0gc2FtcGxlQ291bnQgKyBvdGhlci5zYW1wbGVDb3VudDsKKyAgICBkb3VibGUgZG5zYyAgPSBkb3VibGUobmV3U2FtcGxlQ291bnQpOworICAgIGRvdWJsZSBkc2MgICA9IGRvdWJsZShzYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRzY0J5ZG5zYyA9IGRzYy9kbnNjOworICAgIGRvdWJsZSBkb3NjICA9IGRvdWJsZShvdGhlci5zYW1wbGVDb3VudCk7CisgICAgZG91YmxlIGRlbHRhID0gb3RoZXIubWVhblZhbCAtIG1lYW5WYWw7CisKKyAgICAvLyBUcnkgdG8gb3JkZXIgdGhlc2UgY2FsY3VsYXRpb25zIHRvIGF2b2lkIG92ZXJmbG93cy4KKyAgICAvLyBJZiB0aGlzIHdlcmUgRm9ydHJhbiwgdGhlbiB0aGUgY29tcGlsZXIgd291bGQgbm90IGJlIGFibGUgdG8gcmUtb3JkZXIgb3ZlciBicmFja2V0cy4KKyAgICAvLyBJbiBDKysgaXQgbWF5IGJlIGxlZ2FsIHRvIGRvIHRoYXQgKHdlIGNlcnRhaW5seSBob3BlIGl0IGRvZXNuJ3QsIGFuZCBDQysgUHJvZ3JhbW1pbmcgTGFuZ3VhZ2UgMm5kIGVkaXRpb24KKyAgICAvLyBzdWdnZXN0cyBpdCBzaG91bGRuJ3QsIHNpbmNlIGl0IHNheXMgdGhhdCBleHBsb2l0YXRpb24gb2YgYXNzb2NpYXRpdml0eSBjYW4gb25seSBiZSBtYWRlIGlmIHRoZSBvcGVyYXRpb24KKyAgICAvLyByZWFsbHkgaXMgYXNzb2NpYXRpdmUgKHdoaWNoIGZsb2F0aW5nIGFkZGl0aW9uIGlzbid0Li4uKSkuCisgICAgbWVhblZhbCAgICAgPSBtZWFuVmFsKmRzY0J5ZG5zYyArIG90aGVyLm1lYW5WYWwqKDEtZHNjQnlkbnNjKTsKKyAgICBtMiAgICAgICAgICA9IG0yICsgb3RoZXIubTIgKyBkc2NCeWRuc2MqZG9zYypkZWx0YSpkZWx0YTsKKyAgICBtaW5WYWwgICAgICA9IHN0ZDo6bWluIChtaW5WYWwsIG90aGVyLm1pblZhbCk7CisgICAgbWF4VmFsICAgICAgPSBzdGQ6Om1heCAobWF4VmFsLCBvdGhlci5tYXhWYWwpOworICAgIHNhbXBsZUNvdW50ID0gbmV3U2FtcGxlQ291bnQ7CisKKworICAgIHJldHVybiAqdGhpczsKK30KKwordm9pZCBzdGF0aXN0aWM6OnNjYWxlKGRvdWJsZSBmYWN0b3IpCit7CisgICAgbWluVmFsID0gbWluVmFsKmZhY3RvcjsKKyAgICBtYXhWYWwgPSBtYXhWYWwqZmFjdG9yOworICAgIG1lYW5WYWw9IG1lYW5WYWwqZmFjdG9yOworICAgIG0yICAgICA9IG0yKmZhY3RvcipmYWN0b3I7CisgICAgcmV0dXJuOworfQorCitzdGQ6OnN0cmluZyBzdGF0aXN0aWM6OmZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWwpIGNvbnN0Cit7CisgICAgc3RkOjpzdHJpbmcgcmVzdWx0ID0gZm9ybWF0U0koc2FtcGxlQ291bnQsOSwnICcpOworCisgICAgaWYgKHNhbXBsZUNvdW50ID09IDApCisgICAgeworICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKDAuMCwgOSwgdW5pdCk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSSgwLjAsIDksIHVuaXQpOworICAgICAgICBpZiAodG90YWwpCisgICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBzdGQ6OnN0cmluZygiLCAiKSArIGZvcm1hdFNJKDAuMCwgOSwgdW5pdCk7CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIHN0ZDo6c3RyaW5nKCIsICIpICsgZm9ybWF0U0koMC4wLCA5LCB1bml0KTsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtaW5WYWwsICA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsLCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtYXhWYWwsICA5LCB1bml0KTsKKyAgICAgICAgaWYgKHRvdGFsKQorICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShtZWFuVmFsKnNhbXBsZUNvdW50LCA5LCB1bml0KTsKKyAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgc3RkOjpzdHJpbmcoIiwgIikgKyBmb3JtYXRTSShnZXRTRCgpLCA5LCB1bml0KTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBleHBsaWNpdFRpbWVyIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCit2b2lkIGV4cGxpY2l0VGltZXI6OnN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpIHsKKyAgICBzdGFydFRpbWUgPSB0c2NfdGlja19jb3VudDo6bm93KCk7CisgICAgdG90YWxQYXVzZVRpbWUgPSAwOworICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+aW5jcmVtZW50TmVzdFZhbHVlKCk7CisgICAgfQorICAgIHJldHVybjsKK30KKwordm9pZCBleHBsaWNpdFRpbWVyOjpzdG9wKHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpIHsKKyAgICBpZiAoc3RhcnRUaW1lLmdldFZhbHVlKCkgPT0gMCkKKyAgICAgICAgcmV0dXJuOworCisgICAgdHNjX3RpY2tfY291bnQgZmluaXNoVGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKworICAgIC8vc3RhdC0+YWRkU2FtcGxlICgodHNjX3RpY2tfY291bnQ6Om5vdygpIC0gc3RhcnRUaW1lKS50aWNrcygpKTsKKyAgICBzdGF0LT5hZGRTYW1wbGUoKChmaW5pc2hUaW1lIC0gc3RhcnRUaW1lKSAtIHRvdGFsUGF1c2VUaW1lKS50aWNrcygpKTsKKworICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCh0aW1lckVudW1WYWx1ZSkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+cHVzaF9ldmVudChzdGFydFRpbWUuZ2V0VmFsdWUoKSAtIF9fa21wX3N0YXRzX3N0YXJ0X3RpbWUuZ2V0VmFsdWUoKSwgZmluaXNoVGltZS5nZXRWYWx1ZSgpIC0gX19rbXBfc3RhdHNfc3RhcnRfdGltZS5nZXRWYWx1ZSgpLCBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXROZXN0VmFsdWUoKSwgdGltZXJFbnVtVmFsdWUpOworICAgICAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5kZWNyZW1lbnROZXN0VmFsdWUoKTsKKyAgICB9CisKKyAgICAvKiBXZSBhY2NlcHQgdGhlIHJpc2sgdGhhdCB3ZSBkcm9wIGEgc2FtcGxlIGJlY2F1c2UgaXQgcmVhbGx5IGRpZCBzdGFydCBhdCB0PT0wLiAqLworICAgIHN0YXJ0VGltZSA9IDA7CisgICAgcmV0dXJuOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworLyogKioqKioqKioqKioqKiBwYXJ0aXRpb25lZFRpbWVycyBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KK3BhcnRpdGlvbmVkVGltZXJzOjpwYXJ0aXRpb25lZFRpbWVycygpIHsKKyAgICB0aW1lcl9zdGFjay5yZXNlcnZlKDgpOworfQorCisvLyBhZGQgYSB0aW1lciB0byB0aGlzIGNvbGxlY3Rpb24gb2YgcGFydGl0aW9uZWQgdGltZXJzLgordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6YWRkX3RpbWVyKGV4cGxpY2l0X3RpbWVyX2UgdGltZXJfaW5kZXgsIGV4cGxpY2l0VGltZXIqIHRpbWVyX3BvaW50ZXIpIHsKKyAgICBLTVBfREVCVUdfQVNTRVJUKChpbnQpdGltZXJfaW5kZXggPCAoaW50KUVYUExJQ0lUX1RJTUVSX0xBU1QrMSk7CisgICAgdGltZXJzW3RpbWVyX2luZGV4XSA9IHRpbWVyX3BvaW50ZXI7Cit9CisKKy8vIGluaXRpYWxpemUgdGhlIHBhcml0aW9uZWQgdGltZXJzIHRvIGFuIGluaXRpYWwgdGltZXIKK3ZvaWQgcGFydGl0aW9uZWRUaW1lcnM6OmluaXQodGltZXJQYWlyIGluaXRfdGltZXJfcGFpcikgeworICAgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+dGltZXJfc3RhY2suc2l6ZSgpID09IDApOworICAgIHRpbWVyX3N0YWNrLnB1c2hfYmFjayhpbml0X3RpbWVyX3BhaXIpOworICAgIHRpbWVyc1tpbml0X3RpbWVyX3BhaXIuZ2V0X2luZGV4KCldLT5zdGFydChpbml0X3RpbWVyX3BhaXIuZ2V0X3RpbWVyKCkpOworfQorCisvLyBzdG9wL3NhdmUgdGhlIGN1cnJlbnQgdGltZXIsIGFuZCBzdGFydCB0aGUgbmV3IHRpbWVyICh0aW1lcl9wYWlyKQorLy8gVGhlcmUgaXMgYSBzcGVjaWFsIGNvbmRpdGlvbiB3aGVyZSBpZiB0aGUgY3VycmVudCB0aW1lciBpcyBlcXVhbCB0bworLy8gdGhlIG9uZSB5b3UgYXJlIHRyeWluZyB0byBwdXNoLCB0aGVuIGl0IG9ubHkgbWFuaXB1bGF0ZXMgdGhlIHN0YWNrLAorLy8gYW5kIGl0IHdvbid0IHN0b3Avc3RhcnQgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRpbWVyLgordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6cHVzaCh0aW1lclBhaXIgdGltZXJfcGFpcikgeworICAgIC8vIGdldCB0aGUgY3VycmVudCB0aW1lcgorICAgIC8vIHN0b3AgY3VycmVudCB0aW1lcgorICAgIC8vIHB1c2ggbmV3IHRpbWVyCisgICAgLy8gc3RhcnQgdGhlIG5ldyB0aW1lcgorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+dGltZXJfc3RhY2suc2l6ZSgpID4gMCk7CisgICAgdGltZXJQYWlyIGN1cnJlbnRfdGltZXIgPSB0aW1lcl9zdGFjay5iYWNrKCk7CisgICAgdGltZXJfc3RhY2sucHVzaF9iYWNrKHRpbWVyX3BhaXIpOworICAgIGlmKGN1cnJlbnRfdGltZXIgIT0gdGltZXJfcGFpcikgeworICAgICAgICB0aW1lcnNbY3VycmVudF90aW1lci5nZXRfaW5kZXgoKV0tPnBhdXNlKCk7CisgICAgICAgIHRpbWVyc1t0aW1lcl9wYWlyLmdldF9pbmRleCgpXS0+c3RhcnQodGltZXJfcGFpci5nZXRfdGltZXIoKSk7CisgICAgfQorfQorCisvLyBzdG9wL2Rpc2NhcmQgdGhlIGN1cnJlbnQgdGltZXIsIGFuZCBzdGFydCB0aGUgcHJldmlvdXNseSBzYXZlZCB0aW1lcgordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6cG9wKCkgeworICAgIC8vIGdldCB0aGUgY3VycmVudCB0aW1lcgorICAgIC8vIHN0b3AgY3VycmVudCB0aW1lcgorICAgIC8vIHBvcCBjdXJyZW50IHRpbWVyCisgICAgLy8gZ2V0IHRoZSBuZXcgY3VycmVudCB0aW1lciBhbmQgc3RhcnQgaXQgYmFjayB1cAorICAgIEtNUF9ERUJVR19BU1NFUlQodGhpcy0+dGltZXJfc3RhY2suc2l6ZSgpID4gMSk7CisgICAgdGltZXJQYWlyIGN1cnJlbnRfdGltZXIgPSB0aW1lcl9zdGFjay5iYWNrKCk7CisgICAgdGltZXJfc3RhY2sucG9wX2JhY2soKTsKKyAgICB0aW1lclBhaXIgbmV3X3RpbWVyID0gdGltZXJfc3RhY2suYmFjaygpOworICAgIGlmKGN1cnJlbnRfdGltZXIgIT0gbmV3X3RpbWVyKSB7CisgICAgICAgIHRpbWVyc1tjdXJyZW50X3RpbWVyLmdldF9pbmRleCgpXS0+c3RvcChjdXJyZW50X3RpbWVyLmdldF90aW1lcigpKTsKKyAgICAgICAgdGltZXJzW25ld190aW1lci5nZXRfaW5kZXgoKV0tPnJlc3VtZSgpOworICAgIH0KK30KKworLy8gV2luZCB1cCBhbGwgdGhlIGN1cnJlbnRseSBydW5uaW5nIHRpbWVycy4KKy8vIFRoaXMgcG9wcyBvZmYgYWxsIHRoZSB0aW1lcnMgZnJvbSB0aGUgc3RhY2sgYW5kIGNsZWFycyB0aGUgc3RhY2sKKy8vIEFmdGVyIHRoaXMgaXMgY2FsbGVkLCBpbml0KCkgbXVzdCBiZSBydW4gYWdhaW4gdG8gaW5pdGlhbGl6ZSB0aGUKKy8vIHN0YWNrIG9mIHRpbWVycwordm9pZCBwYXJ0aXRpb25lZFRpbWVyczo6d2luZHVwKCkgeworICAgIHdoaWxlKHRpbWVyX3N0YWNrLnNpemUoKSA+IDEpIHsKKyAgICAgICAgdGhpcy0+cG9wKCk7CisgICAgfQorICAgIGlmKHRpbWVyX3N0YWNrLnNpemUoKSA+IDApIHsKKyAgICAgICAgdGltZXJQYWlyIGxhc3RfdGltZXIgPSB0aW1lcl9zdGFjay5iYWNrKCk7CisgICAgICAgIHRpbWVyX3N0YWNrLnBvcF9iYWNrKCk7CisgICAgICAgIHRpbWVyc1tsYXN0X3RpbWVyLmdldF9pbmRleCgpXS0+c3RvcChsYXN0X3RpbWVyLmdldF90aW1lcigpKTsKKyAgICB9Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2V2ZW50X3ZlY3RvciBtZW1iZXIgZnVuY3Rpb25zICoqKioqKioqKioqKiogKi8KKwordm9pZCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yOjpkZWFsbG9jYXRlKCkgeworICAgIF9fa21wX2ZyZWUoZXZlbnRzKTsKKyAgICBpbnRlcm5hbF9zaXplID0gMDsKKyAgICBhbGxvY2F0ZWRfc2l6ZSA9IDA7CisgICAgZXZlbnRzID0gTlVMTDsKK30KKworLy8gVGhpcyBmdW5jdGlvbiBpcyBmb3IgcXNvcnQoKSB3aGljaCByZXF1aXJlcyB0aGUgY29tcGFyZSBmdW5jdGlvbiB0byByZXR1cm4KKy8vIGVpdGhlciBhIG5lZ2F0aXZlIG51bWJlciBpZiBldmVudDEgPCBldmVudDIsIGEgcG9zaXRpdmUgbnVtYmVyIGlmIGV2ZW50MSA+IGV2ZW50MgorLy8gb3IgemVybyBpZiBldmVudDEgPT0gZXZlbnQyLgorLy8gVGhpcyBzb3J0cyBieSBzdGFydCB0aW1lIChsb3dlc3QgdG8gaGlnaGVzdCkuCitpbnQgY29tcGFyZV90d29fZXZlbnRzKGNvbnN0IHZvaWQqIGV2ZW50MSwgY29uc3Qgdm9pZCogZXZlbnQyKSB7CisgICAga21wX3N0YXRzX2V2ZW50KiBldjEgPSAoa21wX3N0YXRzX2V2ZW50KilldmVudDE7CisgICAga21wX3N0YXRzX2V2ZW50KiBldjIgPSAoa21wX3N0YXRzX2V2ZW50KilldmVudDI7CisKKyAgICBpZihldjEtPmdldFN0YXJ0KCkgPCBldjItPmdldFN0YXJ0KCkpIHJldHVybiAtMTsKKyAgICBlbHNlIGlmKGV2MS0+Z2V0U3RhcnQoKSA+IGV2Mi0+Z2V0U3RhcnQoKSkgcmV0dXJuIDE7CisgICAgZWxzZSByZXR1cm4gMDsKK30KKwordm9pZCBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yOjpzb3J0KCkgeworICAgIHFzb3J0KGV2ZW50cywgaW50ZXJuYWxfc2l6ZSwgc2l6ZW9mKGttcF9zdGF0c19ldmVudCksIGNvbXBhcmVfdHdvX2V2ZW50cyk7Cit9CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCisvKiAqKioqKioqKioqKioqIGttcF9zdGF0c19saXN0IG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCisvLyByZXR1cm5zIGEgcG9pbnRlciB0byBuZXdseSBjcmVhdGVkIHN0YXRzIG5vZGUKK2ttcF9zdGF0c19saXN0KiBrbXBfc3RhdHNfbGlzdDo6cHVzaF9iYWNrKGludCBndGlkKSB7CisgICAga21wX3N0YXRzX2xpc3QqIG5ld25vZGUgPSAoa21wX3N0YXRzX2xpc3QqKV9fa21wX2FsbG9jYXRlKHNpemVvZihrbXBfc3RhdHNfbGlzdCkpOworICAgIC8vIHBsYWNlbWVudCBuZXcsIG9ubHkgcmVxdWlyZXMgc3BhY2UgYW5kIHBvaW50ZXIgYW5kIGluaXRpYWxpemVzIChzbyBfX2ttcF9hbGxvY2F0ZSBpbnN0ZWFkIG9mIEMrKyBuZXdbXSBpcyB1c2VkKQorICAgIG5ldyAobmV3bm9kZSkga21wX3N0YXRzX2xpc3QoKTsKKyAgICBuZXdub2RlLT5zZXRHdGlkKGd0aWQpOworICAgIG5ld25vZGUtPnByZXYgPSB0aGlzLT5wcmV2OworICAgIG5ld25vZGUtPm5leHQgPSB0aGlzOworICAgIG5ld25vZGUtPnByZXYtPm5leHQgPSBuZXdub2RlOworICAgIG5ld25vZGUtPm5leHQtPnByZXYgPSBuZXdub2RlOworICAgIHJldHVybiBuZXdub2RlOworfQordm9pZCBrbXBfc3RhdHNfbGlzdDo6ZGVhbGxvY2F0ZSgpIHsKKyAgICBrbXBfc3RhdHNfbGlzdCogcHRyID0gdGhpcy0+bmV4dDsKKyAgICBrbXBfc3RhdHNfbGlzdCogZGVscHRyID0gdGhpcy0+bmV4dDsKKyAgICB3aGlsZShwdHIgIT0gdGhpcykgeworICAgICAgICBkZWxwdHIgPSBwdHI7CisgICAgICAgIHB0cj1wdHItPm5leHQ7CisgICAgICAgIC8vIHBsYWNlbWVudCBuZXcgbWVhbnMgd2UgaGF2ZSB0byBleHBsaWNpdGx5IGNhbGwgZGVzdHJ1Y3Rvci4KKyAgICAgICAgZGVscHRyLT5fZXZlbnRfdmVjdG9yLmRlYWxsb2NhdGUoKTsKKyAgICAgICAgZGVscHRyLT5+a21wX3N0YXRzX2xpc3QoKTsKKyAgICAgICAgX19rbXBfZnJlZShkZWxwdHIpOworICAgIH0KK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6YmVnaW4oKSB7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGl0LnB0ciA9IHRoaXMtPm5leHQ7CisgICAgcmV0dXJuIGl0OworfQora21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGttcF9zdGF0c19saXN0OjplbmQoKSB7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGl0LnB0ciA9IHRoaXM7CisgICAgcmV0dXJuIGl0OworfQoraW50IGttcF9zdGF0c19saXN0OjpzaXplKCkgeworICAgIGludCByZXR2YWw7CisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihyZXR2YWw9MCwgaXQ9YmVnaW4oKTsgaXQhPWVuZCgpOyBpdCsrLCByZXR2YWwrKykge30KKyAgICByZXR1cm4gcmV0dmFsOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKioga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIG1lbWJlciBmdW5jdGlvbnMgKioqKioqKioqKioqKiAqLworCitrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Oml0ZXJhdG9yKCkgOiBwdHIoTlVMTCkge30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvcjo6fml0ZXJhdG9yKCkge30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKysoKSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5uZXh0OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKysoaW50IGR1bW15KSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5uZXh0OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yLS0oKSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5wcmV2OworICAgIHJldHVybiAqdGhpczsKK30KK2ttcF9zdGF0c19saXN0OjppdGVyYXRvciBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yLS0oaW50IGR1bW15KSB7CisgICAgdGhpcy0+cHRyID0gdGhpcy0+cHRyLT5wcmV2OworICAgIHJldHVybiAqdGhpczsKK30KK2Jvb2wga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvciE9KGNvbnN0IGttcF9zdGF0c19saXN0OjppdGVyYXRvciAmIHJocykgeworICAgcmV0dXJuIHRoaXMtPnB0ciE9cmhzLnB0cjsKK30KK2Jvb2wga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yOjpvcGVyYXRvcj09KGNvbnN0IGttcF9zdGF0c19saXN0OjppdGVyYXRvciAmIHJocykgeworICAgcmV0dXJuIHRoaXMtPnB0cj09cmhzLnB0cjsKK30KK2ttcF9zdGF0c19saXN0KiBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3I6Om9wZXJhdG9yKigpIGNvbnN0IHsKKyAgICByZXR1cm4gdGhpcy0+cHRyOworfQorCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIGZ1bmN0aW9ucyAqKioqKioqKioqKioqKiAqLworCitjb25zdCBjaGFyKiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6ZXZlbnRzRmlsZU5hbWUgPSBOVUxMOworY29uc3QgY2hhcioga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnBsb3RGaWxlTmFtZSAgID0gTlVMTDsKK2ludCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQZXJUaHJlYWRGbGFnICAgICAgID0gMDsKK2ludCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnID0gMDsKKworLy8gaW5pdCgpIGlzIGNhbGxlZCB2ZXJ5IG5lYXIgdGhlIGJlZ2lubmluZyBvZiBleGVjdXRpb24gdGltZSBpbiB0aGUgY29uc3RydWN0b3Igb2YgX19rbXBfc3RhdHNfZ2xvYmFsX291dHB1dAordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6aW5pdCgpCit7CisgICAgY2hhciAqIHN0YXRzRmlsZU5hbWUgID0gZ2V0ZW52KCJLTVBfU1RBVFNfRklMRSIpOworICAgIGV2ZW50c0ZpbGVOYW1lICAgICAgICA9IGdldGVudigiS01QX1NUQVRTX0VWRU5UU19GSUxFIik7CisgICAgcGxvdEZpbGVOYW1lICAgICAgICAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfUExPVF9GSUxFIik7CisgICAgY2hhciAqIHRocmVhZFN0YXRzICAgID0gZ2V0ZW52KCJLTVBfU1RBVFNfVEhSRUFEUyIpOworICAgIGNoYXIgKiB0aHJlYWRFdmVudHMgICA9IGdldGVudigiS01QX1NUQVRTX0VWRU5UUyIpOworCisgICAgLy8gc2V0IHRoZSBzdGF0cyBvdXRwdXQgZmlsZW5hbWVzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBhbmQgZGVmYXVsdHMKKyAgICBpZihzdGF0c0ZpbGVOYW1lKSB7CisgICAgICAgIC8vIGFwcGVuZCB0aGUgcHJvY2VzcyBpZCB0byB0aGUgb3V0cHV0IGZpbGVuYW1lCisgICAgICAgIC8vIGV2ZW50cy5jc3YgLS0+IGV2ZW50cy1waWQuY3N2CisgICAgICAgIHNpemVfdCBpbmRleDsKKyAgICAgICAgc3RkOjpzdHJpbmcgYmFzZUZpbGVOYW1lLCBwaWQsIHN1ZmZpeDsKKyAgICAgICAgc3RkOjpzdHJpbmdzdHJlYW0gc3M7CisgICAgICAgIG91dHB1dEZpbGVOYW1lID0gc3RkOjpzdHJpbmcoc3RhdHNGaWxlTmFtZSk7CisgICAgICAgIGluZGV4ID0gb3V0cHV0RmlsZU5hbWUuZmluZF9sYXN0X29mKCcuJyk7CisgICAgICAgIGlmKGluZGV4ID09IHN0ZDo6c3RyaW5nOjpucG9zKSB7CisgICAgICAgICAgICBiYXNlRmlsZU5hbWUgPSBvdXRwdXRGaWxlTmFtZTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJhc2VGaWxlTmFtZSA9IG91dHB1dEZpbGVOYW1lLnN1YnN0cigwLCBpbmRleCk7CisgICAgICAgICAgICBzdWZmaXggPSBvdXRwdXRGaWxlTmFtZS5zdWJzdHIoaW5kZXgpOworICAgICAgICB9CisgICAgICAgIHNzIDw8IGdldHBpZCgpOworICAgICAgICBwaWQgPSBzcy5zdHIoKTsKKyAgICAgICAgb3V0cHV0RmlsZU5hbWUgPSBiYXNlRmlsZU5hbWUgKyAiLSIgKyBwaWQgKyBzdWZmaXg7CisgICAgfQorICAgIGV2ZW50c0ZpbGVOYW1lID0gZXZlbnRzRmlsZU5hbWUgPyBldmVudHNGaWxlTmFtZSA6ICJldmVudHMuZGF0IjsKKyAgICBwbG90RmlsZU5hbWUgICA9IHBsb3RGaWxlTmFtZSAgID8gcGxvdEZpbGVOYW1lICAgOiAiZXZlbnRzLnBsdCI7CisKKyAgICAvLyBzZXQgdGhlIGZsYWdzIGJhc2VkIG9uIGVudmlyb25tZW50IHZhcmlhYmxlcyBtYXRjaGluZzogdHJ1ZSwgb24sIDEsIC50cnVlLiAsIC50LiAsIHllcworICAgIHByaW50UGVyVGhyZWFkRmxhZyAgICAgICAgPSBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSh0aHJlYWRTdGF0cyk7CisgICAgcHJpbnRQZXJUaHJlYWRFdmVudHNGbGFnICA9IF9fa21wX3N0cl9tYXRjaF90cnVlKHRocmVhZEV2ZW50cyk7CisKKyAgICBpZihwcmludFBlclRocmVhZEV2ZW50c0ZsYWcpIHsKKyAgICAgICAgLy8gYXNzaWducyBhIGNvbG9yIHRvIGVhY2ggdGltZXIgZm9yIHByaW50aW5nCisgICAgICAgIHNldHVwRXZlbnRDb2xvcnMoKTsKKyAgICB9IGVsc2UgeworICAgICAgICAvLyB3aWxsIGNsZWFyIGZsYWcgc28gdGhhdCBubyBldmVudCB3aWxsIGJlIGxvZ2dlZAorICAgICAgICB0aW1lU3RhdDo6Y2xlYXJFdmVudEZsYWdzKCk7CisgICAgfQorCisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpzZXR1cEV2ZW50Q29sb3JzKCkgeworICAgIGludCBpOworICAgIGludCBnbG9iYWxDb2xvckluZGV4ID0gMDsKKyAgICBpbnQgbnVtR2xvYmFsQ29sb3JzID0gc2l6ZW9mKGdsb2JhbENvbG9yQXJyYXkpIC8gc2l6ZW9mKHJnYl9jb2xvcik7CisgICAgZm9yKGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgIGlmKHRpbWVTdGF0Ojpsb2dFdmVudCgodGltZXJfZSlpKSkgeworICAgICAgICAgICAgdGltZXJDb2xvckluZm9baV0gPSBnbG9iYWxDb2xvckFycmF5W2dsb2JhbENvbG9ySW5kZXhdOworICAgICAgICAgICAgZ2xvYmFsQ29sb3JJbmRleCA9IChnbG9iYWxDb2xvckluZGV4KzEpJW51bUdsb2JhbENvbG9yczsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm47Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50VGltZXJTdGF0cyhGSUxFICpzdGF0c091dCwgc3RhdGlzdGljIGNvbnN0ICogdGhlU3RhdHMsIHN0YXRpc3RpYyBjb25zdCAqIHRvdGFsU3RhdHMpCit7CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJUaW1lciwgICAgICAgICAgICAgICAgICAgICAgU2FtcGxlQ291bnQsICAgIE1pbiwgICAgICBNZWFuLCAgICAgICBNYXgsICAgICBUb3RhbCwgICAgICAgIFNEXG4iKTsKKyAgICBmb3IgKHRpbWVyX2UgcyA9IHRpbWVyX2UoMCk7IHM8VElNRVJfTEFTVDsgcyA9IHRpbWVyX2UocysxKSkgeworICAgICAgICBzdGF0aXN0aWMgY29uc3QgKiBzdGF0ID0gJnRoZVN0YXRzW3NdOworICAgICAgICBjaGFyIHRhZyA9IHRpbWVTdGF0Ojpub1VuaXRzKHMpID8gJyAnIDogJ1QnOworCisgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJS0yOHMsICVzXG4iLCB0aW1lU3RhdDo6bmFtZShzKSwgc3RhdC0+Zm9ybWF0KHRhZywgdHJ1ZSkuY19zdHIoKSk7CisgICAgfQorICAgIC8vIEFsc28gcHJpbnQgdGhlIFRvdGFsXyB2ZXJzaW9ucyBvZiB0aW1lcy4KKyAgICBmb3IgKHRpbWVyX2UgcyA9IHRpbWVyX2UoMCk7IHM8VElNRVJfTEFTVDsgcyA9IHRpbWVyX2UocysxKSkgeworICAgICAgICBjaGFyIHRhZyA9IHRpbWVTdGF0Ojpub1VuaXRzKHMpID8gJyAnIDogJ1QnOworICAgICAgICBpZiAodG90YWxTdGF0cyAmJiAhdGltZVN0YXQ6Om5vVG90YWwocykpCisgICAgICAgICAgICBmcHJpbnRmKHN0YXRzT3V0LCAiVG90YWxfJS0yMnMsICVzXG4iLCB0aW1lU3RhdDo6bmFtZShzKSwgdG90YWxTdGF0c1tzXS5mb3JtYXQodGFnLCB0cnVlKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50Q291bnRlclN0YXRzKEZJTEUgKnN0YXRzT3V0LCBzdGF0aXN0aWMgY29uc3QgKiB0aGVTdGF0cykKK3sKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIkNvdW50ZXIsICAgICAgICAgICAgICAgICBUaHJlYWRDb3VudCwgICAgTWluLCAgICAgIE1lYW4sICAgICAgIE1heCwgICAgIFRvdGFsLCAgICAgICAgU0RcbiIpOworICAgIGZvciAoaW50IHMgPSAwOyBzPENPVU5URVJfTEFTVDsgcysrKSB7CisgICAgICAgIHN0YXRpc3RpYyBjb25zdCAqIHN0YXQgPSAmdGhlU3RhdHNbc107CisgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiJS0yNXMsICVzXG4iLCBjb3VudGVyOjpuYW1lKGNvdW50ZXJfZShzKSksIHN0YXQtPmZvcm1hdCgnICcsIHRydWUpLmNfc3RyKCkpOworICAgIH0KK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRDb3VudGVycyhGSUxFICogc3RhdHNPdXQsIGNvdW50ZXIgY29uc3QgKiB0aGVDb3VudGVycykKK3sKKyAgICAvLyBXZSBwcmludCBhbGwgdGhlIGNvdW50ZXJzIGV2ZW4gaWYgdGhleSBhcmUgemVyby4KKyAgICAvLyBUaGF0IG1ha2VzIGl0IGVhc2llciB0byBzbGljZSB0aGVtIGludG8gYSBzcHJlYWRzaGVldCBpZiB5b3UgbmVlZCB0by4KKyAgICBmcHJpbnRmIChzdGF0c091dCwgIlxuQ291bnRlciwgICAgICAgICAgICAgICAgICAgIENvdW50XG4iKTsKKyAgICBmb3IgKGludCBjID0gMDsgYzxDT1VOVEVSX0xBU1Q7IGMrKykgeworICAgICAgICBjb3VudGVyIGNvbnN0ICogc3RhdCA9ICZ0aGVDb3VudGVyc1tjXTsKKyAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIlLTI1cywgJXNcbiIsIGNvdW50ZXI6Om5hbWUoY291bnRlcl9lKGMpKSwgZm9ybWF0U0koc3RhdC0+Z2V0VmFsdWUoKSwgOSwgJyAnKS5jX3N0cigpKTsKKyAgICB9Cit9CisKK3ZvaWQga21wX3N0YXRzX291dHB1dF9tb2R1bGU6OnByaW50RXZlbnRzKEZJTEUqIGV2ZW50c091dCwga21wX3N0YXRzX2V2ZW50X3ZlY3RvciogdGhlRXZlbnRzLCBpbnQgZ3RpZCkgeworICAgIC8vIHNvcnQgYnkgc3RhcnQgdGltZSBiZWZvcmUgcHJpbnRpbmcKKyAgICB0aGVFdmVudHMtPnNvcnQoKTsKKyAgICBmb3IgKGludCBpID0gMDsgaSA8IHRoZUV2ZW50cy0+c2l6ZSgpOyBpKyspIHsKKyAgICAgICAga21wX3N0YXRzX2V2ZW50IGV2ID0gdGhlRXZlbnRzLT5hdChpKTsKKyAgICAgICAgcmdiX2NvbG9yIGNvbG9yID0gZ2V0RXZlbnRDb2xvcihldi5nZXRUaW1lck5hbWUoKSk7CisgICAgICAgIGZwcmludGYoZXZlbnRzT3V0LCAiJWQgJWx1ICVsdSAlMS4xZiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpICVzXG4iLAorICAgICAgICAgICAgICAgIGd0aWQsCisgICAgICAgICAgICAgICAgZXYuZ2V0U3RhcnQoKSwKKyAgICAgICAgICAgICAgICBldi5nZXRTdG9wKCksCisgICAgICAgICAgICAgICAgMS4yIC0gKGV2LmdldE5lc3RMZXZlbCgpICogMC4yKSwKKyAgICAgICAgICAgICAgICBjb2xvci5yLCBjb2xvci5nLCBjb2xvci5iLAorICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpuYW1lKGV2LmdldFRpbWVyTmFtZSgpKQorICAgICAgICAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuOworfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjp3aW5kdXBFeHBsaWNpdFRpbWVycygpCit7CisgICAgLy8gV2luZCB1cCBhbnkgZXhwbGljaXQgdGltZXJzLiBXZSBhc3N1bWUgdGhhdCBpdCdzIGZhaXIgYXQgdGhpcyBwb2ludCB0byBqdXN0IHdhbGsgYWxsIHRoZSBleHBsY2l0IHRpbWVycyBpbiBhbGwgdGhyZWFkcworICAgIC8vIGFuZCBzYXkgIml0J3Mgb3ZlciIuCisgICAgLy8gSWYgdGhlIHRpbWVyIHdhc24ndCBydW5uaW5nLCB0aGlzIHdvbid0IHJlY29yZCBhbnl0aGluZyBhbnl3YXkuCisgICAga21wX3N0YXRzX2xpc3Q6Oml0ZXJhdG9yIGl0OworICAgIGZvcihpdCA9IF9fa21wX3N0YXRzX2xpc3QuYmVnaW4oKTsgaXQgIT0gX19rbXBfc3RhdHNfbGlzdC5lbmQoKTsgaXQrKykgeworICAgICAgICBrbXBfc3RhdHNfbGlzdCogcHRyID0gKml0OworICAgICAgICBwdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCktPndpbmR1cCgpOworICAgICAgICBmb3IgKGludCB0aW1lcj0wOyB0aW1lcjxFWFBMSUNJVF9USU1FUl9MQVNUOyB0aW1lcisrKSB7CisgICAgICAgICAgICBwdHItPmdldEV4cGxpY2l0VGltZXIoZXhwbGljaXRfdGltZXJfZSh0aW1lcikpLT5zdG9wKCh0aW1lcl9lKXRpbWVyKTsKKyAgICAgICAgfQorICAgIH0KK30KKwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRQbG90aWN1c0ZpbGUoKSB7CisgICAgaW50IGk7CisgICAgaW50IHNpemUgPSBfX2ttcF9zdGF0c19saXN0LnNpemUoKTsKKyAgICBGSUxFKiBwbG90T3V0ID0gZm9wZW4ocGxvdEZpbGVOYW1lLCAidysiKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHBhZ2VcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBwYWdlc2l6ZTogMTUgMTBcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBzY2FsZTogMS4wXG5cbiIpOworCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgZ2V0ZGF0YVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGZpbGU6ICVzXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICBldmVudHNGaWxlTmFtZSk7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBhcmVhZGVmXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgdGl0bGU6IE9wZW5NUCBTYW1wbGluZyBUaW1lbGluZVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHRpdGxlZGV0YWlsczogYWxpZ249Y2VudGVyIHNpemU9MTZcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICByZWN0YW5nbGU6IDEgMSAxMyA5XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgeGF1dG9yYW5nZTogZGF0YWZpZWxkPTIsM1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHlhdXRvcmFuZ2U6IC0xICVkXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICBzaXplKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHhheGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnM6IGluY1xuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIHN0dWJkZXRhaWxzOiBzaXplPTEyXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6IFRpbWUgKHRpY2tzKVxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxhYmVsZGV0YWlsczogc2l6ZT0xNFxuXG4iKTsKKworICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIHlheGlzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnM6IGluYyAxXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YnJhbmdlOiAwICVkXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc3R1YmRldGFpbHM6IHNpemU9MTJcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbDogVGhyZWFkICNcbiIKKyAgICAgICAgICAgICAgICAgICAgICIgICBsYWJlbGRldGFpbHM6IHNpemU9MTRcblxuIiwKKyAgICAgICAgICAgICAgICAgICAgIHNpemUtMSk7CisKKyAgICBmcHJpbnRmKHBsb3RPdXQsICIjcHJvYyBiYXJzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZXhhY3Rjb2xvcmZpZWxkOiA1XG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgYXhpczogeFxuIgorICAgICAgICAgICAgICAgICAgICAgIiAgIGxvY2ZpZWxkOiAxXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgc2VnbWVudGZpZWxkczogMiAzXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgYmFyd2lkdGhmaWVsZDogNFxuXG4iKTsKKworICAgIC8vIGNyZWF0ZSBsZWdlbmQgZW50cmllcyBjb3JyZXNwb25kaW5nIHRvIHRoZSB0aW1lciBjb2xvcgorICAgIGZvcihpPTA7aTxUSU1FUl9MQVNUO2krKykgeworICAgICAgICBpZih0aW1lU3RhdDo6bG9nRXZlbnQoKHRpbWVyX2UpaSkpIHsKKyAgICAgICAgICAgIHJnYl9jb2xvciBjID0gZ2V0RXZlbnRDb2xvcigodGltZXJfZSlpKTsKKyAgICAgICAgICAgIGZwcmludGYocGxvdE91dCwgIiNwcm9jIGxlZ2VuZGVudHJ5XG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBzYW1wbGV0eXBlOiBjb2xvclxuIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiICAgbGFiZWw6ICVzXG4iCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgICBkZXRhaWxzOiByZ2IoJTEuMWYsJTEuMWYsJTEuMWYpXG5cbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRpbWVTdGF0OjpuYW1lKCh0aW1lcl9lKWkpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjLnIsIGMuZywgYy5iKTsKKworICAgICAgICB9CisgICAgfQorCisgICAgZnByaW50ZihwbG90T3V0LCAiI3Byb2MgbGVnZW5kXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgZm9ybWF0OiBkb3duXG4iCisgICAgICAgICAgICAgICAgICAgICAiICAgbG9jYXRpb246IG1heCBtYXhcblxuIik7CisgICAgZmNsb3NlKHBsb3RPdXQpOworICAgIHJldHVybjsKK30KKworLyoKKyAqIFByaW50IHNvbWUgdXNlZnVsIGluZm9ybWF0aW9uIGFib3V0CisgKiAgICAqIHRoZSBkYXRlIGFuZCB0aW1lIHRoaXMgZXhwZXJpbWVudCByYW4uCisgKiAgICAqIHRoZSBtYWNoaW5lIG9uIHdoaWNoIGl0IHJhbi4KKyAqIFdlIG91dHB1dCBhbGwgb2YgdGhpcyBhcyBzdHlsaXNlZCBjb21tZW50cywgdGhvdWdoIHdlIG1heSBkZWNpZGUgdG8gcGFyc2Ugc29tZSBvZiBpdC4KKyAqLwordm9pZCBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZTo6cHJpbnRIZWFkZXJJbmZvKEZJTEUgKiBzdGF0c091dCkKK3sKKyAgICBzdGQ6OnRpbWVfdCBub3cgPSBzdGQ6OnRpbWUoMCk7CisgICAgY2hhciBidWZmZXJbNDBdOworICAgIGNoYXIgaG9zdE5hbWVbODBdOworCisgICAgc3RkOjpzdHJmdGltZSgmYnVmZmVyWzBdLCBzaXplb2YoYnVmZmVyKSwgIiVjIiwgc3RkOjpsb2NhbHRpbWUoJm5vdykpOworICAgIGZwcmludGYgKHN0YXRzT3V0LCAiIyBUaW1lIG9mIHJ1bjogJXNcbiIsICZidWZmZXJbMF0pOworICAgIGlmIChnZXRob3N0bmFtZSgmaG9zdE5hbWVbMF0sIHNpemVvZihob3N0TmFtZSkpID09IDApCisgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCIjIEhvc3RuYW1lOiAlc1xuIiwgJmhvc3ROYW1lWzBdKTsKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgZnByaW50ZiAoc3RhdHNPdXQsICIjIENQVTogICVzXG4iLCAmX19rbXBfY3B1aW5mby5uYW1lWzBdKTsKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIiMgRmFtaWx5OiAlZCwgTW9kZWw6ICVkLCBTdGVwcGluZzogJWRcbiIsIF9fa21wX2NwdWluZm8uZmFtaWx5LCBfX2ttcF9jcHVpbmZvLm1vZGVsLCBfX2ttcF9jcHVpbmZvLnN0ZXBwaW5nKTsKKyAgICBpZiAoX19rbXBfY3B1aW5mby5mcmVxdWVuY3kgPT0gMCkKKyAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsICIjIE5vbWluYWwgZnJlcXVlbmN5OiBVbmtub3duXG4iKTsKKyAgICBlbHNlCisgICAgICAgIGZwcmludGYgKHN0YXRzT3V0LCAiIyBOb21pbmFsIGZyZXF1ZW5jeTogJXN6XG4iLCBmb3JtYXRTSShkb3VibGUoX19rbXBfY3B1aW5mby5mcmVxdWVuY3kpLDksJ0gnKS5jX3N0cigpKTsKKyNlbmRpZgorfQorCit2b2lkIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlOjpvdXRwdXRTdGF0cyhjb25zdCBjaGFyKiBoZWFkaW5nKQoreworICAgIC8vIFN0b3AgYWxsIHRoZSBleHBsaWNpdCB0aW1lcnMgaW4gYWxsIHRocmVhZHMKKyAgICAvLyBEbyB0aGlzIGJlZm9yZSBkZWNsYXJpbmcgdGhlIGxvY2FsIHN0YXRpc3RpY3MgYmVjYXVzZSB0aGF5IGhhdmUgY29uc3RydWN0b3JzIHNvIHdpbGwgdGFrZSB0aW1lIHRvIGNyZWF0ZS4KKyAgICB3aW5kdXBFeHBsaWNpdFRpbWVycygpOworCisgICAgc3RhdGlzdGljIGFsbFN0YXRzW1RJTUVSX0xBU1RdOworICAgIHN0YXRpc3RpYyB0b3RhbFN0YXRzW1RJTUVSX0xBU1RdOyAgICAgICAgICAgLyogU3ludGhlc2l6ZWQsIGNyb3NzIHRocmVhZHMgdmVyc2lvbnMgb2Ygbm9ybWFsIHRpbWVyIHN0YXRzICovCisgICAgc3RhdGlzdGljIGFsbENvdW50ZXJzW0NPVU5URVJfTEFTVF07CisKKyAgICBGSUxFICogc3RhdHNPdXQgPSAhb3V0cHV0RmlsZU5hbWUuZW1wdHkoKSA/IGZvcGVuIChvdXRwdXRGaWxlTmFtZS5jX3N0cigpLCAiYSsiKSA6IHN0ZGVycjsKKyAgICBpZiAoIXN0YXRzT3V0KQorICAgICAgICBzdGF0c091dCA9IHN0ZGVycjsKKworICAgIEZJTEUgKiBldmVudHNPdXQ7CisgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgZXZlbnRzT3V0ID0gZm9wZW4oZXZlbnRzRmlsZU5hbWUsICJ3KyIpOworICAgIH0KKworICAgIHByaW50SGVhZGVySW5mbyAoc3RhdHNPdXQpOworICAgIGZwcmludGYoc3RhdHNPdXQsICIlc1xuIixoZWFkaW5nKTsKKyAgICAvLyBBY2N1bXVsYXRlIGFjcm9zcyB0aHJlYWRzLgorICAgIGttcF9zdGF0c19saXN0OjppdGVyYXRvciBpdDsKKyAgICBmb3IgKGl0ID0gX19rbXBfc3RhdHNfbGlzdC5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIGludCB0ID0gKCppdCktPmdldEd0aWQoKTsKKyAgICAgICAgLy8gT3V0cHV0IHBlciB0aHJlYWQgc3RhdHMgaWYgcmVxdWVzdGVkLgorICAgICAgICBpZiAocHJpbnRQZXJUaHJlYWRGbGFnKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGF0c091dCwgIlRocmVhZCAlZFxuIiwgdCk7CisgICAgICAgICAgICBwcmludFRpbWVyU3RhdHMgKHN0YXRzT3V0LCAoKml0KS0+Z2V0VGltZXJzKCksIDApOworICAgICAgICAgICAgcHJpbnRDb3VudGVycyAgIChzdGF0c091dCwgKCppdCktPmdldENvdW50ZXJzKCkpOworICAgICAgICAgICAgZnByaW50ZiAoc3RhdHNPdXQsIlxuIik7CisgICAgICAgIH0KKyAgICAgICAgLy8gT3V0cHV0IHBlciB0aHJlYWQgZXZlbnRzIGlmIHJlcXVlc3RlZC4KKyAgICAgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgICAgIGttcF9zdGF0c19ldmVudF92ZWN0b3IgZXZlbnRzID0gKCppdCktPmdldEV2ZW50VmVjdG9yKCk7CisgICAgICAgICAgICBwcmludEV2ZW50cyhldmVudHNPdXQsICZldmVudHMsIHQpOworICAgICAgICB9CisKKyAgICAgICAgLy8gQWNjdW11bGF0ZSB0aW1lcnMuCisgICAgICAgIGZvciAodGltZXJfZSBzID0gdGltZXJfZSgwKTsgczxUSU1FUl9MQVNUOyBzID0gdGltZXJfZShzKzEpKSB7CisgICAgICAgICAgICAvLyBTZWUgaWYgd2Ugc2hvdWxkIGlnbm9yZSB0aGlzIHRpbWVyIHdoZW4gYWdncmVnYXRpbmcKKyAgICAgICAgICAgIGlmICgodGltZVN0YXQ6Om1hc3Rlck9ubHkocykgJiYgKHQgIT0gMCkpIHx8IC8vIFRpbWVyIGlzIG9ubHkgdmFsaWQgb24gdGhlIG1hc3RlciBhbmQgdGhpcyB0aHJlYWQgaXMgYSB3b3JrZXIKKyAgICAgICAgICAgICAgICAodGltZVN0YXQ6Ondvcmtlck9ubHkocykgJiYgKHQgPT0gMCkpICAgIC8vIFRpbWVyIGlzIG9ubHkgdmFsaWQgb24gYSB3b3JrZXIgYW5kIHRoaXMgdGhyZWFkIGlzIHRoZSBtYXN0ZXIKKyAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgc3RhdGlzdGljICogdGhyZWFkU3RhdCA9ICgqaXQpLT5nZXRUaW1lcihzKTsKKyAgICAgICAgICAgIGFsbFN0YXRzW3NdICs9ICp0aHJlYWRTdGF0OworCisgICAgICAgICAgICAvLyBBZGQgVG90YWwgc3RhdHMgZm9yIHRpbWVycyB0aGF0IGFyZSB2YWxpZCBpbiBtb3JlIHRoYW4gb25lIHRocmVhZAorICAgICAgICAgICAgaWYgKCF0aW1lU3RhdDo6bm9Ub3RhbChzKSkKKyAgICAgICAgICAgICAgICB0b3RhbFN0YXRzW3NdLmFkZFNhbXBsZSh0aHJlYWRTdGF0LT5nZXRUb3RhbCgpKTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIEFjY3VtdWxhdGUgY291bnRlcnMuCisgICAgICAgIGZvciAoY291bnRlcl9lIGMgPSBjb3VudGVyX2UoMCk7IGM8Q09VTlRFUl9MQVNUOyBjID0gY291bnRlcl9lKGMrMSkpIHsKKyAgICAgICAgICAgIGlmIChjb3VudGVyOjptYXN0ZXJPbmx5KGMpICYmIHQgIT0gMCkKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIGFsbENvdW50ZXJzW2NdLmFkZFNhbXBsZSAoKCppdCktPmdldENvdW50ZXIoYyktPmdldFZhbHVlKCkpOworICAgICAgICB9CisgICAgfQorCisgICAgaWYgKGV2ZW50UHJpbnRpbmdFbmFibGVkKCkpIHsKKyAgICAgICAgcHJpbnRQbG90aWN1c0ZpbGUoKTsKKyAgICAgICAgZmNsb3NlKGV2ZW50c091dCk7CisgICAgfQorCisgICAgZnByaW50ZiAoc3RhdHNPdXQsICJBZ2dyZWdhdGUgZm9yIGFsbCB0aHJlYWRzXG4iKTsKKyAgICBwcmludFRpbWVyU3RhdHMgKHN0YXRzT3V0LCAmYWxsU3RhdHNbMF0sICZ0b3RhbFN0YXRzWzBdKTsKKyAgICBmcHJpbnRmIChzdGF0c091dCwgIlxuIik7CisgICAgcHJpbnRDb3VudGVyU3RhdHMgKHN0YXRzT3V0LCAmYWxsQ291bnRlcnNbMF0pOworCisgICAgaWYgKHN0YXRzT3V0ICE9IHN0ZGVycikKKyAgICAgICAgZmNsb3NlKHN0YXRzT3V0KTsKK30KKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KKy8qICoqKioqKioqKioqKiogIGV4cG9ydGVkIEMgZnVuY3Rpb25zICoqKioqKioqKioqKioqICovCisKKy8vIG5vIG5hbWUgbWFuZ2xpbmcgZm9yIHRoZXNlIGZ1bmN0aW9ucywgd2Ugd2FudCB0aGUgYyBmaWxlcyB0byBiZSBhYmxlIHRvIGdldCBhdCB0aGVzZSBmdW5jdGlvbnMKK2V4dGVybiAiQyIgeworCit2b2lkIF9fa21wX3Jlc2V0X3N0YXRzKCkKK3sKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgaXQ7CisgICAgZm9yKGl0ID0gX19rbXBfc3RhdHNfbGlzdC5iZWdpbigpOyBpdCAhPSBfX2ttcF9zdGF0c19saXN0LmVuZCgpOyBpdCsrKSB7CisgICAgICAgIHRpbWVTdGF0ICogdGltZXJzICAgICA9ICgqaXQpLT5nZXRUaW1lcnMoKTsKKyAgICAgICAgY291bnRlciAqIGNvdW50ZXJzICAgID0gKCppdCktPmdldENvdW50ZXJzKCk7CisgICAgICAgIGV4cGxpY2l0VGltZXIgKiBlVGltZXJzID0gKCppdCktPmdldEV4cGxpY2l0VGltZXJzKCk7CisKKyAgICAgICAgZm9yIChpbnQgdCA9IDA7IHQ8VElNRVJfTEFTVDsgdCsrKQorICAgICAgICAgICAgdGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgZm9yIChpbnQgYyA9IDA7IGM8Q09VTlRFUl9MQVNUOyBjKyspCisgICAgICAgICAgICBjb3VudGVyc1tjXS5yZXNldCgpOworCisgICAgICAgIGZvciAoaW50IHQ9MDsgdDxFWFBMSUNJVF9USU1FUl9MQVNUOyB0KyspCisgICAgICAgICAgICBlVGltZXJzW3RdLnJlc2V0KCk7CisKKyAgICAgICAgLy8gcmVzZXQgdGhlIGV2ZW50IHZlY3RvciBzbyBhbGwgcHJldmlvdXMgZXZlbnRzIGFyZSAiZXJhc2VkIgorICAgICAgICAoKml0KS0+cmVzZXRFdmVudFZlY3RvcigpOworICAgIH0KK30KKworLy8gVGhpcyBmdW5jdGlvbiB3aWxsIHJlc2V0IGFsbCBzdGF0cyBhbmQgc3RvcCBhbGwgdGhyZWFkcycgZXhwbGljaXQgdGltZXJzIGlmIHRoZXkgaGF2ZW4ndCBiZWVuIHN0b3BwZWQgYWxyZWFkeS4KK3ZvaWQgX19rbXBfb3V0cHV0X3N0YXRzKGNvbnN0IGNoYXIgKiBoZWFkaW5nKQoreworICAgIF9fa21wX3N0YXRzX2dsb2JhbF9vdXRwdXQub3V0cHV0U3RhdHMoaGVhZGluZyk7CisgICAgX19rbXBfcmVzZXRfc3RhdHMoKTsKK30KKwordm9pZCBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQodm9pZCkKK3sKKyAgICAvLyBPbmx5IGRvIHRoaXMgb25jZS4KKyAgICBpZiAoS01QX1hDSEdfRklYRUQzMigmc3RhdHNQcmludGVkLCAxKSAhPSAwKQorICAgICAgICByZXR1cm47CisKKyAgICBfX2ttcF9vdXRwdXRfc3RhdHMoIlN0YXRpc3RpY3Mgb24gZXhpdCIpOworfQorCit2b2lkIF9fa21wX3N0YXRzX2luaXQodm9pZCkKK3sKK30KKworfSAvLyBleHRlcm4gIkMiCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNzY3ZmRmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0cy5oCkBAIC0wLDAgKzEsOTA0IEBACisjaWZuZGVmIEtNUF9TVEFUU19ICisjZGVmaW5lIEtNUF9TVEFUU19ICisKKy8qKiBAZmlsZSBrbXBfc3RhdHMuaAorICogRnVuY3Rpb25zIGZvciBjb2xsZWN0aW5nIHN0YXRpc3RpY3MuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKy8qCisgKiBTdGF0aXN0aWNzIGFjY3VtdWxhdG9yLgorICogQWNjdW11bGF0ZXMgbnVtYmVyIG9mIHNhbXBsZXMgYW5kIGNvbXB1dGVzIG1pbiwgbWF4LCBtZWFuLCBzdGFuZGFyZCBkZXZpYXRpb24gb24gdGhlIGZseS4KKyAqCisgKiBPbmxpbmUgdmFyaWFuY2UgY2FsY3VsYXRpb24gYWxnb3JpdGhtIGZyb20gaHR0cDovL2VuLndpa2lwZWRpYS5vcmcvd2lraS9BbGdvcml0aG1zX2Zvcl9jYWxjdWxhdGluZ192YXJpYW5jZSNPbi1saW5lX2FsZ29yaXRobQorICovCisKKyNpbmNsdWRlIDxsaW1pdHM+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgPHZlY3Rvcj4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaW5jbHVkZSA8bmV3PiAvLyBwbGFjZW1lbnQgbmV3CisjaW5jbHVkZSAia21wX3N0YXRzX3RpbWluZy5oIgorCisvKgorICogRW5hYmxlIGRldmVsb3BlciBzdGF0aXN0aWNzIGhlcmUgaWYgeW91IHdhbnQgdGhlbS4gVGhleSBhcmUgbW9yZSBkZXRhaWxlZCB0aGFuIGlzIHVzZWZ1bCBmb3IgYXBwbGljYXRpb24gY2hhcmFjdGVyaXNhdGlvbiBhbmQKKyAqIGFyZSBpbnRlbmRlZCBmb3IgdGhlIHJ1bnRpbWUgbGlicmFyeSBkZXZlbG9wZXIuCisgKi8KKy8vICNkZWZpbmUgS01QX0RFVkVMT1BFUl9TVEFUUyAxCisKKy8qIQorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisgKiBcYnJpZWYgZmxhZ3MgdG8gZGVzY3JpYmUgdGhlIHN0YXRpc3RpYyAodGltZXIgb3IgY291bnRlcikKKyAqCisgKi8KK2VudW0gc3RhdHNfZmxhZ3NfZSB7CisgICAgbm9Ub3RhbCAgICAgID0gMTw8MCwgICAgIC8vITwgZG8gbm90IHNob3cgYSBUT1RBTF9hZ2dyZWdhdGlvbiBmb3IgdGhpcyBzdGF0aXN0aWMKKyAgICBvbmx5SW5NYXN0ZXIgPSAxPDwxLCAgICAgLy8hPCBzdGF0aXN0aWMgaXMgdmFsaWQgb25seSBmb3IgbWFzdGVyCisgICAgbm9Vbml0cyAgICAgID0gMTw8MiwgICAgIC8vITwgc3RhdGlzdGljIGRvZXNuJ3QgbmVlZCB1bml0cyBwcmludGVkIG5leHQgdG8gaXQgaW4gb3V0cHV0CisgICAgbm90SW5NYXN0ZXIgID0gMTw8MywgICAgIC8vITwgc3RhdGlzdGljIGlzIHZhbGlkIG9ubHkgZm9yIG5vbi1tYXN0ZXIgdGhyZWFkcworICAgIGxvZ0V2ZW50ICAgICA9IDE8PDQgICAgICAvLyE8IHN0YXRpc3RpYyBjYW4gYmUgbG9nZ2VkIG9uIHRoZSBldmVudCB0aW1lbGluZSB3aGVuIEtNUF9TVEFUU19FVkVOVFMgaXMgb24gKHZhbGlkIG9ubHkgZm9yIHRpbWVycykKK307CisKKy8qIQorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisgKiBcYnJpZWYgdGhlIHN0YXRlcyB3aGljaCBhIHRocmVhZCBjYW4gYmUgaW4KKyAqCisgKi8KK2VudW0gc3RhdHNfc3RhdGVfZSB7CisgICAgSURMRSwKKyAgICBTRVJJQUxfUkVHSU9OLAorICAgIEZPUktfSk9JTl9CQVJSSUVSLAorICAgIFBMQUlOX0JBUlJJRVIsCisgICAgVEFTS1dBSVQsCisgICAgVEFTS1lJRUxELAorICAgIFRBU0tHUk9VUCwKKyAgICBJTVBMSUNJVF9UQVNLLAorICAgIEVYUExJQ0lUX1RBU0sKK307CisKKy8qIQorICogXGJyaWVmIEFkZCBuZXcgY291bnRlcnMgdW5kZXIgS01QX0ZPUkVBQ0hfQ09VTlRFUigpIG1hY3JvIGluIGttcF9zdGF0cy5oCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oQ09VTlRFUl9OQU1FLCBmbGFncywgYXJnKQorICogQHBhcmFtIGFyZyBhIHVzZXIgZGVmaW5lZCBhcmd1bWVudCB0byBzZW5kIHRvIHRoZSB1c2VyIGRlZmluZWQgbWFjcm8KKyAqCisgKiBcZGV0YWlscyBBIGNvdW50ZXIgY291bnRzIHRoZSBvY2N1cnJlbmNlIG9mIHNvbWUgZXZlbnQuCisgKiBFYWNoIHRocmVhZCBhY2N1bXVsYXRlcyBpdHMgb3duIGNvdW50LCBhdCB0aGUgZW5kIG9mIGV4ZWN1dGlvbiB0aGUgY291bnRzIGFyZSBhZ2dyZWdhdGVkIHRyZWF0aW5nIGVhY2ggdGhyZWFkCisgKiBhcyBhIHNlcGFyYXRlIG1lYXN1cmVtZW50LiAoVW5sZXNzIG9ubHlJbk1hc3RlciBpcyBzZXQsIGluIHdoaWNoIGNhc2UgdGhlcmUncyBvbmx5IGEgc2luZ2xlIG1lYXN1cmVtZW50KS4KKyAqIFRoZSBtaW4sbWVhbixtYXggYXJlIHRoZXJlZm9yZSB0aGUgdmFsdWVzIGZvciB0aGUgdGhyZWFkcy4KKyAqIEFkZGluZyB0aGUgY291bnRlciBoZXJlIGFuZCB0aGVuIHB1dHRpbmcgYSBLTVBfQkxPQ0tfQ09VTlRFUihuYW1lKSBhdCB0aGUgcG9pbnQgeW91IHdhbnQgdG8gY291bnQgaXMgYWxsIHlvdSBuZWVkIHRvIGRvLgorICogQWxsIG9mIHRoZSB0YWJsZXMgYW5kIHByaW50aW5nIGlzIGdlbmVyYXRlZCBmcm9tIHRoaXMgbWFjcm8uCisgKiBGb3JtYXQgaXMgIm1hY3JvKG5hbWUsIGZsYWdzLCBhcmcpIgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworICovCisjZGVmaW5lIEtNUF9GT1JFQUNIX0NPVU5URVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfUEFSQUxMRUwsIHN0YXRzX2ZsYWdzX2U6Om9ubHlJbk1hc3RlciB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsIGFyZykgXAorICAgIG1hY3JvIChPTVBfTkVTVEVEX1BBUkFMTEVMLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0ZPUl9zdGF0aWMsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9GT1JfZHluYW1pYywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfRElTVFJJQlVURSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX0JBUlJJRVIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9DUklUSUNBTCwwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfU0lOR0xFLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX01BU1RFUiwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9URUFNUywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfc2V0X2xvY2ssIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rlc3RfbG9jaywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFJFRFVDRV93YWl0LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChSRURVQ0Vfbm93YWl0LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX1RBU0tZSUVMRCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9UQVNLTE9PUCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChUQVNLX2V4ZWN1dGVkLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVEFTS19jYW5jZWxsZWQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKFRBU0tfc3RvbGVuLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChMQVNULDAsYXJnKQorCisvKiEKKyAqIFxicmllZiBBZGQgbmV3IHRpbWVycyB1bmRlciBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvIGluIGttcF9zdGF0cy5oCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXGRldGFpbHMgQSB0aW1lciBjb2xsZWN0cyBtdWx0aXBsZSBzYW1wbGVzIG9mIHNvbWUgY291bnQgaW4gZWFjaCB0aHJlYWQgYW5kIHRoZW4gZmluYWxseSBhZ2dyZWdhdGVzIGFsbGwgb2YgdGhlIHNhbXBsZXMgZnJvbSBhbGwgb2YgdGhlIHRocmVhZHMuCisgKiBGb3IgbW9zdCB0aW1lcnMgdGhlIHByaW50aW5nIGNvZGUgYWxzbyBwcm92aWRlcyBhbiBhZ2dyZWdhdGlvbiBvdmVyIHRoZSB0aHJlYWQgdG90YWxzLiBUaGVzZSBhcmUgcHJpbnRlZCBhcyBUT1RBTF9mb28uCisgKiBUaGUgY291bnQgaXMgbm9ybWFsbHkgYSB0aW1lIChpbiB0aWNrcyksIGhlbmNlIHRoZSBuYW1lICJ0aW1lciIuIChCdXQgY2FuIGJlIGFueSB2YWx1ZSwgc28gd2UgdXNlIHRoaXMgZm9yICJudW1iZXIgb2YgYXJndW1lbnRzIHBhc3NlZCB0byBmb3JrIgorICogYXMgd2VsbCkuCisgKiBGb3IgdGltZXJzIHRoZSB0aHJlYWRzIGFyZSBub3Qgc2lnbmlmaWNhbnQsIGl0J3MgdGhlIGluZGl2aWR1YWwgb2JzZXJ2YXRpb25zIHRoYXQgY291bnQsIHNvIHRoZSBzdGF0aXN0aWNzIGFyZSBhdCB0aGF0IGxldmVsLgorICogRm9ybWF0IGlzICJtYWNybyhuYW1lLCBmbGFncywgYXJnKSIKKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcyCisgKi8KKyNkZWZpbmUgS01QX0ZPUkVBQ0hfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF93b3JrZXJfdGhyZWFkX2xpZmUsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChGT1Jfc3RhdGljX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoRk9SX2R5bmFtaWNfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9jcml0aWNhbCwgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfY3JpdGljYWxfd2FpdCwgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NpbmdsZSwgICAgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9tYXN0ZXIsICAgIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfaWRsZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3BsYWluX2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF9mb3JrX2pvaW5fYmFycmllciwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfcGFyYWxsZWwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfaW1tZWRpYXRlLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX3Rhc2t3YWl0LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza190YXNreWllbGQsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3Rhc2tfdGFza2dyb3VwLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrX2pvaW5fYmFyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfdGFza19wbGFpbl9iYXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoT01QX3NlcmlhbCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgbWFjcm8gKE9NUF90YXNrbG9vcF9zY2hlZHVsaW5nLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIG1hY3JvIChPTVBfc2V0X251bXRocmVhZHMsICAgIHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBhcmcpIFwKKyAgICBtYWNybyAoT01QX1BBUkFMTEVMX2FyZ3MsICAgICBzdGF0c19mbGFnc19lOjpub1VuaXRzIHwgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbCwgYXJnKSBcCisgICAgbWFjcm8gKEZPUl9zdGF0aWNfaXRlcmF0aW9ucywgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0cyB8IHN0YXRzX2ZsYWdzX2U6Om5vVG90YWwsIGFyZykgXAorICAgIG1hY3JvIChGT1JfZHluYW1pY19pdGVyYXRpb25zLHN0YXRzX2ZsYWdzX2U6Om5vVW5pdHMgfCBzdGF0c19mbGFnc19lOjpub1RvdGFsLCBhcmcpIFwKKyAgICBLTVBfRk9SRUFDSF9ERVZFTE9QRVJfVElNRVIobWFjcm8sIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoTEFTVCwwLCBhcmcpCisKKworLy8gT01QX3N0YXJ0X2VuZCAgICAgICAgICAtLSBUaW1lIGZyb20gd2hlbiBPcGVuTVAgaXMgaW5pdGlhbGl6ZWQgdW50aWwgdGhlIHN0YXRzIGFyZSBwcmludGVkIGF0IGV4aXQKKy8vIE9NUF9zZXJpYWwgICAgICAgICAgICAgLS0gVGhyZWFkIHplcm8gdGltZSBleGVjdXRpbmcgc2VyaWFsIGNvZGUKKy8vIE9NUF93b3JrICAgICAgICAgICAgICAgLS0gRWxhcHNlZCB0aW1lIGluIGNvZGUgZGlzcGF0Y2hlZCBieSBhIGZvcmsgKG1lYXN1cmVkIGluIHRoZSB0aHJlYWQpCisvLyBPTVBfYmFycmllciAgICAgICAgICAgIC0tIFRpbWUgYXQgInJlYWwiIGJhcnJpZXJzIChpbmNsdWRlcyB0YXNrIHRpbWUpCisvLyBGT1Jfc3RhdGljX3NjaGVkdWxpbmcgIC0tIFRpbWUgc3BlbnQgZG9pbmcgc2NoZWR1bGluZyBmb3IgYSBzdGF0aWMgImZvciIKKy8vIEZPUl9keW5hbWljX3NjaGVkdWxpbmcgLS0gVGltZSBzcGVudCBkb2luZyBzY2hlZHVsaW5nIGZvciBhIGR5bmFtaWMgImZvciIKKy8vIE9NUF9pZGxlICAgICAgICAgICAgICAgLS0gV29ya2VyIHRocmVhZHMgdGltZSBzcGVudCB3YWl0aW5nIGZvciBpbmNsdXNpb24gaW4gYSBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wbGFpbl9iYXJyaWVyICAgICAgLS0gVGltZSBzcGVudCBpbiBhIGJhcnJpZXIgY29uc3RydWN0CisvLyBPTVBfZm9ya19qb2luX2JhcnJpZXIgIC0tIFRpbWUgc3BlbnQgaW4gYSB0aGUgZm9yay1qb2luIGJhcnJpZXIgc3Vycm91bmRpbmcgYSBwYXJhbGxlbCByZWdpb24KKy8vIE9NUF9wYXJhbGxlbCAgICAgICAgICAgLS0gVGltZSBzcGVudCBpbnNpZGUgYSBwYXJhbGxlbCBjb25zdHJ1Y3QKKy8vIE9NUF90YXNrX2ltbWVkaWF0ZSAgICAgLS0gVGltZSBzcGVudCBleGVjdXRpbmcgbm9uLWRlZmVycmVkIHRhc2tzCisvLyBPTVBfdGFza190YXNrd2FpdCAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t3YWl0IGNvbnN0cnVjdAorLy8gT01QX3Rhc2tfdGFza3lpZWxkICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSB0YXNreWllbGQgY29uc3RydWN0CisvLyBPTVBfdGFza190YXNrZ3JvdXAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIHRhc2t5Z3JvdXAgY29uc3RydWN0CisvLyBPTVBfdGFza19qb2luX2JhciAgICAgIC0tIFRpbWUgc3BlbnQgZXhlY3V0aW5nIHRhc2tzIGluc2lkZSBhIGpvaW4gYmFycmllcgorLy8gT01QX3Rhc2tfcGxhaW5fYmFyICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyB0YXNrcyBpbnNpZGUgYSBiYXJyaWVyIGNvbnN0cnVjdAorLy8gT01QX3NpbmdsZSAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJzaW5nbGUiIHJlZ2lvbgorLy8gT01QX21hc3RlciAgICAgICAgICAgICAtLSBUaW1lIHNwZW50IGV4ZWN1dGluZyBhICJtYXN0ZXIiIHJlZ2lvbgorLy8gT01QX3NldF9udW10aHJlYWRzICAgICAtLSBWYWx1ZXMgcGFzc2VkIHRvIG9tcF9zZXRfbnVtX3RocmVhZHMKKy8vIE9NUF9QQVJBTExFTF9hcmdzICAgICAgLS0gTnVtYmVyIG9mIGFyZ3VtZW50cyBwYXNzZWQgdG8gYSBwYXJhbGxlbCByZWdpb24KKy8vIEZPUl9zdGF0aWNfaXRlcmF0aW9ucyAgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIHN0YXRpYyBmb3IKKy8vIEZPUl9keW5hbWljX2l0ZXJhdGlvbnMgLS0gTnVtYmVyIG9mIGF2YWlsYWJsZSBwYXJhbGxlbCBjaHVua3Mgb2Ygd29yayBpbiBhIGR5bmFtaWMgZm9yCisvLyAgICAgICAgICAgICAgICAgICAgICAgICAgIEJvdGggYWRqdXN0IGZvciBhbnkgY2h1bmtpbmcsIHNvIGlmIHRoZXJlIHdlcmUgYW4gaXRlcmF0aW9uIGNvdW50IG9mIDIwIGJ1dCBhIGNodW5rIHNpemUgb2YgMTAsIHdlJ2QgcmVjb3JkIDIuCisKKyNpZiAoS01QX0RFVkVMT1BFUl9TVEFUUykKKy8vIFRpbWVycyB3aGljaCBhcmUgb2YgaW50ZXJlc3QgdG8gcnVudGltZSBsaWJyYXJ5IGRldmVsb3BlcnMsIG5vdCBlbmQgdXNlcnMuCisvLyBUaGVzZSBoYXZlIHRvIGJlIGV4cGxpY2l0bHkgZW5hYmxlZCBpbiBhZGRpdGlvbiB0byB0aGUgb3RoZXIgc3RhdHMuCisKKy8vIEtNUF9mb3JrX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9mb3JrX2JhcnJpZXIKKy8vIEtNUF9qb2luX2JhcnJpZXIgICAgICAgLS0gdGltZSBpbiBfX2ttcF9qb2luX2JhcnJpZXIKKy8vIEtNUF9iYXJyaWVyICAgICAgICAgICAgLS0gdGltZSBpbiBfX2ttcF9iYXJyaWVyCisvLyBLTVBfZW5kX3NwbGl0X2JhcnJpZXIgIC0tIHRpbWUgaW4gX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIKKy8vIEtNUF9zZXR1cF9pY3ZfY29weSAgICAgLS0gdGltZSBpbiBfX2ttcF9zZXR1cF9pY3ZfY29weQorLy8gS01QX2ljdl9jb3B5ICAgICAgICAgICAtLSBzdGFydC9zdG9wIHRpbWVyIGZvciBhbnkgSUNWIGNvcHlpbmcKKy8vIEtNUF9saW5lYXJfZ2F0aGVyICAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9saW5lYXJfcmVsZWFzZSAgICAgLS0gdGltZSBpbiBfX2ttcF9saW5lYXJfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfdHJlZV9nYXRoZXIgICAgICAgIC0tIHRpbWUgaW4gX19rbXBfdHJlZV9iYXJyaWVyX2dhdGhlcgorLy8gS01QX3RyZWVfcmVsZWFzZSAgICAgICAtLSB0aW1lIGluIF9fa21wX3RyZWVfYmFycmllcl9yZWxlYXNlCisvLyBLTVBfaHlwZXJfZ2F0aGVyICAgICAgIC0tIHRpbWUgaW4gX19rbXBfaHlwZXJfYmFycmllcl9nYXRoZXIKKy8vIEtNUF9oeXBlcl9yZWxlYXNlICAgICAgLS0gdGltZSBpbiBfX2ttcF9oeXBlcl9iYXJyaWVyX3JlbGVhc2UKKyMgZGVmaW5lIEtNUF9GT1JFQUNIX0RFVkVMT1BFUl9USU1FUihtYWNybywgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2ZvcmtfY2FsbCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2pvaW5fY2FsbCwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2ZvcmtfYmFycmllciwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2pvaW5fYmFycmllciwgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2VuZF9zcGxpdF9iYXJyaWVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2hpZXJfZ2F0aGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2hpZXJfcmVsZWFzZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2h5cGVyX2dhdGhlciwgIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2h5cGVyX3JlbGVhc2UsICBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2xpbmVhcl9nYXRoZXIsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX2xpbmVhcl9yZWxlYXNlLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX3RyZWVfZ2F0aGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX3RyZWVfcmVsZWFzZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9tYXN0ZXJfaW52b2tlLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl93b3JrZXJfaW52b2tlLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9yZXN1bWUsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9zdXNwZW5kLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKSAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9sYXVuY2hfdGhyZWFkX2xvb3AsIHN0YXRzX2ZsYWdzX2U6OmxvZ0V2ZW50LCBhcmcpICAgICAgIFwKKyAgICBtYWNybyAoS01QX2FsbG9jYXRlX3RlYW0sIDAsIGFyZykgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoS01QX3NldHVwX2ljdl9jb3B5LCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyAoVVNFUl9pY3ZfY29weSwgMCwgYXJnKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9GT1JFQUNIX0RFVkVMT1BFUl9USU1FUihtYWNybywgYXJnKQorI2VuZGlmCisKKy8qIQorICogXGJyaWVmIEFkZCBuZXcgZXhwbGljaXQgdGltZXJzIHVuZGVyIEtNUF9GT1JFQUNIX0VYUExJQ0lUX1RJTUVSKCkgbWFjcm8uCisgKgorICogQHBhcmFtIG1hY3JvIGEgdXNlciBkZWZpbmVkIG1hY3JvIHRoYXQgdGFrZXMgdGhyZWUgYXJndW1lbnRzIC0gbWFjcm8oVElNRVJfTkFNRSwgZmxhZ3MsIGFyZykKKyAqIEBwYXJhbSBhcmcgYSB1c2VyIGRlZmluZWQgYXJndW1lbnQgdG8gc2VuZCB0byB0aGUgdXNlciBkZWZpbmVkIG1hY3JvCisgKgorICogXHdhcm5pbmcgWU9VIE1VU1QgSEFWRSBUSEUgU0FNRSBOQU1FRCBUSU1FUiBVTkRFUiBLTVBfRk9SRUFDSF9USU1FUigpIE9SIEVMU0UgQkFEIFRISU5HUyBXSUxMIEhBUFBFTiEKKyAqCisgKiBcZGV0YWlscyBFeHBsaWNpdCB0aW1lcnMgYXJlIG9uZXMgd2hlcmUgd2UgbmVlZCB0byBhbGxvY2F0ZSBhIHRpbWVyIGl0c2VsZiAoYXMgd2VsbCBhcyB0aGUgYWNjdW11bGF0ZWQgdGltaW5nIHN0YXRpc3RpY3MpLgorICogV2UgYWxsb2NhdGUgdGhlc2Ugb24gYSBwZXItdGhyZWFkIGJhc2lzLCBhbmQgZXhwbGljaXRseSBzdGFydCBhbmQgc3RvcCB0aGVtLgorICogQmxvY2sgdGltZXJzIGp1c3QgYWxsb2NhdGUgdGhlIHRpbWVyIGl0c2VsZiBvbiB0aGUgc3RhY2ssIGFuZCB1c2UgdGhlIGRlc3RydWN0b3IgdG8gbm90aWNlIGJsb2NrIGV4aXQ7IHRoZXkgZG9uJ3QKKyAqIG5lZWQgdG8gYmUgZGVmaW5lZCBoZXJlLgorICogVGhlIG5hbWUgaGVyZSBzaG91bGQgYmUgdGhlIHNhbWUgYXMgdGhhdCBvZiBhIHRpbWVyIGFib3ZlLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIobWFjcm8sIGFyZykgICAgIFwKKyAgICBtYWNybyhPTVBfd29ya2VyX3RocmVhZF9saWZlLCAwLCBhcmcpICAgICAgICAgIFwKKyAgICBtYWNybyhGT1Jfc3RhdGljX3NjaGVkdWxpbmcsIDAsIGFyZykgICAgICAgICAgIFwKKyAgICBtYWNybyhGT1JfZHluYW1pY19zY2hlZHVsaW5nLCAwLCBhcmcpICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfY3JpdGljYWwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfY3JpdGljYWxfd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfc2luZ2xlLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfbWFzdGVyLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfaWRsZSwgMCwgYXJnKSAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfcGxhaW5fYmFycmllciwgMCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfZm9ya19qb2luX2JhcnJpZXIsIDAsIGFyZykgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfcGFyYWxsZWwsIDAsIGFyZykgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza19pbW1lZGlhdGUsIDAsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza190YXNrd2FpdCwgMCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza190YXNreWllbGQsIDAsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza190YXNrZ3JvdXAsIDAsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza19qb2luX2JhciwgMCwgYXJnKSAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza19wbGFpbl9iYXIsIDAsIGFyZykgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfc2VyaWFsLCAwLCBhcmcpICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBtYWNybyhPTVBfdGFza2xvb3Bfc2NoZWR1bGluZywgMCwgYXJnKSAgICAgICAgIFwKKyAgICBLTVBfRk9SRUFDSF9FWFBMSUNJVF9ERVZFTE9QRVJfVElNRVIobWFjcm8sYXJnKSAgICAgXAorICAgIG1hY3JvKExBU1QsIDAsIGFyZykKKworI2lmIChLTVBfREVWRUxPUEVSX1NUQVRTKQorIyBkZWZpbmUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfREVWRUxPUEVSX1RJTUVSKG1hY3JvLCBhcmcpICAgICAgICAgICAgICAgXAorICAgIG1hY3JvKFVTRVJfbGF1bmNoX3RocmVhZF9sb29wLCBzdGF0c19mbGFnc19lOjpsb2dFdmVudCwgYXJnKQorI2Vsc2UKKyMgZGVmaW5lIEtNUF9GT1JFQUNIX0VYUExJQ0lUX0RFVkVMT1BFUl9USU1FUihtYWNybywgYXJnKQorI2VuZGlmCisKKyNkZWZpbmUgRU5VTUVSQVRFKG5hbWUsaWdub3JlLHByZWZpeCkgcHJlZml4IyNuYW1lLAorZW51bSB0aW1lcl9lIHsKKyAgICBLTVBfRk9SRUFDSF9USU1FUihFTlVNRVJBVEUsIFRJTUVSXykKK307CisKK2VudW0gZXhwbGljaXRfdGltZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoRU5VTUVSQVRFLCBFWFBMSUNJVF9USU1FUl8pCit9OworCitlbnVtIGNvdW50ZXJfZSB7CisgICAgS01QX0ZPUkVBQ0hfQ09VTlRFUihFTlVNRVJBVEUsIENPVU5URVJfKQorfTsKKyN1bmRlZiBFTlVNRVJBVEUKKworY2xhc3MgdGltZXJQYWlyIHsKKyAgICBleHBsaWNpdF90aW1lcl9lIHRpbWVyX2luZGV4OworICAgIHRpbWVyX2UgdGltZXI7CisgcHVibGljOgorICAgIHRpbWVyUGFpcihleHBsaWNpdF90aW1lcl9lIHRpLCB0aW1lcl9lIHQpIDogdGltZXJfaW5kZXgodGkpLCB0aW1lcih0KSB7fQorICAgIGlubGluZSBleHBsaWNpdF90aW1lcl9lIGdldF9pbmRleCgpIGNvbnN0IHsgcmV0dXJuIHRpbWVyX2luZGV4OyB9CisgICAgaW5saW5lIHRpbWVyX2UgZ2V0X3RpbWVyKCkgY29uc3QgeyByZXR1cm4gdGltZXI7IH0KKyAgICBib29sIG9wZXJhdG9yPT0oY29uc3QgdGltZXJQYWlyICYgcmhzKSB7CisgICAgICAgIHJldHVybiB0aGlzLT5nZXRfaW5kZXgoKSA9PSByaHMuZ2V0X2luZGV4KCk7CisgICAgfQorICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCB0aW1lclBhaXIgJiByaHMpIHsKKyAgICAgICAgcmV0dXJuICEoKnRoaXMgPT0gcmhzKTsKKyAgICB9Cit9OworCitjbGFzcyBzdGF0aXN0aWMKK3sKKyAgICBkb3VibGUgICBtaW5WYWw7CisgICAgZG91YmxlICAgbWF4VmFsOworICAgIGRvdWJsZSAgIG1lYW5WYWw7CisgICAgZG91YmxlICAgbTI7CisgICAgdWludDY0X3Qgc2FtcGxlQ291bnQ7CisKKyBwdWJsaWM6CisgICAgc3RhdGlzdGljKCkgeyByZXNldCgpOyB9CisgICAgc3RhdGlzdGljIChzdGF0aXN0aWMgY29uc3QgJm8pOiBtaW5WYWwoby5taW5WYWwpLCBtYXhWYWwoby5tYXhWYWwpLCBtZWFuVmFsKG8ubWVhblZhbCksIG0yKG8ubTIpLCBzYW1wbGVDb3VudChvLnNhbXBsZUNvdW50KSB7fQorCisgICAgZG91YmxlICAgZ2V0TWluKCkgICBjb25zdCB7IHJldHVybiBtaW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNZWFuKCkgIGNvbnN0IHsgcmV0dXJuIG1lYW5WYWw7IH0KKyAgICBkb3VibGUgICBnZXRNYXgoKSAgIGNvbnN0IHsgcmV0dXJuIG1heFZhbDsgfQorICAgIHVpbnQ2NF90IGdldENvdW50KCkgY29uc3QgeyByZXR1cm4gc2FtcGxlQ291bnQ7IH0KKyAgICBkb3VibGUgICBnZXRTRCgpICAgIGNvbnN0IHsgcmV0dXJuIHNxcnQobTIvc2FtcGxlQ291bnQpOyB9CisgICAgZG91YmxlICAgZ2V0VG90YWwoKSBjb25zdCB7IHJldHVybiBzYW1wbGVDb3VudCptZWFuVmFsOyB9CisKKyAgICB2b2lkIHJlc2V0KCkKKyAgICB7CisgICAgICAgIG1pblZhbCA9ICBzdGQ6Om51bWVyaWNfbGltaXRzPGRvdWJsZT46Om1heCgpOworICAgICAgICBtYXhWYWwgPSAtc3RkOjpudW1lcmljX2xpbWl0czxkb3VibGU+OjptYXgoKTsKKyAgICAgICAgbWVhblZhbD0gMC4wOworICAgICAgICBtMiAgICAgPSAwLjA7CisgICAgICAgIHNhbXBsZUNvdW50ID0gMDsKKyAgICB9CisgICAgdm9pZCBhZGRTYW1wbGUoZG91YmxlIHNhbXBsZSk7CisgICAgdm9pZCBzY2FsZSAgICAoZG91YmxlIGZhY3Rvcik7CisgICAgdm9pZCBzY2FsZURvd24oZG91YmxlIGYpICB7IHNjYWxlICgxLi9mKTsgfQorICAgIHN0YXRpc3RpYyAmIG9wZXJhdG9yKz0gKHN0YXRpc3RpYyBjb25zdCAmIG90aGVyKTsKKworICAgIHN0ZDo6c3RyaW5nIGZvcm1hdChjaGFyIHVuaXQsIGJvb2wgdG90YWw9ZmFsc2UpIGNvbnN0OworfTsKKworc3RydWN0IHN0YXRJbmZvCit7CisgICAgY29uc3QgY2hhciAqIG5hbWU7CisgICAgdWludDMyX3QgICAgIGZsYWdzOworfTsKKworY2xhc3MgdGltZVN0YXQgOiBwdWJsaWMgc3RhdGlzdGljCit7CisgICAgc3RhdGljIHN0YXRJbmZvIHRpbWVySW5mb1tdOworCisgcHVibGljOgorICAgIHRpbWVTdGF0KCkgOiBzdGF0aXN0aWMoKSB7fQorICAgIHN0YXRpYyBjb25zdCBjaGFyICogbmFtZSh0aW1lcl9lIGUpIHsgcmV0dXJuIHRpbWVySW5mb1tlXS5uYW1lOyB9CisgICAgc3RhdGljIGJvb2wgIG5vVG90YWwgICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Ub3RhbDsgICAgICB9CisgICAgc3RhdGljIGJvb2wgIG1hc3Rlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9CisgICAgc3RhdGljIGJvb2wgIHdvcmtlck9ubHkgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm90SW5NYXN0ZXI7ICB9CisgICAgc3RhdGljIGJvb2wgIG5vVW5pdHMgICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bm9Vbml0czsgICAgICB9CisgICAgc3RhdGljIGJvb2wgIGxvZ0V2ZW50ICAgKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQ7ICAgICB9CisgICAgc3RhdGljIHZvaWQgIGNsZWFyRXZlbnRGbGFncygpICAgICAgeworICAgICAgICBmb3IoaW50IGk9MDtpPFRJTUVSX0xBU1Q7aSsrKSB7CisgICAgICAgICAgICB0aW1lckluZm9baV0uZmxhZ3MgJj0gKH4oc3RhdHNfZmxhZ3NfZTo6bG9nRXZlbnQpKTsKKyAgICAgICAgfQorICAgIH0KK307CisKKy8vIFdoZXJlIHdlIG5lZWQgZXhwbGljaXRseSB0byBzdGFydCBhbmQgZW5kIHRoZSB0aW1lciwgdGhpcyB2ZXJzaW9uIGNhbiBiZSB1c2VkCisvLyBTaW5jZSB0aGVzZSB0aW1lcnMgbm9ybWFsbHkgYXJlbid0IG5pY2VseSBzY29wZWQsIHNvIGRvbid0IGhhdmUgYSBnb29kIHBsYWNlIHRvIGxpdmUKKy8vIG9uIHRoZSBzdGFjayBvZiB0aGUgdGhyZWFkLCB0aGV5J3JlIG1vcmUgd29yayB0byB1c2UuCitjbGFzcyBleHBsaWNpdFRpbWVyCit7CisgICAgdGltZVN0YXQgKiBzdGF0OworICAgIHRzY190aWNrX2NvdW50IHN0YXJ0VGltZTsKKyAgICB0c2NfdGlja19jb3VudCBwYXVzZVN0YXJ0VGltZTsKKyAgICB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QgdG90YWxQYXVzZVRpbWU7CisKKyBwdWJsaWM6CisgICAgZXhwbGljaXRUaW1lciAoKSA6IHN0YXQoMCksIHN0YXJ0VGltZSgwKSwgcGF1c2VTdGFydFRpbWUoMCksIHRvdGFsUGF1c2VUaW1lKCkgeyB9CisgICAgZXhwbGljaXRUaW1lciAodGltZVN0YXQgKiBzKSA6IHN0YXQocyksIHN0YXJ0VGltZSgpLCBwYXVzZVN0YXJ0VGltZSgwKSwgdG90YWxQYXVzZVRpbWUoKSB7IH0KKworICAgIHZvaWQgc2V0U3RhdCAodGltZVN0YXQgKnMpIHsgc3RhdCA9IHM7IH0KKyAgICB2b2lkIHN0YXJ0KHRpbWVyX2UgdGltZXJFbnVtVmFsdWUpOworICAgIHZvaWQgcGF1c2UoKSB7IHBhdXNlU3RhcnRUaW1lID0gdHNjX3RpY2tfY291bnQ6Om5vdygpOyB9CisgICAgdm9pZCByZXN1bWUoKSB7IHRvdGFsUGF1c2VUaW1lICs9ICh0c2NfdGlja19jb3VudDo6bm93KCkgLSBwYXVzZVN0YXJ0VGltZSk7IH0KKyAgICB2b2lkIHN0b3AodGltZXJfZSB0aW1lckVudW1WYWx1ZSk7CisgICAgdm9pZCByZXNldCgpIHsgc3RhcnRUaW1lID0gMDsgcGF1c2VTdGFydFRpbWUgPSAwOyB0b3RhbFBhdXNlVGltZSA9IDA7IH0KK307CisKKy8vIFdoZXJlIGFsbCB5b3UgbmVlZCBpcyB0byB0aW1lIGEgYmxvY2ssIHRoaXMgaXMgZW5vdWdoLgorLy8gKEl0IGF2b2lkcyB0aGUgbmVlZCB0byBoYXZlIGFuIGV4cGxpY2l0IGVuZCwgbGVhdmluZyB0aGUgc2NvcGUgc3VmZmljZXMuKQorY2xhc3MgYmxvY2tUaW1lciA6IHB1YmxpYyBleHBsaWNpdFRpbWVyCit7CisgICAgdGltZXJfZSB0aW1lckVudW1WYWx1ZTsKKyBwdWJsaWM6CisgICAgYmxvY2tUaW1lciAodGltZVN0YXQgKiBzLCB0aW1lcl9lIG5ld1RpbWVyRW51bVZhbHVlKSA6IHRpbWVyRW51bVZhbHVlKG5ld1RpbWVyRW51bVZhbHVlKSwgZXhwbGljaXRUaW1lcihzKSB7IHN0YXJ0KHRpbWVyRW51bVZhbHVlKTsgfQorICAgIH5ibG9ja1RpbWVyKCkgeyBzdG9wKHRpbWVyRW51bVZhbHVlKTsgfQorfTsKKworLy8gV2hlcmUgeW91IG5lZWQgdG8gcGFydGl0aW9uIGEgdGhyZWFkcyBjbG9jayB0aWNrcyBpbnRvIHNlcGFyYXRlIHN0YXRlcworLy8gZS5nLiwgYSBwYXJ0aXRpb25lZFRpbWVycyBjbGFzcyB3aXRoIHR3byB0aW1lcnMgb2YgRVhFQ1VUSU5HX1RBU0ssIGFuZAorLy8gICBET0lOR19OT1RISU5HIHdvdWxkIHJlbmRlciB0aGVzZSBjb25kaXRpb25zOgorLy8gICB0aW1lKEVYRUNVVElOR19UQVNLKSArIHRpbWUoRE9JTkdfTk9USElORykgPSB0b3RhbCB0aW1lIHRocmVhZCBpcyBhbGl2ZQorLy8gICBObyBjbG9jayB0aWNrIGluIHRoZSBFWEVDVVRJTkdfVEFTSyBpcyBhIG1lbWJlciBvZiBET0lOR19OT1RISU5HIGFuZCB2aWNlIHZlcnNhCitjbGFzcyBwYXJ0aXRpb25lZFRpbWVycworeworIHByaXZhdGU6CisgICAgZXhwbGljaXRUaW1lciogdGltZXJzW0VYUExJQ0lUX1RJTUVSX0xBU1QrMV07CisgICAgc3RkOjp2ZWN0b3I8dGltZXJQYWlyPiB0aW1lcl9zdGFjazsKKyBwdWJsaWM6CisgICAgcGFydGl0aW9uZWRUaW1lcnMoKTsKKyAgICB2b2lkIGFkZF90aW1lcihleHBsaWNpdF90aW1lcl9lIHRpbWVyX2luZGV4LCBleHBsaWNpdFRpbWVyKiB0aW1lcl9wb2ludGVyKTsKKyAgICB2b2lkIGluaXQodGltZXJQYWlyIHRpbWVyX2luZGV4KTsKKyAgICB2b2lkIHB1c2godGltZXJQYWlyIHRpbWVyX2luZGV4KTsKKyAgICB2b2lkIHBvcCgpOworICAgIHZvaWQgd2luZHVwKCk7Cit9OworCisvLyBTcGVjaWFsIHdyYXBwZXIgYXJvdW5kIHRoZSBwYXJ0aW9uZWQgdGltZXJzIHRvIGFpZCB0aW1pbmcgY29kZSBibG9ja3MKKy8vIEl0IGF2b2lkcyB0aGUgbmVlZCB0byBoYXZlIGFuIGV4cGxpY2l0IGVuZCwgbGVhdmluZyB0aGUgc2NvcGUgc3VmZmljZXMuCitjbGFzcyBibG9ja1BhcnRpdGlvbmVkVGltZXIKK3sKKyAgICBwYXJ0aXRpb25lZFRpbWVycyogcGFydF90aW1lcnM7CisgICAgdGltZXJQYWlyIHRpbWVyX3BhaXI7CisgcHVibGljOgorICAgIGJsb2NrUGFydGl0aW9uZWRUaW1lcihwYXJ0aXRpb25lZFRpbWVycyogcHQsIHRpbWVyUGFpciB0cCkgOiBwYXJ0X3RpbWVycyhwdCksIHRpbWVyX3BhaXIodHApIHsgcGFydF90aW1lcnMtPnB1c2godGltZXJfcGFpcik7IH0KKyAgIH5ibG9ja1BhcnRpdGlvbmVkVGltZXIoKSB7IHBhcnRfdGltZXJzLT5wb3AoKTsgfQorfTsKKworLy8gU3BlY2lhbCB3cmFwcGVyIGFyb3VuZCB0aGUgdGhyZWFkIHN0YXRlIHRvIGFpZCBpbiBrZWVwaW5nIHN0YXRlIGluIGNvZGUgYmxvY2tzCisvLyBJdCBhdm9pZHMgdGhlIG5lZWQgdG8gaGF2ZSBhbiBleHBsaWNpdCBlbmQsIGxlYXZpbmcgdGhlIHNjb3BlIHN1ZmZpY2VzLgorY2xhc3MgYmxvY2tUaHJlYWRTdGF0ZQoreworICAgIHN0YXRzX3N0YXRlX2UqIHN0YXRlX3BvaW50ZXI7CisgICAgc3RhdHNfc3RhdGVfZSAgb2xkX3N0YXRlOworIHB1YmxpYzoKKyAgICBibG9ja1RocmVhZFN0YXRlKHN0YXRzX3N0YXRlX2UqIHRocmVhZF9zdGF0ZV9wb2ludGVyLCBzdGF0c19zdGF0ZV9lIG5ld19zdGF0ZSkgOiBzdGF0ZV9wb2ludGVyKHRocmVhZF9zdGF0ZV9wb2ludGVyKSwgb2xkX3N0YXRlKCp0aHJlYWRfc3RhdGVfcG9pbnRlcikgeworICAgICAgICAqc3RhdGVfcG9pbnRlciA9IG5ld19zdGF0ZTsKKyAgICB9CisgICB+YmxvY2tUaHJlYWRTdGF0ZSgpIHsgKnN0YXRlX3BvaW50ZXIgPSBvbGRfc3RhdGU7ICB9Cit9OworCisvLyBJZiBhbGwgeW91IHdhbnQgaXMgYSBjb3VudCwgdGhlbiB5b3UgY2FuIHVzZSB0aGlzLi4uCisvLyBUaGUgaW5kaXZpZHVhbCBwZXItdGhyZWFkIGNvdW50cyB3aWxsIGJlIGFnZ3JlZ2F0ZWQgaW50byBhIHN0YXRpc3RpYyBhdCBwcm9ncmFtIGV4aXQuCitjbGFzcyBjb3VudGVyCit7CisgICAgdWludDY0X3QgdmFsdWU7CisgICAgc3RhdGljIGNvbnN0IHN0YXRJbmZvIGNvdW50ZXJJbmZvW107CisKKyBwdWJsaWM6CisgICAgY291bnRlcigpIDogdmFsdWUoMCkge30KKyAgICB2b2lkIGluY3JlbWVudCgpIHsgdmFsdWUrKzsgfQorICAgIHVpbnQ2NF90IGdldFZhbHVlKCkgY29uc3QgeyByZXR1cm4gdmFsdWU7IH0KKyAgICB2b2lkIHJlc2V0KCkgeyB2YWx1ZSA9IDA7IH0KKyAgICBzdGF0aWMgY29uc3QgY2hhciAqIG5hbWUoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLm5hbWU7IH0KKyAgICBzdGF0aWMgYm9vbCAgbWFzdGVyT25seSAoY291bnRlcl9lIGUpIHsgcmV0dXJuIGNvdW50ZXJJbmZvW2VdLmZsYWdzICYgc3RhdHNfZmxhZ3NfZTo6b25seUluTWFzdGVyOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGFuIGV2ZW50CisKKyAgICBUaGVyZSBhcmUgZm91ciBjb21wb25lbnRzIHRvIGFuIGV2ZW50OiBzdGFydCB0aW1lLCBzdG9wIHRpbWUKKyAgICBuZXN0X2xldmVsLCBhbmQgdGltZXJfbmFtZS4KKyAgICBUaGUgc3RhcnQgYW5kIHN0b3AgdGltZSBzaG91bGQgYmUgb2J2aW91cyAocmVjb3JkZWQgaW4gY2xvY2sgdGlja3MpLgorICAgIFRoZSBuZXN0X2xldmVsIHJlbGF0ZXMgdG8gdGhlIGJhciB3aWR0aCBpbiB0aGUgdGltZWxpbmUgZ3JhcGguCisgICAgVGhlIHRpbWVyX25hbWUgaXMgdXNlZCB0byBkZXRlcm1pbmUgd2hpY2ggdGltZXIgZXZlbnQgdHJpZ2dlcmVkIHRoaXMgZXZlbnQuCisKKyAgICB0aGUgaW50ZXJmYWNlIHRvIHRoaXMgY2xhc3MgaXMgdGhyb3VnaCBmb3VyIHJlYWQtb25seSBvcGVyYXRpb25zOgorICAgIDEpIGdldFN0YXJ0KCkgICAgIC0tIHJldHVybnMgdGhlIHN0YXJ0IHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAyKSBnZXRTdG9wKCkgICAgICAtLSByZXR1cm5zIHRoZSBzdG9wIHRpbWUgYXMgNjQgYml0IGludGVnZXIKKyAgICAzKSBnZXROZXN0TGV2ZWwoKSAtLSByZXR1cm5zIHRoZSBuZXN0IGxldmVsIG9mIHRoZSBldmVudAorICAgIDQpIGdldFRpbWVyTmFtZSgpIC0tIHJldHVybnMgdGhlIHRpbWVyIG5hbWUgdGhhdCB0cmlnZ2VyZWQgZXZlbnQKKworICAgICpNT1JFIE9OIE5FU1RfTEVWRUwqCisgICAgVGhlIG5lc3QgbGV2ZWwgaXMgdXNlZCBpbiB0aGUgYmFyIGdyYXBoIHRoYXQgcmVwcmVzZW50cyB0aGUgdGltZWxpbmUuCisgICAgSXRzIG1haW4gcHVycG9zZSBpcyBmb3Igc2hvd2luZyBob3cgZXZlbnRzIGFyZSBuZXN0ZWQgaW5zaWRlIGVhY2hvdGhlci4KKyAgICBGb3IgZXhhbXBsZSwgc2F5IGV2ZW50cywgQSwgQiwgYW5kIEMgYXJlIHJlY29yZGVkLiAgSWYgdGhlIHRpbWVsaW5lCisgICAgbG9va3MgbGlrZSB0aGlzOgorCitCZWdpbiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPiBUaW1lCisgICAgICAgICB8ICAgIHwgICAgICAgICAgfCAgICAgICAgfCAgICAgICAgICB8ICAgICAgICAgICAgICB8CisgICAgICAgICBBICAgIEIgICAgICAgICAgQyAgICAgICAgQyAgICAgICAgICBCICAgICAgICAgICAgICBBCisgICAgICAgc3RhcnQgc3RhcnQgICAgIHN0YXJ0ICAgICBlbmQgICAgICAgIGVuZCAgICAgICAgICAgIGVuZAorCisgICAgICAgVGhlbiBBLCBCLCBDIHdpbGwgaGF2ZSBhIG5lc3QgbGV2ZWwgb2YgMSwgMiwgMyByZXNwZWN0aXZlbHkuCisgICAgICAgVGhlc2UgdmFsdWVzIGFyZSB0aGVuIHVzZWQgdG8gY2FsY3VsYXRlIHRoZSBiYXJ3aWR0aCBzbyB5b3UgY2FuCisgICAgICAgc2VlIHRoYXQgaW5zaWRlIEEsIEIgaGFzIG9jY3VycmVkLCBhbmQgaW5zaWRlIEIsIEMgaGFzIG9jY3VycmVkLgorICAgICAgIEN1cnJlbnRseSwgdGhpcyBpcyBzaG93biB3aXRoIEEncyBiYXIgd2lkdGggYmVpbmcgbGFyZ2VyIHRoYW4gQidzCisgICAgICAgYmFyIHdpZHRoLCBhbmQgQidzIGJhciB3aWR0aCBiZWluZyBsYXJnZXIgdGhhbiBDJ3MgYmFyIHdpZHRoLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfZXZlbnQgeworICAgIHVpbnQ2NF90IHN0YXJ0OworICAgIHVpbnQ2NF90IHN0b3A7CisgICAgaW50IG5lc3RfbGV2ZWw7CisgICAgdGltZXJfZSB0aW1lcl9uYW1lOworIHB1YmxpYzoKKyAgICBrbXBfc3RhdHNfZXZlbnQoKSA6IHN0YXJ0KDApLCBzdG9wKDApLCBuZXN0X2xldmVsKDApLCB0aW1lcl9uYW1lKFRJTUVSX0xBU1QpIHt9CisgICAga21wX3N0YXRzX2V2ZW50KHVpbnQ2NF90IHN0cnQsIHVpbnQ2NF90IHN0cCwgaW50IG5zdCwgdGltZXJfZSBubWUpIDogc3RhcnQoc3RydCksIHN0b3Aoc3RwKSwgbmVzdF9sZXZlbChuc3QpLCB0aW1lcl9uYW1lKG5tZSkge30KKyAgICBpbmxpbmUgdWludDY0X3QgIGdldFN0YXJ0KCkgY29uc3QgeyByZXR1cm4gc3RhcnQ7IH0KKyAgICBpbmxpbmUgdWludDY0X3QgIGdldFN0b3AoKSBjb25zdCAgeyByZXR1cm4gc3RvcDsgIH0KKyAgICBpbmxpbmUgaW50ICAgICAgIGdldE5lc3RMZXZlbCgpIGNvbnN0IHsgcmV0dXJuIG5lc3RfbGV2ZWw7IH0KKyAgICBpbmxpbmUgdGltZXJfZSAgIGdldFRpbWVyTmFtZSgpIGNvbnN0IHsgcmV0dXJuIHRpbWVyX25hbWU7IH0KK307CisKKy8qICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICBDbGFzcyB0byBpbXBsZW1lbnQgYSBkeW5hbWljYWxseSBleHBhbmRhYmxlIGFycmF5IG9mIGV2ZW50cworCisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgfCBldmVudCAxIHwgZXZlbnQgMiB8IGV2ZW50IDMgfCBldmVudCA0IHwgLi4uIHwgZXZlbnQgTiB8CisgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBBbiBldmVudCBpcyBwdXNoZWQgb250byB0aGUgYmFjayBvZiB0aGlzIGFycmF5IGF0IGV2ZXJ5CisgICAgZXhwbGljaXRUaW1lci0+c3RvcCgpIGNhbGwuICBUaGUgZXZlbnQgcmVjb3JkcyB0aGUgdGhyZWFkICMsCisgICAgc3RhcnQgdGltZSwgc3RvcCB0aW1lLCBhbmQgbmVzdCBsZXZlbCByZWxhdGVkIHRvIHRoZSBiYXIgd2lkdGguCisKKyAgICBUaGUgZXZlbnQgdmVjdG9yIHN0YXJ0cyBhdCBzaXplIElOSVRfU0laRSBhbmQgZ3Jvd3MgKGRvdWJsZXMgaW4gc2l6ZSkKKyAgICBpZiBuZWVkZWQuICBBbiBpbXBsaWNhdGlvbiBvZiB0aGlzIGJlaGF2aW9yIGlzIHRoYXQgbG9nKE4pCisgICAgcmVhbGxvY2F0aW9ucyBhcmUgbmVlZGVkICh3aGVyZSBOIGlzIG51bWJlciBvZiBldmVudHMpLiAgSWYgeW91IHdhbnQKKyAgICB0byBhdm9pZCByZWFsbG9jYXRpb25zLCB0aGVuIHNldCBJTklUX1NJWkUgdG8gYSBsYXJnZSB2YWx1ZS4KKworICAgIHRoZSBpbnRlcmZhY2UgdG8gdGhpcyBjbGFzcyBpcyB0aHJvdWdoIHNpeCBvcGVyYXRpb25zOgorICAgIDEpIHJlc2V0KCkgLS0gc2V0cyB0aGUgaW50ZXJuYWxfc2l6ZSBiYWNrIHRvIDAgYnV0IGRvZXMgbm90IGRlYWxsb2NhdGUgYW55IG1lbW9yeQorICAgIDIpIHNpemUoKSAgLS0gcmV0dXJucyB0aGUgbnVtYmVyIG9mIHZhbGlkIGVsZW1lbnRzIGluIHRoZSB2ZWN0b3IKKyAgICAzKSBwdXNoX2JhY2soc3RhcnQsIHN0b3AsIG5lc3QsIHRpbWVyX25hbWUpIC0tIHB1c2hlcyBhbiBldmVudCBvbnRvCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgYmFjayBvZiB0aGUgYXJyYXkKKyAgICA0KSBkZWFsbG9jYXRlKCkgLS0gZnJlZXMgYWxsIG1lbW9yeSBhc3NvY2lhdGVkIHdpdGggdGhlIHZlY3RvcgorICAgIDUpIHNvcnQoKSAtLSBzb3J0cyB0aGUgdmVjdG9yIGJ5IHN0YXJ0IHRpbWUKKyAgICA2KSBvcGVyYXRvcltpbmRleF0gb3IgYXQoaW5kZXgpIC0tIHJldHVybnMgZXZlbnQgcmVmZXJlbmNlIGF0IHRoYXQgaW5kZXgKKworKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworY2xhc3Mga21wX3N0YXRzX2V2ZW50X3ZlY3RvciB7CisgICAga21wX3N0YXRzX2V2ZW50KiBldmVudHM7CisgICAgaW50IGludGVybmFsX3NpemU7CisgICAgaW50IGFsbG9jYXRlZF9zaXplOworICAgIHN0YXRpYyBjb25zdCBpbnQgSU5JVF9TSVpFID0gMTAyNDsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2V2ZW50X3ZlY3RvcigpIHsKKyAgICAgICAgZXZlbnRzID0gKGttcF9zdGF0c19ldmVudCopX19rbXBfYWxsb2NhdGUoc2l6ZW9mKGttcF9zdGF0c19ldmVudCkqSU5JVF9TSVpFKTsKKyAgICAgICAgaW50ZXJuYWxfc2l6ZSA9IDA7CisgICAgICAgIGFsbG9jYXRlZF9zaXplID0gSU5JVF9TSVpFOworICAgIH0KKyAgIH5rbXBfc3RhdHNfZXZlbnRfdmVjdG9yKCkge30KKyAgICBpbmxpbmUgdm9pZCByZXNldCgpIHsgaW50ZXJuYWxfc2l6ZSA9IDA7IH0KKyAgICBpbmxpbmUgaW50ICBzaXplKCkgY29uc3QgeyByZXR1cm4gaW50ZXJuYWxfc2l6ZTsgfQorICAgIHZvaWQgcHVzaF9iYWNrKHVpbnQ2NF90IHN0YXJ0X3RpbWUsIHVpbnQ2NF90IHN0b3BfdGltZSwgaW50IG5lc3RfbGV2ZWwsIHRpbWVyX2UgbmFtZSkgeworICAgICAgICBpbnQgaTsKKyAgICAgICAgaWYoaW50ZXJuYWxfc2l6ZSA9PSBhbGxvY2F0ZWRfc2l6ZSkgeworICAgICAgICAgICAga21wX3N0YXRzX2V2ZW50KiB0bXAgPSAoa21wX3N0YXRzX2V2ZW50KilfX2ttcF9hbGxvY2F0ZShzaXplb2Yoa21wX3N0YXRzX2V2ZW50KSphbGxvY2F0ZWRfc2l6ZSoyKTsKKyAgICAgICAgICAgIGZvcihpPTA7aTxpbnRlcm5hbF9zaXplO2krKykgdG1wW2ldID0gZXZlbnRzW2ldOworICAgICAgICAgICAgX19rbXBfZnJlZShldmVudHMpOworICAgICAgICAgICAgZXZlbnRzID0gdG1wOworICAgICAgICAgICAgYWxsb2NhdGVkX3NpemUqPTI7CisgICAgICAgIH0KKyAgICAgICAgZXZlbnRzW2ludGVybmFsX3NpemVdID0ga21wX3N0YXRzX2V2ZW50KHN0YXJ0X3RpbWUsIHN0b3BfdGltZSwgbmVzdF9sZXZlbCwgbmFtZSk7CisgICAgICAgIGludGVybmFsX3NpemUrKzsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICB2b2lkIGRlYWxsb2NhdGUoKTsKKyAgICB2b2lkIHNvcnQoKTsKKyAgICBjb25zdCBrbXBfc3RhdHNfZXZlbnQgJiBvcGVyYXRvcltdKGludCBpbmRleCkgY29uc3QgeyByZXR1cm4gZXZlbnRzW2luZGV4XTsgfQorICAgICAgICAgIGttcF9zdGF0c19ldmVudCAmIG9wZXJhdG9yW10oaW50IGluZGV4KSB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9CisgICAgY29uc3Qga21wX3N0YXRzX2V2ZW50ICYgYXQoaW50IGluZGV4KSBjb25zdCB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9CisgICAgICAgICAga21wX3N0YXRzX2V2ZW50ICYgYXQoaW50IGluZGV4KSB7IHJldHVybiBldmVudHNbaW5kZXhdOyB9Cit9OworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgQ2xhc3MgdG8gaW1wbGVtZW50IGEgZG91Ymx5LWxpbmtlZCwgY2lyY3VsYXIsIHN0YXRpc3RpY3MgbGlzdAorCisgICAgfC0tLXwgLS0tPiB8LS0tfCAtLS0+IHwtLS18IC0tLT4gfC0tLXwgLS0tPiAuLi4gbmV4dAorICAgIHwgICB8ICAgICAgfCAgIHwgICAgICB8ICAgfCAgICAgIHwgICB8CisgICAgfC0tLXwgPC0tLSB8LS0tfCA8LS0tIHwtLS18IDwtLS0gfC0tLXwgPC0tLSAuLi4gcHJldgorICAgIFNlbnRpbmVsICAgZmlyc3QgICAgICBzZWNvbmQgICAgIHRoaXJkCisgICAgTm9kZSAgICAgICBub2RlICAgICAgIG5vZGUgICAgICAgbm9kZQorCisgICAgVGhlIFNlbnRpbmVsIE5vZGUgaXMgdGhlIHVzZXIgaGFuZGxlIG9uIHRoZSBsaXN0LgorICAgIFRoZSBmaXJzdCBub2RlIGNvcnJlc3BvbmRzIHRvIHRocmVhZCAwJ3Mgc3RhdGlzdGljcy4KKyAgICBUaGUgc2Vjb25kIG5vZGUgY29ycmVzcG9uZHMgdG8gdGhyZWFkIDEncyBzdGF0aXN0aWNzIGFuZCBzbyBvbi4uLgorCisgICAgRWFjaCBub2RlIGhhcyBhIF90aW1lcnMsIF9jb3VudGVycywgYW5kIF9leHBsaWNpdFRpbWVycyBhcnJheSB0bworICAgIGhvbGQgdGhhdCB0aHJlYWQncyBzdGF0aXN0aWNzLiAgVGhlIF9leHBsaWNpdFRpbWVycworICAgIHBvaW50IHRvIHRoZSBjb3JyZWN0IF90aW1lciBhbmQgdXBkYXRlIGl0cyBzdGF0aXN0aWNzIGF0IGV2ZXJ5IHN0b3AoKSBjYWxsLgorICAgIFRoZSBleHBsaWNpdFRpbWVycycgcG9pbnRlcnMgYXJlIHNldCB1cCBpbiB0aGUgY29uc3RydWN0b3IuCisgICAgRWFjaCBub2RlIGFsc28gaGFzIGFuIGV2ZW50IHZlY3RvciB0byBob2xkIHRoYXQgdGhyZWFkJ3MgdGltaW5nIGV2ZW50cy4KKyAgICBUaGUgZXZlbnQgdmVjdG9yIGV4cGFuZHMgYXMgbmVjZXNzYXJ5IGFuZCByZWNvcmRzIHRoZSBzdGFydC1zdG9wIHRpbWVzCisgICAgZm9yIGVhY2ggdGltZXIuCisKKyAgICBUaGUgbmVzdExldmVsIHZhcmlhYmxlIGlzIGZvciBwbG90dGluZyBldmVudHMgYW5kIGlzIHJlbGF0ZWQKKyAgICB0byB0aGUgYmFyIHdpZHRoIGluIHRoZSB0aW1lbGluZSBncmFwaC4KKworICAgIEV2ZXJ5IHRocmVhZCB3aWxsIGhhdmUgYSBfX3RocmVhZCBsb2NhbCBwb2ludGVyIHRvIGl0cyBub2RlIGluCisgICAgdGhlIGxpc3QuICBUaGUgc2VudGluZWwgbm9kZSBpcyB1c2VkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHRvCisgICAgc3RvcmUgImR1bW15IiBzdGF0aXN0aWNzIGJlZm9yZSBfX2ttcF9jcmVhdGVfd29ya2VyKCkgaXMgY2FsbGVkLgorCisqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqICovCitjbGFzcyBrbXBfc3RhdHNfbGlzdCB7CisgICAgaW50IGd0aWQ7CisgICAgdGltZVN0YXQgICAgICBfdGltZXJzW1RJTUVSX0xBU1QrMV07CisgICAgY291bnRlciAgICAgICBfY291bnRlcnNbQ09VTlRFUl9MQVNUKzFdOworICAgIGV4cGxpY2l0VGltZXIgX2V4cGxpY2l0VGltZXJzW0VYUExJQ0lUX1RJTUVSX0xBU1QrMV07CisgICAgcGFydGl0aW9uZWRUaW1lcnMgX3BhcnRpdGlvbmVkVGltZXJzOworICAgIGludCAgICAgICAgICAgX25lc3RMZXZlbDsgLy8gb25lIHBlciB0aHJlYWQKKyAgICBrbXBfc3RhdHNfZXZlbnRfdmVjdG9yIF9ldmVudF92ZWN0b3I7CisgICAga21wX3N0YXRzX2xpc3QqIG5leHQ7CisgICAga21wX3N0YXRzX2xpc3QqIHByZXY7CisgICAgc3RhdHNfc3RhdGVfZSBzdGF0ZTsKKyAgICBpbnQgdGhyZWFkX2lzX2lkbGVfZmxhZzsKKyBwdWJsaWM6CisgICAga21wX3N0YXRzX2xpc3QoKSA6IF9uZXN0TGV2ZWwoMCksIF9ldmVudF92ZWN0b3IoKSwgbmV4dCh0aGlzKSwgcHJldih0aGlzKSwKKyAgICAgIHN0YXRlKElETEUpLCB0aHJlYWRfaXNfaWRsZV9mbGFnKDApIHsKKyNkZWZpbmUgZG9Jbml0KG5hbWUsaWdub3JlMSxpZ25vcmUyKSBcCisgICAgICAgIGdldEV4cGxpY2l0VGltZXIoRVhQTElDSVRfVElNRVJfIyNuYW1lKS0+c2V0U3RhdChnZXRUaW1lcihUSU1FUl8jI25hbWUpKTsgXAorICAgICAgICBfcGFydGl0aW9uZWRUaW1lcnMuYWRkX3RpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgZ2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpKTsKKyAgICAgICAgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoZG9Jbml0LDApOworI3VuZGVmIGRvSW5pdAorICAgIH0KKyAgIH5rbXBfc3RhdHNfbGlzdCgpIHsgfQorICAgIGlubGluZSB0aW1lU3RhdCAqICAgICAgZ2V0VGltZXIodGltZXJfZSBpZHgpICAgICAgICAgICAgICAgICAgeyByZXR1cm4gJl90aW1lcnNbaWR4XTsgfQorICAgIGlubGluZSBjb3VudGVyICAqICAgICAgZ2V0Q291bnRlcihjb3VudGVyX2UgaWR4KSAgICAgICAgICAgICAgeyByZXR1cm4gJl9jb3VudGVyc1tpZHhdOyB9CisgICAgaW5saW5lIGV4cGxpY2l0VGltZXIgKiBnZXRFeHBsaWNpdFRpbWVyKGV4cGxpY2l0X3RpbWVyX2UgaWR4KSB7IHJldHVybiAmX2V4cGxpY2l0VGltZXJzW2lkeF07IH0KKyAgICBpbmxpbmUgcGFydGl0aW9uZWRUaW1lcnMgKiBnZXRQYXJ0aXRpb25lZFRpbWVycygpICAgICAgICAgICAgIHsgcmV0dXJuICZfcGFydGl0aW9uZWRUaW1lcnM7IH0KKyAgICBpbmxpbmUgdGltZVN0YXQgKiAgICAgIGdldFRpbWVycygpICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF90aW1lcnM7IH0KKyAgICBpbmxpbmUgY291bnRlciAgKiAgICAgIGdldENvdW50ZXJzKCkgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9jb3VudGVyczsgfQorICAgIGlubGluZSBleHBsaWNpdFRpbWVyICogZ2V0RXhwbGljaXRUaW1lcnMoKSAgICAgICAgICAgICAgICAgICAgeyByZXR1cm4gX2V4cGxpY2l0VGltZXJzOyB9CisgICAgaW5saW5lIGttcF9zdGF0c19ldmVudF92ZWN0b3IgJiBnZXRFdmVudFZlY3RvcigpICAgICAgICAgICAgICB7IHJldHVybiBfZXZlbnRfdmVjdG9yOyB9CisgICAgaW5saW5lIHZvaWQgcmVzZXRFdmVudFZlY3RvcigpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IF9ldmVudF92ZWN0b3IucmVzZXQoKTsgfQorICAgIGlubGluZSB2b2lkIGluY3JlbWVudE5lc3RWYWx1ZSgpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeyBfbmVzdExldmVsKys7IH0KKyAgICBpbmxpbmUgaW50ICBnZXROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIF9uZXN0TGV2ZWw7IH0KKyAgICBpbmxpbmUgdm9pZCBkZWNyZW1lbnROZXN0VmFsdWUoKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgX25lc3RMZXZlbC0tOyB9CisgICAgaW5saW5lIGludCAgZ2V0R3RpZCgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiBndGlkOyB9CisgICAgaW5saW5lIHZvaWQgc2V0R3RpZChpbnQgbmV3Z3RpZCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7IGd0aWQgPSBuZXdndGlkOyB9CisgICAgaW5saW5lIHZvaWQgc2V0U3RhdGUoc3RhdHNfc3RhdGVfZSBuZXdzdGF0ZSkgICAgICAgICAgICAgICAgICB7IHN0YXRlID0gbmV3c3RhdGU7IH0KKyAgICBpbmxpbmUgc3RhdHNfc3RhdGVfZSBnZXRTdGF0ZSgpIGNvbnN0ICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHN0YXRlOyB9CisgICAgaW5saW5lIHN0YXRzX3N0YXRlX2UgKiBnZXRTdGF0ZVBvaW50ZXIoKSAgICAgICAgICAgICAgICAgICAgICB7IHJldHVybiAmc3RhdGU7IH0KKyAgICBpbmxpbmUgYm9vbCAgaXNJZGxlKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgcmV0dXJuIHRocmVhZF9pc19pZGxlX2ZsYWc9PTE7IH0KKyAgICBpbmxpbmUgdm9pZCBzZXRJZGxlRmxhZygpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGhyZWFkX2lzX2lkbGVfZmxhZyA9IDE7IH0KKyAgICBpbmxpbmUgdm9pZCByZXNldElkbGVGbGFnKCkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsgdGhyZWFkX2lzX2lkbGVfZmxhZyA9IDA7IH0KKyAgICBrbXBfc3RhdHNfbGlzdCogcHVzaF9iYWNrKGludCBndGlkKTsgLy8gcmV0dXJucyBuZXdseSBjcmVhdGVkIGxpc3Qgbm9kZQorICAgIGlubGluZSB2b2lkICAgICBwdXNoX2V2ZW50KHVpbnQ2NF90IHN0YXJ0X3RpbWUsIHVpbnQ2NF90IHN0b3BfdGltZSwgaW50IG5lc3RfbGV2ZWwsIHRpbWVyX2UgbmFtZSkgeworICAgICAgICBfZXZlbnRfdmVjdG9yLnB1c2hfYmFjayhzdGFydF90aW1lLCBzdG9wX3RpbWUsIG5lc3RfbGV2ZWwsIG5hbWUpOworICAgIH0KKyAgICB2b2lkIGRlYWxsb2NhdGUoKTsKKyAgICBjbGFzcyBpdGVyYXRvcjsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgYmVnaW4oKTsKKyAgICBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3IgZW5kKCk7CisgICAgaW50IHNpemUoKTsKKyAgICBjbGFzcyBpdGVyYXRvciB7CisgICAgICAgIGttcF9zdGF0c19saXN0KiBwdHI7CisgICAgICAgIGZyaWVuZCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmJlZ2luKCk7CisgICAgICAgIGZyaWVuZCBrbXBfc3RhdHNfbGlzdDo6aXRlcmF0b3Iga21wX3N0YXRzX2xpc3Q6OmVuZCgpOworICAgICAgcHVibGljOgorICAgICAgICBpdGVyYXRvcigpOworICAgICAgIH5pdGVyYXRvcigpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvcisrKCk7CisgICAgICAgIGl0ZXJhdG9yIG9wZXJhdG9yKysoaW50IGR1bW15KTsKKyAgICAgICAgaXRlcmF0b3Igb3BlcmF0b3ItLSgpOworICAgICAgICBpdGVyYXRvciBvcGVyYXRvci0tKGludCBkdW1teSk7CisgICAgICAgIGJvb2wgb3BlcmF0b3IhPShjb25zdCBpdGVyYXRvciAmIHJocyk7CisgICAgICAgIGJvb2wgb3BlcmF0b3I9PShjb25zdCBpdGVyYXRvciAmIHJocyk7CisgICAgICAgIGttcF9zdGF0c19saXN0KiBvcGVyYXRvciooKSBjb25zdDsgLy8gZGVyZWZlcmVuY2Ugb3BlcmF0b3IKKyAgICB9OworfTsKKworLyogKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICAgQ2xhc3MgdG8gZW5jYXBzdWxhdGUgYWxsIG91dHB1dCBmdW5jdGlvbnMgYW5kIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMKKworICAgVGhpcyBtb2R1bGUgaG9sZHMgZmlsZW5hbWVzIGZvciB2YXJpb3VzIG91dHB1dHMgKG5vcm1hbCBzdGF0cywgZXZlbnRzLCBwbG90IGZpbGUpLAorICAgYXMgd2VsbCBhcyBjb2xvcmluZyBpbmZvcm1hdGlvbiBmb3IgdGhlIHBsb3QgZmlsZS4KKworICAgVGhlIGZpbGVuYW1lcyBhbmQgZmxhZ3MgdmFyaWFibGVzIGFyZSByZWFkIGZyb20gZW52aXJvbm1lbnQgdmFyaWFibGVzLgorICAgVGhlc2UgYXJlIHJlYWQgb25jZSBieSB0aGUgY29uc3RydWN0b3Igb2YgdGhlIGdsb2JhbCB2YXJpYWJsZSBfX2ttcF9zdGF0c19vdXRwdXQKKyAgIHdoaWNoIGNhbGxzIGluaXQoKS4KKworICAgRHVyaW5nIHRoaXMgaW5pdCgpIGNhbGwsIGV2ZW50IGZsYWdzIGZvciB0aGUgdGltZVN0YXQ6OnRpbWVySW5mb1tdIGdsb2JhbCBhcnJheQorICAgYXJlIGNsZWFyZWQgaWYgS01QX1NUQVRTX0VWRU5UUyBpcyBub3QgdHJ1ZSAob24sIDEsIHllcykuCisKKyAgIFRoZSBvbmx5IGludGVyZmFjZSBmdW5jdGlvbiB0aGF0IGlzIHB1YmxpYyBpcyBvdXRwdXRTdGF0cyhoZWFkaW5nKS4gIFRoaXMgZnVuY3Rpb24KKyAgIHNob3VsZCBwcmludCBvdXQgZXZlcnl0aGluZyBpdCBuZWVkcyB0bywgZWl0aGVyIHRvIGZpbGVzIG9yIHN0ZGVyciwKKyAgIGRlcGVuZGluZyBvbiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGVzIGRlc2NyaWJlZCBiZWxvdworCisgICBFTlZJUk9OTUVOVCBWQVJJQUJMRVM6CisgICBLTVBfU1RBVFNfRklMRSAtLSBpZiBzZXQsIGFsbCBzdGF0aXN0aWNzIChub3QgZXZlbnRzKSB3aWxsIGJlIHByaW50ZWQgdG8gdGhpcyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgb3RoZXJ3aXNlLCBwcmludCB0byBzdGRlcnIKKyAgIEtNUF9TVEFUU19USFJFQURTIC0tIGlmIHNldCB0byAib24iLCB0aGVuIHdpbGwgcHJpbnQgcGVyIHRocmVhZCBzdGF0aXN0aWNzIHRvIGVpdGhlcgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NUQVRTX0ZJTEUgb3Igc3RkZXJyCisgICBLTVBfU1RBVFNfUExPVF9GSUxFIC0tIGlmIHNldCwgcHJpbnQgdGhlIHBsb3RpY3VzIHBsb3QgZmlsZSB0byB0aGlzIGZpbGVuYW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICBvdGhlcndpc2UsIHRoZSBwbG90IGZpbGUgaXMgc2VudCB0byAiZXZlbnRzLnBsdCIKKyAgIEtNUF9TVEFUU19FVkVOVFMgLS0gaWYgc2V0IHRvICJvbiIsIHRoZW4gbG9nIGV2ZW50cywgb3RoZXJ3aXNlLCBkb24ndCBsb2cgZXZlbnRzCisgICBLTVBfU1RBVFNfRVZFTlRTX0ZJTEUgLS0gaWYgc2V0LCBhbGwgZXZlbnRzIGFyZSBvdXRwdXR0ZWQgdG8gdGhpcyBmaWxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyd2lzZSwgb3V0cHV0IGlzIHNlbnQgdG8gImV2ZW50cy5kYXQiCisKKyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiogKi8KK2NsYXNzIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlIHsKKworIHB1YmxpYzoKKyAgICBzdHJ1Y3QgcmdiX2NvbG9yIHsKKyAgICAgICAgZmxvYXQgcjsKKyAgICAgICAgZmxvYXQgZzsKKyAgICAgICAgZmxvYXQgYjsKKyAgICB9OworCisgcHJpdmF0ZToKKyAgICBzdGQ6OnN0cmluZyBvdXRwdXRGaWxlTmFtZTsKKyAgICBzdGF0aWMgY29uc3QgY2hhciogZXZlbnRzRmlsZU5hbWU7CisgICAgc3RhdGljIGNvbnN0IGNoYXIqIHBsb3RGaWxlTmFtZTsKKyAgICBzdGF0aWMgaW50IHByaW50UGVyVGhyZWFkRmxhZzsKKyAgICBzdGF0aWMgaW50IHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZzsKKyAgICBzdGF0aWMgY29uc3QgcmdiX2NvbG9yIGdsb2JhbENvbG9yQXJyYXlbXTsKKyAgICBzdGF0aWMgICAgICAgcmdiX2NvbG9yIHRpbWVyQ29sb3JJbmZvW107CisKKyAgICB2b2lkIGluaXQoKTsKKyAgICBzdGF0aWMgdm9pZCBzZXR1cEV2ZW50Q29sb3JzKCk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRQbG90aWN1c0ZpbGUoKTsKKyAgICBzdGF0aWMgdm9pZCBwcmludEhlYWRlckluZm8oRklMRSAqc3RhdHNPdXQpOworICAgIHN0YXRpYyB2b2lkIHByaW50VGltZXJTdGF0cyhGSUxFICpzdGF0c091dCwgc3RhdGlzdGljIGNvbnN0ICogdGhlU3RhdHMsIHN0YXRpc3RpYyBjb25zdCAqIHRvdGFsU3RhdHMpOworICAgIHN0YXRpYyB2b2lkIHByaW50Q291bnRlclN0YXRzKEZJTEUgKnN0YXRzT3V0LCBzdGF0aXN0aWMgY29uc3QgKiB0aGVTdGF0cyk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRDb3VudGVycyhGSUxFICogc3RhdHNPdXQsIGNvdW50ZXIgY29uc3QgKiB0aGVDb3VudGVycyk7CisgICAgc3RhdGljIHZvaWQgcHJpbnRFdmVudHMoRklMRSAqIGV2ZW50c091dCwga21wX3N0YXRzX2V2ZW50X3ZlY3RvciogdGhlRXZlbnRzLCBpbnQgZ3RpZCk7CisgICAgc3RhdGljIHJnYl9jb2xvciBnZXRFdmVudENvbG9yKHRpbWVyX2UgZSkgeyByZXR1cm4gdGltZXJDb2xvckluZm9bZV07IH0KKyAgICBzdGF0aWMgdm9pZCB3aW5kdXBFeHBsaWNpdFRpbWVycygpOworICAgIGJvb2wgZXZlbnRQcmludGluZ0VuYWJsZWQoKSBjb25zdCAgICAgICAgIHsgcmV0dXJuIHByaW50UGVyVGhyZWFkRXZlbnRzRmxhZzsgfQorCisgcHVibGljOgorICAgIGttcF9zdGF0c19vdXRwdXRfbW9kdWxlKCkgeyBpbml0KCk7IH0KKyAgICB2b2lkIG91dHB1dFN0YXRzKGNvbnN0IGNoYXIqIGhlYWRpbmcpOworfTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgordm9pZCBfX2ttcF9zdGF0c19pbml0KCk7Cit2b2lkIF9fa21wX3Jlc2V0X3N0YXRzKCk7Cit2b2lkIF9fa21wX291dHB1dF9zdGF0cyhjb25zdCBjaGFyICopOwordm9pZCBfX2ttcF9hY2N1bXVsYXRlX3N0YXRzX2F0X2V4aXQodm9pZCk7CisvLyB0aHJlYWQgbG9jYWwgcG9pbnRlciB0byBzdGF0cyBub2RlIHdpdGhpbiBsaXN0CitleHRlcm4gX190aHJlYWQga21wX3N0YXRzX2xpc3QqIF9fa21wX3N0YXRzX3RocmVhZF9wdHI7CisvLyBoZWFkIHRvIHN0YXRzIGxpc3QuCitleHRlcm4ga21wX3N0YXRzX2xpc3QgX19rbXBfc3RhdHNfbGlzdDsKKy8vIGxvY2sgZm9yIF9fa21wX3N0YXRzX2xpc3QKK2V4dGVybiBrbXBfdGFzX2xvY2tfdCAgX19rbXBfc3RhdHNfbG9jazsKKy8vIHJlZmVyZW5jZSBzdGFydCB0aW1lCitleHRlcm4gdHNjX3RpY2tfY291bnQgX19rbXBfc3RhdHNfc3RhcnRfdGltZTsKKy8vIGludGVyZmFjZSB0byBvdXRwdXQKK2V4dGVybiBrbXBfc3RhdHNfb3V0cHV0X21vZHVsZSBfX2ttcF9zdGF0c19vdXRwdXQ7CisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmCisKKy8vIFNpbXBsZSwgc3RhbmRhcmQgaW50ZXJmYWNlcyB0aGF0IGRyb3Agb3V0IGNvbXBsZXRlbHkgaWYgc3RhdHMgYXJlbid0IGVuYWJsZWQKKworCisvKiEKKyAqIFxicmllZiBVc2VzIHNwZWNpZmllZCB0aW1lciAobmFtZSkgdG8gdGltZSBjb2RlIGJsb2NrLgorICoKKyAqIEBwYXJhbSBuYW1lIHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9USU1FX0JMT0NLKG5hbWUpIG1hY3JvIHRvIHRpbWUgYSBjb2RlIGJsb2NrLiAgVGhpcyB3aWxsIHJlY29yZCB0aGUgdGltZSB0YWtlbiBpbiB0aGUgYmxvY2sKKyAqIGFuZCB1c2UgdGhlIGRlc3RydWN0b3IgdG8gc3RvcCB0aGUgdGltZXIuICBDb252ZW5pZW50IQorICogV2l0aCB0aGlzIGRlZmluaXRpb24geW91IGNhbid0IGhhdmUgbW9yZSB0aGFuIG9uZSBLTVBfVElNRV9CTE9DSyBpbiB0aGUgc2FtZSBjb2RlIGJsb2NrLgorICogSSBkb24ndCB0aGluayB0aGF0J3MgYSBwcm9ibGVtLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1RJTUVfQkxPQ0sobmFtZSkgXAorICAgIGJsb2NrVGltZXIgX19CTE9DS1RJTUVfXyhfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRUaW1lcihUSU1FUl8jI25hbWUpLCBUSU1FUl8jI25hbWUpCisKKy8qIQorICogXGJyaWVmIEFkZHMgdmFsdWUgdG8gc3BlY2lmaWVkIHRpbWVyIChuYW1lKS4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfVElNRVIoKSBtYWNybworICogQHBhcmFtIHZhbHVlIGRvdWJsZSBwcmVjaXNpb24gc2FtcGxlIHZhbHVlIHRvIGFkZCB0byBzdGF0aXN0aWNzIGZvciB0aGUgdGltZXIKKyAqCisgKiBcZGV0YWlscyBVc2UgS01QX0NPVU5UX1ZBTFVFKG5hbWUsIHZhbHVlKSBtYWNybyB0byBhZGQgYSBwYXJ0aWN1bGFyIHZhbHVlIHRvIGEgdGltZXIgc3RhdGlzdGljcy4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9DT1VOVF9WQUxVRShuYW1lLCB2YWx1ZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFRpbWVyKFRJTUVSXyMjbmFtZSktPmFkZFNhbXBsZSh2YWx1ZSkKKworLyohCisgKiBcYnJpZWYgSW5jcmVtZW50cyBzcGVjaWZpZWQgY291bnRlciAobmFtZSkuCisgKgorICogQHBhcmFtIG5hbWUgY291bnRlciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfQ09VTlRFUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIEtNUF9DT1VOVF9CTE9DSyhuYW1lLCB2YWx1ZSkgbWFjcm8gdG8gaW5jcmVtZW50IGEgc3RhdGlzdGljcyBjb3VudGVyIGZvciB0aGUgZXhlY3V0aW5nIHRocmVhZC4KKyAqCisgKiBAaW5ncm91cCBTVEFUU19HQVRIRVJJTkcKKyovCisjZGVmaW5lIEtNUF9DT1VOVF9CTE9DSyhuYW1lKSBcCisgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRDb3VudGVyKENPVU5URVJfIyNuYW1lKS0+aW5jcmVtZW50KCkKKworLyohCisgKiBcYnJpZWYgIlN0YXJ0cyIgYW4gZXhwbGljaXQgdGltZXIgd2hpY2ggd2lsbCBuZWVkIGEgY29ycmVzcG9uZGluZyBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUigpIG1hY3JvLgorICoKKyAqIEBwYXJhbSBuYW1lIGV4cGxpY2l0IHRpbWVyIG5hbWUgYXMgc3BlY2lmaWVkIHVuZGVyIHRoZSBLTVBfRk9SRUFDSF9FWFBMSUNJVF9USU1FUigpIG1hY3JvCisgKgorICogXGRldGFpbHMgVXNlIHRvIHN0YXJ0IGEgdGltZXIuICBUaGlzIHdpbGwgbmVlZCBhIGNvcnJlc3BvbmRpbmcgS01QX1NUT1BfRVhQTElDSVRfVElNRVIoKQorICogbWFjcm8gdG8gc3RvcCB0aGUgdGltZXIgdW5saWtlIHRoZSBLTVBfVElNRV9CTE9DSyhuYW1lKSBtYWNybyB3aGljaCBoYXMgYW4gaW1wbGljaXQgc3RvcHBpbmcgbWFjcm8gYXQgdGhlIGVuZAorICogb2YgdGhlIGNvZGUgYmxvY2suICBBbGwgZXhwbGljaXQgdGltZXJzIGFyZSBzdG9wcGVkIGF0IGxpYnJhcnkgZXhpdCB0aW1lIGJlZm9yZSB0aGUgZmluYWwgc3RhdGlzdGljcyBhcmUgb3V0cHV0dGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRFeHBsaWNpdFRpbWVyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSktPnN0YXJ0KFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgIlN0b3BzIiBhbiBleHBsaWNpdCB0aW1lci4KKyAqCisgKiBAcGFyYW0gbmFtZSBleHBsaWNpdCB0aW1lciBuYW1lIGFzIHNwZWNpZmllZCB1bmRlciB0aGUgS01QX0ZPUkVBQ0hfRVhQTElDSVRfVElNRVIoKSBtYWNybworICoKKyAqIFxkZXRhaWxzIFVzZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSB0byBzdG9wIGEgdGltZXIuICBXaGVuIHRoaXMgaXMgZG9uZSwgdGhlIHRpbWUgYmV0d2VlbiB0aGUgbGFzdCBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobmFtZSkKKyAqIGFuZCB0aGlzIEtNUF9TVE9QX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgYmUgYWRkZWQgdG8gdGhlIHRpbWVyJ3Mgc3RhdCB2YWx1ZS4gIFRoZSB0aW1lciB3aWxsIHRoZW4gYmUgcmVzZXQuCisgKiBBZnRlciB0aGUgS01QX1NUT1BfRVhQTElDSVRfVElNRVIobmFtZSkgbWFjcm8gaXMgY2FsbGVkLCBhbm90aGVyIGNhbGwgdG8gS01QX1NUQVJUX0VYUExJQ0lUX1RJTUVSKG5hbWUpIHdpbGwgc3RhcnQgdGhlIHRpbWVyIG9uY2UgYWdhaW4uCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0RXhwbGljaXRUaW1lcihFWFBMSUNJVF9USU1FUl8jI25hbWUpLT5zdG9wKFRJTUVSXyMjbmFtZSkKKworLyohCisgKiBcYnJpZWYgT3V0cHV0cyB0aGUgY3VycmVudCB0aHJlYWQgc3RhdGlzdGljcyBhbmQgcmVzZXQgdGhlbS4KKyAqCisgKiBAcGFyYW0gaGVhZGluZ19zdHJpbmcgaGVhZGluZyBwdXQgYWJvdmUgdGhlIGZpbmFsIHN0YXRzIG91dHB1dAorICoKKyAqIFxkZXRhaWxzIEV4cGxpY2l0bHkgc3RvcHMgYWxsIHRpbWVycyBhbmQgb3V0cHV0cyBhbGwgc3RhdHMuCisgKiBFbnZpcm9ubWVudCB2YXJpYWJsZSwgYE9NUFRCX1NUQVRTRklMRT1maWxlbmFtZWAsIGNhbiBiZSB1c2VkIHRvIG91dHB1dCB0aGUgc3RhdHMgdG8gYSBmaWxlbmFtZSBpbnN0ZWFkIG9mIHN0ZGVycgorICogRW52aXJvbm1lbnQgdmFyaWFibGUsIGBPTVBUQl9TVEFUU1RIUkVBRFM9dHJ1ZXx1bmRlZmluZWRgLCBjYW4gYmUgdXNlZCB0byBvdXRwdXQgdGhyZWFkIHNwZWNpZmljIHN0YXRzCisgKiBGb3Igbm93IHRoZSBgT01QVEJfU1RBVFNUSFJFQURTYCBlbnZpcm9ubWVudCB2YXJpYWJsZSBjYW4gZWl0aGVyIGJlIGRlZmluZWQgd2l0aCBhbnkgdmFsdWUsIHdoaWNoIHdpbGwgcHJpbnQgb3V0IHRocmVhZAorICogc3BlY2lmaWMgc3RhdHMsIG9yIGl0IGNhbiBiZSB1bmRlZmluZWQgKG5vdCBzcGVjaWZpZWQgaW4gdGhlIGVudmlyb25tZW50KSBhbmQgdGhyZWFkIHNwZWNpZmljIHN0YXRzIHdvbid0IGJlIHByaW50ZWQKKyAqIEl0IHNob3VsZCBiZSBub3RlZCB0aGF0IGFsbCBzdGF0aXN0aWNzIGFyZSByZXNldCB3aGVuIHRoaXMgbWFjcm8gaXMgY2FsbGVkLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX09VVFBVVF9TVEFUUyhoZWFkaW5nX3N0cmluZykgXAorICAgIF9fa21wX291dHB1dF9zdGF0cyhoZWFkaW5nX3N0cmluZykKKworLyohCisgKiBcYnJpZWYgSW5pdGlhbGl6ZXMgdGhlIHBhcml0aW9uZWQgdGltZXJzIHRvIGJlZ2luIHdpdGggbmFtZS4KKyAqCisgKiBAcGFyYW0gbmFtZSB0aW1lciB3aGljaCB5b3Ugd2FudCB0aGlzIHRocmVhZCB0byBiZWdpbiB3aXRoCisgKgorICogQGluZ3JvdXAgU1RBVFNfR0FUSEVSSU5HCisqLworI2RlZmluZSBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMobmFtZSkgXAorICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCktPmluaXQodGltZXJQYWlyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgVElNRVJfIyNuYW1lKSkKKworI2RlZmluZSBLTVBfVElNRV9QQVJUSVRJT05FRF9CTE9DSyhuYW1lKSBcCisgICAgYmxvY2tQYXJ0aXRpb25lZFRpbWVyIF9fUEJMT0NLVElNRV9fKF9fa21wX3N0YXRzX3RocmVhZF9wdHItPmdldFBhcnRpdGlvbmVkVGltZXJzKCksIFwKKyAgICAgICAgdGltZXJQYWlyKEVYUExJQ0lUX1RJTUVSXyMjbmFtZSwgVElNRVJfIyNuYW1lKSkKKworI2RlZmluZSBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihuYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0UGFydGl0aW9uZWRUaW1lcnMoKS0+cHVzaCh0aW1lclBhaXIoRVhQTElDSVRfVElNRVJfIyNuYW1lLCBUSU1FUl8jI25hbWUpKQorCisjZGVmaW5lIEtNUF9QT1BfUEFSVElUSU9ORURfVElNRVIoKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+Z2V0UGFydGl0aW9uZWRUaW1lcnMoKS0+cG9wKCkKKworI2RlZmluZSBLTVBfU0VUX1RIUkVBRF9TVEFURShzdGF0ZV9uYW1lKSBcCisgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ci0+c2V0U3RhdGUoc3RhdGVfbmFtZSkKKworI2RlZmluZSBLTVBfR0VUX1RIUkVBRF9TVEFURSgpIFwKKyAgICBfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRTdGF0ZSgpCisKKyNkZWZpbmUgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soc3RhdGVfbmFtZSkgXAorICAgIGJsb2NrVGhyZWFkU3RhdGUgX19CVEhSRUFEU1RBVEVfXyhfX2ttcF9zdGF0c190aHJlYWRfcHRyLT5nZXRTdGF0ZVBvaW50ZXIoKSwgc3RhdGVfbmFtZSkKKworLyohCisgKiBcYnJpZWYgcmVzZXRzIGFsbCBzdGF0cyAoY291bnRlcnMgdG8gMCwgdGltZXJzIHRvIDAgZWxhcHNlZCB0aWNrcykKKyAqCisgKiBcZGV0YWlscyBSZXNldCBhbGwgc3RhdHMgZm9yIGFsbCB0aHJlYWRzLgorICoKKyAqIEBpbmdyb3VwIFNUQVRTX0dBVEhFUklORworKi8KKyNkZWZpbmUgS01QX1JFU0VUX1NUQVRTKCkgIF9fa21wX3Jlc2V0X3N0YXRzKCkKKworI2lmIChLTVBfREVWRUxPUEVSX1NUQVRTKQorIyBkZWZpbmUgS01QX1RJTUVfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgIEtNUF9USU1FX0JMT0NLKG4pCisjIGRlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX1ZBTFVFKG4sdikgICAgICAgICAgS01QX0NPVU5UX1ZBTFVFKG4sdikKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICBLTVBfQ09VTlRfQkxPQ0sobikKKyMgZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIobikKKyMgZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKQorI2Vsc2UKKy8vIE51bGwgZGVmaW5pdGlvbnMKKyMgZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9DT1VOVF9ERVZFTE9QRVJfQkxPQ0sobikgICAgICAgICAgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyMgZGVmaW5lIEtNUF9TVE9QX0RFVkVMT1BFUl9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKyNlbmRpZgorCisjZWxzZSAvLyBLTVBfU1RBVFNfRU5BQkxFRAorCisvLyBOdWxsIGRlZmluaXRpb25zCisjZGVmaW5lIEtNUF9USU1FX0JMT0NLKG4pICAgICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfVkFMVUUobix2KSAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihuKSAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfU1RPUF9FWFBMSUNJVF9USU1FUihuKSAgICAoKHZvaWQpMCkKKworI2RlZmluZSBLTVBfT1VUUFVUX1NUQVRTKGhlYWRpbmdfc3RyaW5nKSAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1JFU0VUX1NUQVRTKCkgICgodm9pZCkwKQorCisjZGVmaW5lIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhuKSAgICAgICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0NPVU5UX0RFVkVMT1BFUl9WQUxVRShuLHYpICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfQ09VTlRfREVWRUxPUEVSX0JMT0NLKG4pICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TVEFSVF9ERVZFTE9QRVJfRVhQTElDSVRfVElNRVIobikgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1NUT1BfREVWRUxPUEVSX0VYUExJQ0lUX1RJTUVSKG4pICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMobmFtZSkgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9USU1FX1BBUlRJVElPTkVEX0JMT0NLKG5hbWUpICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIobmFtZSkgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCkgICAgICAgICAgICAgKCh2b2lkKTApCisjZGVmaW5lIEtNUF9TRVRfVEhSRUFEX1NUQVRFKHN0YXRlX25hbWUpICAgICAgICAoKHZvaWQpMCkKKyNkZWZpbmUgS01QX0dFVF9USFJFQURfU1RBVEUoKSAgICAgICAgICAgICAgICAgICgodm9pZCkwKQorI2RlZmluZSBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhzdGF0ZV9uYW1lKSAgKCh2b2lkKTApCisjZW5kaWYgIC8vIEtNUF9TVEFUU19FTkFCTEVECisKKyNlbmRpZiAvLyBLTVBfU1RBVFNfSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdGF0c190aW1pbmcuY3BwCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyY2VjYzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5jcHAKQEAgLTAsMCArMSwxNDQgQEAKKy8qKiBAZmlsZSBrbXBfc3RhdHNfdGltaW5nLmNwcAorICogVGltaW5nIGZ1bmN0aW9ucworICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlIDxpb3N0cmVhbT4KKyNpbmNsdWRlIDxpb21hbmlwPgorI2luY2x1ZGUgPHNzdHJlYW0+CisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHNfdGltaW5nLmgiCisKK3VzaW5nIG5hbWVzcGFjZSBzdGQ7CisKKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyMgaWYgS01QX01JQworZG91YmxlIHRzY190aWNrX2NvdW50Ojp0aWNrX3RpbWUoKQoreworICAgIC8vIHByZXR0eSBiYWQgYXNzdW1wdGlvbiBvZiAxR0h6IGNsb2NrIGZvciBNSUMKKyAgICByZXR1cm4gMS8oKGRvdWJsZSkxMDAwKjEuZTYpOworfQorIyBlbGlmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKyMgIGluY2x1ZGUgPHN0cmluZy5oPgorLy8gRXh0cmFjdCB0aGUgdmFsdWUgZnJvbSB0aGUgQ1BVSUQgaW5mb3JtYXRpb24KK2RvdWJsZSB0c2NfdGlja19jb3VudDo6dGlja190aW1lKCkKK3sKKyAgICBzdGF0aWMgZG91YmxlIHJlc3VsdCA9IDAuMDsKKworICAgIGlmIChyZXN1bHQgPT0gMC4wKQorICAgIHsKKyAgICAgICAga21wX2NwdWlkX3QgY3B1aW5mbzsKKyAgICAgICAgY2hhciBicmFuZFsyNTZdOworCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCgweDgwMDAwMDAwLCAwLCAmY3B1aW5mbyk7CisgICAgICAgIG1lbXNldChicmFuZCwgMCwgc2l6ZW9mKGJyYW5kKSk7CisgICAgICAgIGludCBpZHMgPSBjcHVpbmZvLmVheDsKKworICAgICAgICBmb3IgKHVuc2lnbmVkIGludCBpPTI7IGk8KGlkc14weDgwMDAwMDAwKSsyOyBpKyspCisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoaSB8IDB4ODAwMDAwMDAsIDAsIChrbXBfY3B1aWRfdCopKGJyYW5kKyhpLTIpKnNpemVvZihrbXBfY3B1aWRfdCkpKTsKKworICAgICAgICBjaGFyICogc3RhcnQgPSAmYnJhbmRbMF07CisgICAgICAgIGZvciAoOypzdGFydCA9PSAnICc7IHN0YXJ0KyspCisgICAgICAgICAgICA7CisKKyAgICAgICAgY2hhciAqIGVuZCA9IGJyYW5kICsgS01QX1NUUkxFTihicmFuZCkgLSAzOworICAgICAgICB1aW50NjRfdCBtdWx0aXBsaWVyOworCisgICAgICAgIGlmICgqZW5kID09ICdNJykgbXVsdGlwbGllciA9IDEwMDBMTCoxMDAwTEw7CisgICAgICAgIGVsc2UgaWYgKCplbmQgPT0gJ0cnKSBtdWx0aXBsaWVyID0gMTAwMExMKjEwMDBMTCoxMDAwTEw7CisgICAgICAgIGVsc2UgaWYgKCplbmQgPT0gJ1QnKSBtdWx0aXBsaWVyID0gMTAwMExMKjEwMDBMTCoxMDAwTEwqMTAwMExMOworICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIkVycm9yIGRldGVybWluaW5nIG11bHRpcGxpZXIgJyIgPDwgKmVuZCA8PCAiJ1xuIjsKKyAgICAgICAgICAgIGV4aXQgKC0xKTsKKyAgICAgICAgfQorICAgICAgICAqZW5kID0gMDsKKyAgICAgICAgd2hpbGUgKCplbmQgIT0gJyAnKSBlbmQtLTsKKyAgICAgICAgZW5kKys7CisKKyAgICAgICAgZG91YmxlIGZyZXEgPSBzdHJ0b2QoZW5kLCAmc3RhcnQpOworICAgICAgICBpZiAoZnJlcSA9PSAwLjApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvdXQgPDwgIkVycm9yIGNhbGN1bGF0aW5nIGZyZXF1ZW5jeSAiIDw8ICBlbmQgPDwgIlxuIjsKKyAgICAgICAgICAgIGV4aXQgKC0xKTsKKyAgICAgICAgfQorCisgICAgICAgIHJlc3VsdCA9ICgoZG91YmxlKTEuMCkvKGZyZXEgKiBtdWx0aXBsaWVyKTsKKyAgICB9CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyMgZW5kaWYKKyNlbmRpZgorCitzdGF0aWMgYm9vbCB1c2VTSSA9IHRydWU7CisKKy8vIFJldHVybiBhIGZvcm1hdHRlZCBzdHJpbmcgYWZ0ZXIgbm9ybWFsaXNpbmcgdGhlIHZhbHVlIGludG8KKy8vIGVuZ2luZWVyaW5nIHN0eWxlIGFuZCB1c2luZyBhIHN1aXRhYmxlIHVuaXQgcHJlZml4IChlLmcuIG1zLCB1cywgbnMpLgorc3RkOjpzdHJpbmcgZm9ybWF0U0koZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgsIGNoYXIgdW5pdCkKK3sKKyAgICBzdGQ6OnN0cmluZ3N0cmVhbSBvczsKKworICAgIGlmICh1c2VTSSkKKyAgICB7CisgICAgICAgIC8vIFByZXNlcnZlIGFjY3VyYWN5IGZvciBzbWFsbCBudW1iZXJzLCBzaW5jZSB3ZSBvbmx5IG11bHRpcGx5IGFuZCB0aGUgcG9zaXRpdmUgcG93ZXJzCisgICAgICAgIC8vIG9mIHRlbiBhcmUgcHJlY2lzZWx5IHJlcHJlc2VudGFibGUuCisgICAgICAgIHN0YXRpYyBzdHJ1Y3QgeyBkb3VibGUgc2NhbGU7IGNoYXIgcHJlZml4OyB9IHJhbmdlc1tdID0geworICAgICAgICAgICAgezEuZTEyLCdmJ30sCisgICAgICAgICAgICB7MS5lOSwgJ3AnfSwKKyAgICAgICAgICAgIHsxLmU2LCAnbid9LAorICAgICAgICAgICAgezEuZTMsICd1J30sCisgICAgICAgICAgICB7MS4wLCAgJ20nfSwKKyAgICAgICAgICAgIHsxLmUtMywnICd9LAorICAgICAgICAgICAgezEuZS02LCdrJ30sCisgICAgICAgICAgICB7MS5lLTksJ00nfSwKKyAgICAgICAgICAgIHsxLmUtMTIsJ0cnfSwKKyAgICAgICAgICAgIHsxLmUtMTUsJ1QnfSwKKyAgICAgICAgICAgIHsxLmUtMTgsJ1AnfSwKKyAgICAgICAgICAgIHsxLmUtMjEsJ0UnfSwKKyAgICAgICAgICAgIHsxLmUtMjQsJ1onfSwKKyAgICAgICAgICAgIHsxLmUtMjcsJ1knfQorICAgICAgICB9OworCisgICAgICAgIGlmIChpbnRlcnZhbCA9PSAwLjApCisgICAgICAgIHsKKyAgICAgICAgICAgIG9zIDw8IHN0ZDo6c2V0dyh3aWR0aC0zKSA8PCBzdGQ6OnJpZ2h0IDw8ICIwLjAwIiA8PCBzdGQ6OnNldHcoMykgPDwgdW5pdDsKKyAgICAgICAgICAgIHJldHVybiBvcy5zdHIoKTsKKyAgICAgICAgfQorCisgICAgICAgIGJvb2wgbmVnYXRpdmUgPSBmYWxzZTsKKyAgICAgICAgaWYgKGludGVydmFsIDwgMC4wKQorICAgICAgICB7CisgICAgICAgICAgICBuZWdhdGl2ZSA9IHRydWU7CisgICAgICAgICAgICBpbnRlcnZhbCA9IC1pbnRlcnZhbDsKKyAgICAgICAgfQorCisgICAgICAgIGZvciAoaW50IGk9MDsgaTwoaW50KShzaXplb2YocmFuZ2VzKS9zaXplb2YocmFuZ2VzWzBdKSk7IGkrKykKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGludGVydmFsKnJhbmdlc1tpXS5zY2FsZSA8IDEuZTApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgaW50ZXJ2YWwgPSBpbnRlcnZhbCAqIDEwMDAuZTAgKiByYW5nZXNbaV0uc2NhbGU7CisgICAgICAgICAgICAgICAgb3MgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnNldHByZWNpc2lvbigyKSA8PCBzdGQ6OnNldHcod2lkdGgtMykgPDwgc3RkOjpyaWdodCA8PAorICAgICAgICAgICAgICAgICAgICAobmVnYXRpdmUgPyAtaW50ZXJ2YWwgOiBpbnRlcnZhbCkgPDwgc3RkOjpzZXR3KDIpIDw8IHJhbmdlc1tpXS5wcmVmaXggPDwgc3RkOjpzZXR3KDEpIDw8IHVuaXQ7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gb3Muc3RyKCk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisgICAgb3MgPDwgc3RkOjpzZXRwcmVjaXNpb24oMikgPDwgc3RkOjpmaXhlZCA8PCBzdGQ6OnJpZ2h0IDw8IHN0ZDo6c2V0dyh3aWR0aC0zKSA8PCBpbnRlcnZhbCA8PCBzdGQ6OnNldHcoMykgPDwgdW5pdDsKKworICAgIHJldHVybiBvcy5zdHIoKTsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RhdHNfdGltaW5nLmggYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA2MDVkOTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3N0YXRzX3RpbWluZy5oCkBAIC0wLDAgKzEsMTEyIEBACisjaWZuZGVmIEtNUF9TVEFUU19USU1JTkdfSAorI2RlZmluZSBLTVBfU1RBVFNfVElNSU5HX0gKKworLyoqIEBmaWxlIGttcF9zdGF0c190aW1pbmcuaAorICogQWNjZXNzIHRvIHJlYWwgdGltZSBjbG9jayBhbmQgdGltZXJzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdHJpbmc+CisjaW5jbHVkZSA8bGltaXRzPgorI2luY2x1ZGUgImttcF9vcy5oIgorI2lmIEtNUF9IQVZFX1g4NklOVFJJTl9ICisjIGluY2x1ZGUgPHg4NmludHJpbi5oPgorI2VuZGlmCisKK2NsYXNzIHRzY190aWNrX2NvdW50IHsKKyAgcHJpdmF0ZToKKyAgICBpbnQ2NF90IG15X2NvdW50OworCisgIHB1YmxpYzoKKyAgICBjbGFzcyB0c2NfaW50ZXJ2YWxfdCB7CisgICAgICAgIGludDY0X3QgdmFsdWU7CisgICAgICAgIGV4cGxpY2l0IHRzY19pbnRlcnZhbF90KGludDY0X3QgX3ZhbHVlKSA6IHZhbHVlKF92YWx1ZSkge30KKyAgICAgcHVibGljOgorICAgICAgICB0c2NfaW50ZXJ2YWxfdCgpIDogdmFsdWUoMCkge307IC8vIENvbnN0cnVjdCAwIHRpbWUgZHVyYXRpb24KKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyAgICAgICAgZG91YmxlIHNlY29uZHMoKSBjb25zdDsgLy8gUmV0dXJuIHRoZSBsZW5ndGggb2YgYSB0aW1lIGludGVydmFsIGluIHNlY29uZHMKKyNlbmRpZgorICAgICAgICBkb3VibGUgdGlja3MoKSBjb25zdCB7IHJldHVybiBkb3VibGUodmFsdWUpOyB9CisgICAgICAgIGludDY0X3QgZ2V0VmFsdWUoKSBjb25zdCB7IHJldHVybiB2YWx1ZTsgfQorICAgICAgICB0c2NfaW50ZXJ2YWxfdCYgb3BlcmF0b3I9KGludDY0X3QgbnZhbHVlKSB7IHZhbHVlID0gbnZhbHVlOyByZXR1cm4gKnRoaXM7IH0KKworICAgICAgICBmcmllbmQgY2xhc3MgdHNjX3RpY2tfY291bnQ7CisKKyAgICAgICAgZnJpZW5kIHRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudCYgdDEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQmIHQwKTsKKyAgICAgICAgZnJpZW5kIHRzY19pbnRlcnZhbF90IG9wZXJhdG9yLShjb25zdCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QmIGkxLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTApOworICAgICAgICBmcmllbmQgdHNjX2ludGVydmFsX3QmIG9wZXJhdG9yKz0odHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBpMSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgdHNjX3RpY2tfY291bnQ6OnRzY19pbnRlcnZhbF90JiBpMCk7CisgICAgfTsKKworI2lmIEtNUF9IQVZFX19fQlVJTFRJTl9SRUFEQ1lDTEVDT1VOVEVSCisgICAgdHNjX3RpY2tfY291bnQoKSA6IG15X2NvdW50KHN0YXRpY19jYXN0PGludDY0X3Q+KF9fYnVpbHRpbl9yZWFkY3ljbGVjb3VudGVyKCkpKSB7fQorI2VsaWYgS01QX0hBVkVfX19SRFRTQworICAgIHRzY190aWNrX2NvdW50KCkgOiBteV9jb3VudChzdGF0aWNfY2FzdDxpbnQ2NF90PihfX3JkdHNjKCkpKSB7fTsKKyNlbHNlCisjIGVycm9yIE11c3QgaGF2ZSBoaWdoIHJlc29sdXRpb24gdGltZXIgZGVmaW5lZAorI2VuZGlmCisgICAgdHNjX3RpY2tfY291bnQoaW50NjRfdCB2YWx1ZSkgOiBteV9jb3VudCh2YWx1ZSkge307CisgICAgaW50NjRfdCBnZXRWYWx1ZSgpIGNvbnN0IHsgcmV0dXJuIG15X2NvdW50OyB9CisgICAgdHNjX3RpY2tfY291bnQgbGF0ZXIgKHRzY190aWNrX2NvdW50IGNvbnN0IG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBteV9jb3VudCA+IG90aGVyLm15X2NvdW50ID8gKCp0aGlzKSA6IG90aGVyOworICAgIH0KKyAgICB0c2NfdGlja19jb3VudCBlYXJsaWVyKHRzY190aWNrX2NvdW50IGNvbnN0IG90aGVyKSBjb25zdCB7CisgICAgICAgIHJldHVybiBteV9jb3VudCA8IG90aGVyLm15X2NvdW50ID8gKCp0aGlzKSA6IG90aGVyOworICAgIH0KKyNpZiBLTVBfSEFWRV9USUNLX1RJTUUKKyAgICBzdGF0aWMgZG91YmxlIHRpY2tfdGltZSgpOyAvLyByZXR1cm5zIHNlY29uZHMgcGVyIGN5Y2xlIChwZXJpb2QpIG9mIGNsb2NrCisjZW5kaWYKKyAgICBzdGF0aWMgdHNjX3RpY2tfY291bnQgbm93KCkgeyByZXR1cm4gdHNjX3RpY2tfY291bnQoKTsgfSAvLyByZXR1cm5zIHRoZSByZHRzYyByZWdpc3RlciB2YWx1ZQorICAgIGZyaWVuZCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50JiB0MSwgY29uc3QgdHNjX3RpY2tfY291bnQmIHQwKTsKK307CisKK2lubGluZSB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50JiB0MSwgY29uc3QgdHNjX3RpY2tfY291bnQmIHQwKQoreworICAgIHJldHVybiB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QoIHQxLm15X2NvdW50LXQwLm15X2NvdW50ICk7Cit9CisKK2lubGluZSB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Qgb3BlcmF0b3ItKGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTEsIGNvbnN0IHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgaTApCit7CisgICAgcmV0dXJuIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCggaTEudmFsdWUtaTAudmFsdWUgKTsKK30KKworaW5saW5lIHRzY190aWNrX2NvdW50Ojp0c2NfaW50ZXJ2YWxfdCYgb3BlcmF0b3IrPSh0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QmIGkxLCBjb25zdCB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3QmIGkwKQoreworICAgIGkxLnZhbHVlICs9IGkwLnZhbHVlOworICAgIHJldHVybiBpMTsKK30KKworI2lmIEtNUF9IQVZFX1RJQ0tfVElNRQoraW5saW5lIGRvdWJsZSB0c2NfdGlja19jb3VudDo6dHNjX2ludGVydmFsX3Q6OnNlY29uZHMoKSBjb25zdAoreworICAgIHJldHVybiB2YWx1ZSp0aWNrX3RpbWUoKTsKK30KKyNlbmRpZgorCitleHRlcm4gc3RkOjpzdHJpbmcgZm9ybWF0U0koZG91YmxlIGludGVydmFsLCBpbnQgd2lkdGgsIGNoYXIgdW5pdCk7CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRTZWNvbmRzKGRvdWJsZSBpbnRlcnZhbCwgaW50IHdpZHRoKQoreworICAgIHJldHVybiBmb3JtYXRTSShpbnRlcnZhbCwgd2lkdGgsICdTJyk7Cit9CisKK2lubGluZSBzdGQ6OnN0cmluZyBmb3JtYXRUaWNrcyhkb3VibGUgaW50ZXJ2YWwsIGludCB3aWR0aCkKK3sKKyAgICByZXR1cm4gZm9ybWF0U0koaW50ZXJ2YWwsIHdpZHRoLCAnVCcpOworfQorCisjZW5kaWYgLy8gS01QX1NUQVRTX1RJTUlOR19ICmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3N0ci5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iNWY3MDA1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHIuYwpAQCAtMCwwICsxLDg4MyBAQAorLyoKKyAqIGttcF9zdHIuYyAtLSBTdHJpbmcgbWFuaXB1bGF0aW9uIHJvdXRpbmVzLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaW5jbHVkZSAia21wX3N0ci5oIgorCisjaW5jbHVkZSA8c3RkYXJnLmg+ICAgIC8vIHZhXyoKKyNpbmNsdWRlIDxzdGRpby5oPiAgICAgLy8gdnNucHJpbnRmKCkKKyNpbmNsdWRlIDxzdGRsaWIuaD4gICAgLy8gbWFsbG9jKCksIHJlYWxsb2MoKQorCisjaW5jbHVkZSAia21wLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKworLyoKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICBTdHJpbmcgYnVmZmVyLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgVXNhZ2U6CisKKyAgICAgICAgLy8gRGVjbGFyZSBidWZmZXIgYW5kIGluaXRpYWxpemUgaXQuCisgICAgICAgIGttcF9zdHJfYnVmX3QgIGJ1ZmZlcjsKKwlfX2ttcF9zdHJfYnVmX2luaXQoICYgYnVmZmVyICk7CisKKyAgICAgICAgLy8gUHJpbnQgdG8gYnVmZmVyLgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIkVycm9yIGluIGZpbGUgXCIlc1wiIGxpbmUgJWRcbiIsICJmb28uYyIsIDEyICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiICAgIDwlcz5cbiIsIGxpbmUgKTsKKworICAgICAgICAvLyBVc2UgYnVmZmVyIGNvbnRlbnRzLiBidWZmZXIuc3RyIGlzIGEgcG9pbnRlciB0byBkYXRhLCBidWZmZXIudXNlZCBpcyBhIG51bWJlciBvZiBwcmludGVkCisgICAgICAgIC8vIGNoYXJhY3RlcnMgKG5vdCBpbmNsdWRpbmcgdGVybWluYXRpbmcgemVybykuCisgICAgICAgIHdyaXRlKCBmZCwgYnVmZmVyLnN0ciwgYnVmZmVyLnVzZWQgKTsKKworICAgICAgICAvLyBGcmVlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworCisgICAgICAgIC8vIEFsdGVybmF0aXZlbHksIHlvdSBjYW4gZGV0YWNoIGFsbG9jYXRlZCBtZW1vcnkgZnJvbSBidWZmZXI6CisgICAgICAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCAmIGJ1ZmZlciApOworICAgICAgICByZXR1cm4gYnVmZmVyLnN0cjsgICAgLy8gVGhhdCBtZW1vcnkgc2hvdWxkIGJlIGZyZWVkIGV2ZW50dWFsbHkuCisKKworICAgIE5vdGVzOgorCisgICAgICAgICogQnVmZmVyIHVzZXJzIG1heSB1c2UgYnVmZmVyLnN0ciBhbmQgYnVmZmVyLnVzZWQuIFVzZXJzIHNob3VsZCBub3QgY2hhbmdlIGFueSBmaWVsZHMgb2YKKyAgICAgICAgICBidWZmZXIgZGlyZWN0bHkuCisKKyAgICAgICAgKiBidWZmZXIuc3RyIGlzIG5ldmVyIE5VTEwuIElmIGJ1ZmZlciBpcyBlbXB0eSwgYnVmZmVyLnN0ciBwb2ludHMgdG8gZW1wdHkgc3RyaW5nICgiIikuCisKKyAgICAgICAgKiBGb3IgcGVyZm9ybWFuY2UgcmVhc29ucywgYnVmZmVyIHVzZXMgc3RhY2sgbWVtb3J5IChidWZmZXIuYnVsaykgZmlyc3QuIElmIHN0YWNrIG1lbW9yeSBpcworICAgICAgICAgIGV4aGF1c3RlZCwgYnVmZmVyIGFsbG9jYXRlcyBtZW1vcnkgb24gaGVhcCBieSBtYWxsb2MoKSwgYW5kIHJlYWxsb2NhdGVzIGl0IGJ5IHJlYWxsb2MoKQorICAgICAgICAgIGFzIGFtb3VudCBvZiB1c2VkIG1lbW9yeSBncm93cy4KKworICAgICAgICAqIEJ1ZmZlciBkb3VibGVzIGFtb3VudCBvZiBhbGxvY2F0ZWQgbWVtb3J5IGVhY2ggdGltZSBpdCBpcyBleGhhdXN0ZWQuCisKKyAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyovCisKKy8vIFRPRE86IF9fa21wX3N0cl9idWZfcHJpbnQoKSBjYW4gdXNlIHRocmVhZCBsb2NhbCBtZW1vcnkgYWxsb2NhdG9yLgorCisjZGVmaW5lIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYiApICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAoYiktPnN0ciAhPSBOVUxMICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA+PSBzaXplb2YoIChiKS0+YnVsayApICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplICUgc2l6ZW9mKCAoYiktPmJ1bGsgKSA9PSAwICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCAodW5zaWduZWQpKGIpLT51c2VkIDwgKGIpLT5zaXplICk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIChiKS0+c2l6ZSA9PSBzaXplb2YoIChiKS0+YnVsayApID8gKGIpLT5zdHIgPT0gJiAoYiktPmJ1bGtbIDAgXSA6IDEgKTsgIFwKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKGIpLT5zaXplID4gc2l6ZW9mKCAoYiktPmJ1bGsgKSA/IChiKS0+c3RyICE9ICYgKGIpLT5idWxrWyAwIF0gOiAxICk7ICAgXAorICAgIH0KKwordm9pZAorIF9fa21wX3N0cl9idWZfY2xlYXIoCisgICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIKKykgeworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisgICAgaWYgKCBidWZmZXItPnVzZWQgPiAwICkgeworICAgICAgICBidWZmZXItPnVzZWQgPSAwOworICAgICAgICBidWZmZXItPnN0clsgMCBdID0gMDsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfY2xlYXIKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3Jlc2VydmUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwKKyAgICBpbnQgICAgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHNpemUgPj0gMCApOworCisgICAgaWYgKCBidWZmZXItPnNpemUgPCAodW5zaWduZWQgaW50KXNpemUgKSB7CisKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGJ1ZmZlciBzaXplLgorICAgICAgICBkbyB7CisgICAgICAgICAgICBidWZmZXItPnNpemUgKj0gMjsKKyAgICAgICAgfSB3aGlsZSAoIGJ1ZmZlci0+c2l6ZSA8ICh1bnNpZ25lZCBpbnQpc2l6ZSApOworCisgICAgICAgIC8vIEVubGFyZ2UgYnVmZmVyLgorICAgICAgICBpZiAoIGJ1ZmZlci0+c3RyID09ICYgYnVmZmVyLT5idWxrWyAwIF0gKSB7CisgICAgICAgICAgICBidWZmZXItPnN0ciA9IChjaGFyICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ1ZmZlci0+c2l6ZSApOworICAgICAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX01FTUNQWV9TKCBidWZmZXItPnN0ciwgYnVmZmVyLT5zaXplLCBidWZmZXItPmJ1bGssIGJ1ZmZlci0+dXNlZCArIDEgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGJ1ZmZlci0+c3RyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlci0+c3RyLCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgICAgIGlmICggYnVmZmVyLT5zdHIgPT0gTlVMTCApIHsKKwkJS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKworICAgIH07IC8vIGlmCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBidWZmZXItPnNpemUgPiAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID49ICh1bnNpZ25lZClzaXplICk7CisgICAgS01QX1NUUl9CVUZfSU5WQVJJQU5UKCBidWZmZXIgKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3Jlc2VydmUKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX2RldGFjaCgKKyAgICBrbXBfc3RyX2J1Zl90ICogIGJ1ZmZlcgorKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCisgICAgLy8gSWYgaW50ZXJuYWwgYnVsayBpcyB1c2VkLCBhbGxvY2F0ZSBtZW1vcnkgYW5kIGNvcHkgaXQuCisgICAgaWYgKCBidWZmZXItPnNpemUgPD0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgYnVmZmVyLT5zdHIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBidWZmZXItPnNpemUgKTsKKyAgICAgICAgaWYgKCBidWZmZXItPnN0ciA9PSBOVUxMICkgeworCQlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9NRU1DUFlfUyggYnVmZmVyLT5zdHIsIGJ1ZmZlci0+c2l6ZSwgYnVmZmVyLT5idWxrLCBidWZmZXItPnVzZWQgKyAxICk7CisgICAgfTsgLy8gaWYKKworfSAvLyBfX2ttcF9zdHJfYnVmX2RldGFjaAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfZnJlZSgKKyAgICBrbXBfc3RyX2J1Zl90ICogYnVmZmVyCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIGlmICggYnVmZmVyLT5zaXplID4gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKSApIHsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIGJ1ZmZlci0+c3RyICk7CisgICAgfTsgLy8gaWYKKyAgICBidWZmZXItPnN0ciAgPSBidWZmZXItPmJ1bGs7CisgICAgYnVmZmVyLT5zaXplID0gc2l6ZW9mKCBidWZmZXItPmJ1bGsgKTsKKyAgICBidWZmZXItPnVzZWQgPSAwOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7Cit9IC8vIF9fa21wX3N0cl9idWZfZnJlZQorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfY2F0KAorICAgIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsCisgICAgY2hhciBjb25zdCAqICAgIHN0ciwKKyAgICBpbnQgICAgICAgICAgICAgbGVuCispIHsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggbGVuID49IDAgKTsKKyAgICBfX2ttcF9zdHJfYnVmX3Jlc2VydmUoIGJ1ZmZlciwgYnVmZmVyLT51c2VkICsgbGVuICsgMSApOworICAgIEtNUF9NRU1DUFkoIGJ1ZmZlci0+c3RyICsgYnVmZmVyLT51c2VkLCBzdHIsIGxlbiApOworICAgIGJ1ZmZlci0+c3RyWyBidWZmZXItPnVzZWQgKyBsZW4gXSA9IDA7CisgICAgYnVmZmVyLT51c2VkICs9IGxlbjsKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworfSAvLyBfX2ttcF9zdHJfYnVmX2NhdAorCisKK3ZvaWQKK19fa21wX3N0cl9idWZfdnByaW50KAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICAgZm9ybWF0LAorICAgIHZhX2xpc3QgICAgICAgICAgYXJncworKSB7CisKKyAgICBLTVBfU1RSX0JVRl9JTlZBUklBTlQoIGJ1ZmZlciApOworCisgICAgZm9yICggOyA7ICkgeworCisgICAgICAgIGludCBjb25zdCBmcmVlID0gYnVmZmVyLT5zaXplIC0gYnVmZmVyLT51c2VkOworICAgICAgICBpbnQgICAgICAgcmM7CisgICAgICAgIGludCAgICAgICBzaXplOworCisgICAgICAgIC8vIFRyeSB0byBmb3JtYXQgc3RyaW5nLgorICAgICAgICB7CisgICAgICAgICAgICAvKgorICAgICAgICAgICAgICAgIE9uIExpbnV4KiBPUyBJbnRlbChSKSA2NCwgdnNucHJpbnRmKCkgbW9kaWZpZXMgYXJncyBhcmd1bWVudCwgc28gdnNucHJpbnRmKCkgY3Jhc2hlcyBpZiBpdAorICAgICAgICAgICAgICAgIGlzIGNhbGxlZCBmb3IgdGhlIHNlY29uZCB0aW1lIHdpdGggdGhlIHNhbWUgYXJncy4gVG8gcHJldmVudCB0aGUgY3Jhc2gsIHdlIGhhdmUgdG8KKyAgICAgICAgICAgICAgICBwYXNzIGEgZnJlc2ggaW50YWN0IGNvcHkgb2YgYXJncyB0byB2c25wcmludGYoKSBvbiBlYWNoIGl0ZXJhdGlvbi4KKworICAgICAgICAgICAgICAgIFVuZm9ydHVuYXRlbHksIHN0YW5kYXJkIHZhX2NvcHkoKSBtYWNybyBpcyBub3QgYXZhaWxhYmxlIG9uIFdpbmRvd3MqIE9TLiBIb3dldmVyLCBpdAorICAgICAgICAgICAgICAgIHNlZW1zIHZzbnByaW50ZigpIGRvZXMgbm90IG1vZGlmeSBhcmdzIGFyZ3VtZW50IG9uIFdpbmRvd3MqIE9TLgorICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgI2lmICEgS01QX09TX1dJTkRPV1MKKyAgICAgICAgICAgICAgICB2YV9saXN0IF9hcmdzOworICAgICAgICAgICAgICAgIF9fdmFfY29weSggX2FyZ3MsIGFyZ3MgKTsgIC8vIE1ha2UgY29weSBvZiBhcmdzLgorICAgICAgICAgICAgICAgICNkZWZpbmUgYXJncyBfYXJncyAgICAgICAgIC8vIFN1YnN0aXR1dGUgYXJncyB3aXRoIGl0cyBjb3B5LCBfYXJncy4KKyAgICAgICAgICAgICNlbmRpZiAvLyBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgcmMgPSBLTVBfVlNOUFJJTlRGKCBidWZmZXItPnN0ciArIGJ1ZmZlci0+dXNlZCwgZnJlZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgICAgICAjaWYgISBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgICAgICN1bmRlZiBhcmdzICAgICAgICAgICAgICAgIC8vIFJlbW92ZSBzdWJzdGl0dXRpb24uCisgICAgICAgICAgICAgICAgdmFfZW5kKCBfYXJncyApOworICAgICAgICAgICAgI2VuZGlmIC8vIEtNUF9PU19XSU5ET1dTCisgICAgICAgIH0KKworICAgICAgICAvLyBObyBlcnJvcnMsIHN0cmluZyBoYXMgYmVlbiBmb3JtYXR0ZWQuCisgICAgICAgIGlmICggcmMgPj0gMCAmJiByYyA8IGZyZWUgKSB7CisgICAgICAgICAgICBidWZmZXItPnVzZWQgKz0gcmM7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFcnJvciBvY2N1cnJlZCwgYnVmZmVyIGlzIHRvbyBzbWFsbC4KKyAgICAgICAgaWYgKCByYyA+PSAwICkgeworICAgICAgICAgICAgLy8gQzk5LWNvbmZvcm1pbmcgaW1wbGVtZW50YXRpb24gb2YgdnNucHJpbnRmIHJldHVybnMgcmVxdWlyZWQgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT51c2VkICsgcmMgKyAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgLy8gT2xkZXIgaW1wbGVtZW50YXRpb25zIGp1c3QgcmV0dXJuIC0xLiBEb3VibGUgYnVmZmVyIHNpemUuCisgICAgICAgICAgICBzaXplID0gYnVmZmVyLT5zaXplICogMjsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAvLyBFbmxhcmdlIGJ1ZmZlci4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBidWZmZXIsIHNpemUgKTsKKworICAgICAgICAvLyBBbmQgdHJ5IGFnYWluLgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgS01QX0RFQlVHX0FTU0VSVCggYnVmZmVyLT5zaXplID4gMCApOworICAgIEtNUF9TVFJfQlVGX0lOVkFSSUFOVCggYnVmZmVyICk7CisKK30gLy8gX19rbXBfc3RyX2J1Zl92cHJpbnQKKworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50KAorICAgIGttcF9zdHJfYnVmX3QgKiAgYnVmZmVyLAorICAgIGNoYXIgY29uc3QgKiAgICAgZm9ybWF0LAorICAgIC4uLgorKSB7CisKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgIF9fa21wX3N0cl9idWZfdnByaW50KCBidWZmZXIsIGZvcm1hdCwgYXJncyApOworICAgIHZhX2VuZCggYXJncyApOworCit9IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKworCisvKgorICAgIFRoZSBmdW5jdGlvbiBwcmludHMgc3BlY2lmaWVkIHNpemUgdG8gYnVmZmVyLiBTaXplIGlzIGV4cHJlc3NlZCB1c2luZyBiaWdnZXN0IHBvc3NpYmxlIHVuaXQsIGZvcgorICAgIGV4YW1wbGUgMTAyNCBpcyBwcmludGVkIGFzICIxayIuCisqLworCit2b2lkCitfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUoCisgICAga21wX3N0cl9idWZfdCAqIGJ1ZiwKKyAgICBzaXplX3QgICAgICAgICAgc2l6ZQorKSB7CisKKyAgICBjaGFyIGNvbnN0ICogbmFtZXNbXSA9IHsgIiIsICJrIiwgIk0iLCAiRyIsICJUIiwgIlAiLCAiRSIsICJaIiwgIlkiIH07CisgICAgaW50IGNvbnN0ICAgIHVuaXRzICAgPSBzaXplb2YoIG5hbWVzICkgLyBzaXplb2YoIGNoYXIgY29uc3QgKiApOworICAgIGludCAgICAgICAgICB1ICAgICAgID0gMDsKKyAgICBpZiAoIHNpemUgPiAwICkgeworICAgICAgICB3aGlsZSAoICggc2l6ZSAlIDEwMjQgPT0gMCApICYmICggdSArIDEgPCB1bml0cyApICkgeworICAgICAgICAgICAgc2l6ZSA9IHNpemUgLyAxMDI0OworICAgICAgICAgICAgKysgdTsKKyAgICAgICAgfTsgLy8gd2hpbGUKKyAgICB9OyAvLyBpZgorCisgICAgX19rbXBfc3RyX2J1Zl9wcmludCggYnVmLCAiJSIgS01QX1NJWkVfVF9TUEVDICIlcyIsIHNpemUsIG5hbWVzWyB1IF0gKTsKKworfSAvLyBfX2ttcF9zdHJfYnVmX3ByaW50X3NpemUKKworCit2b2lkCitfX2ttcF9zdHJfZm5hbWVfaW5pdCgKKyAgICBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSwKKyAgICBjaGFyIGNvbnN0ICogICAgICBwYXRoCispIHsKKworICAgIGZuYW1lLT5wYXRoID0gTlVMTDsKKyAgICBmbmFtZS0+ZGlyICA9IE5VTEw7CisgICAgZm5hbWUtPmJhc2UgPSBOVUxMOworCisgICAgaWYgKCBwYXRoICE9IE5VTEwgKSB7CisgICAgICAgIGNoYXIgKiBzbGFzaCA9IE5VTEw7ICAgIC8vIFBvaW50ZXIgdG8gdGhlIGxhc3QgY2hhcmFjdGVyIG9mIGRpci4KKyAgICAgICAgY2hhciAqIGJhc2UgID0gTlVMTDsgICAgLy8gUG9pbnRlciB0byB0aGUgYmVnaW5uaW5nIG9mIGJhc2VuYW1lLgorICAgICAgICBmbmFtZS0+cGF0aCA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHBhdGggKTsKKyAgICAgICAgICAgIC8vIE9yaWdpbmFsIGNvZGUgdXNlZCBzdHJkdXAoKSBmdW5jdGlvbiB0byBjb3B5IGEgc3RyaW5nLCBidXQgb24gV2luZG93cyogT1MgSW50ZWwoUikgNjQgaXQKKyAgICAgICAgICAgIC8vIGNhdXNlcyBhc3NlcnRpb29uIGlkIGRlYnVnIGhlYXAsIHNvIEkgaGFkIHRvIHJlcGxhY2Ugc3RyZHVwIHdpdGggX19rbXBfc3RyX2Zvcm1hdCgpLgorICAgICAgICBpZiAoIEtNUF9PU19XSU5ET1dTICkgeworICAgICAgICAgICAgX19rbXBfc3RyX3JlcGxhY2UoIGZuYW1lLT5wYXRoLCAnXFwnLCAnLycgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgZm5hbWUtPmRpciA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGZuYW1lLT5wYXRoICk7CisgICAgICAgIHNsYXNoID0gc3RycmNociggZm5hbWUtPmRpciwgJy8nICk7CisgICAgICAgIGlmICggS01QX09TX1dJTkRPV1MgJiYgc2xhc2ggPT0gTlVMTCApIHsgICAgICAgICAgIC8vIE9uIFdpbmRvd3MqIE9TLCBpZiBzbGFzaCBub3QgZm91bmQsCisgICAgICAgICAgICBjaGFyIGZpcnN0ID0gVE9MT1dFUiggZm5hbWUtPmRpclsgMCBdICk7ICAgICAvLyBsb29rIGZvciBkcml2ZS4KKyAgICAgICAgICAgIGlmICggJ2EnIDw9IGZpcnN0ICYmIGZpcnN0IDw9ICd6JyAmJiBmbmFtZS0+ZGlyWyAxIF0gPT0gJzonICkgeworICAgICAgICAgICAgICAgIHNsYXNoID0gJiBmbmFtZS0+ZGlyWyAxIF07CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICAgICBiYXNlID0gKCBzbGFzaCA9PSBOVUxMID8gZm5hbWUtPmRpciA6IHNsYXNoICsgMSApOworICAgICAgICBmbmFtZS0+YmFzZSA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIGJhc2UgKTsgICAgLy8gQ29weSBiYXNlbmFtZQorICAgICAgICAqIGJhc2UgPSAwOyAgICAgICAgICAgICAgICAgICAgLy8gYW5kIHRydW5jYXRlIGRpci4KKyAgICB9OyAvLyBpZgorCit9IC8vIGttcF9zdHJfZm5hbWVfaW5pdAorCisKK3ZvaWQKK19fa21wX3N0cl9mbmFtZV9mcmVlKAorICAgIGttcF9zdHJfZm5hbWVfdCAqIGZuYW1lCispIHsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5wYXRoICkgKTsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5kaXIgICkgKTsKKyAgICBfX2ttcF9zdHJfZnJlZSggKGNoYXIgY29uc3QgKiopKCAmIGZuYW1lLT5iYXNlICkgKTsKK30gLy8ga21wX3N0cl9mbmFtZV9mcmVlCisKKworaW50CitfX2ttcF9zdHJfZm5hbWVfbWF0Y2goCisgICAga21wX3N0cl9mbmFtZV90IGNvbnN0ICogZm5hbWUsCisgICAgY2hhciBjb25zdCAqICAgICAgICAgICAgcGF0dGVybgorKSB7CisKKyAgICBpbnQgZGlyX21hdGNoICA9IDE7CisgICAgaW50IGJhc2VfbWF0Y2ggPSAxOworCisgICAgaWYgKCBwYXR0ZXJuICE9IE5VTEwgKSB7CisgICAgICAgIGttcF9zdHJfZm5hbWVfdCBwdHJuOworICAgICAgICBfX2ttcF9zdHJfZm5hbWVfaW5pdCggJiBwdHJuLCBwYXR0ZXJuICk7CisgICAgICAgIGRpcl9tYXRjaCA9CisgICAgICAgICAgICBzdHJjbXAoIHB0cm4uZGlyLCAiKi8iICkgPT0gMAorICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICggZm5hbWUtPmRpciAhPSBOVUxMICYmIF9fa21wX3N0cl9lcWYoIGZuYW1lLT5kaXIsIHB0cm4uZGlyICkgKTsKKyAgICAgICAgYmFzZV9tYXRjaCA9CisgICAgICAgICAgICBzdHJjbXAoIHB0cm4uYmFzZSwgIioiICkgPT0gMAorICAgICAgICAgICAgfHwKKyAgICAgICAgICAgICggZm5hbWUtPmJhc2UgIT0gTlVMTCAmJiBfX2ttcF9zdHJfZXFmKCBmbmFtZS0+YmFzZSwgcHRybi5iYXNlICkgKTsKKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgcHRybiApOworICAgIH07IC8vIGlmCisKKyAgICByZXR1cm4gZGlyX21hdGNoICYmIGJhc2VfbWF0Y2g7CisKK30gLy8gX19rbXBfc3RyX2ZuYW1lX21hdGNoCisKKwora21wX3N0cl9sb2NfdAorX19rbXBfc3RyX2xvY19pbml0KAorICAgIGNoYXIgY29uc3QgKiBwc291cmNlLAorICAgIGludCAgICAgICAgICBpbml0X2ZuYW1lCispIHsKKworICAgIGttcF9zdHJfbG9jX3QgbG9jOworCisgICAgbG9jLl9idWxrID0gTlVMTDsKKyAgICBsb2MuZmlsZSAgPSBOVUxMOworICAgIGxvYy5mdW5jICA9IE5VTEw7CisgICAgbG9jLmxpbmUgID0gMDsKKyAgICBsb2MuY29sICAgPSAwOworCisgICAgaWYgKCBwc291cmNlICE9IE5VTEwgKSB7CisKKyAgICAgICAgY2hhciAqIHN0ciAgID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGR1bW15ID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGxpbmUgID0gTlVMTDsKKyAgICAgICAgY2hhciAqIGNvbCAgID0gTlVMTDsKKworICAgICAgICAvLyBDb3B5IHBzb3VyY2UgdG8ga2VlcCBpdCBpbnRhY3QuCisgICAgICAgIGxvYy5fYnVsayA9IF9fa21wX3N0cl9mb3JtYXQoICIlcyIsIHBzb3VyY2UgKTsKKworICAgICAgICAvLyBQYXJzZSBwc291cmNlIHN0cmluZzogIjtmaWxlO2Z1bmM7bGluZTtjb2w7OyIKKyAgICAgICAgc3RyID0gbG9jLl9idWxrOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGR1bW15LCAgICAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxvYy5maWxlLCAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxvYy5mdW5jLCAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGxpbmUsICAgICAmIHN0ciApOworICAgICAgICBfX2ttcF9zdHJfc3BsaXQoIHN0ciwgJzsnLCAmIGNvbCwgICAgICAmIHN0ciApOworCisgICAgICAgIC8vIENvbnZlcnQgbGluZSBhbmQgY29sIGludG8gbnVtYmVyaWMgdmFsdWVzLgorICAgICAgICBpZiAoIGxpbmUgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGxvYy5saW5lID0gYXRvaSggbGluZSApOworICAgICAgICAgICAgaWYgKCBsb2MubGluZSA8IDAgKSB7CisgICAgICAgICAgICAgICAgbG9jLmxpbmUgPSAwOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgaWYgKCBjb2wgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIGxvYy5jb2wgPSBhdG9pKCBjb2wgKTsKKyAgICAgICAgICAgIGlmICggbG9jLmNvbCA8IDAgKSB7CisgICAgICAgICAgICAgICAgbG9jLmNvbCA9IDA7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gaWYKKworICAgIF9fa21wX3N0cl9mbmFtZV9pbml0KCAmIGxvYy5mbmFtZSwgaW5pdF9mbmFtZSA/IGxvYy5maWxlIDogTlVMTCApOworCisgICAgcmV0dXJuIGxvYzsKKworfSAvLyBrbXBfc3RyX2xvY19pbml0CisKKwordm9pZAorX19rbXBfc3RyX2xvY19mcmVlKAorICAgIGttcF9zdHJfbG9jX3QgKiBsb2MKKykgeworICAgIF9fa21wX3N0cl9mbmFtZV9mcmVlKCAmIGxvYy0+Zm5hbWUgKTsKKyAgICBLTVBfSU5URVJOQUxfRlJFRSggbG9jLT5fYnVsayApOworICAgIGxvYy0+X2J1bGsgPSBOVUxMOworICAgIGxvYy0+ZmlsZSAgPSBOVUxMOworICAgIGxvYy0+ZnVuYyAgPSBOVUxMOworfSAvLyBrbXBfc3RyX2xvY19mcmVlCisKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGFyZSBmaWxlIG5hbWVzLiBPbiBXaW5kb3dzKiBPUyBmaWxlIG5hbWVzIGFyZSBjYXNlLWluc2Vuc2l0aXZlLAorICAgIHNvIGZ1bmN0aW9ucyBwZXJmb3JtcyBjYXNlLWluc2Vuc2l0aXZlIGNvbXBhcmlzb24uIE9uIExpbnV4KiBPUyBpdCBwZXJmb3JtcyBjYXNlLXNlbnNpdGl2ZQorICAgIGNvbXBhcmlzb24uCisgICAgTm90ZTogVGhlIGZ1bmN0aW9uIHJldHVybnMgKnRydWUqIGlmIHN0cmluZ3MgYXJlICplcXVhbCouCisqLworCitpbnQKK19fa21wX3N0cl9lcWYoICAgICAgICAgLy8gVHJ1ZSwgaWYgc3RyaW5ncyBhcmUgZXF1YWwsIGZhbHNlIG90aGVyd2lzZS4KKyAgICBjaGFyIGNvbnN0ICogbGhzLCAgLy8gRmlyc3Qgc3RyaW5nLgorICAgIGNoYXIgY29uc3QgKiByaHMgICAvLyBTZWNvbmQgc3RyaW5nLgorKSB7CisgICAgaW50IHJlc3VsdDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgcmVzdWx0ID0gKCBfc3RyaWNtcCggbGhzLCByaHMgKSA9PSAwICk7CisgICAgI2Vsc2UKKyAgICAgICAgcmVzdWx0ID0gKCBzdHJjbXAoIGxocywgcmhzICkgPT0gMCApOworICAgICNlbmRpZgorICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9lcWYKKworCisvKgorICAgIFRoaXMgZnVuY3Rpb24gaXMgbGlrZSBzcHJpbnRmLCBidXQgaXQgKmFsbG9jYXRlcyogbmV3IGJ1ZmZlciwgd2hpY2ggbXVzdCBiZSBmcmVlZCBldmVudHVhbGx5IGJ5CisgICAgX19rbXBfc3RyX2ZyZWUoKS4gVGhlIGZ1bmN0aW9uIGlzIHZlcnkgY29udmVuaWVudCBmb3IgY29uc3RydWN0aW5nIHN0cmluZ3MsIGl0IHN1Y2Nlc3NmdWxseQorICAgIHJlcGxhY2VzIHN0cmR1cCgpLCBzdHJjYXQoKSwgaXQgZnJlZXMgcHJvZ3JhbW1lciBmcm9tIGJ1ZmZlciBhbGxvY2F0aW9ucyBhbmQgaGVscHMgdG8gYXZvaWQKKyAgICBidWZmZXIgb3ZlcmZsb3dzLiBFeGFtcGxlczoKKworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMiLCBvcmlnICk7ICAgICAgICAgICAgICAvLyBzdHJkdXAoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMlcyIsIG9yaWcxLCBvcmlnMiApOyAgICAvLyBzdHJjYXQoKSwgZG8gbm90IGNhcmUgYWJvdXQgYnVmZmVyIHNpemUuCisgICAgICAgIF9fa21wX3N0cl9mcmVlKCAmIHN0ciApOworICAgICAgICBzdHIgPSBfX2ttcF9zdHJfZm9ybWF0KCAiJXMvJXMudHh0IiwgcGF0aCwgZmlsZSApOyAvLyBjb25zdHJ1Y3Rpbmcgc3RyaW5nLgorICAgICAgICBfX2ttcF9zdHJfZnJlZSggJiBzdHIgKTsKKworICAgIFBlcmZvcm1hbmNlIG5vdGU6CisgICAgICAgIFRoaXMgZnVuY3Rpb24gYWxsb2NhdGVzIG1lbW9yeSB3aXRoIG1hbGxvYygpIGNhbGxzLCBzbyBkbyBub3QgY2FsbCBpdCBmcm9tCisgICAgICAgIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUuIEluIHBlcmZvcm1hbmNlLWNyaXRpY2FsIGNvZGUgY29uc2lkZXIgdXNpbmcga21wX3N0cl9idWZfdAorICAgICAgICBpbnN0ZWFkLCBzaW5jZSBpdCB1c2VzIHN0YWNrLWFsbG9jYXRlZCBidWZmZXIgZm9yIHNob3J0IHN0cmluZ3MuCisKKyAgICBXaHkgZG9lcyB0aGlzIGZ1bmN0aW9uIHVzZSBtYWxsb2MoKT8KKyAgICAgICAgMS4gX19rbXBfYWxsb2NhdGUoKSByZXR1cm5zIGNhY2hlLWFsaWduZWQgbWVtb3J5IGFsbG9jYXRlZCB3aXRoIG1hbGxvYygpLiBUaGVyZSBhcmUgbm8KKyAgICAgICAgICAgcmVhc29ucyBpbiB1c2luZyBfX2ttcF9hbGxvY2F0ZSgpIGZvciBzdHJpbmdzIGR1ZSB0byBleHRyYSBvdmVyaGVhZCB3aGlsZSBjYWNoZS1hbGlnbmVkCisgICAgICAgICAgIG1lbW9yeSBpcyBub3QgbmVjZXNzYXJ5LgorICAgICAgICAyLiBfX2ttcF90aHJlYWRfbWFsbG9jKCkgY2Fubm90IGJlIHVzZWQgYmVjYXVzZSBpdCByZXF1aXJlcyBwb2ludGVyIHRvIHRocmVhZCBzdHJ1Y3R1cmUuCisgICAgICAgICAgIFdlIG5lZWQgdG8gcGVyZm9ybSBzdHJpbmcgb3BlcmF0aW9ucyBkdXJpbmcgbGlicmFyeSBzdGFydHVwIChmb3IgZXhhbXBsZSwgaW4KKyAgICAgICAgICAgX19rbXBfcmVnaXN0ZXJfbGlicmFyeV9zdGFydHVwKCkpIHdoZW4gbm8gdGhyZWFkIHN0cnVjdHVyZXMgYXJlIGFsbG9jYXRlZCB5ZXQuCisgICAgU28gc3RhbmRhcmQgbWFsbG9jKCkgaXMgdGhlIG9ubHkgYXZhaWxhYmxlIG9wdGlvbi4KKyovCisKKy8vIFRPRE86IEZpbmQgYW5kIHJlcGxhY2UgYWxsIHJlZ3VsYXIgZnJlZSgpIHdpdGggX19rbXBfc3RyX2ZyZWUoKS4KKworY2hhciAqCitfX2ttcF9zdHJfZm9ybWF0KCAgICAgICAgICAgLy8gQWxsb2NhdGVkIHN0cmluZy4KKyAgICBjaGFyIGNvbnN0ICogZm9ybWF0LCAgICAvLyBGb3JtYXQgc3RyaW5nLgorICAgIC4uLiAgICAgICAgICAgICAgICAgICAgIC8vIE90aGVyIHBhcmFtZXRlcnMuCispIHsKKworICAgIHZhX2xpc3QgYXJnczsKKyAgICBpbnQgICAgIHNpemUgICA9IDUxMjsKKyAgICBjaGFyICogIGJ1ZmZlciA9IE5VTEw7CisgICAgaW50ICAgICByYzsKKworICAgIC8vIEFsbG9jYXRlIGJ1ZmZlci4KKyAgICBidWZmZXIgPSAoY2hhciAqKSBLTVBfSU5URVJOQUxfTUFMTE9DKCBzaXplICk7CisgICAgaWYgKCBidWZmZXIgPT0gTlVMTCApIHsKKwlLTVBfRkFUQUwoIE1lbW9yeUFsbG9jRmFpbGVkICk7CisgICAgfTsgLy8gaWYKKworICAgIGZvciAoIDsgOyApIHsKKworICAgICAgICAvLyBUcnkgdG8gZm9ybWF0IHN0cmluZy4KKyAgICAgICAgdmFfc3RhcnQoIGFyZ3MsIGZvcm1hdCApOworICAgICAgICByYyA9IEtNUF9WU05QUklOVEYoIGJ1ZmZlciwgc2l6ZSwgZm9ybWF0LCBhcmdzICk7CisgICAgICAgIHZhX2VuZCggYXJncyApOworCisgICAgICAgIC8vIE5vIGVycm9ycywgc3RyaW5nIGhhcyBiZWVuIGZvcm1hdHRlZC4KKyAgICAgICAgaWYgKCByYyA+PSAwICYmIHJjIDwgc2l6ZSApIHsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9OyAvLyBpZgorCisgICAgICAgIC8vIEVycm9yIG9jY3VycmVkLCBidWZmZXIgaXMgdG9vIHNtYWxsLgorICAgICAgICBpZiAoIHJjID49IDAgKSB7CisgICAgICAgICAgICAvLyBDOTktY29uZm9ybWluZyBpbXBsZW1lbnRhdGlvbiBvZiB2c25wcmludGYgcmV0dXJucyByZXF1aXJlZCBidWZmZXIgc2l6ZS4KKyAgICAgICAgICAgIHNpemUgPSByYyArIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBPbGRlciBpbXBsZW1lbnRhdGlvbnMganVzdCByZXR1cm4gLTEuCisgICAgICAgICAgICBzaXplID0gc2l6ZSAqIDI7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgLy8gRW5sYXJnZSBidWZmZXIgYW5kIHRyeSBhZ2Fpbi4KKyAgICAgICAgYnVmZmVyID0gKGNoYXIgKikgS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgc2l6ZSApOworICAgICAgICBpZiAoIGJ1ZmZlciA9PSBOVUxMICkgeworICAgIAkgICAgS01QX0ZBVEFMKCBNZW1vcnlBbGxvY0ZhaWxlZCApOworICAgICAgICB9OyAvLyBpZgorCisgICAgfTsgLy8gZm9yZXZlcgorCisgICAgcmV0dXJuIGJ1ZmZlcjsKKworfSAvLyBmdW5jIF9fa21wX3N0cl9mb3JtYXQKKworCit2b2lkCitfX2ttcF9zdHJfZnJlZSgKKyAgICBjaGFyIGNvbnN0ICogKiBzdHIKKykgeworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0ciAhPSBOVUxMICk7CisgICAgS01QX0lOVEVSTkFMX0ZSRUUoICh2b2lkICopICogc3RyICk7CisgICAgKiBzdHIgPSBOVUxMOworfSAvLyBmdW5jIF9fa21wX3N0cl9mcmVlCisKKworLyogSWYgbGVuIGlzIHplcm8sIHJldHVybnMgdHJ1ZSBpZmYgdGFyZ2V0IGFuZCBkYXRhIGhhdmUgZXhhY3QgY2FzZS1pbnNlbnNpdGl2ZSBtYXRjaC4KKyAgIElmIGxlbiBpcyBuZWdhdGl2ZSwgcmV0dXJucyB0cnVlIGlmZiB0YXJnZXQgaXMgYSBjYXNlLWluc2Vuc2l0aXZlIHN1YnN0cmluZyBvZiBkYXRhLgorICAgSWYgbGVuIGlzIHBvc2l0aXZlLCByZXR1cm5zIHRydWUgaWZmIHRhcmdldCBpcyBhIGNhc2UtaW5zZW5zaXRpdmUgc3Vic3RyaW5nIG9mIGRhdGEgb3IKKyAgICAgdmljZSB2ZXJzYSwgYW5kIG5laXRoZXIgaXMgc2hvcnRlciB0aGFuIGxlbi4KKyovCitpbnQKK19fa21wX3N0cl9tYXRjaCgKKyAgICBjaGFyIGNvbnN0ICogdGFyZ2V0LAorICAgIGludCAgICAgICAgICBsZW4sCisgICAgY2hhciBjb25zdCAqIGRhdGEKKykgeworICAgIGludCBpOworICAgIGlmICggdGFyZ2V0ID09IE5VTEwgfHwgZGF0YSA9PSBOVUxMICkgeworICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgfTsgLy8gaWYKKyAgICBmb3IgKCBpID0gMDsgdGFyZ2V0W2ldICYmIGRhdGFbaV07ICsrIGkgKSB7CisgICAgICAgIGlmICggVE9MT1dFUiggdGFyZ2V0W2ldICkgIT0gVE9MT1dFUiggZGF0YVtpXSApICkgeworICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGZvciBpCisgICAgcmV0dXJuICggKCBsZW4gPiAwICkgPyBpID49IGxlbiA6ICggISB0YXJnZXRbaV0gJiYgKCBsZW4gfHwgISBkYXRhW2ldICkgKSApOworfSAvLyBfX2ttcF9zdHJfbWF0Y2gKKworCitpbnQKK19fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKSB7CisgICAgaW50IHJlc3VsdCA9CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggImZhbHNlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib2ZmIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIwIiwgICAgICAgMSwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIi5mYWxzZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLmYuIiwgICAgIDIsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJubyIsICAgICAgMSwgZGF0YSApOworICAgIHJldHVybiByZXN1bHQ7Cit9IC8vIF9fa21wX3N0cl9tYXRjaF9mYWxzZQorCisKK2ludAorX19rbXBfc3RyX21hdGNoX3RydWUoIGNoYXIgY29uc3QgKiBkYXRhICkgeworICAgIGludCByZXN1bHQgPQorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICJ0cnVlIiwgICAxLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAib24iLCAgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggIjEiLCAgICAgIDEsIGRhdGEgKSB8fAorICAgICAgICBfX2ttcF9zdHJfbWF0Y2goICIudHJ1ZS4iLCAyLCBkYXRhICkgfHwKKyAgICAgICAgX19rbXBfc3RyX21hdGNoKCAiLnQuIiwgICAgMiwgZGF0YSApIHx8CisgICAgICAgIF9fa21wX3N0cl9tYXRjaCggInllcyIsICAgIDEsIGRhdGEgKTsKKyAgICByZXR1cm4gcmVzdWx0OworfSAvLyBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZQorCit2b2lkCitfX2ttcF9zdHJfcmVwbGFjZSgKKyAgICBjaGFyICogc3RyLAorICAgIGNoYXIgICBzZWFyY2hfZm9yLAorICAgIGNoYXIgICByZXBsYWNlX3dpdGgKKykgeworCisgICAgY2hhciAqIGZvdW5kID0gTlVMTDsKKworICAgIGZvdW5kID0gc3RyY2hyKCBzdHIsIHNlYXJjaF9mb3IgKTsKKyAgICB3aGlsZSAoIGZvdW5kICkgeworICAgICAgICAqIGZvdW5kID0gcmVwbGFjZV93aXRoOworICAgICAgICBmb3VuZCA9IHN0cmNociggZm91bmQgKyAxLCBzZWFyY2hfZm9yICk7CisgICAgfTsgLy8gd2hpbGUKKworfSAvLyBfX2ttcF9zdHJfcmVwbGFjZQorCisKK3ZvaWQKK19fa21wX3N0cl9zcGxpdCgKKyAgICBjaGFyICogIHN0ciwgICAgLy8gSTogU3RyaW5nIHRvIHNwbGl0LgorICAgIGNoYXIgICAgZGVsaW0sICAvLyBJOiBDaGFyYWN0ZXIgdG8gc3BsaXQgb24uCisgICAgY2hhciAqKiBoZWFkLCAgIC8vIE86IFBvaW50ZXIgdG8gaGVhZCAobWF5IGJlIE5VTEwpLgorICAgIGNoYXIgKiogdGFpbCAgICAvLyBPOiBQb2ludGVyIHRvIHRhaWwgKG1heSBiZSBOVUxMKS4KKykgeworICAgIGNoYXIgKiBoID0gc3RyOworICAgIGNoYXIgKiB0ID0gTlVMTDsKKyAgICBpZiAoIHN0ciAhPSBOVUxMICkgeworICAgICAgICBjaGFyICogcHRyID0gc3RyY2hyKCBzdHIsIGRlbGltICk7CisgICAgICAgIGlmICggcHRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICAqIHB0ciAgPSAwOworICAgICAgICAgICAgdCA9IHB0ciArIDE7CisgICAgICAgIH07IC8vIGlmCisgICAgfTsgLy8gaWYKKyAgICBpZiAoIGhlYWQgIT0gTlVMTCApIHsKKyAgICAgICAgKiBoZWFkID0gaDsKKyAgICB9OyAvLyBpZgorICAgIGlmICggdGFpbCAhPSBOVUxMICkgeworICAgICAgICAqIHRhaWwgPSB0OworICAgIH07IC8vIGlmCit9IC8vIF9fa21wX3N0cl9zcGxpdAorCisvKgorICAgIHN0cnRva19yKCkgaXMgbm90IGF2YWlsYWJsZSBvbiBXaW5kb3dzKiBPUy4gVGhpcyBmdW5jdGlvbiByZWltcGxlbWVudHMgc3RydG9rX3IoKS4KKyovCitjaGFyICoKK19fa21wX3N0cl90b2tlbigKKyAgICBjaGFyICogICAgICAgc3RyLCAgIC8vIFN0cmluZyB0byBzcGxpdCBpbnRvIHRva2Vucy4gTm90ZTogU3RyaW5nICppcyogbW9kaWZpZWQhCisgICAgY2hhciBjb25zdCAqIGRlbGltLCAvLyBEZWxpbWl0ZXJzLgorICAgIGNoYXIgKiogICAgICBidWYgICAgLy8gSW50ZXJuYWwgYnVmZmVyLgorKSB7CisgICAgY2hhciAqIHRva2VuID0gTlVMTDsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgLy8gT24gV2luZG93cyogT1MgdGhlcmUgaXMgbm8gc3RydG9rX3IoKSBmdW5jdGlvbi4gTGV0IHVzIGltcGxlbWVudCBpdC4KKyAgICAgICAgaWYgKCBzdHIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICogYnVmID0gc3RyOyAgICAgICAgICAgICAgICAgICAgICAgLy8gRmlyc3QgY2FsbCwgaW5pdGlhbGl6ZSBidWYuCisgICAgICAgIH07IC8vIGlmCisgICAgICAgICogYnVmICs9IHN0cnNwbiggKiBidWYsIGRlbGltICk7ICAgICAgIC8vIFNraXAgbGVhZGluZyBkZWxpbWl0ZXJzLgorICAgICAgICBpZiAoICoqIGJ1ZiAhPSAwICkgeyAgICAgICAgICAgICAgICAgICAvLyBSZXN0IG9mIHRoZSBzdHJpbmcgaXMgbm90IHlldCBlbXB0eS4KKyAgICAgICAgICAgIHRva2VuID0gKiBidWY7ICAgICAgICAgICAgICAgICAgICAgLy8gVXNlIGl0IGFzIHJlc3VsdC4KKyAgICAgICAgICAgICogYnVmICs9IHN0cmNzcG4oICogYnVmLCBkZWxpbSApOyAgLy8gU2tpcCBub24tZGVsaW1pdGVycy4KKyAgICAgICAgICAgIGlmICggKiogYnVmICE9IDAgKSB7ICAgICAgICAgICAgICAgLy8gUmVzdCBvZiB0aGUgc3RyaW5nIGlzIG5vdCB5ZXQgZW1wdHkuCisgICAgICAgICAgICAgICAgKiogYnVmID0gMDsgICAgICAgICAgICAgICAgICAgIC8vIFRlcm1pbmF0ZSB0b2tlbiBoZXJlLgorICAgICAgICAgICAgICAgICogYnVmICs9IDE7ICAgICAgICAgICAgICAgICAgICAvLyBBZHZhbmNlIGJ1ZiB0byBzdGFydCB3aXRoIHRoZSBuZXh0IHRva2VuIG5leHQgdGltZS4KKyAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgIH07IC8vIGlmCisgICAgI2Vsc2UKKyAgICAgICAgLy8gT24gTGludXgqIE9TIGFuZCBPUyBYKiwgc3RydG9rX3IoKSBpcyBhdmFpbGFibGUuIExldCB1cyB1c2UgaXQuCisgICAgICAgIHRva2VuID0gc3RydG9rX3IoIHN0ciwgZGVsaW0sIGJ1ZiApOworICAgICNlbmRpZgorICAgIHJldHVybiB0b2tlbjsKK307IC8vIF9fa21wX3N0cl90b2tlbgorCisKK2ludAorX19rbXBfc3RyX3RvX2ludCgKKyAgICBjaGFyIGNvbnN0ICogc3RyLAorICAgIGNoYXIgICAgICAgICBzZW50aW5lbAorKSB7CisgICAgaW50IHJlc3VsdCwgZmFjdG9yOworICAgIGNoYXIgY29uc3QgKiB0OworCisgICAgcmVzdWx0ID0gMDsKKworICAgIGZvciAodCA9IHN0cjsgKnQgIT0gJ1wwJzsgKyt0KSB7CisgICAgICAgIGlmICgqdCA8ICcwJyB8fCAqdCA+ICc5JykKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICByZXN1bHQgPSAocmVzdWx0ICogMTApICsgKCp0IC0gJzAnKTsKKyAgICB9CisKKyAgICBzd2l0Y2ggKCp0KSB7CisgICAgY2FzZSAnXDAnOiAgICAgICAgICAvKiB0aGUgY3VycmVudCBkZWZhdWx0IGZvciBubyBzdWZmaXggaXMgYnl0ZXMgKi8KKwlmYWN0b3IgPSAxOworICAgICAgICBicmVhazsKKyAgICBjYXNlICdiJzogY2FzZSAnQic6IC8qIGJ5dGVzICovCisJKyt0OworCWZhY3RvciA9IDE7CisgICAgICAgIGJyZWFrOworICAgIGNhc2UgJ2snOiBjYXNlICdLJzogLyoga2lsby1ieXRlcyAqLworCSsrdDsKKwlmYWN0b3IgPSAxMDI0OworICAgICAgICBicmVhazsKKyAgICBjYXNlICdtJzogY2FzZSAnTSc6IC8qIG1lZ2EtYnl0ZXMgKi8KKwkrK3Q7CisJZmFjdG9yID0gKDEwMjQgKiAxMDI0KTsKKyAgICAgICAgYnJlYWs7CisgICAgZGVmYXVsdDoKKwlpZigqdCAhPSBzZW50aW5lbCkKKwkgICAgcmV0dXJuICgtMSk7CisJdCA9ICIiOworCWZhY3RvciA9IDE7CisgICAgfQorCisgICAgaWYgKHJlc3VsdCA+IChJTlRfTUFYIC8gZmFjdG9yKSkKKwlyZXN1bHQgPSBJTlRfTUFYOworICAgIGVsc2UKKwlyZXN1bHQgKj0gZmFjdG9yOworCisgICAgcmV0dXJuICgqdCAhPSAwID8gMCA6IHJlc3VsdCk7CisKK30gLy8gX19rbXBfc3RyX3RvX2ludAorCisKKy8qCisgICAgVGhlIHJvdXRpbmUgcGFyc2VzIGlucHV0IHN0cmluZy4gSXQgaXMgZXhwZWN0ZWQgaXQgaXMgYSB1bnNpZ25lZCBpbnRlZ2VyIHdpdGggb3B0aW9uYWwgdW5pdC4KKyAgICBVbml0cyBhcmU6ICJiIiBmb3IgYnl0ZXMsICJrYiIgb3IganVzdCAiayIgZm9yIGtpbG9ieXRlcywgIm1iIiBvciAibSIgZm9yIG1lZ2FieXRlcywgLi4uLCAieWIiCisgICAgb3IgInkiIGZvciB5b3R0YWJ5dGVzLiA6LSkgVW5pdCBuYW1lIGlzIGNhc2UtaW5zZW5zaXRpdmUuIFRoZSByb3V0aW5lIHJldHVybnMgMCBpZiBldmVyeXRoaW5nIGlzCisgICAgb2ssIG9yIGVycm9yIGNvZGU6IC0xIGluIGNhc2Ugb2Ygb3ZlcmZsb3csIC0yIGluIGNhc2Ugb2YgdW5rbm93biB1bml0LiAqc2l6ZSBpcyBzZXQgdG8gcGFyc2VkCisgICAgdmFsdWUuIEluIGNhc2Ugb2Ygb3ZlcmZsb3cgKnNpemUgaXMgc2V0IHRvIEtNUF9TSVpFX1RfTUFYLCBpbiBjYXNlIG9mIHVua25vd24gdW5pdCAqc2l6ZSBpcyBzZXQKKyAgICB0byB6ZXJvLgorKi8KK3ZvaWQKK19fa21wX3N0cl90b19zaXplKCAgICAgICAgIC8vIFI6IEVycm9yIGNvZGUuCisgICAgY2hhciBjb25zdCAqICAgc3RyLCAgICAvLyBJOiBTdHJpbmcgb2YgY2hhcmFjdGVycywgdW5zaWduZWQgbnVtYmVyIGFuZCB1bml0ICgiYiIsICJrYiIsIGV0YykuCisgICAgc2l6ZV90ICogICAgICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIHNpemVfdCAgICAgICAgIGRmYWN0b3IsIC8vIEk6IFRoZSBmYWN0b3IgaWYgbm9uZSBvZiB0aGUgbGV0dGVycyBzcGVjaWZpZWQuCisgICAgY2hhciBjb25zdCAqICogZXJyb3IgICAvLyBPOiBOdWxsIGlmIGV2ZXJ5dGhpbmcgaXMgb2ssIGVycm9yIG1lc3NhZ2Ugb3RoZXJ3aXNlLgorKSB7CisKKyAgICBzaXplX3QgdmFsdWUgICAgPSAwOworICAgIHNpemVfdCBmYWN0b3IgICA9IDA7CisgICAgaW50ICAgIG92ZXJmbG93ID0gMDsKKyAgICBpbnQgICAgaSAgICAgICAgPSAwOworICAgIGludCAgICBkaWdpdDsKKworCisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RyICE9IE5VTEwgKTsKKworICAgIC8vIFNraXAgc3BhY2VzLgorICAgIHdoaWxlICggc3RyWyBpIF0gPT0gJyAnIHx8IHN0clsgaSBdID09ICdcdCcpIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgdW5pdC4KKyAgICAjZGVmaW5lIF9jYXNlKCBjaCwgZXhwICkgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBjYXNlIGNoIDogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGNhc2UgY2ggLSAoICdhJyAtICdBJyApIDogeyAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIHNpemVfdCBzaGlmdCA9IChleHApICogMTA7ICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgKysgaTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoIHNoaWZ0IDwgc2l6ZW9mKCBzaXplX3QgKSAqIDggKSB7ICAgICAgIFwKKyAgICAgICAgICAgICAgICBmYWN0b3IgPSAoc2l6ZV90KSggMSApIDw8IHNoaWZ0OyAgICAgICAgXAorICAgICAgICAgICAgfSBlbHNlIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgb3ZlcmZsb3cgPSAxOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH07ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICB9IGJyZWFrOworICAgIHN3aXRjaCAoIHN0clsgaSBdICkgeworICAgICAgICBfY2FzZSggJ2snLCAxICk7IC8vIEtpbG8KKyAgICAgICAgX2Nhc2UoICdtJywgMiApOyAvLyBNZWdhCisgICAgICAgIF9jYXNlKCAnZycsIDMgKTsgLy8gR2lnYQorICAgICAgICBfY2FzZSggJ3QnLCA0ICk7IC8vIFRlcmEKKyAgICAgICAgX2Nhc2UoICdwJywgNSApOyAvLyBQZXRhCisgICAgICAgIF9jYXNlKCAnZScsIDYgKTsgLy8gRXhhCisgICAgICAgIF9jYXNlKCAneicsIDcgKTsgLy8gWmV0dGEKKyAgICAgICAgX2Nhc2UoICd5JywgOCApOyAvLyBZb3R0YQorICAgICAgICAvLyBPb3BzLiBObyBtb3JlIHVuaXRzLi4uCisgICAgfTsgLy8gc3dpdGNoCisgICAgI3VuZGVmIF9jYXNlCisgICAgaWYgKCBzdHJbIGkgXSA9PSAnYicgfHwgc3RyWyBpIF0gPT0gJ0InICkgeyAgICAvLyBTa2lwIG9wdGlvbmFsICJiIi4KKwlpZiAoIGZhY3RvciA9PSAwICkgeworCSAgICBmYWN0b3IgPSAxOworCX0KKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggISAoIHN0clsgaSBdID09ICcgJyB8fCBzdHJbIGkgXSA9PSAnXHQnIHx8IHN0clsgaSBdID09IDAgKSApIHsgLy8gQmFkIHVuaXQKKyAgICAgICAgKiBlcnJvciA9IEtNUF9JMThOX1NUUiggQmFkVW5pdCApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggZmFjdG9yID09IDAgKSB7CisJZmFjdG9yID0gZGZhY3RvcjsKKyAgICB9CisKKyAgICAvLyBBcHBseSBmYWN0b3IuCisgICAgb3ZlcmZsb3cgPSBvdmVyZmxvdyB8fCAoIHZhbHVlID4gKCBLTVBfU0laRV9UX01BWCAvIGZhY3RvciApICk7CisgICAgdmFsdWUgKj0gZmFjdG9yOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSBLTVBfU0laRV9UX01BWDsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICAqIGVycm9yID0gTlVMTDsKKyAgICAqIG91dCA9IHZhbHVlOworCit9IC8vIF9fa21wX3N0cl90b19zaXplCisKKwordm9pZAorX19rbXBfc3RyX3RvX3VpbnQoICAgICAgICAgLy8gUjogRXJyb3IgY29kZS4KKyAgICBjaGFyIGNvbnN0ICogICBzdHIsICAgIC8vIEk6IFN0cmluZyBvZiBjaGFyYWN0ZXJzLCB1bnNpZ25lZCBudW1iZXIuCisgICAga21wX3VpbnQ2NCAqICAgb3V0LCAgICAvLyBPOiBQYXJzZWQgbnVtYmVyLgorICAgIGNoYXIgY29uc3QgKiAqIGVycm9yICAgLy8gTzogTnVsbCBpZiBldmVyeXRoaW5nIGlzIG9rLCBlcnJvciBtZXNzYWdlIG90aGVyd2lzZS4KKykgeworCisgICAgc2l6ZV90IHZhbHVlICAgID0gMDsKKyAgICBpbnQgICAgb3ZlcmZsb3cgPSAwOworICAgIGludCAgICBpICAgICAgICA9IDA7CisgICAgaW50ICAgIGRpZ2l0OworCisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBzdHIgIT0gTlVMTCApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgLy8gUGFyc2UgbnVtYmVyLgorICAgIGlmICggc3RyWyBpIF0gPCAnMCcgfHwgc3RyWyBpIF0gPiAnOScgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIE5vdEFOdW1iZXIgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgZG8geworICAgICAgICBkaWdpdCA9IHN0clsgaSBdIC0gJzAnOworICAgICAgICBvdmVyZmxvdyA9IG92ZXJmbG93IHx8ICggdmFsdWUgPiAoIEtNUF9TSVpFX1RfTUFYIC0gZGlnaXQgKSAvIDEwICk7CisgICAgICAgIHZhbHVlID0gKCB2YWx1ZSAqIDEwICkgKyBkaWdpdDsKKyAgICAgICAgKysgaTsKKyAgICB9IHdoaWxlICggc3RyWyBpIF0gPj0gJzAnICYmIHN0clsgaSBdIDw9ICc5JyApOworCisgICAgLy8gU2tpcCBzcGFjZXMuCisgICAgd2hpbGUgKCBzdHJbIGkgXSA9PSAnICcgfHwgc3RyWyBpIF0gPT0gJ1x0JyApIHsKKyAgICAgICAgKysgaTsKKyAgICB9OyAvLyB3aGlsZQorCisgICAgaWYgKCBzdHJbIGkgXSAhPSAwICkgeworICAgICAgICAqIGVycm9yID0gS01QX0kxOE5fU1RSKCBJbGxlZ2FsQ2hhcmFjdGVycyApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIGlmICggb3ZlcmZsb3cgKSB7CisgICAgICAgICogZXJyb3IgPSBLTVBfSTE4Tl9TVFIoIFZhbHVlVG9vTGFyZ2UgKTsKKyAgICAgICAgKiBvdXQgPSAoa21wX3VpbnQ2NCkgLTE7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgKiBlcnJvciA9IE5VTEw7CisgICAgKiBvdXQgPSB2YWx1ZTsKKworfSAvLyBfX2ttcF9zdHJfdG9fdW5pdAorCisKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3RyLmggYi9yYzMvcnVudGltZS9zcmMva21wX3N0ci5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJhNzFiYmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3N0ci5oCkBAIC0wLDAgKzEsMTE5IEBACisvKgorICoga21wX3N0ci5oIC0tIFN0cmluZyBtYW5pcHVsYXRpb24gcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUUl9ICisjZGVmaW5lIEtNUF9TVFJfSAorCisjaW5jbHVkZSA8c3RyaW5nLmg+CisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKyNpbmNsdWRlICJrbXBfb3MuaCIKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgZXh0ZXJuICJDIiB7CisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2lmIEtNUF9PU19XSU5ET1dTCisjIGRlZmluZSBzdHJkdXAgICAgX3N0cmR1cAorI2VuZGlmCisKKy8qICBzb21lIG1hY3JvcyB0byByZXBsYWNlIGN0eXBlLmggZnVuY3Rpb25zICAqLworI2RlZmluZSBUT0xPV0VSKGMpCSgoKChjKSA+PSAnQScpICYmICgoYykgPD0gJ1onKSkgPyAoKGMpICsgJ2EnIC0gJ0EnKSA6IChjKSkKKworc3RydWN0IGttcF9zdHJfYnVmIHsKKyAgICBjaGFyICAgICAgICogc3RyOyAgICAgICAgIC8vIFBvaW50ZXIgdG8gYnVmZmVyIGNvbnRlbnQsIHJlYWQgb25seS4KKyAgICB1bnNpZ25lZCBpbnQgc2l6ZTsgICAgICAgIC8vIERvIG5vdCBjaGFuZ2UgdGhpcyBmaWVsZCEKKyAgICBpbnQgICAgICAgICAgdXNlZDsgICAgICAgIC8vIE51bWJlciBvZiBjaGFyYWN0ZXJzIHByaW50ZWQgdG8gYnVmZmVyLCByZWFkIG9ubHkuCisgICAgY2hhciAgICAgICAgIGJ1bGtbIDUxMiBdOyAvLyBEbyBub3QgdXNlIHRoaXMgZmllbGQhCit9OyAvLyBzdHJ1Y3Qga21wX3N0cl9idWYKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfYnVmICBrbXBfc3RyX2J1Zl90OworCisjZGVmaW5lIF9fa21wX3N0cl9idWZfaW5pdCggYiApICAgeyAoYiktPnN0ciA9IChiKS0+YnVsazsgKGIpLT5zaXplID0gc2l6ZW9mKCAoYiktPmJ1bGsgKTsgKGIpLT51c2VkID0gMDsgKGIpLT5idWxrWyAwIF0gPSAwOyB9CisKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9yZXNlcnZlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBpbnQgc2l6ZSApOwordm9pZCAgIF9fa21wX3N0cl9idWZfZGV0YWNoKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9mcmVlKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9jYXQoIGttcF9zdHJfYnVmX3QgKiBidWZmZXIsIGNoYXIgY29uc3QgKiBzdHIsIGludCBsZW4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfYnVmX3ZwcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgdmFfbGlzdCBhcmdzICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludCgga21wX3N0cl9idWZfdCAqIGJ1ZmZlciwgY2hhciBjb25zdCAqIGZvcm1hdCwgLi4uICk7Cit2b2lkICAgX19rbXBfc3RyX2J1Zl9wcmludF9zaXplKCBrbXBfc3RyX2J1Zl90ICogYnVmZmVyLCBzaXplX3Qgc2l6ZSApOworCisvKgorICAgIEZpbGUgbmFtZSBwYXJzZXIuIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfZm5hbWVfdCBmbmFtZSA9IF9fa21wX3N0cl9mbmFtZV9pbml0KCBwYXRoICk7CisgICAgICAgIC8vIFVzZSBmbmFtZS5wYXRoIChjb3B5IG9mIG9yaWdpbmFsIHBhdGggKSwgZm5hbWUuZGlyLCBmbmFtZS5iYXNlLgorICAgICAgICAvLyBOb3RlIGZuYW1lLmRpciBjb25jYXRlbmF0ZWQgd2l0aCBmbmFtZS5iYXNlIGdpdmVzIGV4YWN0IGNvcHkgb2YgcGF0aC4KKyAgICAgICAgX19rbXBfc3RyX2ZuYW1lX2ZyZWUoICYgZm5hbWUgKTsKKworKi8KK3N0cnVjdCBrbXBfc3RyX2ZuYW1lIHsKKyAgICBjaGFyICogcGF0aDsKKyAgICBjaGFyICogZGlyOworICAgIGNoYXIgKiBiYXNlOworfTsgLy8gc3RydWN0IGttcF9zdHJfZm5hbWUKK3R5cGVkZWYgc3RydWN0IGttcF9zdHJfZm5hbWUga21wX3N0cl9mbmFtZV90Owordm9pZCBfX2ttcF9zdHJfZm5hbWVfaW5pdCgga21wX3N0cl9mbmFtZV90ICogZm5hbWUsIGNoYXIgY29uc3QgKiBwYXRoICk7Cit2b2lkIF9fa21wX3N0cl9mbmFtZV9mcmVlKCBrbXBfc3RyX2ZuYW1lX3QgKiBmbmFtZSApOworLy8gQ29tcGFyZXMgZmlsZSBuYW1lIHdpdGggc3BlY2lmaWVkIHBhdGVybi4gSWYgcGF0dGVybiBpcyBOVUxMLCBhbnkgZm5hbWUgbWF0Y2hlZC4KK2ludCBfX2ttcF9zdHJfZm5hbWVfbWF0Y2goIGttcF9zdHJfZm5hbWVfdCBjb25zdCAqIGZuYW1lLCBjaGFyIGNvbnN0ICogcGF0dGVybiApOworCisvKgorICAgIFRoZSBjb21waWxlciBwcm92aWRlcyBzb3VyY2UgbG9jYXRpb25zIGluIHN0cmluZyBmb3JtICI7ZmlsZTtmdW5jO2xpbmU7Y29sOzsiLiBJdCBub3Qgbm90CisgICAgY29udmVuaWVudCBmb3IgbWFudXB1bGF0aW9uLiBUaGVzZSBzdHJ1Y3R1cmUga2VlcHMgc291cmNlIGxvY2F0aW9uIGluIG1vcmUgY29udmVuaWVudCBmb3JtLgorICAgIFVzYWdlOgorCisgICAgICAgIGttcF9zdHJfbG9jX3QgbG9jID0gX19rbXBfc3RyX2xvY19pbml0KCBpZGVudC0+cHNvdXJjZSwgMCApOworICAgICAgICAvLyB1c2UgbG9jLmZpbGUsIGxvYy5mdW5jLCBsb2MubGluZSwgbG9jLmNvbC4KKyAgICAgICAgLy8gbG9jLmZuYW1lIGlzIGF2YWlsYWJsZSBpZiB0aGUgc2Vjb25kIGFyZ3VtZW50IG9mIF9fa21wX3N0cl9sb2NfaW5pdCBpcyB0cnVlLgorICAgICAgICBfX2ttcF9zdHJfbG9jX2ZyZWUoICYgbG9jICk7CisKKyAgICBJZiBwc291cmNlIGlzIE5VTEwgb3IgZG9lcyBub3QgZm9sbG93IGZvcm1hdCBhYm92ZSwgZmlsZSBhbmQvb3IgZnVuYyBtYXkgYmUgTlVMTCBwb2ludGVycy4KKyovCitzdHJ1Y3Qga21wX3N0cl9sb2MgeworICAgIGNoYXIgKiAgICAgICAgICBfYnVsazsgIC8vIERvIG5vdCB1c2UgdGhpZCBmaWVsZC4KKyAgICBrbXBfc3RyX2ZuYW1lX3QgZm5hbWU7ICAvLyBXaWxsIGJlIGluaXRpYWxpemVkIGlmIGluaXRfZm5hbWUgaXMgdHJ1ZS4KKyAgICBjaGFyICogICAgICAgICAgZmlsZTsKKyAgICBjaGFyICogICAgICAgICAgZnVuYzsKKyAgICBpbnQgICAgICAgICAgICAgbGluZTsKKyAgICBpbnQgICAgICAgICAgICAgY29sOworfTsgLy8gc3RydWN0IGttcF9zdHJfbG9jCit0eXBlZGVmIHN0cnVjdCBrbXBfc3RyX2xvYyBrbXBfc3RyX2xvY190Owora21wX3N0cl9sb2NfdCBfX2ttcF9zdHJfbG9jX2luaXQoIGNoYXIgY29uc3QgKiBwc291cmNlLCBpbnQgaW5pdF9mbmFtZSApOwordm9pZCBfX2ttcF9zdHJfbG9jX2ZyZWUoIGttcF9zdHJfbG9jX3QgKiBsb2MgKTsKKworaW50ICAgIF9fa21wX3N0cl9lcWYoIGNoYXIgY29uc3QgKiBsaHMsIGNoYXIgY29uc3QgKiByaHMgKTsKK2NoYXIgKiBfX2ttcF9zdHJfZm9ybWF0KCBjaGFyIGNvbnN0ICogZm9ybWF0LCAuLi4gKTsKK3ZvaWQgICBfX2ttcF9zdHJfZnJlZSggY2hhciBjb25zdCAqICogc3RyICk7CitpbnQgICAgX19rbXBfc3RyX21hdGNoKCBjaGFyIGNvbnN0ICogdGFyZ2V0LCBpbnQgbGVuLCBjaGFyIGNvbnN0ICogZGF0YSApOworaW50ICAgIF9fa21wX3N0cl9tYXRjaF9mYWxzZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK2ludCAgICBfX2ttcF9zdHJfbWF0Y2hfdHJ1ZSggY2hhciBjb25zdCAqIGRhdGEgKTsKK3ZvaWQgICBfX2ttcF9zdHJfcmVwbGFjZSggY2hhciAqIHN0ciwgY2hhciBzZWFyY2hfZm9yLCBjaGFyIHJlcGxhY2Vfd2l0aCApOwordm9pZCAgIF9fa21wX3N0cl9zcGxpdCggY2hhciAqIHN0ciwgY2hhciBkZWxpbSwgY2hhciAqKiBoZWFkLCBjaGFyICoqIHRhaWwgKTsKK2NoYXIgKiBfX2ttcF9zdHJfdG9rZW4oIGNoYXIgKiBzdHIsIGNoYXIgY29uc3QgKiBkZWxpbSwgY2hhciAqKiBidWYgKTsKK2ludCAgICBfX2ttcF9zdHJfdG9faW50KCBjaGFyIGNvbnN0ICogc3RyLCBjaGFyIHNlbnRpbmVsICk7CisKK3ZvaWQgX19rbXBfc3RyX3RvX3NpemUoIGNoYXIgY29uc3QgKiBzdHIsIHNpemVfdCAqIG91dCwgc2l6ZV90IGRmYWN0b3IsIGNoYXIgY29uc3QgKiAqIGVycm9yICk7Cit2b2lkIF9fa21wX3N0cl90b191aW50KCBjaGFyIGNvbnN0ICogc3RyLCBrbXBfdWludDY0ICogb3V0LCBjaGFyIGNvbnN0ICogKiBlcnJvciApOworCisjaWZkZWYgX19jcGx1c3BsdXMKKyAgICB9IC8vIGV4dGVybiAiQyIKKyNlbmRpZiAvLyBfX2NwbHVzcGx1cworCisjZW5kaWYgLy8gS01QX1NUUl9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHViLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3YmYzZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5jCkBAIC0wLDAgKzEsMjcwIEBACisvKgorICoga21wX3N0dWIuYyAtLSBzdHViIHZlcnNpb25zIG9mIHVzZXItY2FsbGFibGUgT3Blbk1QIFJUIGZ1bmN0aW9ucy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGVycm5vLmg+CisKKyNpbmNsdWRlICJvbXAuaCIgICAgICAgICAgICAgICAgLy8gRnVuY3Rpb24gcmVuYW1pbmdzLgorI2luY2x1ZGUgImttcC5oIiAgICAgICAgICAgICAgICAvLyBLTVBfREVGQVVMVF9TVEtTSVpFCisjaW5jbHVkZSAia21wX3N0dWIuaCIKKworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgI2luY2x1ZGUgPHdpbmRvd3MuaD4KKyNlbHNlCisgICAgI2luY2x1ZGUgPHN5cy90aW1lLmg+CisjZW5kaWYKKworLy8gTW92ZWQgZnJvbSBvbXAuaAorI2RlZmluZSBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzICAgIG9tcGNfc2V0X21heF9hY3RpdmVfbGV2ZWxzCisjZGVmaW5lIG9tcF9zZXRfc2NoZWR1bGUgICAgICAgICAgICAgb21wY19zZXRfc2NoZWR1bGUKKyNkZWZpbmUgb21wX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtICBvbXBjX2dldF9hbmNlc3Rvcl90aHJlYWRfbnVtCisjZGVmaW5lIG9tcF9nZXRfdGVhbV9zaXplICAgICAgICAgICAgb21wY19nZXRfdGVhbV9zaXplCisKKyNkZWZpbmUgb21wX3NldF9udW1fdGhyZWFkcyAgICAgICAgICBvbXBjX3NldF9udW1fdGhyZWFkcworI2RlZmluZSBvbXBfc2V0X2R5bmFtaWMgICAgICAgICAgICAgIG9tcGNfc2V0X2R5bmFtaWMKKyNkZWZpbmUgb21wX3NldF9uZXN0ZWQgICAgICAgICAgICAgICBvbXBjX3NldF9uZXN0ZWQKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemUgICAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemUKKyNkZWZpbmUga21wX3NldF9zdGFja3NpemVfcyAgICAgICAgICBrbXBjX3NldF9zdGFja3NpemVfcworI2RlZmluZSBrbXBfc2V0X2Jsb2NrdGltZSAgICAgICAgICAgIGttcGNfc2V0X2Jsb2NrdGltZQorI2RlZmluZSBrbXBfc2V0X2xpYnJhcnkgICAgICAgICAgICAgIGttcGNfc2V0X2xpYnJhcnkKKyNkZWZpbmUga21wX3NldF9kZWZhdWx0cyAgICAgICAgICAgICBrbXBjX3NldF9kZWZhdWx0cworI2RlZmluZSBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMgICAgIGttcGNfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMKKyNkZWZpbmUga21wX21hbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX21hbGxvYworI2RlZmluZSBrbXBfYWxpZ25lZF9tYWxsb2MgICAgICAgICAgIGttcGNfYWxpZ25lZF9tYWxsb2MKKyNkZWZpbmUga21wX2NhbGxvYyAgICAgICAgICAgICAgICAgICBrbXBjX2NhbGxvYworI2RlZmluZSBrbXBfcmVhbGxvYyAgICAgICAgICAgICAgICAgIGttcGNfcmVhbGxvYworI2RlZmluZSBrbXBfZnJlZSAgICAgICAgICAgICAgICAgICAgIGttcGNfZnJlZQorCitzdGF0aWMgZG91YmxlIGZyZXF1ZW5jeSA9IDAuMDsKKworLy8gSGVscGVyIGZ1bmN0aW9ucy4KK3N0YXRpYyBzaXplX3QgX19rbXBzX2luaXQoKSB7CisgICAgc3RhdGljIGludCAgICBpbml0aWFsaXplZCA9IDA7CisgICAgc3RhdGljIHNpemVfdCBkdW1teSA9IDA7CisgICAgaWYgKCAhIGluaXRpYWxpemVkICkgeworCisgICAgICAgIC8vIFRPRE86IEFuYWx5emUgS01QX1ZFUlNJT04gZW52aXJvbm1lbnQgdmFyaWFibGUsIHByaW50IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IGFuZAorICAgICAgICAvLyBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWUuCisgICAgICAgIC8vIFdBUk5JTkc6IERvIG5vdCB1c2UgImZwcmludGYoIHN0ZGVyciwgLi4uICkiIGJlY2F1c2UgaXQgd2lsbCBjYXVzZSB1bnJlc29sdmVkICJfX2lvYiIKKyAgICAgICAgLy8gc3ltYm9sIChzZWUgQzcwMDgwKS4gV2UgbmVlZCB0byBleHRyYWN0IF9fa21wX3ByaW50ZigpIHN0dWZmIGZyb20ga21wX3J1bnRpbWUuYyBhbmQgdXNlCisgICAgICAgIC8vIGl0LgorCisgICAgICAgIC8vIFRyaWNrIHdpdGggZHVtbXkgdmFyaWFibGUgZm9yY2VzIGxpbmtlciB0byBrZWVwIF9fa21wX3ZlcnNpb25fY29weXJpZ2h0IGFuZAorICAgICAgICAvLyBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWUgc3RyaW5ncyBpbiBleGVjdXRhYmxlIGZpbGUgKGluIGNhc2Ugb2Ygc3RhdGljIGxpbmthZ2UpLgorICAgICAgICAvLyBXaGVuIEtNUF9WRVJTSU9OIGFuYWx5emUgaXMgaW1wbGVtZW50ZWQsIGR1bW15IHZhcmlhYmxlIHNob3VsZCBiZSBkZWxldGVkLCBmdW5jdGlvbgorICAgICAgICAvLyBzaG91bGQgcmV0dXJuIHZvaWQuCisgICAgICAgIGR1bW15ID0gX19rbXBfdmVyc2lvbl9jb3B5cmlnaHQgLSBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWU7CisKKyAgICAgICAgI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIGZyZXE7CisgICAgICAgICAgICBCT09MIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VGcmVxdWVuY3koICYgZnJlcSApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgKSB7CisgICAgICAgICAgICAgICAgZnJlcXVlbmN5ID0gZG91YmxlKCBmcmVxLlF1YWRQYXJ0ICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAjZW5kaWYKKworICAgICAgICBpbml0aWFsaXplZCA9IDE7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gZHVtbXk7Cit9OyAvLyBfX2ttcHNfaW5pdAorCisjZGVmaW5lIGkgX19rbXBzX2luaXQoKTsKKworLyogc2V0IEFQSSBmdW5jdGlvbnMgKi8KK3ZvaWQgb21wX3NldF9udW1fdGhyZWFkcyggb21wX2ludF90IG51bV90aHJlYWRzICkgeyBpOyB9Cit2b2lkIG9tcF9zZXRfZHluYW1pYyggb21wX2ludF90IGR5bmFtaWMgKSAgICAgICAgIHsgaTsgX19rbXBzX3NldF9keW5hbWljKCBkeW5hbWljICk7IH0KK3ZvaWQgb21wX3NldF9uZXN0ZWQoIG9tcF9pbnRfdCBuZXN0ZWQgKSAgICAgICAgICAgeyBpOyBfX2ttcHNfc2V0X25lc3RlZCggbmVzdGVkICk7ICAgfQordm9pZCBvbXBfc2V0X21heF9hY3RpdmVfbGV2ZWxzKCBvbXBfaW50X3QgbWF4X2FjdGl2ZV9sZXZlbHMgKSB7IGk7IH0KK3ZvaWQgb21wX3NldF9zY2hlZHVsZSggb21wX3NjaGVkX3Qga2luZCwgb21wX2ludF90IG1vZGlmaWVyICkgeyBpOyBfX2ttcHNfc2V0X3NjaGVkdWxlKCAoa21wX3NjaGVkX3Qpa2luZCwgbW9kaWZpZXIgKTsgfQoraW50IG9tcF9nZXRfYW5jZXN0b3JfdGhyZWFkX251bSggb21wX2ludF90IGxldmVsICkgeyBpOyByZXR1cm4gKCBsZXZlbCApID8gKCAtMSApIDogKCAwICk7IH0KK2ludCBvbXBfZ2V0X3RlYW1fc2l6ZSggb21wX2ludF90IGxldmVsICkgeyBpOyByZXR1cm4gKCBsZXZlbCApID8gKCAtMSApIDogKCAxICk7IH0KK2ludCBrbXBjX3NldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CitpbnQga21wY191bnNldF9hZmZpbml0eV9tYXNrX3Byb2MoIGludCBwcm9jLCB2b2lkICoqbWFzayApIHsgaTsgcmV0dXJuIC0xOyB9CitpbnQga21wY19nZXRfYWZmaW5pdHlfbWFza19wcm9jKCBpbnQgcHJvYywgdm9pZCAqKm1hc2sgKSB7IGk7IHJldHVybiAtMTsgfQorCisvKiBrbXAgQVBJIGZ1bmN0aW9ucyAqLwordm9pZCBrbXBfc2V0X3N0YWNrc2l6ZSggb21wX2ludF90IGFyZyApICAgeyBpOyBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggYXJnICk7IH0KK3ZvaWQga21wX3NldF9zdGFja3NpemVfcyggc2l6ZV90IGFyZyApICAgIHsgaTsgX19rbXBzX3NldF9zdGFja3NpemUoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfYmxvY2t0aW1lKCBvbXBfaW50X3QgYXJnICkgICB7IGk7IF9fa21wc19zZXRfYmxvY2t0aW1lKCBhcmcgKTsgfQordm9pZCBrbXBfc2V0X2xpYnJhcnkoIG9tcF9pbnRfdCBhcmcgKSAgICAgeyBpOyBfX2ttcHNfc2V0X2xpYnJhcnkoIGFyZyApOyB9Cit2b2lkIGttcF9zZXRfZGVmYXVsdHMoIGNoYXIgY29uc3QgKiBzdHIgKSB7IGk7IH0KK3ZvaWQga21wX3NldF9kaXNwX251bV9idWZmZXJzKCBvbXBfaW50X3QgYXJnICkgeyBpOyB9CisKKy8qIEtNUCBtZW1vcnkgbWFuYWdlbWVudCBmdW5jdGlvbnMuICovCit2b2lkICoga21wX21hbGxvYyggc2l6ZV90IHNpemUgKSAgICAgICAgICAgICAgICAgeyBpOyByZXR1cm4gbWFsbG9jKCBzaXplICk7IH0KK3ZvaWQgKiBrbXBfYWxpZ25lZF9tYWxsb2MoIHNpemVfdCBzeiwgc2l6ZV90IGEgKSB7CisgICAgaTsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgIGVycm5vID0gRU5PU1lTOyAvLyBub3Qgc3VwcG9ydGVkCisgICAgcmV0dXJuIE5VTEw7ICAgIC8vIG5vIHN0YW5kYXJkIGFsaWduZWQgYWxsb2NhdG9yIG9uIFdpbmRvd3MgKHByZSAtIEMxMSkKKyNlbHNlCisgICAgdm9pZCAqcmVzOworICAgIGludCBlcnI7CisgICAgaWYoIGVyciA9IHBvc2l4X21lbWFsaWduKCAmcmVzLCBhLCBzeiApICkgeworICAgICAgICBlcnJubyA9IGVycjsgLy8gY2FuIGJlIEVJTlZBTCBvciBFTk9NRU0KKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorICAgIHJldHVybiByZXM7CisjZW5kaWYKK30KK3ZvaWQgKiBrbXBfY2FsbG9jKCBzaXplX3QgbmVsZW0sIHNpemVfdCBlbHNpemUgKSB7IGk7IHJldHVybiBjYWxsb2MoIG5lbGVtLCBlbHNpemUgKTsgfQordm9pZCAqIGttcF9yZWFsbG9jKCB2b2lkICpwdHIsIHNpemVfdCBzaXplICkgICAgIHsgaTsgcmV0dXJuIHJlYWxsb2MoIHB0ciwgc2l6ZSApOyB9Cit2b2lkICAga21wX2ZyZWUoIHZvaWQgKiBwdHIgKSAgICAgICAgICAgICAgICAgICAgeyBpOyBmcmVlKCBwdHIgKTsgfQorCitzdGF0aWMgaW50IF9fa21wc19ibG9ja3RpbWUgPSBJTlRfTUFYOworCit2b2lkIF9fa21wc19zZXRfYmxvY2t0aW1lKCBpbnQgYXJnICkgeworICAgIGk7CisgICAgX19rbXBzX2Jsb2NrdGltZSA9IGFyZzsKK30gLy8gX19rbXBzX3NldF9ibG9ja3RpbWUKKworaW50IF9fa21wc19nZXRfYmxvY2t0aW1lKCB2b2lkICkgeworICAgIGk7CisgICAgcmV0dXJuIF9fa21wc19ibG9ja3RpbWU7Cit9IC8vIF9fa21wc19nZXRfYmxvY2t0aW1lCisKK3N0YXRpYyBpbnQgX19rbXBzX2R5bmFtaWMgPSAwOworCit2b2lkIF9fa21wc19zZXRfZHluYW1pYyggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19keW5hbWljID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2R5bmFtaWMKKworaW50IF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfZHluYW1pYzsKK30gLy8gX19rbXBzX2dldF9keW5hbWljCisKK3N0YXRpYyBpbnQgX19rbXBzX2xpYnJhcnkgPSAxMDAwOworCit2b2lkIF9fa21wc19zZXRfbGlicmFyeSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19saWJyYXJ5ID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X2xpYnJhcnkKKworaW50IF9fa21wc19nZXRfbGlicmFyeSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfbGlicmFyeTsKK30gLy8gX19rbXBzX2dldF9saWJyYXJ5CisKK3N0YXRpYyBpbnQgX19rbXBzX25lc3RlZCA9IDA7CisKK3ZvaWQgX19rbXBzX3NldF9uZXN0ZWQoIGludCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfbmVzdGVkID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X25lc3RlZAorCitpbnQgX19rbXBzX2dldF9uZXN0ZWQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX25lc3RlZDsKK30gLy8gX19rbXBzX2dldF9uZXN0ZWQKKworc3RhdGljIHNpemVfdCBfX2ttcHNfc3RhY2tzaXplID0gS01QX0RFRkFVTFRfU1RLU0laRTsKKwordm9pZCBfX2ttcHNfc2V0X3N0YWNrc2l6ZSggaW50IGFyZyApIHsKKyAgICBpOworICAgIF9fa21wc19zdGFja3NpemUgPSBhcmc7Cit9IC8vIF9fa21wc19zZXRfc3RhY2tzaXplCisKK2ludCBfX2ttcHNfZ2V0X3N0YWNrc2l6ZSggdm9pZCApIHsKKyAgICBpOworICAgIHJldHVybiBfX2ttcHNfc3RhY2tzaXplOworfSAvLyBfX2ttcHNfZ2V0X3N0YWNrc2l6ZQorCitzdGF0aWMga21wX3NjaGVkX3QgX19rbXBzX3NjaGVkX2tpbmQgICAgID0ga21wX3NjaGVkX2RlZmF1bHQ7CitzdGF0aWMgaW50ICAgICAgICAgX19rbXBzX3NjaGVkX21vZGlmaWVyID0gMDsKKworICAgIHZvaWQgX19rbXBzX3NldF9zY2hlZHVsZSgga21wX3NjaGVkX3Qga2luZCwgaW50IG1vZGlmaWVyICkgeworICAgICAgICBpOworICAgICAgICBfX2ttcHNfc2NoZWRfa2luZCAgICAgPSBraW5kOworICAgICAgICBfX2ttcHNfc2NoZWRfbW9kaWZpZXIgPSBtb2RpZmllcjsKKyAgICB9IC8vIF9fa21wc19zZXRfc2NoZWR1bGUKKworICAgIHZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKSB7CisgICAgICAgIGk7CisgICAgICAgICpraW5kICAgICA9IF9fa21wc19zY2hlZF9raW5kOworICAgICAgICAqbW9kaWZpZXIgPSBfX2ttcHNfc2NoZWRfbW9kaWZpZXI7CisgICAgfSAvLyBfX2ttcHNfZ2V0X3NjaGVkdWxlCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorCitzdGF0aWMga21wX3Byb2NfYmluZF90IF9fa21wc19wcm9jX2JpbmQgPSBwcm9jX2JpbmRfZmFsc2U7CisKK3ZvaWQgX19rbXBzX3NldF9wcm9jX2JpbmQoIGttcF9wcm9jX2JpbmRfdCBhcmcgKSB7CisgICAgaTsKKyAgICBfX2ttcHNfcHJvY19iaW5kID0gYXJnOworfSAvLyBfX2ttcHNfc2V0X3Byb2NfYmluZAorCitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKSB7CisgICAgaTsKKyAgICByZXR1cm4gX19rbXBzX3Byb2NfYmluZDsKK30gLy8gX19rbXBzX2dldF9wcm9jX2JpbmQKKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKK2RvdWJsZSBfX2ttcHNfZ2V0X3d0aW1lKCB2b2lkICkgeworICAgIC8vIEVsYXBzZWQgd2FsbCBjbG9jayB0aW1lIChpbiBzZWNvbmQpIGZyb20gInNvbWV0aW1lIGluIHRoZSBwYXN0Ii4KKyAgICBkb3VibGUgd3RpbWUgPSAwLjA7CisgICAgaTsKKyAgICAjaWYgS01QX09TX1dJTkRPV1MKKyAgICAgICAgaWYgKCBmcmVxdWVuY3kgPiAwLjAgKSB7CisgICAgICAgICAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICAgICAgICAgIEJPT0wgc3RhdHVzID0gUXVlcnlQZXJmb3JtYW5jZUNvdW50ZXIoICYgbm93ICk7CisgICAgICAgICAgICBpZiAoIHN0YXR1cyApIHsKKyAgICAgICAgICAgICAgICB3dGltZSA9IGRvdWJsZSggbm93LlF1YWRQYXJ0ICkgLyBmcmVxdWVuY3k7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9OyAvLyBpZgorICAgICNlbHNlCisgICAgICAgIC8vIGdldHRpbWVvZmRheSgpIHJldHVybnMgc2Vjb25kcyBhbmQgbWljcm9zZWNvbmRzIHNpbmNlIHRoZSBFcG9jaC4KKyAgICAgICAgc3RydWN0IHRpbWV2YWwgIHR2YWw7CisgICAgICAgIGludCAgICAgICAgICAgICByYzsKKyAgICAgICAgcmMgPSBnZXR0aW1lb2ZkYXkoICYgdHZhbCwgTlVMTCApOworICAgICAgICBpZiAoIHJjID09IDAgKSB7CisgICAgICAgICAgICB3dGltZSA9IChkb3VibGUpKCB0dmFsLnR2X3NlYyApICsgMS4wRS0wNiAqIChkb3VibGUpKCB0dmFsLnR2X3VzZWMgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFRPRE86IEFzc2VydCBvciBhYm9ydCBoZXJlLgorICAgICAgICB9OyAvLyBpZgorICAgICNlbmRpZgorICAgIHJldHVybiB3dGltZTsKK307IC8vIF9fa21wc19nZXRfd3RpbWUKKworZG91YmxlIF9fa21wc19nZXRfd3RpY2soIHZvaWQgKSB7CisgICAgLy8gTnVtYmVyIG9mIHNlY29uZHMgYmV0d2VlbiBzdWNjZXNzaXZlIGNsb2NrIHRpY2tzLgorICAgIGRvdWJsZSB3dGljayA9IDAuMDsKKyAgICBpOworICAgICNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICB7CisgICAgICAgICAgICBEV09SRCBpbmNyZW1lbnQ7CisgICAgICAgICAgICBEV09SRCBhZGp1c3RtZW50OworICAgICAgICAgICAgQk9PTCAgZGlzYWJsZWQ7CisgICAgICAgICAgICBCT09MICByYzsKKyAgICAgICAgICAgIHJjID0gR2V0U3lzdGVtVGltZUFkanVzdG1lbnQoICYgYWRqdXN0bWVudCwgJiBpbmNyZW1lbnQsICYgZGlzYWJsZWQgKTsKKyAgICAgICAgICAgIGlmICggcmMgKSB7CisgICAgICAgICAgICAgICAgd3RpY2sgPSAxLjBFLTA3ICogKGRvdWJsZSkoIGRpc2FibGVkID8gaW5jcmVtZW50IDogYWRqdXN0bWVudCApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAvLyBUT0RPOiBBc3NlcnQgb3IgYWJvcnQgaGVyZS4KKyAgICAgICAgICAgICAgICB3dGljayA9IDEuMEUtMDM7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICB9CisgICAgI2Vsc2UKKyAgICAgICAgLy8gVE9ETzogZ2V0dGltZW9mZGF5KCkgcmV0dXJucyBpbiBtaWNyb3NlY29uZHMsIGJ1dCB3aGF0IHRoZSBwcmVjaXNpb24/CisgICAgICAgIHd0aWNrID0gMS4wRS0wNjsKKyAgICAjZW5kaWYKKyAgICByZXR1cm4gd3RpY2s7Cit9OyAvLyBfX2ttcHNfZ2V0X3d0aWNrCisKKy8vIGVuZCBvZiBmaWxlIC8vCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF9zdHViLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RjZmZhMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfc3R1Yi5oCkBAIC0wLDAgKzEsNjEgQEAKKy8qCisgKiBrbXBfc3R1Yi5oCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1NUVUJfSAorI2RlZmluZSBLTVBfU1RVQl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKK3ZvaWQgX19rbXBzX3NldF9ibG9ja3RpbWUoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9ibG9ja3RpbWUoIHZvaWQgKTsKK3ZvaWQgX19rbXBzX3NldF9keW5hbWljKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfZHluYW1pYyggdm9pZCApOwordm9pZCBfX2ttcHNfc2V0X2xpYnJhcnkoIGludCBhcmcgKTsKK2ludCAgX19rbXBzX2dldF9saWJyYXJ5KCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfbmVzdGVkKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfbmVzdGVkKCB2b2lkICk7Cit2b2lkIF9fa21wc19zZXRfc3RhY2tzaXplKCBpbnQgYXJnICk7CitpbnQgIF9fa21wc19nZXRfc3RhY2tzaXplKCk7CisKKyNpZm5kZWYgS01QX1NDSEVEX1RZUEVfREVGSU5FRAorI2RlZmluZSBLTVBfU0NIRURfVFlQRV9ERUZJTkVECit0eXBlZGVmIGVudW0ga21wX3NjaGVkIHsKKyAgICBrbXBfc2NoZWRfc3RhdGljICAgICAgICAgICAgPSAxLCAvLyBtYXBwZWQgdG8ga21wX3NjaF9zdGF0aWNfY2h1bmtlZCAgICAgICAgICAgKDMzKQorICAgIGttcF9zY2hlZF9keW5hbWljICAgICAgICAgICA9IDIsIC8vIG1hcHBlZCB0byBrbXBfc2NoX2R5bmFtaWNfY2h1bmtlZCAgICAgICAgICAoMzUpCisgICAga21wX3NjaGVkX2d1aWRlZCAgICAgICAgICAgID0gMywgLy8gbWFwcGVkIHRvIGttcF9zY2hfZ3VpZGVkX2NodW5rZWQgICAgICAgICAgICgzNikKKyAgICBrbXBfc2NoZWRfYXV0byAgICAgICAgICAgICAgPSA0LCAvLyBtYXBwZWQgdG8ga21wX3NjaF9hdXRvICAgICAgICAgICAgICAgICAgICAgKDM4KQorICAgIGttcF9zY2hlZF9kZWZhdWx0ID0ga21wX3NjaGVkX3N0YXRpYyAgIC8vIGRlZmF1bHQgc2NoZWR1bGluZworfSBrbXBfc2NoZWRfdDsKKyNlbmRpZgordm9pZCBfX2ttcHNfc2V0X3NjaGVkdWxlKCBrbXBfc2NoZWRfdCBraW5kLCBpbnQgbW9kaWZpZXIgKTsKK3ZvaWQgX19rbXBzX2dldF9zY2hlZHVsZSgga21wX3NjaGVkX3QgKmtpbmQsIGludCAqbW9kaWZpZXIgKTsKKworI2lmIE9NUF80MF9FTkFCTEVECit2b2lkIF9fa21wc19zZXRfcHJvY19iaW5kKCBrbXBfcHJvY19iaW5kX3QgYXJnICk7CitrbXBfcHJvY19iaW5kX3QgX19rbXBzX2dldF9wcm9jX2JpbmQoIHZvaWQgKTsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworCitkb3VibGUgX19rbXBzX2dldF93dGltZSgpOworZG91YmxlIF9fa21wc19nZXRfd3RpY2soKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8vIEtNUF9TVFVCX0gKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90YXNrZGVwcy5jcHAKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDZiYTVkZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2RlcHMuY3BwCkBAIC0wLDAgKzEsNTg3IEBACisvKgorICoga21wX3Rhc2tkZXBzLmNwcAorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisvLyNkZWZpbmUgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUIDEKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmIE9NUF80MF9FTkFCTEVECisKKy8vVE9ETzogSW1wcm92ZSBtZW1vcnkgYWxsb2NhdGlvbj8ga2VlcCBhIGxpc3Qgb2YgcHJlLWFsbG9jYXRlZCBzdHJ1Y3R1cmVzPyBhbGxvY2F0ZSBpbiBibG9ja3M/IHJlLXVzZSBsaXN0IGZpbmlzaGVkIGxpc3QgZW50cmllcz8KKy8vVE9ETzogZG9uJ3QgdXNlIGF0b21pYyByZWYgY291bnRlcnMgZm9yIHN0YWNrLWFsbG9jYXRlZCBub2Rlcy4KKy8vVE9ETzogZmluZCBhbiBhbHRlcm5hdGUgdG8gYXRvbWljIHJlZnMgZm9yIGhlYXAtYWxsb2NhdGVkIG5vZGVzPworLy9UT0RPOiBGaW5pc2ggZ3JhcGggb3V0cHV0IHN1cHBvcnQKKy8vVE9ETzoga21wX2xvY2tfdCBzZWVtcyBhIHRhZCB0byBiaWcgKGFuZCBoZWF2eSB3ZWlnaHQpIGZvciB0aGlzLiBDaGVjayBvdGhlciBydW50aW1lIGxvY2tzCisvL1RPRE86IEFueSBJVFQgc3VwcG9ydCBuZWVkZWQ/CisKKyNpZmRlZiBLTVBfU1VQUE9SVF9HUkFQSF9PVVRQVVQKK3N0YXRpYyBrbXBfaW50MzIga21wX25vZGVfaWRfc2VlZCA9IDA7CisjZW5kaWYKKworc3RhdGljIHZvaWQKK19fa21wX2luaXRfbm9kZSAoIGttcF9kZXBub2RlX3QgKm5vZGUgKQoreworICAgIG5vZGUtPmRuLnRhc2sgPSBOVUxMOyAvLyBzZXQgdG8gbnVsbCBpbml0aWFsbHksIGl0IHdpbGwgcG9pbnQgdG8gdGhlIHJpZ2h0IHRhc2sgb25jZSBkZXBlbmRlbmNlcyBoYXZlIGJlZW4gcHJvY2Vzc2VkCisgICAgbm9kZS0+ZG4uc3VjY2Vzc29ycyA9IE5VTEw7CisgICAgX19rbXBfaW5pdF9sb2NrKCZub2RlLT5kbi5sb2NrKTsKKyAgICBub2RlLT5kbi5ucmVmcyA9IDE7IC8vIGluaXQgY3JlYXRlcyB0aGUgZmlyc3QgcmVmZXJlbmNlIHRvIHRoZSBub2RlCisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAgbm9kZS0+ZG4uaWQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCZrbXBfbm9kZV9pZF9zZWVkKTsKKyNlbmRpZgorfQorCitzdGF0aWMgaW5saW5lIGttcF9kZXBub2RlX3QgKgorX19rbXBfbm9kZV9yZWYgKCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCZub2RlLT5kbi5ucmVmcyk7CisgICAgcmV0dXJuIG5vZGU7Cit9CisKK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfbm9kZV9kZXJlZiAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfdCAqbm9kZSApCit7CisgICAgaWYgKCFub2RlKSByZXR1cm47CisKKyAgICBrbXBfaW50MzIgbiA9IEtNUF9URVNUX1RIRU5fREVDMzIoJm5vZGUtPmRuLm5yZWZzKSAtIDE7CisgICAgaWYgKCBuID09IDAgKSB7CisgICAgICAgIEtNUF9BU1NFUlQobm9kZS0+ZG4ubnJlZnMgPT0gMCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSh0aHJlYWQsbm9kZSk7CisjZWxzZQorICAgICAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsbm9kZSk7CisjZW5kaWYKKyAgICB9Cit9CisKKyNkZWZpbmUgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLG4pIF9fa21wX2FjcXVpcmVfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKyNkZWZpbmUgS01QX1JFTEVBU0VfREVQTk9ERShndGlkLG4pIF9fa21wX3JlbGVhc2VfbG9jaygmKG4pLT5kbi5sb2NrLChndGlkKSkKKworc3RhdGljIHZvaWQKK19fa21wX2RlcG5vZGVfbGlzdF9mcmVlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfZGVwbm9kZV9saXN0ICpsaXN0ICk7CisKK2VudW0geworICAgIEtNUF9ERVBIQVNIX09USEVSX1NJWkUgPSA5NywKKyAgICBLTVBfREVQSEFTSF9NQVNURVJfU0laRSA9IDk5NworfTsKKworc3RhdGljIGlubGluZSBrbXBfaW50MzIKK19fa21wX2RlcGhhc2hfaGFzaCAoIGttcF9pbnRwdHJfdCBhZGRyLCBzaXplX3QgaHNpemUgKQoreworICAgIC8vVE9ETyBhbHRlcm5hdGUgdG8gdHJ5OiBzZXQgPSAoKChBZGRyNjQpKGFkZHJVc2VmdWxCaXRzICogOS42MTgpKSAlIG1fbnVtX3NldHMgKTsKKyAgICByZXR1cm4gKChhZGRyID4+IDYpIF4gKGFkZHIgPj4gMikpICUgaHNpemU7Cit9CisKK3N0YXRpYyBrbXBfZGVwaGFzaF90ICoKK19fa21wX2RlcGhhc2hfY3JlYXRlICgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfZGVwaGFzaF90ICpoOworCisgICAgc2l6ZV90IGhfc2l6ZTsKKworICAgIGlmICggY3VycmVudF90YXNrLT50ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0lNUExJQ0lUICkKKyAgICAgICAgaF9zaXplID0gS01QX0RFUEhBU0hfTUFTVEVSX1NJWkU7CisgICAgZWxzZQorICAgICAgICBoX3NpemUgPSBLTVBfREVQSEFTSF9PVEhFUl9TSVpFOworCisgICAga21wX2ludDMyIHNpemUgPSBoX3NpemUgKiBzaXplb2Yoa21wX2RlcGhhc2hfZW50cnlfdCkgKyBzaXplb2Yoa21wX2RlcGhhc2hfdCk7CisKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBoID0gKGttcF9kZXBoYXNoX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaXplICk7CisjZWxzZQorICAgIGggPSAoa21wX2RlcGhhc2hfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemUgKTsKKyNlbmRpZgorICAgIGgtPnNpemUgPSBoX3NpemU7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBoLT5uZWxlbWVudHMgPSAwOworICAgIGgtPm5jb25mbGljdHMgPSAwOworI2VuZGlmCisgICAgaC0+YnVja2V0cyA9IChrbXBfZGVwaGFzaF9lbnRyeSAqKikoaCsxKTsKKworICAgIGZvciAoIHNpemVfdCBpID0gMDsgaSA8IGhfc2l6ZTsgaSsrICkKKyAgICAgICAgaC0+YnVja2V0c1tpXSA9IDA7CisKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2RlcGhhc2hfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCApCit7CisgICAgZm9yICggc2l6ZV90IGk9MDsgaSA8IGgtPnNpemU7IGkrKyApIHsKKyAgICAgICAgaWYgKCBoLT5idWNrZXRzW2ldICkgeworICAgICAgICAgICAga21wX2RlcGhhc2hfZW50cnlfdCAqbmV4dDsKKyAgICAgICAgICAgIGZvciAoIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5ID0gaC0+YnVja2V0c1tpXTsgZW50cnk7IGVudHJ5ID0gbmV4dCApIHsKKyAgICAgICAgICAgICAgICBuZXh0ID0gZW50cnktPm5leHRfaW5fYnVja2V0OworICAgICAgICAgICAgICAgIF9fa21wX2RlcG5vZGVfbGlzdF9mcmVlKHRocmVhZCxlbnRyeS0+bGFzdF9pbnMpOworICAgICAgICAgICAgICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLGVudHJ5LT5sYXN0X291dCk7CisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgICAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxlbnRyeSk7CisjZWxzZQorICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxlbnRyeSk7CisjZW5kaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICBfX2ttcF9mYXN0X2ZyZWUodGhyZWFkLGgpOworI2Vsc2UKKyAgICBfX2ttcF90aHJlYWRfZnJlZSh0aHJlYWQsaCk7CisjZW5kaWYKK30KKworc3RhdGljIGttcF9kZXBoYXNoX2VudHJ5ICoKK19fa21wX2RlcGhhc2hfZmluZCAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcGhhc2hfdCAqaCwga21wX2ludHB0cl90IGFkZHIgKQoreworICAgIGttcF9pbnQzMiBidWNrZXQgPSBfX2ttcF9kZXBoYXNoX2hhc2goYWRkcixoLT5zaXplKTsKKworICAgIGttcF9kZXBoYXNoX2VudHJ5X3QgKmVudHJ5OworICAgIGZvciAoIGVudHJ5ID0gaC0+YnVja2V0c1tidWNrZXRdOyBlbnRyeTsgZW50cnkgPSBlbnRyeS0+bmV4dF9pbl9idWNrZXQgKQorICAgICAgICBpZiAoIGVudHJ5LT5hZGRyID09IGFkZHIgKSBicmVhazsKKworICAgIGlmICggZW50cnkgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gY3JlYXRlIGVudHJ5LiBUaGlzIGlzIG9ubHkgZG9uZSBieSBvbmUgdGhyZWFkIHNvIG5vIGxvY2tpbmcgcmVxdWlyZWQKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF9mYXN0X2FsbG9jYXRlKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2Vsc2UKKyAgICAgICAgZW50cnkgPSAoa21wX2RlcGhhc2hfZW50cnlfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNpemVvZihrbXBfZGVwaGFzaF9lbnRyeV90KSApOworI2VuZGlmCisgICAgICAgIGVudHJ5LT5hZGRyID0gYWRkcjsKKyAgICAgICAgZW50cnktPmxhc3Rfb3V0ID0gTlVMTDsKKyAgICAgICAgZW50cnktPmxhc3RfaW5zID0gTlVMTDsKKyAgICAgICAgZW50cnktPm5leHRfaW5fYnVja2V0ID0gaC0+YnVja2V0c1tidWNrZXRdOworICAgICAgICBoLT5idWNrZXRzW2J1Y2tldF0gPSBlbnRyeTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaC0+bmVsZW1lbnRzKys7CisgICAgICAgIGlmICggZW50cnktPm5leHRfaW5fYnVja2V0ICkgaC0+bmNvbmZsaWN0cysrOworI2VuZGlmCisgICAgfQorICAgIHJldHVybiBlbnRyeTsKK30KKworc3RhdGljIGttcF9kZXBub2RlX2xpc3RfdCAqCitfX2ttcF9hZGRfbm9kZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdF90ICpsaXN0LCBrbXBfZGVwbm9kZV90ICpub2RlICkKK3sKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5ld19oZWFkOworCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX2Zhc3RfYWxsb2NhdGUodGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbHNlCisgICAgbmV3X2hlYWQgPSAoa21wX2RlcG5vZGVfbGlzdF90ICopIF9fa21wX3RocmVhZF9tYWxsb2ModGhyZWFkLHNpemVvZihrbXBfZGVwbm9kZV9saXN0X3QpKTsKKyNlbmRpZgorCisgICAgbmV3X2hlYWQtPm5vZGUgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICBuZXdfaGVhZC0+bmV4dCA9IGxpc3Q7CisKKyAgICByZXR1cm4gbmV3X2hlYWQ7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2RlcG5vZGVfbGlzdCAqbGlzdCApCit7CisgICAga21wX2RlcG5vZGVfbGlzdCAqbmV4dDsKKworICAgIGZvciAoIDsgbGlzdCA7IGxpc3QgPSBuZXh0ICkgeworICAgICAgICBuZXh0ID0gbGlzdC0+bmV4dDsKKworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsaXN0LT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxsaXN0KTsKKyNlbmRpZgorICAgIH0KK30KKworc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF90cmFja19kZXBlbmRlbmNlICgga21wX2RlcG5vZGVfdCAqc291cmNlLCBrbXBfZGVwbm9kZV90ICpzaW5rLAorICAgICAgICAgICAgICAgICAgICAgICAgIGttcF90YXNrX3QgKnNpbmtfdGFzayApCit7CisjaWZkZWYgS01QX1NVUFBPUlRfR1JBUEhfT1VUUFVUCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NvdXJjZSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHNvdXJjZS0+ZG4udGFzayk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NpbmsgPSBLTVBfVEFTS19UT19UQVNLREFUQShzaW5rLT5kbi50YXNrKTsgICAgLy8gdGhpcyBjYW4gYmUgTlVMTCB3aGVuIGlmKDApIC4uLgorCisgICAgX19rbXBfcHJpbnRmKCIlZCglcykgLT4gJWQoJXMpXG4iLCBzb3VyY2UtPmRuLmlkLCB0YXNrX3NvdXJjZS0+dGRfaWRlbnQtPnBzb3VyY2UsIHNpbmstPmRuLmlkLCB0YXNrX3NpbmstPnRkX2lkZW50LT5wc291cmNlKTsKKyNlbmRpZgorI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgLyogT01QVCB0cmFja3MgZGVwZW5kZW5jZXMgYmV0d2VlbiB0YXNrIChhPXNvdXJjZSwgYj1zaW5rKSBpbiB3aGljaAorICAgICAgIHRhc2sgYSBibG9ja3MgdGhlIGV4ZWN1dGlvbiBvZiBiIHRocm91Z2ggdGhlIG9tcHRfbmV3X2RlcGVuZGVuY2VfY2FsbGJhY2sgKi8KKyAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpcikpCisgICAgeworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tfc291cmNlID0gS01QX1RBU0tfVE9fVEFTS0RBVEEoc291cmNlLT5kbi50YXNrKTsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrX3NpbmsgPSBLTVBfVEFTS19UT19UQVNLREFUQShzaW5rX3Rhc2spOworCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VfcGFpcikoCisgICAgICAgICAgdGFza19zb3VyY2UtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgdGFza19zaW5rLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkKTsKKyAgICB9CisjZW5kaWYgLyogT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UgKi8KK30KKwordGVtcGxhdGU8IGJvb2wgZmlsdGVyID4KK3N0YXRpYyBpbmxpbmUga21wX2ludDMyCitfX2ttcF9wcm9jZXNzX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX2RlcG5vZGVfdCAqbm9kZSwga21wX2RlcGhhc2hfdCAqaGFzaCwKKyAgICAgICAgICAgICAgICAgICAgIGJvb2wgZGVwX2JhcnJpZXIsa21wX2ludDMyIG5kZXBzLCBrbXBfZGVwZW5kX2luZm9fdCAqZGVwX2xpc3QsCisgICAgICAgICAgICAgICAgICAgICBrbXBfdGFza190ICp0YXNrICkKK3sKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIHByb2Nlc3NpbmcgJWQgZGVwZW5jaWVzIDogZGVwX2JhcnJpZXIgPSAlZFxuIiwgZmlsdGVyLCBndGlkLCBuZGVwcywgZGVwX2JhcnJpZXIgKSApOworCisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzPTA7CisgICAgZm9yICgga21wX2ludDMyIGkgPSAwOyBpIDwgbmRlcHMgOyBpKysgKSB7CisgICAgICAgIGNvbnN0IGttcF9kZXBlbmRfaW5mb190ICogZGVwID0gJmRlcF9saXN0W2ldOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoZGVwLT5mbGFncy5pbik7CisKKyAgICAgICAgaWYgKCBmaWx0ZXIgJiYgZGVwLT5iYXNlX2FkZHIgPT0gMCApIGNvbnRpbnVlOyAvLyBza2lwIGZpbHRlcmVkIGVudHJpZXMKKworICAgICAgICBrbXBfZGVwaGFzaF9lbnRyeV90ICppbmZvID0gX19rbXBfZGVwaGFzaF9maW5kKHRocmVhZCxoYXNoLGRlcC0+YmFzZV9hZGRyKTsKKyAgICAgICAga21wX2RlcG5vZGVfdCAqbGFzdF9vdXQgPSBpbmZvLT5sYXN0X291dDsKKworICAgICAgICBpZiAoIGRlcC0+ZmxhZ3Mub3V0ICYmIGluZm8tPmxhc3RfaW5zICkgeworICAgICAgICAgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICogcCA9IGluZm8tPmxhc3RfaW5zOyBwOyBwID0gcC0+bmV4dCApIHsKKyAgICAgICAgICAgICAgICBrbXBfZGVwbm9kZV90ICogaW5kZXAgPSBwLT5ub2RlOworICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgIEtNUF9BQ1FVSVJFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgICAgIGlmICggaW5kZXAtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF90cmFja19kZXBlbmRlbmNlKGluZGVwLG5vZGUsdGFzayk7CisgICAgICAgICAgICAgICAgICAgICAgICBpbmRlcC0+ZG4uc3VjY2Vzc29ycyA9IF9fa21wX2FkZF9ub2RlKHRocmVhZCwgaW5kZXAtPmRuLnN1Y2Nlc3NvcnMsIG5vZGUpOworICAgICAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoNDAsKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGFkZGluZyBkZXBlbmRlbmNlIGZyb20gJXAgdG8gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmaWx0ZXIsZ3RpZCwgS01QX1RBU0tfVE9fVEFTS0RBVEEoaW5kZXAtPmRuLnRhc2spLCBLTVBfVEFTS19UT19UQVNLREFUQShub2RlLT5kbi50YXNrKSkpOworICAgICAgICAgICAgICAgICAgICAgICAgbnByZWRlY2Vzc29ycysrOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIEtNUF9SRUxFQVNFX0RFUE5PREUoZ3RpZCxpbmRlcCk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9kZXBub2RlX2xpc3RfZnJlZSh0aHJlYWQsaW5mby0+bGFzdF9pbnMpOworICAgICAgICAgICAgaW5mby0+bGFzdF9pbnMgPSBOVUxMOworCisgICAgICAgIH0gZWxzZSBpZiAoIGxhc3Rfb3V0ICYmIGxhc3Rfb3V0LT5kbi50YXNrICkgeworICAgICAgICAgICAgS01QX0FDUVVJUkVfREVQTk9ERShndGlkLGxhc3Rfb3V0KTsKKyAgICAgICAgICAgIGlmICggbGFzdF9vdXQtPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfdHJhY2tfZGVwZW5kZW5jZShsYXN0X291dCxub2RlLHRhc2spOworICAgICAgICAgICAgICAgIGxhc3Rfb3V0LT5kbi5zdWNjZXNzb3JzID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBsYXN0X291dC0+ZG4uc3VjY2Vzc29ycywgbm9kZSk7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoNDAsKCJfX2ttcF9wcm9jZXNzX2RlcHM8JWQ+OiBUIyVkIGFkZGluZyBkZXBlbmRlbmNlIGZyb20gJXAgdG8gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbHRlcixndGlkLCBLTVBfVEFTS19UT19UQVNLREFUQShsYXN0X291dC0+ZG4udGFzayksIEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5vZGUtPmRuLnRhc2spKSk7CisKKyAgICAgICAgICAgICAgICBucHJlZGVjZXNzb3JzKys7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbGFzdF9vdXQpOworICAgICAgICB9CisKKyAgICAgICAgaWYgKCBkZXBfYmFycmllciApIHsKKyAgICAgICAgICAgIC8vIGlmIHRoaXMgaXMgYSBzeW5jIHBvaW50IGluIHRoZSBzZXJpYWwgc2VxdWVuY2UsIHRoZW4gdGhlIHByZXZpb3VzIG91dHB1dHMgYXJlIGd1YXJhbnRlZWQgdG8gYmUgY29tcGxldGVkIGFmdGVyCisgICAgICAgICAgICAvLyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgdGFzayBzbyB0aGUgcHJldmlvdXMgb3V0cHV0IG5vZGVzIGNhbiBiZSBjbGVhcmVkLgorICAgICAgICAgICAgX19rbXBfbm9kZV9kZXJlZih0aHJlYWQsbGFzdF9vdXQpOworICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBOVUxMOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgaWYgKCBkZXAtPmZsYWdzLm91dCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxsYXN0X291dCk7CisgICAgICAgICAgICAgICAgaW5mby0+bGFzdF9vdXQgPSBfX2ttcF9ub2RlX3JlZihub2RlKTsKKyAgICAgICAgICAgIH0gZWxzZQorICAgICAgICAgICAgICAgIGluZm8tPmxhc3RfaW5zID0gX19rbXBfYWRkX25vZGUodGhyZWFkLCBpbmZvLT5sYXN0X2lucywgbm9kZSk7CisgICAgICAgIH0KKworICAgIH0KKworICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX3Byb2Nlc3NfZGVwczwlZD46IFQjJWQgZm91bmQgJWQgcHJlZGVjZXNzb3JzXG4iLCBmaWx0ZXIsIGd0aWQsIG5wcmVkZWNlc3NvcnMgKSApOworCisgICAgcmV0dXJuIG5wcmVkZWNlc3NvcnM7Cit9CisKKyNkZWZpbmUgTk9fREVQX0JBUlJJRVIgKGZhbHNlKQorI2RlZmluZSBERVBfQkFSUklFUiAodHJ1ZSkKKworLy8gcmV0dXJucyB0cnVlIGlmIHRoZSB0YXNrIGhhcyBhbnkgb3V0c3RhbmRpbmcgZGVwZW5kZW5jZQorc3RhdGljIGJvb2wKK19fa21wX2NoZWNrX2RlcHMgKCBrbXBfaW50MzIgZ3RpZCwga21wX2RlcG5vZGVfdCAqbm9kZSwga21wX3Rhc2tfdCAqdGFzaywga21wX2RlcGhhc2hfdCAqaGFzaCwgYm9vbCBkZXBfYmFycmllciwKKyAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbmRlcHNfbm9hbGlhcywga21wX2RlcGVuZF9pbmZvX3QgKm5vYWxpYXNfZGVwX2xpc3QgKQoreworICAgIGludCBpOworCisjaWYgS01QX0RFQlVHCisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2hlY2tfZGVwczogVCMlZCBjaGVja2luZyBkZXBlbmRlbmNpZXMgZm9yIHRhc2sgJXAgOiAlZCBwb3NzaWJseSBhbGlhc2VkIGRlcGVuZGVuY2llcywgJWQgbm9uLWFsaWFzZWQgZGVwZWRlbmNpZXMgOiBkZXBfYmFycmllcj0lZCAuXG4iLCBndGlkLCB0YXNrZGF0YSwgbmRlcHMsIG5kZXBzX25vYWxpYXMsIGRlcF9iYXJyaWVyICkgKTsKKworICAgIC8vIEZpbHRlciBkZXBzIGluIGRlcF9saXN0CisgICAgLy8gVE9ETzogRGlmZmVyZW50IGFsZ29yaXRobSBmb3IgbGFyZ2UgZGVwX2xpc3QgKCA+IDEwID8gKQorICAgIGZvciAoIGkgPSAwOyBpIDwgbmRlcHM7IGkgKysgKSB7CisgICAgICAgIGlmICggZGVwX2xpc3RbaV0uYmFzZV9hZGRyICE9IDAgKQorICAgICAgICAgICAgZm9yICggaW50IGogPSBpKzE7IGogPCBuZGVwczsgaisrICkKKyAgICAgICAgICAgICAgICBpZiAoIGRlcF9saXN0W2ldLmJhc2VfYWRkciA9PSBkZXBfbGlzdFtqXS5iYXNlX2FkZHIgKSB7CisgICAgICAgICAgICAgICAgICAgIGRlcF9saXN0W2ldLmZsYWdzLmluIHw9IGRlcF9saXN0W2pdLmZsYWdzLmluOworICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdFtpXS5mbGFncy5vdXQgfD0gZGVwX2xpc3Rbal0uZmxhZ3Mub3V0OworICAgICAgICAgICAgICAgICAgICBkZXBfbGlzdFtqXS5iYXNlX2FkZHIgPSAwOyAvLyBNYXJrIGogZWxlbWVudCBhcyB2b2lkCisgICAgICAgICAgICAgICAgfQorICAgIH0KKworICAgIC8vIGRvZXNuJ3QgbmVlZCB0byBiZSBhdG9taWMgYXMgbm8gb3RoZXIgdGhyZWFkIGlzIGdvaW5nIHRvIGJlIGFjY2Vzc2luZyB0aGlzIG5vZGUganVzdCB5ZXQKKyAgICAvLyBucHJlZGVjZXNzb3JzIGlzIHNldCAtMSB0byBlbnN1cmUgdGhhdCBub25lIG9mIHRoZSByZWxlYXNpbmcgdGFza3MgcXVldWVzIHRoaXMgdGFzayBiZWZvcmUgd2UgaGF2ZSBmaW5pc2hlZCBwcm9jZXNzaW5nIGFsbCB0aGUgZGVwZW5kZW5jaWVzCisgICAgbm9kZS0+ZG4ubnByZWRlY2Vzc29ycyA9IC0xOworCisgICAgLy8gdXNlZCB0byBwYWNrIGFsbCBucHJlZGVjZXNzb3JzIGFkZGl0aW9ucyBpbnRvIGEgc2luZ2xlIGF0b21pYyBvcGVyYXRpb24gYXQgdGhlIGVuZAorICAgIGludCBucHJlZGVjZXNzb3JzOworCisgICAgbnByZWRlY2Vzc29ycyA9IF9fa21wX3Byb2Nlc3NfZGVwczx0cnVlPihndGlkLCBub2RlLCBoYXNoLCBkZXBfYmFycmllciwKKyAgICAgIG5kZXBzLCBkZXBfbGlzdCwgdGFzayk7CisgICAgbnByZWRlY2Vzc29ycyArPSBfX2ttcF9wcm9jZXNzX2RlcHM8ZmFsc2U+KGd0aWQsIG5vZGUsIGhhc2gsIGRlcF9iYXJyaWVyLAorICAgICAgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCwgdGFzayk7CisKKyAgICBub2RlLT5kbi50YXNrID0gdGFzazsKKyAgICBLTVBfTUIoKTsKKworICAgIC8vIEFjY291bnQgZm9yIG91ciBpbml0aWFsIGZha2UgdmFsdWUKKyAgICBucHJlZGVjZXNzb3JzKys7CisKKyAgICAvLyBVcGRhdGUgcHJlZGVjZXNzb3JzIGFuZCBvYnRhaW4gY3VycmVudCB2YWx1ZSB0byBjaGVjayBpZiB0aGVyZSBhcmUgc3RpbGwgYW55IG91dHN0YW5kaWcgZGVwZW5kZW5jZXMgKHNvbWUgdGFza3MgbWF5IGhhdmUgZmluaXNoZWQgd2hpbGUgd2UgcHJvY2Vzc2VkIHRoZSBkZXBlbmRlbmNlcykKKyAgICBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9BREQzMigmbm9kZS0+ZG4ubnByZWRlY2Vzc29ycywgbnByZWRlY2Vzc29ycykgKyBucHJlZGVjZXNzb3JzOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfY2hlY2tfZGVwczogVCMlZCBmb3VuZCAlZCBwcmVkZWNlc3NvcnMgZm9yIHRhc2sgJXAgXG4iLCBndGlkLCBucHJlZGVjZXNzb3JzLCB0YXNrZGF0YSApICk7CisKKyAgICAvLyBiZXlvbmQgdGhpcyBwb2ludCB0aGUgdGFzayBjb3VsZCBiZSBxdWV1ZWQgKGFuZCBleGVjdXRlZCkgYnkgYSByZWxlYXNpbmcgdGFzay4uLgorICAgIHJldHVybiBucHJlZGVjZXNzb3JzID4gMCA/IHRydWUgOiBmYWxzZTsKK30KKwordm9pZAorX19rbXBfcmVsZWFzZV9kZXBzICgga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICp0YXNrICkKK3sKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX2RlcG5vZGVfdCAqbm9kZSA9IHRhc2stPnRkX2RlcG5vZGU7CisKKyAgICBpZiAoIHRhc2stPnRkX2RlcGhhc2ggKSB7CisgICAgICAgIEtBX1RSQUNFKDQwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgZnJlZWluZyBkZXBlbmRlbmNpZXMgaGFzaCBvZiB0YXNrICVwLlxuIiwgZ3RpZCwgdGFzayApICk7CisgICAgICAgIF9fa21wX2RlcGhhc2hfZnJlZSh0aHJlYWQsdGFzay0+dGRfZGVwaGFzaCk7CisgICAgfQorCisgICAgaWYgKCAhbm9kZSApIHJldHVybjsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3JlYWxlYXNlX2RlcHM6IFQjJWQgbm90aWZ5aW5nIHN1Y2Nlc29ycyBvZiB0YXNrICVwLlxuIiwgZ3RpZCwgdGFzayApICk7CisKKyAgICBLTVBfQUNRVUlSRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisgICAgbm9kZS0+ZG4udGFzayA9IE5VTEw7IC8vIG1hcmsgdGhpcyB0YXNrIGFzIGZpbmlzaGVkLCBzbyBubyBuZXcgZGVwZW5kZW5jaWVzIGFyZSBnZW5lcmF0ZWQKKyAgICBLTVBfUkVMRUFTRV9ERVBOT0RFKGd0aWQsbm9kZSk7CisKKyAgICBrbXBfZGVwbm9kZV9saXN0X3QgKm5leHQ7CisgICAgZm9yICgga21wX2RlcG5vZGVfbGlzdF90ICpwID0gbm9kZS0+ZG4uc3VjY2Vzc29yczsgcDsgcCA9IG5leHQgKSB7CisgICAgICAgIGttcF9kZXBub2RlX3QgKnN1Y2Nlc3NvciA9IHAtPm5vZGU7CisgICAgICAgIGttcF9pbnQzMiBucHJlZGVjZXNzb3JzID0gS01QX1RFU1RfVEhFTl9ERUMzMigmc3VjY2Vzc29yLT5kbi5ucHJlZGVjZXNzb3JzKSAtIDE7CisKKyAgICAgICAgLy8gc3VjY2Vzc29yIHRhc2sgY2FuIGJlIE5VTEwgZm9yIHdhaXRfZGVwZW5kcyBvciBiZWNhdXNlIGRlcHMgYXJlIHN0aWxsIGJlaW5nIHByb2Nlc3NlZAorICAgICAgICBpZiAoIG5wcmVkZWNlc3NvcnMgPT0gMCApIHsKKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICAgICAgaWYgKCBzdWNjZXNzb3ItPmRuLnRhc2sgKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBzdWNjZXNzb3IgJXAgb2YgJXAgc2NoZWR1bGVkIGZvciBleGVjdXRpb24uXG4iLCBndGlkLCBzdWNjZXNzb3ItPmRuLnRhc2ssIHRhc2sgKSApOworICAgICAgICAgICAgICAgIF9fa21wX29tcF90YXNrKGd0aWQsc3VjY2Vzc29yLT5kbi50YXNrLGZhbHNlKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIG5leHQgPSBwLT5uZXh0OworICAgICAgICBfX2ttcF9ub2RlX2RlcmVmKHRocmVhZCxwLT5ub2RlKTsKKyNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICAgICAgX19rbXBfZmFzdF9mcmVlKHRocmVhZCxwKTsKKyNlbHNlCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKHRocmVhZCxwKTsKKyNlbmRpZgorICAgIH0KKworICAgIF9fa21wX25vZGVfZGVyZWYodGhyZWFkLG5vZGUpOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcmVhbGVhc2VfZGVwczogVCMlZCBhbGwgc3VjY2Vzc29ycyBvZiAlcCBub3RpZmllZCBvZiBjb21wbGV0YXRpb25cbiIsIGd0aWQsIHRhc2sgKSApOworfQorCisvKiEKK0Bpbmdyb3VwIFRBU0tJTkcKK0BwYXJhbSBsb2NfcmVmIGxvY2F0aW9uIG9mIHRoZSBvcmlnaW5hbCB0YXNrIGRpcmVjdGl2ZQorQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gbmV3X3Rhc2sgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKSBmb3IgdGhlICcnbmV3IHRhc2snJworQHBhcmFtIG5kZXBzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBwb3NzaWJsZSBhbGlhc2luZworQHBhcmFtIGRlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBuZGVwc19ub2FsaWFzIE51bWJlciBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworQHBhcmFtIG5vYWxpYXNfZGVwX2xpc3QgTGlzdCBvZiBkZXBlbmQgaXRlbXMgd2l0aCBubyBhbGlhc2luZworCitAcmV0dXJuIFJldHVybnMgZWl0aGVyIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEIGlmIHRoZSBjdXJyZW50IHRhc2sgd2FzIG5vdCBzdXNwZW5kZW5kIGFuZCBxdWV1ZWQsIG9yIFRBU0tfQ1VSUkVOVF9RVUVVRUQgaWYgaXQgd2FzIHN1c3BlbmRlZCBhbmQgcXVldWVkCisKK1NjaGVkdWxlIGEgbm9uLXRocmVhZC1zd2l0Y2hhYmxlIHRhc2sgd2l0aCBkZXBlbmRlbmNlcyBmb3IgZXhlY3V0aW9uCisqLwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwcywga21wX2RlcGVuZF9pbmZvX3QgKmRlcF9saXN0LAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBuZGVwc19ub2FsaWFzLCBrbXBfZGVwZW5kX2luZm9fdCAqbm9hbGlhc19kZXBfbGlzdCApCit7CisKKyAgICBrbXBfdGFza2RhdGFfdCAqIG5ld190YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKG5ld190YXNrKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgLyogT01QVCBncmFiIGFsbCBkZXBlbmRlbmNlcyBpZiByZXF1ZXN0ZWQgYnkgdGhlIHRvb2wgKi8KKyAgICBpZiAob21wdF9lbmFibGVkICYmIG5kZXBzK25kZXBzX25vYWxpYXMgPiAwICYmCisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzKSkKKwl7CisgICAgICAgIGttcF9pbnQzMiBpOworCisgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8ubmRlcHMgPSBuZGVwcytuZGVwc19ub2FsaWFzOworICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHMgPSAob21wdF90YXNrX2RlcGVuZGVuY2VfdCAqKQorICAgICAgICAgIEtNUF9PTVBUX0RFUFNfQUxMT0ModGhyZWFkLAorICAgICAgICAgICAgIChuZGVwcytuZGVwc19ub2FsaWFzKSpzaXplb2Yob21wdF90YXNrX2RlcGVuZGVuY2VfdCkpOworCisgICAgICAgIEtNUF9BU1NFUlQobmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzICE9IE5VTEwpOworCisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBuZGVwczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0udmFyaWFibGVfYWRkciA9CisgICAgICAgICAgICAgICh2b2lkKikgZGVwX2xpc3RbaV0uYmFzZV9hZGRyOworICAgICAgICAgICAgaWYgKGRlcF9saXN0W2ldLmZsYWdzLmluICYmIGRlcF9saXN0W2ldLmZsYWdzLm91dCkKKyAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbaV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0OworICAgICAgICAgICAgZWxzZSBpZiAoZGVwX2xpc3RbaV0uZmxhZ3Mub3V0KQorICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwc1tpXS5kZXBlbmRlbmNlX2ZsYWdzID0KKyAgICAgICAgICAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfb3V0OworICAgICAgICAgICAgZWxzZSBpZiAoZGVwX2xpc3RbaV0uZmxhZ3MuaW4pCisgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW2ldLmRlcGVuZGVuY2VfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgb21wdF90YXNrX2RlcGVuZGVuY2VfdHlwZV9pbjsKKyAgICAgICAgfQorICAgICAgICBmb3IgKGkgPSAwOyBpIDwgbmRlcHNfbm9hbGlhczsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbbmRlcHMraV0udmFyaWFibGVfYWRkciA9CisgICAgICAgICAgICAgICh2b2lkKikgbm9hbGlhc19kZXBfbGlzdFtpXS5iYXNlX2FkZHI7CisgICAgICAgICAgICBpZiAobm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5pbiAmJiBub2FsaWFzX2RlcF9saXN0W2ldLmZsYWdzLm91dCkKKyAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHNbbmRlcHMraV0uZGVwZW5kZW5jZV9mbGFncyA9CisgICAgICAgICAgICAgICAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90eXBlX2lub3V0OworICAgICAgICAgICAgZWxzZSBpZiAobm9hbGlhc19kZXBfbGlzdFtpXS5mbGFncy5vdXQpCisgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzW25kZXBzK2ldLmRlcGVuZGVuY2VfZmxhZ3MgPQorICAgICAgICAgICAgICAgICAgb21wdF90YXNrX2RlcGVuZGVuY2VfdHlwZV9vdXQ7CisgICAgICAgICAgICBlbHNlIGlmIChub2FsaWFzX2RlcF9saXN0W2ldLmZsYWdzLmluKQorICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwc1tuZGVwcytpXS5kZXBlbmRlbmNlX2ZsYWdzID0KKyAgICAgICAgICAgICAgICAgIG9tcHRfdGFza19kZXBlbmRlbmNlX3R5cGVfaW47CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYgLyogT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UgKi8KKworICAgIGJvb2wgc2VyaWFsID0gY3VycmVudF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBzZXJpYWwgPSBzZXJpYWwgJiYgIShuZXdfdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkpOworI2VuZGlmCisKKyAgICBpZiAoICFzZXJpYWwgJiYgKCBuZGVwcyA+IDAgfHwgbmRlcHNfbm9hbGlhcyA+IDAgKSkgeworICAgICAgICAvKiBpZiBubyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIHRyYWNrZWQgeWV0LCBjcmVhdGUgdGhlIGRlcGVuZGVuY2UgaGFzaCAqLworICAgICAgICBpZiAoIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9PSBOVUxMICkKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCA9IF9fa21wX2RlcGhhc2hfY3JlYXRlKHRocmVhZCwgY3VycmVudF90YXNrKTsKKworI2lmIFVTRV9GQVNUX01FTU9SWQorICAgICAgICBrbXBfZGVwbm9kZV90ICpub2RlID0gKGttcF9kZXBub2RlX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSh0aHJlYWQsc2l6ZW9mKGttcF9kZXBub2RlX3QpKTsKKyNlbHNlCisgICAgICAgIGttcF9kZXBub2RlX3QgKm5vZGUgPSAoa21wX2RlcG5vZGVfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKHRocmVhZCxzaXplb2Yoa21wX2RlcG5vZGVfdCkpOworI2VuZGlmCisKKyAgICAgICAgX19rbXBfaW5pdF9ub2RlKG5vZGUpOworICAgICAgICBuZXdfdGFza2RhdGEtPnRkX2RlcG5vZGUgPSBub2RlOworCisgICAgICAgIGlmICggX19rbXBfY2hlY2tfZGVwcyggZ3RpZCwgbm9kZSwgbmV3X3Rhc2ssIGN1cnJlbnRfdGFzay0+dGRfZGVwaGFzaCwgTk9fREVQX0JBUlJJRVIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLG5vYWxpYXNfZGVwX2xpc3QgKSApIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza193aXRoX2RlcHMoZXhpdCk6IFQjJWQgdGFzayBoYWQgYmxvY2tpbmcgZGVwZW5kZW5jaWVzOiAiCisgICAgICAgICAgICAgICAgICAibG9jPSVwIHRhc2s9JXAsIHJldHVybjogVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIGxvY19yZWYsCisgICAgICAgICAgICAgICAgICBuZXdfdGFza2RhdGEgKSApOworICAgICAgICAgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICBrbXBfdGFza190ZWFtX3QgKiB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgaWYgKCB0YXNrX3RlYW0gJiYgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyApCisgICAgICAgICAgIF9fa21wY19vbXBfd2FpdF9kZXBzICggbG9jX3JlZiwgZ3RpZCwgbmRlcHMsIGRlcF9saXN0LCBuZGVwc19ub2FsaWFzLCBub2FsaWFzX2RlcF9saXN0ICk7CisgICAgICAgIGVsc2UKKyNlbmRpZgorICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGV4aXQpOiBUIyVkIGlnbm9yZWQgZGVwZW5kZW5jaWVzIGZvciB0YXNrIChzZXJpYWxpemVkKSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcFxuIiwgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfd2l0aF9kZXBzKGV4aXQpOiBUIyVkIHRhc2sgaGFkIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6ICIKKyAgICAgICAgICAgICAgICAgICJsb2M9JXAgdGFzaz0lcCwgdHJhbnNmZXJyaW5nIHRvIF9fa21wY19vbXBfdGFza1xuIiwgZ3RpZCwgbG9jX3JlZiwKKyAgICAgICAgICAgICAgICAgIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXR1cm4gX19rbXBjX29tcF90YXNrKGxvY19yZWYsZ3RpZCxuZXdfdGFzayk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvY19yZWYgbG9jYXRpb24gb2YgdGhlIG9yaWdpbmFsIHRhc2sgZGlyZWN0aXZlCitAcGFyYW0gZ3RpZCBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKK0BwYXJhbSBuZGVwcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggcG9zc2libGUgYWxpYXNpbmcKK0BwYXJhbSBkZXBfbGlzdCBMaXN0IG9mIGRlcGVuZCBpdGVtcyB3aXRoIHBvc3NpYmxlIGFsaWFzaW5nCitAcGFyYW0gbmRlcHNfbm9hbGlhcyBOdW1iZXIgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKK0BwYXJhbSBub2FsaWFzX2RlcF9saXN0IExpc3Qgb2YgZGVwZW5kIGl0ZW1zIHdpdGggbm8gYWxpYXNpbmcKKworQmxvY2tzIHRoZSBjdXJyZW50IHRhc2sgdW50aWwgYWxsIHNwZWNpZmllcyBkZXBlbmRlbmNpZXMgaGF2ZSBiZWVuIGZ1bGZpbGxlZC4KKyovCit2b2lkCitfX2ttcGNfb21wX3dhaXRfZGVwcyAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfaW50MzIgbmRlcHMsIGttcF9kZXBlbmRfaW5mb190ICpkZXBfbGlzdCwKKyAgICAgICAgICAgICAgICAgICAgICAga21wX2ludDMyIG5kZXBzX25vYWxpYXMsIGttcF9kZXBlbmRfaW5mb190ICpub2FsaWFzX2RlcF9saXN0ICkKK3sKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3dhaXRfZGVwcyhlbnRlcik6IFQjJWQgbG9jPSVwXG4iLCBndGlkLCBsb2NfcmVmKSApOworCisgICAgaWYgKCBuZGVwcyA9PSAwICYmIG5kZXBzX25vYWxpYXMgPT0gMCApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGRlcGVuZGVuY2llcyB0byB3YWl0IHVwb24gOiBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBrbXBfaW5mb190ICp0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAga21wX3Rhc2tkYXRhX3QgKiBjdXJyZW50X3Rhc2sgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIC8vIFdlIGNhbiByZXR1cm4gaW1tZWRpYXRlbHkgYXM6CisgICAgLy8gICAtIGRlcGVuZGVuY2VzIGFyZSBub3QgY29tcHV0ZWQgaW4gc2VyaWFsIHRlYW1zIChleGNlcHQgaWYgd2UgaGF2ZSBwcm94eSB0YXNrcykKKyAgICAvLyAgIC0gaWYgdGhlIGRlcGhhc2ggaXMgbm90IHlldCBjcmVhdGVkIGl0IG1lYW5zIHdlIGhhdmUgbm90aGluZyB0byB3YWl0IGZvcgorICAgIGJvb2wgaWdub3JlID0gY3VycmVudF90YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBjdXJyZW50X3Rhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyIHx8IGN1cnJlbnRfdGFzay0+dGRfZmxhZ3MuZmluYWw7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBpZ25vcmUgPSBpZ25vcmUgJiYgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MgPT0gRkFMU0U7CisjZW5kaWYKKyAgICBpZ25vcmUgPSBpZ25vcmUgfHwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoID09IE5VTEw7CisKKyAgICBpZiAoIGlnbm9yZSApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgaGFzIG5vIGJsb2NraW5nIGRlcGVuZGVuY2llcyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworICAgIGttcF9kZXBub2RlX3Qgbm9kZTsKKyAgICBfX2ttcF9pbml0X25vZGUoJm5vZGUpOworCisgICAgaWYgKCFfX2ttcF9jaGVja19kZXBzKCBndGlkLCAmbm9kZSwgTlVMTCwgY3VycmVudF90YXNrLT50ZF9kZXBoYXNoLCBERVBfQkFSUklFUiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIG5kZXBzLCBkZXBfbGlzdCwgbmRlcHNfbm9hbGlhcywgbm9hbGlhc19kZXBfbGlzdCApKSB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfd2FpdF9kZXBzKGV4aXQpOiBUIyVkIGhhcyBubyBibG9ja2luZyBkZXBlbmRlbmNpZXMgOiBsb2M9JXBcbiIsIGd0aWQsIGxvY19yZWYpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisgICAga21wX2ZsYWdfMzIgZmxhZygodm9sYXRpbGUga21wX3VpbnQzMiAqKSYobm9kZS5kbi5ucHJlZGVjZXNzb3JzKSwgMFUpOworICAgIHdoaWxlICggbm9kZS5kbi5ucHJlZGVjZXNzb3JzID4gMCApIHsKKyAgICAgICAgZmxhZy5leGVjdXRlX3Rhc2tzKHRocmVhZCwgZ3RpZCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQsCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAgTlVMTCwKKyNlbmRpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF93YWl0X2RlcHMoZXhpdCk6IFQjJWQgZmluaXNoZWQgd2FpdGluZyA6IGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKK30KKworI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2UxYjYzZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza2luZy5jCkBAIC0wLDAgKzEsMzEwMiBAQAorLyoKKyAqIGttcF90YXNraW5nLmMgLS0gT3Blbk1QIDMuMCB0YXNraW5nIHN1cHBvcnQuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisjaW5jbHVkZSAia21wX3N0YXRzLmgiCisKKyNpZiBPTVBUX1NVUFBPUlQKKyNpbmNsdWRlICJvbXB0LXNwZWNpZmljLmgiCisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworCisvKiBmb3J3YXJkIGRlY2xhcmF0aW9uICovCitzdGF0aWMgdm9pZCBfX2ttcF9lbmFibGVfdGFza2luZygga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0sIGttcF9pbmZvX3QgKnRoaXNfdGhyICk7CitzdGF0aWMgdm9pZCBfX2ttcF9hbGxvY190YXNrX2RlcXVlKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApOworc3RhdGljIGludCAgX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSApOworCisjaWZkZWYgT01QXzQ1X0VOQUJMRUQKK3N0YXRpYyB2b2lkIF9fa21wX2JvdHRvbV9oYWxmX2ZpbmlzaF9wcm94eSgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiBwdGFzayApOworI2VuZGlmCisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vICBfX2ttcF90cmFjZV90YXNrX3N0YWNrOiBwcmludCB0aGUgdGllZCB0YXNrcyBmcm9tIHRoZSB0YXNrIHN0YWNrIGluIG9yZGVyCisvLyAgICAgZnJvbSB0b3AgZG8gYm90dG9tCisvLworLy8gIGd0aWQ6IGdsb2JhbCB0aHJlYWQgaWRlbnRpZmllciBmb3IgdGhyZWFkIGNvbnRhaW5pbmcgc3RhY2sKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGRhdGEgZm9yIHRhc2sgdGVhbSB0aHJlYWQgY29udGFpbmluZyBzdGFjaworLy8gIHRocmVzaG9sZDogdmFsdWUgYWJvdmUgd2hpY2ggdGhlIHRyYWNlIHN0YXRlbWVudCB0cmlnZ2VycworLy8gIGxvY2F0aW9uOiBzdHJpbmcgaWRlbnRpZnlpbmcgY2FsbCBzaXRlIG9mIHRoaXMgZnVuY3Rpb24gKGZvciB0cmFjZSkKKworc3RhdGljIHZvaWQKK19fa21wX3RyYWNlX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEsIGludCB0aHJlc2hvbGQsIGNoYXIgKmxvY2F0aW9uICkKK3sKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzOworICAgIGttcF90YXNrZGF0YV90ICoqc3RhY2tfdG9wID0gdGFza19zdGFjayAtPiB0c190b3A7CisgICAga21wX2ludDMyIGVudHJpZXMgPSB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXM7CisgICAga21wX3Rhc2tkYXRhX3QgKnRpZWRfdGFzazsKKworICAgIEtBX1RSQUNFKHRocmVzaG9sZCwgKCJfX2ttcF90cmFjZV90YXNrX3N0YWNrKHN0YXJ0KTogbG9jYXRpb24gPSAlcywgZ3RpZCA9ICVkLCBlbnRyaWVzID0gJWQsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAiZmlyc3RfYmxvY2sgPSAlcCwgc3RhY2tfdG9wID0gJXAgXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgIGxvY2F0aW9uLCBndGlkLCBlbnRyaWVzLCB0YXNrX3N0YWNrLT50c19maXJzdF9ibG9jaywgc3RhY2tfdG9wICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YWNrX3RvcCAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZW50cmllcyA+IDAgKTsKKworICAgIHdoaWxlICggZW50cmllcyAhPSAwICkKKyAgICB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHN0YWNrX3RvcCAhPSAmIHRhc2tfc3RhY2stPnRzX2ZpcnN0X2Jsb2NrLnNiX2Jsb2NrWzBdICk7CisgICAgICAgIC8vIGZpeCB1cCB0c190b3AgaWYgd2UgbmVlZCB0byBwb3AgZnJvbSBwcmV2aW91cyBibG9jaworICAgICAgICBpZiAoIGVudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCApCisgICAgICAgIHsKKyAgICAgICAgICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9IChrbXBfc3RhY2tfYmxvY2tfdCAqKSAoc3RhY2tfdG9wKSA7CisKKyAgICAgICAgICAgIHN0YWNrX2Jsb2NrID0gc3RhY2tfYmxvY2sgLT4gc2JfcHJldjsKKyAgICAgICAgICAgIHN0YWNrX3RvcCA9ICYgc3RhY2tfYmxvY2sgLT4gc2JfYmxvY2tbVEFTS19TVEFDS19CTE9DS19TSVpFXTsKKyAgICAgICAgfQorCisgICAgICAgIC8vIGZpbmlzaCBib29ra2VlcGluZworICAgICAgICBzdGFja190b3AtLTsKKyAgICAgICAgZW50cmllcy0tOworCisgICAgICAgIHRpZWRfdGFzayA9ICogc3RhY2tfdG9wOworCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAhPSBOVUxMICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX1RJRUQgKTsKKworICAgICAgICBLQV9UUkFDRSh0aHJlc2hvbGQsICgiX19rbXBfdHJhY2VfdGFza19zdGFjayglcyk6ICAgICAgICAgICAgIGd0aWQ9JWQsIGVudHJ5PSVkLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJzdGFja190b3A9JXAsIHRpZWRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQsIGVudHJpZXMsIHN0YWNrX3RvcCwgdGllZF90YXNrICkgKTsKKyAgICB9CisgICAgS01QX0RFQlVHX0FTU0VSVCggc3RhY2tfdG9wID09ICYgdGFza19zdGFjay0+dHNfZmlyc3RfYmxvY2suc2JfYmxvY2tbMF0gKTsKKworICAgIEtBX1RSQUNFKHRocmVzaG9sZCwgKCJfX2ttcF90cmFjZV90YXNrX3N0YWNrKGV4aXQpOiBsb2NhdGlvbiA9ICVzLCBndGlkID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgbG9jYXRpb24sIGd0aWQgKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2luaXRfdGFza19zdGFjazogaW5pdGlhbGl6ZSB0aGUgdGFzayBzdGFjayBmb3IgdGhlIGZpcnN0IHRpbWUKKy8vICAgIGFmdGVyIGEgdGhyZWFkX2RhdGEgc3RydWN0dXJlIGlzIGNyZWF0ZWQuCisvLyAgICBJdCBzaG91bGQgbm90IGJlIG5lY2Vzc2FyeSB0byBkbyB0aGlzIGFnYWluIChhc3N1bWluZyB0aGUgc3RhY2sgd29ya3MpLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgb2YgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWRfZGF0YTogdGhyZWFkIGRhdGEgZm9yIHRhc2sgdGVhbSB0aHJlYWQgY29udGFpbmluZyBzdGFjaworCitzdGF0aWMgdm9pZAorX19rbXBfaW5pdF90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzOworICAgIGttcF9zdGFja19ibG9ja190ICpmaXJzdF9ibG9jazsKKworICAgIC8vIHNldCB1cCB0aGUgZmlyc3QgYmxvY2sgb2YgdGhlIHN0YWNrCisgICAgZmlyc3RfYmxvY2sgPSAmIHRhc2tfc3RhY2sgLT4gdHNfZmlyc3RfYmxvY2s7CisgICAgdGFza19zdGFjayAtPiB0c190b3AgPSAoa21wX3Rhc2tkYXRhX3QgKiopIGZpcnN0X2Jsb2NrOworICAgIG1lbXNldCggKHZvaWQgKikgZmlyc3RfYmxvY2ssICdcMCcsIFRBU0tfU1RBQ0tfQkxPQ0tfU0laRSAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSk7CisKKyAgICAvLyBpbml0aWFsaXplIHRoZSBzdGFjayB0byBiZSBlbXB0eQorICAgIHRhc2tfc3RhY2sgIC0+IHRzX2VudHJpZXMgPSBUQVNLX1NUQUNLX0VNUFRZOworICAgIGZpcnN0X2Jsb2NrIC0+IHNiX25leHQgPSBOVUxMOworICAgIGZpcnN0X2Jsb2NrIC0+IHNiX3ByZXYgPSBOVUxMOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfZnJlZV90YXNrX3N0YWNrOiBmcmVlIHRoZSB0YXNrIHN0YWNrIHdoZW4gdGhyZWFkX2RhdGEgaXMgZGVzdHJveWVkLgorLy8KKy8vICBndGlkOiBnbG9iYWwgdGhyZWFkIGlkZW50aWZpZXIgZm9yIGNhbGxpbmcgdGhyZWFkCisvLyAgdGhyZWFkX2RhdGE6IHRocmVhZCBpbmZvIGZvciB0aHJlYWQgY29udGFpbmluZyBzdGFjaworCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBrbXBfdGFza19zdGFja190ICp0YXNrX3N0YWNrID0gJiB0aHJlYWRfZGF0YS0+dGQudGRfc3VzcF90aWVkX3Rhc2tzOworICAgIGttcF9zdGFja19ibG9ja190ICpzdGFja19ibG9jayA9ICYgdGFza19zdGFjayAtPiB0c19maXJzdF9ibG9jazsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyA9PSBUQVNLX1NUQUNLX0VNUFRZICk7CisgICAgLy8gZnJlZSBmcm9tIHRoZSBzZWNvbmQgYmxvY2sgb2YgdGhlIHN0YWNrCisgICAgd2hpbGUgKCBzdGFja19ibG9jayAhPSBOVUxMICkgeworICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqbmV4dF9ibG9jayA9IChzdGFja19ibG9jaykgPyBzdGFja19ibG9jayAtPiBzYl9uZXh0IDogTlVMTDsKKworICAgICAgICBzdGFja19ibG9jayAtPiBzYl9uZXh0ID0gTlVMTDsKKyAgICAgICAgc3RhY2tfYmxvY2sgLT4gc2JfcHJldiA9IE5VTEw7CisgICAgICAgIGlmIChzdGFja19ibG9jayAhPSAmIHRhc2tfc3RhY2sgLT4gdHNfZmlyc3RfYmxvY2spIHsKKyAgICAgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHN0YWNrX2Jsb2NrICk7ICAvLyBmcmVlIHRoZSBibG9jaywgaWYgbm90IHRoZSBmaXJzdAorICAgICAgICB9CisgICAgICAgIHN0YWNrX2Jsb2NrID0gbmV4dF9ibG9jazsKKyAgICB9CisgICAgLy8gaW5pdGlhbGl6ZSB0aGUgc3RhY2sgdG8gYmUgZW1wdHkKKyAgICB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgPSAwOworICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gTlVMTDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3B1c2hfdGFza19zdGFjazogUHVzaCB0aGUgdGllZCB0YXNrIG9udG8gdGhlIHRhc2sgc3RhY2suCisvLyAgICAgR3JvdyB0aGUgc3RhY2sgaWYgbmVjZXNzYXJ5IGJ5IGFsbG9jYXRpbmcgYW5vdGhlciBibG9jay4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciBjYWxsaW5nIHRocmVhZAorLy8gIHRocmVhZDogdGhyZWFkIGluZm8gZm9yIHRocmVhZCBjb250YWluaW5nIHN0YWNrCisvLyAgdGllZF90YXNrOiB0aGUgdGFzayB0byBwdXNoIG9uIHRoZSBzdGFjaworCitzdGF0aWMgdm9pZAorX19rbXBfcHVzaF90YXNrX3N0YWNrKCBrbXBfaW50MzIgZ3RpZCwga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza2RhdGFfdCAqIHRpZWRfdGFzayApCit7CisgICAgLy8gR0VIIC0gbmVlZCB0byBjb25zaWRlciB3aGF0IHRvIGRvIGlmIHR0X3RocmVhZHNfZGF0YSBub3QgYWxsb2NhdGVkIHlldAorICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgdGhyZWFkIC0+IHRoLnRoX3Rhc2tfdGVhbSAtPgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHR0LnR0X3RocmVhZHNfZGF0YVsgX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApIF07CisgICAga21wX3Rhc2tfc3RhY2tfdCAqdGFza19zdGFjayA9ICYgdGhyZWFkX2RhdGEtPnRkLnRkX3N1c3BfdGllZF90YXNrcyA7CisKKyAgICBpZiAoIHRpZWRfdGFzay0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGllZF90YXNrLT50ZF9mbGFncy50YXNraW5nX3NlciApIHsKKyAgICAgICAgcmV0dXJuOyAgLy8gRG9uJ3QgcHVzaCBhbnl0aGluZyBvbiBzdGFjayBpZiB0ZWFtIG9yIHRlYW0gdGFza3MgYXJlIHNlcmlhbGl6ZWQKKyAgICB9CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aWVkX3Rhc2sgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19USUVEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza19zdGFjayAtPiB0c190b3AgIT0gTlVMTCApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKGVudGVyKTogR1RJRDogJWQ7IFRIUkVBRDogJXA7IFRBU0s6ICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkLCB0aWVkX3Rhc2sgKSApOworICAgIC8vIFN0b3JlIGVudHJ5CisgICAgKiAodGFza19zdGFjayAtPiB0c190b3ApID0gdGllZF90YXNrOworCisgICAgLy8gRG8gYm9va2tlZXBpbmcgZm9yIG5leHQgcHVzaAorICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wKys7CisgICAgdGFza19zdGFjayAtPiB0c19lbnRyaWVzKys7CisKKyAgICBpZiAoIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcyAmIFRBU0tfU1RBQ0tfSU5ERVhfTUFTSyA9PSAwICkKKyAgICB7CisgICAgICAgIC8vIEZpbmQgYmVnaW5uaW5nIG9mIHRoaXMgdGFzayBibG9jaworICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPQorICAgICAgICAgICAgIChrbXBfc3RhY2tfYmxvY2tfdCAqKSAodGFza19zdGFjayAtPiB0c190b3AgLSBUQVNLX1NUQUNLX0JMT0NLX1NJWkUpOworCisgICAgICAgIC8vIENoZWNrIGlmIHdlIGFscmVhZHkgaGF2ZSBhIGJsb2NrCisgICAgICAgIGlmICggc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCAhPSBOVUxMICkKKyAgICAgICAgeyAgICAvLyByZXNldCB0c190b3AgdG8gYmVnaW5uaW5nIG9mIG5leHQgYmxvY2sKKyAgICAgICAgICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wID0gJiBzdGFja19ibG9jayAtPiBzYl9uZXh0IC0+IHNiX2Jsb2NrWzBdOworICAgICAgICB9CisgICAgICAgIGVsc2UKKyAgICAgICAgeyAgIC8vIEFsbG9jIG5ldyBibG9jayBhbmQgbGluayBpdCB1cAorICAgICAgICAgICAga21wX3N0YWNrX2Jsb2NrX3QgKm5ld19ibG9jayA9IChrbXBfc3RhY2tfYmxvY2tfdCAqKQorICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfY2FsbG9jKHRocmVhZCwgc2l6ZW9mKGttcF9zdGFja19ibG9ja190KSk7CisKKyAgICAgICAgICAgIHRhc2tfc3RhY2sgLT4gdHNfdG9wICA9ICYgbmV3X2Jsb2NrIC0+IHNiX2Jsb2NrWzBdOworICAgICAgICAgICAgc3RhY2tfYmxvY2sgLT4gc2JfbmV4dCA9IG5ld19ibG9jazsKKyAgICAgICAgICAgIG5ld19ibG9jayAgLT4gc2JfcHJldiA9IHN0YWNrX2Jsb2NrOworICAgICAgICAgICAgbmV3X2Jsb2NrICAtPiBzYl9uZXh0ID0gTlVMTDsKKworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfcHVzaF90YXNrX3N0YWNrKCk6IEdUSUQ6ICVkOyBUQVNLOiAlcDsgQWxsb2MgbmV3IGJsb2NrOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGllZF90YXNrLCBuZXdfYmxvY2sgKSApOworICAgICAgICB9CisgICAgfQorICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3B1c2hfdGFza19zdGFjayhleGl0KTogR1RJRDogJWQ7IFRBU0s6ICVwXG4iLCBndGlkLCB0aWVkX3Rhc2sgKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX3BvcF90YXNrX3N0YWNrOiBQb3AgdGhlIHRpZWQgdGFzayBmcm9tIHRoZSB0YXNrIHN0YWNrLiAgRG9uJ3QgcmV0dXJuCisvLyAgICAgdGhlIHRhc2ssIGp1c3QgY2hlY2sgdG8gbWFrZSBzdXJlIGl0IG1hdGNoZXMgdGhlIGVuZGluZyB0YXNrIHBhc3NlZCBpbi4KKy8vCisvLyAgZ3RpZDogZ2xvYmFsIHRocmVhZCBpZGVudGlmaWVyIGZvciB0aGUgY2FsbGluZyB0aHJlYWQKKy8vICB0aHJlYWQ6IHRocmVhZCBpbmZvIHN0cnVjdHVyZSBjb250YWluaW5nIHN0YWNrCisvLyAgdGllZF90YXNrOiB0aGUgdGFzayBwb3BwZWQgb2ZmIHRoZSBzdGFjaworLy8gIGVuZGluZ190YXNrOiB0aGUgdGFzayB0aGF0IGlzIGVuZGluZyAoc2hvdWxkIG1hdGNoIHBvcHBlZCB0YXNrKQorCitzdGF0aWMgdm9pZAorX19rbXBfcG9wX3Rhc2tfc3RhY2soIGttcF9pbnQzMiBndGlkLCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrZGF0YV90ICplbmRpbmdfdGFzayApCit7CisgICAgLy8gR0VIIC0gbmVlZCB0byBjb25zaWRlciB3aGF0IHRvIGRvIGlmIHR0X3RocmVhZHNfZGF0YSBub3QgYWxsb2NhdGVkIHlldAorICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgdGhyZWFkIC0+IHRoLnRoX3Rhc2tfdGVhbSAtPiB0dF90aHJlYWRzX2RhdGFbIF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKSBdOworICAgIGttcF90YXNrX3N0YWNrX3QgKnRhc2tfc3RhY2sgPSAmIHRocmVhZF9kYXRhLT50ZC50ZF9zdXNwX3RpZWRfdGFza3MgOworICAgIGttcF90YXNrZGF0YV90ICp0aWVkX3Rhc2s7CisKKyAgICBpZiAoIGVuZGluZ190YXNrLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCBlbmRpbmdfdGFzay0+dGRfZmxhZ3MudGFza2luZ19zZXIgKSB7CisgICAgICAgIHJldHVybjsgIC8vIERvbid0IHBvcCBhbnl0aGluZyBmcm9tIHN0YWNrIGlmIHRlYW0gb3IgdGVhbSB0YXNrcyBhcmUgc2VyaWFsaXplZAorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfc3RhY2sgLT4gdHNfdG9wICE9IE5VTEwgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgPiAwICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wb3BfdGFza19zdGFjayhlbnRlcik6IEdUSUQ6ICVkOyBUSFJFQUQ6ICVwXG4iLCBndGlkLCB0aHJlYWQgKSApOworCisgICAgLy8gZml4IHVwIHRzX3RvcCBpZiB3ZSBuZWVkIHRvIHBvcCBmcm9tIHByZXZpb3VzIGJsb2NrCisgICAgaWYgKCB0YXNrX3N0YWNrIC0+IHRzX2VudHJpZXMgJiBUQVNLX1NUQUNLX0lOREVYX01BU0sgPT0gMCApCisgICAgeworICAgICAgICBrbXBfc3RhY2tfYmxvY2tfdCAqc3RhY2tfYmxvY2sgPQorICAgICAgICAgICAoa21wX3N0YWNrX2Jsb2NrX3QgKikgKHRhc2tfc3RhY2sgLT4gdHNfdG9wKSA7CisKKyAgICAgICAgc3RhY2tfYmxvY2sgPSBzdGFja19ibG9jayAtPiBzYl9wcmV2OworICAgICAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcCA9ICYgc3RhY2tfYmxvY2sgLT4gc2JfYmxvY2tbVEFTS19TVEFDS19CTE9DS19TSVpFXTsKKyAgICB9CisKKyAgICAvLyBmaW5pc2ggYm9va2tlZXBpbmcKKyAgICB0YXNrX3N0YWNrIC0+IHRzX3RvcC0tOworICAgIHRhc2tfc3RhY2sgLT4gdHNfZW50cmllcy0tOworCisgICAgdGllZF90YXNrID0gKiAodGFza19zdGFjayAtPiB0c190b3AgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayAhPSBOVUxMICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGllZF90YXNrIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfVElFRCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRpZWRfdGFzayA9PSBlbmRpbmdfdGFzayApOyAgLy8gSWYgd2UgYnVpbHQgdGhlIHN0YWNrIGNvcnJlY3RseQorCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcG9wX3Rhc2tfc3RhY2soZXhpdCk6IEdUSUQ6ICVkOyBUQVNLOiAlcFxuIiwgZ3RpZCwgdGllZF90YXNrICkgKTsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLyogQlVJTERfVElFRF9UQVNLX1NUQUNLICovCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyAgX19rbXBfcHVzaF90YXNrOiBBZGQgYSB0YXNrIHRvIHRoZSB0aHJlYWQncyBkZXF1ZQorCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9wdXNoX3Rhc2soa21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrICkKK3sKKyAgICBrbXBfaW5mb190ICogICAgICAgIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX3Rhc2tfdGVhbV90ICogICB0YXNrX3RlYW0gPSB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICBrbXBfaW50MzIgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGd0aWQgKTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqIHRocmVhZF9kYXRhOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfcHVzaF90YXNrOiBUIyVkIHRyeWluZyB0byBwdXNoIHRhc2sgJXAuXG4iLCBndGlkLCB0YXNrZGF0YSApICk7CisKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1VOVElFRCApIHsKKyAgICAgICAgLy8gdW50aWVkIHRhc2sgbmVlZHMgdG8gaW5jcmVtZW50IGNvdW50ZXIgc28gdGhhdCB0aGUgdGFzayBzdHJ1Y3R1cmUgaXMgbm90IGZyZWVkIHByZW1hdHVyZWx5CisgICAgICAgIGttcF9pbnQzMiBjb3VudGVyID0gMSArIEtNUF9URVNUX1RIRU5fSU5DMzIoJnRhc2tkYXRhLT50ZF91bnRpZWRfY291bnQpOworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIHVudGllZF9jb3VudCAoJWQpIGluY3JlbWVudGVkIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudGVyLCB0YXNrZGF0YSApICk7CisgICAgfQorCisgICAgLy8gVGhlIGZpcnN0IGNoZWNrIGF2b2lkcyBidWlsZGluZyB0YXNrX3RlYW0gdGhyZWFkIGRhdGEgaWYgc2VyaWFsaXplZAorICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsICkgeworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIHRlYW0gc2VyaWFsaXplZDsgcmV0dXJuaW5nIFRBU0tfTk9UX1BVU0hFRCBmb3IgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gVEFTS19OT1RfUFVTSEVEOworICAgIH0KKworICAgIC8vIE5vdyB0aGF0IHNlcmlhbGl6ZWQgdGFza3MgaGF2ZSByZXR1cm5lZCwgd2UgY2FuIGFzc3VtZSB0aGF0IHdlIGFyZSBub3QgaW4gaW1tZWRpYXRlIGV4ZWMgbW9kZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisgICAgaWYgKCAhIEtNUF9UQVNLSU5HX0VOQUJMRUQodGFza190ZWFtKSApIHsKKyAgICAgICAgIF9fa21wX2VuYWJsZV90YXNraW5nKCB0YXNrX3RlYW0sIHRocmVhZCApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpID09IFRSVUUgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfUFRSKHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEpICE9IE5VTEwgKTsKKworICAgIC8vIEZpbmQgdGFza2luZyBkZXF1ZSBzcGVjaWZpYyB0byBlbmNvdW50ZXJpbmcgdGhyZWFkCisgICAgdGhyZWFkX2RhdGEgPSAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGFbIHRpZCBdOworCisgICAgLy8gTm8gbG9jayBuZWVkZWQgc2luY2Ugb25seSBvd25lciBjYW4gYWxsb2NhdGUKKyAgICBpZiAodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPT0gTlVMTCApIHsKKyAgICAgICAgX19rbXBfYWxsb2NfdGFza19kZXF1ZSggdGhyZWFkLCB0aHJlYWRfZGF0YSApOworICAgIH0KKworICAgIC8vIENoZWNrIGlmIGRlcXVlIGlzIGZ1bGwKKyAgICBpZiAoIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPj0gVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkgKQorICAgIHsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3B1c2hfdGFzazogVCMlZCBkZXF1ZSBpcyBmdWxsOyByZXR1cm5pbmcgVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgICAgfQorCisgICAgLy8gTG9jayB0aGUgZGVxdWUgZm9yIHRoZSB0YXNrIHB1c2ggb3BlcmF0aW9uCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIC8vIE5lZWQgdG8gcmVjaGVjayBhcyB3ZSBjYW4gZ2V0IGEgcHJveHkgdGFzayBmcm9tIGEgdGhyZWFkIG91dHNpZGUgb2YgT3Blbk1QCisgICAgaWYgKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID49IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpICkKKyAgICB7CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICBLQV9UUkFDRSgyMCwgKCAiX19rbXBfcHVzaF90YXNrOiBUIyVkIGRlcXVlIGlzIGZ1bGwgb24gMm5kIGNoZWNrOyByZXR1cm5pbmcgVEFTS19OT1RfUFVTSEVEIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSApICk7CisgICAgICAgIHJldHVybiBUQVNLX05PVF9QVVNIRUQ7CisgICAgfQorI2Vsc2UKKyAgICAvLyBNdXN0IGhhdmUgcm9vbSBzaW5jZSBubyB0aHJlYWQgY2FuIGFkZCB0YXNrcyBidXQgY2FsbGluZyB0aHJlYWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpIDwgVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkgKTsKKyNlbmRpZgorCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVbIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgXSA9IHRhc2tkYXRhOyAgLy8gUHVzaCB0YXNrZGF0YQorICAgIC8vIFdyYXAgaW5kZXguCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCArIDEgKSAmIFRBU0tfREVRVUVfTUFTSyh0aHJlYWRfZGF0YS0+dGQpOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSArIDEpOyAgICAgICAgICAgICAvLyBBZGp1c3QgdGFzayBjb3VudAorCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9wdXNoX3Rhc2s6IFQjJWQgcmV0dXJuaW5nIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDogIgorICAgICAgICAgICAgICAgICAgInRhc2s9JXAgbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkKSApOworCisgICAgcmV0dXJuIFRBU0tfU1VDQ0VTU0ZVTExZX1BVU0hFRDsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkOiBzZXQgdXAgY3VycmVudCB0YXNrIGZyb20gY2FsbGVkIHRocmVhZCB3aGVuIHRlYW0gZW5kcworLy8gdGhpc190aHI6IHRocmVhZCBzdHJ1Y3R1cmUgdG8gc2V0IGN1cnJlbnRfdGFzayBpbi4KKwordm9pZAorX19rbXBfcG9wX2N1cnJlbnRfdGFza19mcm9tX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIgKQoreworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGVudGVyKTogVCMlZCB0aGlzX3RocmVhZD0lcCwgY3VydGFzaz0lcCwgIgorICAgICAgICAgICAgICAgICAgICJjdXJ0YXNrX3BhcmVudD0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAwLCB0aGlzX3RociwgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrLAorICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyIC0+IHRoLnRoX2N1cnJlbnRfdGFzayAtPiB0ZF9wYXJlbnQgKSApOworCisgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrID0gdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudDsKKworICAgIEtGX1RSQUNFKCAxMCwgKCJfX2ttcF9wb3BfY3VycmVudF90YXNrX2Zyb21fdGhyZWFkKGV4aXQpOiBUIyVkIHRoaXNfdGhyZWFkPSVwLCBjdXJ0YXNrPSVwLCAiCisgICAgICAgICAgICAgICAgICAgImN1cnRhc2tfcGFyZW50PSVwXG4iLAorICAgICAgICAgICAgICAgICAgIDAsIHRoaXNfdGhyLCB0aGlzX3RociAtPiB0aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgdGhpc190aHIgLT4gdGgudGhfY3VycmVudF90YXNrIC0+IHRkX3BhcmVudCApICk7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZDogc2V0IHVwIGN1cnJlbnQgdGFzayBpbiBjYWxsZWQgdGhyZWFkIGZvciBhIG5ldyB0ZWFtCisvLyB0aGlzX3RocjogdGhyZWFkIHN0cnVjdHVyZSB0byBzZXQgdXAKKy8vIHRlYW06IHRlYW0gZm9yIGltcGxpY2l0IHRhc2sgZGF0YQorLy8gdGlkOiB0aHJlYWQgd2l0aGluIHRlYW0gdG8gc2V0IHVwCisKK3ZvaWQKK19fa21wX3B1c2hfY3VycmVudF90YXNrX3RvX3RocmVhZCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCB0aWQgKQoreworICAgIC8vIGN1cnJlbnQgdGFzayBvZiB0aGUgdGhyZWFkIGlzIGEgcGFyZW50IG9mIHRoZSBuZXcganVzdCBjcmVhdGVkIGltcGxpY2l0IHRhc2tzIG9mIG5ldyB0ZWFtCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZW50ZXIpOiBUIyVkIHRoaXNfdGhyZWFkPSVwIGN1cnRhc2s9JXAgIgorICAgICAgICAgICAgICAgICAgICAicGFyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRpZCwgdGhpc190aHIsIHRoaXNfdGhyLT50aC50aF9jdXJyZW50X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgIHRlYW0tPnQudF9pbXBsaWNpdF90YXNrX3Rhc2tkYXRhW3RpZF0udGRfcGFyZW50ICkgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKHRoaXNfdGhyICE9IE5VTEwpOworCisgICAgaWYoIHRpZCA9PSAwICkgeworICAgICAgICBpZiggdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayAhPSAmIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXSApIHsKKyAgICAgICAgICAgIHRlYW0gLT4gdC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbIDAgXS50ZF9wYXJlbnQgPSB0aGlzX3Roci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF0udGRfcGFyZW50ID0gdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgMCBdLnRkX3BhcmVudDsKKyAgICAgICAgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzayA9ICYgdGVhbSAtPiB0LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisgICAgfQorCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9wdXNoX2N1cnJlbnRfdGFza190b190aHJlYWQoZXhpdCk6IFQjJWQgdGhpc190aHJlYWQ9JXAgY3VydGFzaz0lcCAiCisgICAgICAgICAgICAgICAgICAgICJwYXJlbnRfdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGlkLCB0aGlzX3RociwgdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgdGVhbS0+dC50X2ltcGxpY2l0X3Rhc2tfdGFza2RhdGFbdGlkXS50ZF9wYXJlbnQgKSApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19zdGFydDogYm9va2tlZXBpbmcgZm9yIGEgdGFzayBzdGFydGluZyBleGVjdXRpb24KKy8vIEdUSUQ6IGdsb2JhbCB0aHJlYWQgaWQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2s6IHRhc2sgc3RhcnRpbmcgZXhlY3V0aW9uCisvLyBjdXJyZW50X3Rhc2s6IHRhc2sgc3VzcGVuZGluZworCitzdGF0aWMgdm9pZAorX19rbXBfdGFza19zdGFydCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKiB0YXNrLCBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayApCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX3N0YXJ0KGVudGVyKTogVCMlZCBzdGFydGluZyB0YXNrICVwOiBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApOworCisgICAgLy8gbWFyayBjdXJyZW50bHkgZXhlY3V0aW5nIHRhc2sgYXMgc3VzcGVuZGVkCisgICAgLy8gVE9ETzogR0VIIC0gbWFrZSBzdXJlIHJvb3QgdGVhbSBpbXBsaWNpdCB0YXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorICAgIC8vIEtNUF9ERUJVR19BU1NFUlQoIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPT0gMSApOworICAgIGN1cnJlbnRfdGFzayAtPiB0ZF9mbGFncy5leGVjdXRpbmcgPSAwOworCisgICAgLy8gQWRkIHRhc2sgdG8gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3B1c2hfdGFza19zdGFjayggZ3RpZCwgdGhyZWFkLCB0YXNrZGF0YSApOworICAgIH0KKyNlbmRpZiAvKiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sgKi8KKworICAgIC8vIG1hcmsgc3RhcnRpbmcgdGFzayBhcyBleGVjdXRpbmcgYW5kIGFzIGN1cnJlbnQgdGFzaworICAgIHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2sgPSB0YXNrZGF0YTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5zdGFydGVkID09IDAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAwIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1VOVElFRCApOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnN0YXJ0ZWQgPSAxOworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKworICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgcGFzcyBzb21lIHNvcnQgb2YgbG9jYXRpb24gaWRlbnRpZmllciBoZXJlPworICAgIC8vIEFQVDogeWVzLCB3ZSB3aWxsIHBhc3MgbG9jYXRpb24gaGVyZS4KKyAgICAvLyBuZWVkIHRvIHN0b3JlIGN1cnJlbnQgdGhyZWFkIHN0YXRlIChpbiBhIHRocmVhZCBvciB0YXNrZGF0YSBzdHJ1Y3R1cmUpCisgICAgLy8gYmVmb3JlIHNldHRpbmcgd29ya19zdGF0ZSwgb3RoZXJ3aXNlIHdyb25nIHN0YXRlIGlzIHNldCBhZnRlciBlbmQgb2YgdGFzaworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19zdGFydChleGl0KTogVCMlZCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEgKSApOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19iZWdpbikpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX2JlZ2luKSgKKyAgICAgICAgICAgIHBhcmVudCA/IHBhcmVudC0+b21wdF90YXNrX2luZm8udGFza19pZCA6IG9tcHRfdGFza19pZF9ub25lLAorICAgICAgICAgICAgcGFyZW50ID8gJihwYXJlbnQtPm9tcHRfdGFza19pbmZvLmZyYW1lKSA6IE5VTEwsCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5mdW5jdGlvbik7CisgICAgfQorI2VuZGlmCisjaWYgT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UKKyAgICAvKiBPTVBUIGVtaXQgYWxsIGRlcGVuZGVuY2VzIGlmIHJlcXVlc3RlZCBieSB0aGUgdG9vbCAqLworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLm5kZXBzID4gMCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcykpCisJeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlcykoCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5kZXBzLAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLm5kZXBzCisgICAgICAgICk7CisJCS8qIFdlIGNhbiBub3cgZnJlZSB0aGUgYWxsb2NhdGVkIG1lbW9yeSBmb3IgdGhlIGRlcGVuZGVuY2llcyAqLworCQlLTVBfT01QVF9ERVBTX0ZSRUUgKHRocmVhZCwgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmRlcHMpOworICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZGVwcyA9IE5VTEw7CisgICAgICAgIHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby5uZGVwcyA9IDA7CisgICAgfQorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICYmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFICovCisKKyAgICByZXR1cm47Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiByZXBvcnQgdGhhdCBhIGdpdmVuIHNlcmlhbGl6ZWQgdGFzayBoYXMgc3RhcnRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGJlZ2lubmluZyBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgc3RhcnRlZCB0YXNrLgorCit2b2lkCitfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCB0YXNrZGF0YSwgY3VycmVudF90YXNrICkgKTsKKworICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnRpZWRuZXNzID09IFRBU0tfVU5USUVEICkgeworICAgICAgICAvLyB1bnRpZWQgdGFzayBuZWVkcyB0byBpbmNyZW1lbnQgY291bnRlciBzbyB0aGF0IHRoZSB0YXNrIHN0cnVjdHVyZSBpcyBub3QgZnJlZWQgcHJlbWF0dXJlbHkKKyAgICAgICAga21wX2ludDMyIGNvdW50ZXIgPSAxICsgS01QX1RFU1RfVEhFTl9JTkMzMigmdGFza2RhdGEtPnRkX3VudGllZF9jb3VudCk7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoICJfX2ttcGNfb21wX3Rhc2tfYmVnaW5faWYwOiBUIyVkIHVudGllZF9jb3VudCAoJWQpIGluY3JlbWVudGVkIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudGVyLCB0YXNrZGF0YSApICk7CisgICAgfQorCisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOyAgLy8gRXhlY3V0ZSB0aGlzIHRhc2sgaW1tZWRpYXRlbHksIG5vdCBkZWZlcnJlZC4KKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbl9pZjAoZXhpdCk6IFQjJWQgbG9jPSVwIHRhc2s9JXAsXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgdGFza2RhdGEgKSApOworCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgVEFTS19VTlVTRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNrX2JlZ2luOiByZXBvcnQgdGhhdCBhIGdpdmVuIHRhc2sgaGFzIHN0YXJ0ZWQgZXhlY3V0aW9uCisvLyBORVZFUiBHRU5FUkFURUQgQlkgQ09NUElMRVIsIERFUFJFQ0FURUQhISEKKwordm9pZAorX19rbXBjX29tcF90YXNrX2JlZ2luKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHRhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbihlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXAgY3VycmVudF90YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayksIGN1cnJlbnRfdGFzayApICk7CisKKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19iZWdpbihleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcCxcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFzazogZnJlZSB0aGUgY3VycmVudCB0YXNrIHNwYWNlIGFuZCB0aGUgc3BhY2UgZm9yIHNoYXJlZHMKKy8vIGd0aWQ6IEdsb2JhbCB0aHJlYWQgSUQgb2YgY2FsbGluZyB0aHJlYWQKKy8vIHRhc2tkYXRhOiB0YXNrIHRvIGZyZWUKKy8vIHRocmVhZDogdGhyZWFkIGRhdGEgc3RydWN0dXJlIG9mIGNhbGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSwga21wX2luZm9fdCAqIHRocmVhZCApCit7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZnJlZV90YXNrOiBUIyVkIGZyZWVpbmcgZGF0YSBmcm9tIHRhc2sgJXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSkgKTsKKworICAgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBhbGwgZmxhZ3MgYW5kIGNvdW50ZXJzIGhhdmUgdGhlIGNvcnJlY3QgdmFsdWVzCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPT0gMSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9mbGFncy5mcmVlZCA9PSAwICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggVENSXzQodGFza2RhdGEtPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcykgPT0gMCAgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsID09IDEpOworICAgIEtNUF9ERUJVR19BU1NFUlQoIFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgPSAxOworICAgIC8vIGRlYWxsb2NhdGUgdGhlIHRhc2tkYXRhIGFuZCBzaGFyZWQgdmFyaWFibGUgYmxvY2tzIGFzc29jaWF0ZWQgd2l0aCB0aGlzIHRhc2sKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgICAgIF9fa21wX2Zhc3RfZnJlZSggdGhyZWFkLCB0YXNrZGF0YSApOworICAgICNlbHNlIC8qICEgVVNFX0ZBU1RfTUVNT1JZICovCisgICAgICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgI2VuZGlmCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF9mcmVlX3Rhc2s6IFQjJWQgZnJlZWQgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzOiBmcmVlIHRoZSBjdXJyZW50IHRhc2sgYW5kIGFuY2VzdG9ycyB3aXRob3V0IGNoaWxkcmVuCisvLworLy8gZ3RpZDogR2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsaW5nIHRocmVhZAorLy8gdGFza2RhdGE6IHRhc2sgdG8gZnJlZQorLy8gdGhyZWFkOiB0aHJlYWQgZGF0YSBzdHJ1Y3R1cmUgb2YgY2FsbGVyCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfYW5kX2FuY2VzdG9ycygga21wX2ludDMyIGd0aWQsIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEsIGttcF9pbmZvX3QgKiB0aHJlYWQgKQoreworICAgIGttcF9pbnQzMiBjaGlsZHJlbiA9IDA7CisgICAga21wX2ludDMyIHRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkID0gdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXI7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNrdHlwZSA9PSBUQVNLX0VYUExJQ0lUICk7CisKKyAgICBpZiAoICF0ZWFtX29yX3Rhc2tpbmdfc2VyaWFsaXplZCApIHsKKyAgICAgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworICAgIH0KKworICAgIC8vIE5vdywgZ28gdXAgdGhlIGFuY2VzdG9yIHRyZWUgdG8gc2VlIGlmIGFueSBhbmNlc3RvcnMgY2FuIG5vdyBiZSBmcmVlZC4KKyAgICB3aGlsZSAoIGNoaWxkcmVuID09IDAgKQorICAgIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgKiBwYXJlbnRfdGFza2RhdGEgPSB0YXNrZGF0YSAtPiB0ZF9wYXJlbnQ7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZW50ZXIpOiBUIyVkIHRhc2sgJXAgY29tcGxldGUgIgorICAgICAgICAgICAgICAgICAgICAgICJhbmQgZnJlZWluZyBpdHNlbGZcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgICAgIC8vIC0tLSBEZWFsbG9jYXRlIG15IGFuY2VzdG9yIHRhc2sgLS0tCisgICAgICAgIF9fa21wX2ZyZWVfdGFzayggZ3RpZCwgdGFza2RhdGEsIHRocmVhZCApOworCisgICAgICAgIHRhc2tkYXRhID0gcGFyZW50X3Rhc2tkYXRhOworCisgICAgICAgIC8vIFN0b3AgY2hlY2tpbmcgYW5jZXN0b3JzIGF0IGltcGxpY2l0IHRhc2sgb3IgaWYgdGFza2luZyBzZXJpYWxpemVkCisgICAgICAgIC8vIGluc3RlYWQgb2Ygd2Fsa2luZyB1cCBhbmNlc3RvciB0cmVlIHRvIGF2b2lkIHByZW1hdHVyZSBkZWFsbG9jYXRpb24gb2YgYW5jZXN0b3JzLgorICAgICAgICBpZiAoIHRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkIHx8IHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfSU1QTElDSVQgKQorICAgICAgICAgICAgcmV0dXJuOworCisgICAgICAgIGlmICggIXRlYW1fb3JfdGFza2luZ19zZXJpYWxpemVkICkgeworICAgICAgICAgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgICAgICAgICAgY2hpbGRyZW4gPSBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEgLT4gdGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGNoaWxkcmVuID49IDAgKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGV4aXQpOiBUIyVkIHRhc2sgJXAgaGFzICVkIGNoaWxkcmVuOyAiCisgICAgICAgICAgICAgICAgICAibm90IGZyZWVpbmcgaXQgeWV0XG4iLCBndGlkLCB0YXNrZGF0YSwgY2hpbGRyZW4pICk7Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX2ZpbmlzaDogYm9va2tlZXBpbmcgdG8gZG8gd2hlbiBhIHRhc2sgZmluaXNoZXMgZXhlY3V0aW9uCisvLyBndGlkOiBnbG9iYWwgdGhyZWFkIElEIGZvciBjYWxsaW5nIHRocmVhZAorLy8gdGFzazogdGFzayB0byBiZSBmaW5pc2hlZAorLy8gcmVzdW1lZF90YXNrOiB0YXNrIHRvIGJlIHJlc3VtZWQuICAobWF5IGJlIE5VTEwgaWYgdGFzayBpcyBzZXJpYWxpemVkKQorCitzdGF0aWMgdm9pZAorX19rbXBfdGFza19maW5pc2goIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrLCBrbXBfdGFza2RhdGFfdCAqcmVzdW1lZF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX2luZm9fdCAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCAmJgorICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19lbmQpKSB7CisgICAgICAgIGttcF90YXNrZGF0YV90ICpwYXJlbnQgPSB0YXNrZGF0YS0+dGRfcGFyZW50OworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza19lbmQpKAorICAgICAgICAgICAgdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLnRhc2tfaWQpOworICAgIH0KKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZW50ZXIpOiBUIyVkIGZpbmlzaGluZyB0YXNrICVwIGFuZCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKworICAgIC8vIFBvcCB0YXNrIGZyb20gc3RhY2sgaWYgdGllZAorI2lmZGVmIEJVSUxEX1RJRURfVEFTS19TVEFDSworICAgIGlmICggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEICkKKyAgICB7CisgICAgICAgIF9fa21wX3BvcF90YXNrX3N0YWNrKCBndGlkLCB0aHJlYWQsIHRhc2tkYXRhICk7CisgICAgfQorI2VuZGlmIC8qIEJVSUxEX1RJRURfVEFTS19TVEFDSyAqLworCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19VTlRJRUQgKSB7CisgICAgICAgIC8vIHVudGllZCB0YXNrIG5lZWRzIHRvIGNoZWNrIHRoZSBjb3VudGVyIHNvIHRoYXQgdGhlIHRhc2sgc3RydWN0dXJlIGlzIG5vdCBmcmVlZCBwcmVtYXR1cmVseQorICAgICAgICBrbXBfaW50MzIgY291bnRlciA9IEtNUF9URVNUX1RIRU5fREVDMzIoJnRhc2tkYXRhLT50ZF91bnRpZWRfY291bnQpIC0gMTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICggIl9fa21wX3Rhc2tfZmluaXNoOiBUIyVkIHVudGllZF9jb3VudCAoJWQpIGRlY3JlbWVudGVkIGZvciB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBjb3VudGVyLCB0YXNrZGF0YSApICk7CisgICAgICAgIGlmICggY291bnRlciA+IDAgKSB7CisgICAgICAgICAgICAvLyB1bnRpZWQgdGFzayBpcyBub3QgZG9uZSwgdG8gYmUgY29udGludWVkIHBvc3NpYmx5IGJ5IG90aGVyIHRocmVhZCwgZG8gbm90IGZyZWUgaXQgbm93CisgICAgICAgICAgICBpZiAocmVzdW1lZF90YXNrID09IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgKTsKKyAgICAgICAgICAgICAgICByZXN1bWVkX3Rhc2sgPSB0YXNrZGF0YS0+dGRfcGFyZW50OyAgLy8gSW4gYSBzZXJpYWxpemVkIHRhc2ssIHRoZSByZXN1bWVkIHRhc2sgaXMgdGhlIHBhcmVudAorICAgICAgICAgICAgfQorICAgICAgICAgICAgdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2sgPSByZXN1bWVkX3Rhc2s7IC8vIHJlc3RvcmUgY3VycmVudF90YXNrCisgICAgICAgICAgICByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7ICAvLyByZXN1bWUgcHJldmlvdXMgdGFzaworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZXhpdCk6IFQjJWQgcGFydGlhbGx5IGRvbmUgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIHJlc3VtZWRfdGFzaykgKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID09IDAgKTsKKyAgICB0YXNrZGF0YSAtPiB0ZF9mbGFncy5jb21wbGV0ZSA9IDE7ICAgLy8gbWFyayB0aGUgdGFzayBhcyBjb21wbGV0ZWQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5zdGFydGVkID09IDEgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5mcmVlZCA9PSAwICk7CisKKyAgICAvLyBPbmx5IG5lZWQgdG8ga2VlcCB0cmFjayBvZiBjb3VudCBpZiB0ZWFtIHBhcmFsbGVsIGFuZCB0YXNraW5nIG5vdCBzZXJpYWxpemVkCisgICAgaWYgKCAhKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCB0YXNrZGF0YSAtPiB0ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICAvLyBQcmVkZWNyZW1lbnQgc2ltdWxhdGVkIGJ5ICItIDEiIGNhbGN1bGF0aW9uCisgICAgICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY2hpbGRyZW4gPj0gMCApOworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisgICAgICAgIF9fa21wX3JlbGVhc2VfZGVwcyhndGlkLHRhc2tkYXRhKTsKKyNlbmRpZgorICAgIH0KKworICAgIC8vIHRkX2ZsYWdzLmV4ZWN1dGluZyAgbXVzdCBiZSBtYXJrZWQgYXMgMCBhZnRlciBfX2ttcF9yZWxlYXNlX2RlcHMgaGFzIGJlZW4gY2FsbGVkCisgICAgLy8gT3RoZXJ0d2lzZSwgaWYgYSB0YXNrIGlzIGV4ZWN1dGVkIGltbWVkaWF0ZWx5IGZyb20gdGhlIHJlbGVhc2VfZGVwcyBjb2RlCisgICAgLy8gdGhlIGZsYWcgd2lsbCBiZSByZXNldCB0byAxIGFnYWluIGJ5IHRoaXMgc2FtZSBmdW5jdGlvbgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmV4ZWN1dGluZyA9PSAxICk7CisgICAgdGFza2RhdGEgLT4gdGRfZmxhZ3MuZXhlY3V0aW5nID0gMDsgIC8vIHN1c3BlbmQgdGhlIGZpbmlzaGluZyB0YXNrCisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2ZpbmlzaDogVCMlZCBmaW5pc2hlZCB0YXNrICVwLCAlZCBpbmNvbXBsZXRlIGNoaWxkcmVuXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGNoaWxkcmVuKSApOworCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAvKiBJZiB0aGUgdGFza3MnIGRlc3RydWN0b3IgdGh1bmsgZmxhZyBoYXMgYmVlbiBzZXQsIHdlIG5lZWQgdG8gaW52b2tlIHRoZQorICAgICAgIGRlc3RydWN0b3IgdGh1bmsgdGhhdCBoYXMgYmVlbiBnZW5lcmF0ZWQgYnkgdGhlIGNvbXBpbGVyLgorICAgICAgIFRoZSBjb2RlIGlzIHBsYWNlZCBoZXJlLCBzaW5jZSBhdCB0aGlzIHBvaW50IG90aGVyIHRhc2tzIG1pZ2h0IGhhdmUgYmVlbiByZWxlYXNlZAorICAgICAgIGhlbmNlIG92ZXJsYXBwaW5nIHRoZSBkZXN0cnVjdG9yIGludm9rYXRpb25zIHdpdGggc29tZSBvdGhlciB3b3JrIGluIHRoZQorICAgICAgIHJlbGVhc2VkIHRhc2tzLiAgVGhlIE9wZW5NUCBzcGVjIGlzIG5vdCBzcGVjaWZpYyBvbiB3aGVuIHRoZSBkZXN0cnVjdG9ycyBhcmUKKyAgICAgICBpbnZva2VkLCBzbyB3ZSBzaG91bGQgYmUgZnJlZSB0byBjaG9vc2UuCisgICAgKi8KKyAgICBpZiAodGFza2RhdGEtPnRkX2ZsYWdzLmRlc3RydWN0b3JzX3RodW5rKSB7CisgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgZGVzdHJfdGh1bmsgPSB0YXNrLT5kYXRhMS5kZXN0cnVjdG9yczsKKyAgICAgICAgS01QX0FTU0VSVChkZXN0cl90aHVuayk7CisgICAgICAgIGRlc3RyX3RodW5rKGd0aWQsIHRhc2spOworICAgIH0KKyNlbmRpZiAvLyBPTVBfNDBfRU5BQkxFRAorCisgICAgLy8gYm9va2tlZXBpbmcgZm9yIHJlc3VtaW5nIHRhc2s6CisgICAgLy8gR0VIIC0gbm90ZSB0YXNraW5nX3NlciA9PiB0YXNrX3NlcmlhbAorICAgIEtNUF9ERUJVR19BU1NFUlQoICh0YXNrZGF0YS0+dGRfZmxhZ3MudGFza2luZ19zZXIgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsKSA9PQorICAgICAgICAgICAgICAgICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwpOworICAgIGlmICggdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tfc2VyaWFsICkKKyAgICB7CisgICAgICAgIGlmIChyZXN1bWVkX3Rhc2sgPT0gTlVMTCkgeworICAgICAgICAgICAgcmVzdW1lZF90YXNrID0gdGFza2RhdGEtPnRkX3BhcmVudDsgIC8vIEluIGEgc2VyaWFsaXplZCB0YXNrLCB0aGUgcmVzdW1lZCB0YXNrIGlzIHRoZSBwYXJlbnQKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIHZlcmlmeSByZXN1bWVkIHRhc2sgcGFzc2VkIGluIHBvaW50cyB0byBwYXJlbnQKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJlc3VtZWRfdGFzayA9PSB0YXNrZGF0YS0+dGRfcGFyZW50ICk7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHJlc3VtZWRfdGFzayAhPSBOVUxMICk7ICAgICAgICAvLyB2ZXJpZnkgdGhhdCByZXN1bWVkIHRhc2sgaXMgcGFzc2VkIGFzIGFyZ3VlbW50CisgICAgfQorCisgICAgLy8gRnJlZSB0aGlzIHRhc2sgYW5kIHRoZW4gYW5jZXN0b3IgdGFza3MgaWYgdGhleSBoYXZlIG5vIGNoaWxkcmVuLgorICAgIC8vIFJlc3RvcmUgdGhfY3VycmVudF90YXNrIGZpcnN0IGFzIHN1Z2dlc3RlZCBieSBKb2huOgorICAgIC8vIGpvaG5tYzogaWYgYW4gYXN5bmNocm9ub3VzIGlucXVpcnkgcGVlcnMgaW50byB0aGUgcnVudGltZSBzeXN0ZW0KKyAgICAvLyBpdCBkb2Vzbid0IHNlZSB0aGUgZnJlZWQgdGFzayBhcyB0aGUgY3VycmVudCB0YXNrLgorICAgIHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrID0gcmVzdW1lZF90YXNrOworICAgIF9fa21wX2ZyZWVfdGFza19hbmRfYW5jZXN0b3JzKGd0aWQsIHRhc2tkYXRhLCB0aHJlYWQpOworCisgICAgLy8gVE9ETzogR0VIIC0gbWFrZSBzdXJlIHJvb3QgdGVhbSBpbXBsaWNpdCB0YXNrIGlzIGluaXRpYWxpemVkIHByb3Blcmx5LgorICAgIC8vIEtNUF9ERUJVR19BU1NFUlQoIHJlc3VtZWRfdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nID09IDAgKTsKKyAgICByZXN1bWVkX3Rhc2stPnRkX2ZsYWdzLmV4ZWN1dGluZyA9IDE7ICAvLyByZXN1bWUgcHJldmlvdXMgdGFzaworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19maW5pc2goZXhpdCk6IFQjJWQgZmluaXNoZWQgdGFzayAlcCwgcmVzdW1pbmcgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhLCByZXN1bWVkX3Rhc2spICk7CisKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwOiByZXBvcnQgdGhhdCBhIHRhc2sgaGFzIGNvbXBsZXRlZCBleGVjdXRpb24KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbjsgcG9pbnRzIHRvIGVuZCBvZiB0YXNrIGJsb2NrLgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyB0YXNrOiB0YXNrIHRodW5rIGZvciB0aGUgY29tcGxldGVkIHRhc2suCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZV9pZjAoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICp0YXNrICkKK3sKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKworICAgIF9fa21wX3Rhc2tfZmluaXNoKCBndGlkLCB0YXNrLCBOVUxMICk7ICAvLyB0aGlzIHJvdXRpbmUgd2lsbCBwcm92aWRlIHRhc2sgdG8gcmVzdW1lCisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfY29tcGxldGVfaWYwKGV4aXQpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzaykgKSApOworCisgICAgcmV0dXJuOworfQorCisjaWZkZWYgVEFTS19VTlVTRUQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfb21wX3Rhc2tfY29tcGxldGU6IHJlcG9ydCB0aGF0IGEgdGFzayBoYXMgY29tcGxldGVkIGV4ZWN1dGlvbgorLy8gTkVWRVIgR0VORVJBVEVEIEJZIENPTVBJTEVSLCBERVBSRUNBVEVEISEhCisKK3ZvaWQKK19fa21wY19vbXBfdGFza19jb21wbGV0ZSggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2sgKQoreworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZShlbnRlcik6IFQjJWQgbG9jPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBsb2NfcmVmLCBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKSApICk7CisKKyAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgTlVMTCApOyAgLy8gTm90IHN1cmUgaG93IHRvIGZpbmQgdGFzayB0byByZXN1bWUKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza19jb21wbGV0ZShleGl0KTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIEtNUF9UQVNLX1RPX1RBU0tEQVRBKHRhc2spICkgKTsKKyAgICByZXR1cm47Cit9CisjZW5kaWYgLy8gVEFTS19VTlVTRUQKKworCisjaWYgT01QVF9TVVBQT1JUCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfaW5pdF9vbXB0OgorLy8gICBJbml0aWFsaXplIE9NUFQgZmllbGRzIG1haW50YWluZWQgYnkgYSB0YXNrLiBUaGlzIHdpbGwgb25seSBiZSBjYWxsZWQgYWZ0ZXIKKy8vICAgb21wdF90b29sLCBzbyB3ZSBhbHJlYWR5IGtub3cgd2hldGhlciBvbXB0IGlzIGVuYWJsZWQgb3Igbm90LgorCitzdGF0aWMgaW5saW5lIHZvaWQKK19fa21wX3Rhc2tfaW5pdF9vbXB0KCBrbXBfdGFza2RhdGFfdCAqIHRhc2ssIGludCB0aWQsIHZvaWQgKiBmdW5jdGlvbiApCit7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gX19vbXB0X3Rhc2tfaWRfbmV3KHRpZCk7CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLmZ1bmN0aW9uID0gZnVuY3Rpb247CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLmZyYW1lLmV4aXRfcnVudGltZV9mcmFtZSA9IE5VTEw7CisgICAgICAgIHRhc2stPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IE5VTEw7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICAgICAgdGFzay0+b21wdF90YXNrX2luZm8ubmRlcHMgPSAwOworICAgICAgICB0YXNrLT5vbXB0X3Rhc2tfaW5mby5kZXBzID0gTlVMTDsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworICAgIH0KK30KKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrOiBJbml0aWFsaXplIHRoZSBhcHByb3ByaWF0ZSBmaWVsZHMgaW4gdGhlIGltcGxpY2l0IHRhc2sgZm9yIGEgZ2l2ZW4gdGhyZWFkCisvLworLy8gbG9jX3JlZjogIHJlZmVyZW5jZSB0byBzb3VyY2UgbG9jYXRpb24gb2YgcGFyYWxsZWwgcmVnaW9uCisvLyB0aGlzX3RocjogIHRocmVhZCBkYXRhIHN0cnVjdHVyZSBjb3JyZXNwb25kaW5nIHRvIGltcGxpY2l0IHRhc2sKKy8vIHRlYW06IHRlYW0gZm9yIHRoaXNfdGhyCisvLyB0aWQ6IHRocmVhZCBpZCBvZiBnaXZlbiB0aHJlYWQgd2l0aGluIHRlYW0KKy8vIHNldF9jdXJyX3Rhc2s6IFRSVUUgaWYgbmVlZCB0byBwdXNoIGN1cnJlbnQgdGFzayB0byB0aHJlYWQKKy8vIE5PVEU6IFJvdXRpbmUgZG9lcyBub3Qgc2V0IHVwIHRoZSBpbXBsaWNpdCB0YXNrIElDVlMuICBUaGlzIGlzIGFzc3VtZWQgdG8gaGF2ZSBhbHJlYWR5IGJlZW4gZG9uZSBlbHNld2hlcmUuCisvLyBUT0RPOiBHZXQgYmV0dGVyIGxvY19yZWYuICBWYWx1ZSBwYXNzZWQgaW4gbWF5IGJlIE5VTEwKKwordm9pZAorX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW5mb190ICp0aGlzX3Rociwga21wX3RlYW1fdCAqdGVhbSwgaW50IHRpZCwgaW50IHNldF9jdXJyX3Rhc2sgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFzayAgID0gJiB0ZWFtLT50LnRfaW1wbGljaXRfdGFza190YXNrZGF0YVsgdGlkIF07CisKKyAgICBLRl9UUkFDRSgxMCwgKCJfX2ttcF9pbml0X2ltcGxpY2l0X3Rhc2soZW50ZXIpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXAsIHJlaW5pdD0lc1xuIiwKKyAgICAgICAgICAgICAgICAgIHRpZCwgdGVhbSwgdGFzaywgc2V0X2N1cnJfdGFzayA/ICJUUlVFIiA6ICJGQUxTRSIgKSApOworCisgICAgdGFzay0+dGRfdGFza19pZCAgPSBLTVBfR0VOX1RBU0tfSUQoKTsKKyAgICB0YXNrLT50ZF90ZWFtICAgICA9IHRlYW07CisvLyAgICB0YXNrLT50ZF9wYXJlbnQgICA9IE5VTEw7ICAvLyBmaXggZm9yIENRMjMwMTAxIChicm9rZW4gcGFyZW50IHRhc2sgaW5mbyBpbiBkZWJ1Z2dlcikKKyAgICB0YXNrLT50ZF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgdGFzay0+dGRfdGFza3dhaXRfaWRlbnQgICA9IE5VTEw7CisgICAgdGFzay0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFzay0+dGRfdGFza3dhaXRfdGhyZWFkICA9IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IFRBU0tfVElFRDsKKyAgICB0YXNrLT50ZF9mbGFncy50YXNrdHlwZSAgICA9IFRBU0tfSU1QTElDSVQ7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICB0YXNrLT50ZF9mbGFncy5wcm94eSAgICAgICA9IFRBU0tfRlVMTDsKKyNlbmRpZgorCisgICAgLy8gQWxsIGltcGxpY2l0IHRhc2tzIGFyZSBleGVjdXRlZCBpbW1lZGlhdGVseSwgbm90IGRlZmVycmVkCisgICAgdGFzay0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLnRhc2tpbmdfc2VyID0gKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIHRhc2stPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApID8gMSA6IDA7CisKKyAgICB0YXNrLT50ZF9mbGFncy5zdGFydGVkICAgICA9IDE7CisgICAgdGFzay0+dGRfZmxhZ3MuZXhlY3V0aW5nICAgPSAxOworICAgIHRhc2stPnRkX2ZsYWdzLmNvbXBsZXRlICAgID0gMDsKKyAgICB0YXNrLT50ZF9mbGFncy5mcmVlZCAgICAgICA9IDA7CisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIHRhc2stPnRkX2RlcGhhc2ggPSBOVUxMOworICAgIHRhc2stPnRkX2RlcG5vZGUgPSBOVUxMOworI2VuZGlmCisKKyAgICBpZiAoc2V0X2N1cnJfdGFzaykgeyAgLy8gb25seSBkbyB0aGlzIGluaXRpYWxpemF0aW9uIHRoZSBmaXJzdCB0aW1lIGEgdGhyZWFkIGlzIGNyZWF0ZWQKKyAgICAgICAgdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyA9IDA7CisgICAgICAgIHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPSAwOyAvLyBOb3QgdXNlZCBiZWNhdXNlIGRvIG5vdCBuZWVkIHRvIGRlYWxsb2NhdGUgaW1wbGljaXQgdGFzaworI2lmIE9NUF80MF9FTkFCTEVECisgICAgICAgIHRhc2stPnRkX3Rhc2tncm91cCA9IE5VTEw7ICAgICAgICAgICAvLyBBbiBpbXBsaWNpdCB0YXNrIGRvZXMgbm90IGhhdmUgdGFza2dyb3VwCisjZW5kaWYKKyAgICAgICAgX19rbXBfcHVzaF9jdXJyZW50X3Rhc2tfdG9fdGhyZWFkKCB0aGlzX3RociwgdGVhbSwgdGlkICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID09IDApOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRhc2stPnRkX2FsbG9jYXRlZF9jaGlsZF90YXNrcyAgPT0gMCk7CisgICAgfQorCisjaWYgT01QVF9TVVBQT1JUCisgICAgX19rbXBfdGFza19pbml0X29tcHQodGFzaywgdGlkLCBOVUxMKTsKKyNlbmRpZgorCisgICAgS0ZfVFJBQ0UoMTAsICgiX19rbXBfaW5pdF9pbXBsaWNpdF90YXNrKGV4aXQpOiBUIzolZCB0ZWFtPSVwIHRhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aWQsIHRlYW0sIHRhc2sgKSApOworfQorCisvLyBSb3VuZCB1cCBhIHNpemUgdG8gYSBwb3dlciBvZiB0d28gc3BlY2lmaWVkIGJ5IHZhbAorLy8gVXNlZCB0byBpbnNlcnQgcGFkZGluZyBiZXR3ZWVuIHN0cnVjdHVyZXMgY28tYWxsb2NhdGVkIHVzaW5nIGEgc2luZ2xlIG1hbGxvYygpIGNhbGwKK3N0YXRpYyBzaXplX3QKK19fa21wX3JvdW5kX3VwX3RvX3ZhbCggc2l6ZV90IHNpemUsIHNpemVfdCB2YWwgKSB7CisgICAgaWYgKCBzaXplICYgKCB2YWwgLSAxICkgKSB7CisgICAgICAgIHNpemUgJj0gfiAoIHZhbCAtIDEgKTsKKyAgICAgICAgaWYgKCBzaXplIDw9IEtNUF9TSVpFX1RfTUFYIC0gdmFsICkgeworICAgICAgICAgICAgc2l6ZSArPSB2YWw7ICAgIC8vIFJvdW5kIHVwIGlmIHRoZXJlIGlzIG5vIG92ZXJmbG93LgorICAgICAgICB9OyAvLyBpZgorICAgIH07IC8vIGlmCisgICAgcmV0dXJuIHNpemU7Cit9IC8vIF9fa21wX3JvdW5kX3VwX3RvX3ZhCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgdGFzayBkYXRhIHN0cnVjdHVyZXMgZm9yIGEgdGFzaworLy8KKy8vIGxvY19yZWY6IHNvdXJjZSBsb2NhdGlvbiBpbmZvcm1hdGlvbgorLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBudW1iZXIuCisvLyBmbGFnczogaW5jbHVkZSB0aWVkbmVzcyAmIHRhc2sgdHlwZSAoZXhwbGljaXQgdnMuIGltcGxpY2l0KSBvZiB0aGUgJyduZXcnJyB0YXNrIGVuY291bnRlcmVkLgorLy8gICAgICAgIENvbnZlcnRlZCBmcm9tIGttcF9pbnQzMiB0byBrbXBfdGFza2luZ19mbGFnc190IGluIHJvdXRpbmUuCisvLyBzaXplb2Zfa21wX3Rhc2tfdDogIFNpemUgaW4gYnl0ZXMgb2Yga21wX3Rhc2tfdCBkYXRhIHN0cnVjdHVyZSBpbmNsdWRpbmcgcHJpdmF0ZSB2YXJzIGFjY2Vzc2VkIGluIHRhc2suCisvLyBzaXplb2Zfc2hhcmVkczogIFNpemUgaW4gYnl0ZXMgb2YgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgYWNjZXNzZWQgaW4gdGFzay4KKy8vIHRhc2tfZW50cnk6IFBvaW50ZXIgdG8gdGFzayBjb2RlIGVudHJ5IHBvaW50IGdlbmVyYXRlZCBieSBjb21waWxlci4KKy8vIHJldHVybnM6IGEgcG9pbnRlciB0byB0aGUgYWxsb2NhdGVkIGttcF90YXNrX3Qgc3RydWN0dXJlICh0YXNrKS4KKwora21wX3Rhc2tfdCAqCitfX2ttcF90YXNrX2FsbG9jKCBpZGVudF90ICpsb2NfcmVmLCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tpbmdfZmxhZ3NfdCAqZmxhZ3MsCisgICAgICAgICAgICAgICAgICBzaXplX3Qgc2l6ZW9mX2ttcF90YXNrX3QsIHNpemVfdCBzaXplb2Zfc2hhcmVkcywKKyAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqdGFzazsKKyAgICBrbXBfdGFza2RhdGFfdCAqdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQtPnRoLnRoX3RlYW07CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfdGFza19hbGxvYyhlbnRlcik6IFQjJWQgbG9jPSVwLCBmbGFncz0oMHgleCkgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsICooKGttcF9pbnQzMiAqKWZsYWdzKSwgc2l6ZW9mX2ttcF90YXNrX3QsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKworICAgIGlmICggcGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsICkgeworICAgICAgICBpZiAoZmxhZ3MtPm1lcmdlZF9pZjApIHsKKyAgICAgICAgfQorICAgICAgICBmbGFncy0+ZmluYWwgPSAxOworICAgIH0KKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgaWYgKCBmbGFncy0+cHJveHkgPT0gVEFTS19QUk9YWSApIHsKKyAgICAgICAgZmxhZ3MtPnRpZWRuZXNzID0gVEFTS19VTlRJRUQ7CisgICAgICAgIGZsYWdzLT5tZXJnZWRfaWYwID0gMTsKKworICAgICAgICAvKiBhcmUgd2UgcnVubmluZyBpbiBhIHNlcXVlbnRpYWwgcGFyYWxsZWwgb3IgdHNrbV9pbW1lZGlhdGVfZXhlYy4uLiB3ZSBuZWVkIHRhc2tpbmcgc3VwcG9ydCBlbmFibGVkICovCisgICAgICAgIGlmICggKHRocmVhZC0+dGgudGhfdGFza190ZWFtKSA9PSBOVUxMICkgeworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgb25seSBoYXBwZW4gaWYgdGhlIHRlYW0gaXMgc2VyaWFsaXplZAorICAgICAgICAgICAgICAgIHNldHVwIGEgdGFzayB0ZWFtIGFuZCBwcm9wYWdhdGUgaXQgdG8gdGhlIHRocmVhZAorICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodGVhbS0+dC50X3NlcmlhbGl6ZWQpOworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsKCJUIyVkIGNyZWF0aW5nIHRhc2sgdGVhbSBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLCBndGlkKSk7CisgICAgICAgICAgICBfX2ttcF90YXNrX3RlYW1fc2V0dXAodGhyZWFkLHRlYW0sMSk7IC8vIDEgaW5kaWNhdGVzIHNldHVwIHRoZSBjdXJyZW50IHRlYW0gcmVnYXJkbGVzcyBvZiBudGhyZWFkcworICAgICAgICAgICAgdGhyZWFkLT50aC50aF90YXNrX3RlYW0gPSB0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV07CisgICAgICAgIH0KKyAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisKKyAgICAgICAgLyogdGFza2luZyBtdXN0IGJlIGVuYWJsZWQgbm93IGFzIHRoZSB0YXNrIG1pZ2h0IG5vdCBiZSBwdXNoZWQgKi8KKyAgICAgICAgaWYgKCAhS01QX1RBU0tJTkdfRU5BQkxFRCggdGFza190ZWFtICkgKSB7CisgICAgICAgICAgICBLQV9UUkFDRSgzMCwoIlQjJWQgZW5hYmxpbmcgdGFza2luZyBpbiBfX2ttcF90YXNrX2FsbG9jIGZvciBwcm94eSB0YXNrXG4iLCBndGlkKSk7CisgICAgICAgICAgICBfX2ttcF9lbmFibGVfdGFza2luZyggdGFza190ZWFtLCB0aHJlYWQgKTsKKyAgICAgICAgICAgIGttcF9pbnQzMiB0aWQgPSB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKiB0aHJlYWRfZGF0YSA9ICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVsgdGlkIF07CisgICAgICAgICAgICAvLyBObyBsb2NrIG5lZWRlZCBzaW5jZSBvbmx5IG93bmVyIGNhbiBhbGxvY2F0ZQorICAgICAgICAgICAgaWYgKHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NfdGFza19kZXF1ZSggdGhyZWFkLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgaWYgKCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IEZBTFNFICkKKyAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfcHJveHlfdGFza3MsIFRSVUUpOworICAgIH0KKyNlbmRpZgorCisgICAgLy8gQ2FsY3VsYXRlIHNoYXJlZCBzdHJ1Y3R1cmUgb2Zmc2V0IGluY2x1ZGluZyBwYWRkaW5nIGFmdGVyIGttcF90YXNrX3Qgc3RydWN0CisgICAgLy8gdG8gYWxpZ24gcG9pbnRlcnMgaW4gc2hhcmVkIHN0cnVjdAorICAgIHNoYXJlZHNfb2Zmc2V0ID0gc2l6ZW9mKCBrbXBfdGFza2RhdGFfdCApICsgc2l6ZW9mX2ttcF90YXNrX3Q7CisgICAgc2hhcmVkc19vZmZzZXQgPSBfX2ttcF9yb3VuZF91cF90b192YWwoIHNoYXJlZHNfb2Zmc2V0LCBzaXplb2YoIHZvaWQgKiApKTsKKworICAgIC8vIEFsbG9jYXRlIGEga21wX3Rhc2tkYXRhX3QgYmxvY2sgYW5kIGEga21wX3Rhc2tfdCBibG9jay4KKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2FsbG9jOiBUIyVkIEZpcnN0IG1hbGxvYyBzaXplOiAlbGRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBzaGFyZWRzX29mZnNldCkgKTsKKyAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF90YXNrX2FsbG9jOiBUIyVkIFNlY29uZCBtYWxsb2Mgc2l6ZTogJWxkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgc2l6ZW9mX3NoYXJlZHMpICk7CisKKyAgICAvLyBBdm9pZCBkb3VibGUgYWxsb2NhdGlvbiBoZXJlIGJ5IGNvbWJpbmluZyBzaGFyZWRzIHdpdGggdGFza2RhdGEKKyAgICAjaWYgVVNFX0ZBU1RfTUVNT1JZCisgICAgdGFza2RhdGEgPSAoa21wX3Rhc2tkYXRhX3QgKikgX19rbXBfZmFzdF9hbGxvY2F0ZSggdGhyZWFkLCBzaGFyZWRzX29mZnNldCArIHNpemVvZl9zaGFyZWRzICk7CisgICAgI2Vsc2UgLyogISBVU0VfRkFTVF9NRU1PUlkgKi8KKyAgICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCB0aHJlYWQsIHNoYXJlZHNfb2Zmc2V0ICsgc2l6ZW9mX3NoYXJlZHMgKTsKKyAgICAjZW5kaWYgLyogVVNFX0ZBU1RfTUVNT1JZICovCisKKyAgICB0YXNrICAgICAgICAgICAgICAgICAgICAgID0gS01QX1RBU0tEQVRBX1RPX1RBU0sodGFza2RhdGEpOworCisgICAgLy8gTWFrZSBzdXJlIHRhc2sgJiB0YXNrZGF0YSBhcmUgYWxpZ25lZCBhcHByb3ByaWF0ZWx5CisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8ICFLTVBfSEFWRV9RVUFECisgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFza2RhdGEpICYgKHNpemVvZihkb3VibGUpLTEpICkgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoICggKChrbXBfdWludHB0cl90KXRhc2spICYgKHNpemVvZihkb3VibGUpLTEpICkgPT0gMCApOworI2Vsc2UKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrZGF0YSkgJiAoc2l6ZW9mKF9RdWFkKS0xKSApID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCAoICgoa21wX3VpbnRwdHJfdCl0YXNrKSAmIChzaXplb2YoX1F1YWQpLTEpICkgPT0gMCApOworI2VuZGlmCisgICAgaWYgKHNpemVvZl9zaGFyZWRzID4gMCkgeworICAgICAgICAvLyBBdm9pZCBkb3VibGUgYWxsb2NhdGlvbiBoZXJlIGJ5IGNvbWJpbmluZyBzaGFyZWRzIHdpdGggdGFza2RhdGEKKyAgICAgICAgdGFzay0+c2hhcmVkcyAgICAgICAgID0gJiAoKGNoYXIgKikgdGFza2RhdGEpWyBzaGFyZWRzX29mZnNldCBdOworICAgICAgICAvLyBNYWtlIHN1cmUgc2hhcmVkcyBzdHJ1Y3QgaXMgYWxpZ25lZCB0byBwb2ludGVyIHNpemUKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCAoKGttcF91aW50cHRyX3QpdGFzay0+c2hhcmVkcykgJiAoc2l6ZW9mKHZvaWQgKiktMSkgKSA9PSAwICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgdGFzay0+c2hhcmVkcyAgICAgICAgID0gTlVMTDsKKyAgICB9CisgICAgdGFzay0+cm91dGluZSAgICAgICAgICAgICA9IHRhc2tfZW50cnk7CisgICAgdGFzay0+cGFydF9pZCAgICAgICAgICAgICA9IDA7ICAgICAgLy8gQUM6IEFsd2F5cyBzdGFydCB3aXRoIDAgcGFydCBpZAorCisgICAgdGFza2RhdGEtPnRkX3Rhc2tfaWQgICAgICA9IEtNUF9HRU5fVEFTS19JRCgpOworICAgIHRhc2tkYXRhLT50ZF90ZWFtICAgICAgICAgPSB0ZWFtOworICAgIHRhc2tkYXRhLT50ZF9hbGxvY190aHJlYWQgPSB0aHJlYWQ7CisgICAgdGFza2RhdGEtPnRkX3BhcmVudCAgICAgICA9IHBhcmVudF90YXNrOworICAgIHRhc2tkYXRhLT50ZF9sZXZlbCAgICAgICAgPSBwYXJlbnRfdGFzay0+dGRfbGV2ZWwgKyAxOyAvLyBpbmNyZW1lbnQgbmVzdGluZyBsZXZlbAorICAgIHRhc2tkYXRhLT50ZF91bnRpZWRfY291bnQgPSAwOworICAgIHRhc2tkYXRhLT50ZF9pZGVudCAgICAgICAgPSBsb2NfcmVmOworICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgID0gTlVMTDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfY291bnRlciA9IDA7CisgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCAgPSAwOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhLT50ZF9wYXJlbnQgIT0gTlVMTCApOworI2lmIE9NUF80NV9FTkFCTEVECisgICAgLy8gYXZvaWQgY29weWluZyBpY3ZzIGZvciBwcm94eSB0YXNrcworICAgIGlmICggZmxhZ3MtPnByb3h5ID09IFRBU0tfRlVMTCApCisjZW5kaWYKKyAgICAgICBjb3B5X2ljdnMoICZ0YXNrZGF0YS0+dGRfaWN2cywgJnRhc2tkYXRhLT50ZF9wYXJlbnQtPnRkX2ljdnMgKTsKKworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyAgICA9IGZsYWdzLT50aWVkbmVzczsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZmluYWwgICAgICAgPSBmbGFncy0+ZmluYWw7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLm1lcmdlZF9pZjAgID0gZmxhZ3MtPm1lcmdlZF9pZjA7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZGVzdHJ1Y3RvcnNfdGh1bmsgPSBmbGFncy0+ZGVzdHJ1Y3RvcnNfdGh1bms7CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSAgICAgICAgICAgPSBmbGFncy0+cHJveHk7CisgICAgdGFza2RhdGEtPnRkX3Rhc2tfdGVhbSAgICAgICAgID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAgdGFza2RhdGEtPnRkX3NpemVfYWxsb2MgICAgICAgID0gc2hhcmVkc19vZmZzZXQgKyBzaXplb2Zfc2hhcmVkczsKKyNlbmRpZgorICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrdHlwZSAgICA9IFRBU0tfRVhQTElDSVQ7CisKKyAgICAvLyBHRUggLSBUT0RPOiBmaXggdGhpcyB0byBjb3B5IHBhcmVudCB0YXNrJ3MgdmFsdWUgb2YgdGFza2luZ19zZXIgZmxhZworICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciA9ICggX19rbXBfdGFza2luZ19tb2RlID09IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIC8vIEdFSCAtIFRPRE86IGZpeCB0aGlzIHRvIGNvcHkgcGFyZW50IHRhc2sncyB2YWx1ZSBvZiB0ZWFtX3NlcmlhbCBmbGFnCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsID0gKCB0ZWFtLT50LnRfc2VyaWFsaXplZCApID8gMSA6IDA7CisKKyAgICAvLyBHRUggLSBOb3RlIHdlIHNlcmlhbGl6ZSB0aGUgdGFzayBpZiB0aGUgdGVhbSBpcyBzZXJpYWxpemVkIHRvIG1ha2Ugc3VyZSBpbXBsaWNpdCBwYXJhbGxlbCByZWdpb24KKyAgICAvLyAgICAgICB0YXNrcyBhcmUgbm90IGxlZnQgdW50aWwgcHJvZ3JhbSB0ZXJtaW5hdGlvbiB0byBleGVjdXRlLiAgQWxzbywgaXQgaGVscHMgbG9jYWxpdHkgdG8gZXhlY3V0ZQorICAgIC8vICAgICAgIGltbWVkaWF0ZWx5LgorICAgIHRhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9ICggcGFyZW50X3Rhc2stPnRkX2ZsYWdzLmZpbmFsCisgICAgICB8fCB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEtPnRkX2ZsYWdzLnRhc2tpbmdfc2VyICk7CisKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3Muc3RhcnRlZCAgICAgPSAwOworICAgIHRhc2tkYXRhLT50ZF9mbGFncy5leGVjdXRpbmcgICA9IDA7CisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLmNvbXBsZXRlICAgID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuZnJlZWQgICAgICAgPSAwOworCisgICAgdGFza2RhdGEtPnRkX2ZsYWdzLm5hdGl2ZSAgICAgID0gZmxhZ3MtPm5hdGl2ZTsKKworICAgIHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzID0gMDsKKyAgICB0YXNrZGF0YS0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzICA9IDE7IC8vIHN0YXJ0IGF0IG9uZSBiZWNhdXNlIGNvdW50cyBjdXJyZW50IHRhc2sgYW5kIGNoaWxkcmVuCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cDsgLy8gdGFzayBpbmhlcml0cyB0aGUgdGFza2dyb3VwIGZyb20gdGhlIHBhcmVudCB0YXNrCisgICAgdGFza2RhdGEtPnRkX2RlcGhhc2ggPSBOVUxMOworICAgIHRhc2tkYXRhLT50ZF9kZXBub2RlID0gTlVMTDsKKyNlbmRpZgorCisgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGQgdGFzayBjb3VudHMgaWYgdGVhbSBwYXJhbGxlbCBhbmQgdGFza2luZyBub3Qgc2VyaWFsaXplZCBvciBpZiBpdCBpcyBhIHByb3h5IHRhc2sKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGlmICggZmxhZ3MtPnByb3h5ID09IFRBU0tfUFJPWFkgfHwgISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApCisjZWxzZQorICAgIGlmICggISggdGFza2RhdGEgLT4gdGRfZmxhZ3MudGVhbV9zZXJpYWwgfHwgdGFza2RhdGEgLT4gdGRfZmxhZ3MudGFza2luZ19zZXIgKSApCisjZW5kaWYKKyAgICB7CisgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiBwYXJlbnRfdGFzay0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgKTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICBpZiAoIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAgKQorICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSgmIHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXAtPmNvdW50KSApOworI2VuZGlmCisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UgaW1wbGljaXQgbm90IGRlYWxsb2NhdGVkCisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApIHsKKyAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fSU5DMzIoIChrbXBfaW50MzIgKikoJiB0YXNrZGF0YS0+dGRfcGFyZW50LT50ZF9hbGxvY2F0ZWRfY2hpbGRfdGFza3MpICk7CisgICAgICAgIH0KKyAgICB9CisKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIGNyZWF0ZWQgdGFzayAlcCBwYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGFza2RhdGEtPnRkX3BhcmVudCkgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fa21wX3Rhc2tfaW5pdF9vbXB0KHRhc2tkYXRhLCBndGlkLCAodm9pZCopIHRhc2tfZW50cnkpOworI2VuZGlmCisKKyAgICByZXR1cm4gdGFzazsKK30KKworCitrbXBfdGFza190ICoKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jX3JlZiwga21wX2ludDMyIGd0aWQsIGttcF9pbnQzMiBmbGFncywKKyAgICAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICAgICAgIGttcF9yb3V0aW5lX2VudHJ5X3QgdGFza19lbnRyeSApCit7CisgICAga21wX3Rhc2tfdCAqcmV0dmFsOworICAgIGttcF90YXNraW5nX2ZsYWdzX3QgKmlucHV0X2ZsYWdzID0gKGttcF90YXNraW5nX2ZsYWdzX3QgKikgJiBmbGFnczsKKworICAgIGlucHV0X2ZsYWdzLT5uYXRpdmUgPSBGQUxTRTsKKyAgICAvLyBfX2ttcF90YXNrX2FsbG9jKCkgc2V0cyB1cCBhbGwgb3RoZXIgcnVudGltZSBmbGFncworCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfYWxsb2MoZW50ZXIpOiBUIyVkIGxvYz0lcCwgZmxhZ3M9KCVzICVzKSAiCisgICAgICAgICAgICAgICAgICAic2l6ZW9mX3Rhc2s9JWxkIHNpemVvZl9zaGFyZWQ9JWxkIGVudHJ5PSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgaW5wdXRfZmxhZ3MtPnRpZWRuZXNzID8gInRpZWQgICIgOiAidW50aWVkIiwKKyAgICAgICAgICAgICAgICAgIGlucHV0X2ZsYWdzLT5wcm94eSA/ICJwcm94eSIgOiAiIiwKKyAgICAgICAgICAgICAgICAgIHNpemVvZl9rbXBfdGFza190LCBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSkgKTsKKyNlbHNlCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGVudGVyKTogVCMlZCBsb2M9JXAsIGZsYWdzPSglcykgIgorICAgICAgICAgICAgICAgICAgInNpemVvZl90YXNrPSVsZCBzaXplb2Zfc2hhcmVkPSVsZCBlbnRyeT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGlucHV0X2ZsYWdzLT50aWVkbmVzcyA/ICJ0aWVkICAiIDogInVudGllZCIsCisgICAgICAgICAgICAgICAgICBzaXplb2Zfa21wX3Rhc2tfdCwgc2l6ZW9mX3NoYXJlZHMsIHRhc2tfZW50cnkpICk7CisjZW5kaWYKKworICAgIHJldHZhbCA9IF9fa21wX3Rhc2tfYWxsb2MoIGxvY19yZWYsIGd0aWQsIGlucHV0X2ZsYWdzLCBzaXplb2Zfa21wX3Rhc2tfdCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzaXplb2Zfc2hhcmVkcywgdGFza19lbnRyeSApOworCisgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX29tcF90YXNrX2FsbG9jKGV4aXQpOiBUIyVkIHJldHZhbCAlcFxuIiwgZ3RpZCwgcmV0dmFsKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gIF9fa21wX2ludm9rZV90YXNrOiBpbnZva2UgdGhlIHNwZWNpZmllZCB0YXNrCisvLworLy8gZ3RpZDogZ2xvYmFsIHRocmVhZCBJRCBvZiBjYWxsZXIKKy8vIHRhc2s6IHRoZSB0YXNrIHRvIGludm9rZQorLy8gY3VycmVudF90YXNrOiB0aGUgdGFzayB0byByZXN1bWUgYWZ0ZXIgdGFzayBpbnZva2F0aW9uCisKK3N0YXRpYyB2b2lkCitfX2ttcF9pbnZva2VfdGFzaygga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnRhc2ssIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX3VpbnQ2NCBjdXJfdGltZTsKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIGludCBkaXNjYXJkID0gMCAvKiBmYWxzZSAqLzsKKyNlbmRpZgorICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGVudGVyKTogVCMlZCBpbnZva2luZyB0YXNrICVwLCBjdXJyZW50X3Rhc2s9JXBcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgY3VycmVudF90YXNrKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQodGFzayk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBpZiAoIHRhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICYmCisgICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MuY29tcGxldGUgPT0gMSkKKyAgICAgICAgIHsKKyAgICAgICAgICAgIC8vIFRoaXMgaXMgYSBwcm94eSB0YXNrIHRoYXQgd2FzIGFscmVhZHkgY29tcGxldGVkIGJ1dCBpdCBuZWVkcyB0byBydW4KKyAgICAgICAgICAgIC8vIGl0cyBib3R0b20taGFsZiBmaW5pc2gKKyAgICAgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrOiBUIyVkIHJ1bm5pbmcgYm90dG9tIGZpbmlzaCBmb3IgcHJveHkgdGFzayAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgICAgICAgICBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoZ3RpZCx0YXNrKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfaW52b2tlX3Rhc2soZXhpdCk6IFQjJWQgY29tcGxldGVkIGJvdHRvbSBmaW5pc2ggZm9yIHByb3h5IHRhc2sgJXAsIHJlc3VtaW5nIHRhc2sgJXBcbiIsIGd0aWQsIHRhc2tkYXRhLCBjdXJyZW50X3Rhc2spICk7CisKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgIH0KKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgIGlmKF9fa21wX2Zvcmtqb2luX2ZyYW1lc19tb2RlID09IDMpIHsKKyAgICAgICAgLy8gR2V0IHRoZSBjdXJyZW50IHRpbWUgc3RhbXAgdG8gbWVhc3VyZSB0YXNrIGV4ZWN1dGlvbiB0aW1lIHRvIGNvcnJlY3QgYmFycmllciBpbWJhbGFuY2UgdGltZQorICAgICAgICBjdXJfdGltZSA9IF9faXR0X2dldF90aW1lc3RhbXAoKTsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgLy8gUHJveHkgdGFza3MgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBydW50aW1lCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgIT0gVEFTS19QUk9YWSApCisjZW5kaWYKKyAgICBfX2ttcF90YXNrX3N0YXJ0KCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKworI2lmIE9NUFRfU1VQUE9SVAorICAgIG9tcHRfdGhyZWFkX2luZm9fdCBvbGRJbmZvOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICAvLyBTdG9yZSB0aGUgdGhyZWFkcyBzdGF0ZXMgYW5kIHJlc3RvcmUgdGhlbSBhZnRlciB0aGUgdGFzaworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIG9sZEluZm8gPSB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm87CisgICAgICAgIHRocmVhZC0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkID0gMDsKKyAgICAgICAgdGhyZWFkLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlID0gb21wdF9zdGF0ZV93b3JrX3BhcmFsbGVsOworICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgfQorI2VuZGlmCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorICAgIC8vIFRPRE86IGNhbmNlbCB0YXNrcyBpZiB0aGUgcGFyYWxsZWwgcmVnaW9uIGhhcyBhbHNvIGJlZW4gY2FuY2VsbGVkCisgICAgLy8gVE9ETzogY2hlY2sgaWYgdGhpcyBzZXF1ZW5jZSBjYW4gYmUgaG9pc3RlZCBhYm92ZSBfX2ttcF90YXNrX3N0YXJ0CisgICAgLy8gaWYgY2FuY2VsbGF0aW9uIGhhcyBiZWVuIGVuYWJsZWQgZm9yIHRoaXMgcnVuIC4uLgorICAgIGlmIChfX2ttcF9vbXBfY2FuY2VsbGF0aW9uKSB7CisgICAgICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gX19rbXBfdGhyZWFkcyBbIGd0aWQgXTsKKyAgICAgICAga21wX3RlYW1fdCAqIHRoaXNfdGVhbSA9IHRoaXNfdGhyLT50aC50aF90ZWFtOworICAgICAgICBrbXBfdGFza2dyb3VwX3QgKiB0YXNrZ3JvdXAgPSB0YXNrZGF0YS0+dGRfdGFza2dyb3VwOworICAgICAgICBpZiAoKHRhc2tncm91cCAmJiB0YXNrZ3JvdXAtPmNhbmNlbF9yZXF1ZXN0KSB8fCAodGhpc190ZWFtLT50LnRfY2FuY2VsX3JlcXVlc3QgPT0gY2FuY2VsX3BhcmFsbGVsKSkgeworICAgICAgICAgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfY2FuY2VsbGVkKTsKKyAgICAgICAgICAgIC8vIHRoaXMgdGFzayBiZWxvbmdzIHRvIGEgdGFzayBncm91cCBhbmQgd2UgbmVlZCB0byBjYW5jZWwgaXQKKyAgICAgICAgICAgIGRpc2NhcmQgPSAxIC8qIHRydWUgKi87CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIEludm9rZSB0aGUgdGFzayByb3V0aW5lIGFuZCBwYXNzIGluIHJlbGV2YW50IGRhdGEuCisgICAgLy8gVGh1bmtzIGdlbmVyYXRlZCBieSBnY2MgdGFrZSBhIGRpZmZlcmVudCBhcmd1bWVudCBsaXN0LgorICAgIC8vCisgICAgaWYgKCFkaXNjYXJkKSB7CisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICAgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfZXhlY3V0ZWQpOworICAgICAgICBzd2l0Y2goS01QX0dFVF9USFJFQURfU1RBVEUoKSkgeworICAgICAgICAgY2FzZSBGT1JLX0pPSU5fQkFSUklFUjogS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfam9pbl9iYXIpOyBicmVhazsKKyAgICAgICAgIGNhc2UgUExBSU5fQkFSUklFUjogS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfcGxhaW5fYmFyKTsgYnJlYWs7CisgICAgICAgICBjYXNlIFRBU0tZSUVMRDogS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfdGFza3lpZWxkKTsgYnJlYWs7CisgICAgICAgICBjYXNlIFRBU0tXQUlUOiBLTVBfUFVTSF9QQVJUSVRJT05FRF9USU1FUihPTVBfdGFza190YXNrd2FpdCk7IGJyZWFrOworICAgICAgICAgY2FzZSBUQVNLR1JPVVA6IEtNUF9QVVNIX1BBUlRJVElPTkVEX1RJTUVSKE9NUF90YXNrX3Rhc2tncm91cCk7IGJyZWFrOworICAgICAgICAgZGVmYXVsdDogS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX3Rhc2tfaW1tZWRpYXRlKTsgYnJlYWs7CisgICAgICAgIH0KKyNlbmRpZiAvLyBLTVBfU1RBVFNfRU5BQkxFRAorI2VuZGlmIC8vIE9NUF80MF9FTkFCTEVECisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICAvKiBsZXQgT01QVCBrbm93IHRoYXQgd2UncmUgYWJvdXQgdG8gcnVuIHRoaXMgdGFzayAqLworICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSkKKyAgICAgICAgeworICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkoCisgICAgICAgICAgICBjdXJyZW50X3Rhc2stPm9tcHRfdGFza19pbmZvLnRhc2tfaWQsCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWZkZWYgS01QX0dPTVBfQ09NUEFUCisgICAgICAgIGlmICh0YXNrZGF0YS0+dGRfZmxhZ3MubmF0aXZlKSB7CisgICAgICAgICAgICAoKHZvaWQgKCopKHZvaWQgKikpKCoodGFzay0+cm91dGluZSkpKSh0YXNrLT5zaGFyZWRzKTsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisjZW5kaWYgLyogS01QX0dPTVBfQ09NUEFUICovCisgICAgICAgIHsKKyAgICAgICAgICAgICgqKHRhc2stPnJvdXRpbmUpKShndGlkLCB0YXNrKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfUE9QX1BBUlRJVElPTkVEX1RJTUVSKCk7CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9UUkFDRQorICAgICAgICAvKiBsZXQgT01QVCBrbm93IHRoYXQgd2UncmUgcmV0dXJuaW5nIHRvIHRoZSBjYWxsZWUgdGFzayAqLworICAgICAgICBpZiAob21wdF9lbmFibGVkICYmCisgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoKSkKKyAgICAgICAgeworICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrX3N3aXRjaCkoCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8udGFza19pZCwKKyAgICAgICAgICAgIGN1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZCk7CisgICAgICAgIH0KKyNlbmRpZgorCisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICB9CisjZW5kaWYgLy8gT01QXzQwX0VOQUJMRUQKKworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8gPSBvbGRJbmZvOworICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUuZXhpdF9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICB9CisjZW5kaWYKKworI2lmIE9NUF80NV9FTkFCTEVECisgICAgLy8gUHJveHkgdGFza3MgYXJlIG5vdCBoYW5kbGVkIGJ5IHRoZSBydW50aW1lCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgIT0gVEFTS19QUk9YWSApCisjZW5kaWYKKyAgICAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisKKyNpZiBVU0VfSVRUX0JVSUxEICYmIFVTRV9JVFRfTk9USUZZCisgICAgLy8gQmFycmllciBpbWJhbGFuY2UgLSBjb3JyZWN0IGFycml2ZSB0aW1lIGFmdGVyIHRoZSB0YXNrIGZpbmlzaGVkCisgICAgaWYoX19rbXBfZm9ya2pvaW5fZnJhbWVzX21vZGUgPT0gMykgeworICAgICAgICBrbXBfaW5mb190ICp0aGlzX3RociA9IF9fa21wX3RocmVhZHMgWyBndGlkIF07CisgICAgICAgIGlmKHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUpIHsKKyAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9iYXJfYXJyaXZlX3RpbWUgKz0gKF9faXR0X2dldF90aW1lc3RhbXAoKSAtIGN1cl90aW1lKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2ludm9rZV90YXNrKGV4aXQpOiBUIyVkIGNvbXBsZXRlZCB0YXNrICVwLCByZXN1bWluZyB0YXNrICVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFza2RhdGEsIGN1cnJlbnRfdGFzaykgKTsKKyAgICByZXR1cm47Cit9CisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza19wYXJ0czogU2NoZWR1bGUgYSB0aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vCisvLyBsb2NfcmVmOiBsb2NhdGlvbiBvZiBvcmlnaW5hbCB0YXNrIHByYWdtYSAoaWdub3JlZCkKKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IHRhc2sgdGh1bmsgYWxsb2NhdGVkIGJ5IF9fa21wX29tcF90YXNrX2FsbG9jKCkgZm9yIHRoZSAnJ25ldyB0YXNrJycKKy8vIFJldHVybnM6CisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2tfcGFydHMoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX3Rhc2tkYXRhX3QgKiBuZXdfdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQShuZXdfdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfb21wX3Rhc2tfcGFydHMoZW50ZXIpOiBUIyVkIGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKworICAgIGlmICggX19rbXBfcHVzaF90YXNrKCBndGlkLCBuZXdfdGFzayApID09IFRBU0tfTk9UX1BVU0hFRCApIC8vIGlmIGNhbm5vdCBkZWZlcgorICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIEV4ZWN1dGUgdGhpcyB0YXNrIGltbWVkaWF0ZWx5CisgICAgICAgIGttcF90YXNrZGF0YV90ICogY3VycmVudF90YXNrID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAgbmV3X3Rhc2tkYXRhLT50ZF9mbGFncy50YXNrX3NlcmlhbCA9IDE7CisgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCBuZXdfdGFzaywgY3VycmVudF90YXNrICk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrX3BhcnRzKGV4aXQpOiBUIyVkIHJldHVybmluZyBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDogIgorICAgICAgICAgICAgICAgICAgImxvYz0lcCB0YXNrPSVwLCByZXR1cm46IFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEXG4iLCBndGlkLCBsb2NfcmVmLAorICAgICAgICAgICAgICAgICAgbmV3X3Rhc2tkYXRhICkgKTsKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX29tcF90YXNrOiBTY2hlZHVsZSBhIG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIGZvciBleGVjdXRpb24KKy8vIGd0aWQ6IEdsb2JhbCBUaHJlYWQgSUQgb2YgZW5jb3VudGVyaW5nIHRocmVhZAorLy8gbmV3X3Rhc2s6IG5vbi10aHJlYWQtc3dpdGNoYWJsZSB0YXNrIHRodW5rIGFsbG9jYXRlZCBieSBfX2ttcF9vbXBfdGFza19hbGxvYygpCisvLyBzZXJpYWxpemVfaW1tZWRpYXRlOiBpZiBUUlVFIHRoZW4gaWYgdGhlIHRhc2sgaXMgZXhlY3V0ZWQgaW1tZWRpYXRlbHkgaXRzIGV4ZWN1dGlvbiB3aWxsIGJlIHNlcmlhbGl6ZWQKKy8vIHJldHVybnM6CisvLworLy8gICAgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQgKDApIGlmIGRpZCBub3Qgc3VzcGVuZCBhbmQgcXVldWUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCisvLyAgICBUQVNLX0NVUlJFTlRfUVVFVUVEICgxKSBpZiBzdXNwZW5kZWQgYW5kIHF1ZXVlZCB0aGUgY3VycmVudCB0YXNrIHRvIGJlIHJlc3VtZWQgbGF0ZXIuCitrbXBfaW50MzIKK19fa21wX29tcF90YXNrKCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIG5ld190YXNrLCBib29sIHNlcmlhbGl6ZV9pbW1lZGlhdGUgKQoreworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworCisjaWYgT01QVF9TVVBQT1JUCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBuZXdfdGFza2RhdGEtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9CisgICAgICAgICAgICBfX2J1aWx0aW5fZnJhbWVfYWRkcmVzcygwKTsKKyAgICB9CisjZW5kaWYKKworICAgIC8qIFNob3VsZCB3ZSBleGVjdXRlIHRoZSBuZXcgdGFzayBvciBxdWV1ZSBpdD8gICBGb3Igbm93LCBsZXQncyBqdXN0IGFsd2F5cyB0cnkgdG8KKyAgICAgICBxdWV1ZSBpdC4gIElmIHRoZSBxdWV1ZSBmaWxscyB1cCwgdGhlbiB3ZSdsbCBleGVjdXRlIGl0LiAgKi8KKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIGlmICggbmV3X3Rhc2tkYXRhLT50ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZIHx8IF9fa21wX3B1c2hfdGFzayggZ3RpZCwgbmV3X3Rhc2sgKSA9PSBUQVNLX05PVF9QVVNIRUQgKSAvLyBpZiBjYW5ub3QgZGVmZXIKKyNlbHNlCisgICAgaWYgKCBfX2ttcF9wdXNoX3Rhc2soIGd0aWQsIG5ld190YXNrICkgPT0gVEFTS19OT1RfUFVTSEVEICkgLy8gaWYgY2Fubm90IGRlZmVyCisjZW5kaWYKKyAgICB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBFeGVjdXRlIHRoaXMgdGFzayBpbW1lZGlhdGVseQorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnRfdGFzayA9IF9fa21wX3RocmVhZHNbIGd0aWQgXSAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIGlmICggc2VyaWFsaXplX2ltbWVkaWF0ZSApCisgICAgICAgICAgbmV3X3Rhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2tfc2VyaWFsID0gMTsKKyAgICAgICAgX19rbXBfaW52b2tlX3Rhc2soIGd0aWQsIG5ld190YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQKKyAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgIG5ld190YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICB9CisjZW5kaWYKKworICAgIHJldHVybiBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFzazogV3JhcHBlciBhcm91bmQgX19rbXBfb21wX3Rhc2sgdG8gc2NoZWR1bGUgYSBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayBmcm9tCisvLyB0aGUgcGFyZW50IHRocmVhZCBvbmx5IQorLy8gbG9jX3JlZjogbG9jYXRpb24gb2Ygb3JpZ2luYWwgdGFzayBwcmFnbWEgKGlnbm9yZWQpCisvLyBndGlkOiBHbG9iYWwgVGhyZWFkIElEIG9mIGVuY291bnRlcmluZyB0aHJlYWQKKy8vIG5ld190YXNrOiBub24tdGhyZWFkLXN3aXRjaGFibGUgdGFzayB0aHVuayBhbGxvY2F0ZWQgYnkgX19rbXBfb21wX3Rhc2tfYWxsb2MoKQorLy8gcmV0dXJuczoKKy8vCisvLyAgICBUQVNLX0NVUlJFTlRfTk9UX1FVRVVFRCAoMCkgaWYgZGlkIG5vdCBzdXNwZW5kIGFuZCBxdWV1ZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKy8vICAgIFRBU0tfQ1VSUkVOVF9RVUVVRUQgKDEpIGlmIHN1c3BlbmRlZCBhbmQgcXVldWVkIHRoZSBjdXJyZW50IHRhc2sgdG8gYmUgcmVzdW1lZCBsYXRlci4KKwora21wX2ludDMyCitfX2ttcGNfb21wX3Rhc2soIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBrbXBfdGFza190ICogbmV3X3Rhc2spCit7CisgICAga21wX2ludDMyIHJlczsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURV9CTE9DSyhFWFBMSUNJVF9UQVNLKTsKKworI2lmIEtNUF9ERUJVRworICAgIGttcF90YXNrZGF0YV90ICogbmV3X3Rhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEobmV3X3Rhc2spOworI2VuZGlmCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrKGVudGVyKTogVCMlZCBsb2M9JXAgdGFzaz0lcFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIG5ld190YXNrZGF0YSApICk7CisKKyAgICByZXMgPSAgX19rbXBfb21wX3Rhc2soZ3RpZCxuZXdfdGFzayx0cnVlKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFzayhleGl0KTogVCMlZCByZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRUQ6IGxvYz0lcCB0YXNrPSVwXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgbG9jX3JlZiwgbmV3X3Rhc2tkYXRhICkgKTsKKyAgICByZXR1cm4gcmVzOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wY19vbXBfdGFza3dhaXQ6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrIGFyZSBjb21wbGV0ZQorCitrbXBfaW50MzIKK19fa21wY19vbXBfdGFza3dhaXQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQ7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFX0JMT0NLKFRBU0tXQUlUKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3dhaXQoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jX3JlZikgKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgYmVnaW4gd2FpdD8KKworICAgICAgICB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisgICAgICAgIHRhc2tkYXRhID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIG9tcHRfdGFza19pZF90IG15X3Rhc2tfaWQ7CisgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBteV9wYXJhbGxlbF9pZDsKKworICAgICAgICBpZiAob21wdF9lbmFibGVkKSB7CisgICAgICAgICAgICBrbXBfdGVhbV90ICp0ZWFtID0gdGhyZWFkLT50aC50aF90ZWFtOworICAgICAgICAgICAgbXlfdGFza19pZCA9IHRhc2tkYXRhLT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkOworICAgICAgICAgICAgbXlfcGFyYWxsZWxfaWQgPSB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkOworCisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gX19idWlsdGluX2ZyYW1lX2FkZHJlc3MoMCk7CisgICAgICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3Rhc2t3YWl0X2JlZ2luKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrd2FpdF9iZWdpbikoCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG15X3BhcmFsbGVsX2lkLCBteV90YXNrX2lkKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2VuZGlmCisKKyAgICAgICAgLy8gRGVidWdnZXI6IFRoZSB0YXNrd2FpdCBpcyBhY3RpdmUuIFN0b3JlIGxvY2F0aW9uIGFuZCB0aHJlYWQgZW5jb3VudGVyZWQgdGhlIHRhc2t3YWl0LgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpICkKKyNlbHNlCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIC8vIEdFSDogaWYgdGVhbSBzZXJpYWxpemVkLCBhdm9pZCByZWFkaW5nIHRoZSB2b2xhdGlsZSB2YXJpYWJsZSBiZWxvdy4KKyAgICAgICAgICAgIGttcF9mbGFnXzMyIGZsYWcoJih0YXNrZGF0YS0+dGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcyksIDBVKTsKKyAgICAgICAgICAgIHdoaWxlICggVENSXzQodGFza2RhdGEgLT4gdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrcykgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBmbGFnLmV4ZWN1dGVfdGFza3ModGhyZWFkLCBndGlkLCBGQUxTRSwgJnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBfX2ttcF90YXNrX3N0ZWFsaW5nX2NvbnN0cmFpbnQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgaWYgKCBpdHRfc3luY19vYmogIT0gTlVMTCApCisgICAgICAgICAgICBfX2ttcF9pdHRfdGFza3dhaXRfZmluaXNoZWQoIGd0aWQsIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGVuZCBvZiB3YWl0PworICAgICAgICAvLyBEZWJ1Z2dlcjogIFRoZSB0YXNrd2FpdCBpcyBjb21wbGV0ZWQuIExvY2F0aW9uIHJlbWFpbnMsIGJ1dCB0aHJlYWQgaXMgbmVnYXRlZC4KKyAgICAgICAgdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZCA9IC0gdGFza2RhdGEtPnRkX3Rhc2t3YWl0X3RocmVhZDsKKworI2lmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisgICAgICAgIGlmIChvbXB0X2VuYWJsZWQpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGFza3dhaXRfZW5kKSkgeworICAgICAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90YXNrd2FpdF9lbmQpKAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBteV9wYXJhbGxlbF9pZCwgbXlfdGFza19pZCk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrZGF0YS0+b21wdF90YXNrX2luZm8uZnJhbWUucmVlbnRlcl9ydW50aW1lX2ZyYW1lID0gMDsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfQorCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX29tcF90YXNrd2FpdChleGl0KTogVCMlZCB0YXNrICVwIGZpbmlzaGVkIHdhaXRpbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX29tcF90YXNreWllbGQ6IHN3aXRjaCB0byBhIGRpZmZlcmVudCB0YXNrCisKK2ttcF9pbnQzMgorX19rbXBjX29tcF90YXNreWllbGQoIGlkZW50X3QgKmxvY19yZWYsIGttcF9pbnQzMiBndGlkLCBpbnQgZW5kX3BhcnQgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGE7CisgICAga21wX2luZm9fdCAqIHRocmVhZDsKKyAgICBpbnQgdGhyZWFkX2ZpbmlzaGVkID0gRkFMU0U7CisKKyAgICBLTVBfQ09VTlRfQkxPQ0soT01QX1RBU0tZSUVMRCk7CisgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soVEFTS1lJRUxEKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGVudGVyKTogVCMlZCBsb2M9JXAgZW5kX3BhcnQgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIGd0aWQsIGxvY19yZWYsIGVuZF9wYXJ0KSApOworCisgICAgaWYgKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyAmJiBfX2ttcF9pbml0X3BhcmFsbGVsICkgeworICAgICAgICAvLyBHRUggVE9ETzogc2hvdWxkbid0IHdlIGhhdmUgc29tZSBzb3J0IG9mIE9NUFJBUCBBUEkgY2FsbHMgaGVyZSB0byBtYXJrIGJlZ2luIHdhaXQ/CisKKyAgICAgICAgdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgICAgICB0YXNrZGF0YSA9IHRocmVhZCAtPiB0aC50aF9jdXJyZW50X3Rhc2s7CisgICAgICAgIC8vIFNob3VsZCB3ZSBtb2RlbCB0aGlzIGFzIGEgdGFzayB3YWl0IG9yIG5vdD8KKyAgICAgICAgLy8gRGVidWdnZXI6IFRoZSB0YXNrd2FpdCBpcyBhY3RpdmUuIFN0b3JlIGxvY2F0aW9uIGFuZCB0aHJlYWQgZW5jb3VudGVyZWQgdGhlIHRhc2t3YWl0LgorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgLy8gTm90ZTogVGhlc2UgdmFsdWVzIGFyZSB1c2VkIGJ5IElUVCBldmVudHMgYXMgd2VsbC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9jb3VudGVyICs9IDE7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF9pZGVudCAgICA9IGxvY19yZWY7CisgICAgICAgIHRhc2tkYXRhLT50ZF90YXNrd2FpdF90aHJlYWQgICA9IGd0aWQgKyAxOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBpZiAoICEgdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsICkgeworICAgICAgICAgICAga21wX3Rhc2tfdGVhbV90ICogdGFza190ZWFtID0gdGhyZWFkLT50aC50aF90YXNrX3RlYW07CisgICAgICAgICAgICBpZiAodGFza190ZWFtICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAoS01QX1RBU0tJTkdfRU5BQkxFRCh0YXNrX3RlYW0pKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza3NfMzIoIHRocmVhZCwgZ3RpZCwgTlVMTCwgRkFMU0UsICZ0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgX19rbXBfdGFza19zdGVhbGluZ19jb25zdHJhaW50ICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9maW5pc2hlZCggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgICAgIC8vIEdFSCBUT0RPOiBzaG91bGRuJ3Qgd2UgaGF2ZSBzb21lIHNvcnQgb2YgT01QUkFQIEFQSSBjYWxscyBoZXJlIHRvIG1hcmsgZW5kIG9mIHdhaXQ/CisgICAgICAgIC8vIERlYnVnZ2VyOiAgVGhlIHRhc2t3YWl0IGlzIGNvbXBsZXRlZC4gTG9jYXRpb24gcmVtYWlucywgYnV0IHRocmVhZCBpcyBuZWdhdGVkLgorICAgICAgICB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkID0gLSB0YXNrZGF0YS0+dGRfdGFza3dhaXRfdGhyZWFkOworICAgIH0KKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY19vbXBfdGFza3lpZWxkKGV4aXQpOiBUIyVkIHRhc2sgJXAgcmVzdW1pbmcsICIKKyAgICAgICAgICAgICAgICAgICJyZXR1cm5pbmcgVEFTS19DVVJSRU5UX05PVF9RVUVVRURcbiIsIGd0aWQsIHRhc2tkYXRhKSApOworCisgICAgcmV0dXJuIFRBU0tfQ1VSUkVOVF9OT1RfUVVFVUVEOworfQorCisKKyNpZiBPTVBfNDBfRU5BQkxFRAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcGNfdGFza2dyb3VwOiBTdGFydCBhIG5ldyB0YXNrZ3JvdXAKKwordm9pZAorX19rbXBjX3Rhc2tncm91cCggaWRlbnRfdCogbG9jLCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgICAgICogdGhyZWFkID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworICAgIGttcF90YXNrZGF0YV90ICAqIHRhc2tkYXRhID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tncm91cF90ICogdGdfbmV3ID0KKyAgICAgICAgKGttcF90YXNrZ3JvdXBfdCAqKV9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgc2l6ZW9mKCBrbXBfdGFza2dyb3VwX3QgKSApOworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrZ3JvdXA6IFQjJWQgbG9jPSVwIGdyb3VwPSVwXG4iLCBndGlkLCBsb2MsIHRnX25ldykgKTsKKyAgICB0Z19uZXctPmNvdW50ID0gMDsKKyAgICB0Z19uZXctPmNhbmNlbF9yZXF1ZXN0ID0gY2FuY2VsX25vcmVxOworICAgIHRnX25ldy0+cGFyZW50ID0gdGFza2RhdGEtPnRkX3Rhc2tncm91cDsKKyAgICB0YXNrZGF0YS0+dGRfdGFza2dyb3VwID0gdGdfbmV3OworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBjX2VuZF90YXNrZ3JvdXA6IFdhaXQgdW50aWwgYWxsIHRhc2tzIGdlbmVyYXRlZCBieSB0aGUgY3VycmVudCB0YXNrCisvLyAgICAgICAgICAgICAgICAgICAgICAgYW5kIGl0cyBkZXNjZW5kYW50cyBhcmUgY29tcGxldGUKKwordm9pZAorX19rbXBjX2VuZF90YXNrZ3JvdXAoIGlkZW50X3QqIGxvYywgaW50IGd0aWQgKQoreworICAgIGttcF9pbmZvX3QgICAgICAqIHRocmVhZCA9IF9fa21wX3RocmVhZHNbIGd0aWQgXTsKKyAgICBrbXBfdGFza2RhdGFfdCAgKiB0YXNrZGF0YSA9IHRocmVhZC0+dGgudGhfY3VycmVudF90YXNrOworICAgIGttcF90YXNrZ3JvdXBfdCAqIHRhc2tncm91cCA9IHRhc2tkYXRhLT50ZF90YXNrZ3JvdXA7CisgICAgaW50IHRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZW50ZXIpOiBUIyVkIGxvYz0lcFxuIiwgZ3RpZCwgbG9jKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cCAhPSBOVUxMICk7CisgICAgS01QX1NFVF9USFJFQURfU1RBVEVfQkxPQ0soVEFTS0dST1VQKTsKKworICAgIGlmICggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKSB7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAvLyBGb3IgSVRUIHRoZSB0YXNrZ3JvdXAgd2FpdCBpcyBzaW1pbGFyIHRvIHRhc2t3YWl0IHVudGlsIHdlIG5lZWQgdG8gZGlzdGluZ3Vpc2ggdGhlbQorICAgICAgICB2b2lkICogaXR0X3N5bmNfb2JqID0gX19rbXBfaXR0X3Rhc2t3YWl0X29iamVjdCggZ3RpZCApOworICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkKKyAgICAgICAgICAgIF9fa21wX2l0dF90YXNrd2FpdF9zdGFydGluZyggZ3RpZCwgaXR0X3N5bmNfb2JqICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgaWYgKCAhIHRhc2tkYXRhLT50ZF9mbGFncy50ZWFtX3NlcmlhbCB8fCAodGhyZWFkLT50aC50aF90YXNrX3RlYW0gIT0gTlVMTCAmJiB0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MpICkKKyNlbHNlCisgICAgICAgIGlmICggISB0YXNrZGF0YS0+dGRfZmxhZ3MudGVhbV9zZXJpYWwgKQorI2VuZGlmCisgICAgICAgIHsKKyAgICAgICAgICAgIGttcF9mbGFnXzMyIGZsYWcoJih0YXNrZ3JvdXAtPmNvdW50KSwgMFUpOworICAgICAgICAgICAgd2hpbGUgKCBUQ1JfNCh0YXNrZ3JvdXAtPmNvdW50KSAhPSAwICkgeworICAgICAgICAgICAgICAgIGZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIEZBTFNFLCAmdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIF9fa21wX3Rhc2tfc3RlYWxpbmdfY29uc3RyYWludCApOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggaXR0X3N5bmNfb2JqICE9IE5VTEwgKQorICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2t3YWl0X2ZpbmlzaGVkKCBndGlkLCBpdHRfc3luY19vYmogKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tncm91cC0+Y291bnQgPT0gMCApOworCisgICAgLy8gUmVzdG9yZSBwYXJlbnQgdGFza2dyb3VwIGZvciB0aGUgY3VycmVudCB0YXNrCisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHRhc2tncm91cC0+cGFyZW50OworICAgIF9fa21wX3RocmVhZF9mcmVlKCB0aHJlYWQsIHRhc2tncm91cCApOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBjX2VuZF90YXNrZ3JvdXAoZXhpdCk6IFQjJWQgdGFzayAlcCBmaW5pc2hlZCB3YWl0aW5nXG4iLCBndGlkLCB0YXNrZGF0YSkgKTsKK30KKyNlbmRpZgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZW1vdmVfbXlfdGFzazogcmVtb3ZlIGEgdGFzayBmcm9tIG15IG93biBkZXF1ZQorCitzdGF0aWMga21wX3Rhc2tfdCAqCitfX2ttcF9yZW1vdmVfbXlfdGFzaygga21wX2luZm9fdCAqIHRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGE7CisgICAga21wX3VpbnQzMiB0YWlsOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgLy8gQ2FsbGVyIHNob3VsZCBjaGVjayB0aGlzIGNvbmRpdGlvbgorCisgICAgICAgIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyBfX2ttcF90aWRfZnJvbV9ndGlkKCBndGlkICkgXTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGVudGVyKTogVCMlZCBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMSk6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9udGFza3MsIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9oZWFkLAorICAgICAgICAgICAgICAgICAgICAgIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV90YWlsKSApOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgIGlmIChUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3JlbW92ZV9teV90YXNrKGV4aXQgIzIpOiBUIyVkIE5vIHRhc2tzIHRvIHJlbW92ZTogbnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgdGFpbCA9ICggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCAtIDEgKSAmIFRBU0tfREVRVUVfTUFTSyh0aHJlYWRfZGF0YS0+dGQpOyAgLy8gV3JhcCBpbmRleC4KKyAgICB0YXNrZGF0YSA9IHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0YWlsIF07CisKKyAgICBpZiAoaXNfY29uc3RyYWluZWQgJiYgKHRhc2tkYXRhLT50ZF9mbGFncy50aWVkbmVzcyA9PSBUQVNLX1RJRUQpKSB7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBvYmV5cyB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludDoKKyAgICAgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnQgPSB0aHJlYWQtPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAga21wX2ludDMyICAgICAgICBsZXZlbCA9IGN1cnJlbnQtPnRkX2xldmVsOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIHdoaWxlICggcGFyZW50ICE9IGN1cnJlbnQgJiYgcGFyZW50LT50ZF9sZXZlbCA+IGxldmVsICkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7ICAvLyBjaGVjayBnZW5lcmF0aW9uIHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgY3VycmVudCB0YXNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCAhPSBjdXJyZW50ICkgeworICAgICAgICAgICAgLy8gSWYgdGhlIHRhaWwgdGFzayBpcyBub3QgYSBjaGlsZCwgdGhlbiBubyBvdGhlciBjaGlsZCBjYW4gYXBwZWFyIGluIHRoZSBkZXF1ZS4KKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcmVtb3ZlX215X3Rhc2soZXhpdCAjMik6IFQjJWQgTm8gdGFza3MgdG8gcmVtb3ZlOiBudGFza3M9JWQgaGVhZD0ldSB0YWlsPSV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfbnRhc2tzLCB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfaGVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorICAgIH0KKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSB0YWlsOworICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzIC0gMSk7CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRocmVhZF9kYXRhLT50ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9yZW1vdmVfbXlfdGFzayhleGl0ICMyKTogVCMlZCB0YXNrICVwIHJlbW92ZWQ6IG50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX250YXNrcywgdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyggdGFza2RhdGEgKTsKKyAgICByZXR1cm4gdGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9zdGVhbF90YXNrOiByZW1vdmUgYSB0YXNrIGZyb20gYW5vdGhlciB0aHJlYWQncyBkZXF1ZQorLy8gQXNzdW1lIHRoYXQgY2FsbGluZyB0aHJlYWQgaGFzIGFscmVhZHkgY2hlY2tlZCBleGlzdGVuY2Ugb2YKKy8vIHRhc2tfdGVhbSB0aHJlYWRfZGF0YSBiZWZvcmUgY2FsbGluZyB0aGlzIHJvdXRpbmUuCisKK3N0YXRpYyBrbXBfdGFza190ICoKK19fa21wX3N0ZWFsX3Rhc2soIGttcF9pbmZvX3QgKnZpY3RpbSwga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqdW5maW5pc2hlZF90aHJlYWRzLCBpbnQgKnRocmVhZF9maW5pc2hlZCwKKyAgICAgICAgICAgICAgICAgIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCApCit7CisgICAga21wX3Rhc2tfdCAqIHRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdmljdGltX3RkLCAqdGhyZWFkc19kYXRhOworICAgIGttcF9pbnQzMiB2aWN0aW1fdGlkOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggX19rbXBfdGFza2luZ19tb2RlICE9IHRza21faW1tZWRpYXRlX2V4ZWMgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGE7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsgIC8vIENhbGxlciBzaG91bGQgY2hlY2sgdGhpcyBjb25kaXRpb24KKworICAgIHZpY3RpbV90aWQgPSB2aWN0aW0tPnRoLnRoX2luZm8uZHMuZHNfdGlkOworICAgIHZpY3RpbV90ZCA9ICYgdGhyZWFkc19kYXRhWyB2aWN0aW1fdGlkIF07CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGVudGVyKTogVCMlZCB0cnkgdG8gc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgbnRhc2tzPSVkICIKKyAgICAgICAgICAgICAgICAgICJoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfaGVhZCwgdmljdGltX3RkLT50ZC50ZF9kZXF1ZV90YWlsKSApOworCisgICAgaWYgKCAoVENSXzQodmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX250YXNrcykgPT0gMCkgfHwgLy8gQ2FsbGVyIHNob3VsZCBub3QgY2hlY2sgdGhpcyBjb25kaXRpb24KKyAgICAgICAgIChUQ1JfUFRSKHZpY3RpbS0+dGgudGhfdGFza190ZWFtKSAhPSB0YXNrX3RlYW0pKSAvLyBHRUg6IHdoeSB3b3VsZCB0aGlzIGhhcHBlbj8KKyAgICB7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMSk6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgLy8gQ2hlY2sgYWdhaW4gYWZ0ZXIgd2UgYWNxdWlyZSB0aGUgbG9jaworICAgIGlmICggKFRDUl80KHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDApIHx8CisgICAgICAgICAoVENSX1BUUih2aWN0aW0tPnRoLnRoX3Rhc2tfdGVhbSkgIT0gdGFza190ZWFtKSkgLy8gR0VIOiB3aHkgd291bGQgdGhpcyBoYXBwZW4/CisgICAgeworICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3N0ZWFsX3Rhc2soZXhpdCAjMik6IFQjJWQgY291bGQgbm90IHN0ZWFsIGZyb20gVCMlZDogdGFza190ZWFtPSVwICIKKyAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICBndGlkLCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB2aWN0aW0gKSwgdGFza190ZWFtLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX250YXNrcywKKyAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgcmV0dXJuIE5VTEw7CisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKTsKKworICAgIGlmICggIWlzX2NvbnN0cmFpbmVkICkgeworICAgICAgICB0YXNrZGF0YSA9IHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZVsgdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgXTsKKyAgICAgICAgS01QX0FTU0VSVCh0YXNrZGF0YSk7CisgICAgICAgIC8vIEJ1bXAgaGVhZCBwb2ludGVyIGFuZCBXcmFwLgorICAgICAgICB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfaGVhZCA9ICggdmljdGltX3RkIC0+IHRkLnRkX2RlcXVlX2hlYWQgKyAxICkgJiBUQVNLX0RFUVVFX01BU0sodmljdGltX3RkLT50ZCk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gV2hpbGUgd2UgaGF2ZSBwb3N0cG9uZWQgdGFza3MgbGV0J3Mgc3RlYWwgZnJvbSB0YWlsIG9mIHRoZSBkZXF1ZSAoc21hbGxlciB0YXNrcykKKyAgICAgICAga21wX2ludDMyIHRhaWwgPSAoIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV90YWlsIC0gMSApICYgVEFTS19ERVFVRV9NQVNLKHZpY3RpbV90ZC0+dGQpOyAgLy8gV3JhcCBpbmRleC4KKyAgICAgICAgdGFza2RhdGEgPSB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVbIHRhaWwgXTsKKyAgICAgICAgS01QX0FTU0VSVCh0YXNrZGF0YSk7CisgICAgICAgIC8vIHdlIG5lZWQgdG8gY2hlY2sgaWYgdGhlIGNhbmRpZGF0ZSBvYmV5cyB0YXNrIHNjaGVkdWxpbmcgY29uc3RyYWludDoKKyAgICAgICAgLy8gb25seSBjaGlsZCBvZiBjdXJyZW50IHRhc2sgY2FuIGJlIHNjaGVkdWxlZAorICAgICAgICBrbXBfdGFza2RhdGFfdCAqIGN1cnJlbnQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICAgICAga21wX2ludDMyICAgICAgICBsZXZlbCA9IGN1cnJlbnQtPnRkX2xldmVsOworICAgICAgICBrbXBfdGFza2RhdGFfdCAqIHBhcmVudCA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgIHdoaWxlICggcGFyZW50ICE9IGN1cnJlbnQgJiYgcGFyZW50LT50ZF9sZXZlbCA+IGxldmVsICkgeworICAgICAgICAgICAgcGFyZW50ID0gcGFyZW50LT50ZF9wYXJlbnQ7ICAvLyBjaGVjayBnZW5lcmF0aW9uIHVwIHRvIHRoZSBsZXZlbCBvZiB0aGUgY3VycmVudCB0YXNrCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHBhcmVudCAhPSBOVUxMKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIHBhcmVudCAhPSBjdXJyZW50ICYmICh0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPT0gVEFTS19USUVEKSApIHsgLy8gdW50aWVkIGlzIGFsd2F5cyBhbGxvd2VkIHRvIGJlIHN0b2xlbgorICAgICAgICAgICAgLy8gSWYgdGhlIHRhaWwgdGFzayBpcyBub3QgYSBjaGlsZCwgdGhlbiBubyBvdGhlciBjaGlsZHMgY2FuIGFwcGVhciBpbiB0aGUgZGVxdWUgKD8pLgorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworICAgICAgICAgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfc3RlYWxfdGFzayhleGl0ICMyKTogVCMlZCBjb3VsZCBub3Qgc3RlYWwgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAibnRhc2tzPSVkIGhlYWQ9JXUgdGFpbD0ldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkc19kYXRhW3ZpY3RpbV90aWRdLnRkLnRkX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3RlYW0sIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfdGFpbCkgKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgICAgIHZpY3RpbV90ZCAtPiB0ZC50ZF9kZXF1ZV90YWlsID0gdGFpbDsKKyAgICB9CisgICAgaWYgKCp0aHJlYWRfZmluaXNoZWQpIHsKKyAgICAgICAgLy8gV2UgbmVlZCB0byB1bi1tYXJrIHRoaXMgdmljdGltIGFzIGEgZmluaXNoZWQgdmljdGltLiAgVGhpcyBtdXN0IGJlIGRvbmUgYmVmb3JlCisgICAgICAgIC8vIHJlbGVhc2luZyB0aGUgbG9jaywgb3IgZWxzZSBvdGhlciB0aHJlYWRzIChzdGFydGluZyB3aXRoIHRoZSBtYXN0ZXIgdmljdGltKQorICAgICAgICAvLyBtaWdodCBiZSBwcmVtYXR1cmVseSByZWxlYXNlZCBmcm9tIHRoZSBiYXJyaWVyISEhCisgICAgICAgIGttcF91aW50MzIgY291bnQ7CisKKyAgICAgICAgY291bnQgPSBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopdW5maW5pc2hlZF90aHJlYWRzICk7CisKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfc3RlYWxfdGFzazogVCMlZCBpbmMgdW5maW5pc2hlZF90aHJlYWRzIHRvICVkOiB0YXNrX3RlYW09JXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgY291bnQgKyAxLCB0YXNrX3RlYW0pICk7CisKKyAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IEZBTFNFOworICAgIH0KKyAgICBUQ1dfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzLCBUQ1JfNCh2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSAtIDEpOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiB2aWN0aW1fdGQgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisgICAgS01QX0NPVU5UX0JMT0NLKFRBU0tfc3RvbGVuKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9zdGVhbF90YXNrKGV4aXQgIzMpOiBUIyVkIHN0b2xlIHRhc2sgJXAgZnJvbSBUIyVkOiB0YXNrX3RlYW09JXAgIgorICAgICAgICAgICAgICAgICAgIm50YXNrcz0lZCBoZWFkPSV1IHRhaWw9JXVcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCB0YXNrZGF0YSwgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdmljdGltICksIHRhc2tfdGVhbSwKKyAgICAgICAgICAgICAgICAgIHZpY3RpbV90ZC0+dGQudGRfZGVxdWVfbnRhc2tzLCB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX2hlYWQsCisgICAgICAgICAgICAgICAgICB2aWN0aW1fdGQtPnRkLnRkX2RlcXVlX3RhaWwpICk7CisKKyAgICB0YXNrID0gS01QX1RBU0tEQVRBX1RPX1RBU0soIHRhc2tkYXRhICk7CisgICAgcmV0dXJuIHRhc2s7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogQ2hvb3NlIGFuZCBleGVjdXRlIHRhc2tzIHVudGlsIGVpdGhlciB0aGUgY29uZGl0aW9uCisvLyBpcyBzdGF0aXNmaWVkIChyZXR1cm4gdHJ1ZSkgb3IgdGhlcmUgYXJlIG5vbmUgbGVmdCAocmV0dXJuIGZhbHNlKS4KKy8vIGZpbmFsX3NwaW4gaXMgVFJVRSBpZiB0aGlzIGlzIHRoZSBzcGluIGF0IHRoZSByZWxlYXNlIGJhcnJpZXIuCisvLyB0aHJlYWRfZmluaXNoZWQgaW5kaWNhdGVzIHdoZXRoZXIgdGhlIHRocmVhZCBpcyBmaW5pc2hlZCBleGVjdXRpbmcgYWxsCisvLyB0aGUgdGFza3MgaXQgaGFzIG9uIGl0cyBkZXF1ZSwgYW5kIGlzIGF0IHRoZSByZWxlYXNlIGJhcnJpZXIuCisvLyBzcGlubmVyIGlzIHRoZSBsb2NhdGlvbiBvbiB3aGljaCB0byBzcGluLgorLy8gc3Bpbm5lciA9PSBOVUxMIG1lYW5zIG9ubHkgZXhlY3V0ZSBhIHNpbmdsZSB0YXNrIGFuZCByZXR1cm4uCisvLyBjaGVja2VyIGlzIHRoZSB2YWx1ZSB0byBjaGVjayB0byB0ZXJtaW5hdGUgdGhlIHNwaW4uCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgaW50IF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoa21wX2luZm9fdCAqdGhyZWFkLCBrbXBfaW50MzIgZ3RpZCwgQyAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpCit7CisgICAga21wX3Rhc2tfdGVhbV90ICogICAgIHRhc2tfdGVhbSA9IHRocmVhZC0+dGgudGhfdGFza190ZWFtOworICAgIGttcF90aHJlYWRfZGF0YV90ICogICB0aHJlYWRzX2RhdGE7CisgICAga21wX3Rhc2tfdCAqICAgICAgICAgIHRhc2s7CisgICAga21wX2luZm9fdCAqICAgICAgICAgIG90aGVyX3RocmVhZDsKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgICAgY3VycmVudF90YXNrID0gdGhyZWFkIC0+IHRoLnRoX2N1cnJlbnRfdGFzazsKKyAgICB2b2xhdGlsZSBrbXBfdWludDMyICogdW5maW5pc2hlZF90aHJlYWRzOworICAgIGttcF9pbnQzMiAgICAgICAgICAgICBudGhyZWFkcywgdmljdGltPS0yLCB1c2Vfb3duX3Rhc2tzPTEsIG5ld192aWN0aW09MCwgdGlkPXRocmVhZC0+dGgudGhfaW5mby5kcy5kc190aWQ7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRocmVhZCA9PSBfX2ttcF90aHJlYWRzWyBndGlkIF0gKTsKKworICAgIGlmICh0YXNrX3RlYW0gPT0gTlVMTCkgcmV0dXJuIEZBTFNFOworCisgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZShlbnRlcik6IFQjJWQgZmluYWxfc3Bpbj0lZCAqdGhyZWFkX2ZpbmlzaGVkPSVkXG4iLAorICAgICAgICAgICAgICAgICAgZ3RpZCwgZmluYWxfc3BpbiwgKnRocmVhZF9maW5pc2hlZCkgKTsKKworICAgIHRocmVhZHNfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKVRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtIC0+IHR0LnR0X25wcm9jOworICAgIHVuZmluaXNoZWRfdGhyZWFkcyA9ICYodGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyk7CisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBudGhyZWFkcyA+IDEgfHwgdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcyk7CisjZWxzZQorICAgIEtNUF9ERUJVR19BU1NFUlQoIG50aHJlYWRzID4gMSApOworI2VuZGlmCisgICAgS01QX0RFQlVHX0FTU0VSVCggKGludCkoVENSXzQoKnVuZmluaXNoZWRfdGhyZWFkcykpID49IDAgKTsKKworICAgIHdoaWxlICgxKSB7IC8vIE91dGVyIGxvb3Aga2VlcHMgdHJ5aW5nIHRvIGZpbmQgdGFza3MgaW4gY2FzZSBvZiBzaW5nbGUgdGhyZWFkIGdldHRpbmcgdGFza3MgZnJvbSB0YXJnZXQgY29uc3RydWN0cworICAgICAgICB3aGlsZSAoMSkgeyAvLyBJbm5lciBsb29wIHRvIGZpbmQgYSB0YXNrIGFuZCBleGVjdXRlIGl0CisgICAgICAgICAgICB0YXNrID0gTlVMTDsKKyAgICAgICAgICAgIGlmICh1c2Vfb3duX3Rhc2tzKSB7IC8vIGNoZWNrIG9uIG93biBxdWV1ZSBmaXJzdAorICAgICAgICAgICAgICAgIHRhc2sgPSBfX2ttcF9yZW1vdmVfbXlfdGFzayggdGhyZWFkLCBndGlkLCB0YXNrX3RlYW0sIGlzX2NvbnN0cmFpbmVkICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBpZiAoKHRhc2sgPT0gTlVMTCkgJiYgKG50aHJlYWRzID4gMSkpIHsgLy8gU3RlYWwgYSB0YXNrCisgICAgICAgICAgICAgICAgaW50IGFzbGVlcCA9IDE7CisgICAgICAgICAgICAgICAgdXNlX293bl90YXNrcyA9IDA7CisgICAgICAgICAgICAgICAgLy8gVHJ5IHRvIHN0ZWFsIGZyb20gdGhlIGxhc3QgcGxhY2UgSSBzdG9sZSBmcm9tIHN1Y2Nlc3NmdWxseS4KKyAgICAgICAgICAgICAgICBpZiAodmljdGltID09IC0yKSB7IC8vIGhhdmVuJ3Qgc3RvbGVuIGFueXRoaW5nIHlldAorICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSB0aHJlYWRzX2RhdGFbdGlkXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKHZpY3RpbSAhPSAtMSkgLy8gaWYgd2UgaGF2ZSBhIGxhc3Qgc3RvbGVuIGZyb20gdmljdGltLCBnZXQgdGhlIHRocmVhZAorICAgICAgICAgICAgICAgICAgICAgICAgb3RoZXJfdGhyZWFkID0gdGhyZWFkc19kYXRhW3ZpY3RpbV0udGQudGRfdGhyOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodmljdGltICE9IC0xKSB7IC8vIGZvdW5kIGxhc3QgdmljdGltCisgICAgICAgICAgICAgICAgICAgIGFzbGVlcCA9IDA7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgaWYgKCFuZXdfdmljdGltKSB7IC8vIG5vIHJlY2VudCBzdGVhbHMgYW5kIHdlIGhhdmVuJ3QgYWxyZWFkeSB1c2VkIGEgbmV3IHZpY3RpbTsgc2VsZWN0IGEgcmFuZG9tIHRocmVhZAorICAgICAgICAgICAgICAgICAgICBkbyB7IC8vIEZpbmQgYSBkaWZmZXJlbnQgdGhyZWFkIHRvIHN0ZWFsIHdvcmsgZnJvbS4KKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFBpY2sgYSByYW5kb20gdGhyZWFkLiBJbml0aWFsIHBsYW4gd2FzIHRvIGN5Y2xlIHRocm91Z2ggYWxsIHRoZSB0aHJlYWRzLCBhbmQgb25seSByZXR1cm4gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHdlIHRyaWVkIHRvIHN0ZWFsIGZyb20gZXZlcnkgdGhyZWFkLCBhbmQgZmFpbGVkLiAgQXJjaCBzYXlzIHRoYXQncyBub3Qgc3VjaCBhIGdyZWF0IGlkZWEuCisgICAgICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSBfX2ttcF9nZXRfcmFuZG9tKHRocmVhZCkgJSAobnRocmVhZHMgLSAxKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICh2aWN0aW0gPj0gdGlkKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKyt2aWN0aW07ICAvLyBBZGp1c3RzIHJhbmRvbSBkaXN0cmlidXRpb24gdG8gZXhjbHVkZSBzZWxmCisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBGb3VuZCBhIHBvdGVudGlhbCB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgICAgIG90aGVyX3RocmVhZCA9IHRocmVhZHNfZGF0YVt2aWN0aW1dLnRkLnRkX3RocjsKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRoZXJlIGlzIGEgc2xpZ2h0IGNoYW5jZSB0aGF0IF9fa21wX2VuYWJsZV90YXNraW5nKCkgZGlkIG5vdCB3YWtlIHVwIGFsbCB0aHJlYWRzCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB3YWl0aW5nIGF0IHRoZSBiYXJyaWVyLiAgSWYgdmljdGltIGlzIHNsZWVwaW5nLCB0aGVuIHdha2UgaXQgdXAuICBTaW5jZSB3ZSB3ZXJlIGdvaW5nIHRvCisgICAgICAgICAgICAgICAgICAgICAgICAvLyBwYXkgdGhlIGNhY2hlIG1pc3MgcGVuYWx0eSBmb3IgcmVmZXJlbmNpbmcgYW5vdGhlciB0aHJlYWQncyBrbXBfaW5mb190IHN0cnVjdCBhbnl3YXksCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGUgY2hlY2sgc2hvdWxkbid0IGNvc3QgdG9vIG11Y2ggcGVyZm9ybWFuY2UgYXQgdGhpcyBwb2ludC4gSW4gZXh0cmEgYmFycmllciBtb2RlLCB0YXNrcworICAgICAgICAgICAgICAgICAgICAgICAgLy8gZG8gbm90IHNsZWVwIGF0IHRoZSBzZXBhcmF0ZSB0YXNraW5nIGJhcnJpZXIsIHNvIHRoaXMgaXNuJ3QgYSBwcm9ibGVtLgorICAgICAgICAgICAgICAgICAgICAgICAgYXNsZWVwID0gMDsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV90YXNrX3RlYW1zICkgJiYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FKSAmJgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoVENSX1BUUihvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYykgIT0gTlVMTCkpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBhc2xlZXAgPSAxOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIoX19rbXBfZ3RpZF9mcm9tX3RocmVhZChvdGhlcl90aHJlYWQpLCBvdGhlcl90aHJlYWQtPnRoLnRoX3NsZWVwX2xvYyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLy8gQSBzbGVlcGluZyB0aHJlYWQgc2hvdWxkIG5vdCBoYXZlIGFueSB0YXNrcyBvbiBpdCdzIHF1ZXVlLiBUaGVyZSBpcyBhIHNsaWdodAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHBvc3NpYmlsaXR5IHRoYXQgaXQgcmVzdW1lcywgc3RlYWxzIGEgdGFzayBmcm9tIGFub3RoZXIgdGhyZWFkLCB3aGljaCBzcGF3bnMgbW9yZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIHRhc2tzLCBhbGwgaW4gdGhlIHRpbWUgdGhhdCBpdCB0YWtlcyB0aGlzIHRocmVhZCB0byBjaGVjayA9PiBkb24ndCB3cml0ZSBhbiBhc3NlcnRpb24KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyB0aGF0IHRoZSB2aWN0aW0ncyBxdWV1ZSBpcyBlbXB0eS4gIFRyeSBzdGVhbGluZyBmcm9tIGEgZGlmZmVyZW50IHRocmVhZC4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfSB3aGlsZSAoYXNsZWVwKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICBpZiAoIWFzbGVlcCkgeworICAgICAgICAgICAgICAgICAgICAvLyBXZSBoYXZlIGEgdmljdGltIHRvIHRyeSB0byBzdGVhbCBmcm9tCisgICAgICAgICAgICAgICAgICAgIHRhc2sgPSBfX2ttcF9zdGVhbF90YXNrKG90aGVyX3RocmVhZCwgZ3RpZCwgdGFza190ZWFtLCB1bmZpbmlzaGVkX3RocmVhZHMsIHRocmVhZF9maW5pc2hlZCwgaXNfY29uc3RyYWluZWQpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBpZiAodGFzayAhPSBOVUxMKSB7IC8vIHNldCBsYXN0IHN0b2xlbiB0byB2aWN0aW0KKyAgICAgICAgICAgICAgICAgICAgaWYgKHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuICE9IHZpY3RpbSkgeworICAgICAgICAgICAgICAgICAgICAgICAgdGhyZWFkc19kYXRhW3RpZF0udGQudGRfZGVxdWVfbGFzdF9zdG9sZW4gPSB2aWN0aW07CisgICAgICAgICAgICAgICAgICAgICAgICAvLyBUaGUgcHJlLXJlZmFjdG9yZWQgY29kZSBkaWQgbm90IHRyeSBtb3JlIHRoYW4gMSBzdWNjZXNzZnVsIG5ldyB2aWNpdG0sCisgICAgICAgICAgICAgICAgICAgICAgICAvLyB1bmxlc3MgdGhlIGxhc3Qgb25lIGdlbmVyYXRlZCBtb3JlIGxvY2FsIHRhc2tzOyBuZXdfdmljdGltIGtlZXBzIHRyYWNrIG9mIHRoaXMKKyAgICAgICAgICAgICAgICAgICAgICAgIG5ld192aWN0aW0gPSAxOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeyAvLyBObyB0YXNrcyBmb3VuZDsgdW5zZXQgbGFzdF9zdG9sZW4KKyAgICAgICAgICAgICAgICAgICAgS01QX0NIRUNLX1VQREFURSh0aHJlYWRzX2RhdGFbdGlkXS50ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiwgLTEpOworICAgICAgICAgICAgICAgICAgICB2aWN0aW0gPSAtMjsgLy8gbm8gc3VjY2Vzc2Z1bCB2aWN0aW0gZm91bmQKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmICh0YXNrID09IE5VTEwpIC8vIGJyZWFrIG91dCBvZiB0YXNraW5nIGxvb3AKKyAgICAgICAgICAgICAgICBicmVhazsKKworICAgICAgICAgICAgLy8gRm91bmQgYSB0YXNrOyBleGVjdXRlIGl0CisjaWYgVVNFX0lUVF9CVUlMRCAmJiBVU0VfSVRUX05PVElGWQorICAgICAgICAgICAgaWYgKCBfX2l0dF9zeW5jX2NyZWF0ZV9wdHIgfHwgS01QX0lUVF9ERUJVRyApIHsKKyAgICAgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiA9PSBOVUxMICkgeyAvLyB3ZSBhcmUgYXQgZm9yayBiYXJyaWVyIHdoZXJlIHdlIGNvdWxkIG5vdCBnZXQgdGhlIG9iamVjdCByZWxpYWJseQorICAgICAgICAgICAgICAgICAgICBpdHRfc3luY19vYmogPSBfX2ttcF9pdHRfYmFycmllcl9vYmplY3QoIGd0aWQsIGJzX2Zvcmtqb2luX2JhcnJpZXIgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfaXR0X3Rhc2tfc3RhcnRpbmcoIGl0dF9zeW5jX29iaiApOworICAgICAgICAgICAgfQorI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgJiYgVVNFX0lUVF9OT1RJRlkgKi8KKyAgICAgICAgICAgIF9fa21wX2ludm9rZV90YXNrKCBndGlkLCB0YXNrLCBjdXJyZW50X3Rhc2sgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICBpZiAoIGl0dF9zeW5jX29iaiAhPSBOVUxMICkgX19rbXBfaXR0X3Rhc2tfZmluaXNoZWQoIGl0dF9zeW5jX29iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgIC8vIElmIHRoaXMgdGhyZWFkIGlzIG9ubHkgcGFydHdheSB0aHJvdWdoIHRoZSBiYXJyaWVyIGFuZCB0aGUgY29uZGl0aW9uIGlzIG1ldCwgdGhlbiByZXR1cm4gbm93LAorICAgICAgICAgICAgLy8gc28gdGhhdCB0aGUgYmFycmllciBnYXRoZXIvcmVsZWFzZSBwYXR0ZXJuIGNhbiBwcm9jZWVkLiBJZiB0aGlzIHRocmVhZCBpcyBpbiB0aGUgbGFzdCBzcGluIGxvb3AKKyAgICAgICAgICAgIC8vIGluIHRoZSBiYXJyaWVyLCB3YWl0aW5nIHRvIGJlIHJlbGVhc2VkLCB3ZSBrbm93IHRoYXQgdGhlIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiB3aWxsIG5vdCBiZQorICAgICAgICAgICAgLy8gc2F0aXNpZmllZCwgc28gZG9uJ3Qgd2FzdGUgYW55IGN5Y2xlcyBjaGVja2luZyBpdC4KKyAgICAgICAgICAgIGlmIChmbGFnID09IE5VTEwgfHwgKCFmaW5hbF9zcGluICYmIGZsYWctPmRvbmVfY2hlY2soKSkpIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxNSwgKCJfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlOiBUIyVkIHNwaW4gY29uZGl0aW9uIHNhdGlzZmllZFxuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gVFJVRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmICh0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLTVBfWUlFTEQoIF9fa21wX2xpYnJhcnkgPT0gbGlicmFyeV90aHJvdWdocHV0ICk7ICAgLy8gWWllbGQgYmVmb3JlIGV4ZWN1dGluZyBuZXh0IHRhc2sKKyAgICAgICAgICAgIC8vIElmIGV4ZWN1dGlvbiBvZiBhIHN0b2xlbiB0YXNrIHJlc3VsdHMgaW4gbW9yZSB0YXNrcyBiZWluZyBwbGFjZWQgb24gb3VyIHJ1biBxdWV1ZSwgcmVzZXQgdXNlX293bl90YXNrcworICAgICAgICAgICAgaWYgKCF1c2Vfb3duX3Rhc2tzICYmIFRDUl80KHRocmVhZHNfZGF0YVt0aWRdLnRkLnRkX2RlcXVlX250YXNrcykgIT0gMCkgeworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgc3RvbGVuIHRhc2sgc3Bhd25lZCBvdGhlciB0YXNrcywgcmVzdGFydFxuIiwgZ3RpZCkpOworICAgICAgICAgICAgICAgIHVzZV9vd25fdGFza3MgPSAxOworICAgICAgICAgICAgICAgIG5ld192aWN0aW0gPSAwOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgLy8gVGhlIHRhc2sgc291cmNlIGhhcyBiZWVuIGV4aGF1c3RlZC4gSWYgaW4gZmluYWwgc3BpbiBsb29wIG9mIGJhcnJpZXIsIGNoZWNrIGlmIHRlcm1pbmF0aW9uIGNvbmRpdGlvbiBpcyBzYXRpc2ZpZWQuCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgLy8gVGhlIHdvcmsgcXVldWUgbWF5IGJlIGVtcHR5IGJ1dCB0aGVyZSBtaWdodCBiZSBwcm94eSB0YXNrcyBzdGlsbCBleGVjdXRpbmcKKyAgICAgICAgaWYgKGZpbmFsX3NwaW4gJiYgVENSXzQoY3VycmVudF90YXNrLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA9PSAwKQorI2Vsc2UKKyAgICAgICAgaWYgKGZpbmFsX3NwaW4pCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgLy8gRmlyc3QsIGRlY3JlbWVudCB0aGUgI3VuZmluaXNoZWQgdGhyZWFkcywgaWYgdGhhdCBoYXMgbm90IGFscmVhZHkgYmVlbiBkb25lLiAgVGhpcyBkZWNyZW1lbnQKKyAgICAgICAgICAgIC8vIG1pZ2h0IGJlIHRvIHRoZSBzcGluIGxvY2F0aW9uLCBhbmQgcmVzdWx0IGluIHRoZSB0ZXJtaW5hdGlvbiBjb25kaXRpb24gYmVpbmcgc2F0aXNmaWVkLgorICAgICAgICAgICAgaWYgKCEgKnRocmVhZF9maW5pc2hlZCkgeworICAgICAgICAgICAgICAgIGttcF91aW50MzIgY291bnQ7CisKKyAgICAgICAgICAgICAgICBjb3VudCA9IEtNUF9URVNUX1RIRU5fREVDMzIoIChrbXBfaW50MzIgKil1bmZpbmlzaGVkX3RocmVhZHMgKSAtIDE7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBkZWMgdW5maW5pc2hlZF90aHJlYWRzIHRvICVkIHRhc2tfdGVhbT0lcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGNvdW50LCB0YXNrX3RlYW0pICk7CisgICAgICAgICAgICAgICAgKnRocmVhZF9maW5pc2hlZCA9IFRSVUU7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8vIEl0IGlzIG5vdyB1bnNhZmUgdG8gcmVmZXJlbmNlIHRocmVhZC0+dGgudGhfdGVhbSAhISEKKyAgICAgICAgICAgIC8vIERlY3JlbWVudGluZyB0YXNrX3RlYW0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcyBjYW4gYWxsb3cgdGhlIG1hc3RlciB0aHJlYWQgdG8gcGFzcyB0aHJvdWdoCisgICAgICAgICAgICAvLyB0aGUgYmFycmllciwgd2hlcmUgaXQgbWlnaHQgcmVzZXQgZWFjaCB0aHJlYWQncyB0aC50aF90ZWFtIGZpZWxkIGZvciB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24uCisgICAgICAgICAgICAvLyBJZiB3ZSBjYW4gc3RlYWwgbW9yZSB3b3JrLCB3ZSBrbm93IHRoYXQgdGhpcyBoYXMgbm90IGhhcHBlbmVkIHlldC4KKyAgICAgICAgICAgIGlmIChmbGFnICE9IE5VTEwgJiYgZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBzcGluIGNvbmRpdGlvbiBzYXRpc2ZpZWRcbiIsIGd0aWQpICk7CisgICAgICAgICAgICAgICAgcmV0dXJuIFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvLyBJZiB0aGlzIHRocmVhZCdzIHRhc2sgdGVhbSBpcyBOVUxMLCBtYXN0ZXIgaGFzIHJlY29nbml6ZWQgdGhhdCB0aGVyZSBhcmUgbm8gbW9yZSB0YXNrczsgYmFpbCBvdXQKKyAgICAgICAgaWYgKHRocmVhZC0+dGgudGhfdGFza190ZWFtID09IE5VTEwpIHsKKyAgICAgICAgICAgIEtBX1RSQUNFKDE1LCAoIl9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGU6IFQjJWQgbm8gbW9yZSB0YXNrc1xuIiwgZ3RpZCkgKTsKKyAgICAgICAgICAgIHJldHVybiBGQUxTRTsKKyAgICAgICAgfQorCisjaWYgT01QXzQ1X0VOQUJMRUQKKyAgICAgICAgLy8gV2UgY291bGQgYmUgZ2V0dGluZyB0YXNrcyBmcm9tIHRhcmdldCBjb25zdHJ1Y3RzOyBpZiB0aGlzIGlzIHRoZSBvbmx5IHRocmVhZCwga2VlcCB0cnlpbmcgdG8gZXhlY3V0ZQorICAgICAgICAvLyB0YXNrcyBmcm9tIG93biBxdWV1ZQorICAgICAgICBpZiAobnRocmVhZHMgPT0gMSkKKyAgICAgICAgICAgIHVzZV9vd25fdGFza3MgPSAxOworICAgICAgICBlbHNlCisjZW5kaWYKKyAgICAgICAgeworICAgICAgICAgICAgS0FfVFJBQ0UoMTUsICgiX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZTogVCMlZCBjYW4ndCBmaW5kIHdvcmtcbiIsIGd0aWQpICk7CisgICAgICAgICAgICByZXR1cm4gRkFMU0U7CisgICAgICAgIH0KKyAgICB9Cit9CisKK2ludCBfX2ttcF9leGVjdXRlX3Rhc2tzXzMyKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnXzMyICpmbGFnLCBpbnQgZmluYWxfc3BpbiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCitpbnQgX19rbXBfZXhlY3V0ZV90YXNrc182NChrbXBfaW5mb190ICp0aHJlYWQsIGttcF9pbnQzMiBndGlkLCBrbXBfZmxhZ182NCAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkKK3sKKyAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc190ZW1wbGF0ZSh0aHJlYWQsIGd0aWQsIGZsYWcsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKK30KKworaW50IF9fa21wX2V4ZWN1dGVfdGFza3Nfb25jb3JlKGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIGd0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZywgaW50IGZpbmFsX3NwaW4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKQoreworICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX3RlbXBsYXRlKHRocmVhZCwgZ3RpZCwgZmxhZywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSwgaXNfY29uc3RyYWluZWQpOworfQorCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZW5hYmxlX3Rhc2tpbmc6IEFsbG9jYXRlIHRhc2sgdGVhbSBhbmQgcmVzdW1lIHRocmVhZHMgc2xlZXBpbmcgYXQgdGhlCisvLyBuZXh0IGJhcnJpZXIgc28gdGhleSBjYW4gYXNzaXN0IGluIGV4ZWN1dGluZyBlbnF1ZXVlZCB0YXNrcy4KKy8vIEZpcnN0IHRocmVhZCBpbiBhbGxvY2F0ZXMgdGhlIHRhc2sgdGVhbSBhdG9taWNhbGx5LgorCitzdGF0aWMgdm9pZAorX19rbXBfZW5hYmxlX3Rhc2tpbmcoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtLCBrbXBfaW5mb190ICp0aGlzX3RociApCit7CisgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZHNfZGF0YTsKKyAgICBpbnQgbnRocmVhZHMsIGksIGlzX2luaXRfdGhyZWFkOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhlbnRlcik6IFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCh0YXNrX3RlYW0gIT0gTlVMTCk7CisgICAgS01QX0RFQlVHX0FTU0VSVCh0aGlzX3Roci0+dGgudGhfdGVhbSAhPSBOVUxMKTsKKworICAgIG50aHJlYWRzID0gdGFza190ZWFtLT50dC50dF9ucHJvYzsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG50aHJlYWRzID4gMCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudGhyZWFkcyA9PSB0aGlzX3Roci0+dGgudGhfdGVhbS0+dC50X25wcm9jKTsKKworICAgIC8vIEFsbG9jYXRlIG9yIGluY3JlYXNlIHRoZSBzaXplIG9mIHRocmVhZHNfZGF0YSBpZiBuZWNlc3NhcnkKKyAgICBpc19pbml0X3RocmVhZCA9IF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGEoIHRoaXNfdGhyLCB0YXNrX3RlYW0gKTsKKworICAgIGlmICghaXNfaW5pdF90aHJlYWQpIHsKKyAgICAgICAgLy8gU29tZSBvdGhlciB0aHJlYWQgYWxyZWFkeSBzZXQgdXAgdGhlIGFycmF5LgorICAgICAgICBLQV9UUkFDRSggMjAsICggIl9fa21wX2VuYWJsZV90YXNraW5nKGV4aXQpOiBUIyVkOiB0aHJlYWRzIGFycmF5IGFscmVhZHkgc2V0IHVwLlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICkgKSApOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRocmVhZHNfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKVRDUl9QVFIodGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkc19kYXRhICE9IE5VTEwgKTsKKworICAgIGlmICggKCBfX2ttcF90YXNraW5nX21vZGUgPT0gdHNrbV90YXNrX3RlYW1zICkgJiYKKyAgICAgICAgICggX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUgKSApCisgICAgeworICAgICAgICAvLyBSZWxlYXNlIGFueSB0aHJlYWRzIHNsZWVwaW5nIGF0IHRoZSBiYXJyaWVyLCBzbyB0aGF0IHRoZXkgY2FuIHN0ZWFsCisgICAgICAgIC8vIHRhc2tzIGFuZCBleGVjdXRlIHRoZW0uICBJbiBleHRyYSBiYXJyaWVyIG1vZGUsIHRhc2tzIGRvIG5vdCBzbGVlcAorICAgICAgICAvLyBhdCB0aGUgc2VwYXJhdGUgdGFza2luZyBiYXJyaWVyLCBzbyB0aGlzIGlzbid0IGEgcHJvYmxlbS4KKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgIGttcF9pbmZvX3QgKnRocmVhZCA9IHRocmVhZHNfZGF0YVtpXS50ZC50ZF90aHI7CisKKyAgICAgICAgICAgIGlmIChpID09IHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3RpZCkgeworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gU2luY2Ugd2UgaGF2ZW4ndCBsb2NrZWQgdGhlIHRocmVhZCdzIHN1c3BlbmQgbXV0ZXggbG9jayBhdCB0aGlzCisgICAgICAgICAgICAvLyBwb2ludCwgdGhlcmUgaXMgYSBzbWFsbCB3aW5kb3cgd2hlcmUgYSB0aHJlYWQgbWlnaHQgYmUgcHV0dGluZworICAgICAgICAgICAgLy8gaXRzZWxmIHRvIHNsZWVwLCBidXQgaGFzbid0IHNldCB0aGUgdGhfc2xlZXBfbG9jIGZpZWxkIHlldC4KKyAgICAgICAgICAgIC8vIFRvIHdvcmsgYXJvdW5kIHRoaXMsIF9fa21wX2V4ZWN1dGVfdGFza3NfdGVtcGxhdGUoKSBwZXJpb2RpY2FsbHkgY2hlY2tzCisgICAgICAgICAgICAvLyBzZWUgaWYgb3RoZXIgdGhyZWFkcyBhcmUgc2xlZXBpbmcgKHVzaW5nIHRoZSBzYW1lIHJhbmRvbQorICAgICAgICAgICAgLy8gbWVjaGFuaXNtIHRoYXQgaXMgdXNlZCBmb3IgdGFzayBzdGVhbGluZykgYW5kIGF3YWtlbnMgdGhlbSBpZgorICAgICAgICAgICAgLy8gdGhleSBhcmUuCisgICAgICAgICAgICBpZiAoICggc2xlZXBfbG9jID0gVENSX1BUUiggdGhyZWFkIC0+IHRoLnRoX3NsZWVwX2xvYykgKSAhPSBOVUxMICkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggNTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nOiBUIyVkIHdha2luZyB1cCB0aHJlYWQgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRoaXNfdGhyICksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSApICk7CisgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHNsZWVwX2xvYyk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSggNTAsICggIl9fa21wX2VuYWJsZV90YXNraW5nOiBUIyVkIGRvbid0IHdha2UgdXAgdGhyZWFkIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9lbmFibGVfdGFza2luZyhleGl0KTogVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSApICk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAvLyBUT0RPOiBDaGVjayB0aGUgY29tbWVudCBjb25zaXN0ZW5jeQorICogVXRpbGl0eSByb3V0aW5lcyBmb3IgInRhc2sgdGVhbXMiLiAgQSB0YXNrIHRlYW0gKGttcF90YXNrX3QpIGlzIGtpbmQgb2YKKyAqIGxpa2UgYSBzaGFkb3cgb2YgdGhlIGttcF90ZWFtX3QgZGF0YSBzdHJ1Y3QsIHdpdGggYSBkaWZmZXJlbnQgbGlmZXRpbWUuCisgKiBBZnRlciBhIGNoaWxkICogdGhyZWFkIGNoZWNrcyBpbnRvIGEgYmFycmllciBhbmQgY2FsbHMgX19rbXBfcmVsZWFzZSgpIGZyb20KKyAqIHRoZSBwYXJ0aWN1bGFyIHZhcmlhbnQgb2YgX19rbXBfPGJhcnJpZXJfa2luZD5fYmFycmllcl9nYXRoZXIoKSwgaXQgY2FuIG5vCisgKiBsb25nZXIgYXNzdW1lIHRoYXQgdGhlIGttcF90ZWFtX3Qgc3RydWN0dXJlIGlzIGludGFjdCAoYXQgYW55IG1vbWVudCwgdGhlCisgKiBtYXN0ZXIgdGhyZWFkIG1heSBleGl0IHRoZSBiYXJyaWVyIGNvZGUgYW5kIGZyZWUgdGhlIHRlYW0gZGF0YSBzdHJ1Y3R1cmUsCisgKiBhbmQgcmV0dXJuIHRoZSB0aHJlYWRzIHRvIHRoZSB0aHJlYWQgcG9vbCkuCisgKgorICogVGhpcyBkb2VzIG5vdCB3b3JrIHdpdGggdGhlIHRoZSB0YXNraW5nIGNvZGUsIGFzIHRoZSB0aHJlYWQgaXMgc3RpbGwKKyAqIGV4cGVjdGVkIHRvIHBhcnRpY2lwYXRlIGluIHRoZSBleGVjdXRpb24gb2YgYW55IHRhc2tzIHRoYXQgbWF5IGhhdmUgYmVlbgorICogc3Bhd25lZCBteSBhIG1lbWJlciBvZiB0aGUgdGVhbSwgYW5kIHRoZSB0aHJlYWQgc3RpbGwgbmVlZHMgYWNjZXNzIHRvIGFsbAorICogdG8gZWFjaCB0aHJlYWQgaW4gdGhlIHRlYW0sIHNvIHRoYXQgaXQgY2FuIHN0ZWFsIHdvcmsgZnJvbSBpdC4KKyAqCisgKiBFbnRlciB0aGUgZXhpc3RlbmNlIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0LiAgSXQgZW1wbG95cyBhIHJlZmVyZW5jZQorICogY291bnRpbmcgbWVjaGFuaW1zLCBhbmQgaXMgYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIGJlZm9yZSBjYWxsaW5nCisgKiBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlLCBhbmQgdGhlbiBpcyByZWxlYXNlIGJ5IHRoZSBsYXN0IHRocmVhZCB0bworICogZXhpdCBfX2ttcF88YmFycmllcl9raW5kPl9yZWxlYXNlIGF0IHRoZSBuZXh0IGJhcnJpZXIuICBJLmUuIHRoZSBsaWZldGltZXMKKyAqIG9mIHRoZSBrbXBfdGFza190ZWFtX3Qgc3RydWN0cyBmb3IgY29uc2VjdXRpdmUgYmFycmllcnMgY2FuIG92ZXJsYXAKKyAqIChhbmQgd2lsbCwgdW5sZXNzIHRoZSBtYXN0ZXIgdGhyZWFkIGlzIHRoZSBsYXN0IHRocmVhZCB0byBleGl0IHRoZSBiYXJyaWVyCisgKiByZWxlYXNlIHBoYXNlLCB3aGljaCBpcyBub3QgdHlwaWNhbCkuCisgKgorICogVGhlIGV4aXN0ZW5jZSBvZiBzdWNoIGEgc3RydWN0IGlzIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsCisgKiBidXQgZm9yIG5vdywgSSdtIHRyeWluZyB0byBrZWVwIGl0IHNwZWNpZmljIHRvIHRoZSBPTVBfMzBfRU5BQkxFRCBtYWNybywKKyAqIHNvIHRoYXQgYW55IHBlcmZvcm1hbmNlIGRpZmZlcmVuY2VzIHNob3cgdXAgd2hlbiBjb21wYXJpbmcgdGhlIDIuNSB2cy4gMy4wCisgKiBsaWJyYXJpZXMuCisgKgorICogV2UgY3VycmVudGx5IHVzZSB0aGUgZXhpc3RlbmNlIG9mIHRoZSB0aHJlYWRzIGFycmF5IGFzIGFuIGluZGljYXRvciB0aGF0CisgKiB0YXNrcyB3ZXJlIHNwYXduZWQgc2luY2UgdGhlIGxhc3QgYmFycmllci4gIElmIHRoZSBzdHJ1Y3R1cmUgaXMgdG8gYmUKKyAqIHVzZWZ1bCBvdXRzaWRlIHRoZSBjb250ZXh0IG9mIHRhc2tpbmcsIHRoZW4gdGhpcyB3aWxsIGhhdmUgdG8gY2hhbmdlLCBidXQKKyAqIG5vdCBzZXR0dGluZyB0aGUgZmllbGQgbWluaW1pemVzIHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Qgb2YgdGFza2luZyBvbgorICogYmFycmllcnMsIHdoZW4gbm8gZXhwbGljaXQgdGFza3Mgd2VyZSBzcGF3bmVkIChwdXNoZWQsIGFjdHVhbGx5KS4KKyAqLworCisKK3N0YXRpYyBrbXBfdGFza190ZWFtX3QgKl9fa21wX2ZyZWVfdGFza190ZWFtcyA9IE5VTEw7ICAgICAgICAgICAvLyBGcmVlIGxpc3QgZm9yIHRhc2tfdGVhbSBkYXRhIHN0cnVjdHVyZXMKKy8vIExvY2sgZm9yIHRhc2sgdGVhbSBkYXRhIHN0cnVjdHVyZXMKK3N0YXRpYyBrbXBfYm9vdHN0cmFwX2xvY2tfdCBfX2ttcF90YXNrX3RlYW1fbG9jayA9IEtNUF9CT09UU1RSQVBfTE9DS19JTklUSUFMSVpFUiggX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfYWxsb2NfdGFza19kZXF1ZToKKy8vIEFsbG9jYXRlcyBhIHRhc2sgZGVxdWUgZm9yIGEgcGFydGljdWxhciB0aHJlYWQsIGFuZCBpbml0aWFsaXplIHRoZSBuZWNlc3NhcnkKKy8vIGRhdGEgc3RydWN0dXJlcyByZWxhdGluZyB0byB0aGUgZGVxdWUuICBUaGlzIG9ubHkgaGFwcGVucyBvbmNlIHBlciB0aHJlYWQKKy8vIHBlciB0YXNrIHRlYW0gc2luY2UgdGFzayB0ZWFtcyBhcmUgcmVjeWNsZWQuCisvLyBObyBsb2NrIGlzIG5lZWRlZCBkdXJpbmcgYWxsb2NhdGlvbiBzaW5jZSBlYWNoIHRocmVhZCBhbGxvY2F0ZXMgaXRzIG93bgorLy8gZGVxdWUuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hbGxvY190YXNrX2RlcXVlKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPT0gTlVMTCApOworCisgICAgLy8gSW5pdGlhbGl6ZSBsYXN0IHN0b2xlbiB0YXNrIGZpZWxkIHRvICJub25lIgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID0gLTE7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MpID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9oZWFkID09IDAgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsID09IDAgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NfdGFza19kZXF1ZTogVCMlZCBhbGxvY2F0aW5nIGRlcXVlWyVkXSBmb3IgdGhyZWFkX2RhdGEgJXBcbiIsCisgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIElOSVRJQUxfVEFTS19ERVFVRV9TSVpFLCB0aHJlYWRfZGF0YSApICk7CisgICAgLy8gQWxsb2NhdGUgc3BhY2UgZm9yIHRhc2sgZGVxdWUsIGFuZCB6ZXJvIHRoZSBkZXF1ZQorICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IChrbXBfdGFza2RhdGFfdCAqKikKKyAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBJTklUSUFMX1RBU0tfREVRVUVfU0laRSAqIHNpemVvZihrbXBfdGFza2RhdGFfdCAqKSk7CisJdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfc2l6ZSA9IElOSVRJQUxfVEFTS19ERVFVRV9TSVpFOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfcmVhbGxvY190YXNrX2RlcXVlOgorLy8gUmUtYWxsb2NhdGVzIGEgdGFzayBkZXF1ZSBmb3IgYSBwYXJ0aWN1bGFyIHRocmVhZCwgY29waWVzIHRoZSBjb250ZW50IGZyb20gdGhlIG9sZCBkZXF1ZQorLy8gYW5kIGFkanVzdHMgdGhlIG5lY2Vzc2FyeSBkYXRhIHN0cnVjdHVyZXMgcmVsYXRpbmcgdG8gdGhlIGRlcXVlLgorLy8gVGhpcyBvcGVyYXRpb24gbXVzdCBiZSBkb25lIHdpdGggYSB0aGUgZGVxdWVfbG9jayBiZWluZyBoZWxkCisKK3N0YXRpYyB2b2lkIF9fa21wX3JlYWxsb2NfdGFza19kZXF1ZSAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhICkKK3sKKyAgICBrbXBfaW50MzIgc2l6ZSA9IFRBU0tfREVRVUVfU0laRSh0aHJlYWRfZGF0YS0+dGQpOworICAgIGttcF9pbnQzMiBuZXdfc2l6ZSA9IDIgKiBzaXplOworCisgICAgS0VfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWU6IFQjJWQgcmVhbGxvY2F0aW5nIGRlcXVlW2Zyb20gJWQgdG8gJWRdIGZvciB0aHJlYWRfZGF0YSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCBzaXplLCBuZXdfc2l6ZSwgdGhyZWFkX2RhdGEgKSApOworCisgICAga21wX3Rhc2tkYXRhX3QgKiogbmV3X2RlcXVlID0gKGttcF90YXNrZGF0YV90ICoqKSBfX2ttcF9hbGxvY2F0ZSggbmV3X3NpemUgKiBzaXplb2Yoa21wX3Rhc2tkYXRhX3QgKikpOworCisgICAgaW50IGksajsKKyAgICBmb3IgKCBpID0gdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlX2hlYWQsIGogPSAwOyBqIDwgc2l6ZTsgaSA9IChpKzEpICYgVEFTS19ERVFVRV9NQVNLKHRocmVhZF9kYXRhLT50ZCksIGorKyApCisgICAgICAgbmV3X2RlcXVlW2pdID0gdGhyZWFkX2RhdGEtPnRkLnRkX2RlcXVlW2ldOworCisgICAgX19rbXBfZnJlZSh0aHJlYWRfZGF0YS0+dGQudGRfZGVxdWUpOworCisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfaGVhZCA9IDA7CisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfdGFpbCA9IHNpemU7CisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWUgPSBuZXdfZGVxdWU7CisgICAgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfc2l6ZSA9IG5ld19zaXplOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX2RlcXVlOgorLy8gRGVhbGxvY2F0ZXMgYSB0YXNrIGRlcXVlIGZvciBhIHBhcnRpY3VsYXIgdGhyZWFkLgorLy8gSGFwcGVucyBhdCBsaWJyYXJ5IGRlYWxsb2NhdGlvbiBzbyBkb24ndCBuZWVkIHRvIHJlc2V0IGFsbCB0aHJlYWQgZGF0YSBmaWVsZHMuCisKK3N0YXRpYyB2b2lkCitfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSApCit7CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlICE9IE5VTEwgKSB7CisgICAgICAgIFRDV180KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcywgMCk7CisgICAgICAgICBfX2ttcF9mcmVlKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSApOworICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbG9jayApOworCisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgLy8gR0VIOiBGaWd1cmUgb3V0IHdoYXQgdG8gZG8gaGVyZSBmb3IgdGRfc3VzcF90aWVkX3Rhc2tzCisgICAgaWYgKCB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9zdXNwX3RpZWRfdGFza3MudHNfZW50cmllcyAhPSBUQVNLX1NUQUNLX0VNUFRZICkgeworICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfc3RhY2soIF9fa21wX3RocmVhZF9mcm9tX2d0aWQoIGd0aWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6CisvLyBBbGxvY2F0ZXMgYSB0aHJlYWRzX2RhdGEgYXJyYXkgZm9yIGEgdGFzayB0ZWFtLCBlaXRoZXIgYnkgYWxsb2NhdGluZyBhbiBpbml0aWFsCisvLyBhcnJheSBvciBlbmxhcmdpbmcgYW4gZXhpc3RpbmcgYXJyYXkuICBPbmx5IHRoZSBmaXJzdCB0aHJlYWQgdG8gZ2V0IHRoZSBsb2NrCisvLyBhbGxvY3Mgb3IgZW5sYXJnZXMgdGhlIGFycmF5IGFuZCByZS1pbml0aWFsaXplcyB0aGUgYXJyYXkgZWxlZW1udHMuCisvLyBUaGF0IHRocmVhZCByZXR1cm5zICJUUlVFIiwgdGhlIHJlc3QgcmV0dXJuICJGQUxTRSIuCisvLyBBc3N1bWVzIHRoYXQgdGhlIG5ldyBhcnJheSBzaXplIGlzIGdpdmVuIGJ5IHRhc2tfdGVhbSAtPiB0dC50dF9ucHJvYy4KKy8vIFRoZSBjdXJyZW50IHNpemUgaXMgZ2l2ZW4gYnkgdGFza190ZWFtIC0+IHR0LnR0X21heF90aHJlYWRzLgorCitzdGF0aWMgaW50CitfX2ttcF9yZWFsbG9jX3Rhc2tfdGhyZWFkc19kYXRhKCBrbXBfaW5mb190ICp0aHJlYWQsIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqKiB0aHJlYWRzX2RhdGFfcDsKKyAgICBrbXBfaW50MzIgICAgICAgICAgICBudGhyZWFkcywgbWF4dGhyZWFkczsKKyAgICBpbnQgICAgICAgICAgICAgICAgICBpc19pbml0X3RocmVhZCA9IEZBTFNFOworCisgICAgaWYgKCBUQ1JfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MpICkgeworICAgICAgICAvLyBBbHJlYWR5IHJlYWxsb2NhdGVkIGFuZCBpbml0aWFsaXplZC4KKyAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHRocmVhZHNfZGF0YV9wID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhOworICAgIG50aHJlYWRzICAgPSB0YXNrX3RlYW0gLT4gdHQudHRfbnByb2M7CisgICAgbWF4dGhyZWFkcyA9IHRhc2tfdGVhbSAtPiB0dC50dF9tYXhfdGhyZWFkczsKKworICAgIC8vIEFsbCB0aHJlYWRzIG11c3QgbG9jayB3aGVuIHRoZXkgZW5jb3VudGVyIHRoZSBmaXJzdCB0YXNrIG9mIHRoZSBpbXBsaWNpdCB0YXNrCisgICAgLy8gcmVnaW9uIHRvIG1ha2Ugc3VyZSB0aHJlYWRzX2RhdGEgZmllbGRzIGFyZSAocmUpaW5pdGlhbGl6ZWQgYmVmb3JlIHVzZWQuCisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisKKyAgICBpZiAoICEgVENSXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzKSApIHsKKyAgICAgICAgLy8gZmlyc3QgdGhyZWFkIHRvIGVuYWJsZSB0YXNraW5nCisgICAgICAgIGttcF90ZWFtX3QgKnRlYW0gPSB0aHJlYWQgLT4gdGgudGhfdGVhbTsKKyAgICAgICAgaW50IGk7CisKKyAgICAgICAgaXNfaW5pdF90aHJlYWQgPSBUUlVFOworICAgICAgICBpZiAoIG1heHRocmVhZHMgPCBudGhyZWFkcyApIHsKKworICAgICAgICAgICAgaWYgKCAqdGhyZWFkc19kYXRhX3AgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqb2xkX2RhdGEgPSAqdGhyZWFkc19kYXRhX3A7CisgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKm5ld19kYXRhID0gTlVMTDsKKworICAgICAgICAgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVhbGxvY190YXNrX3RocmVhZHNfZGF0YTogVCMlZCByZWFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJ0aHJlYWRzIGRhdGEgZm9yIHRhc2tfdGVhbSAlcCwgbmV3X3NpemUgPSAlZCwgb2xkX3NpemUgPSAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG50aHJlYWRzLCBtYXh0aHJlYWRzICkgKTsKKyAgICAgICAgICAgICAgICAvLyBSZWFsbG9jYXRlIHRocmVhZHNfZGF0YSB0byBoYXZlIG1vcmUgZWxlbWVudHMgdGhhbiBjdXJyZW50IGFycmF5CisgICAgICAgICAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfcmVhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4gIE5vdGUgYWxsIG5ldyBhcnJheSBlbnRyaWVzIGFyZSBpbml0aWFsaXplZAorICAgICAgICAgICAgICAgIC8vIHRvIHplcm8gYnkgX19rbXBfYWxsb2NhdGUoKS4KKyAgICAgICAgICAgICAgICBuZXdfZGF0YSA9IChrbXBfdGhyZWFkX2RhdGFfdCAqKQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FsbG9jYXRlKCBudGhyZWFkcyAqIHNpemVvZihrbXBfdGhyZWFkX2RhdGFfdCkgKTsKKyAgICAgICAgICAgICAgICAvLyBjb3B5IG9sZCBkYXRhIHRvIG5ldyBkYXRhCisgICAgICAgICAgICAgICAgS01QX01FTUNQWV9TKCAodm9pZCAqKSBuZXdfZGF0YSwgbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQgKikgb2xkX2RhdGEsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXh0aHJlYWRzICogc2l6ZW9mKGttcF90YXNrZGF0YV90ICopICk7CisKKyNpZmRlZiBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBHRUg6IEZpZ3VyZSBvdXQgaWYgdGhpcyBpcyB0aGUgcmlnaHQgdGhpbmcgdG8gZG8KKyAgICAgICAgICAgICAgICBmb3IgKGkgPSBtYXh0aHJlYWRzOyBpIDwgbnRocmVhZHM7IGkrKykgeworICAgICAgICAgICAgICAgICAgICBrbXBfdGhyZWFkX2RhdGFfdCAqdGhyZWFkX2RhdGEgPSAmICgqdGhyZWFkc19kYXRhX3ApW2ldOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9pbml0X3Rhc2tfc3RhY2soIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApLCB0aHJlYWRfZGF0YSApOworICAgICAgICAgICAgICAgIH0KKyNlbmRpZiAvLyBCVUlMRF9USUVEX1RBU0tfU1RBQ0sKKyAgICAgICAgICAgICAgICAvLyBJbnN0YWxsIHRoZSBuZXcgZGF0YSBhbmQgZnJlZSB0aGUgb2xkIGRhdGEKKyAgICAgICAgICAgICAgICAoKnRocmVhZHNfZGF0YV9wKSA9IG5ld19kYXRhOworICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUoIG9sZF9kYXRhICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICggIl9fa21wX3JlYWxsb2NfdGFza190aHJlYWRzX2RhdGE6IFQjJWQgYWxsb2NhdGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgInRocmVhZHMgZGF0YSBmb3IgdGFza190ZWFtICVwLCBzaXplID0gJWRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIHRhc2tfdGVhbSwgbnRocmVhZHMgKSApOworICAgICAgICAgICAgICAgIC8vIE1ha2UgdGhlIGluaXRpYWwgYWxsb2NhdGUgZm9yIHRocmVhZHNfZGF0YSBhcnJheSwgYW5kIHplcm8gZW50cmllcworICAgICAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgX19rbXBfdGhyZWFkX2NhbGxvYygpIGJlY2F1c2UgdGhyZWFkcyBub3QgYXJvdW5kIGZvcgorICAgICAgICAgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgICAgICAgICAqdGhyZWFkc19kYXRhX3AgPSAoa21wX3RocmVhZF9kYXRhX3QgKikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9hbGxvY2F0ZSggbnRocmVhZHMgKiBzaXplb2Yoa21wX3RocmVhZF9kYXRhX3QpICk7CisjaWZkZWYgQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICAgICAgLy8gR0VIOiBGaWd1cmUgb3V0IGlmIHRoaXMgaXMgdGhlIHJpZ2h0IHRoaW5nIHRvIGRvCisgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgICAgICAgICAga21wX3RocmVhZF9kYXRhX3QgKnRocmVhZF9kYXRhID0gJiAoKnRocmVhZHNfZGF0YV9wKVtpXTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfaW5pdF90YXNrX3N0YWNrKCBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGhyZWFkX2RhdGEgKTsKKyAgICAgICAgICAgICAgICB9CisjZW5kaWYgLy8gQlVJTERfVElFRF9UQVNLX1NUQUNLCisgICAgICAgICAgICB9CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSBudGhyZWFkczsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8vIElmIGFycmF5IGhhcyAobW9yZSB0aGFuKSBlbm91Z2ggZWxlbWVudHMsIGdvIGFoZWFkIGFuZCB1c2UgaXQKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICp0aHJlYWRzX2RhdGFfcCAhPSBOVUxMICk7CisgICAgICAgIH0KKworICAgICAgICAvLyBpbml0aWFsaXplIHRocmVhZHNfZGF0YSBwb2ludGVycyBiYWNrIHRvIHRocmVhZF9pbmZvIHN0cnVjdHVyZXMKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG50aHJlYWRzOyBpKyspIHsKKyAgICAgICAgICAgIGttcF90aHJlYWRfZGF0YV90ICp0aHJlYWRfZGF0YSA9ICYgKCp0aHJlYWRzX2RhdGFfcClbaV07CisgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF90aHIgPSB0ZWFtIC0+IHQudF90aHJlYWRzW2ldOworCisgICAgICAgICAgICBpZiAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX2xhc3Rfc3RvbGVuID49IG50aHJlYWRzKSB7CisgICAgICAgICAgICAgICAgLy8gVGhlIGxhc3Qgc3RvbGVuIGZpZWxkIHN1cnZpdmVzIGFjcm9zcyB0ZWFtcyAvIGJhcnJpZXIsIGFuZCB0aGUgbnVtYmVyCisgICAgICAgICAgICAgICAgLy8gb2YgdGhyZWFkcyBtYXkgaGF2ZSBjaGFuZ2VkLiAgSXQncyBwb3NzaWJsZSAobGlrZWx5PykgdGhhdCBhIG5ldworICAgICAgICAgICAgICAgIC8vIHBhcmFsbGVsIHJlZ2lvbiB3aWxsIGV4aGliaXQgdGhlIHNhbWUgYmVoYXZpb3IgYXMgdGhlIHByZXZpb3VzIHJlZ2lvbi4KKyAgICAgICAgICAgICAgICB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9sYXN0X3N0b2xlbiA9IC0xOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7CisgICAgICAgIFRDV19TWU5DXzQodGFza190ZWFtIC0+IHR0LnR0X2ZvdW5kX3Rhc2tzLCBUUlVFKTsKKyAgICB9CisKKyAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICByZXR1cm4gaXNfaW5pdF90aHJlYWQ7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGE6CisvLyBEZWFsbG9jYXRlcyBhIHRocmVhZHNfZGF0YSBhcnJheSBmb3IgYSB0YXNrIHRlYW0sIGluY2x1ZGluZyBhbnkgYXR0YWNoZWQKKy8vIHRhc2tpbmcgZGVxdWVzLiAgT25seSBvY2N1cnMgYXQgbGlicmFyeSBzaHV0ZG93bi4KKworc3RhdGljIHZvaWQKK19fa21wX2ZyZWVfdGFza190aHJlYWRzX2RhdGEoIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtICkKK3sKKyAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2xvY2sgKTsKKyAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCB0YXNrX3RlYW0tPnR0LnR0X21heF90aHJlYWRzOyBpKysgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfZGVxdWUoICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YVtpXSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgKTsKKyAgICAgICAgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06CisvLyBBbGxvY2F0ZXMgYSB0YXNrIHRlYW0gYXNzb2NpYXRlZCB3aXRoIGEgc3BlY2lmaWMgdGVhbSwgdGFraW5nIGl0IGZyb20KKy8vIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdCBpZiBwb3NzaWJsZS4gIEFsc28gaW5pdGlhbGl6ZXMgZGF0YSBzdHJ1Y3R1cmVzLgorCitzdGF0aWMga21wX3Rhc2tfdGVhbV90ICoKK19fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSgga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBrbXBfdGFza190ZWFtX3QgKnRhc2tfdGVhbSA9IE5VTEw7CisgICAgaW50IG50aHJlYWRzOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZW50ZXJpbmc7IHRlYW0gPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0ZWFtICkgKTsKKworICAgIGlmIChUQ1JfUFRSKF9fa21wX2ZyZWVfdGFza190ZWFtcykgIT0gTlVMTCkgeworICAgICAgICAvLyBUYWtlIGEgdGFzayB0ZWFtIGZyb20gdGhlIHRhc2sgdGVhbSBwb29sCisgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgICAgICBpZiAoX19rbXBfZnJlZV90YXNrX3RlYW1zICE9IE5VTEwpIHsKKyAgICAgICAgICAgIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtczsKKyAgICAgICAgICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCk7CisgICAgICAgICAgICB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dCA9IE5VTEw7CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJl9fa21wX3Rhc2tfdGVhbV9sb2NrICk7CisgICAgfQorCisgICAgaWYgKHRhc2tfdGVhbSA9PSBOVUxMKSB7CisgICAgICAgIEtFX1RSQUNFKCAxMCwgKCAiX19rbXBfYWxsb2NhdGVfdGFza190ZWFtOiBUIyVkIGFsbG9jYXRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAidGFzayB0ZWFtIGZvciB0ZWFtICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aHJlYWQgKSwgdGVhbSApICk7CisgICAgICAgIC8vIEFsbG9jYXRlIGEgbmV3IHRhc2sgdGVhbSBpZiBvbmUgaXMgbm90IGF2YWlsYWJsZS4KKyAgICAgICAgLy8gQ2Fubm90IHVzZSBfX2ttcF90aHJlYWRfbWFsbG9jKCkgYmVjYXVzZSB0aHJlYWRzIG5vdCBhcm91bmQgZm9yCisgICAgICAgIC8vIGttcF9yZWFwX3Rhc2tfdGVhbSggKS4KKyAgICAgICAgdGFza190ZWFtID0gKGttcF90YXNrX3RlYW1fdCAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKGttcF90YXNrX3RlYW1fdCkgKTsKKyAgICAgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19sb2NrICk7CisgICAgICAgIC8vdGFza190ZWFtIC0+IHR0LnR0X3RocmVhZHNfZGF0YSA9IE5VTEw7ICAgLy8gQUM6IF9fa21wX2FsbG9jYXRlIHplcm9lcyByZXR1cm5lZCBtZW1vcnkKKyAgICAgICAgLy90YXNrX3RlYW0gLT4gdHQudHRfbWF4X3RocmVhZHMgPSAwOworICAgICAgICAvL3Rhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKyAgICB9CisKKyAgICBUQ1dfNCh0YXNrX3RlYW0gLT4gdHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgIFRDV180KHRhc2tfdGVhbSAtPiB0dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UpOworI2VuZGlmCisgICAgdGFza190ZWFtIC0+IHR0LnR0X25wcm9jID0gbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X3VuZmluaXNoZWRfdGhyZWFkcywgbnRocmVhZHMgKTsKKyAgICBUQ1dfNCggdGFza190ZWFtIC0+IHR0LnR0X2FjdGl2ZSwgVFJVRSApOworCisgICAgS0FfVFJBQ0UoIDIwLCAoICJfX2ttcF9hbGxvY2F0ZV90YXNrX3RlYW06IFQjJWQgZXhpdGluZzsgdGFza190ZWFtID0gJXAgdW5maW5pc2hlZF90aHJlYWRzIGluaXQnZCB0byAlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgKHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEpLCB0YXNrX3RlYW0sIHRhc2tfdGVhbSAtPiB0dC50dF91bmZpbmlzaGVkX3RocmVhZHMpICk7CisgICAgcmV0dXJuIHRhc2tfdGVhbTsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfZnJlZV90YXNrX3RlYW06CisvLyBGcmVlcyB0aGUgdGFzayB0ZWFtIGFzc29jaWF0ZWQgd2l0aCBhIHNwZWNpZmljIHRocmVhZCwgYW5kIGFkZHMgaXQKKy8vIHRvIHRoZSBnbG9iYWwgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKwordm9pZAorX19rbXBfZnJlZV90YXNrX3RlYW0oIGttcF9pbmZvX3QgKnRocmVhZCwga21wX3Rhc2tfdGVhbV90ICp0YXNrX3RlYW0gKQoreworICAgIEtBX1RSQUNFKCAyMCwgKCAiX19rbXBfZnJlZV90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgIHRocmVhZCA/IF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApIDogLTEsIHRhc2tfdGVhbSApICk7CisKKyAgICAvLyBQdXQgdGFzayB0ZWFtIGJhY2sgb24gZnJlZSBsaXN0CisgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza190ZWFtIC0+IHR0LnR0X25leHQgPT0gTlVMTCApOworICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gX19rbXBfZnJlZV90YXNrX3RlYW1zOworICAgIFRDV19QVFIoX19rbXBfZnJlZV90YXNrX3RlYW1zLCB0YXNrX3RlYW0pOworCisgICAgX19rbXBfcmVsZWFzZV9ib290c3RyYXBfbG9jayggJiBfX2ttcF90YXNrX3RlYW1fbG9jayApOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF9yZWFwX3Rhc2tfdGVhbXM6CisvLyBGcmVlIGFsbCB0aGUgdGFzayB0ZWFtcyBvbiB0aGUgdGFzayB0ZWFtIGZyZWUgbGlzdC4KKy8vIFNob3VsZCBvbmx5IGJlIGRvbmUgZHVyaW5nIGxpYnJhcnkgc2h1dGRvd24uCisvLyBDYW5ub3QgZG8gYW55dGhpbmcgdGhhdCBuZWVkcyBhIHRocmVhZCBzdHJ1Y3R1cmUgb3IgZ3RpZCBzaW5jZSB0aGV5IGFyZSBhbHJlYWR5IGdvbmUuCisKK3ZvaWQKK19fa21wX3JlYXBfdGFza190ZWFtcyggdm9pZCApCit7CisgICAga21wX3Rhc2tfdGVhbV90ICAgKnRhc2tfdGVhbTsKKworICAgIGlmICggVENSX1BUUihfX2ttcF9mcmVlX3Rhc2tfdGVhbXMpICE9IE5VTEwgKSB7CisgICAgICAgIC8vIEZyZWUgYWxsIHRhc2tfdGVhbXMgb24gdGhlIGZyZWUgbGlzdAorICAgICAgICBfX2ttcF9hY3F1aXJlX2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfdGFza190ZWFtX2xvY2sgKTsKKyAgICAgICAgd2hpbGUgKCAoIHRhc2tfdGVhbSA9IF9fa21wX2ZyZWVfdGFza190ZWFtcyApICE9IE5VTEwgKSB7CisgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGVhbXMgPSB0YXNrX3RlYW0gLT4gdHQudHRfbmV4dDsKKyAgICAgICAgICAgIHRhc2tfdGVhbSAtPiB0dC50dF9uZXh0ID0gTlVMTDsKKworICAgICAgICAgICAgLy8gRnJlZSB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBpZiAoIHRhc2tfdGVhbSAtPiB0dC50dF90aHJlYWRzX2RhdGEgIT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9mcmVlX3Rhc2tfdGhyZWFkc19kYXRhKCB0YXNrX3RlYW0gKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX2ZyZWUoIHRhc2tfdGVhbSApOworICAgICAgICB9CisgICAgICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICZfX2ttcF90YXNrX3RlYW1fbG9jayApOworICAgIH0KK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3dhaXRfdG9fdW5yZWZfdGFza190ZWFtczoKKy8vIFNvbWUgdGhyZWFkcyBjb3VsZCBzdGlsbCBiZSBpbiB0aGUgZm9yayBiYXJyaWVyIHJlbGVhc2UgY29kZSwgcG9zc2libHkKKy8vIHRyeWluZyB0byBzdGVhbCB0YXNrcy4gIFdhaXQgZm9yIGVhY2ggdGhyZWFkIHRvIHVucmVmZXJlbmNlIGl0cyB0YXNrIHRlYW0uCisvLwordm9pZAorX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW1zKHZvaWQpCit7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworICAgIGttcF91aW50MzIgc3BpbnM7CisgICAgaW50IGRvbmU7CisKKyAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKworICAgIGZvciAoOzspIHsKKyAgICAgICAgZG9uZSA9IFRSVUU7CisKKyAgICAgICAgLy8gVE9ETzogR0VIIC0gdGhpcyBtYXkgYmUgaXMgd3JvbmcgYmVjYXVzZSBzb21lIHN5bmMgd291bGQgYmUgbmVjZXNzYXJ5CisgICAgICAgIC8vICAgICAgICAgICAgIGluIGNhc2UgdGhyZWFkcyBhcmUgYWRkZWQgdG8gdGhlIHBvb2wgZHVyaW5nIHRoZSB0cmF2ZXJzYWwuCisgICAgICAgIC8vICAgICAgICAgICAgIE5lZWQgdG8gdmVyaWZ5IHRoYXQgbG9jayBmb3IgdGhyZWFkIHBvb2wgaXMgaGVsZCB3aGVuIGNhbGxpbmcKKyAgICAgICAgLy8gICAgICAgICAgICAgdGhpcyByb3V0aW5lLgorICAgICAgICBmb3IgKHRocmVhZCA9IChrbXBfaW5mb190ICopX19rbXBfdGhyZWFkX3Bvb2w7CisgICAgICAgICAgICAgdGhyZWFkICE9IE5VTEw7CisgICAgICAgICAgICAgdGhyZWFkID0gdGhyZWFkLT50aC50aF9uZXh0X3Bvb2wpCisgICAgICAgIHsKKyNpZiBLTVBfT1NfV0lORE9XUworICAgICAgICAgICAgRFdPUkQgZXhpdF92YWw7CisjZW5kaWYKKyAgICAgICAgICAgIGlmICggVENSX1BUUih0aHJlYWQtPnRoLnRoX3Rhc2tfdGVhbSkgPT0gTlVMTCApIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgdGFza190ZWFtID09IE5VTExcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworICAgICAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICAgICAgfQorI2lmIEtNUF9PU19XSU5ET1dTCisgICAgICAgICAgICAvLyBUT0RPOiBHRUggLSBhZGQgdGhpcyBjaGVjayBmb3IgTGludXgqIE9TIC8gT1MgWCogYXMgd2VsbD8KKyAgICAgICAgICAgIGlmICghX19rbXBfaXNfdGhyZWFkX2FsaXZlKHRocmVhZCwgJmV4aXRfdmFsKSkgeworICAgICAgICAgICAgICAgIHRocmVhZC0+dGgudGhfdGFza190ZWFtID0gTlVMTDsKKyAgICAgICAgICAgICAgICBjb250aW51ZTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorCisgICAgICAgICAgICBkb25lID0gRkFMU0U7ICAvLyBCZWNhdXNlIHRoX3Rhc2tfdGVhbSBwb2ludGVyIGlzIG5vdCBOVUxMIGZvciB0aGlzIHRocmVhZAorCisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFdhaXRpbmcgZm9yIFQjJWQgdG8gdW5yZWZlcmVuY2UgdGFza190ZWFtXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICkgKSApOworCisgICAgICAgICAgICBpZiAoIF9fa21wX2RmbHRfYmxvY2t0aW1lICE9IEtNUF9NQVhfQkxPQ0tUSU1FICkgeworICAgICAgICAgICAgICAgIHZvbGF0aWxlIHZvaWQgKnNsZWVwX2xvYzsKKyAgICAgICAgICAgICAgICAvLyBJZiB0aGUgdGhyZWFkIGlzIHNsZWVwaW5nLCBhd2FrZW4gaXQuCisgICAgICAgICAgICAgICAgaWYgKCAoIHNsZWVwX2xvYyA9IFRDUl9QVFIoIHRocmVhZC0+dGgudGhfc2xlZXBfbG9jKSApICE9IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfd2FpdF90b191bnJlZl90YXNrX3RlYW06IFQjJWQgd2FraW5nIHVwIHRocmVhZCBUIyVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhyZWFkICksIF9fa21wX2d0aWRfZnJvbV90aHJlYWQoIHRocmVhZCApICkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRocmVhZCksIHNsZWVwX2xvYyk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgIGlmIChkb25lKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorCisgICAgICAgIC8vIElmIHdlIGFyZSBvdmVyc3Vic2NyaWJlZCwKKyAgICAgICAgLy8gb3IgaGF2ZSB3YWl0ZWQgYSBiaXQgKGFuZCBsaWJyYXJ5IG1vZGUgaXMgdGhyb3VnaHB1dCksIHlpZWxkLgorICAgICAgICAvLyBQYXVzZSBpcyBpbiB0aGUgZm9sbG93aW5nIGNvZGUuCisgICAgICAgIEtNUF9ZSUVMRCggVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MgKTsKKyAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7ICAgICAgICAvLyBZaWVsZHMgb25seSBpZiBLTVBfTElCUkFSWT10aHJvdWdocHV0CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fc2V0dXA6ICBDcmVhdGUgYSB0YXNrX3RlYW0gZm9yIHRoZSBjdXJyZW50IHRlYW0sIGJ1dCB1c2UKKy8vIGFuIGFscmVhZHkgY3JlYXRlZCwgdW51c2VkIG9uZSBpZiBpdCBhbHJlYWR5IGV4aXN0cy4KK3ZvaWQKK19fa21wX3Rhc2tfdGVhbV9zZXR1cCgga21wX2luZm9fdCAqdGhpc190aHIsIGttcF90ZWFtX3QgKnRlYW0sIGludCBhbHdheXMgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSAhPSB0c2ttX2ltbWVkaWF0ZV9leGVjICk7CisKKyAgICAvLyBJZiB0aGlzIHRhc2tfdGVhbSBoYXNuJ3QgYmVlbiBjcmVhdGVkIHlldCwgYWxsb2NhdGUgaXQuIEl0IHdpbGwgYmUgdXNlZCBpbiB0aGUgcmVnaW9uIGFmdGVyIHRoZSBuZXh0LgorICAgIC8vIElmIGl0IGV4aXN0cywgaXQgaXMgdGhlIGN1cnJlbnQgdGFzayB0ZWFtIGFuZCBzaG91bGRuJ3QgYmUgdG91Y2hlZCB5ZXQgYXMgaXQgbWF5IHN0aWxsIGJlIGluIHVzZS4KKyAgICBpZiAodGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0gPT0gTlVMTCAmJiAoYWx3YXlzIHx8IHRlYW0tPnQudF9ucHJvYyA+IDEpICkgeworICAgICAgICB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSA9IF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBfdGFza190ZWFtX3NldHVwOiBNYXN0ZXIgVCMlZCBjcmVhdGVkIG5ldyB0YXNrX3RlYW0gJXAgZm9yIHRlYW0gJWQgYXQgcGFyaXR5PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0ZWFtLT50LnRfdGFza190ZWFtW3RoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlXSwKKyAgICAgICAgICAgICAgICAgICAgICAoKHRlYW0gIT0gTlVMTCkgPyB0ZWFtLT50LnRfaWQgOiAtMSksIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlKSk7CisgICAgfQorCisgICAgLy8gQWZ0ZXIgdGhyZWFkcyBleGl0IHRoZSByZWxlYXNlLCB0aGV5IHdpbGwgY2FsbCBzeW5jLCBhbmQgdGhlbiBwb2ludCB0byB0aGlzIG90aGVyIHRhc2tfdGVhbTsgbWFrZSBzdXJlIGl0IGlzCisgICAgLy8gYWxsb2NhdGVkIGFuZCBwcm9wZXJseSBpbml0aWFsaXplZC4gQXMgdGhyZWFkcyBzcGluIGluIHRoZSBiYXJyaWVyIHJlbGVhc2UgcGhhc2UsIHRoZXkgd2lsbCBjb250aW51ZSB0byB1c2UgdGhlCisgICAgLy8gcHJldmlvdXMgdGFza190ZWFtIHN0cnVjdChhYm92ZSksIHVudGlsIHRoZXkgcmVjZWl2ZSB0aGUgc2lnbmFsIHRvIHN0b3AgY2hlY2tpbmcgZm9yIHRhc2tzICh0aGV5IGNhbid0IHNhZmVseQorICAgIC8vIHJlZmVyZW5jZSB0aGUga21wX3RlYW1fdCBzdHJ1Y3QsIHdoaWNoIGNvdWxkIGJlIHJlYWxsb2NhdGVkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkKS4gTm8gdGFzayB0ZWFtcyBhcmUgZm9ybWVkIGZvcgorICAgIC8vIHNlcmlhbGl6ZWQgdGVhbXMuCisgICAgaWYgKHRlYW0tPnQudF9ucHJvYyA+IDEpIHsKKyAgICAgICAgaW50IG90aGVyX3RlYW0gPSAxIC0gdGhpc190aHItPnRoLnRoX3Rhc2tfc3RhdGU7CisgICAgICAgIGlmICh0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dID09IE5VTEwpIHsgLy8gc2V0dXAgb3RoZXIgdGVhbSBhcyB3ZWxsCisgICAgICAgICAgICAgICAgdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSA9IF9fa21wX2FsbG9jYXRlX3Rhc2tfdGVhbSggdGhpc190aHIsIHRlYW0gKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIGNyZWF0ZWQgc2Vjb25kIG5ldyB0YXNrX3RlYW0gJXAgZm9yIHRlYW0gJWQgYXQgcGFyaXR5PSVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0ZWFtLT50LnRfdGFza190ZWFtW290aGVyX3RlYW1dLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCBvdGhlcl90ZWFtICkpOworICAgICAgICB9CisgICAgICAgIGVsc2UgeyAvLyBMZWF2ZSB0aGUgb2xkIHRhc2sgdGVhbSBzdHJ1Y3QgaW4gcGxhY2UgZm9yIHRoZSB1cGNvbWluZyByZWdpb247IGFkanVzdCBhcyBuZWVkZWQKKyAgICAgICAgICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXTsKKyAgICAgICAgICAgIGlmICghdGFza190ZWFtLT50dC50dF9hY3RpdmUgfHwgdGVhbS0+dC50X25wcm9jICE9IHRhc2tfdGVhbS0+dHQudHRfbnByb2MpIHsKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X25wcm9jLCB0ZWFtLT50LnRfbnByb2MpOworICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MsIEZBTFNFKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfcHJveHlfdGFza3MsIEZBTFNFKTsKKyNlbmRpZgorICAgICAgICAgICAgICAgIFRDV180KHRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCB0ZWFtLT50LnRfbnByb2MgKTsKKyAgICAgICAgICAgICAgICBUQ1dfNCh0YXNrX3RlYW0tPnR0LnR0X2FjdGl2ZSwgVFJVRSApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgLy8gaWYgdGVhbSBzaXplIGhhcyBjaGFuZ2VkLCB0aGUgZmlyc3QgdGhyZWFkIHRvIGVuYWJsZSB0YXNraW5nIHdpbGwgcmVhbGxvYyB0aHJlYWRzX2RhdGEgaWYgbmVjZXNzYXJ5CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fc2V0dXA6IE1hc3RlciBUIyVkIHJlc2V0IG5leHQgdGFza190ZWFtICVwIGZvciB0ZWFtICVkIGF0IHBhcml0eT0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfZ3RpZF9mcm9tX3RocmVhZCggdGhpc190aHIgKSwgdGVhbS0+dC50X3Rhc2tfdGVhbVtvdGhlcl90ZWFtXSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCBvdGhlcl90ZWFtICkpOworICAgICAgICB9CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNrX3RlYW1fc3luYzogUHJvcGFnYXRpb24gb2YgdGFzayB0ZWFtIGRhdGEgZnJvbSB0ZWFtIHRvIHRocmVhZHMKKy8vIHdoaWNoIGhhcHBlbnMganVzdCBhZnRlciB0aGUgcmVsZWFzZSBwaGFzZSBvZiBhIHRlYW0gYmFycmllci4gIFRoaXMgbWF5IGJlCisvLyBjYWxsZWQgYnkgYW55IHRocmVhZCwgYnV0IG9ubHkgZm9yIHRlYW1zIHdpdGggIyB0aHJlYWRzID4gMS4KKwordm9pZAorX19rbXBfdGFza190ZWFtX3N5bmMoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworCisgICAgLy8gVG9nZ2xlIHRoZSB0aF90YXNrX3N0YXRlIGZpZWxkLCB0byBzd2l0Y2ggd2hpY2ggdGFza190ZWFtIHRoaXMgdGhyZWFkIHJlZmVycyB0bworICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlID0gMSAtIHRoaXNfdGhyLT50aC50aF90YXNrX3N0YXRlOworICAgIC8vIEl0IGlzIG5vdyBzYWZlIHRvIHByb3BhZ2F0ZSB0aGUgdGFzayB0ZWFtIHBvaW50ZXIgZnJvbSB0aGUgdGVhbSBzdHJ1Y3QgdG8gdGhlIGN1cnJlbnQgdGhyZWFkLgorICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV0pOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV9zeW5jOiBUaHJlYWQgVCMlZCB0YXNrIHRlYW0gc3dpdGNoZWQgdG8gdGFza190ZWFtICVwIGZyb20gVGVhbSAjJWQgKHBhcml0eT0lZClcbiIsCisgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKCB0aGlzX3RociApLCB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtLAorICAgICAgICAgICAgICAgICAgKCh0ZWFtICE9IE5VTEwpID8gdGVhbS0+dC50X2lkIDogLTEpLCB0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZSkpOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIF9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgdGhyZWFkIHdhaXRzIGZvciBvdXRzdGFuZGluZyB0YXNrcyBhZnRlciB0aGUgYmFycmllciBnYXRoZXIKKy8vIHBoYXNlLiAgT25seSBjYWxsZWQgYnkgbWFzdGVyIHRocmVhZCBpZiAjdGhyZWFkcyBpbiB0ZWFtID4gMSBvciBpZiBwcm94eSB0YXNrcyB3ZXJlIGNyZWF0ZWQuCisvLyB3YWl0IGlzIGEgZmxhZyB0aGF0IGRlZmF1bHRzIHRvIDEgKHNlZSBrbXAuaCksIGJ1dCB3YWl0aW5nIGNhbiBiZSB0dXJuZWQgb2ZmIGJ5IHBhc3NpbmcgaW4gMAorLy8gb3B0aW9uYWxseSBhcyB0aGUgbGFzdCBhcmd1bWVudC4gV2hlbiB3YWl0IGlzIHplcm8sIG1hc3RlciB0aHJlYWQgZG9lcyBub3Qgd2FpdCBmb3IKKy8vIHVuZmluaXNoZWRfdGhyZWFkcyB0byByZWFjaCAwLgordm9pZAorX19rbXBfdGFza190ZWFtX3dhaXQoIGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfdGVhbV90ICp0ZWFtCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikKKyAgICAgICAgICAgICAgICAgICAgICAsIGludCB3YWl0KQoreworICAgIGttcF90YXNrX3RlYW1fdCAqdGFza190ZWFtID0gdGVhbS0+dC50X3Rhc2tfdGVhbVt0aGlzX3Roci0+dGgudGhfdGFza19zdGF0ZV07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYyApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbSA9PSB0aGlzX3Roci0+dGgudGhfdGFza190ZWFtICk7CisKKyAgICBpZiAoICggdGFza190ZWFtICE9IE5VTEwgKSAmJiBLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkgKSB7CisgICAgICAgIGlmICh3YWl0KSB7CisgICAgICAgICAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcF90YXNrX3RlYW1fd2FpdDogTWFzdGVyIFQjJWQgd2FpdGluZyBmb3IgYWxsIHRhc2tzIChmb3IgdW5maW5pc2hlZF90aHJlYWRzIHRvIHJlYWNoIDApIG9uIHRhc2tfdGVhbSA9ICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX2Zyb21fdGhyZWFkKHRoaXNfdGhyKSwgdGFza190ZWFtKSk7CisgICAgICAgICAgICAvLyBXb3JrZXIgdGhyZWFkcyBtYXkgaGF2ZSBkcm9wcGVkIHRocm91Z2ggdG8gcmVsZWFzZSBwaGFzZSwgYnV0IGNvdWxkIHN0aWxsIGJlIGV4ZWN1dGluZyB0YXNrcy4gV2FpdAorICAgICAgICAgICAgLy8gaGVyZSBmb3IgdGFza3MgdG8gY29tcGxldGUuIFRvIGF2b2lkIG1lbW9yeSBjb250ZW50aW9uLCBvbmx5IG1hc3RlciB0aHJlYWQgY2hlY2tzIHRlcm1pbmF0aW9uIGNvbmRpdGlvbi4KKyAgICAgICAgICAgIGttcF9mbGFnXzMyIGZsYWcoJnRhc2tfdGVhbS0+dHQudHRfdW5maW5pc2hlZF90aHJlYWRzLCAwVSk7CisgICAgICAgICAgICBmbGFnLndhaXQodGhpc190aHIsIFRSVUUKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopKTsKKyAgICAgICAgfQorICAgICAgICAvLyBEZWFjdGl2YXRlIHRoZSBvbGQgdGFzayB0ZWFtLCBzbyB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyB3aWxsIHN0b3AgcmVmZXJlbmNpbmcgaXQgd2hpbGUgc3Bpbm5pbmcuCisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfdGVhbV93YWl0OiBNYXN0ZXIgVCMlZCBkZWFjdGl2YXRpbmcgdGFza190ZWFtICVwOiAiCisgICAgICAgICAgICAgICAgICAgICAgInNldHRpbmcgYWN0aXZlIHRvIGZhbHNlLCBzZXR0aW5nIGxvY2FsIGFuZCB0ZWFtJ3MgcG9pbnRlciB0byBOVUxMXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2d0aWRfZnJvbV90aHJlYWQodGhpc190aHIpLCB0YXNrX3RlYW0pKTsKKyNpZiBPTVBfNDVfRU5BQkxFRAorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0tPnR0LnR0X25wcm9jID4gMSB8fCB0YXNrX3RlYW0tPnR0LnR0X2ZvdW5kX3Byb3h5X3Rhc2tzID09IFRSVUUgKTsKKyAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9mb3VuZF9wcm94eV90YXNrcywgRkFMU0UgKTsKKyNlbHNlCisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tfdGVhbS0+dHQudHRfbnByb2MgPiAxICk7CisjZW5kaWYKKyAgICAgICAgVENXX1NZTkNfNCggdGFza190ZWFtLT50dC50dF9hY3RpdmUsIEZBTFNFICk7CisgICAgICAgIEtNUF9NQigpOworCisgICAgICAgIFRDV19QVFIodGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbSwgTlVMTCk7CisgICAgfQorfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBfX2ttcF90YXNraW5nX2JhcnJpZXI6CisvLyBUaGlzIHJvdXRpbmUgbWF5IG9ubHkgY2FsbGVkIHdoZW4gX19rbXBfdGFza2luZ19tb2RlID09IHRza21fZXh0cmFfYmFycmllci4KKy8vIEludGVybmFsIGZ1bmN0aW9uIHRvIGV4ZWN1dGUgYWxsIHRhc2tzIHByaW9yIHRvIGEgcmVndWxhciBiYXJyaWVyIG9yIGEKKy8vIGpvaW4gYmFycmllci4gIEl0IGlzIGEgZnVsbCBiYXJyaWVyIGl0c2VsZiwgd2hpY2ggdW5mb3J0dW5hdGVseSB0dXJucworLy8gcmVndWxhciBiYXJyaWVycyBpbnRvIGRvdWJsZSBiYXJyaWVycyBhbmQgam9pbiBiYXJyaWVycyBpbnRvIDEgMS8yCisvLyBiYXJyaWVycy4KK3ZvaWQKK19fa21wX3Rhc2tpbmdfYmFycmllcigga21wX3RlYW1fdCAqdGVhbSwga21wX2luZm9fdCAqdGhyZWFkLCBpbnQgZ3RpZCApCit7CisgICAgdm9sYXRpbGUga21wX3VpbnQzMiAqc3BpbiA9ICZ0ZWFtLT50LnRfdGFza190ZWFtW3RocmVhZC0+dGgudGhfdGFza19zdGF0ZV0tPnR0LnR0X3VuZmluaXNoZWRfdGhyZWFkczsKKyAgICBpbnQgZmxhZyA9IEZBTFNFOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Rhc2tpbmdfbW9kZSA9PSB0c2ttX2V4dHJhX2JhcnJpZXIgKTsKKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9JTklUKCBzcGluLCAoa21wX3VpbnQzMiopIE5VTEwgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisgICAga21wX2ZsYWdfMzIgc3Bpbl9mbGFnKHNwaW4sIDBVKTsKKyAgICB3aGlsZSAoISBzcGluX2ZsYWcuZXhlY3V0ZV90YXNrcyh0aHJlYWQsIGd0aWQsIFRSVUUsICZmbGFnCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoTlVMTCksIDAgKSApIHsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIC8vIFRPRE86IFdoYXQgYWJvdXQgaXR0X3N5bmNfb2JqPz8KKyAgICAgICAgS01QX0ZTWU5DX1NQSU5fUFJFUEFSRSggc3BpbiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgICAgICBpZiggVENSXzQoX19rbXBfZ2xvYmFsLmcuZ19kb25lKSApIHsKKyAgICAgICAgICAgIGlmKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ICkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgICAgICBLTVBfWUlFTEQoIFRSVUUgKTsgICAgICAgLy8gR0g6IFdlIGFsd2F5cyB5aWVsZCBoZXJlCisgICAgfQorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggKHZvaWQqKSBzcGluICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCisKKyNpZiBPTVBfNDVfRU5BQkxFRAorCisvKiBfX2ttcF9naXZlX3Rhc2sgcHV0cyBhIHRhc2sgaW50byBhIGdpdmVuIHRocmVhZCBxdWV1ZSBpZjoKKyAgICAtIHRoZSBxdWV1ZSBmb3IgdGhhdCB0aHJlYWQgd2FzIGNyZWF0ZWQKKyAgICAtIHRoZXJlJ3Mgc3BhY2UgaW4gdGhhdCBxdWV1ZQorCisgICAgQmVjYXVzZSBvZiB0aGlzLCBfX2ttcF9wdXNoX3Rhc2sgbmVlZHMgdG8gY2hlY2sgaWYgdGhlcmUncyBzcGFjZSBhZnRlciBnZXR0aW5nIHRoZSBsb2NrCisgKi8KK3N0YXRpYyBib29sIF9fa21wX2dpdmVfdGFzayAoIGttcF9pbmZvX3QgKnRocmVhZCwga21wX2ludDMyIHRpZCwga21wX3Rhc2tfdCAqIHRhc2ssIGttcF9pbnQzMiBwYXNzICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqICAgIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEodGFzayk7CisgICAga21wX3Rhc2tfdGVhbV90ICoJdGFza190ZWFtID0gdGFza2RhdGEtPnRkX3Rhc2tfdGVhbTsKKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX2dpdmVfdGFzazogdHJ5aW5nIHRvIGdpdmUgdGFzayAlcCB0byB0aHJlYWQgJWQuXG4iLCB0YXNrZGF0YSwgdGlkICkgKTsKKworICAgIC8vIElmIHRhc2tfdGVhbSBpcyBOVUxMIHNvbWV0aGluZyB3ZW50IHJlYWxseSBiYWQuLi4KKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrX3RlYW0gIT0gTlVMTCApOworCisgICAgYm9vbCByZXN1bHQgPSBmYWxzZTsKKyAgICBrbXBfdGhyZWFkX2RhdGFfdCAqIHRocmVhZF9kYXRhID0gJiB0YXNrX3RlYW0gLT4gdHQudHRfdGhyZWFkc19kYXRhWyB0aWQgXTsKKworICAgIGlmICh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZSA9PSBOVUxMICkgeworICAgICAgICAvLyBUaGVyZSdzIG5vIHF1ZXVlIGluIHRoaXMgdGhyZWFkLCBnbyBmaW5kIGFub3RoZXIgb25lCisgICAgICAgIC8vIFdlJ3JlIGd1YXJhbnRlZWQgdGhhdCBhdCBsZWFzdCBvbmUgdGhyZWFkIGhhcyBhIHF1ZXVlCisgICAgICAgIEtBX1RSQUNFKDMwLCAoIl9fa21wX2dpdmVfdGFzazogdGhyZWFkICVkIGhhcyBubyBxdWV1ZSB3aGlsZSBnaXZpbmcgdGFzayAlcC5cbiIsIHRpZCwgdGFza2RhdGEgKSApOworICAgICAgICByZXR1cm4gcmVzdWx0OworICAgIH0KKworICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSApCisgICAgeworICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHF1ZXVlIGlzIGZ1bGwgd2hpbGUgZ2l2aW5nIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwgdGFza2RhdGEsIHRpZCApICk7CisKKyAgICAgICAgLy8gaWYgdGhpcyBkZXF1ZSBpcyBiaWdnZXIgdGhhbiB0aGUgcGFzcyByYXRpbyBnaXZlIGEgY2hhbmNlIHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgIGlmICggVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkvSU5JVElBTF9UQVNLX0RFUVVFX1NJWkUgPj0gcGFzcyApIHJldHVybiByZXN1bHQ7CisKKyAgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKyAgICAgICAgX19rbXBfcmVhbGxvY190YXNrX2RlcXVlKHRocmVhZCx0aHJlYWRfZGF0YSk7CisKKyAgICB9IGVsc2UgeworCisgICAgICAgX19rbXBfYWNxdWlyZV9ib290c3RyYXBfbG9jayggJiB0aHJlYWRfZGF0YS0+IHRkLnRkX2RlcXVlX2xvY2sgKTsKKworICAgICAgIGlmICggVENSXzQodGhyZWFkX2RhdGEgLT4gdGQudGRfZGVxdWVfbnRhc2tzKSA+PSBUQVNLX0RFUVVFX1NJWkUodGhyZWFkX2RhdGEtPnRkKSApCisgICAgICAgeworICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCJfX2ttcF9naXZlX3Rhc2s6IHF1ZXVlIGlzIGZ1bGwgd2hpbGUgZ2l2aW5nIHRhc2sgJXAgdG8gdGhyZWFkICVkLlxuIiwgdGFza2RhdGEsIHRpZCApICk7CisKKyAgICAgICAgICAgLy8gaWYgdGhpcyBkZXF1ZSBpcyBiaWdnZXIgdGhhbiB0aGUgcGFzcyByYXRpbyBnaXZlIGEgY2hhbmNlIHRvIGFub3RoZXIgdGhyZWFkCisgICAgICAgICAgIGlmICggVEFTS19ERVFVRV9TSVpFKHRocmVhZF9kYXRhLT50ZCkvSU5JVElBTF9UQVNLX0RFUVVFX1NJWkUgPj0gcGFzcyApCisgICAgICAgICAgICAgIGdvdG8gcmVsZWFzZV9hbmRfZXhpdDsKKworICAgICAgICAgICBfX2ttcF9yZWFsbG9jX3Rhc2tfZGVxdWUodGhyZWFkLHRocmVhZF9kYXRhKTsKKyAgICAgICB9CisgICAgfQorCisgICAgLy8gbG9jayBpcyBoZWxkIGhlcmUsIGFuZCB0aGVyZSBpcyBzcGFjZSBpbiB0aGUgZGVxdWUKKworICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlWyB0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV90YWlsIF0gPSB0YXNrZGF0YTsKKyAgICAvLyBXcmFwIGluZGV4LgorICAgIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgPSAoIHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX3RhaWwgKyAxICkgJiBUQVNLX0RFUVVFX01BU0sodGhyZWFkX2RhdGEtPnRkKTsKKyAgICBUQ1dfNCh0aHJlYWRfZGF0YSAtPiB0ZC50ZF9kZXF1ZV9udGFza3MsIFRDUl80KHRocmVhZF9kYXRhIC0+IHRkLnRkX2RlcXVlX250YXNrcykgKyAxKTsKKworICAgIHJlc3VsdCA9IHRydWU7CisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfZ2l2ZV90YXNrOiBzdWNjZXNzZnVsbHkgZ2F2ZSB0YXNrICVwIHRvIHRocmVhZCAlZC5cbiIsIHRhc2tkYXRhLCB0aWQgKSApOworCityZWxlYXNlX2FuZF9leGl0OgorICAgIF9fa21wX3JlbGVhc2VfYm9vdHN0cmFwX2xvY2soICYgdGhyZWFkX2RhdGEtPiB0ZC50ZF9kZXF1ZV9sb2NrICk7CisKKyAgICAgcmV0dXJuIHJlc3VsdDsKK30KKworCisvKiBUaGUgZmluaXNoIG9mIHRoZSBhIHByb3h5IHRhc2tzIGlzIGRpdmlkZWQgaW4gdHdvIHBpZWNlczoKKyAgICAtIHRoZSB0b3AgaGFsZiBpcyB0aGUgb25lIHRoYXQgY2FuIGJlIGRvbmUgZnJvbSBhIHRocmVhZCBvdXRzaWRlIHRoZSB0ZWFtCisgICAgLSB0aGUgYm90dG9tIGhhbGYgbXVzdCBiZSBydW4gZnJvbSBhIHRoZW0gd2l0aGluIHRoZSB0ZWFtCisKKyAgICBJbiBvcmRlciB0byBydW4gdGhlIGJvdHRvbSBoYWxmIHRoZSB0YXNrIGdldHMgcXVldWVkIGJhY2sgaW50byBvbmUgb2YgdGhlIHRocmVhZHMgb2YgdGhlIHRlYW0uCisgICAgT25jZSB0aGUgdGRfaW5jb21wbGV0ZV9jaGlsZF90YXNrIGNvdW50ZXIgb2YgdGhlIHBhcmVudCBpcyBkZWNyZW1lbnRlZCB0aGUgdGhyZWFkcyBjYW4gbGVhdmUgdGhlIGJhcnJpZXJzLgorICAgIFNvLCB0aGUgYm90dG9tIGhhbGYgbmVlZHMgdG8gYmUgcXVldWVkIGJlZm9yZSB0aGUgY291bnRlciBpcyBkZWNyZW1lbnRlZC4gVGhlIHRvcCBoYWxmIGlzIHRoZXJlZm9yZSBkaXZpZGVkIGluIHR3byBwYXJ0czoKKyAgICAtIHRoaW5ncyB0aGF0IGNhbiBiZSBydW4gYmVmb3JlIHF1ZXVpbmcgdGhlIGJvdHRvbSBoYWxmCisgICAgLSB0aGluZ3MgdGhhdCBtdXN0IGJlIHJ1biBhZnRlciBxdWV1aW5nIHRoZSBib3R0b20gaGFsZgorCisgICAgVGhpcyBjcmVhdGVzIGEgc2Vjb25kIHJhY2UgYXMgdGhlIGJvdHRvbSBoYWxmIGNhbiBmcmVlIHRoZSB0YXNrIGJlZm9yZSB0aGUgc2Vjb25kIHRvcCBoYWxmIGlzIGV4ZWN1dGVkLiBUbyBhdm9pZCB0aGlzCisgICAgd2UgdXNlIHRoZSB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2sgb2YgdGhlIHByb3h5IHRhc2sgdG8gc3luY2hyb25pemUgdGhlIHRvcCBhbmQgYm90dG9tIGhhbGYuCisqLworCitzdGF0aWMgdm9pZCBfX2ttcF9maXJzdF90b3BfaGFsZl9maW5pc2hfcHJveHkoIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMCApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmZyZWVkID09IDAgKTsKKworICAgIHRhc2tkYXRhIC0+IHRkX2ZsYWdzLmNvbXBsZXRlID0gMTsgICAvLyBtYXJrIHRoZSB0YXNrIGFzIGNvbXBsZXRlZAorCisgICAgaWYgKCB0YXNrZGF0YS0+dGRfdGFza2dyb3VwICkKKyAgICAgICBLTVBfVEVTVF9USEVOX0RFQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisKKyAgICAvLyBDcmVhdGUgYW4gaW1hZ2luYXJ5IGNoaWxkcmVuIGZvciB0aGlzIHRhc2sgc28gdGhlIGJvdHRvbSBoYWxmIGNhbm5vdCByZWxlYXNlIHRoZSB0YXNrIGJlZm9yZSB3ZSBoYXZlIGNvbXBsZXRlZCB0aGUgc2Vjb25kIHRvcCBoYWxmCisgICAgVENJXzQodGFza2RhdGEtPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpOworfQorCitzdGF0aWMgdm9pZCBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KCBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhICkKK3sKKyAgICBrbXBfaW50MzIgY2hpbGRyZW4gPSAwOworCisgICAgLy8gUHJlZGVjcmVtZW50IHNpbXVsYXRlZCBieSAiLSAxIiBjYWxjdWxhdGlvbgorICAgIGNoaWxkcmVuID0gS01QX1RFU1RfVEhFTl9ERUMzMiggKGttcF9pbnQzMiAqKSgmIHRhc2tkYXRhIC0+IHRkX3BhcmVudCAtPiB0ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSApIC0gMTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBjaGlsZHJlbiA+PSAwICk7CisKKyAgICAvLyBSZW1vdmUgdGhlIGltYWdpbmFyeSBjaGlsZHJlbgorICAgIFRDRF80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKTsKK30KKworc3RhdGljIHZvaWQgX19rbXBfYm90dG9tX2hhbGZfZmluaXNoX3Byb3h5KCBrbXBfaW50MzIgZ3RpZCwga21wX3Rhc2tfdCAqIHB0YXNrICkKK3sKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEocHRhc2spOworICAgIGttcF9pbmZvX3QgKiB0aHJlYWQgPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YSAtPiB0ZF9mbGFncy5wcm94eSA9PSBUQVNLX1BST1hZICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEgLT4gdGRfZmxhZ3MuY29tcGxldGUgPT0gMSApOyAvLyB0b3AgaGFsZiBtdXN0IHJ1biBiZWZvcmUgYm90dG9tIGhhbGYKKworICAgIC8vIFdlIG5lZWQgdG8gd2FpdCB0byBtYWtlIHN1cmUgdGhlIHRvcCBoYWxmIGlzIGZpbmlzaGVkCisgICAgLy8gU3Bpbm5pbmcgaGVyZSBzaG91bGQgYmUgb2sgYXMgdGhpcyBzaG91bGQgaGFwcGVuIHF1aWNrbHkKKyAgICB3aGlsZSAoIFRDUl80KHRhc2tkYXRhLT50ZF9pbmNvbXBsZXRlX2NoaWxkX3Rhc2tzKSA+IDAgKSA7CisKKyAgICBfX2ttcF9yZWxlYXNlX2RlcHMoZ3RpZCx0YXNrZGF0YSk7CisgICAgX19rbXBfZnJlZV90YXNrX2FuZF9hbmNlc3RvcnMoZ3RpZCwgdGFza2RhdGEsIHRocmVhZCk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGd0aWQgR2xvYmFsIFRocmVhZCBJRCBvZiBlbmNvdW50ZXJpbmcgdGhyZWFkCitAcGFyYW0gcHRhc2sgVGFzayB3aGljaCBleGVjdXRpb24gaXMgY29tcGxldGVkCisKK0V4ZWN1dGUgdGhlIGNvbXBsZXRhdGlvbiBvZiBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCBvZiB0aGF0IGlzIHBhcnQgb2YgdGhlIHRlYW0uIFJ1biBmaXJzdCBhbmQgYm90dG9tIGhhbHZlcyBkaXJlY3RseS4KKyovCit2b2lkIF9fa21wY19wcm94eV90YXNrX2NvbXBsZXRlZCgga21wX2ludDMyIGd0aWQsIGttcF90YXNrX3QgKnB0YXNrICkKK3sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwdGFzayAhPSBOVUxMICk7CisgICAga21wX3Rhc2tkYXRhX3QgKiB0YXNrZGF0YSA9IEtNUF9UQVNLX1RPX1RBU0tEQVRBKHB0YXNrKTsKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9wcm94eV90YXNrX2NvbXBsZXRlZChlbnRlcik6IFQjJWQgcHJveHkgdGFzayAlcCBjb21wbGV0aW5nXG4iLCBndGlkLCB0YXNrZGF0YSApICk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YS0+dGRfZmxhZ3MucHJveHkgPT0gVEFTS19QUk9YWSApOworCisgICAgX19rbXBfZmlyc3RfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKyAgICBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKyAgICBfX2ttcF9ib3R0b21faGFsZl9maW5pc2hfcHJveHkoZ3RpZCxwdGFzayk7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF9wcm94eV90YXNrX2NvbXBsZXRlZChleGl0KTogVCMlZCBwcm94eSB0YXNrICVwIGNvbXBsZXRpbmdcbiIsIGd0aWQsIHRhc2tkYXRhICkgKTsKK30KKworLyohCitAaW5ncm91cCBUQVNLSU5HCitAcGFyYW0gcHRhc2sgVGFzayB3aGljaCBleGVjdXRpb24gaXMgY29tcGxldGVkCisKK0V4ZWN1dGUgdGhlIGNvbXBsZXRhdGlvbiBvZiBhIHByb3h5IHRhc2sgZnJvbSBhIHRocmVhZCB0aGF0IGNvdWxkIG5vdCBiZWxvbmcgdG8gdGhlIHRlYW0uCisqLwordm9pZCBfX2ttcGNfcHJveHlfdGFza19jb21wbGV0ZWRfb29vICgga21wX3Rhc2tfdCAqcHRhc2sgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoIHB0YXNrICE9IE5VTEwgKTsKKyAgICBrbXBfdGFza2RhdGFfdCAqIHRhc2tkYXRhID0gS01QX1RBU0tfVE9fVEFTS0RBVEEocHRhc2spOworCisgICAgS0FfVFJBQ0UoMTAsICgiX19rbXBfcHJveHlfdGFza19jb21wbGV0ZWRfb29vKGVudGVyKTogcHJveHkgdGFzayBjb21wbGV0aW5nIG9vbyAlcFxuIiwgdGFza2RhdGEgKSApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGFza2RhdGEtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfUFJPWFkgKTsKKworICAgIF9fa21wX2ZpcnN0X3RvcF9oYWxmX2ZpbmlzaF9wcm94eSh0YXNrZGF0YSk7CisKKyAgICAvLyBFbnF1ZXVlIHRhc2sgdG8gY29tcGxldGUgYm90dG9tIGhhbGYgY29tcGxldGlvbiBmcm9tIGEgdGhyZWFkIHdpdGhpbiB0aGUgY29ycmVzcG9uZGluZyB0ZWFtCisgICAga21wX3RlYW1fdCAqIHRlYW0gPSB0YXNrZGF0YS0+dGRfdGVhbTsKKyAgICBrbXBfaW50MzIgbnRocmVhZHMgPSB0ZWFtLT50LnRfbnByb2M7CisgICAga21wX2luZm9fdCAqdGhyZWFkOworCisgICAgLy9UaGlzIHNob3VsZCBiZSBzaW1pbGFyIHRvIHN0YXJ0X2sgPSBfX2ttcF9nZXRfcmFuZG9tKCB0aHJlYWQgKSAlIG50aHJlYWRzIGJ1dCB3ZSBjYW5ub3QgdXNlIF9fa21wX2dldF9yYW5kb20gaGVyZQorICAgIGttcF9pbnQzMiBzdGFydF9rID0gMDsKKyAgICBrbXBfaW50MzIgcGFzcyA9IDE7CisgICAga21wX2ludDMyIGsgPSBzdGFydF9rOworCisgICAgZG8geworICAgICAgICAvL0ZvciBub3cgd2UncmUganVzdCBsaW5lYXJseSB0cnlpbmcgdG8gZmluZCBhIHRocmVhZAorICAgICAgICB0aHJlYWQgPSB0ZWFtLT50LnRfdGhyZWFkc1trXTsKKyAgICAgICAgayA9IChrKzEpICUgbnRocmVhZHM7CisKKyAgICAgICAgLy8gd2UgZGlkIGEgZnVsbCBwYXNzIHRocm91Z2ggYWxsIHRoZSB0aHJlYWRzCisgICAgICAgIGlmICggayA9PSBzdGFydF9rICkgcGFzcyA9IHBhc3MgPDwgMTsKKworICAgIH0gd2hpbGUgKCAhX19rbXBfZ2l2ZV90YXNrKCB0aHJlYWQsIGssICBwdGFzaywgcGFzcyApICk7CisKKyAgICBfX2ttcF9zZWNvbmRfdG9wX2hhbGZfZmluaXNoX3Byb3h5KHRhc2tkYXRhKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wX3Byb3h5X3Rhc2tfY29tcGxldGVkX29vbyhleGl0KTogcHJveHkgdGFzayBjb21wbGV0aW5nIG9vbyAlcFxuIiwgdGFza2RhdGEgKSApOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza19kdXBfYWxsb2M6IEFsbG9jYXRlIHRoZSB0YXNrZGF0YSBhbmQgbWFrZSBhIGNvcHkgb2Ygc291cmNlIHRhc2sgZm9yIHRhc2tsb29wCisvLworLy8gdGhyZWFkOiAgIGFsbG9jYXRpbmcgdGhyZWFkCisvLyB0YXNrX3NyYzogcG9pbnRlciB0byBzb3VyY2UgdGFzayB0byBiZSBkdXBsaWNhdGVkCisvLyByZXR1cm5zOiAgYSBwb2ludGVyIHRvIHRoZSBhbGxvY2F0ZWQga21wX3Rhc2tfdCBzdHJ1Y3R1cmUgKHRhc2spLgora21wX3Rhc2tfdCAqCitfX2ttcF90YXNrX2R1cF9hbGxvYygga21wX2luZm9fdCAqdGhyZWFkLCBrbXBfdGFza190ICp0YXNrX3NyYyApCit7CisgICAga21wX3Rhc2tfdCAgICAgKnRhc2s7CisgICAga21wX3Rhc2tkYXRhX3QgKnRhc2tkYXRhOworICAgIGttcF90YXNrZGF0YV90ICp0YXNrZGF0YV9zcmM7CisgICAga21wX3Rhc2tkYXRhX3QgKnBhcmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAgc2l6ZV90IHNoYXJlZHNfb2Zmc2V0OworICAgIHNpemVfdCB0YXNrX3NpemU7CisKKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcF90YXNrX2R1cF9hbGxvYyhlbnRlcik6IFRoICVwLCBzb3VyY2UgdGFzayAlcFxuIiwgdGhyZWFkLCB0YXNrX3NyYykgKTsKKyAgICB0YXNrZGF0YV9zcmMgPSBLTVBfVEFTS19UT19UQVNLREFUQSggdGFza19zcmMgKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YV9zcmMtPnRkX2ZsYWdzLnByb3h5ID09IFRBU0tfRlVMTCApOyAvLyBpdCBzaG91bGQgbm90IGJlIHByb3h5IHRhc2sKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrZGF0YV9zcmMtPnRkX2ZsYWdzLnRhc2t0eXBlID09IFRBU0tfRVhQTElDSVQgKTsKKyAgICB0YXNrX3NpemUgPSB0YXNrZGF0YV9zcmMtPnRkX3NpemVfYWxsb2M7CisKKyAgICAvLyBBbGxvY2F0ZSBhIGttcF90YXNrZGF0YV90IGJsb2NrIGFuZCBhIGttcF90YXNrX3QgYmxvY2suCisgICAgS0FfVFJBQ0UoMzAsICgiX19rbXBfdGFza19kdXBfYWxsb2M6IFRoICVwLCBtYWxsb2Mgc2l6ZSAlbGRcbiIsIHRocmVhZCwgdGFza19zaXplKSApOworICAgICNpZiBVU0VfRkFTVF9NRU1PUlkKKyAgICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKV9fa21wX2Zhc3RfYWxsb2NhdGUoIHRocmVhZCwgdGFza19zaXplICk7CisgICAgI2Vsc2UKKyAgICB0YXNrZGF0YSA9IChrbXBfdGFza2RhdGFfdCAqKV9fa21wX3RocmVhZF9tYWxsb2MoIHRocmVhZCwgdGFza19zaXplICk7CisgICAgI2VuZGlmIC8qIFVTRV9GQVNUX01FTU9SWSAqLworICAgIEtNUF9NRU1DUFkodGFza2RhdGEsIHRhc2tkYXRhX3NyYywgdGFza19zaXplKTsKKworICAgIHRhc2sgPSBLTVBfVEFTS0RBVEFfVE9fVEFTSyh0YXNrZGF0YSk7CisKKyAgICAvLyBJbml0aWFsaXplIG5ldyB0YXNrIChvbmx5IHNwZWNpZmljIGZpZWxkcyBub3QgYWZmZWN0ZWQgYnkgbWVtY3B5KQorICAgIHRhc2tkYXRhLT50ZF90YXNrX2lkID0gS01QX0dFTl9UQVNLX0lEKCk7CisgICAgaWYoIHRhc2stPnNoYXJlZHMgIT0gTlVMTCApIHsgLy8gbmVlZCBzZXR1cCBzaGFyZWRzIHBvaW50ZXIKKyAgICAgICAgc2hhcmVkc19vZmZzZXQgPSAoY2hhciopdGFza19zcmMtPnNoYXJlZHMgLSAoY2hhciopdGFza2RhdGFfc3JjOworICAgICAgICB0YXNrLT5zaGFyZWRzID0gJigoY2hhciopdGFza2RhdGEpW3NoYXJlZHNfb2Zmc2V0XTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggKCgoa21wX3VpbnRwdHJfdCl0YXNrLT5zaGFyZWRzKSAmIChzaXplb2Yodm9pZCopLTEpKSA9PSAwICk7CisgICAgfQorICAgIHRhc2tkYXRhLT50ZF9hbGxvY190aHJlYWQgPSB0aHJlYWQ7CisgICAgdGFza2RhdGEtPnRkX3Rhc2tncm91cCA9IHBhcmVudF90YXNrLT50ZF90YXNrZ3JvdXA7IC8vIHRhc2sgaW5oZXJpdHMgdGhlIHRhc2tncm91cCBmcm9tIHRoZSBwYXJlbnQgdGFzaworCisgICAgLy8gT25seSBuZWVkIHRvIGtlZXAgdHJhY2sgb2YgY2hpbGQgdGFzayBjb3VudHMgaWYgdGVhbSBwYXJhbGxlbCBhbmQgdGFza2luZyBub3Qgc2VyaWFsaXplZAorICAgIGlmICggISggdGFza2RhdGEtPnRkX2ZsYWdzLnRlYW1fc2VyaWFsIHx8IHRhc2tkYXRhLT50ZF9mbGFncy50YXNraW5nX3NlciApICkgeworICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX2luY29tcGxldGVfY2hpbGRfdGFza3MpICk7CisgICAgICAgIGlmICggcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgcGFyZW50X3Rhc2stPnRkX3Rhc2tncm91cC0+Y291bnQpICk7CisgICAgICAgIC8vIE9ubHkgbmVlZCB0byBrZWVwIHRyYWNrIG9mIGFsbG9jYXRlZCBjaGlsZCB0YXNrcyBmb3IgZXhwbGljaXQgdGFza3Mgc2luY2UgaW1wbGljaXQgbm90IGRlYWxsb2NhdGVkCisgICAgICAgIGlmICggdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfZmxhZ3MudGFza3R5cGUgPT0gVEFTS19FWFBMSUNJVCApCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX0lOQzMyKCAoa21wX2ludDMyICopKCYgdGFza2RhdGEtPnRkX3BhcmVudC0+dGRfYWxsb2NhdGVkX2NoaWxkX3Rhc2tzKSApOworICAgIH0KKworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3Rhc2tfZHVwX2FsbG9jKGV4aXQpOiBUaCAlcCwgY3JlYXRlZCB0YXNrICVwLCBwYXJlbnQ9JXBcbiIsCisgICAgICAgICAgICAgICAgICB0aHJlYWQsIHRhc2tkYXRhLCB0YXNrZGF0YS0+dGRfcGFyZW50KSApOworI2lmIE9NUFRfU1VQUE9SVAorICAgIF9fa21wX3Rhc2tfaW5pdF9vbXB0KHRhc2tkYXRhLCB0aHJlYWQtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwgKHZvaWQqKXRhc2stPnJvdXRpbmUpOworI2VuZGlmCisgICAgcmV0dXJuIHRhc2s7Cit9CisKKy8vIFJvdXRpbmUgb3B0aW9uYWxseSBnZW5lcmF0ZWQgYnkgdGggZWNvbXBpbGVyIGZvciBzZXR0aW5nIHRoZSBsYXN0cHJpdmF0ZSBmbGFnCisvLyBhbmQgY2FsbGluZyBuZWVkZWQgY29uc3RydWN0b3JzIGZvciBwcml2YXRlL2ZpcnN0cHJpdmF0ZSBvYmplY3RzCisvLyAodXNlZCB0byBmb3JtIHRhc2tsb29wIHRhc2tzIGZyb20gcGF0dGVybiB0YXNrKQordHlwZWRlZiB2b2lkKCpwX3Rhc2tfZHVwX3QpKGttcF90YXNrX3QgKiwga21wX3Rhc2tfdCAqLCBrbXBfaW50MzIpOworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gX19rbXBfdGFza2xvb3BfbGluZWFyOiBTdGFydCB0YXNrcyBvZiB0aGUgdGFza2xvb3AgbGluZWFybHkKKy8vCisvLyBsb2MgICAgICAgU291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisvLyBndGlkICAgICAgR2xvYmFsIHRocmVhZCBJRAorLy8gdGFzayAgICAgIFRhc2sgd2l0aCB3aG9sZSBsb29wIGl0ZXJhdGlvbiByYW5nZQorLy8gbGIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCBsb3dlciBib3VuZAorLy8gdWIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCB1cHBlciBib3VuZAorLy8gc3QgICAgICAgIExvb3Agc3RyaWRlCisvLyBzY2hlZCAgICAgU2NoZWR1bGUgc3BlY2lmaWVkIDAvMS8yIGZvciBub25lL2dyYWluc2l6ZS9udW1fdGFza3MKKy8vIGdyYWluc2l6ZSBTY2hlZHVsZSB2YWx1ZSBpZiBzcGVjaWZpZWQKKy8vIHRhc2tfZHVwICBUYXNrcyBkdXBsaWNhdGlvbiByb3V0aW5lCit2b2lkCitfX2ttcF90YXNrbG9vcF9saW5lYXIoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBpbnQgc2NoZWQsIGttcF91aW50NjQgZ3JhaW5zaXplLCB2b2lkICp0YXNrX2R1cCApCit7CisgICAgS01QX0NPVU5UX0JMT0NLKE9NUF9UQVNLTE9PUCk7CisgICAgS01QX1RJTUVfUEFSVElUSU9ORURfQkxPQ0soT01QX3Rhc2tsb29wX3NjaGVkdWxpbmcpOworICAgIHBfdGFza19kdXBfdCBwdGFza19kdXAgPSAocF90YXNrX2R1cF90KXRhc2tfZHVwOworICAgIGttcF91aW50NjQgdGM7CisgICAga21wX3VpbnQ2NCBsb3dlciA9ICpsYjsgLy8gY29tcGlsZXIgcHJvdmlkZXMgZ2xvYmFsIGJvdW5kcyBoZXJlCisgICAga21wX3VpbnQ2NCB1cHBlciA9ICp1YjsKKyAgICBrbXBfdWludDY0IGksIG51bV90YXNrcyA9IDAsIGV4dHJhcyA9IDA7CisgICAga21wX2luZm9fdCAqdGhyZWFkID0gX19rbXBfdGhyZWFkc1tndGlkXTsKKyAgICBrbXBfdGFza2RhdGFfdCAqY3VycmVudF90YXNrID0gdGhyZWFkLT50aC50aF9jdXJyZW50X3Rhc2s7CisgICAga21wX3Rhc2tfdCAqbmV4dF90YXNrOworICAgIGttcF9pbnQzMiBsYXN0cHJpdiA9IDA7CisgICAgc2l6ZV90IGxvd2VyX29mZnNldCA9IChjaGFyKilsYiAtIChjaGFyKil0YXNrOyAvLyByZW1lbWJlciBvZmZzZXQgb2YgbGIgaW4gdGhlIHRhc2sgc3RydWN0dXJlCisgICAgc2l6ZV90IHVwcGVyX29mZnNldCA9IChjaGFyKil1YiAtIChjaGFyKil0YXNrOyAvLyByZW1lbWJlciBvZmZzZXQgb2YgdWIgaW4gdGhlIHRhc2sgc3RydWN0dXJlCisKKyAgICAvLyBjb21wdXRlIHRyaXAgY291bnQKKyAgICBpZiAoIHN0ID09IDEgKSB7ICAgLy8gbW9zdCBjb21tb24gY2FzZQorICAgICAgICB0YyA9IHVwcGVyIC0gbG93ZXIgKyAxOworICAgIH0gZWxzZSBpZiAoIHN0IDwgMCApIHsKKyAgICAgICAgdGMgPSAobG93ZXIgLSB1cHBlcikgLyAoLXN0KSArIDE7CisgICAgfSBlbHNlIHsgICAgICAgLy8gc3QgPiAwCisgICAgICAgIHRjID0gKHVwcGVyIC0gbG93ZXIpIC8gc3QgKyAxOworICAgIH0KKyAgICBpZih0YyA9PSAwKSB7CisgICAgICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wY190YXNrbG9vcChleGl0KTogVCMlZCB6ZXJvLXRyaXAgbG9vcFxuIiwgZ3RpZCkpOworICAgICAgICAvLyBmcmVlIHRoZSBwYXR0ZXJuIHRhc2sgYW5kIGV4aXQKKyAgICAgICAgX19rbXBfdGFza19zdGFydCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisgICAgICAgIC8vIGRvIG5vdCBleGVjdXRlIGFueXRoaW5nIGZvciB6ZXJvLXRyaXAgbG9vcAorICAgICAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisKKyAgICAvLyBjb21wdXRlIG51bV90YXNrcy9ncmFpbnNpemUgYmFzZWQgb24gdGhlIGlucHV0IHByb3ZpZGVkCisgICAgc3dpdGNoKCBzY2hlZCApIHsKKyAgICBjYXNlIDA6IC8vIG5vIHNjaGVkdWxlIGNsYXVzZSBzcGVjaWZpZWQsIHdlIGNhbiBjaG9vc2UgdGhlIGRlZmF1bHQKKyAgICAgICAgICAgIC8vIGxldCdzIHRyeSB0byBzY2hlZHVsZSAodGVhbV9zaXplKjEwKSB0YXNrcworICAgICAgICBncmFpbnNpemUgPSB0aHJlYWQtPnRoLnRoX3RlYW1fbnByb2MgKiAxMDsKKyAgICBjYXNlIDI6IC8vIG51bV90YXNrcyBwcm92aWRlZAorICAgICAgICBpZiggZ3JhaW5zaXplID4gdGMgKSB7CisgICAgICAgICAgICBudW1fdGFza3MgPSB0YzsgICAvLyB0b28gYmlnIG51bV90YXNrcyByZXF1ZXN0ZWQsIGFkanVzdCB2YWx1ZXMKKyAgICAgICAgICAgIGdyYWluc2l6ZSA9IDE7CisgICAgICAgICAgICBleHRyYXMgPSAwOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgbnVtX3Rhc2tzID0gZ3JhaW5zaXplOworICAgICAgICAgICAgZ3JhaW5zaXplID0gdGMgLyBudW1fdGFza3M7CisgICAgICAgICAgICBleHRyYXMgPSB0YyAlIG51bV90YXNrczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBjYXNlIDE6IC8vIGdyYWluc2l6ZSBwcm92aWRlZAorICAgICAgICBpZiggZ3JhaW5zaXplID4gdGMgKSB7CisgICAgICAgICAgICBudW1fdGFza3MgPSAxOyAgICAvLyB0b28gYmlnIGdyYWluc2l6ZSByZXF1ZXN0ZWQsIGFkanVzdCB2YWx1ZXMKKyAgICAgICAgICAgIGdyYWluc2l6ZSA9IHRjOworICAgICAgICAgICAgZXh0cmFzID0gMDsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIG51bV90YXNrcyA9IHRjIC8gZ3JhaW5zaXplOworICAgICAgICAgICAgZ3JhaW5zaXplID0gdGMgLyBudW1fdGFza3M7IC8vIGFkanVzdCBncmFpbnNpemUgZm9yIGJhbGFuY2VkIGRpc3RyaWJ1dGlvbiBvZiBpdGVyYXRpb25zCisgICAgICAgICAgICBleHRyYXMgPSB0YyAlIG51bV90YXNrczsKKyAgICAgICAgfQorICAgICAgICBicmVhazsKKyAgICBkZWZhdWx0OgorICAgICAgICBLTVBfQVNTRVJUMigwLCAidW5rbm93biBzY2hlZHVsaW5nIG9mIHRhc2tsb29wIik7CisgICAgfQorICAgIEtNUF9ERUJVR19BU1NFUlQodGMgPT0gbnVtX3Rhc2tzICogZ3JhaW5zaXplICsgZXh0cmFzKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKG51bV90YXNrcyA+IGV4dHJhcyk7CisgICAgS01QX0RFQlVHX0FTU0VSVChudW1fdGFza3MgPiAwKTsKKyAgICBLQV9UUkFDRSgyMCwgKCJfX2ttcGNfdGFza2xvb3A6IFQjJWQgd2lsbCBsYXVuY2g6IG51bV90YXNrcyAlbGxkLCBncmFpbnNpemUgJWxsZCwgZXh0cmFzICVsbGRcbiIsCisgICAgICAgICAgICAgICAgICBndGlkLCBudW1fdGFza3MsIGdyYWluc2l6ZSwgZXh0cmFzKSk7CisKKyAgICAvLyBNYWluIGxvb3AsIGxhdW5jaCBudW1fdGFza3MgdGFza3MsIGFzc2lnbiBncmFpbnNpemUgaXRlcmF0aW9ucyBlYWNoIHRhc2sKKyAgICBmb3IoIGkgPSAwOyBpIDwgbnVtX3Rhc2tzOyArK2kgKSB7CisgICAgICAgIGttcF91aW50NjQgY2h1bmtfbWludXNfMTsKKyAgICAgICAgaWYoIGV4dHJhcyA9PSAwICkgeworICAgICAgICAgICAgY2h1bmtfbWludXNfMSA9IGdyYWluc2l6ZSAtIDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBjaHVua19taW51c18xID0gZ3JhaW5zaXplOworICAgICAgICAgICAgLS1leHRyYXM7IC8vIGZpcnN0IGV4dHJhcyBpdGVyYXRpb25zIGdldCBiaWdnZXIgY2h1bmsgKGdyYWluc2l6ZSsxKQorICAgICAgICB9CisgICAgICAgIHVwcGVyID0gbG93ZXIgKyBzdCAqIGNodW5rX21pbnVzXzE7CisgICAgICAgIGlmKCBpID09IG51bV90YXNrcyAtIDEgKSB7CisgICAgICAgICAgICAvLyBzY2hlZHVsZSB0aGUgbGFzdCB0YXNrLCBzZXQgbGFzdHByaXZhdGUgZmxhZworICAgICAgICAgICAgbGFzdHByaXYgPSAxOworI2lmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoIHN0ID09IDEgKQorICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQodXBwZXIgPT0gKnViKTsKKyAgICAgICAgICAgIGVsc2UgaWYoIHN0ID4gMCApCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh1cHBlcitzdCA+ICp1Yik7CisgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCh1cHBlcitzdCA8ICp1Yik7CisjZW5kaWYKKyAgICAgICAgfQorICAgICAgICBuZXh0X3Rhc2sgPSBfX2ttcF90YXNrX2R1cF9hbGxvYyh0aHJlYWQsIHRhc2spOyAvLyBhbGxvY2F0ZSBuZXcgdGFzaworICAgICAgICAqKGttcF91aW50NjQqKSgoY2hhciopbmV4dF90YXNrICsgbG93ZXJfb2Zmc2V0KSA9IGxvd2VyOyAvLyBhZGp1c3QgdGFzay1zcGVjaWZpYyBib3VuZHMKKyAgICAgICAgKihrbXBfdWludDY0KikoKGNoYXIqKW5leHRfdGFzayArIHVwcGVyX29mZnNldCkgPSB1cHBlcjsKKyAgICAgICAgaWYoIHB0YXNrX2R1cCAhPSBOVUxMICkKKyAgICAgICAgICAgIHB0YXNrX2R1cChuZXh0X3Rhc2ssIHRhc2ssIGxhc3Rwcml2KTsgLy8gc2V0IGxhc3Rwcml2YXRlIGZsYWcsIGNvbnN0cnVjdCBmaXN0cHJpdmF0ZXMsIGV0Yy4KKyAgICAgICAgS0FfVFJBQ0UoMjAsICgiX19rbXBjX3Rhc2tsb29wOiBUIyVkIHNjaGVkdWxlIHRhc2sgJXA6IGxvd2VyICVsbGQsIHVwcGVyICVsbGQgKG9mZnNldHMgJXAgJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIG5leHRfdGFzaywgbG93ZXIsIHVwcGVyLCBsb3dlcl9vZmZzZXQsIHVwcGVyX29mZnNldCkpOworICAgICAgICBfX2ttcF9vbXBfdGFzayhndGlkLCBuZXh0X3Rhc2ssIHRydWUpOyAvLyBzY2hlZHVsZSBuZXcgdGFzaworICAgICAgICBsb3dlciA9IHVwcGVyICsgc3Q7IC8vIGFkanVzdCBsb3dlciBib3VuZCBmb3IgdGhlIG5leHQgaXRlcmF0aW9uCisgICAgfQorICAgIC8vIGZyZWUgdGhlIHBhdHRlcm4gdGFzayBhbmQgZXhpdAorICAgIF9fa21wX3Rhc2tfc3RhcnQoIGd0aWQsIHRhc2ssIGN1cnJlbnRfdGFzayApOworICAgIC8vIGRvIG5vdCBleGVjdXRlIHRoZSBwYXR0ZXJuIHRhc2ssIGp1c3QgZG8gYm9va2tlZXBpbmcKKyAgICBfX2ttcF90YXNrX2ZpbmlzaCggZ3RpZCwgdGFzaywgY3VycmVudF90YXNrICk7Cit9CisKKy8qIQorQGluZ3JvdXAgVEFTS0lORworQHBhcmFtIGxvYyAgICAgICBTb3VyY2UgbG9jYXRpb24gaW5mb3JtYXRpb24KK0BwYXJhbSBndGlkICAgICAgR2xvYmFsIHRocmVhZCBJRAorQHBhcmFtIHRhc2sgICAgICBUYXNrIHN0cnVjdHVyZQorQHBhcmFtIGlmX3ZhbCAgICBWYWx1ZSBvZiB0aGUgaWYgY2xhdXNlCitAcGFyYW0gbGIgICAgICAgIFBvaW50ZXIgdG8gbG9vcCBsb3dlciBib3VuZAorQHBhcmFtIHViICAgICAgICBQb2ludGVyIHRvIGxvb3AgdXBwZXIgYm91bmQKK0BwYXJhbSBzdCAgICAgICAgTG9vcCBzdHJpZGUKK0BwYXJhbSBub2dyb3VwICAgRmxhZywgMSBpZiBub2dyb3VwIGNsYXVzZSBzcGVjaWZpZWQsIDAgb3RoZXJ3aXNlCitAcGFyYW0gc2NoZWQgICAgIFNjaGVkdWxlIHNwZWNpZmllZCAwLzEvMiBmb3Igbm9uZS9ncmFpbnNpemUvbnVtX3Rhc2tzCitAcGFyYW0gZ3JhaW5zaXplIFNjaGVkdWxlIHZhbHVlIGlmIHNwZWNpZmllZAorQHBhcmFtIHRhc2tfZHVwICBUYXNrcyBkdXBsaWNhdGlvbiByb3V0aW5lCisKK0V4ZWN1dGUgdGhlIHRhc2tsb29wIGNvbnN0cnVjdC4KKyovCit2b2lkCitfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywgaW50IGlmX3ZhbCwKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBpbnQgbm9ncm91cCwgaW50IHNjaGVkLCBrbXBfdWludDY0IGdyYWluc2l6ZSwgdm9pZCAqdGFza19kdXAgKQoreworICAgIGttcF90YXNrZGF0YV90ICogdGFza2RhdGEgPSBLTVBfVEFTS19UT19UQVNLREFUQSh0YXNrKTsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCB0YXNrICE9IE5VTEwgKTsKKworICAgIEtBX1RSQUNFKDEwLCAoIl9fa21wY190YXNrbG9vcChlbnRlcik6IFQjJWQsIHBhdHRlcm4gdGFzayAlcCwgbGIgJWxsZCB1YiAlbGxkIHN0ICVsbGQsIGdyYWluICVsbHUoJWQpXG4iLAorICAgICAgICBndGlkLCB0YXNrZGF0YSwgKmxiLCAqdWIsIHN0LCBncmFpbnNpemUsIHNjaGVkKSk7CisKKyAgICAvLyBjaGVjayBpZiBjbGF1c2UgdmFsdWUgZmlyc3QKKyAgICBpZiggaWZfdmFsID09IDAgKSB7IC8vIGlmKDApIHNwZWNpZmllZCwgbWFyayB0YXNrIGFzIHNlcmlhbAorICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGFza19zZXJpYWwgPSAxOworICAgICAgICB0YXNrZGF0YS0+dGRfZmxhZ3MudGllZG5lc3MgPSBUQVNLX1RJRUQ7IC8vIEFDOiBzZXJpYWwgdGFzayBjYW5ub3QgYmUgdW50aWVkCisgICAgfQorICAgIGlmKCBub2dyb3VwID09IDAgKSB7CisgICAgICAgIF9fa21wY190YXNrZ3JvdXAoIGxvYywgZ3RpZCApOworICAgIH0KKworICAgIGlmKCAxIC8qIEFDOiB1c2Ugc29tZSBoZXVyaXN0aWMgaGVyZSB0byBjaG9vc2UgdGFzayBzY2hlZHVsaW5nIG1ldGhvZCAqLyApIHsKKyAgICAgICAgX19rbXBfdGFza2xvb3BfbGluZWFyKCBsb2MsIGd0aWQsIHRhc2ssIGxiLCB1Yiwgc3QsIHNjaGVkLCBncmFpbnNpemUsIHRhc2tfZHVwICk7CisgICAgfQorCisgICAgaWYoIG5vZ3JvdXAgPT0gMCApIHsKKyAgICAgICAgX19rbXBjX2VuZF90YXNrZ3JvdXAoIGxvYywgZ3RpZCApOworICAgIH0KKyAgICBLQV9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza2xvb3AoZXhpdCk6IFQjJWRcbiIsIGd0aWQpKTsKK30KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3Rhc2txLmMgYi9yYzMvcnVudGltZS9zcmMva21wX3Rhc2txLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzA3OWQ0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGFza3EuYwpAQCAtMCwwICsxLDIwMzIgQEAKKy8qCisgKiBrbXBfdGFza3EuYyAtLSBUQVNLUSBzdXBwb3J0IGZvciBPcGVuTVAuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9lcnJvci5oIgorCisjZGVmaW5lIE1BWF9NRVNTQUdFIDUxMgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogVGFza3Egcm91dGluZXMgYW5kIGdsb2JhbCB2YXJpYWJsZXMKKyAqLworCisjZGVmaW5lIEtNUF9ERUJVR19SRUZfQ1RTKHgpICAgIEtGX1RSQUNFKDEsIHgpOworCisjZGVmaW5lIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKworc3RhdGljIGludAoraW5fcGFyYWxsZWxfY29udGV4dCgga21wX3RlYW1fdCAqdGVhbSApCit7CisgICAgcmV0dXJuICEgdGVhbSAtPiB0LnRfc2VyaWFsaXplZDsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX2VvKCBpbnQgKmd0aWRfcmVmLCBpbnQgKmNpZF9yZWYsIGlkZW50X3QgKmxvY19yZWYgKQoreworICAgIGludCAgICAgICAgICAgICAgICBndGlkID0gKmd0aWRfcmVmOworICAgIGludCAgICAgICAgICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF91aW50MzIgICAgICAgICBteV90b2tlbjsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqdGFza3E7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxICAgPSAmIF9fa21wX3RocmVhZHNbZ3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisjaWYgS01QX1VTRV9EWU5BTUlDX0xPQ0sKKyAgICAgICAgX19rbXBfcHVzaF9zeW5jKCBndGlkLCBjdF9vcmRlcmVkX2luX3Rhc2txLCBsb2NfcmVmLCBOVUxMLCAwICk7CisjZWxzZQorICAgICAgICBfX2ttcF9wdXNoX3N5bmMoIGd0aWQsIGN0X29yZGVyZWRfaW5fdGFza3EsIGxvY19yZWYsIE5VTEwgKTsKKyNlbmRpZgorCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIEdFSCAtIG5lZWQgY2hlY2sgaGVyZSB1bmRlciBzdGF0cyB0byBtYWtlIHN1cmUgICAqLworICAgICAgICAvKiAgICAgICBpbnNpZGUgdGFzayAoY3Vycl90aHVua1sqdGlkX3JlZl0gIT0gTlVMTCkgKi8KKworICAgICAgICBteV90b2tlbiA9dHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT4gdGhfdGFza251bTsKKworICAgICAgICB0YXNrcSA9IHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWU7CisKKyAgICAgICAgS01QX1dBSVRfWUlFTEQoJnRhc2txLT50cV90YXNrbnVtX3NlcnZpbmcsIG15X3Rva2VuLCBLTVBfRVEsIE5VTEwpOworICAgICAgICBLTVBfTUIoKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF90YXNrcV94byggaW50ICpndGlkX3JlZiwgaW50ICpjaWRfcmVmLCBpZGVudF90ICpsb2NfcmVmICkKK3sKKyAgICBpbnQgICAgICAgICAgIGd0aWQgPSAqZ3RpZF9yZWY7CisgICAgaW50ICAgICAgICAgICB0aWQgID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ3RpZCApOworICAgIGttcF91aW50MzIgICAgbXlfdG9rZW47CisgICAga21wX3Rhc2txX3QgICp0cSAgID0gJiBfX2ttcF90aHJlYWRzW2d0aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfc3luYyggZ3RpZCwgY3Rfb3JkZXJlZF9pbl90YXNrcSwgbG9jX3JlZiApOworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+IHRoLnRoX3RlYW0gLT4gdC50X3NlcmlhbGl6ZWQgKSB7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIC8qIEdFSCAtIG5lZWQgY2hlY2sgaGVyZSB1bmRlciBzdGF0cyB0byBtYWtlIHN1cmUgKi8KKyAgICAgICAgLyogICAgICAgaW5zaWRlIHRhc2sgKGN1cnJfdGh1bmtbdGlkXSAhPSBOVUxMKSAgICAqLworCisgICAgICAgIG15X3Rva2VuID0gdHEtPnRxX2N1cnJfdGh1bmtbIHRpZCBdLT50aF90YXNrbnVtOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgICAgIHRxLT50cV9jdXJyX3RodW5rWyB0aWQgXS0+IHRoLnRoX3NoYXJlZHMgLT4gc3ZfcXVldWUgLT4gdHFfdGFza251bV9zZXJ2aW5nID0gbXlfdG9rZW4gKyAxOworCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX3Rhc2txX2NoZWNrX29yZGVyZWQoIGttcF9pbnQzMiBndGlkLCBrbXBjX3RodW5rX3QgKnRodW5rICkKK3sKKyAgICBrbXBfdWludDMyIG15X3Rva2VuOworICAgIGttcGNfdGFza19xdWV1ZV90ICp0YXNrcTsKKworICAgIC8qIGFzc3VtZSB3ZSBhcmUgYWx3YXlzIGNhbGxlZCBmcm9tIGFuIGFjdGl2ZSBwYXJhbGxlbCBjb250ZXh0ICovCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIG15X3Rva2VuID0gIHRodW5rIC0+IHRoX3Rhc2tudW07CisKKyAgICB0YXNrcSA9ICB0aHVuayAtPiB0aC50aF9zaGFyZWRzIC0+IHN2X3F1ZXVlOworCisgICAgaWYodGFza3EtPnRxX3Rhc2tudW1fc2VydmluZyA8PSBteV90b2tlbikgeworICAgICAgICBLTVBfV0FJVF9ZSUVMRCgmdGFza3EtPnRxX3Rhc2tudW1fc2VydmluZywgbXlfdG9rZW4sIEtNUF9HRSwgTlVMTCk7CisgICAgICAgIEtNUF9NQigpOworICAgICAgICB0YXNrcS0+dHFfdGFza251bV9zZXJ2aW5nID0gbXlfdG9rZW4gKzE7CisgICAgICAgIEtNUF9NQigpOworICAgIH0KK30KKworI2lmZGVmIEtNUF9ERUJVRworCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF9UUUYoa21wX2ludDMyIGZsYWdzKQoreworICAgIGlmIChmbGFncyAmIFRRRl9JU19PUkRFUkVEKQorICAgICAgICBfX2ttcF9wcmludGYoIk9SREVSRUQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKQorICAgICAgICBfX2ttcF9wcmludGYoIkxBU1RfUFJJViAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKQorICAgICAgICBfX2ttcF9wcmludGYoIk5PV0FJVCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSEVVUklTVElDUykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJIRVVSSVNUICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQxKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjEgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lOVEVSRkFDRV9SRVNFUlZFRDIpCisgICAgICAgIF9fa21wX3ByaW50ZigiUkVTRVJWMiAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfSU5URVJGQUNFX1JFU0VSVkVEMykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJSRVNFUlYzICIpOworICAgIGlmIChmbGFncyAmIFRRRl9JTlRFUkZBQ0VfUkVTRVJWRUQ0KQorICAgICAgICBfX2ttcF9wcmludGYoIlJFU0VSVjQgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykKKyAgICAgICAgX19rbXBfcHJpbnRmKCJMQVNUX1RBU0sgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX1RBU0tRX1RBU0spCisgICAgICAgIF9fa21wX3ByaW50ZigiVEFTS1FfVEFTSyAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTKQorICAgICAgICBfX2ttcF9wcmludGYoIlJFTEVBU0UgIik7CisgICAgaWYgKGZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiQUxMX1FVRVVFRCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCkKKyAgICAgICAgX19rbXBfcHJpbnRmKCJQQVJBTExFTCAiKTsKKyAgICBpZiAoZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpCisgICAgICAgIF9fa21wX3ByaW50ZigiREVBTExPQyAiKTsKKyAgICBpZiAoIShmbGFncyAmIChUUUZfSU5URVJOQUxfRkxBR1N8VFFGX0lOVEVSRkFDRV9GTEFHUykpKQorICAgICAgICBfX2ttcF9wcmludGYoIihOT05FKSIpOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZHVtcF90aHVuaygga21wX3Rhc2txX3QgKnRxLCBrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50IGk7CisgICAgaW50IG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKworICAgIF9fa21wX3ByaW50ZigiXHRUaHVuayBhdCAlcCBvbiAoJWQpOiAgIiwgdGh1bmssIGdsb2JhbF90aWQpOworCisgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgZm9yIChpID0gMDsgaSA8IG5wcm9jOyBpKyspIHsKKyAgICAgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua1tpXSA9PSB0aHVuayApIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9wcmludGYoIlslaV0gIiwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9zaGFyZWRzPSVwLCAiLCB0aHVuay0+dGgudGhfc2hhcmVkcyk7CisgICAgICAgIF9fa21wX3ByaW50ZigidGhfdGFzaz0lcCwgIiwgdGh1bmstPnRoX3Rhc2spOworICAgICAgICBfX2ttcF9wcmludGYoInRoX2VuY2xfdGh1bms9JXAsICIsIHRodW5rLT50aF9lbmNsX3RodW5rKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9zdGF0dXM9JWQsICIsIHRodW5rLT50aF9zdGF0dXMpOworICAgICAgICBfX2ttcF9wcmludGYoInRoX3Rhc2tudW09JXUsICIsIHRodW5rLT50aF90YXNrbnVtKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJ0aF9mbGFncz0iKTsgX19rbXBfZHVtcF9UUUYodGh1bmstPnRoX2ZsYWdzKTsKKyAgICB9CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3RodW5rX3N0YWNrKGttcGNfdGh1bmtfdCAqdGh1bmssIGttcF9pbnQzMiB0aHJlYWRfbnVtKQoreworICAgIGttcGNfdGh1bmtfdCAqdGg7CisKKyAgICBfX2ttcF9wcmludGYoIiAgICBUaHVuayBzdGFjayBmb3IgVCMlZDogICIsIHRocmVhZF9udW0pOworCisgICAgZm9yICh0aCA9IHRodW5rOyB0aCAhPSBOVUxMOyB0aCA9IHRoLT50aF9lbmNsX3RodW5rICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0aCk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIGttcF90YXNrcV90ICp0cSwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50ICAgICAgICAgICAgICAgICAgcXMsIGNvdW50LCBpOworICAgIGttcGNfdGh1bmtfdCAgICAgICAgKnRodW5rOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgKnRhc2txOworCisgICAgX19rbXBfcHJpbnRmKCJUYXNrIFF1ZXVlIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCk7CisKKyAgICBpZiAocXVldWUgIT0gTlVMTCkgeworICAgICAgICBpbnQgaW5fcGFyYWxsZWwgPSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVDsKKworICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkgeworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9sb2MgICAgICAgICAgICAgOiAiKTsKKyAgICB9CisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworCisgICAgICAgICAgICAvL2lmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IDApCisgICAgICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3BhcmVudCAgICAgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHEudHFfcGFyZW50KTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZpcnN0X2NoaWxkICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfbmV4dF9jaGlsZCAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9uZXh0X2NoaWxkKTsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3ByZXZfY2hpbGQgICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfcHJldl9jaGlsZCk7CisgICAgICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9yZWZfY291bnQgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX3JlZl9jb3VudCk7CisKKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgLy9pZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSAwKQorICAgICAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAvL19fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9zaGFyZWRzICAgICAgICAgOiAiKTsKKyAgICAgICAgZm9yIChpPTA7IGk8KChxdWV1ZSA9PSB0cS0+dHFfcm9vdCkgPyBxdWV1ZS0+dHFfbnByb2MgOiAxKTsgaSsrKQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCBxdWV1ZS0+dHFfc2hhcmVkc1tpXS5haV9kYXRhKTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza251bV9xdWV1aW5nIDogJXVcbiIsIHF1ZXVlLT50cV90YXNrbnVtX3F1ZXVpbmcpOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfdGFza251bV9zZXJ2aW5nIDogJXVcbiIsIHF1ZXVlLT50cV90YXNrbnVtX3NlcnZpbmcpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfcXVldWUgICAgICAgICAgIDogJXBcbiIsIHF1ZXVlLT50cV9xdWV1ZSk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RodW5rX3NwYWNlICAgICA6ICVwXG4iLCBxdWV1ZS0+dHFfdGh1bmtfc3BhY2UpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV90YXNrcV9zbG90ICAgICAgOiAlcFxuIiwgcXVldWUtPnRxX3Rhc2txX3Nsb3QpOworCisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2ZyZWVfdGh1bmtzICAgICA6ICIpOworICAgICAgICBmb3IgKHRodW5rID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuayA9IHRodW5rLT50aC50aF9uZXh0X2ZyZWUgKQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0aHVuayk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9uc2xvdHMgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX25zbG90cyk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX2hlYWQgICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfaGVhZCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RhaWwgICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfdGFpbCk7CisgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX25mdWxsICAgICAgICAgICA6ICVkXG4iLCBxdWV1ZS0+dHFfbmZ1bGwpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICB0cV9oaXdhdCAgICAgICAgICAgOiAlZFxuIiwgcXVldWUtPnRxX2hpd2F0KTsKKyAgICAgICAgX19rbXBfcHJpbnRmKCIgICAgdHFfZmxhZ3MgICAgICAgICAgIDogIik7IF9fa21wX2R1bXBfVFFGKHF1ZXVlLT50cV9mbGFncyk7CisgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKworICAgICAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIHRxX3RoX3RodW5rcyAgICAgICA6ICIpOworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IHF1ZXVlLT50cV9ucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgX19rbXBfcHJpbnRmKCIlZCAiLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW2ldLmFpX2RhdGEpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcHJpbnRmKCJcbiIpOworICAgICAgICBfX2ttcF9wcmludGYoIiAgICBRdWV1ZSBzbG90czpcbiIpOworCisKKyAgICAgICAgcXMgPSBxdWV1ZS0+dHFfdGFpbDsKKyAgICAgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IHF1ZXVlLT50cV9uZnVsbDsgKytjb3VudCApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiKCVkKSIsIHFzKTsKKyAgICAgICAgICAgIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBxdWV1ZS0+dHFfcXVldWVbcXNdLnFzX3RodW5rLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICBxcyA9IChxcysxKSAlIHF1ZXVlLT50cV9uc2xvdHM7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICBpZiAocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiICAgIFRhc2tRIHNsb3Q6XG4iKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9kdW1wX3RodW5rKCB0cSwgKGttcGNfdGh1bmtfdCAqKSBxdWV1ZS0+dHFfdGFza3Ffc2xvdCwgZ2xvYmFsX3RpZCApOworICAgICAgICAgICAgICAgIF9fa21wX3ByaW50ZigiXG4iKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIC8vX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfcHJpbnRmKCIgICAgVGFza3EgZnJlZWxpc3Q6ICIpOworCisgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgZm9yKCB0YXNrcSA9IHRxLT50cV9mcmVlbGlzdDsgdGFza3EgIT0gTlVMTDsgdGFza3EgPSB0YXNrcS0+dHEudHFfbmV4dF9mcmVlICkKKyAgICAgICAgX19rbXBfcHJpbnRmKCIlcCAiLCB0YXNrcSk7CisKKyAgICAvL19fa21wX3JlbGVhc2VfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrLCBnbG9iYWxfdGlkICk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuXG4iKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSwga21wX2ludDMyIGxldmVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCApCit7CisgICAgaW50IGksIGNvdW50LCBxczsKKyAgICBpbnQgbnByb2MgPSBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X25wcm9jOworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSA9IGN1cnJfcXVldWU7CisKKyAgICBpZiAoY3Vycl9xdWV1ZSA9PSBOVUxMKQorICAgICAgICByZXR1cm47CisKKyAgICBfX2ttcF9wcmludGYoIiAgICAiKTsKKworICAgIGZvciAoaT0wOyBpPGxldmVsOyBpKyspCisgICAgICAgIF9fa21wX3ByaW50ZigiICAiKTsKKworICAgIF9fa21wX3ByaW50ZigiJXAiLCBjdXJyX3F1ZXVlKTsKKworICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgIGlmKCB0cS0+dHFfY3Vycl90aHVua1tpXSAmJiB0cS0+dHFfY3Vycl90aHVua1tpXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUgPT0gY3Vycl9xdWV1ZSApIHsKKyAgICAgICAgICAgIF9fa21wX3ByaW50ZigiIFslaV0iLCBpKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIF9fa21wX3ByaW50ZigiOiIpOworCisgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgcXMgPSBjdXJyX3F1ZXVlLT50cV90YWlsOworCisgICAgZm9yICggY291bnQgPSAwOyBjb3VudCA8IGN1cnJfcXVldWUtPnRxX25mdWxsOyArK2NvdW50ICkgeworICAgICAgICBfX2ttcF9wcmludGYoIiVwICIsIGN1cnJfcXVldWUtPnRxX3F1ZXVlW3FzXS5xc190aHVuayk7CisgICAgICAgICBxcyA9IChxcysxKSAlIGN1cnJfcXVldWUtPnRxX25zbG90czsKKyAgICB9CisKKyAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICBfX2ttcF9wcmludGYoIlxuIik7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpIHsKKyAgICAgICAgLy9fX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQpIHsKKyAgICAgICAgICAgIGZvcihxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKWN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICAgICAgICAgIHF1ZXVlICE9IE5VTEw7CisgICAgICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZCkgeworICAgICAgICAgICAgICAgIF9fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHF1ZXVlLCBsZXZlbCsxLCBnbG9iYWxfdGlkICk7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvL19fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICB9Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9kdW1wX3Rhc2tfcXVldWVfdHJlZSgga21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqdHFyb290LCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcF9wcmludGYoIlRhc2tRIFRyZWUgYXQgcm9vdCAlcCBvbiAoJWQpOlxuIiwgdHFyb290LCBnbG9iYWxfdGlkKTsKKworICAgIF9fa21wX2F1eF9kdW1wX3Rhc2tfcXVldWVfdHJlZSggdHEsIHRxcm9vdCwgMCwgZ2xvYmFsX3RpZCApOworCisgICAgX19rbXBfcHJpbnRmKCJcbiIpOworfQorI2VuZGlmCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICAgIE5ldyB0YXNrcSBzdG9yYWdlIHJvdXRpbmVzIHRoYXQgdHJ5IHRvIG1pbmltaXplIG92ZXJoZWFkIG9mIG1hbGxvY3MgYnV0CisgICAgc3RpbGwgcHJvdmlkZSBjYWNoZSBsaW5lIGFsaWdubWVudC4KKyovCisKKworc3RhdGljIHZvaWQgKgorX19rbXBfdGFza3FfYWxsb2NhdGUoc2l6ZV90IHNpemUsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIHZvaWQgKmFkZHIsICpvcmlnX2FkZHI7CisgICAgc2l6ZV90IGJ5dGVzOworCisgICAgS0JfVFJBQ0UoIDUsICgiX19rbXBfdGFza3FfYWxsb2NhdGU6IGNhbGxlZCBzaXplPSVkLCBndGlkPSVkXG4iLCAoaW50KSBzaXplLCBnbG9iYWxfdGlkICkgKTsKKworICAgIGJ5dGVzID0gc2l6ZW9mKHZvaWQgKikgKyBDQUNIRV9MSU5FICsgc2l6ZTsKKworI2lmZGVmIFRIUkVBRF9BTExPQ19GT1JfVEFTS1EKKyAgICBvcmlnX2FkZHIgPSAodm9pZCAqKSBfX2ttcF90aHJlYWRfbWFsbG9jKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGdsb2JhbF90aWQpLCBieXRlcyApOworI2Vsc2UKKyAgICBLRV9UUkFDRSggMTAsICgiJSUlJSUlIE1BTExPQyggJWQgKVxuIiwgYnl0ZXMgKSApOworICAgIG9yaWdfYWRkciA9ICh2b2lkICopIEtNUF9JTlRFUk5BTF9NQUxMT0MoIGJ5dGVzICk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworCisgICAgaWYgKG9yaWdfYWRkciA9PSAwKQorICAgICAgICBLTVBfRkFUQUwoIE91dE9mSGVhcE1lbW9yeSApOworCisgICAgYWRkciA9IG9yaWdfYWRkcjsKKworICAgIGlmICgoKGttcF91aW50cHRyX3QpIGFkZHIgJiAoIENBQ0hFX0xJTkUgLSAxICkpICE9IDApIHsKKyAgICAgICAgS0JfVFJBQ0UoIDUwLCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiAgYWRqdXN0IGZvciBjYWNoZSBhbGlnbm1lbnRcbiIgKSApOworICAgICAgICBhZGRyID0gKHZvaWQgKikgKCgoa21wX3VpbnRwdHJfdCkgYWRkciArIENBQ0hFX0xJTkUpICYgfiggQ0FDSEVfTElORSAtIDEgKSk7CisgICAgfQorCisgICAgKCogKHZvaWQgKiopIGFkZHIpID0gb3JpZ19hZGRyOworCisgICAgS0JfVFJBQ0UoIDEwLCAoIl9fa21wX3Rhc2txX2FsbG9jYXRlOiAgYWxsb2NhdGU6ICVwLCB1c2U6ICVwIC0gJXAsIHNpemU6ICVkLCBndGlkOiAlZFxuIiwKKyAgICAgICAgICAgICBvcmlnX2FkZHIsICgodm9pZCAqKikgYWRkcikgKyAxLCAoKGNoYXIgKikoKCh2b2lkICoqKSBhZGRyKSArIDEpKSArIHNpemUtMSwKKyAgICAgICAgICAgICAoaW50KSBzaXplLCBnbG9iYWxfdGlkICkpOworCisgICAgcmV0dXJuICggKCh2b2lkICoqKSBhZGRyKSArIDEgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wY190YXNrcV9mcmVlKHZvaWQgKnAsIGttcF9pbnQzMiBnbG9iYWxfdGlkKQoreworICAgIEtCX1RSQUNFKCA1LCAoIl9fa21wY190YXNrcV9mcmVlOiBjYWxsZWQgYWRkcj0lcCwgZ3RpZD0lZFxuIiwgcCwgZ2xvYmFsX3RpZCApICk7CisKKyAgICBLQl9UUkFDRSgxMCwgKCJfX2ttcGNfdGFza3FfZnJlZTogIGZyZWVpbmc6ICVwLCBndGlkOiAlZFxuIiwgKCooICgodm9pZCAqKikgcCktMSkpLCBnbG9iYWxfdGlkICkpOworCisjaWZkZWYgVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUQorICAgIF9fa21wX3RocmVhZF9mcmVlKCBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGdsb2JhbF90aWQpLCAqKCAoKHZvaWQgKiopIHApLTEpICk7CisjZWxzZQorICAgIEtNUF9JTlRFUk5BTF9GUkVFKCAqKCAoKHZvaWQgKiopIHApLTEpICk7CisjZW5kaWYgLyogVEhSRUFEX0FMTE9DX0ZPUl9UQVNLUSAqLworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyoKKyAqICAgICAgS2VlcCBmcmVlZCBrbXBjX3Rhc2tfcXVldWVfdCBvbiBhbiBpbnRlcm5hbCBmcmVlbGlzdCBhbmQgcmVjeWNsZSBzaW5jZQorICogICAgICB0aGV5J3JlIG9mIGNvbnN0YW50IHNpemUuCisgKi8KKworc3RhdGljIGttcGNfdGFza19xdWV1ZV90ICoKK19fa21wX2FsbG9jX3Rhc2txICgga21wX3Rhc2txX3QgKnRxLCBpbnQgaW5fcGFyYWxsZWwsIGttcF9pbnQzMiBuc2xvdHMsIGttcF9pbnQzMiBudGh1bmtzLAorICAgICAgICAgICAgICAgICAgICBrbXBfaW50MzIgbnNoYXJlZHMsIGttcF9pbnQzMiBucHJvYywgc2l6ZV90IHNpemVvZl90aHVuaywKKyAgICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9zaGFyZWRzLCBrbXBjX3RodW5rX3QgKipuZXdfdGFza3FfdGh1bmssIGttcF9pbnQzMiBnbG9iYWxfdGlkICkKK3sKKyAgICBrbXBfaW50MzIgICAgICAgICAgICAgICAgICBpOworICAgIHNpemVfdCAgICAgICAgICAgICAgICAgICAgIGJ5dGVzOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgICAgICAgICpuZXdfcXVldWU7CisgICAga21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKnNoYXJlZF92YXJfYXJyYXk7CisgICAgY2hhciAgICAgICAgICAgICAgICAgICAgICAgKnNoYXJlZF92YXJfc3RvcmFnZTsKKyAgICBjaGFyICAgICAgICAgICAgICAgICAgICAgICAqcHQ7IC8qIGZvciBkb2luZyBieXRlLWFkanVzdGVkIGFkZHJlc3MgY29tcHV0YXRpb25zICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworCisgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgaWYoIHRxLT50cV9mcmVlbGlzdCApIHsKKyAgICAgICAgbmV3X3F1ZXVlID0gIHRxIC0+IHRxX2ZyZWVsaXN0OworICAgICAgICB0cSAtPiB0cV9mcmVlbGlzdCA9ICB0cSAtPiB0cV9mcmVlbGlzdCAtPiB0cS50cV9uZXh0X2ZyZWU7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChuZXdfcXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKTsKKworICAgICAgICBuZXdfcXVldWUtPnRxX2ZsYWdzID0gMDsKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKKworICAgICAgICBuZXdfcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKHNpemVvZiAoa21wY190YXNrX3F1ZXVlX3QpLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9mbGFncyA9IDA7CisgICAgfQorCisgICAgLyogIHNwYWNlIGluIHRoZSB0YXNrIHF1ZXVlIGZvciBxdWV1ZSBzbG90cyAoYWxsb2NhdGUgYXMgb25lIGJpZyBjaHVuayAqLworICAgIC8qIG9mIHN0b3JhZ2UgaW5jbHVkaW5nIG5ld190YXNrcV90YXNrIHNwYWNlKSAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIHNpemVvZl90aHVuayArPSAoQ0FDSEVfTElORSAtIChzaXplb2ZfdGh1bmsgJSBDQUNIRV9MSU5FKSk7ICAgICAgICAgLyogcGFkIHRvIGNhY2hlIGxpbmUgc2l6ZSAqLworICAgIHB0ID0gKGNoYXIgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKG50aHVua3MgKiBzaXplb2ZfdGh1bmssIGdsb2JhbF90aWQpOworICAgIG5ld19xdWV1ZS0+dHFfdGh1bmtfc3BhY2UgPSAoa21wY190aHVua190ICopcHQ7CisgICAgKm5ld190YXNrcV90aHVuayA9IChrbXBjX3RodW5rX3QgKikocHQgKyAobnRodW5rcyAtIDEpICogc2l6ZW9mX3RodW5rKTsKKworICAgIC8qICBjaGFpbiB0aGUgYWxsb2NhdGVkIHRodW5rcyBpbnRvIGEgZnJlZWxpc3QgZm9yIHRoaXMgcXVldWUgICovCisKKyAgICBuZXdfcXVldWUtPnRxX2ZyZWVfdGh1bmtzID0gKGttcGNfdGh1bmtfdCAqKXB0OworCisgICAgZm9yIChpID0gMDsgaSA8IChudGh1bmtzIC0gMik7IGkrKykgeworICAgICAgICAoKGttcGNfdGh1bmtfdCAqKShwdCtpKnNpemVvZl90aHVuaykpLT50aC50aF9uZXh0X2ZyZWUgPSAoa21wY190aHVua190ICopKHB0ICsgKGkrMSkqc2l6ZW9mX3RodW5rKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgKChrbXBjX3RodW5rX3QgKikocHQraSpzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKyAgICB9CisKKyAgICAoKGttcGNfdGh1bmtfdCAqKShwdCsobnRodW5rcy0yKSpzaXplb2ZfdGh1bmspKS0+dGgudGhfbmV4dF9mcmVlID0gTlVMTDsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAoKGttcGNfdGh1bmtfdCAqKShwdCsobnRodW5rcy0yKSpzaXplb2ZfdGh1bmspKS0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKworICAgIC8qIGluaXRpYWxpemUgdGhlIGxvY2tzICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIG5ld19xdWV1ZS0+dHFfbGlua19sY2sgKTsKKyAgICAgICAgX19rbXBfaW5pdF9sb2NrKCAmIG5ld19xdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrICk7CisgICAgICAgIF9fa21wX2luaXRfbG9jayggJiBuZXdfcXVldWUtPnRxX3F1ZXVlX2xjayApOworICAgIH0KKworICAgIC8qIG5vdyBhbGxvY2F0ZSB0aGUgc2xvdHMgKi8KKworICAgIGJ5dGVzID0gbnNsb3RzICogc2l6ZW9mIChrbXBjX2FsaWduZWRfcXVldWVfc2xvdF90KTsKKyAgICBuZXdfcXVldWUtPnRxX3F1ZXVlID0gKGttcGNfYWxpZ25lZF9xdWV1ZV9zbG90X3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUoIGJ5dGVzLCBnbG9iYWxfdGlkICk7CisKKyAgICAvKiAgc3BhY2UgZm9yIGFycmF5IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZSBzdHJ1Y3R1cmVzICovCisgICAgc2l6ZW9mX3NoYXJlZHMgKz0gc2l6ZW9mKGttcGNfdGFza19xdWV1ZV90ICopOworICAgIHNpemVvZl9zaGFyZWRzICs9IChDQUNIRV9MSU5FIC0gKHNpemVvZl9zaGFyZWRzICUgQ0FDSEVfTElORSkpOyAgICAgLyogcGFkIHRvIGNhY2hlIGxpbmUgc2l6ZSAqLworCisgICAgYnl0ZXMgPSBuc2hhcmVkcyAqIHNpemVvZiAoa21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QpOworICAgIHNoYXJlZF92YXJfYXJyYXkgPSAoa21wY19hbGlnbmVkX3NoYXJlZF92YXJzX3QgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKCBieXRlcywgZ2xvYmFsX3RpZCk7CisKKyAgICBieXRlcyA9IG5zaGFyZWRzICogc2l6ZW9mX3NoYXJlZHM7CisgICAgc2hhcmVkX3Zhcl9zdG9yYWdlID0gKGNoYXIgKikgX19rbXBfdGFza3FfYWxsb2NhdGUgKCBieXRlcywgZ2xvYmFsX3RpZCk7CisKKyAgICBmb3IgKGk9MDsgaTxuc2hhcmVkczsgaSsrKSB7CisgICAgICAgIHNoYXJlZF92YXJfYXJyYXlbaV0uYWlfZGF0YSA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgKHNoYXJlZF92YXJfc3RvcmFnZSArIGkqc2l6ZW9mX3NoYXJlZHMpOworICAgICAgICBzaGFyZWRfdmFyX2FycmF5W2ldLmFpX2RhdGEtPnN2X3F1ZXVlID0gbmV3X3F1ZXVlOworICAgIH0KKyAgICBuZXdfcXVldWUtPnRxX3NoYXJlZHMgPSBzaGFyZWRfdmFyX2FycmF5OworCisKKyAgICAvKiBhcnJheSBmb3IgbnVtYmVyIG9mIG91dHN0YW5kaW5nIHRodW5rcyBwZXIgdGhyZWFkICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgYnl0ZXMgPSBucHJvYyAqIHNpemVvZihrbXBjX2FsaWduZWRfaW50MzJfdCk7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfdGhfdGh1bmtzID0gKGttcGNfYWxpZ25lZF9pbnQzMl90ICopIF9fa21wX3Rhc2txX2FsbG9jYXRlICggYnl0ZXMsIGdsb2JhbF90aWQpOworICAgICAgICBuZXdfcXVldWUtPnRxX25wcm9jICAgICA9IG5wcm9jOworCisgICAgICAgIGZvciAoaT0wOyBpPG5wcm9jOyBpKyspCisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID0gMDsKKyAgICB9CisKKyAgICByZXR1cm4gbmV3X3F1ZXVlOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90YXNrcSAoa21wX3Rhc2txX3QgKnRxLCBrbXBjX3Rhc2tfcXVldWVfdCAqcCwgaW50IGluX3BhcmFsbGVsLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCkKK3sKKyAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV90aHVua19zcGFjZSwgZ2xvYmFsX3RpZCk7CisgICAgX19rbXBjX3Rhc2txX2ZyZWUocC0+dHFfcXVldWUsIGdsb2JhbF90aWQpOworCisgICAgLyogZnJlZSBzaGFyZWQgdmFyIHN0cnVjdHVyZSBzdG9yYWdlICovCisgICAgX19rbXBjX3Rhc2txX2ZyZWUoKHZvaWQgKikgcC0+dHFfc2hhcmVkc1swXS5haV9kYXRhLCBnbG9iYWxfdGlkKTsKKworICAgIC8qIGZyZWUgYXJyYXkgb2YgcG9pbnRlcnMgdG8gc2hhcmVkIHZhcnMgc3RvcmFnZSAqLworICAgIF9fa21wY190YXNrcV9mcmVlKHAtPnRxX3NoYXJlZHMsIGdsb2JhbF90aWQpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX25leHRfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX3ByZXZfY2hpbGQgPSBOVUxMOworICAgIHAtPnRxX3JlZl9jb3VudCA9IC0xMDsKKyAgICBwLT50cV9zaGFyZWRzID0gTlVMTDsKKyAgICBwLT50cV90YXNrbnVtX3F1ZXVpbmcgPSAwOworICAgIHAtPnRxX3Rhc2tudW1fc2VydmluZyA9IDA7CisgICAgcC0+dHFfcXVldWUgPSBOVUxMOworICAgIHAtPnRxX3RodW5rX3NwYWNlID0gTlVMTDsKKyAgICBwLT50cV90YXNrcV9zbG90ID0gTlVMTDsKKyAgICBwLT50cV9mcmVlX3RodW5rcyA9IE5VTEw7CisgICAgcC0+dHFfbnNsb3RzID0gMDsKKyAgICBwLT50cV9oZWFkID0gMDsKKyAgICBwLT50cV90YWlsID0gMDsKKyAgICBwLT50cV9uZnVsbCA9IDA7CisgICAgcC0+dHFfaGl3YXQgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIGludCBpOworCisgICAgICAgIGZvciAoaT0wOyBpPHAtPnRxX25wcm9jOyBpKyspCisgICAgICAgICAgICBwLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9IDA7CisgICAgfQorICAgIGlmICggX19rbXBfZW52X2NvbnNpc3RlbmN5X2NoZWNrICkKKyAgICAgICAgcC0+dHFfbG9jID0gTlVMTDsKKyAgICBLTVBfREVCVUdfQVNTRVJUKCBwLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCApOworICAgIHAtPnRxX2ZsYWdzID0gVFFGX0RFQUxMT0NBVEVEOworI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgaWYgKGluX3BhcmFsbGVsKSAgeworICAgICAgICBfX2ttcGNfdGFza3FfZnJlZShwLT50cV90aF90aHVua3MsIGdsb2JhbF90aWQpOworICAgICAgICBfX2ttcF9kZXN0cm95X2xvY2soJiBwLT50cV9saW5rX2xjayk7CisgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmIHAtPnRxX3F1ZXVlX2xjayk7CisgICAgICAgIF9fa21wX2Rlc3Ryb3lfbG9jaygmIHAtPnRxX2ZyZWVfdGh1bmtzX2xjayk7CisgICAgfQorI2lmZGVmIEtNUF9ERUJVRworICAgIHAtPnRxX3RoX3RodW5rcyA9IE5VTEw7CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgdHEtPnRxX2ZyZWVsaXN0X2xjaywgZ2xvYmFsX3RpZCApOworICAgIHAtPnRxLnRxX25leHRfZnJlZSA9IHRxLT50cV9mcmVlbGlzdDsKKworICAgIHRxLT50cV9mcmVlbGlzdCA9IHA7CisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIHRxLT50cV9mcmVlbGlzdF9sY2ssIGdsb2JhbF90aWQgKTsKK30KKworLyoKKyAqICAgIE9uY2UgYSBncm91cCBvZiB0aHVua3MgaGFzIGJlZW4gYWxsb2NhdGVkIGZvciB1c2UgaW4gYSBwYXJ0aWN1bGFyIHF1ZXVlLAorICogICAgdGhlc2UgYXJlIG1hbmFnZWQgdmlhIGEgcGVyLXF1ZXVlIGZyZWVsaXN0LgorICogICAgV2UgZm9yY2UgYSBjaGVjayB0aGF0IHRoZXJlJ3MgYWx3YXlzIGEgdGh1bmsgZnJlZSBpZiB3ZSBuZWVkIG9uZS4KKyAqLworCitzdGF0aWMga21wY190aHVua190ICoKK19fa21wX2FsbG9jX3RodW5rIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisgICAga21wY190aHVua190ICpmbDsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIGZsID0gcXVldWUtPnRxX2ZyZWVfdGh1bmtzOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAoZmwgIT0gTlVMTCk7CisKKyAgICBxdWV1ZS0+dHFfZnJlZV90aHVua3MgPSBmbC0+dGgudGhfbmV4dF9mcmVlOworICAgIGZsLT50aF9mbGFncyA9IDA7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9mcmVlX3RodW5rc19sY2ssIGdsb2JhbF90aWQpOworCisgICAgcmV0dXJuIGZsOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfZnJlZV90aHVuayAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlLCBrbXBjX3RodW5rX3QgKnAsIGludCBpbl9wYXJhbGxlbCwga21wX2ludDMyIGdsb2JhbF90aWQpCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dGhfdGFzayA9IDA7CisgICAgcC0+dGhfZW5jbF90aHVuayA9IDA7CisgICAgcC0+dGhfc3RhdHVzID0gMDsKKyAgICBwLT50aF90YXNrbnVtID0gMDsKKyAgICAvKiBBbHNvIGNvdWxkIHplcm8gcG9pbnRlcnMgdG8gcHJpdmF0ZSB2YXJzICovCisjZW5kaWYKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBxdWV1ZS0+dHFfZnJlZV90aHVua3NfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworICAgIH0KKworICAgIHAtPnRoLnRoX25leHRfZnJlZSA9IHF1ZXVlLT50cV9mcmVlX3RodW5rczsKKyAgICBxdWV1ZS0+dHFfZnJlZV90aHVua3MgPSBwOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgcC0+dGhfZmxhZ3MgPSBUUUZfREVBTExPQ0FURUQ7CisjZW5kaWYKKworICAgIGlmIChpbl9wYXJhbGxlbCkKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX2ZyZWVfdGh1bmtzX2xjaywgZ2xvYmFsX3RpZCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAgcmV0dXJucyBub256ZXJvIGlmIHRoZSBxdWV1ZSBqdXN0IGJlY2FtZSBmdWxsIGFmdGVyIHRoZSBlbnF1ZXVlICAqLworCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9lbnF1ZXVlX3Rhc2sgKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGttcGNfdGh1bmtfdCAqdGh1bmssIGludCBpbl9wYXJhbGxlbCApCit7CisgICAga21wX2ludDMyICAgIHJldDsKKworICAgIC8qICBka3A6IGNhbiB3ZSBnZXQgYXJvdW5kIHRoZSBsb2NrIGluIHRoZSBUUUZfUkVMRUFTRV9XT1JLRVJTIGNhc2UgKG9ubHkgdGhlIG1hc3RlciBpcyBleGVjdXRpbmcgdGhlbikgICovCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX25mdWxsIDwgcXVldWUtPnRxX25zbG90cyk7ICAvKiAgY2hlY2sgcXVldWUgbm90IGZ1bGwgICovCisKKyAgICBxdWV1ZS0+dHFfcXVldWVbKHF1ZXVlLT50cV9oZWFkKSsrXS5xc190aHVuayA9IHRodW5rOworCisgICAgaWYgKHF1ZXVlLT50cV9oZWFkID49IHF1ZXVlLT50cV9uc2xvdHMpCisgICAgICAgIHF1ZXVlLT50cV9oZWFkID0gMDsKKworICAgIChxdWV1ZS0+dHFfbmZ1bGwpKys7CisKKyAgICBLTVBfTUIoKTsgICAvKiB0byBhc3N1cmUgdGhhdCBuZnVsbCBpcyBzZWVuIHRvIGluY3JlYXNlIGJlZm9yZSBUUUZfQUxMX1RBU0tTX1FVRVVFRCBpcyBzZXQgKi8KKworICAgIHJldCA9IChpbl9wYXJhbGxlbCkgPyAocXVldWUtPnRxX25mdWxsID09IHF1ZXVlLT50cV9uc2xvdHMpIDogRkFMU0U7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgLyogZG9uJ3QgbmVlZCB0byB3YWl0IHVudGlsIHdvcmtlcnMgYXJlIHJlbGVhc2VkIGJlZm9yZSB1bmxvY2tpbmcgKi8KKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgaWYoIHRxLT50cV9nbG9iYWxfZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTICkgeworICAgICAgICAgICAgLyogSWYganVzdCBjcmVhdGluZyB0aGUgcm9vdCBxdWV1ZSwgdGhlIHdvcmtlciB0aHJlYWRzIGFyZSB3YWl0aW5nIGF0ICovCisgICAgICAgICAgICAvKiBhIGpvaW4gYmFycmllciB1bnRpbCBub3csIHdoZW4gdGhlcmUncyBzb21ldGhpbmcgaW4gdGhlIHF1ZXVlIGZvciAgKi8KKyAgICAgICAgICAgIC8qIHRoZW0gdG8gZG87IHJlbGVhc2UgdGhlbSBub3cgdG8gZG8gd29yay4gICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgLyogVGhpcyBzaG91bGQgb25seSBiZSBkb25lIHdoZW4gdGhpcyBpcyB0aGUgZmlyc3QgdGFzayBlbnF1ZXVlZCwgICAgICovCisgICAgICAgICAgICAvKiBzbyByZXNldCB0aGUgZmxhZyBoZXJlIGFsc28uICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyAmPSB+VFFGX1JFTEVBU0VfV09SS0VSUzsgIC8qIG5vIGxvY2sgbmVlZGVkLCB3b3JrZXJzIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKworICAgICAgICAgICAgS01QX01CKCk7ICAgLyogYXZvaWQgcmVsZWFzaW5nIGJhcnJpZXIgdHdpY2UgaWYgdGFza3FfdGFzayBzd2l0Y2hlcyB0aHJlYWRzICovCisKKyAgICAgICAgICAgIF9fa21wY19lbmRfYmFycmllcl9tYXN0ZXIoIE5VTEwsIGdsb2JhbF90aWQpOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIHJldDsKK30KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9kZXF1ZXVlX3Rhc2sgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0OworICAgIGludCAgICAgICAgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX25mdWxsID4gMCk7ICAvKiAgY2hlY2sgcXVldWUgbm90IGVtcHR5ICAqLworCisgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICBpbnQgY3Q7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBpbmMgJWRcbiIsCisgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgIH0KKworICAgIHB0ID0gcXVldWUtPnRxX3F1ZXVlWyhxdWV1ZS0+dHFfdGFpbCkrK10ucXNfdGh1bms7CisKKyAgICBpZiAocXVldWUtPnRxX3RhaWwgPj0gcXVldWUtPnRxX25zbG90cykKKyAgICAgICAgcXVldWUtPnRxX3RhaWwgPSAwOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhKys7CisKKyAgICAgICAgS01QX01CKCk7IC8qIG5lY2Vzc2FyeSBzbyBhaV9kYXRhIGluY3JlbWVudCBpcyBwcm9wYWdhdGVkIHRvIG90aGVyIHRocmVhZHMgaW1tZWRpYXRlbHkgKGRpZ2l0YWwpICovCisKKyAgICAgICAgS0ZfVFJBQ0UoMjAwLCAoIl9fa21wX2RlcXVldWVfdGFzazogVCMlZCg6JWQpIG5vdyBoYXMgJWQgb3V0c3RhbmRpbmcgdGh1bmtzIGZyb20gcXVldWUgJXBcbiIsCisgICAgICAgICAgICBnbG9iYWxfdGlkLCB0aWQsIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhLCBxdWV1ZSkpOworICAgIH0KKworICAgIChxdWV1ZS0+dHFfbmZ1bGwpLS07CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBLTVBfTUIoKTsKKworICAgIC8qIG5lY2Vzc2FyeSBzbyAocXVldWUtPnRxX25mdWxsID4gMCkgYWJvdmUgc3VjY2VlZHMgYWZ0ZXIgdHFfbmZ1bGwgaXMgZGVjcmVtZW50ZWQgKi8KKworICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX25mdWxsID49IDApOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPD0gX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCk7CisgICAgfQorI2VuZGlmCisKKyAgICByZXR1cm4gcHQ7Cit9CisKKy8qCisgKiBGaW5kIHRoZSBuZXh0IChub24tbnVsbCkgdGFzayB0byBkZXF1ZXVlIGFuZCByZXR1cm4gaXQuCisgKiBUaGlzIGlzIG5ldmVyIGNhbGxlZCB1bmxlc3MgaW5fcGFyYWxsZWw9VFJVRQorICoKKyAqIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggcXVldWUgdG8gdGFrZSB0aGUgdGFzayBmcm9tOgorICogMS4gIFdhbGsgdXAgdGhlIHRhc2sgcXVldWUgdHJlZSBmcm9tIHRoZSBjdXJyZW50IHF1ZXVlJ3MgcGFyZW50IGFuZCBsb29rCisgKiAgICAgIG9uIHRoZSB3YXkgdXAgKGZvciBsb29wLCBiZWxvdykuCisgKiAyLiAgRG8gYSBkZXB0aC1maXJzdCBzZWFyY2ggYmFjayBkb3duIHRoZSB0cmVlIGZyb20gdGhlIHJvb3QgYW5kCisgKiAgICAgIGxvb2sgKGZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKCkpLgorICoKKyAqIEhlcmUgYXJlIHRoZSBydWxlcyBmb3IgZGVjaWRpbmcgd2hpY2ggdGFzayB0byB0YWtlIGZyb20gYSBxdWV1ZQorICogKF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoKSk6CisgKiAxLiAgTmV2ZXIgdGFrZSB0aGUgbGFzdCB0YXNrIGZyb20gYSBxdWV1ZSBpZiBUUUZfSVNfTEFTVFBSSVZBVEU7IHRoaXMgdGFzaworICogICAgIG11c3QgYmUgc3RhZ2VkIHRvIG1ha2Ugc3VyZSB3ZSBleGVjdXRlIHRoZSBsYXN0IG9uZSB3aXRoCisgKiAgICAgVFFGX0lTX0xBU1RfVEFTSyBhdCB0aGUgZW5kIG9mIHRhc2sgcXVldWUgZXhlY3V0aW9uLgorICogMi4gIElmIHRoZSBxdWV1ZSBsZW5ndGggaXMgYmVsb3cgc29tZSBoaWdoIHdhdGVyIG1hcmsgYW5kIHRoZSB0YXNrcSB0YXNrCisgKiAgICAgaXMgZW5xdWV1ZWQsIHByZWZlciBydW5uaW5nIHRoZSB0YXNrcSB0YXNrLgorICogMy4gIE90aGVyd2lzZSwgdGFrZSBhIChub3JtYWwpIHRhc2sgZnJvbSB0aGUgcXVldWUuCisgKgorICogSWYgd2UgZG8gYWxsIHRoaXMgYW5kIHJldHVybiBwdCA9PSBOVUxMIGF0IHRoZSBib3R0b20gb2YgdGhpcyByb3V0aW5lLAorICogdGhpcyBtZWFucyB0aGVyZSBhcmUgbm8gbW9yZSB0YXNrcyB0byBleGVjdXRlIChleGNlcHQgcG9zc2libHkgZm9yCisgKiBUUUZfSVNfTEFTVFBSSVZBVEUpLgorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX3F1ZXVlIChrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGttcGNfdGh1bmtfdCAqcHQgID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIC8qIFRvIHByZXZlbnQgZGVhZGxvY2sgZnJvbSB0cV9xdWV1ZV9sY2sgaWYgcXVldWUgYWxyZWFkeSBkZWFsbG9jYXRlZCAqLworICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworCisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIC8qIENoZWNrIGFnYWluIHRvIGF2b2lkIHJhY2UgaW4gX19rbXBjX2VuZF90YXNrcSgpICovCisgICAgICAgIGlmICggIShxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfREVBTExPQ0FURUQpICkgeworCisgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgaWYgKChxdWV1ZS0+dHFfdGFza3Ffc2xvdCAhPSBOVUxMKSAmJiAocXVldWUtPnRxX25mdWxsIDw9IHF1ZXVlLT50cV9oaXdhdCkpIHsKKyAgICAgICAgICAgICAgICAvKiBpZiB0aGVyZSdzIGVub3VnaCByb29tIGluIHRoZSBxdWV1ZSBhbmQgdGhlIGRpc3BhdGNoZXIgKi8KKyAgICAgICAgICAgICAgICAvKiAodGFza3EgdGFzaykgaXMgYXZhaWxhYmxlLCBzY2hlZHVsZSBtb3JlIHRhc2tzICAgICAgICAgKi8KKyAgICAgICAgICAgICAgICBwdCA9IChrbXBjX3RodW5rX3QgKikgcXVldWUtPnRxX3Rhc2txX3Nsb3Q7CisgICAgICAgICAgICAgICAgcXVldWUtPnRxX3Rhc2txX3Nsb3QgPSBOVUxMOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVldWUtPnRxX25mdWxsID09IDAgfHwKKyAgICAgICAgICAgICAgICAgICAgIHF1ZXVlLT50cV90aF90aHVua3NbdGlkXS5haV9kYXRhID49IF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpIHsKKyAgICAgICAgICAgICAgICAvKiBkbyBub3RoaW5nIGlmIG5vIHRodW5rcyBhdmFpbGFibGUgb3IgdGhpcyB0aHJlYWQgY2FuJ3QgKi8KKyAgICAgICAgICAgICAgICAvKiBydW4gYW55IGJlY2F1c2UgaXQgYWxyZWFkeSBpcyBleGVjdXRpbmcgdG9vIG1hbnkgICAgICAgKi8KKworICAgICAgICAgICAgICAgIHB0ID0gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKHF1ZXVlLT50cV9uZnVsbCA+IDEpIHsKKyAgICAgICAgICAgICAgICAvKiAgYWx3YXlzIHNhZmUgdG8gc2NoZWR1bGUgYSB0YXNrIGV2ZW4gaWYgVFFGX0lTX0xBU1RQUklWQVRFICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgaWYgKCEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKSkgeworICAgICAgICAgICAgICAgIC8qICBvbmUgdGhpbmcgaW4gcXVldWUsIGFsd2F5cyBzYWZlIHRvIHNjaGVkdWxlIGlmICFUUUZfSVNfTEFTVFBSSVZBVEUgICovCisKKyAgICAgICAgICAgICAgICBwdCA9IF9fa21wX2RlcXVldWVfdGFzayAoZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgZWxzZSBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX0xBU1RfVEFTSykgeworICAgICAgICAgICAgICAgIC8qIFRRRl9JU19MQVNUUFJJVkFURSwgb25lIHRoaW5nIGluIHF1ZXVlLCBrbXBjX2VuZF90YXNrcV90YXNrKCkgICAqLworICAgICAgICAgICAgICAgIC8qIGhhcyBiZWVuIHJ1biBzbyB0aGlzIGlzIGxhc3QgdGFzaywgcnVuIHdpdGggVFFGX0lTX0xBU1RfVEFTSyBzbyAqLworICAgICAgICAgICAgICAgIC8qIGluc3RydW1lbnRhdGlvbiBkb2VzIGNvcHktb3V0LiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICAgICAgcHQgPSBfX2ttcF9kZXF1ZXVlX3Rhc2sgKGdsb2JhbF90aWQsIHF1ZXVlLCBUUlVFKTsKKyAgICAgICAgICAgICAgICBwdC0+dGhfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsgIC8qIGRvbid0IG5lZWQgdGVzdF90aGVuX29yIHNpbmNlIGFscmVhZHkgbG9ja2VkICovCisgICAgICAgICAgICB9CisgICAgICAgIH0KKworICAgICAgICAvKiBHRUggLSBXaGF0IGhhcHBlbnMgaGVyZSBpZiBpcyBsYXN0cHJpdmF0ZSwgYnV0IG5vdCBsYXN0IHRhc2s/ICovCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgIH0KKworICAgIHJldHVybiBwdDsKK30KKworLyoKKyAqIFdhbGsgYSB0cmVlIG9mIHF1ZXVlcyBzdGFydGluZyBhdCBxdWV1ZSdzIGZpcnN0IGNoaWxkCisgKiBhbmQgcmV0dXJuIGEgbm9uLU5VTEwgdGh1bmsgaWYgb25lIGNhbiBiZSBzY2hlZHVsZWQuCisgKiBNdXN0IG9ubHkgYmUgY2FsbGVkIHdoZW4gaW5fcGFyYWxsZWw9VFJVRQorICovCisKK3N0YXRpYyBrbXBjX3RodW5rX3QgKgorX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUgKGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSkKK3sKKyAgICBrbXBjX3RodW5rX3QgKnB0ID0gTlVMTDsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUgPSBjdXJyX3F1ZXVlOworCisgICAgaWYgKGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkICE9IE5VTEwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgcXVldWUgPSAoa21wY190YXNrX3F1ZXVlX3QgKikgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisgICAgICAgIGlmIChxdWV1ZSA9PSBOVUxMKSB7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgfQorCisgICAgICAgIHdoaWxlIChxdWV1ZSAhPSBOVUxMKSAgeworICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHQ7CisKKyAgICAgICAgICAgIGN0PSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGluYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoZ2xvYmFsX3RpZCwgcXVldWUpOworCisgICAgICAgICAgICBpZiAocHQgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgIGludCBjdDsKKworICAgICAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayBmaW5lIHdpdGhvdXQgdGhpcyBjYWxsIGZvciBkaWdpdGFsL2FscGhhLCBuZWVkZWQgZm9yIElCTS9SUzYwMDAgKi8KKworICAgICAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHF1ZXVlLT50cV9yZWZfY291bnQgPj0gMCApOworCisgICAgICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgcmV0dXJuIHB0OworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBhbHRob3VnaCByZWZlcmVuY2UgY291bnQgc3RheXMgYWN0aXZlIGR1cmluZyBkZXNjZW5kYW50IHdhbGssIHNob3VsZG4ndCBtYXR0ZXIgICovCisgICAgICAgICAgICAvKiBzaW5jZSBpZiBjaGlsZHJlbiBzdGlsbCBleGlzdCwgcmVmZXJlbmNlIGNvdW50cyBhcmVuJ3QgYmVpbmcgbW9uaXRvcmVkIGFueXdheSAgICovCisKKyAgICAgICAgICAgIHB0ID0gX19rbXBfZmluZF90YXNrX2luX2Rlc2NlbmRhbnRfcXVldWUgKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICBjdCA9IC0tKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjdCA+PSAwICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgIG5leHQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICBxdWV1ZSA9IG5leHQ7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgcmV0dXJuIHB0OworfQorCisvKgorICogV2FsayB1cCB0aGUgdGFza3EgdHJlZSBsb29raW5nIGZvciBhIHRhc2sgdG8gZXhlY3V0ZS4KKyAqIElmIHdlIGdldCB0byB0aGUgcm9vdCwgc2VhcmNoIHRoZSB0cmVlIGZvciBhIGRlc2NlbmRlbnQgcXVldWUgdGFzay4KKyAqIE11c3Qgb25seSBiZSBjYWxsZWQgd2hlbiBpbl9wYXJhbGxlbD1UUlVFCisgKi8KKworc3RhdGljIGttcGNfdGh1bmtfdCAqCitfX2ttcF9maW5kX3Rhc2tfaW5fYW5jZXN0b3JfcXVldWUgKGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpjdXJyX3F1ZXVlKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBrbXBjX3RodW5rX3QgICAgICAqcHQ7CisKKyAgICBwdCA9IE5VTEw7CisKKyAgICBpZiAoY3Vycl9xdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgcXVldWUgPSBjdXJyX3F1ZXVlLT50cS50cV9wYXJlbnQ7CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpIHsKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSArKyhxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9xdWV1ZSAoZ2xvYmFsX3RpZCwgcXVldWUpOworICAgICAgICAgICAgaWYgKHB0ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudCAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBjdDsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAgICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogU2VlbXMgdG8gd29yayB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisKKyAgICAgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZGVjICVkXG4iLAorICAgICAgICAgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworCisgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICByZXR1cm4gcHQ7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHEudHFfcGFyZW50ICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBpbnQgY3Q7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcXVldWUgPSBxdWV1ZS0+dHEudHFfcGFyZW50OworCisgICAgICAgICAgICBpZiAocXVldWUgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisKKyAgICB9CisKKyAgICBwdCA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKCBnbG9iYWxfdGlkLCB0cS0+dHFfcm9vdCApOworCisgICAgcmV0dXJuIHB0OworfQorCitzdGF0aWMgaW50CitfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZCAoa21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlKQoreworICAgIGludCBpOworCisgICAgLyogS01QX01CKCk7ICovLyogaXMgdGhpcyByZWFsbHkgbmVjZXNzYXJ5PyAqLworCisgICAgZm9yIChpPTA7IGk8cXVldWUtPnRxX25wcm9jOyBpKyspIHsKKyAgICAgICAgaWYgKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSAhPSAwKQorICAgICAgICAgICAgcmV0dXJuIEZBTFNFOworICAgIH0KKworICAgIHJldHVybiBUUlVFOworfQorCitzdGF0aWMgaW50CitfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuIChrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUpCit7CisgICAgcmV0dXJuIChxdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCk7Cit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWUsIGludCBpbl9wYXJhbGxlbCApCit7CisjaWZkZWYgS01QX0RFQlVHCisgICAga21wX2ludDMyICAgICBpOworICAgIGttcGNfdGh1bmtfdCAqdGh1bms7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKDUwLCAoIkJlZm9yZSBEZWxldGlvbiBvZiBUYXNrUSBhdCAlcCBvbiAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDUwLCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBxdWV1ZSwgZ2xvYmFsX3RpZCApKTsKKworICAgIC8qICBzdWItcXVldWUgaW4gYSByZWN1cnNpb24sIG5vdCB0aGUgcm9vdCB0YXNrIHF1ZXVlICAqLworICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgfQorCisgICAgS01QX0RFQlVHX0FTU0VSVCAocXVldWUtPnRxX2ZpcnN0X2NoaWxkID09IE5VTEwpOworCisgICAgLyogIHVubGluayBxdWV1ZSBmcm9tIGl0cyBzaWJsaW5ncyBpZiBhbnkgYXQgdGhpcyBsZXZlbCAgKi8KKyAgICBpZiAocXVldWUtPnRxX3ByZXZfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgcXVldWUtPnRxX3ByZXZfY2hpbGQtPnRxX25leHRfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKyAgICBpZiAocXVldWUtPnRxX25leHRfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgcXVldWUtPnRxX25leHRfY2hpbGQtPnRxX3ByZXZfY2hpbGQgPSBxdWV1ZS0+dHFfcHJldl9jaGlsZDsKKyAgICBpZiAocXVldWUtPnRxLnRxX3BhcmVudC0+dHFfZmlyc3RfY2hpbGQgPT0gcXVldWUpCisgICAgICAgIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2ZpcnN0X2NoaWxkID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICBxdWV1ZS0+dHFfcHJldl9jaGlsZCA9IE5VTEw7CisgICAgcXVldWUtPnRxX25leHRfY2hpbGQgPSBOVUxMOworCisgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIHdhaXRpbmcgZm9yIHJlZl9jb3VudCBvZiAlZCB0byByZWFjaCAxXG4iLAorICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgcXVldWUtPnRxX3JlZl9jb3VudCkpOworCisgICAgICAgIC8qIHdhaXQgdW50aWwgYWxsIG90aGVyIHRocmVhZHMgaGF2ZSBzdG9wcGVkIGFjY2Vzc2luZyB0aGlzIHF1ZXVlICovCisgICAgICAgIHdoaWxlIChxdWV1ZS0+dHFfcmVmX2NvdW50ID4gMSkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworCisgICAgICAgICAgICBLTVBfV0FJVF9ZSUVMRCgodm9sYXRpbGUga21wX3VpbnQzMiopJnF1ZXVlLT50cV9yZWZfY291bnQsIDEsIEtNUF9MRSwgTlVMTCk7CisKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgS01QX01CKCk7ICAvKiBtYWtlIHN1cmUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSBpbiBjb25zaXN0ZW50IHN0YXRlIGJlZm9yZSBxdWVyeWluZyB0aGVtICovCisgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgZmluZSB3aXRob3V0IHRoaXMgY2FsbCBmb3IgZGlnaXRhbC9hbHBoYSwgbmVlZGVkIGZvciBJQk0vUlM2MDAwICovCisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgfQorCisgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgZnJlZWluZyBxdWV1ZVxuIiwKKyAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSkpOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCk7CisgICAgS01QX0RFQlVHX0FTU0VSVChxdWV1ZS0+dHFfbmZ1bGwgPT0gMCk7CisKKyAgICBmb3IgKGk9MDsgaTxxdWV1ZS0+dHFfbnByb2M7IGkrKykgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV90aF90aHVua3NbaV0uYWlfZGF0YSA9PSAwKTsKKyAgICB9CisKKyAgICBpID0gMDsKKyAgICBmb3IgKHRodW5rPXF1ZXVlLT50cV9mcmVlX3RodW5rczsgdGh1bmsgIT0gTlVMTDsgdGh1bms9dGh1bmstPnRoLnRoX25leHRfZnJlZSkKKyAgICAgICAgKytpOworCisgICAgS01QX0FTU0VSVCAoaSA9PSBxdWV1ZS0+dHFfbnNsb3RzICsgKHF1ZXVlLT50cV9ucHJvYyAqIF9fS01QX1RBU0tRX1RIVU5LU19QRVJfVEgpKTsKKyNlbmRpZgorCisgICAgLyogIHJlbGVhc2Ugc3RvcmFnZSBmb3IgcXVldWUgZW50cnkgICovCisgICAgX19rbXBfZnJlZV90YXNrcSAoIHRxLCBxdWV1ZSwgVFJVRSwgZ2xvYmFsX3RpZCApOworCisgICAgS0ZfVFJBQ0UoNTAsICgiQWZ0ZXIgRGVsZXRpb24gb2YgVGFza1EgYXQgJXAgb24gKCVkKTpcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKK30KKworLyoKKyAqIFN0YXJ0aW5nIGZyb20gaW5kaWNhdGVkIHF1ZXVlLCBwcm9jZWVkIGRvd253YXJkIHRocm91Z2ggdHJlZSBhbmQKKyAqIHJlbW92ZSBhbGwgdGFza3FzIHdoaWNoIGFyZSBmaW5pc2hlZCwgYnV0IG9ubHkgZ28gZG93biB0byB0YXNrcXMKKyAqIHdoaWNoIGhhdmUgdGhlICJub3dhaXQiIGNsYXVzZSBwcmVzZW50LiAgQXNzdW1lIHRoaXMgaXMgb25seSBjYWxsZWQKKyAqIHdoZW4gaW5fcGFyYWxsZWw9VFJVRS4KKyAqLworCitzdGF0aWMgdm9pZAorX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCBrbXBfdGFza3FfdCAqdHEsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3Rhc2tfcXVldWVfdCAqY3Vycl9xdWV1ZSApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gY3Vycl9xdWV1ZTsKKworICAgIGlmIChjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZCAhPSBOVUxMKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgIHF1ZXVlID0gKGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworICAgICAgICBpZiAocXVldWUgIT0gTlVMTCkgeworICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisKKyAgICAgICAgd2hpbGUgKHF1ZXVlICE9IE5VTEwpICB7CisgICAgICAgICAgICBrbXBjX3Rhc2tfcXVldWVfdCAqbmV4dDsKKyAgICAgICAgICAgIGludCBjdCA9ICsrKHF1ZXVlLT50cV9yZWZfY291bnQpOworICAgICAgICAgICAgS01QX0RFQlVHX1JFRl9DVFMoKCJsaW5lICVkIGd0aWQgJWQ6IFEgJXAgaW5jICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgcXVldWUsIGN0KSk7CisKKworICAgICAgICAgICAgLyogYWx0aG91Z2ggcmVmZXJlbmNlIGNvdW50IHN0YXlzIGFjdGl2ZSBkdXJpbmcgZGVzY2VuZGFudCB3YWxrLCAqLworICAgICAgICAgICAgLyogc2hvdWxkbid0IG1hdHRlciBzaW5jZSBpZiBjaGlsZHJlbiBzdGlsbCBleGlzdCwgcmVmZXJlbmNlICAgICAqLworICAgICAgICAgICAgLyogY291bnRzIGFyZW4ndCBiZWluZyBtb25pdG9yZWQgYW55d2F5ICAgICAgICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgICAgICBpZiAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX05PV0FJVCkgeworICAgICAgICAgICAgICAgIF9fa21wX2ZpbmRfYW5kX3JlbW92ZV9maW5pc2hlZF9jaGlsZF90YXNrcSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgICAgICAgICAgaWYgKChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfQUxMX1RBU0tTX1FVRVVFRCkgJiYgKHF1ZXVlLT50cV9uZnVsbCA9PSAwKSAmJgorICAgICAgICAgICAgICAgICAgICBfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkgJiYgISBfX2ttcF90YXNrcV9oYXNfYW55X2NoaWxkcmVuKHF1ZXVlKSkgeworCisgICAgICAgICAgICAgICAgICAgIC8qCisgICAgICAgICAgICAgICAgICAgICBPbmx5IHJlbW92ZSB0aGlzIGlmIHdlIGhhdmUgbm90IGFscmVhZHkgbWFya2VkIGl0IGZvciBkZWFsbG9jYXRpb24uCisgICAgICAgICAgICAgICAgICAgICBUaGlzIHNob3VsZCBwcmV2ZW50IG11bHRpcGxlIHRocmVhZHMgZnJvbSB0cnlpbmcgdG8gZnJlZSB0aGlzLgorICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICAgICBpZiAoIF9fa21wX3Rlc3RfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpICkgeworICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCAhKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9ERUFMTE9DQVRFRCkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3JlbW92ZV9xdWV1ZV9mcm9tX3RyZWUoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgVFJVRSApOworCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogQ2FuJ3QgZG8gYW55IG1vcmUgaGVyZSBzaW5jZSBjYW4ndCBiZSBzdXJlIHdoZXJlIHNpYmxpbmcgcXVldWUgaXMgc28ganVzdCBleGl0IHRoaXMgbGV2ZWwgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBvdGhlcndpc2UsIGp1c3QgZmFsbCB0aHJvdWdoIGFuZCBkZWNyZW1lbnQgcmVmZXJlbmNlIGNvdW50ICovCisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXh0ID0gcXVldWUtPnRxX25leHRfY2hpbGQ7CisKKyAgICAgICAgICAgIGN0ID0gLS0ocXVldWUtPnRxX3JlZl9jb3VudCk7CisgICAgICAgICAgICBLTVBfREVCVUdfUkVGX0NUUygoImxpbmUgJWQgZ3RpZCAlZDogUSAlcCBkZWMgJWRcbiIsCisgICAgICAgICAgICAgIF9fTElORV9fLCBnbG9iYWxfdGlkLCBxdWV1ZSwgY3QpKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIGN0ID49IDAgKTsKKworICAgICAgICAgICAgcXVldWUgPSBuZXh0OworICAgICAgICB9CisKKyAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgY3Vycl9xdWV1ZS0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgIH0KK30KKworLyoKKyAqIFN0YXJ0aW5nIGZyb20gaW5kaWNhdGVkIHF1ZXVlLCBwcm9jZWVkIGRvd253YXJkIHRocm91Z2ggdHJlZSBhbmQKKyAqIHJlbW92ZSBhbGwgdGFza3EncyBhc3N1bWluZyBhbGwgYXJlIGZpbmlzaGVkIGFuZAorICogYXNzdW1pbmcgTk8gb3RoZXIgdGhyZWFkcyBhcmUgZXhlY3V0aW5nIGF0IHRoaXMgcG9pbnQuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX3JlbW92ZV9hbGxfY2hpbGRfdGFza3EoIGttcF90YXNrcV90ICp0cSwga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZSApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKm5leHRfY2hpbGQ7CisKKyAgICBxdWV1ZSA9IChrbXBjX3Rhc2tfcXVldWVfdCAqKSBxdWV1ZS0+dHFfZmlyc3RfY2hpbGQ7CisKKyAgICB3aGlsZSAocXVldWUgIT0gTlVMTCkgIHsKKyAgICAgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSApOworCisgICAgICAgIG5leHRfY2hpbGQgPSBxdWV1ZS0+dHFfbmV4dF9jaGlsZDsKKyAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9ERUFMTE9DQVRFRDsKKyAgICAgICAgX19rbXBfcmVtb3ZlX3F1ZXVlX2Zyb21fdHJlZSAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgRkFMU0UgKTsKKyAgICAgICAgcXVldWUgPSBuZXh0X2NoaWxkOworICAgIH0KK30KKworc3RhdGljIHZvaWQKK19fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCBrbXBfdGFza3FfdCAqdHEsIGlkZW50X3QgKmxvYywga21wX2ludDMyIGdsb2JhbF90aWQsIGttcGNfdGh1bmtfdCAqdGh1bmssIGludCBpbl9wYXJhbGxlbCApCit7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGttcF9pbnQzMiAgICAgICAgICB0aWQgICA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtGX1RSQUNFKDEwMCwgKCJBZnRlciBkZXF1ZXVlaW5nIHRoaXMgVGFzayBvbiAoJWQpOlxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX0RVTVAoMTAwLCBfX2ttcF9kdW1wX3RodW5rKCB0cSwgdGh1bmssIGdsb2JhbF90aWQgKSk7CisgICAgS0ZfVFJBQ0UoMTAwLCAoIlRhc2sgUXVldWU6ICVwIGxvb2tzIGxpa2UgdGhpcyAoJWQpOlxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICAvKgorICAgICAqIEZvciB0aGUgdGFza3EgdGFzaywgdGhlIGN1cnJfdGh1bmsgcHVzaGVzIGFuZCBwb3AgcGFpcnMgYXJlIHNldCB1cCBhcyBmb2xsb3dzOgorICAgICAqCisgICAgICogaGFwcGVucyBleGFjdGx5IG9uY2U6CisgICAgICogMSkgX19rbXBjX3Rhc2txICAgICAgICAgICAgIDogcHVzaCAoaWYgcmV0dXJuaW5nIHRodW5rIG9ubHkpCisgICAgICogNCkgX19rbXBjX2VuZF90YXNrcV90YXNrICAgIDogcG9wCisgICAgICoKKyAgICAgKiBvcHRpb25hbGx5IGhhcHBlbnMgKmVhY2gqIHRpbWUgdGFza3EgdGFzayBpcyBkZXF1ZXVlZC9lbnF1ZXVlZDoKKyAgICAgKiAyKSBfX2ttcGNfdGFza3FfdGFzayAgICAgICAgOiBwb3AKKyAgICAgKiAzKSBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSAgOiBwdXNoCisgICAgICoKKyAgICAgKiBleGVjdXRpb24gb3JkZXJpbmc6ICAxLCgyLDMpKiw0CisgICAgICovCisKKyAgICBpZiAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpIHsKKyAgICAgICAga21wX2ludDMyIGluZGV4ID0gKHF1ZXVlID09IHRxLT50cV9yb290KSA/IHRpZCA6IDA7CisgICAgICAgIHRodW5rLT50aC50aF9zaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSBxdWV1ZS0+dHFfc2hhcmVkc1tpbmRleF0uYWlfZGF0YTsKKworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApIHsKKyAgICAgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLAorICAgICAgICAgICAgICAgICAgICAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpID8gY3RfdGFza19vcmRlcmVkIDogY3RfdGFzaywKKyAgICAgICAgICAgICAgICAgICAgcXVldWUtPnRxX2xvYyApOworICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgICAgICBfX2ttcF9wdXNoX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgY3RfdGFza3EsIHF1ZXVlLT50cV9sb2MgKTsKKyAgICB9CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgdGh1bmstPnRoX2VuY2xfdGh1bmsgPSB0cS0+dHFfY3Vycl90aHVua1t0aWRdOworICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bms7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKworICAgIEtGX1RSQUNFKCA1MCwgKCJCZWdpbiBFeGVjdXRpbmcgVGh1bmsgJXAgZnJvbSBxdWV1ZSAlcCBvbiAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICB0aHVuay0+dGhfdGFzayAoZ2xvYmFsX3RpZCwgdGh1bmspOworICAgIEtGX1RSQUNFKCA1MCwgKCJFbmQgRXhlY3V0aW5nIFRodW5rICVwIGZyb20gcXVldWUgJXAgb24gKCVkKVxuIiwgdGh1bmssIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICBpZiAoISh0aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSykpIHsKKyAgICAgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICAgICAgX19rbXBfcG9wX3dvcmtzaGFyZSggZ2xvYmFsX3RpZCwgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSA/IGN0X3Rhc2tfb3JkZXJlZCA6IGN0X3Rhc2ssCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfbG9jICk7CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICB0cS0+dHFfY3Vycl90aHVua1t0aWRdID0gdGh1bmstPnRoX2VuY2xfdGh1bms7CisgICAgICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisgICAgICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgICAgIH0KKworICAgICAgICBpZiAoKHRodW5rLT50aF9mbGFncyAmIFRRRl9JU19PUkRFUkVEKSAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgX19rbXBfdGFza3FfY2hlY2tfb3JkZXJlZChnbG9iYWxfdGlkLCB0aHVuayk7CisgICAgICAgIH0KKworICAgICAgICBfX2ttcF9mcmVlX3RodW5rIChxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkKTsKKworICAgICAgICBLRl9UUkFDRSgxMDAsICgiVCMlZCBBZnRlciBmcmVlaW5nIHRodW5rOiAlcCwgVGFza1EgbG9va3MgbGlrZSB0aGlzOlxuIiwgZ2xvYmFsX3RpZCwgdGh1bmspKTsKKyAgICAgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGFza19xdWV1ZSggdHEsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgS01QX01CKCk7ICAgLyogbmVlZGVkIHNvIHRodW5rIHB1dCBvbiBmcmVlIGxpc3QgYmVmb3JlIG91dHN0YW5kaW5nIHRodW5rIGNvdW50IGlzIGRlY3JlbWVudGVkICovCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1t0aWRdLmFpX2RhdGEgPj0gMSk7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKCAyMDAsICgiX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWU6IFQjJWQgaGFzICVkIHRodW5rcyBpbiBxdWV1ZSAlcFxuIiwKKyAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YS0xLCBxdWV1ZSkpOworCisgICAgICAgICAgICBxdWV1ZS0+dHFfdGhfdGh1bmtzW3RpZF0uYWlfZGF0YS0tOworCisgICAgICAgICAgICAvKiBLTVBfTUIoKTsgKi8gICAgIC8qIGlzIE1CIHJlYWxseSBuZWNlc3NhcnkgPyAqLworICAgICAgICB9CisKKyAgICAgICAgaWYgKHF1ZXVlLT50cS50cV9wYXJlbnQgIT0gTlVMTCAmJiBpbl9wYXJhbGxlbCkgeworICAgICAgICAgICAgaW50IGN0OworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgY3QgPSAtLShxdWV1ZS0+dHFfcmVmX2NvdW50KTsKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cS50cV9wYXJlbnQtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGRlYyAlZFxuIiwKKyAgICAgICAgICAgICAgX19MSU5FX18sIGdsb2JhbF90aWQsIHF1ZXVlLCBjdCkpOworICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggY3QgPj0gMCApOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworLyogc3RhcnRzIGEgdGFza3E7IGNyZWF0ZXMgYW5kIHJldHVybnMgYSB0aHVuayBmb3IgdGhlIHRhc2txX3Rhc2sgICAgICAgICovCisvKiBhbHNvLCByZXR1cm5zIHBvaW50ZXIgdG8gc2hhcmVkIHZhcnMgZm9yIHRoaXMgdGhyZWFkIGluICJzaGFyZWRzIiBhcmcgKi8KKwora21wY190aHVua190ICoKK19fa21wY190YXNrcSggaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190YXNrX3QgdGFza3FfdGFzaywKKyAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl90aHVuaywgc2l6ZV90IHNpemVvZl9zaGFyZWRzLAorICAgICAgICAgICAgICBrbXBfaW50MzIgZmxhZ3MsIGttcGNfc2hhcmVkX3ZhcnNfdCAqKnNoYXJlZHMgKQoreworICAgIGludCAgICAgICAgICAgICAgICAgIGluX3BhcmFsbGVsOworICAgIGttcF9pbnQzMiAgICAgICAgICAgIG5zbG90cywgbnRodW5rcywgbnNoYXJlZHMsIG5wcm9jOworICAgIGttcGNfdGFza19xdWV1ZV90ICAgKm5ld19xdWV1ZSwgKmN1cnJfcXVldWU7CisgICAga21wY190aHVua190ICAgICAgICAqbmV3X3Rhc2txX3RodW5rOworICAgIGttcF9pbmZvX3QgICAgICAgICAgKnRoOworICAgIGttcF90ZWFtX3QgICAgICAgICAgKnRlYW07CisgICAga21wX3Rhc2txX3QgICAgICAgICAqdHE7CisgICAga21wX2ludDMyICAgICAgICAgICAgdGlkOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcSBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgdGggPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisgICAgdGVhbSA9IHRoIC0+IHRoLnRoX3RlYW07CisgICAgdHEgPSAmIHRlYW0gLT4gdC50X3Rhc2txOworICAgIG5wcm9jID0gdGVhbSAtPiB0LnRfbnByb2M7CisgICAgdGlkID0gX19rbXBfdGlkX2Zyb21fZ3RpZCggZ2xvYmFsX3RpZCApOworCisgICAgLyogZmluZCBvdXQgd2hldGhlciB0aGlzIGlzIGEgcGFyYWxsZWwgdGFza3Egb3Igc2VyaWFsaXplZCBvbmUuICovCisgICAgaW5fcGFyYWxsZWwgPSBpbl9wYXJhbGxlbF9jb250ZXh0KCB0ZWFtICk7CisKKyAgICBpZiggISB0cS0+dHFfcm9vdCApIHsKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IF9fa21wX3Rhc2txX2VvOworCisgICAgICAgICAgICAvKiBWZWN0b3IgT1JERVJFRCBTRUNUSU9OIHRvIHRhc2txIHZlcnNpb24gKi8KKyAgICAgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZHhvX2ZjbiA9IF9fa21wX3Rhc2txX3hvOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKSB7CisgICAgICAgICAgICAvKiBUaGlzIHNob3VsZG4ndCBiZSBhIGJhcnJpZXIgcmVnaW9uIGJvdW5kYXJ5LCBpdCB3aWxsIGNvbmZ1c2UgdGhlIHVzZXIuICovCisgICAgICAgICAgICAvKiBOZWVkIHRoZSBib3VuZGFyeSB0byBiZSBhdCB0aGUgZW5kIHRhc2txIGluc3RlYWQuICovCisgICAgICAgICAgICBpZiAoIF9fa21wX2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQsIFRSVUUsIDAsIE5VTEwsIE5VTEwgKSkgeworICAgICAgICAgICAgICAgIC8qIENyZWF0aW5nIHRoZSBhY3RpdmUgcm9vdCBxdWV1ZSwgYW5kIHdlIGFyZSBub3QgdGhlIG1hc3RlciB0aHJlYWQuICovCisgICAgICAgICAgICAgICAgLyogVGhlIG1hc3RlciB0aHJlYWQgYmVsb3cgY3JlYXRlZCB0aGUgcXVldWUgYW5kIHRhc2tzIGhhdmUgYmVlbiAgICAgKi8KKyAgICAgICAgICAgICAgICAvKiBlbnF1ZXVlZCwgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIHJlbGVhc2VkIHRoaXMgYmFycmllci4gIFRoaXMgICAgICAqLworICAgICAgICAgICAgICAgIC8qIHdvcmtlciB0aHJlYWQgY2FuIG5vdyBwcm9jZWVkIGFuZCBleGVjdXRlIHRhc2tzLiAgU2VlIGFsc28gdGhlICAgICovCisgICAgICAgICAgICAgICAgLyogVFFGX1JFTEVBU0VfV09SS0VSUyB3aGljaCBpcyB1c2VkIHRvIGhhbmRsZSB0aGlzIGNhc2UuICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgICpzaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSB0cS0+dHFfcm9vdC0+dHFfc2hhcmVkc1t0aWRdLmFpX2RhdGE7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2txIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgICAgICByZXR1cm4gTlVMTDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIG1hc3RlciB0aHJlYWQgb25seSBleGVjdXRlcyB0aGlzIGNvZGUgKi8KKworICAgICAgICBpZiggdHEtPnRxX2N1cnJfdGh1bmtfY2FwYWNpdHkgPCBucHJvYyApIHsKKyAgICAgICAgICAgIGlmKHRxLT50cV9jdXJyX3RodW5rKQorICAgICAgICAgICAgICAgIF9fa21wX2ZyZWUodHEtPnRxX2N1cnJfdGh1bmspOworICAgICAgICAgICAgZWxzZSB7CisgICAgICAgICAgICAgICAgLyogb25seSBuZWVkIHRvIGRvIHRoaXMgb25jZSBhdCBvdXRlciBsZXZlbCwgaS5lLiB3aGVuIHRxX2N1cnJfdGh1bmsgaXMgc3RpbGwgTlVMTCAqLworICAgICAgICAgICAgICAgIF9fa21wX2luaXRfbG9jayggJiB0cS0+dHFfZnJlZWxpc3RfbGNrICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHRxLT50cV9jdXJyX3RodW5rID0gKGttcGNfdGh1bmtfdCAqKikgX19rbXBfYWxsb2NhdGUoIG5wcm9jICogc2l6ZW9mKGttcGNfdGh1bmtfdCAqKSApOworICAgICAgICAgICAgdHEgLT4gdHFfY3Vycl90aHVua19jYXBhY2l0eSA9IG5wcm9jOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGluX3BhcmFsbGVsKQorICAgICAgICAgICAgdHEtPnRxX2dsb2JhbF9mbGFncyA9IFRRRl9SRUxFQVNFX1dPUktFUlM7CisgICAgfQorCisgICAgLyogZGtwOiBpbiBmdXR1cmUsIGlmIGZsYWdzICYgVFFGX0hFVVJJU1RJQ1MsIHdpbGwgY2hvb3NlIG5zbG90cyBiYXNlZCAqLworICAgIC8qICAgICAgb24gc29tZSBoZXVyaXN0aWNzIChlLmcuLCBkZXB0aCBvZiBxdWV1ZSBuZXN0aW5nPykuICAgICAgICAgICAgKi8KKworICAgIG5zbG90cyA9IChpbl9wYXJhbGxlbCkgPyAoMiAqIG5wcm9jKSA6IDE7CisKKyAgICAvKiBUaGVyZSBtdXN0IGJlIG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCBleHRyYSBzbG90cyBmb3IgcGVuZGluZyAqLworICAgIC8qIGpvYnMgYmVpbmcgZXhlY3V0ZWQgYnkgb3RoZXIgdGhyZWFkcywgYW5kIG9uZSBleHRyYSBmb3IgdGFza3Egc2xvdCAgICAgICAgICAqLworCisgICAgbnRodW5rcyA9IChpbl9wYXJhbGxlbCkgPyAobnNsb3RzICsgKG5wcm9jICogX19LTVBfVEFTS1FfVEhVTktTX1BFUl9USCkgKyAxKSA6IG5zbG90cyArIDI7CisKKyAgICAvKiBPbmx5IHRoZSByb290IHRhc2txIGdldHMgYSBwZXItdGhyZWFkIGFycmF5IG9mIHNoYXJlZHMuICAgICAgICovCisgICAgLyogVGhlIHJlc3Qgb2YgdGhlIHRhc2txJ3Mgb25seSBnZXQgb25lIGNvcHkgb2YgdGhlIHNoYXJlZCB2YXJzLiAqLworCisgICAgbnNoYXJlZHMgPSAoICF0cS0+dHFfcm9vdCAmJiBpbl9wYXJhbGxlbCkgPyBucHJvYyA6IDE7CisKKyAgICAvKiAgY3JlYXRlIG92ZXJhbGwgcXVldWUgZGF0YSBzdHJ1Y3R1cmUgYW5kIGl0cyBjb21wb25lbnRzIHRoYXQgcmVxdWlyZSBhbGxvY2F0aW9uICovCisKKyAgICBuZXdfcXVldWUgPSBfX2ttcF9hbGxvY190YXNrcSAoIHRxLCBpbl9wYXJhbGxlbCwgbnNsb3RzLCBudGh1bmtzLCBuc2hhcmVkcywgbnByb2MsCisgICAgICAgIHNpemVvZl90aHVuaywgc2l6ZW9mX3NoYXJlZHMsICZuZXdfdGFza3FfdGh1bmssIGdsb2JhbF90aWQgKTsKKworICAgIC8qICByZXN0IG9mIG5ld19xdWV1ZSBpbml0aWFsaXphdGlvbnMgICovCisKKyAgICBuZXdfcXVldWUtPnRxX2ZsYWdzICAgICAgICAgICA9IGZsYWdzICYgVFFGX0lOVEVSRkFDRV9GTEFHUzsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZyAgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyAgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxX2ZsYWdzICAgICAgICAgICB8PSBUUUZfUEFSQUxMRUxfQ09OVEVYVDsKKyAgICB9CisKKyAgICBuZXdfcXVldWUtPnRxX3Rhc2txX3Nsb3QgICA9IE5VTEw7CisgICAgbmV3X3F1ZXVlLT50cV9uc2xvdHMgICAgICAgPSBuc2xvdHM7CisgICAgbmV3X3F1ZXVlLT50cV9oaXdhdCAgICAgICAgPSBISUdIX1dBVEVSX01BUksgKG5zbG90cyk7CisgICAgbmV3X3F1ZXVlLT50cV9uZnVsbCAgICAgICAgPSAwOworICAgIG5ld19xdWV1ZS0+dHFfaGVhZCAgICAgICAgID0gMDsKKyAgICBuZXdfcXVldWUtPnRxX3RhaWwgICAgICAgICA9IDA7CisgICAgbmV3X3F1ZXVlLT50cV9sb2MgICAgICAgICAgPSBsb2M7CisKKyAgICBpZiAoKG5ld19xdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfT1JERVJFRCkgJiYgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgLyogcHJlcGFyZSB0byBzZXJ2ZSB0aGUgZmlyc3QtcXVldWVkIHRhc2sncyBPUkRFUkVEIGRpcmVjdGl2ZSAqLworICAgICAgICBuZXdfcXVldWUtPnRxX3Rhc2tudW1fc2VydmluZyA9IDE7CisKKyAgICAgICAgLyogVmVjdG9yIE9SREVSRUQgU0VDVElPTiB0byB0YXNrcSB2ZXJzaW9uICovCisgICAgICAgIHRoLT50aC50aF9kaXNwYXRjaC0+dGhfZGVvX2ZjbiA9IF9fa21wX3Rhc2txX2VvOworCisgICAgICAgIC8qIFZlY3RvciBPUkRFUkVEIFNFQ1RJT04gdG8gdGFza3EgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSBfX2ttcF90YXNrcV94bzsKKyAgICB9CisKKyAgICAvKiAgY3JlYXRlIGEgbmV3IHRodW5rIGZvciB0aGUgdGFza3FfdGFzayBpbiB0aGUgbmV3X3F1ZXVlICAqLworICAgICpzaGFyZWRzID0gKGttcGNfc2hhcmVkX3ZhcnNfdCAqKSBuZXdfcXVldWUtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YTsKKworICAgIG5ld190YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcyA9ICpzaGFyZWRzOworICAgIG5ld190YXNrcV90aHVuay0+dGhfdGFzayAgICAgICA9IHRhc2txX3Rhc2s7CisgICAgbmV3X3Rhc2txX3RodW5rLT50aF9mbGFncyAgICAgID0gbmV3X3F1ZXVlLT50cV9mbGFncyB8IFRRRl9UQVNLUV9UQVNLOworICAgIG5ld190YXNrcV90aHVuay0+dGhfc3RhdHVzICAgICA9IDA7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUIChuZXdfdGFza3FfdGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOworCisgICAgLyogS01QX01CKCk7ICovIC8qIG1ha2Ugc3VyZSB0aGVzZSBpbml0cyBjb21wbGV0ZSBiZWZvcmUgdGhyZWFkcyBzdGFydCB1c2luZyB0aGlzIHF1ZXVlIChuZWNlc3Nhcnk/KSAqLworCisgICAgLyogaW5zZXJ0IHRoZSBuZXcgdGFzayBxdWV1ZSBpbnRvIHRoZSB0cmVlLCBidXQgb25seSBhZnRlciBhbGwgZmllbGRzIGluaXRpYWxpemVkICovCisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgaWYoICEgdHEtPnRxX3Jvb3QgKSB7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9uZXh0X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3ByZXZfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfcmVmX2NvdW50ICAgPSAxOworICAgICAgICAgICAgdHEtPnRxX3Jvb3QgPSBuZXdfcXVldWU7CisgICAgICAgIH0KKyAgICAgICAgZWxzZSB7CisgICAgICAgICAgICBjdXJyX3F1ZXVlID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXS0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gY3Vycl9xdWV1ZTsKKyAgICAgICAgICAgIG5ld19xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBOVUxMOworICAgICAgICAgICAgbmV3X3F1ZXVlLT50cV9wcmV2X2NoaWxkICA9IE5VTEw7CisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCAgID0gMTsgICAgICAvKiBmb3IgdGhpcyB0aGUgdGhyZWFkIHRoYXQgYnVpbHQgdGhlIHF1ZXVlICovCisKKyAgICAgICAgICAgIEtNUF9ERUJVR19SRUZfQ1RTKCgibGluZSAlZCBndGlkICVkOiBRICVwIGFsbG9jICVkXG4iLAorICAgICAgICAgICAgICBfX0xJTkVfXywgZ2xvYmFsX3RpZCwgbmV3X3F1ZXVlLCBuZXdfcXVldWUtPnRxX3JlZl9jb3VudCkpOworCisgICAgICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soJiBjdXJyX3F1ZXVlLT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBuZXdfcXVldWUtPnRxX25leHRfY2hpbGQgPSAoc3RydWN0IGttcGNfdGFza19xdWV1ZV90ICopIGN1cnJfcXVldWUtPnRxX2ZpcnN0X2NoaWxkOworCisgICAgICAgICAgICBpZiAoY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICBjdXJyX3F1ZXVlLT50cV9maXJzdF9jaGlsZC0+dHFfcHJldl9jaGlsZCA9IG5ld19xdWV1ZTsKKworICAgICAgICAgICAgY3Vycl9xdWV1ZS0+dHFfZmlyc3RfY2hpbGQgPSBuZXdfcXVldWU7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIGN1cnJfcXVldWUtPnRxX2xpbmtfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgfQorCisgICAgICAgIC8qIHNldCB1cCB0aHVuayBzdGFjayBvbmx5IGFmdGVyIGNvZGUgdGhhdCBkZXRlcm1pbmVzIGN1cnJfcXVldWUgYWJvdmUgKi8KKyAgICAgICAgbmV3X3Rhc2txX3RodW5rLT50aF9lbmNsX3RodW5rID0gdHEtPnRxX2N1cnJfdGh1bmtbdGlkXTsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IG5ld190YXNrcV90aHVuazsKKworICAgICAgICBLRl9EVU1QKCAyMDAsIF9fa21wX2R1bXBfdGh1bmtfc3RhY2soIHRxLT50cV9jdXJyX3RodW5rW3RpZF0sIGdsb2JhbF90aWQgKSk7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBuZXdfdGFza3FfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSAwOworICAgICAgICBuZXdfcXVldWUtPnRxLnRxX3BhcmVudCAgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9maXJzdF9jaGlsZCA9IE5VTEw7CisgICAgICAgIG5ld19xdWV1ZS0+dHFfbmV4dF9jaGlsZCAgPSBOVUxMOworICAgICAgICBuZXdfcXVldWUtPnRxX3ByZXZfY2hpbGQgID0gTlVMTDsKKyAgICAgICAgbmV3X3F1ZXVlLT50cV9yZWZfY291bnQgICA9IDE7CisgICAgfQorCisjaWZkZWYgS01QX0RFQlVHCisgICAgS0ZfVFJBQ0UoMTUwLCAoIkNyZWF0aW5nIFRhc2tRIFRhc2sgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDE1MCwgX19rbXBfZHVtcF90aHVuayggdHEsIG5ld190YXNrcV90aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBLRl9UUkFDRSgyNSwgKCJBZnRlciBUYXNrUSBhdCAlcCBDcmVhdGlvbiBvbiAoJWQpOlxuIiwgbmV3X3F1ZXVlLCBnbG9iYWxfdGlkKSk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0ZfVFJBQ0UoMjUsICgiQWZ0ZXIgU2VyaWFsIFRhc2tRIGF0ICVwIENyZWF0aW9uIG9uICglZCk6XG4iLCBuZXdfcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICB9CisKKyAgICBLRl9EVU1QKDI1LCBfX2ttcF9kdW1wX3Rhc2tfcXVldWUoIHRxLCBuZXdfcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKKyAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3B1c2hfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbmV3X3F1ZXVlLT50cV9sb2MgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiBuZXdfdGFza3FfdGh1bms7Cit9CisKKworLyogIGVuZHMgYSB0YXNrcTsgbGFzdCB0aHJlYWQgb3V0IGRlc3Ryb3lzIHRoZSBxdWV1ZSAgKi8KKwordm9pZAorX19rbXBjX2VuZF90YXNrcShpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGttcF9pbnQzMiAgICAgICAgICAgaTsKKyNlbmRpZgorICAgIGttcF90YXNrcV90ICAgICAgICAqdHE7CisgICAgaW50ICAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBrbXBfaW5mb190ICAgICAgICAgKnRoOworICAgIGttcF9pbnQzMiAgICAgICAgICAgaXNfb3V0ZXJtb3N0OworICAgIGttcGNfdGFza19xdWV1ZV90ICAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgICp0aHVuazsKKyAgICBpbnQgICAgICAgICAgICAgICAgIG5wcm9jOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgY2FsbGVkICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHRxID0gJiBfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIG5wcm9jID0gX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF9ucHJvYzsKKworICAgIC8qIEZvciB0aGUgb3V0ZXJtb3N0IHRhc2txIG9ubHksIGFsbCBidXQgb25lIHRocmVhZCB3aWxsIGhhdmUgdGFza3FfdGh1bmsgPT0gTlVMTCAqLworICAgIHF1ZXVlID0gKHRhc2txX3RodW5rID09IE5VTEwpID8gdHEtPnRxX3Jvb3QgOiB0YXNrcV90aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWU7CisKKyAgICBLRV9UUkFDRSggNTAsICgiX19rbXBjX2VuZF90YXNrcSBxdWV1ZT0lcCAoJWQpIFxuIiwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICBpc19vdXRlcm1vc3QgPSAocXVldWUgPT0gdHEtPnRxX3Jvb3QpOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworICAgICAgICBrbXBfdWludDMyIHNwaW5zOworCisgICAgICAgIC8qIHRoaXMgaXMganVzdCBhIHNhZmVndWFyZCB0byByZWxlYXNlIHRoZSB3YWl0aW5nIHRocmVhZHMgaWYgKi8KKyAgICAgICAgLyogdGhlIG91dGVybW9zdCB0YXNrcSBuZXZlciBxdWV1ZXMgYSB0YXNrICAgICAgICAgICAgICAgICAgICAqLworCisgICAgICAgIGlmIChpc19vdXRlcm1vc3QgJiYgKEtNUF9NQVNURVJfR1RJRCggZ2xvYmFsX3RpZCApKSkgeworICAgICAgICAgICAgaWYoIHRxLT50cV9nbG9iYWxfZmxhZ3MgJiBUUUZfUkVMRUFTRV9XT1JLRVJTICkgeworICAgICAgICAgICAgICAgIC8qIG5vIGxvY2sgbmVlZGVkLCB3b3JrZXJzIGFyZSBzdGlsbCBpbiBzcGluIG1vZGUgKi8KKyAgICAgICAgICAgICAgICB0cS0+dHFfZ2xvYmFsX2ZsYWdzICY9IH5UUUZfUkVMRUFTRV9XT1JLRVJTOworCisgICAgICAgICAgICAgICAgX19rbXBfZW5kX3NwbGl0X2JhcnJpZXIoIGJzX3BsYWluX2JhcnJpZXIsIGdsb2JhbF90aWQgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisgICAgICAgIC8qIGtlZXAgZGVxdWV1ZWluZyB3b3JrIHVudGlsIGFsbCB0YXNrcyBhcmUgcXVldWVkIGFuZCBkZXF1ZXVlZCAqLworCisgICAgICAgIGRvIHsKKyAgICAgICAgICAgIC8qIHdhaXQgdW50aWwgc29tZXRoaW5nIGlzIGF2YWlsYWJsZSB0byBkZXF1ZXVlICovCisgICAgICAgICAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICAgICAgICAgIHdoaWxlICggKHF1ZXVlLT50cV9uZnVsbCA9PSAwKQorICAgICAgICAgICAgICAgICAmJiAocXVldWUtPnRxX3Rhc2txX3Nsb3QgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgJiYgKCEgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkgKQorICAgICAgICAgICAgICAgICAmJiAoISAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpICkKKyAgICAgICAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCBUUlVFLCBzcGlucyApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICAvKiBjaGVjayB0byBzZWUgaWYgd2UgY2FuIGV4ZWN1dGUgdGFza3MgaW4gdGhlIHF1ZXVlICovCisgICAgICAgICAgICB3aGlsZSAoICggKHF1ZXVlLT50cV9uZnVsbCAhPSAwKSB8fCAocXVldWUtPnRxX3Rhc2txX3Nsb3QgIT0gTlVMTCkgKQorICAgICAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUoZ2xvYmFsX3RpZCwgcXVldWUpKSAhPSBOVUxMCisgICAgICAgICAgICAgICAgICApIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJGb3VuZCB0aHVuazogJXAgaW4gcHJpbWFyeSBxdWV1ZSAlcCAoJWQpXG4iLCB0aHVuaywgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIC8qIHNlZSBpZiB3b3JrIGZvdW5kIGNhbiBiZSBmb3VuZCBpbiBhIGRlc2NlbmRhbnQgcXVldWUgKi8KKyAgICAgICAgICAgIGlmICggKF9fa21wX3Rhc2txX2hhc19hbnlfY2hpbGRyZW4ocXVldWUpKQorICAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSkpICE9IE5VTEwKKyAgICAgICAgICAgICAgICkgeworCisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU3RvbGUgdGh1bms6ICVwIGluIGRlc2NlbmRhbnQgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkICkpOworCisgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgfQorCisgICAgICAgIH0gd2hpbGUgKCAoISAocXVldWUtPnRxX2ZsYWdzICYgVFFGX0FMTF9UQVNLU19RVUVVRUQpKQorICAgICAgICAgICAgICAgfHwgKHF1ZXVlLT50cV9uZnVsbCAhPSAwKQorICAgICAgICAgICAgICAgICk7CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiQWxsIHRhc2tzIHF1ZXVlZCBhbmQgZGVxdWV1ZWQgaW4gcXVldWU6ICVwICglZClcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgLyogd2FpdCB3aGlsZSBhbGwgdGFza3MgYXJlIG5vdCBmaW5pc2hlZCBhbmQgbW9yZSB3b3JrIGZvdW5kCisgICAgICAgICAgIGluIGRlc2NlbmRhbnQgcXVldWVzICovCisKKyAgICAgICAgd2hpbGUgKCAoIV9fa21wX3Rhc2txX3Rhc2tzX2ZpbmlzaGVkKHF1ZXVlKSkKKyAgICAgICAgICAgICAmJiAodGh1bmsgPSBfX2ttcF9maW5kX3Rhc2tfaW5fZGVzY2VuZGFudF9xdWV1ZShnbG9iYWxfdGlkLCBxdWV1ZSkpICE9IE5VTEwKKyAgICAgICAgICAgICAgKSB7CisKKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlN0b2xlIHRodW5rOiAlcCBpbiBkZXNjZW5kYW50IHF1ZXVlOiAlcCB3aGlsZSB3YWl0aW5nIGluIHF1ZXVlOiAlcCAoJWQpXG4iLAorICAgICAgICAgICAgICAgIHRodW5rLCB0aHVuay0+dGgudGhfc2hhcmVkcy0+c3ZfcXVldWUsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIk5vIHdvcmsgZm91bmQgaW4gZGVzY2VuZGVudCBxdWV1ZXMgb3IgYWxsIHdvcmsgZmluaXNoZWQgaW4gcXVldWU6ICVwICglZClcbiIsIHF1ZXVlLCBnbG9iYWxfdGlkKSk7CisKKyAgICAgICAgaWYgKCFpc19vdXRlcm1vc3QpIHsKKyAgICAgICAgICAgIC8qIG5lZWQgdG8gcmV0dXJuIGlmIE5PV0FJVCBwcmVzZW50IGFuZCBub3Qgb3V0ZXJtb3N0IHRhc2txICovCisKKyAgICAgICAgICAgIGlmIChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUKSB7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxLnRxX3BhcmVudC0+dHFfbGlua19sY2ssIGdsb2JhbF90aWQpOworICAgICAgICAgICAgICAgIHF1ZXVlLT50cV9yZWZfY291bnQtLTsKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBxdWV1ZS0+dHFfcmVmX2NvdW50ID49IDAgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHEudHFfcGFyZW50LT50cV9saW5rX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX2VuZF90YXNrcSByZXR1cm4gZm9yIG5vd2FpdCBjYXNlICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKworICAgICAgICAgICAgLyogV0FJVCB1bnRpbCBhbGwgdGFza3MgYXJlIGZpbmlzaGVkIGFuZCBubyBjaGlsZCBxdWV1ZXMgZXhpc3QgYmVmb3JlIHByb2NlZWRpbmcgKi8KKyAgICAgICAgICAgIEtNUF9JTklUX1lJRUxEKHNwaW5zKTsKKworICAgICAgICAgICAgd2hpbGUgKCFfX2ttcF90YXNrcV90YXNrc19maW5pc2hlZChxdWV1ZSkgfHwgX19rbXBfdGFza3FfaGFzX2FueV9jaGlsZHJlbihxdWV1ZSkpIHsKKyAgICAgICAgICAgICAgICB0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9hbmNlc3Rvcl9xdWV1ZSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgICAgICBpZiAodGh1bmsgIT0gTlVMTCkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gYW5jZXN0b3IgcXVldWU6ICVwIHdoaWxlIHdhaXRpbmcgaW4gcXVldWU6ICVwICglZClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfZXhlY3V0ZV90YXNrX2Zyb21fcXVldWUoIHRxLCBsb2MsIGdsb2JhbF90aWQsIHRodW5rLCBpbl9wYXJhbGxlbCApOworICAgICAgICAgICAgICAgIH0KKworICAgICAgICAgICAgICAgIEtNUF9ZSUVMRF9XSEVOKCB0aHVuayA9PSBOVUxMLCBzcGlucyApOworCisgICAgICAgICAgICAgICAgX19rbXBfZmluZF9hbmRfcmVtb3ZlX2ZpbmlzaGVkX2NoaWxkX3Rhc2txKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisgICAgICAgICAgICBpZiAoICEocXVldWUtPnRxX2ZsYWdzICYgVFFGX0RFQUxMT0NBVEVEKSApIHsKKyAgICAgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgfQorICAgICAgICAgICAgX19rbXBfcmVsZWFzZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIC8qIG9ubHkgdGhlIGFsbG9jYXRpbmcgdGhyZWFkIGNhbiBkZWFsbG9jYXRlIHRoZSBxdWV1ZSAqLworICAgICAgICAgICAgaWYgKHRhc2txX3RodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9yZW1vdmVfcXVldWVfZnJvbV90cmVlKCB0cSwgZ2xvYmFsX3RpZCwgcXVldWUsIFRSVUUgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuIGZvciBub25fb3V0ZXJtb3N0IHF1ZXVlLCB3YWl0IGNhc2UgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKworICAgICAgICAvKiBPdXRlcm1vc3QgUXVldWU6IHN0ZWFsIHdvcmsgZnJvbSBkZXNjZW5kYW50cyB1bnRpbCBhbGwgdGFza3MgYXJlIGZpbmlzaGVkICovCisKKyAgICAgICAgS01QX0lOSVRfWUlFTEQoc3BpbnMpOworCisgICAgICAgIHdoaWxlICghX19rbXBfdGFza3FfdGFza3NfZmluaXNoZWQocXVldWUpKSB7CisgICAgICAgICAgICB0aHVuayA9IF9fa21wX2ZpbmRfdGFza19pbl9kZXNjZW5kYW50X3F1ZXVlKGdsb2JhbF90aWQsIHF1ZXVlKTsKKworICAgICAgICAgICAgaWYgKHRodW5rICE9IE5VTEwpIHsKKyAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJTdG9sZSB0aHVuazogJXAgaW4gZGVzY2VuZGFudCBxdWV1ZTogJXAgd2hpbGUgd2FpdGluZyBpbiBxdWV1ZTogJXAgKCVkKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGh1bmssIHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZSwgcXVldWUsIGdsb2JhbF90aWQpKTsKKworICAgICAgICAgICAgICAgIF9fa21wX2V4ZWN1dGVfdGFza19mcm9tX3F1ZXVlKCB0cSwgbG9jLCBnbG9iYWxfdGlkLCB0aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICAgICAgICAgIH0KKworICAgICAgICAgICAgS01QX1lJRUxEX1dIRU4oIHRodW5rID09IE5VTEwsIHNwaW5zICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBOZWVkIHRoaXMgYmFycmllciB0byBwcmV2ZW50IGRlc3RydWN0aW9uIG9mIHF1ZXVlIGJlZm9yZSB0aHJlYWRzIGhhdmUgYWxsIGV4ZWN1dGVkIGFib3ZlIGNvZGUgKi8KKyAgICAgICAgLyogVGhpcyBtYXkgbmVlZCB0byBiZSBkb25lIGVhcmxpZXIgd2hlbiBOT1dBSVQgaXMgaW1wbGVtZW50ZWQgZm9yIHRoZSBvdXRlcm1vc3QgbGV2ZWwgKi8KKworICAgICAgICBpZiAoICFfX2ttcF9iYXJyaWVyKCBic19wbGFpbl9iYXJyaWVyLCBnbG9iYWxfdGlkLCBUUlVFLCAwLCBOVUxMLCBOVUxMICkpIHsKKyAgICAgICAgICAgIC8qIHRoZSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSVNfTk9XQUlUIGNhc2UgaXMgbm90IHlldCBoYW5kbGVkIGhlcmU7ICAgKi8KKyAgICAgICAgICAgIC8qIGZvciByaWdodCBub3csIGV2ZXJ5Ym9keSB3YWl0cywgYW5kIHRoZSBtYXN0ZXIgdGhyZWFkIGRlc3Ryb3lzIHRoZSAgKi8KKyAgICAgICAgICAgIC8qIHJlbWFpbmluZyBxdWV1ZXMuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgX19rbXBfcmVtb3ZlX2FsbF9jaGlsZF90YXNrcSggdHEsIGdsb2JhbF90aWQsIHF1ZXVlICk7CisKKyAgICAgICAgICAgIC8qIE5vdyBkZXN0cm95IHRoZSByb290IHF1ZXVlICovCisgICAgICAgICAgICBLRl9UUkFDRSgxMDAsICgiVCMlZCBCZWZvcmUgRGVsZXRpb24gb2YgdG9wLWxldmVsIFRhc2tRIGF0ICVwOlxuIiwgZ2xvYmFsX3RpZCwgcXVldWUgKSk7CisgICAgICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIC8qICB0aGUgcm9vdCBxdWV1ZSBlbnRyeSAgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKChxdWV1ZS0+dHEudHFfcGFyZW50ID09IE5VTEwpICYmIChxdWV1ZS0+dHFfbmV4dF9jaGlsZCA9PSBOVUxMKSk7CisKKyAgICAgICAgICAgIC8qICBjaGlsZHJlbiBtdXN0IGFsbCBiZSBnb25lIGJ5IG5vdyBiZWNhdXNlIG9mIGJhcnJpZXIgYWJvdmUgKi8KKyAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQgKHF1ZXVlLT50cV9maXJzdF9jaGlsZCA9PSBOVUxMKTsKKworICAgICAgICAgICAgZm9yIChpPTA7IGk8bnByb2M7IGkrKykgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQocXVldWUtPnRxX3RoX3RodW5rc1tpXS5haV9kYXRhID09IDApOworICAgICAgICAgICAgfQorCisgICAgICAgICAgICBmb3IgKGk9MCwgdGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyBpKyssIHRodW5rPXRodW5rLT50aC50aF9uZXh0X2ZyZWUpOworCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAobnByb2MgKiBfX0tNUF9UQVNLUV9USFVOS1NfUEVSX1RIKSk7CisKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBucHJvYzsgaSsrKSB7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggISB0cS0+dHFfY3Vycl90aHVua1tpXSApOworICAgICAgICAgICAgfQorI2VuZGlmCisgICAgICAgICAgICAvKiAgdW5saW5rIHRoZSByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgICAgICAgdHEgLT4gdHFfcm9vdCA9ICBOVUxMOworCisgICAgICAgICAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciByb290IHF1ZXVlIGVudHJ5ICAqLworICAgICAgICAgICAgS0ZfVFJBQ0UoNTAsICgiQWZ0ZXIgRGVsZXRpb24gb2YgdG9wLWxldmVsIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0RFQUxMT0NBVEVEOworICAgICAgICAgICAgX19rbXBfZnJlZV90YXNrcSAoIHRxLCBxdWV1ZSwgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQgKTsKKworICAgICAgICAgICAgS0ZfRFVNUCg1MCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlX3RyZWUoIHRxLCB0cS0+dHFfcm9vdCwgZ2xvYmFsX3RpZCApKTsKKworICAgICAgICAgICAgLyogcmVsZWFzZSB0aGUgd29ya2VycyBub3cgdGhhdCB0aGUgZGF0YSBzdHJ1Y3R1cmVzIGFyZSB1cCB0byBkYXRlICovCisgICAgICAgICAgICBfX2ttcF9lbmRfc3BsaXRfYmFycmllciggYnNfcGxhaW5fYmFycmllciwgZ2xvYmFsX3RpZCApOworICAgICAgICB9CisKKyAgICAgICAgdGggPSBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF07CisKKyAgICAgICAgLyogUmVzZXQgT1JERVJFRCBTRUNUSU9OIHRvIHBhcmFsbGVsIHZlcnNpb24gKi8KKyAgICAgICAgdGgtPnRoLnRoX2Rpc3BhdGNoLT50aF9kZW9fZmNuID0gMDsKKworICAgICAgICAvKiBSZXNldCBPUkRFUkVEIFNFQ1RJT04gdG8gcGFyYWxsZWwgdmVyc2lvbiAqLworICAgICAgICB0aC0+dGgudGhfZGlzcGF0Y2gtPnRoX2R4b19mY24gPSAwOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgLyogaW4gc2VyaWFsIGV4ZWN1dGlvbiBjb250ZXh0LCBkZXF1ZXVlIHRoZSBsYXN0IHRhc2sgICovCisgICAgICAgIC8qIGFuZCBleGVjdXRlIGl0LCBpZiB0aGVyZSB3ZXJlIGFueSB0YXNrcyBlbmNvdW50ZXJlZCAqLworCisgICAgICAgIGlmIChxdWV1ZS0+dHFfbmZ1bGwgPiAwKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAxKTsKKworICAgICAgICAgICAgdGh1bmsgPSBfX2ttcF9kZXF1ZXVlX3Rhc2soZ2xvYmFsX3RpZCwgcXVldWUsIGluX3BhcmFsbGVsKTsKKworICAgICAgICAgICAgaWYgKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9JU19MQVNUX1RBU0spIHsKKyAgICAgICAgICAgICAgICAvKiBUUUZfSVNfTEFTVFBSSVZBVEUsIG9uZSB0aGluZyBpbiBxdWV1ZSwgX19rbXBjX2VuZF90YXNrcV90YXNrKCkgKi8KKyAgICAgICAgICAgICAgICAvKiBoYXMgYmVlbiBydW4gc28gdGhpcyBpcyBsYXN0IHRhc2ssIHJ1biB3aXRoIFRRRl9JU19MQVNUX1RBU0sgc28gKi8KKyAgICAgICAgICAgICAgICAvKiBpbnN0cnVtZW50YXRpb24gZG9lcyBjb3B5LW91dC4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgICAgICAgICAgICAgIC8qIG5vIG5lZWQgZm9yIHRlc3RfdGhlbl9vciBjYWxsIHNpbmNlIGFscmVhZHkgbG9ja2VkICovCisgICAgICAgICAgICAgICAgdGh1bmstPnRoX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIEtGX1RSQUNFKDUwLCAoIlQjJWQgZm91bmQgdGh1bms6ICVwIGluIHNlcmlhbCBxdWV1ZTogJXBcbiIsIGdsb2JhbF90aWQsIHRodW5rLCBxdWV1ZSkpOworCisgICAgICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgdGh1bmssIGluX3BhcmFsbGVsICk7CisgICAgICAgIH0KKworICAgICAgICAvKiBkZXN0cm95IHRoZSB1bmF0dGFjaGVkIHNlcmlhbCBxdWV1ZSBub3cgdGhhdCB0aGVyZSBpcyBubyBtb3JlIHdvcmsgdG8gZG8gKi8KKyAgICAgICAgS0ZfVFJBQ0UoMTAwLCAoIkJlZm9yZSBEZWxldGlvbiBvZiBTZXJpYWxpemVkIFRhc2tRIGF0ICVwIG9uICglZCk6XG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworICAgICAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgaSA9IDA7CisgICAgICAgIGZvciAodGh1bms9cXVldWUtPnRxX2ZyZWVfdGh1bmtzOyB0aHVuayAhPSBOVUxMOyB0aHVuaz10aHVuay0+dGgudGhfbmV4dF9mcmVlKQorICAgICAgICAgICAgKytpOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUIChpID09IHF1ZXVlLT50cV9uc2xvdHMgKyAxKTsKKyNlbmRpZgorICAgICAgICAvKiAgcmVsZWFzZSBzdG9yYWdlIGZvciB1bmF0dGFjaGVkIHNlcmlhbCBxdWV1ZSAgKi8KKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiU2VyaWFsaXplZCBUYXNrUSBhdCAlcCBkZWxldGVkIG9uICglZCkuXG4iLCBxdWV1ZSwgZ2xvYmFsX3RpZCkpOworCisgICAgICAgIHF1ZXVlLT50cV9mbGFncyB8PSBUUUZfREVBTExPQ0FURUQ7CisgICAgICAgIF9fa21wX2ZyZWVfdGFza3EgKCB0cSwgcXVldWUsIGluX3BhcmFsbGVsLCBnbG9iYWxfdGlkICk7CisgICAgfQorCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3EgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogIEVucXVldWVzIGEgdGFzayBmb3IgdGh1bmsgcHJldmlvdXNseSBjcmVhdGVkIGJ5IF9fa21wY190YXNrX2J1ZmZlci4gKi8KKy8qICBSZXR1cm5zIG5vbnplcm8gaWYganVzdCBmaWxsZWQgdXAgcXVldWUgICovCisKK2ttcF9pbnQzMgorX19rbXBjX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaykKK3sKKyAgICBrbXBfaW50MzIgICAgICAgICAgcmV0OworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisgICAga21wX3Rhc2txX3QgICAgICAgKnRxOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICghKHRodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSk7ICAvKiAgdGh1bmstPnRoX3Rhc2sgaXMgYSByZWd1bGFyIHRhc2sgICovCisKKyAgICB0cSAgICAgICAgICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIHF1ZXVlICAgICAgID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCAmJiAodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX09SREVSRUQpKQorICAgICAgICB0aHVuay0+dGhfdGFza251bSA9ICsrcXVldWUtPnRxX3Rhc2tudW1fcXVldWluZzsKKworICAgIC8qIEZvciBzZXJpYWwgZXhlY3V0aW9uIGRlcXVldWUgdGhlIHByZWNlZGluZyB0YXNrIGFuZCBleGVjdXRlIGl0LCBpZiBvbmUgZXhpc3RzICovCisgICAgLyogVGhpcyBjYW5ub3QgYmUgdGhlIGxhc3QgdGFzay4gIFRoYXQgb25lIGlzIGhhbmRsZWQgaW4gX19rbXBjX2VuZF90YXNrcSAqLworCisgICAgaWYgKCFpbl9wYXJhbGxlbCAmJiBxdWV1ZS0+dHFfbmZ1bGwgPiAwKSB7CisgICAgICAgIGttcGNfdGh1bmtfdCAqcHJldl90aHVuazsKKworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHF1ZXVlLT50cV9uZnVsbCA9PSAxKTsKKworICAgICAgICBwcmV2X3RodW5rID0gX19rbXBfZGVxdWV1ZV90YXNrKGdsb2JhbF90aWQsIHF1ZXVlLCBpbl9wYXJhbGxlbCk7CisKKyAgICAgICAgS0ZfVFJBQ0UoNTAsICgiVCMlZCBmb3VuZCB0aHVuazogJXAgaW4gc2VyaWFsIHF1ZXVlOiAlcFxuIiwgZ2xvYmFsX3RpZCwgcHJldl90aHVuaywgcXVldWUpKTsKKworICAgICAgICBfX2ttcF9leGVjdXRlX3Rhc2tfZnJvbV9xdWV1ZSggdHEsIGxvYywgZ2xvYmFsX3RpZCwgcHJldl90aHVuaywgaW5fcGFyYWxsZWwgKTsKKyAgICB9CisKKyAgICAvKiBUaGUgaW5zdHJ1bWVudGF0aW9uIHNlcXVlbmNlIGlzOiAgX19rbXBjX3Rhc2tfYnVmZmVyKCksIGluaXRpYWxpemUgcHJpdmF0ZSAgICAqLworICAgIC8qIHZhcmlhYmxlcywgX19rbXBjX3Rhc2soKS4gIFRoZSBfX2ttcGNfdGFza19idWZmZXIgcm91dGluZSBjaGVja3MgdGhhdCB0aGUgICAgICovCisgICAgLyogdGFzayBxdWV1ZSBpcyBub3QgZnVsbCBhbmQgYWxsb2NhdGVzIGEgdGh1bmsgKHdoaWNoIGlzIHRoZW4gcGFzc2VkIHRvICAgICAgICAgKi8KKyAgICAvKiBfX2ttcGNfdGFzaygpKS4gIFNvLCB0aGUgZW5xdWV1ZSBiZWxvdyBzaG91bGQgbmV2ZXIgZmFpbCBkdWUgdG8gYSBmdWxsIHF1ZXVlLiAqLworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIkFmdGVyIGVucXVldWVpbmcgdGhpcyBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIHJldCA9IF9fa21wX2VucXVldWVfdGFzayAoIHRxLCBnbG9iYWxfdGlkLCBxdWV1ZSwgdGh1bmssIGluX3BhcmFsbGVsICk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiVGFzayBRdWV1ZSBsb29rcyBsaWtlIHRoaXMgb24gKCVkKTpcbiIsIGdsb2JhbF90aWQpKTsKKyAgICBLRl9EVU1QKDEwMCwgX19rbXBfZHVtcF90YXNrX3F1ZXVlKCB0cSwgcXVldWUsIGdsb2JhbF90aWQgKSk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKKworICAgIHJldHVybiByZXQ7Cit9CisKKy8qICBlbnF1ZXVlcyBhIHRhc2txX3Rhc2sgZm9yIHRodW5rIHByZXZpb3VzbHkgY3JlYXRlZCBieSBfX2ttcGNfdGFza3EgICovCisvKiAgdGhpcyBzaG91bGQgbmV2ZXIgYmUgY2FsbGVkIHVubGVzcyBpbiBhIHBhcmFsbGVsIGNvbnRleHQgICAgICAgICAgICAqLworCit2b2lkCitfX2ttcGNfdGFza3FfdGFzayhpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRodW5rLCBrbXBfaW50MzIgc3RhdHVzKQoreworICAgIGttcGNfdGFza19xdWV1ZV90ICpxdWV1ZTsKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHEgID0gJl9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfdGVhbSAtPiB0LnRfdGFza3E7CisgICAgaW50ICAgICAgICAgICAgICAgIHRpZCA9IF9fa21wX3RpZF9mcm9tX2d0aWQoIGdsb2JhbF90aWQgKTsKKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGFza3FfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworICAgIEtGX1RSQUNFKDEwMCwgKCJUYXNrUSBUYXNrIGFyZ3VtZW50IHRodW5rIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCB0aHVuaywgZ2xvYmFsX3RpZCApKTsKKworICAgIHF1ZXVlID0gdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworCisgICAgaWYgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgKQorICAgICAgICBfX2ttcF9wb3Bfd29ya3NoYXJlKCBnbG9iYWxfdGlkLCBjdF90YXNrcSwgbG9jICk7CisKKyAgICAvKiAgdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisgICAgS01QX0RFQlVHX0FTU0VSVCAodGh1bmstPnRoX2ZsYWdzICYgVFFGX1RBU0tRX1RBU0spOworCisgICAgLyogIG5vdCBzdXBwb3NlZCB0byBjYWxsIF9fa21wY190YXNrcV90YXNrIGlmIGl0J3MgYWxyZWFkeSBlbnF1ZXVlZCAgKi8KKyAgICBLTVBfREVCVUdfQVNTRVJUIChxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9PSBOVUxMKTsKKworICAgIC8qIGRlcXVldWUgdGFza3EgdGh1bmsgZnJvbSBjdXJyX3RodW5rIHN0YWNrICovCisgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgIHRodW5rLT50aF9lbmNsX3RodW5rID0gTlVMTDsKKworICAgIEtGX0RVTVAoIDIwMCwgX19rbXBfZHVtcF90aHVua19zdGFjayggdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSwgZ2xvYmFsX3RpZCApKTsKKworICAgIHRodW5rLT50aF9zdGF0dXMgPSBzdGF0dXM7CisKKyAgICBLTVBfTUIoKTsgIC8qICBmbHVzaCB0aHVuay0+dGhfc3RhdHVzIGJlZm9yZSB0YXNrcV90YXNrIGVucXVldWVkIHRvIGF2b2lkIHJhY2UgY29uZGl0aW9uICAqLworCisgICAgLyogIGVucXVldWUgdGFza3FfdGFzayBpbiB0aHVuayBpbnRvIHNwZWNpYWwgc2xvdCBpbiBxdWV1ZSAgICAgKi8KKyAgICAvKiBHRUggLSBwcm9iYWJseSBkb24ndCBuZWVkIHRvIGxvY2sgdGFza3Egc2xvdCBzaW5jZSBvbmx5IG9uZSAqLworICAgIC8qICAgICAgIHRocmVhZCBlbnF1ZXVlcyAmIGFscmVhZHkgYSBsb2NrIHNldCBhdCBkZXF1ZXVlIHBvaW50ICovCisKKyAgICBxdWV1ZS0+dHFfdGFza3Ffc2xvdCA9IHRodW5rOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY190YXNrcV90YXNrIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7Cit9CisKKy8qICBlbmRzIGEgdGFza3FfdGFzazsgZG9uZSBnZW5lcmF0aW5nIHRhc2tzICAqLworCit2b2lkCitfX2ttcGNfZW5kX3Rhc2txX3Rhc2soaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwga21wY190aHVua190ICp0aHVuaykKK3sKKyAgICBrbXBfdGFza3FfdCAgICAgICAqdHE7CisgICAga21wY190YXNrX3F1ZXVlX3QgKnF1ZXVlOworICAgIGludCAgICAgICAgICAgICAgICBpbl9wYXJhbGxlbDsKKyAgICBpbnQgICAgICAgICAgICAgICAgdGlkOworCisgICAgS0VfVFJBQ0UoIDEwLCAoIl9fa21wY19lbmRfdGFza3FfdGFzayBjYWxsZWQgKCVkKVxuIiwgZ2xvYmFsX3RpZCkpOworCisgICAgdHEgICAgICAgICAgPSAmX19rbXBfdGhyZWFkc1tnbG9iYWxfdGlkXSAtPiB0aC50aF90ZWFtIC0+IHQudF90YXNrcTsKKyAgICBxdWV1ZSAgICAgICA9IHRodW5rLT50aC50aF9zaGFyZWRzLT5zdl9xdWV1ZTsKKyAgICBpbl9wYXJhbGxlbCA9IChxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfUEFSQUxMRUxfQ09OVEVYVCk7CisgICAgdGlkICAgICAgICAgPSBfX2ttcF90aWRfZnJvbV9ndGlkKCBnbG9iYWxfdGlkICk7CisKKyAgICBpZiAoIF9fa21wX2Vudl9jb25zaXN0ZW5jeV9jaGVjayApCisgICAgICAgIF9fa21wX3BvcF93b3Jrc2hhcmUoIGdsb2JhbF90aWQsIGN0X3Rhc2txLCBsb2MgKTsKKworICAgIGlmIChpbl9wYXJhbGxlbCkgeworI2lmIEtNUF9BUkNIX1g4NiB8fCBcCisgICAgS01QX0FSQ0hfWDg2XzY0CisKKyAgICAgICAgS01QX1RFU1RfVEhFTl9PUjMyKCAmcXVldWUtPnRxX2ZsYWdzLCAoa21wX2ludDMyKSBUUUZfQUxMX1RBU0tTX1FVRVVFRCApOworI2Vsc2UKKyAgICAgICAgeworICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgIEtNUF9NQigpOyAgLyogbWFrZSBzdXJlIGRhdGEgc3RydWN0dXJlcyBhcmUgaW4gY29uc2lzdGVudCBzdGF0ZSBiZWZvcmUgcXVlcnlpbmcgdGhlbSAqLworICAgICAgICAgICAgICAgICAgICAgICAvKiBTZWVtcyB0byB3b3JrIGZpbmUgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0FMTF9UQVNLU19RVUVVRUQ7CisKKyAgICAgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jaygmIHF1ZXVlLT50cV9xdWV1ZV9sY2ssIGdsb2JhbF90aWQpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAodGh1bmstPnRoX2ZsYWdzICYgVFFGX0lTX0xBU1RQUklWQVRFKSB7CisgICAgICAgIC8qIE5vcm1hbGx5LCBfX2ttcF9maW5kX3Rhc2tfaW5fcXVldWUoKSByZWZ1c2VzIHRvIHNjaGVkdWxlIHRoZSBsYXN0IHRhc2sgaW4gdGhlICovCisgICAgICAgIC8qIHF1ZXVlIGlmIFRRRl9JU19MQVNUUFJJVkFURSBzbyB3ZSBjYW4gcG9zaXRpdmVseSBpZGVudGlmeSB0aGF0IGxhc3QgdGFzayAgICAgICovCisgICAgICAgIC8qIGFuZCBydW4gaXQgd2l0aCBpdHMgVFFGX0lTX0xBU1RfVEFTSyBiaXQgdHVybmVkIG9uIGluIHRoX2ZsYWdzLiAgV2hlbiAgICAgICAgICovCisgICAgICAgIC8qIF9fa21wY19lbmRfdGFza3FfdGFzaygpIGlzIGNhbGxlZCB3ZSBhcmUgZG9uZSBnZW5lcmF0aW5nIGFsbCB0aGUgdGFza3MsIHNvICAgICovCisgICAgICAgIC8qIHdlIGtub3cgdGhlIGxhc3Qgb25lIGluIHRoZSBxdWV1ZSBpcyB0aGUgbGFzdHByaXZhdGUgdGFzay4gIE1hcmsgdGhlIHF1ZXVlICAgICovCisgICAgICAgIC8qIGFzIGhhdmluZyBnb3R0ZW4gdG8gdGhpcyBzdGF0ZSB2aWEgdHFfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLOyB3aGVuIHRoYXQgICAgICovCisgICAgICAgIC8qIHRhc2sgYWN0dWFsbHkgZXhlY3V0ZXMgbWFyayBpdCB2aWEgdGhfZmxhZ3MgJiBUUUZfSVNfTEFTVF9UQVNLICh0aGlzIHRoX2ZsYWdzICovCisgICAgICAgIC8qIGJpdCBzaWduYWxzIHRoZSBpbnN0cnVtZW50ZWQgY29kZSB0byBkbyBjb3B5LW91dHMgYWZ0ZXIgZXhlY3V0aW9uKS4gICAgICAgICAgICovCisKKyAgICAgICAgaWYgKCEgaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgICAgIC8qIE5vIHN5bmNocm9uaXphdGlvbiBuZWVkZWQgZm9yIHNlcmlhbCBjb250ZXh0ICovCisgICAgICAgICAgICBxdWV1ZS0+dHFfZmxhZ3MgfD0gVFFGX0lTX0xBU1RfVEFTSzsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyNpZiBLTVBfQVJDSF9YODYgfHwgXAorICAgIEtNUF9BUkNIX1g4Nl82NAorCisgICAgICAgICAgICBLTVBfVEVTVF9USEVOX09SMzIoICZxdWV1ZS0+dHFfZmxhZ3MsIChrbXBfaW50MzIpIFRRRl9JU19MQVNUX1RBU0sgKTsKKyNlbHNlCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgX19rbXBfYWNxdWlyZV9sb2NrKCYgcXVldWUtPnRxX3F1ZXVlX2xjaywgZ2xvYmFsX3RpZCk7CisKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgIC8qIG1ha2Ugc3VyZSBkYXRhIHN0cnVjdHVyZXMgYXJlIGluIGNvbnNpc3RlbnQgc3RhdGUgYmVmb3JlIHF1ZXJ5aW5nIHRoZW0gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIFNlZW1zIHRvIHdvcmsgd2l0aG91dCB0aGlzIGNhbGwgZm9yIGRpZ2l0YWwvYWxwaGEsIG5lZWRlZCBmb3IgSUJNL1JTNjAwMCAqLworCisgICAgICAgICAgICAgICAgcXVldWUtPnRxX2ZsYWdzIHw9IFRRRl9JU19MQVNUX1RBU0s7CisKKyAgICAgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soJiBxdWV1ZS0+dHFfcXVldWVfbGNrLCBnbG9iYWxfdGlkKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICAgICAgLyogdG8gcHJldmVudCByYWNlIGNvbmRpdGlvbiB3aGVyZSBsYXN0IHRhc2sgaXMgZGVxdWV1ZWQgYnV0ICovCisgICAgICAgICAgICAvKiBmbGFnIGlzbid0IHZpc2libGUgeWV0IChub3Qgc3VyZSBhYm91dCB0aGlzKSAgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIEtNUF9NQigpOworICAgICAgICB9CisgICAgfQorCisgICAgLyogZGVxdWV1ZSB0YXNrcSB0aHVuayBmcm9tIGN1cnJfdGh1bmsgc3RhY2sgKi8KKyAgICBpZiAoaW5fcGFyYWxsZWwpIHsKKyAgICAgICAgdHEtPnRxX2N1cnJfdGh1bmtbdGlkXSA9IHRodW5rLT50aF9lbmNsX3RodW5rOworICAgICAgICB0aHVuay0+dGhfZW5jbF90aHVuayA9IE5VTEw7CisKKyAgICAgICAgS0ZfRFVNUCggMjAwLCBfX2ttcF9kdW1wX3RodW5rX3N0YWNrKCB0cS0+dHFfY3Vycl90aHVua1t0aWRdLCBnbG9iYWxfdGlkICkpOworICAgIH0KKworICAgIEtFX1RSQUNFKCAxMCwgKCJfX2ttcGNfZW5kX3Rhc2txX3Rhc2sgcmV0dXJuICglZClcbiIsIGdsb2JhbF90aWQpKTsKK30KKworLyogcmV0dXJucyB0aHVuayBmb3IgYSByZWd1bGFyIHRhc2sgYmFzZWQgb24gdGFza3FfdGh1bmsgICAgICAgICAgICAgICovCisvKiAoX19rbXBjX3Rhc2txX3Rhc2sgZG9lcyB0aGUgYW5hbG9nb3VzIHRoaW5nIGZvciBhIFRRRl9UQVNLUV9UQVNLKSAgKi8KKwora21wY190aHVua190ICoKK19fa21wY190YXNrX2J1ZmZlcihpZGVudF90ICpsb2MsIGttcF9pbnQzMiBnbG9iYWxfdGlkLCBrbXBjX3RodW5rX3QgKnRhc2txX3RodW5rLCBrbXBjX3Rhc2tfdCB0YXNrKQoreworICAgIGttcF90YXNrcV90ICAgICAgICp0cTsKKyAgICBrbXBjX3Rhc2tfcXVldWVfdCAqcXVldWU7CisgICAga21wY190aHVua190ICAgICAgKm5ld190aHVuazsKKyAgICBpbnQgICAgICAgICAgICAgICAgaW5fcGFyYWxsZWw7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2tfYnVmZmVyIGNhbGxlZCAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICBLTVBfREVCVUdfQVNTRVJUICh0YXNrcV90aHVuay0+dGhfZmxhZ3MgJiBUUUZfVEFTS1FfVEFTSyk7ICAvKiAgdGFza3FfdGh1bmstPnRoX3Rhc2sgaXMgdGhlIHRhc2txX3Rhc2sgICovCisKKyAgICB0cSAgICAgICAgICA9ICZfX2ttcF90aHJlYWRzW2dsb2JhbF90aWRdIC0+IHRoLnRoX3RlYW0gLT4gdC50X3Rhc2txOworICAgIHF1ZXVlICAgICAgID0gdGFza3FfdGh1bmstPnRoLnRoX3NoYXJlZHMtPnN2X3F1ZXVlOworICAgIGluX3BhcmFsbGVsID0gKHF1ZXVlLT50cV9mbGFncyAmIFRRRl9QQVJBTExFTF9DT05URVhUKTsKKworICAgIC8qIFRoZSBpbnN0cnVtZW50YXRpb24gc2VxdWVuY2UgaXM6ICBfX2ttcGNfdGFza19idWZmZXIoKSwgaW5pdGlhbGl6ZSBwcml2YXRlICovCisgICAgLyogdmFyaWFibGVzLCBfX2ttcGNfdGFzaygpLiAgVGhlIF9fa21wY190YXNrX2J1ZmZlciByb3V0aW5lIGNoZWNrcyB0aGF0IHRoZSAgKi8KKyAgICAvKiB0YXNrIHF1ZXVlIGlzIG5vdCBmdWxsIGFuZCBhbGxvY2F0ZXMgYSB0aHVuayAod2hpY2ggaXMgdGhlbiBwYXNzZWQgdG8gICAgICAqLworICAgIC8qIF9fa21wY190YXNrKCkpLiAgU28sIHdlIGNhbiBwcmUtYWxsb2NhdGUgYSB0aHVuayBoZXJlIGFzc3VtaW5nIGl0IHdpbGwgYmUgICovCisgICAgLyogdGhlIG5leHQgdG8gYmUgZW5xdWV1ZWQgaW4gX19rbXBjX3Rhc2soKS4gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKworICAgIG5ld190aHVuayA9IF9fa21wX2FsbG9jX3RodW5rIChxdWV1ZSwgaW5fcGFyYWxsZWwsIGdsb2JhbF90aWQpOworICAgIG5ld190aHVuay0+dGgudGhfc2hhcmVkcyA9IChrbXBjX3NoYXJlZF92YXJzX3QgKikgcXVldWUtPnRxX3NoYXJlZHNbMF0uYWlfZGF0YTsKKyAgICBuZXdfdGh1bmstPnRoX2VuY2xfdGh1bmsgPSBOVUxMOworICAgIG5ld190aHVuay0+dGhfdGFzayAgICAgICA9IHRhc2s7CisKKyAgICAvKiBHRUggLSBzaG91bGRuJ3QgbmVlZCB0byBsb2NrIHRoZSByZWFkIG9mIHRxX2ZsYWdzIGhlcmUgKi8KKyAgICBuZXdfdGh1bmstPnRoX2ZsYWdzICAgICAgPSBxdWV1ZS0+dHFfZmxhZ3MgJiBUUUZfSU5URVJGQUNFX0ZMQUdTOworCisgICAgbmV3X3RodW5rLT50aF9zdGF0dXMgICAgID0gMDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQgKCEobmV3X3RodW5rLT50aF9mbGFncyAmIFRRRl9UQVNLUV9UQVNLKSk7CisKKyAgICBLRl9UUkFDRSgxMDAsICgiQ3JlYXRpbmcgUmVndWxhciBUYXNrIG9uICglZCk6XG4iLCBnbG9iYWxfdGlkKSk7CisgICAgS0ZfRFVNUCgxMDAsIF9fa21wX2R1bXBfdGh1bmsoIHRxLCBuZXdfdGh1bmssIGdsb2JhbF90aWQgKSk7CisKKyAgICBLRV9UUkFDRSggMTAsICgiX19rbXBjX3Rhc2tfYnVmZmVyIHJldHVybiAoJWQpXG4iLCBnbG9iYWxfdGlkKSk7CisKKyAgICByZXR1cm4gbmV3X3RodW5rOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF90aHJlYWRwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMmExOGQ4MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdGhyZWFkcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNzMzIEBACisvKgorICoga21wX3RocmVhZHByaXZhdGUuYyAtLSBPcGVuTVAgdGhyZWFkcHJpdmF0ZSBzdXBwb3J0IGxpYnJhcnkKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjZGVmaW5lIFVTRV9DSEVDS1NfQ09NTU9OCisKKyNkZWZpbmUgS01QX0lOTElORV9TVUJSICAgICAgICAgMQorCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydF9wcml2YXRlX2RhdGEoIGludCBndGlkLCB2b2lkICpwY19hZGRyLCB2b2lkICpkYXRhX2FkZHIsIHNpemVfdCBwY19zaXplICk7CitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgora21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApOworCitzdHJ1Y3Qgc2hhcmVkX3RhYmxlICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGU7CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYworI2lmZGVmIEtNUF9JTkxJTkVfU1VCUgorX19mb3JjZWlubGluZQorI2VuZGlmCitzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKgorX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBzdHJ1Y3QgY29tbW9uX3RhYmxlICp0YmwsIGludCBndGlkLCB2b2lkICpwY19hZGRyICkKKworeworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBjYWxsZWQgd2l0aCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICkgKTsKKyAgICBkdW1wX2xpc3QoKTsKKyNlbmRpZgorCisgICAgZm9yICh0biA9IHRibC0+ZGF0YVsgS01QX0hBU0gocGNfYWRkcikgXTsgdG47IHRuID0gdG4tPm5leHQpIHsKKyAgICAgICAgaWYgKHRuLT5nYmxfYWRkciA9PSBwY19hZGRyKSB7CisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbjogdGhyZWFkIyVkLCBmb3VuZCBub2RlICVwIG9uIGxpc3RcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisjZW5kaWYKKyAgICAgICAgICAgIHJldHVybiB0bjsKKyAgICAgICAgfQorICAgIH0KKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljCisjaWZkZWYgS01QX0lOTElORV9TVUJSCitfX2ZvcmNlaW5saW5lCisjZW5kaWYKK3N0cnVjdCBzaGFyZWRfY29tbW9uICoKK19fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCBzdHJ1Y3Qgc2hhcmVkX3RhYmxlICp0YmwsIGludCBndGlkLCB2b2lkICpwY19hZGRyICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqdG47CisKKyAgICBmb3IgKHRuID0gdGJsLT5kYXRhWyBLTVBfSEFTSChwY19hZGRyKSBdOyB0bjsgdG4gPSB0bi0+bmV4dCkgeworICAgICAgICBpZiAodG4tPmdibF9hZGRyID09IHBjX2FkZHIpIHsKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb246IHRocmVhZCMlZCwgZm91bmQgbm9kZSAlcCBvbiBsaXN0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHBjX2FkZHIgKSApOworI2VuZGlmCisgICAgICAgICAgICByZXR1cm4gdG47CisgICAgICAgIH0KKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKKworLyoKKyAqICAgICAgQ3JlYXRlIGEgdGVtcGxhdGUgZm9yIHRoZSBkYXRhIGluaXRpYWxpemVkIHN0b3JhZ2UuCisgKiAgICAgIEVpdGhlciB0aGUgdGVtcGxhdGUgaXMgTlVMTCBpbmRpY2F0aW5nIHplcm8gZmlsbCwKKyAqICAgICAgb3IgdGhlIHRlbXBsYXRlIGlzIGEgY29weSBvZiB0aGUgb3JpZ2luYWwgZGF0YS4KKyAqLworCitzdGF0aWMgc3RydWN0IHByaXZhdGVfZGF0YSAqCitfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCB2b2lkICpwY19hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHByaXZhdGVfZGF0YSAqZDsKKyAgICBzaXplX3QgICAgICAgaTsKKyAgICBjaGFyICAgICAgICAqcDsKKworICAgIGQgPSAoc3RydWN0IHByaXZhdGVfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCBzdHJ1Y3QgcHJpdmF0ZV9kYXRhICkgKTsKKy8qCisgICAgZC0+ZGF0YSA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgZC0+bmV4dCA9IDA7CisqLworICAgIGQtPnNpemUgPSBwY19zaXplOworICAgIGQtPm1vcmUgPSAxOworCisgICAgcCA9IChjaGFyKilwY19hZGRyOworCisgICAgZm9yIChpID0gcGNfc2l6ZTsgIGkgPiAwOyAtLWkpIHsKKyAgICAgICAgaWYgKCpwKysgIT0gJ1wwJykgeworICAgICAgICAgICAgZC0+ZGF0YSA9IF9fa21wX2FsbG9jYXRlKCBwY19zaXplICk7CisgICAgICAgICAgICBLTVBfTUVNQ1BZKCBkLT5kYXRhLCBwY19hZGRyLCBwY19zaXplICk7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfQorICAgIH0KKworICAgIHJldHVybiBkOworfQorCisvKgorICogICAgICBJbml0aWFsaXplIHRoZSBkYXRhIGFyZWEgZnJvbSB0aGUgdGVtcGxhdGUuCisgKi8KKworc3RhdGljIHZvaWQKK19fa21wX2NvcHlfY29tbW9uX2RhdGEoIHZvaWQgKnBjX2FkZHIsIHN0cnVjdCBwcml2YXRlX2RhdGEgKmQgKQoreworICAgIGNoYXIgKmFkZHIgPSAoY2hhciAqKSBwY19hZGRyOworICAgIGludCAgIGksIG9mZnNldDsKKworICAgIGZvciAob2Zmc2V0ID0gMDsgZCAhPSAwOyBkID0gZC0+bmV4dCkgeworICAgICAgICBmb3IgKGkgPSBkLT5tb3JlOyBpID4gMDsgLS1pKSB7CisgICAgICAgICAgICBpZiAoZC0+ZGF0YSA9PSAwKQorICAgICAgICAgICAgICAgIG1lbXNldCggJiBhZGRyWyBvZmZzZXQgXSwgJ1wwJywgZC0+c2l6ZSApOworICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIEtNUF9NRU1DUFkoICYgYWRkclsgb2Zmc2V0IF0sIGQtPmRhdGEsIGQtPnNpemUgKTsKKyAgICAgICAgICAgIG9mZnNldCArPSBkLT5zaXplOworICAgICAgICB9CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiB3ZSBhcmUgY2FsbGVkIGZyb20gX19rbXBfc2VyaWFsX2luaXRpYWxpemUoKSB3aXRoIF9fa21wX2luaXR6X2xvY2sgaGVsZC4gKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBpZiggISBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisgICAgICAgIGludCBxOworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpbnQgZ3RpZDsKKyNlbmRpZgorCisgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCA9IE5VTEw7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgLyogdmVyaWZ5IHRoZSB1YmVyIG1hc3RlcnMgd2VyZSBpbml0aWFsaXplZCAqLworICAgICAgICBmb3IoZ3RpZCA9IDAgOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgZ3RpZCsrICkKKyAgICAgICAgICAgIGlmKCBfX2ttcF9yb290W2d0aWRdICkgeworICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3Jvb3RbZ3RpZF0tPnIucl91YmVyX3RocmVhZCApOworICAgICAgICAgICAgICAgIGZvciAoIHEgPSAwOyBxPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpCisgICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoICFfX2ttcF9yb290W2d0aWRdLT5yLnJfdWJlcl90aHJlYWQtPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbcV0gKTsKKy8qICAgICAgICAgICAgICAgICAgICBfX2ttcF9yb290WyBnaXRkIF0tPiByLnJfdWJlcl90aHJlYWQgLT4gdGgudGhfcHJpX2NvbW1vbiAtPiBkYXRhWyBxIF0gPSAwOyovCisgICAgICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkKKyAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZS5kYXRhWyBxIF0gPSAwOworCisgICAgICAgIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBUUlVFKTsKKyAgICB9Cit9CisKKy8qIENhbGwgYWxsIGRlc3RydWN0b3JzIGZvciB0aHJlYWRwcml2YXRlIGRhdGEgYmVsb25naW5nIHRvIGFsbCB0aHJlYWRzLgorICAgQ3VycmVudGx5IHVudXNlZCEgKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9kZXN0cm95KCB2b2lkICkKK3sKKyAgICBpZiggVENSXzQoX19rbXBfaW5pdF9jb21tb24pICkgeworICAgICAgICBpbnQgcTsKKworICAgICAgICBUQ1dfNChfX2ttcF9pbml0X2NvbW1vbiwgRkFMU0UpOworCisgICAgICAgIGZvciAocSA9IDA7IHEgPCBLTVBfSEFTSF9UQUJMRV9TSVpFOyArK3EpIHsKKyAgICAgICAgICAgIGludCBndGlkOworICAgICAgICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKyAgICAgICAgICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICAqZF90bjsKKworICAgICAgICAgICAgLyogIEMrKyBkZXN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIHBlciB0aHJlYWQgYmVmb3JlIGV4aXRpbmcgICovCisgICAgICAgICAgICAvKiAgZG9uJ3QgY2FsbCBkZXN0cnVjdG9ycyBmb3IgbWFzdGVyIHRocmVhZCB0aG91Z2ggdW5sZXNzIHdlIHVzZWQgY29weSBjb25zdHJ1Y3RvciAqLworCisgICAgICAgICAgICBmb3IgKGRfdG4gPSBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdOyBkX3RuOyBkX3RuID0gZF90bi0+bmV4dCkgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5pc192ZWMpIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF9hbGxfbnRoOyArK2d0aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGRfdG4tPmdibF9hZGRyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5vYmpfaW5pdCAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCpkX3RuLT5kdC5kdG9ydikgKGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGZvciAoZ3RpZCA9IDA7IGd0aWQgPCBfX2ttcF9hbGxfbnRoOyArK2d0aWQpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiggX19rbXBfdGhyZWFkc1tndGlkXSApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYoIChfX2ttcF9mb3JlaWduX3RwKSA/ICghIEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoISBLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0biA9IF9fa21wX3RocmVhZHByaXZhdGVfZmluZF90YXNrX2NvbW1vbiggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLT50aC50aF9wcmlfY29tbW9uLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIGRfdG4tPmdibF9hZGRyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAodG4pIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAoKmRfdG4tPmR0LmR0b3IpIChkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUuZGF0YVsgcSBdID0gMDsKKyAgICAgICAgfQorICAgIH0KK30KKworLyogQ2FsbCBhbGwgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZHByaXZhdGUgZGF0YSBiZWxvbmdpbmcgdG8gdGhpcyB0aHJlYWQgKi8KK3ZvaWQKK19fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQoIGludCBndGlkICkKK3sKKyAgICBzdHJ1Y3QgcHJpdmF0ZV9jb21tb24gKnRuOworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuOworCisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wX2NvbW1vbl9kZXN0cm95X2d0aWQ6IFQjJWQgY2FsbGVkXG4iLCBndGlkICkgKTsKKyAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKCEgS01QX0lOSVRJQUxfR1RJRCAoZ3RpZCkpIDoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCEgS01QX1VCRVJfR1RJRCAoZ3RpZCkpICkgeworCisgICAgICAgIGlmKCBUQ1JfNChfX2ttcF9pbml0X2NvbW1vbikgKSB7CisKKyAgICAgICAgICAgIC8qIENhbm5vdCBkbyB0aGlzIGhlcmUgc2luY2Ugbm90IGFsbCB0aHJlYWRzIGhhdmUgZGVzdHJveWVkIHRoZWlyIGRhdGEgKi8KKyAgICAgICAgICAgIC8qIFRDV180KF9fa21wX2luaXRfY29tbW9uLCBGQUxTRSk7ICovCisKKyAgICAgICAgICAgIGZvciAodG4gPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkOyB0bjsgdG4gPSB0bi0+bGluaykgeworCisgICAgICAgICAgICAgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdG4tPmdibF9hZGRyICk7CisKKyAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBkX3RuICk7CisKKyAgICAgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChkX3RuLT5kdC5kdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5kdC5kdG9ydikgKHRuLT5wYXJfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3J2KSAoZF90bi0+b2JqX2luaXQsIGRfdG4tPnZlY19sZW4pOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmR0LmR0b3IgIT0gMCkgeworICAgICAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+ZHQuZHRvcikgKHRuLT5wYXJfYWRkcik7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgaWYgKGRfdG4tPm9ial9pbml0ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmR0LmR0b3IpIChkX3RuLT5vYmpfaW5pdCk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgICAgICBLQ19UUkFDRSggMzAsICgiX19rbXBfY29tbW9uX2Rlc3Ryb3lfZ3RpZDogVCMlZCB0aHJlYWRwcml2YXRlIGRlc3RydWN0b3JzIGNvbXBsZXRlXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCApICk7CisgICAgICAgIH0KKyAgICB9Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKK3N0YXRpYyB2b2lkCitkdW1wX2xpc3QoIHZvaWQgKQoreworICAgIGludCBwLCBxOworCisgICAgZm9yIChwID0gMDsgcCA8IF9fa21wX2FsbF9udGg7ICsrcCkgeworICAgICAgICBpZiggIV9fa21wX3RocmVhZHNbcF0gKSBjb250aW51ZTsKKyAgICAgICAgZm9yIChxID0gMDsgcSA8IEtNUF9IQVNIX1RBQkxFX1NJWkU7ICsrcSkgeworICAgICAgICAgICAgaWYgKF9fa21wX3RocmVhZHNbIHAgXS0+dGgudGhfcHJpX2NvbW1vbi0+ZGF0YVsgcSBdKSB7CisgICAgICAgICAgICAgICAgc3RydWN0IHByaXZhdGVfY29tbW9uICp0bjsKKworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiXHRkdW1wX2xpc3Q6IGd0aWQ6JWQgYWRkcmVzc2VzXG4iLCBwICkgKTsKKworICAgICAgICAgICAgICAgIGZvciAodG4gPSBfX2ttcF90aHJlYWRzWyBwIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIHEgXTsgdG47IHRuID0gdG4tPm5leHQpICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiXHRkdW1wX2xpc3Q6IFRIUkVBRFBSSVZBVEU6IFNlcmlhbCAlcCAtPiBQYXJhbGxlbCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRuLT5nYmxfYWRkciwgdG4tPnBhcl9hZGRyICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisjZW5kaWYgLyogS01QX1RBU0tfQ09NTU9OX0RFQlVHICovCisKKworLyoKKyAqIE5PVEU6IHRoaXMgcm91dGluZSBpcyB0byBiZSBjYWxsZWQgb25seSBmcm9tIHRoZSBzZXJpYWwgcGFydCBvZiB0aGUgcHJvZ3JhbS4KKyAqLworCit2b2lkCitrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBpbnQgZ3RpZCwgdm9pZCAqcGNfYWRkciwgdm9pZCAqZGF0YV9hZGRyLCBzaXplX3QgcGNfc2l6ZSApCit7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gKipsbmtfdG4sICpkX3RuOworICAgIEtNUF9ERUJVR19BU1NFUlQoIF9fa21wX3RocmVhZHNbIGd0aWQgXSAmJgorICAgICAgICAgICAgX19rbXBfdGhyZWFkc1sgZ3RpZCBdIC0+IHRoLnRoX3Jvb3QgLT4gci5yX2FjdGl2ZSA9PSAwICk7CisKKyAgICBkX3RuID0gX19rbXBfZmluZF9zaGFyZWRfdGFza19jb21tb24oICZfX2ttcF90aHJlYWRwcml2YXRlX2RfdGFibGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBndGlkLCBwY19hZGRyICk7CisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworCisgICAgICAgIGRfdG4tPmdibF9hZGRyID0gcGNfYWRkcjsKKyAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIHBjX3NpemUgKTsKKy8qCisgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+Y3QuY3RvciA9IDA7CisgICAgICAgIGRfdG4tPmNjdC5jY3RvciA9IDA7OworICAgICAgICBkX3RuLT5kdC5kdG9yID0gMDsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyovCisgICAgICAgIGRfdG4tPmNtbl9zaXplID0gcGNfc2l6ZTsKKworICAgICAgICBfX2ttcF9hY3F1aXJlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKworICAgICAgICBfX2ttcF9yZWxlYXNlX2xvY2soICZfX2ttcF9nbG9iYWxfbG9jaywgZ3RpZCApOworICAgIH0KK30KKworc3RydWN0IHByaXZhdGVfY29tbW9uICoKK2ttcF90aHJlYWRwcml2YXRlX2luc2VydCggaW50IGd0aWQsIHZvaWQgKnBjX2FkZHIsIHZvaWQgKmRhdGFfYWRkciwgc2l6ZV90IHBjX3NpemUgKQoreworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG4sICoqdHQ7CisgICAgc3RydWN0IHNoYXJlZF9jb21tb24gICpkX3RuOworCisgICAgLyogKysrKysrKysrIFNUQVJUIE9GIENSSVRJQ0FMIFNFQ1RJT04gKysrKysrKysrICovCisKKyAgICBfX2ttcF9hY3F1aXJlX2xvY2soICYgX19rbXBfZ2xvYmFsX2xvY2ssIGd0aWQgKTsKKworICAgIHRuID0gKHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mIChzdHJ1Y3QgcHJpdmF0ZV9jb21tb24pICk7CisKKyAgICB0bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApOyAgICAgLyogT25seSB0aGUgTUFTVEVSIGRhdGEgdGFibGUgZXhpc3RzLiAqLworCisgICAgaWYgKGRfdG4gIT0gMCkgeworICAgICAgICAvKiBUaGlzIHRocmVhZHByaXZhdGUgdmFyaWFibGUgaGFzIGFscmVhZHkgYmVlbiBzZWVuLiAqLworCisgICAgICAgIGlmICggZF90bi0+cG9kX2luaXQgPT0gMCAmJiBkX3RuLT5vYmpfaW5pdCA9PSAwICkgeworICAgICAgICAgICAgZF90bi0+Y21uX3NpemUgPSBwY19zaXplOworCisgICAgICAgICAgICBpZiAoZF90bi0+aXNfdmVjKSB7CisgICAgICAgICAgICAgICAgaWYgKGRfdG4tPmN0LmN0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RydWN0IGZyb20gc2NyYXRjaCBzbyBubyBwcm90b3R5cGUgZXhpc3RzICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9ydiAhPSAwKSB7CisgICAgICAgICAgICAgICAgICAgIC8qIE5vdyBkYXRhIGluaXRpYWxpemUgdGhlIHByb3RvdHlwZSBzaW5jZSBpdCB3YXMgcHJldmlvdXNseSByZWdpc3RlcmVkICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gKHZvaWQgKikgX19rbXBfYWxsb2NhdGUoIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcnYpIChkX3RuLT5vYmpfaW5pdCwgcGNfYWRkciwgZF90bi0+dmVjX2xlbik7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgICAgICBkX3RuLT5wb2RfaW5pdCA9IF9fa21wX2luaXRfY29tbW9uX2RhdGEoIGRhdGFfYWRkciwgZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIGlmIChkX3RuLT5jdC5jdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogQ29uc3RydWN0IGZyb20gc2NyYXRjaCBzbyBubyBwcm90b3R5cGUgZXhpc3RzICovCisgICAgICAgICAgICAgICAgICAgIGRfdG4tPm9ial9pbml0ID0gMDsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZSBpZiAoZF90bi0+Y2N0LmNjdG9yICE9IDApIHsKKyAgICAgICAgICAgICAgICAgICAgLyogTm93IGRhdGEgaW5pdGlhbGl6ZSB0aGUgcHJvdG90eXBlIHNpbmNlIGl0IHdhcyBwcmV2aW91c2x5IHJlZ2lzdGVyZWQgKi8KKyAgICAgICAgICAgICAgICAgICAgZF90bi0+b2JqX2luaXQgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggZF90bi0+Y21uX3NpemUgKTsKKyAgICAgICAgICAgICAgICAgICAgKHZvaWQpICgqZF90bi0+Y2N0LmNjdG9yKSAoZF90bi0+b2JqX2luaXQsIHBjX2FkZHIpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgZF90bi0+cG9kX2luaXQgPSBfX2ttcF9pbml0X2NvbW1vbl9kYXRhKCBkYXRhX2FkZHIsIGRfdG4tPmNtbl9zaXplICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqKmxua190bjsKKworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBwY19hZGRyOworICAgICAgICBkX3RuLT5jbW5fc2l6ZSA9IHBjX3NpemU7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gX19rbXBfaW5pdF9jb21tb25fZGF0YSggZGF0YV9hZGRyLCBwY19zaXplICk7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSAwOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSAwOworICAgICAgICBkX3RuLT5kdC5kdG9yID0gMDsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gRkFMU0U7CisgICAgICAgIGRfdG4tPnZlY19sZW4gPSAwTDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9CisKKyAgICB0bi0+Y21uX3NpemUgPSBkX3RuLT5jbW5fc2l6ZTsKKworICAgIGlmICggKF9fa21wX2ZvcmVpZ25fdHApID8gKEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6IChLTVBfVUJFUl9HVElEIChndGlkKSkgKSB7CisgICAgICAgIHRuLT5wYXJfYWRkciA9ICh2b2lkICopIHBjX2FkZHI7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICB0bi0+cGFyX2FkZHIgPSAodm9pZCAqKSBfX2ttcF9hbGxvY2F0ZSggdG4tPmNtbl9zaXplICk7CisgICAgfQorCisgICAgX19rbXBfcmVsZWFzZV9sb2NrKCAmIF9fa21wX2dsb2JhbF9sb2NrLCBndGlkICk7CisKKyAgICAvKiArKysrKysrKysgRU5EIE9GIENSSVRJQ0FMIFNFQ1RJT04gKysrKysrKysrICovCisKKyNpZmRlZiBVU0VfQ0hFQ0tTX0NPTU1PTgorICAgICAgICBpZiAocGNfc2l6ZSA+IGRfdG4tPmNtbl9zaXplKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiBUSFJFQURQUklWQVRFOiAlcCAoJSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBLTVBfVUlOVFBUUl9TUEVDICIgLCUiIEtNUF9VSU5UUFRSX1NQRUMgIilcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgcGNfYWRkciwgcGNfc2l6ZSwgZF90bi0+Y21uX3NpemUgKSApOworICAgICAgICAgICAgS01QX0ZBVEFMKCBUUENvbW1vbkJsb2Nrc0luY29uc2lzdCApOworICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIHR0ID0gJihfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9jb21tb24tPmRhdGFbIEtNUF9IQVNIKHBjX2FkZHIpIF0pOworCisjaWZkZWYgS01QX1RBU0tfQ09NTU9OX0RFQlVHCisgICAgaWYgKCp0dCAhPSAwKSB7CisgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiX19rbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQ6IFdBUk5JTkchIHRocmVhZCMlZDogY29sbGlzaW9uIG9uICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgfQorI2VuZGlmCisgICAgdG4tPm5leHQgPSAqdHQ7CisgICAgKnR0ID0gdG47CisKKyNpZmRlZiBLTVBfVEFTS19DT01NT05fREVCVUcKKyAgICBLQ19UUkFDRSggMTAsICggIl9fa21wX3RocmVhZHByaXZhdGVfaW5zZXJ0OiB0aHJlYWQjJWQsIGluc2VydGVkIG5vZGUgJXAgb24gbGlzdFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgcGNfYWRkciApICk7CisgICAgZHVtcF9saXN0KCApOworI2VuZGlmCisKKyAgICAvKiBMaW5rIHRoZSBub2RlIGludG8gYSBzaW1wbGUgbGlzdCAqLworCisgICAgdG4tPmxpbmsgPSBfX2ttcF90aHJlYWRzWyBndGlkIF0tPnRoLnRoX3ByaV9oZWFkOworICAgIF9fa21wX3RocmVhZHNbIGd0aWQgXS0+dGgudGhfcHJpX2hlYWQgPSB0bjsKKworI2lmZGVmIEJVSUxEX1RWCisgICAgX19rbXBfdHZfdGhyZWFkcHJpdmF0ZV9zdG9yZSggX19rbXBfdGhyZWFkc1sgZ3RpZCBdLCB0bi0+Z2JsX2FkZHIsIHRuLT5wYXJfYWRkciApOworI2VuZGlmCisKKyAgICBpZiggKF9fa21wX2ZvcmVpZ25fdHApID8gKEtNUF9JTklUSUFMX0dUSUQgKGd0aWQpKSA6IChLTVBfVUJFUl9HVElEIChndGlkKSkgKQorICAgICAgICByZXR1cm4gdG47CisKKyAgICAvKgorICAgICAqIGlmIEMrKyBvYmplY3Qgd2l0aCBjb3B5IGNvbnN0cnVjdG9yLCB1c2UgaXQ7CisgICAgICogZWxzZSBpZiBDKysgb2JqZWN0IHdpdGggY29uc3RydWN0b3IsIHVzZSBpdCBmb3IgdGhlIG5vbi1tYXN0ZXIgY29waWVzIG9ubHk7CisgICAgICogZWxzZSB1c2UgcG9kX2luaXQgYW5kIG1lbWNweQorICAgICAqCisgICAgICogQysrIGNvbnN0cnVjdG9ycyBuZWVkIHRvIGJlIGNhbGxlZCBvbmNlIGZvciBlYWNoIG5vbi1tYXN0ZXIgdGhyZWFkIG9uIGFsbG9jYXRlCisgICAgICogQysrIGNvcHkgY29uc3RydWN0b3JzIG5lZWQgdG8gYmUgY2FsbGVkIG9uY2UgZm9yIGVhY2ggdGhyZWFkIG9uIGFsbG9jYXRlCisgICAgICovCisKKyAgICAvKgorICAgICAqIEMrKyBvYmplY3Qgd2l0aCBjb25zdHJ1Y3RvcnMvZGVzdHJ1Y3RvcnM7CisgICAgICogZG9uJ3QgY2FsbCBjb25zdHJ1Y3RvcnMgZm9yIG1hc3RlciB0aHJlYWQgdGhvdWdoCisgICAgICovCisgICAgaWYgKGRfdG4tPmlzX3ZlYykgeworICAgICAgICBpZiAoIGRfdG4tPmN0LmN0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmN0LmN0b3J2KSAodG4tPnBhcl9hZGRyLCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgfSBlbHNlIGlmIChkX3RuLT5jY3QuY2N0b3J2ICE9IDApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmNjdC5jY3RvcnYpICh0bi0+cGFyX2FkZHIsIGRfdG4tPm9ial9pbml0LCBkX3RuLT52ZWNfbGVuKTsKKyAgICAgICAgfSBlbHNlIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKSB7CisgICAgICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7CisgICAgICAgIH0KKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoIGRfdG4tPmN0LmN0b3IgIT0gMCApIHsKKyAgICAgICAgICAgICh2b2lkKSAoKmRfdG4tPmN0LmN0b3IpICh0bi0+cGFyX2FkZHIpOworICAgICAgICB9IGVsc2UgaWYgKGRfdG4tPmNjdC5jY3RvciAhPSAwKSB7CisgICAgICAgICAgICAodm9pZCkgKCpkX3RuLT5jY3QuY2N0b3IpICh0bi0+cGFyX2FkZHIsIGRfdG4tPm9ial9pbml0KTsKKyAgICAgICAgfSBlbHNlIGlmICh0bi0+cGFyX2FkZHIgIT0gdG4tPmdibF9hZGRyKSB7CisgICAgICAgICAgICBfX2ttcF9jb3B5X2NvbW1vbl9kYXRhKCB0bi0+cGFyX2FkZHIsIGRfdG4tPnBvZF9pbml0ICk7CisgICAgICAgIH0KKyAgICB9CisvKiAhQlVJTERfT1BFTk1QX0MKKyAgICBpZiAodG4tPnBhcl9hZGRyICE9IHRuLT5nYmxfYWRkcikKKyAgICAgICAgX19rbXBfY29weV9jb21tb25fZGF0YSggdG4tPnBhcl9hZGRyLCBkX3RuLT5wb2RfaW5pdCApOyAqLworCisgICAgcmV0dXJuIHRuOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIFdlIGFyZSBjdXJyZW50bHkgcGFyYWxsZWwsIGFuZCB3ZSBrbm93IHRoZSB0aHJlYWQgaWQuICAgICAgICAgICAgICAgICAgICAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKy8qIQorIEBpbmdyb3VwIFRIUkVBRFBSSVZBVEUKKworIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEKKyBAcGFyYW0gY2N0b3IgIHBvaW50ZXIgdG8gY29weSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YQorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEKKworIFJlZ2lzdGVyIGNvbnN0cnVjdG9ycyBhbmQgZGVzdHJ1Y3RvcnMgZm9yIHRocmVhZCBwcml2YXRlIGRhdGEuCisgVGhpcyBmdW5jdGlvbiBpcyBjYWxsZWQgd2hlbiBleGVjdXRpbmcgaW4gcGFyYWxsZWwsIHdoZW4gd2Uga25vdyB0aGUgdGhyZWFkIGlkLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyKGlkZW50X3QgKmxvYywgdm9pZCAqZGF0YSwga21wY19jdG9yIGN0b3IsIGttcGNfY2N0b3IgY2N0b3IsIGttcGNfZHRvciBkdG9yKQoreworICAgIHN0cnVjdCBzaGFyZWRfY29tbW9uICpkX3RuLCAqKmxua190bjsKKworICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZV9yZWdpc3RlcjogY2FsbGVkXG4iICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgLyogY29weSBjb25zdHJ1Y3RvciBtdXN0IGJlIHplcm8gZm9yIGN1cnJlbnQgY29kZSBnZW4gKE5vdiAyMDAyIC0ganBoKSAqLworICAgIEtNUF9BU1NFUlQoIGNjdG9yID09IDApOworI2VuZGlmIC8qIFVTRV9DSEVDS1NfQ09NTU9OICovCisKKyAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisgICAgZF90biA9IF9fa21wX2ZpbmRfc2hhcmVkX3Rhc2tfY29tbW9uKCAmX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLCAtMSwgZGF0YSApOworCisgICAgaWYgKGRfdG4gPT0gMCkgeworICAgICAgICBkX3RuID0gKHN0cnVjdCBzaGFyZWRfY29tbW9uICopIF9fa21wX2FsbG9jYXRlKCBzaXplb2YoIHN0cnVjdCBzaGFyZWRfY29tbW9uICkgKTsKKyAgICAgICAgZF90bi0+Z2JsX2FkZHIgPSBkYXRhOworCisgICAgICAgIGRfdG4tPmN0LmN0b3IgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3IgPSBjY3RvcjsKKyAgICAgICAgZF90bi0+ZHQuZHRvciA9IGR0b3I7CisvKgorICAgICAgICBkX3RuLT5pc192ZWMgPSBGQUxTRTsgIC8vIEFDOiBjb21tZW50ZWQgb3V0IGJlY2F1c2UgX19rbXBfYWxsb2NhdGUgemVyb2VzIHRoZSBtZW1vcnkKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IDBMOworICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CisKK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGUoaWRlbnRfdCAqbG9jLCBrbXBfaW50MzIgZ2xvYmFsX3RpZCwgdm9pZCAqZGF0YSwgc2l6ZV90IHNpemUpCit7CisgICAgdm9pZCAqcmV0OworICAgIHN0cnVjdCBwcml2YXRlX2NvbW1vbiAqdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGU6IFQjJWQgY2FsbGVkXG4iLCBnbG9iYWxfdGlkICkgKTsKKworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgaWYgKCEgX19rbXBfaW5pdF9zZXJpYWwpCisgICAgICAgIEtNUF9GQVRBTCggUlRMTm90SW5pdGlhbGl6ZWQgKTsKKyNlbmRpZiAvKiBVU0VfQ0hFQ0tTX0NPTU1PTiAqLworCisgICAgaWYgKCAhIF9fa21wX3RocmVhZHNbZ2xvYmFsX3RpZF0gLT4gdGgudGhfcm9vdCAtPiByLnJfYWN0aXZlICYmICEgX19rbXBfZm9yZWlnbl90cCApIHsKKyAgICAgICAgLyogVGhlIHBhcmFsbGVsIGFkZHJlc3Mgd2lsbCBORVZFUiBvdmVybGFwIHdpdGggdGhlIGRhdGFfYWRkcmVzcyAqLworICAgICAgICAvKiBka3A6IDNyZCBhcmcgdG8ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0X3ByaXZhdGVfZGF0YSgpIGlzIHRoZSBkYXRhX2FkZHJlc3M7IHVzZSBkYXRhX2FkZHJlc3MgPSBkYXRhICovCisKKyAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBwcml2YXRlIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworICAgICAgICBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnRfcHJpdmF0ZV9kYXRhKCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisKKyAgICAgICAgcmV0ID0gZGF0YTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIEtDX1RSQUNFKCA1MCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCB0cnkgdG8gZmluZCBwcml2YXRlIGRhdGEgYXQgYWRkcmVzcyAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgZGF0YSApICk7CisgICAgICAgIHRuID0gX19rbXBfdGhyZWFkcHJpdmF0ZV9maW5kX3Rhc2tfY29tbW9uKCBfX2ttcF90aHJlYWRzWyBnbG9iYWxfdGlkIF0tPnRoLnRoX3ByaV9jb21tb24sIGdsb2JhbF90aWQsIGRhdGEgKTsKKworICAgICAgICBpZiAoIHRuICkgeworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGZvdW5kIGRhdGFcbiIsIGdsb2JhbF90aWQgKSApOworI2lmZGVmIFVTRV9DSEVDS1NfQ09NTU9OCisgICAgICAgICAgICBpZiAoKHNpemVfdCkgc2l6ZSA+IHRuLT5jbW5fc2l6ZSkgeworICAgICAgICAgICAgICAgIEtDX1RSQUNFKCAxMCwgKCAiVEhSRUFEUFJJVkFURTogJXAgKCUiIEtNUF9VSU5UUFRSX1NQRUMgIiAsJSIgS01QX1VJTlRQVFJfU1BFQyAiKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZGF0YSwgc2l6ZSwgdG4tPmNtbl9zaXplICkgKTsKKyAgICAgICAgICAgICAgICBLTVBfRkFUQUwoIFRQQ29tbW9uQmxvY2tzSW5jb25zaXN0ICk7CisgICAgICAgICAgICB9CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIC8qIFRoZSBwYXJhbGxlbCBhZGRyZXNzIHdpbGwgTkVWRVIgb3ZlcmxhcCB3aXRoIHRoZSBkYXRhX2FkZHJlc3MgKi8KKyAgICAgICAgICAgIC8qIGRrcDogM3JkIGFyZyB0byBrbXBfdGhyZWFkcHJpdmF0ZV9pbnNlcnQoKSBpcyB0aGUgZGF0YV9hZGRyZXNzOyB1c2UgZGF0YV9hZGRyZXNzID0gZGF0YSAqLworICAgICAgICAgICAgS0NfVFJBQ0UoIDIwLCAoIl9fa21wY190aHJlYWRwcml2YXRlOiBUIyVkIGluc2VydGluZyBkYXRhXG4iLCBnbG9iYWxfdGlkICkgKTsKKyAgICAgICAgICAgIHRuID0ga21wX3RocmVhZHByaXZhdGVfaW5zZXJ0KCBnbG9iYWxfdGlkLCBkYXRhLCBkYXRhLCBzaXplICk7CisgICAgICAgIH0KKworICAgICAgICByZXQgPSB0bi0+cGFyX2FkZHI7CisgICAgfQorICAgIEtDX1RSQUNFKCAxMCwgKCJfX2ttcGNfdGhyZWFkcHJpdmF0ZTogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCByZXQgKSApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgQHBhcmFtIGdsb2JhbF90aWQgIGdsb2JhbCB0aHJlYWQgbnVtYmVyCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSB0byBwcml2YXRpemUKKyBAcGFyYW0gc2l6ZSAgc2l6ZSBvZiBkYXRhIHRvIHByaXZhdGl6ZQorIEBwYXJhbSBjYWNoZSAgcG9pbnRlciB0byBjYWNoZQorIEByZXR1cm4gcG9pbnRlciB0byBwcml2YXRlIHN0b3JhZ2UKKworIEFsbG9jYXRlIHByaXZhdGUgc3RvcmFnZSBmb3IgdGhyZWFkcHJpdmF0ZSBkYXRhLgorKi8KK3ZvaWQgKgorX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkKAorICAgIGlkZW50X3QgKiAgbG9jLAorICAgIGttcF9pbnQzMiAgZ2xvYmFsX3RpZCwgICAvLyBndGlkLgorICAgIHZvaWQgKiAgICAgZGF0YSwgICAgICAgICAvLyBQb2ludGVyIHRvIG9yaWdpbmFsIGdsb2JhbCB2YXJpYWJsZS4KKyAgICBzaXplX3QgICAgIHNpemUsICAgICAgICAgLy8gU2l6ZSBvZiBvcmlnaW5hbCBnbG9iYWwgdmFyaWFibGUuCisgICAgdm9pZCAqKiogICBjYWNoZQorKSB7CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBjYWxsZWQgd2l0aCBjYWNoZTogJXAsIGFkZHJlc3M6ICVwLCBzaXplOiAlIgorICAgICAgICAgICAgICAgICAgIEtNUF9TSVpFX1RfU1BFQyAiXG4iLAorICAgICAgICAgICAgICAgICAgIGdsb2JhbF90aWQsICpjYWNoZSwgZGF0YSwgc2l6ZSApICk7CisKKyAgICBpZiAoIFRDUl9QVFIoKmNhY2hlKSA9PSAwKSB7CisgICAgICAgIF9fa21wX2FjcXVpcmVfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ2xvYmFsX3RpZCApOworCisgICAgICAgIGlmICggVENSX1BUUigqY2FjaGUpID09IDApIHsKKyAgICAgICAgICAgIF9fa21wX2FjcXVpcmVfYm9vdHN0cmFwX2xvY2soJl9fa21wX3RwX2NhY2hlZF9sb2NrKTsKKyAgICAgICAgICAgIF9fa21wX3RwX2NhY2hlZCA9IDE7CisgICAgICAgICAgICBfX2ttcF9yZWxlYXNlX2Jvb3RzdHJhcF9sb2NrKCZfX2ttcF90cF9jYWNoZWRfbG9jayk7CisgICAgICAgICAgICB2b2lkICoqIG15X2NhY2hlOworICAgICAgICAgICAgS01QX0lUVF9JR05PUkUoCisgICAgICAgICAgICBteV9jYWNoZSA9ICh2b2lkKiopCisgICAgICAgICAgICAgICAgX19rbXBfYWxsb2NhdGUoc2l6ZW9mKCB2b2lkICogKSAqIF9fa21wX3RwX2NhcGFjaXR5ICsgc2l6ZW9mICgga21wX2NhY2hlZF9hZGRyX3QgKSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgLy8gTm8gbmVlZCB0byB6ZXJvIHRoZSBhbGxvY2F0ZWQgbWVtb3J5OyBfX2ttcF9hbGxvY2F0ZSBkb2VzIHRoYXQuCisgICAgICAgICAgICBLQ19UUkFDRSggNTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfY2FjaGVkOiBUIyVkIGFsbG9jYXRlZCBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2xvYmFsX3RpZCwgbXlfY2FjaGUgKSApOworCisgICAgICAgICAgICAvKiBUT0RPOiBmcmVlIGFsbCB0aGlzIG1lbW9yeSBpbiBfX2ttcF9jb21tb25fZGVzdHJveSB1c2luZyBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgKi8KKyAgICAgICAgICAgIC8qIEFkZCBhZGRyZXNzIG9mIG15Y2FjaGUgdG8gbGlua2VkIGxpc3QgZm9yIGNsZWFudXAgbGF0ZXIgICovCisgICAgICAgICAgICBrbXBfY2FjaGVkX2FkZHJfdCAqdHBfY2FjaGVfYWRkcjsKKworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciA9IChrbXBfY2FjaGVkX2FkZHJfdCAqKSAmIG15X2NhY2hlW19fa21wX3RwX2NhcGFjaXR5XTsKKyAgICAgICAgICAgIHRwX2NhY2hlX2FkZHIgLT4gYWRkciA9IG15X2NhY2hlOworICAgICAgICAgICAgdHBfY2FjaGVfYWRkciAtPiBuZXh0ID0gX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0OworICAgICAgICAgICAgX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0ID0gdHBfY2FjaGVfYWRkcjsKKworICAgICAgICAgICAgS01QX01CKCk7CisKKyAgICAgICAgICAgIFRDV19QVFIoICpjYWNoZSwgbXlfY2FjaGUpOworCisgICAgICAgICAgICBLTVBfTUIoKTsKKyAgICAgICAgfQorCisgICAgICAgIF9fa21wX3JlbGVhc2VfbG9jayggJiBfX2ttcF9nbG9iYWxfbG9jaywgZ2xvYmFsX3RpZCApOworICAgIH0KKworICAgIHZvaWQgKnJldDsKKyAgICBpZiAoKHJldCA9IFRDUl9QVFIoKCpjYWNoZSlbIGdsb2JhbF90aWQgXSkpID09IDApIHsKKyAgICAgICAgcmV0ID0gX19rbXBjX3RocmVhZHByaXZhdGUoIGxvYywgZ2xvYmFsX3RpZCwgZGF0YSwgKHNpemVfdCkgc2l6ZSk7CisKKyAgICAgICAgVENXX1BUUiggKCpjYWNoZSlbIGdsb2JhbF90aWQgXSwgcmV0KTsKKyAgICB9CisgICAgS0NfVFJBQ0UoIDEwLCAoIl9fa21wY190aHJlYWRwcml2YXRlX2NhY2hlZDogVCMlZCBleGl0aW5nOyByZXR1cm4gdmFsdWUgPSAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICBnbG9iYWxfdGlkLCByZXQgKSApOworCisgICAgcmV0dXJuIHJldDsKK30KKworLyohCisgQGluZ3JvdXAgVEhSRUFEUFJJVkFURQorIEBwYXJhbSBsb2Mgc291cmNlIGxvY2F0aW9uIGluZm9ybWF0aW9uCisgQHBhcmFtIGRhdGEgIHBvaW50ZXIgdG8gZGF0YSBiZWluZyBwcml2YXRpemVkCisgQHBhcmFtIGN0b3IgIHBvaW50ZXIgdG8gY29uc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEKKyBAcGFyYW0gY2N0b3IgIHBvaW50ZXIgdG8gY29weSBjb25zdHJ1Y3RvciBmdW5jdGlvbiBmb3IgZGF0YQorIEBwYXJhbSBkdG9yICBwb2ludGVyIHRvIGRlc3RydWN0b3IgZnVuY3Rpb24gZm9yIGRhdGEKKyBAcGFyYW0gdmVjdG9yX2xlbmd0aCBsZW5ndGggb2YgdGhlIHZlY3RvciAoYnl0ZXMgb3IgZWxlbWVudHM/KQorIFJlZ2lzdGVyIHZlY3RvciBjb25zdHJ1Y3RvcnMgYW5kIGRlc3RydWN0b3JzIGZvciB0aHJlYWQgcHJpdmF0ZSBkYXRhLgorKi8KK3ZvaWQKK19fa21wY190aHJlYWRwcml2YXRlX3JlZ2lzdGVyX3ZlYyggaWRlbnRfdCAqbG9jLCB2b2lkICpkYXRhLCBrbXBjX2N0b3JfdmVjIGN0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGttcGNfY2N0b3JfdmVjIGNjdG9yLCBrbXBjX2R0b3JfdmVjIGR0b3IsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHNpemVfdCB2ZWN0b3JfbGVuZ3RoICkKK3sKKyAgICBzdHJ1Y3Qgc2hhcmVkX2NvbW1vbiAqZF90biwgKipsbmtfdG47CisKKyAgICBLQ19UUkFDRSggMTAsICgiX19rbXBjX3RocmVhZHByaXZhdGVfcmVnaXN0ZXJfdmVjOiBjYWxsZWRcbiIgKSApOworCisjaWZkZWYgVVNFX0NIRUNLU19DT01NT04KKyAgICAvKiBjb3B5IGNvbnN0cnVjdG9yIG11c3QgYmUgemVybyBmb3IgY3VycmVudCBjb2RlIGdlbiAoTm92IDIwMDIgLSBqcGgpICovCisgICAgS01QX0FTU0VSVCggY2N0b3IgPT0gMCk7CisjZW5kaWYgLyogVVNFX0NIRUNLU19DT01NT04gKi8KKworICAgIGRfdG4gPSBfX2ttcF9maW5kX3NoYXJlZF90YXNrX2NvbW1vbiggJl9fa21wX3RocmVhZHByaXZhdGVfZF90YWJsZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC0xLCBkYXRhICk7ICAgICAgICAvKiBPbmx5IHRoZSBnbG9iYWwgZGF0YSB0YWJsZSBleGlzdHMuICovCisKKyAgICBpZiAoZF90biA9PSAwKSB7CisgICAgICAgIGRfdG4gPSAoc3RydWN0IHNoYXJlZF9jb21tb24gKikgX19rbXBfYWxsb2NhdGUoIHNpemVvZiggc3RydWN0IHNoYXJlZF9jb21tb24gKSApOworICAgICAgICBkX3RuLT5nYmxfYWRkciA9IGRhdGE7CisKKyAgICAgICAgZF90bi0+Y3QuY3RvcnYgPSBjdG9yOworICAgICAgICBkX3RuLT5jY3QuY2N0b3J2ID0gY2N0b3I7CisgICAgICAgIGRfdG4tPmR0LmR0b3J2ID0gZHRvcjsKKyAgICAgICAgZF90bi0+aXNfdmVjID0gVFJVRTsKKyAgICAgICAgZF90bi0+dmVjX2xlbiA9IChzaXplX3QpIHZlY3Rvcl9sZW5ndGg7CisvKgorICAgICAgICBkX3RuLT5vYmpfaW5pdCA9IDA7ICAvLyBBQzogY29tbWVudGVkIG91dCBiZWNhdXNlIF9fa21wX2FsbG9jYXRlIHplcm9lcyB0aGUgbWVtb3J5CisgICAgICAgIGRfdG4tPnBvZF9pbml0ID0gMDsKKyovCisgICAgICAgIGxua190biA9ICYoX19rbXBfdGhyZWFkcHJpdmF0ZV9kX3RhYmxlLmRhdGFbIEtNUF9IQVNIKGRhdGEpIF0pOworCisgICAgICAgIGRfdG4tPm5leHQgPSAqbG5rX3RuOworICAgICAgICAqbG5rX3RuID0gZF90bjsKKyAgICB9Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdXRpbGl0eS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjc2MWZkMDYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3V0aWxpdHkuYwpAQCAtMCwwICsxLDQyOSBAQAorLyoKKyAqIGttcF91dGlsaXR5LmMgLS0gVXRpbGl0eSByb3V0aW5lcyBmb3IgdGhlIE9wZW5NUCBzdXBwb3J0IGxpYnJhcnkuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfd3JhcHBlcl9nZXRwaWQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSA8ZmxvYXQuaD4KKyNpbmNsdWRlICJrbXBfaTE4bi5oIgorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgY29uc3QgY2hhciAqdW5rbm93biA9ICJ1bmtub3duIjsKKworI2lmIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQKKworLyogTk9URTogSWYgY2FsbGVkIGJlZm9yZSBzZXJpYWxfaW5pdGlhbGl6ZSAoaS5lLiBmcm9tIHJ1bnRpbWVfaW5pdGlhbGl6ZSksIHRoZW4gKi8KKy8qIHRoZSBkZWJ1Z2dpbmcgcGFja2FnZSBoYXMgbm90IGJlZW4gaW5pdGlhbGl6ZWQgeWV0LCBhbmQgb25seSAiMCIgd2lsbCBwcmludCAgICovCisvKiBkZWJ1Z2dpbmcgb3V0cHV0IHNpbmNlIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgaGF2ZSBub3QgYmVlbiByZWFkLiAgICAgICAgICAqLworCisjaWZkZWYgS01QX0RFQlVHCitzdGF0aWMgaW50IHRyYWNlX2xldmVsID0gNTsKKyNlbmRpZgorCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogUEhZX0lEICAgICAgID0gQVBJQ19JRCA+PiBMT0dfSURfQklUUworICovCitpbnQKK19fa21wX2dldF9waHlzaWNhbF9pZCggaW50IGxvZ19wZXJfcGh5LCBpbnQgYXBpY19pZCApCit7CisgICBpbnQgaW5kZXhfbHNiLCBpbmRleF9tc2IsIHRlbXA7CisKKyAgIGlmIChsb2dfcGVyX3BoeSA+IDEpIHsKKwlpbmRleF9sc2IgPSAwOworCWluZGV4X21zYiA9IDMxOworCisJdGVtcCA9IGxvZ19wZXJfcGh5OworICAgICAgICB3aGlsZSAoICh0ZW1wICYgMSkgPT0gMCApIHsKKwkgICAgdGVtcCAgPj49IDE7CisJICAgIGluZGV4X2xzYisrOworCX0KKworCXRlbXAgPSBsb2dfcGVyX3BoeTsKKwl3aGlsZSAoICh0ZW1wICYgMHg4MDAwMDAwMCk9PTAgKSB7CisJICAgIHRlbXAgPDw9IDE7CisJICAgIGluZGV4X21zYi0tOworCX0KKworCS8qIElmID4xIGJpdHMgd2VyZSBzZXQgaW4gbG9nX3Blcl9waHksIGNob29zZSBuZXh0IGhpZ2hlciBwb3dlciBvZiAyICovCisJaWYgKGluZGV4X2xzYiAhPSBpbmRleF9tc2IpIGluZGV4X21zYisrOworCisJcmV0dXJuICggKGludCkgKGFwaWNfaWQgPj4gaW5kZXhfbXNiKSApOworICAgfQorCisgICByZXR1cm4gYXBpY19pZDsKK30KKworCisvKgorICogTE9HX0lEX0JJVFMgID0gKCAxICsgZmxvb3IoIGxvZ18yKCBtYXgoIGxvZ19wZXJfcGh5IC0gMSwgMSApKSkpCisgKiBBUElDX0lEICAgICAgPSAoUEhZX0lEIDw8IExPR19JRF9CSVRTKSB8IExPR19JRAorICogTE9HX0lEICAgICAgID0gQVBJQ19JRCAmICgoIDEgPDwgTE9HX0lEX0JJVFMgKSAtIDEgKQorICovCitpbnQKK19fa21wX2dldF9sb2dpY2FsX2lkKCBpbnQgbG9nX3Blcl9waHksIGludCBhcGljX2lkICkKK3sKKyAgIHVuc2lnbmVkIGN1cnJlbnRfYml0OworICAgaW50IGJpdHNfc2VlbjsKKworICAgaWYgKGxvZ19wZXJfcGh5IDw9IDEpIHJldHVybiAoIDAgKTsKKworICAgYml0c19zZWVuID0gMDsKKworICAgZm9yIChjdXJyZW50X2JpdCA9IDE7IGxvZ19wZXJfcGh5ICE9IDA7IGN1cnJlbnRfYml0IDw8PSAxKSB7CisJaWYgKCBsb2dfcGVyX3BoeSAmIGN1cnJlbnRfYml0ICkgeworCSAgICBsb2dfcGVyX3BoeSAmPSB+Y3VycmVudF9iaXQ7CisJICAgIGJpdHNfc2VlbisrOworCX0KKyAgIH0KKworICAgLyogSWYgZXhhY3RseSAxIGJpdCB3YXMgc2V0IGluIGxvZ19wZXJfcGh5LCBjaG9vc2UgbmV4dCBsb3dlciBwb3dlciBvZiAyICovCisgICBpZiAoYml0c19zZWVuID09IDEpIHsKKwljdXJyZW50X2JpdCA+Pj0gMTsKKyAgIH0KKworICAgcmV0dXJuICggKGludCkgKChjdXJyZW50X2JpdCAtIDEpICYgYXBpY19pZCkgKTsKK30KKworCitzdGF0aWMKK2ttcF91aW50NjQKK19fa21wX3BhcnNlX2ZyZXF1ZW5jeSggICAgICAgIC8vIFI6IEZyZXF1ZW5jeSBpbiBIei4KKyAgICBjaGFyIGNvbnN0ICogZnJlcXVlbmN5ICAgIC8vIEk6IEZsb2F0IG51bWJlciBhbmQgdW5pdDogTUh6LCBHSHosIG9yIFRHei4KKykgeworCisgICAgZG91YmxlICAgICAgIHZhbHVlICA9IDAuMDsKKyAgICBjaGFyIGNvbnN0ICogdW5pdCAgID0gTlVMTDsKKyAgICBrbXBfdWludDY0ICAgcmVzdWx0ID0gMDsgICAgICAgICAgICAgICAgICAgIC8qIFplcm8gaXMgYSBiZXR0ZXIgdW5rbm93biB2YWx1ZSB0aGFuIGFsbCBvbmVzLiAqLworCisgICAgaWYgKCBmcmVxdWVuY3kgPT0gTlVMTCApIHsKKyAgICAgICAgcmV0dXJuIHJlc3VsdDsKKyAgICB9OyAvLyBpZgorICAgIHZhbHVlID0gc3RydG9kKCBmcmVxdWVuY3ksIChjaGFyICogKikgJiB1bml0ICk7IC8vIHN0cnRvZCgpIGRvZXMgbm90IGxpa2UgImNoYXIgY29uc3QgKiIuCisgICAgaWYgKCAwIDwgdmFsdWUgJiYgdmFsdWUgPD0gREJMX01BWCApIHsgICAgICAgICAgLy8gR29vZCB2YWx1ZSAobm90IG92ZXJmbG93LCB1bmRlcmZsb3csIGV0YykuCisgICAgICAgIGlmICggc3RyY21wKCB1bml0LCAiTUh6IiApID09IDAgKSB7CisgICAgICAgICAgICB2YWx1ZSA9IHZhbHVlICogMS4wRSs2OworICAgICAgICB9IGVsc2UgaWYgKCBzdHJjbXAoIHVuaXQsICJHSHoiICkgPT0gMCApIHsKKyAgICAgICAgICAgIHZhbHVlID0gdmFsdWUgKiAxLjBFKzk7CisgICAgICAgIH0gZWxzZSBpZiAoIHN0cmNtcCggdW5pdCwgIlRIeiIgKSA9PSAwICkgeworICAgICAgICAgICAgdmFsdWUgPSB2YWx1ZSAqIDEuMEUrMTI7CisgICAgICAgIH0gZWxzZSB7ICAgICAgICAgICAgICAgICAgICAgIC8vIFdyb25nIHVuaXQuCisgICAgICAgICAgICByZXR1cm4gcmVzdWx0OworICAgICAgICB9OyAvLyBpZgorICAgICAgICByZXN1bHQgPSB2YWx1ZTsKKyAgICB9OyAvLyBpZgorICAgIHJldHVybiByZXN1bHQ7CisKK307IC8vIGZ1bmMgX19rbXBfcGFyc2VfY3B1X2ZyZXF1ZW5jeQorCit2b2lkCitfX2ttcF9xdWVyeV9jcHVpZCgga21wX2NwdWluZm9fdCAqcCApCit7CisgICAgc3RydWN0IGttcF9jcHVpZCBidWY7CisgICAgaW50IG1heF9hcmc7CisgICAgaW50IGxvZ19wZXJfcGh5OworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBjZmx1c2hfc2l6ZTsKKyNlbmRpZgorCisgICAgcC0+aW5pdGlhbGl6ZWQgPSAxOworCisgICAgcC0+c3NlMiA9IDE7IC8vIEFzc3VtZSBTU0UyIGJ5IGRlZmF1bHQuCisKKyAgICBfX2ttcF94ODZfY3B1aWQoIDAsIDAsICZidWYgKTsKKworICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCJJTkZPOiBDUFVJRCAlZDogRUFYPTB4JTA4WCBFQlg9MHglMDhYIEVDWD0weCUwOFggRURYPTB4JTA4WFxuIiwKKyAgICAgICAgMCwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisKKyAgICBtYXhfYXJnID0gYnVmLmVheDsKKworICAgIHAtPmFwaWNfaWQgPSAtMTsKKworICAgIGlmIChtYXhfYXJnID49IDEpIHsKKyAgICAgICAgaW50IGk7CisgICAgICAgIGttcF91aW50MzIgdCwgZGF0YVsgNCBdOworCisgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggMSwgMCwgJmJ1ZiApOworICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiSU5GTzogQ1BVSUQgJWQ6IEVBWD0weCUwOFggRUJYPTB4JTA4WCBFQ1g9MHglMDhYIEVEWD0weCUwOFhcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEsIGJ1Zi5lYXgsIGJ1Zi5lYngsIGJ1Zi5lY3gsIGJ1Zi5lZHggKSApOworCisgICAgICAgIHsKKyNkZWZpbmUgZ2V0X3ZhbHVlKHJlZyxsbyxtYXNrKSAoICggKCByZWcgKSA+PiAoIGxvICkgKSAmICggbWFzayAgKSApCisKKyAgICAgICAgICAgIHAtPnNpZ25hdHVyZSA9IGJ1Zi5lYXg7CisgICAgICAgICAgICBwLT5mYW1pbHkgICAgPSAgIGdldF92YWx1ZSggYnVmLmVheCwgMjAsIDB4ZmYgKSAgICAgICAgKyBnZXRfdmFsdWUoIGJ1Zi5lYXgsIDgsIDB4MGYgKTsKKyAgICAgICAgICAgIHAtPm1vZGVsICAgICA9ICggZ2V0X3ZhbHVlKCBidWYuZWF4LCAxNiwgMHgwZiApIDw8IDQgKSArIGdldF92YWx1ZSggYnVmLmVheCwgNCwgMHgwZiApOworICAgICAgICAgICAgcC0+c3RlcHBpbmcgID0gICBnZXRfdmFsdWUoIGJ1Zi5lYXgsICAwLCAweDBmICk7CisKKyN1bmRlZiBnZXRfdmFsdWUKKworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBmYW1pbHkgPSAlZCwgbW9kZWwgPSAlZCwgc3RlcHBpbmcgPSAlZFxuIiwgcC0+ZmFtaWx5LCBwLT5tb2RlbCwgcC0+c3RlcHBpbmcgKSApOworICAgICAgICB9CisKKyAgICAgICAgZm9yICggdCA9IGJ1Zi5lYngsIGkgPSAwOyBpIDwgNDsgdCA+Pj0gOCwgKytpICkgeworICAgICAgICAgICAgZGF0YVsgaSBdID0gKHQgJiAweGZmKTsKKyAgICAgICAgfTsgLy8gZm9yCisKKyAgICAgICAgcC0+c3NlMiA9ICggYnVmLmVkeCA+PiAyNiApICYgMTsKKworI2lmZGVmIEtNUF9ERUJVRworCisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gNCkgJiAxICkgeworICAgICAgICAgICAgLyogVFNDIC0gVGltZXN0YW1wIENvdW50ZXIgQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFRTQyIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gOCkgJiAxICkgeworICAgICAgICAgICAgLyogQ1g4IC0gQ01QWENIRzhCIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDWDgiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDkpICYgMSApIHsKKyAgICAgICAgICAgIC8qIEFQSUMgLSBMb2NhbCBBUElDIFByZXNlbnQgKG11bHRpLXByb2Nlc3NvciBvcGVyYXRpb24gc3VwcG9ydCAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBUElDIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxNSkgJiAxICkgeworICAgICAgICAgICAgLyogQ01PViAtIENvbmRpdGlvbmFsIE1PVmUgSW5zdHJ1Y3Rpb24gQXZhaWxhYmxlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIENNT1YiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDE4KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBQU04gLSBQcm9jZXNzb3IgU2VyaWFsIE51bWJlciBBdmFpbGFibGUgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgUFNOIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAxOSkgJiAxICkgeworICAgICAgICAgICAgLyogQ0xGVUxTSCAtIENhY2hlIEZsdXNoIEluc3RydWN0aW9uIEF2YWlsYWJsZSAqLworICAgICAgICAgICAgY2ZsdXNoX3NpemUgPSBkYXRhWyAxIF0gKiA4OyAgICAvKiBCaXRzIDE1LTA4OiBDTEZMVVNIIGxpbmUgc2l6ZSA9IDggKDY0IGJ5dGVzKSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBDTEZMVVNIKCVkYikiLCBjZmx1c2hfc2l6ZSApICk7CisKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIxKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBEVEVTIC0gRGVidWcgVHJhY2UgJiBFTU9OIFN0b3JlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIERURVMiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDIyKSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBQ1BJIC0gQUNQSSBTdXBwb3J0IEF2YWlsYWJsZSAqLworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBBQ1BJIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyMykgJiAxICkgeworICAgICAgICAgICAgLyogTU1YIC0gTXVsdGltZWRpYSBFeHRlbnNpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIE1NWCIgKSApOworICAgICAgICB9CisgICAgICAgIGlmICggKGJ1Zi5lZHggPj4gMjUpICYgMSApIHsKKyAgICAgICAgICAgIC8qIFNTRSAtIFNTRSBJbnN0cnVjdGlvbnMgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgU1NFIiApICk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyNikgJiAxICkgeworICAgICAgICAgICAgLyogU1NFMiAtIFNTRTIgSW5zdHJ1Y3Rpb25zICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNTRTIiICkgKTsKKyAgICAgICAgfQorICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI3KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBTTEZTTlAgLSBTZWxmLVNub29waW5nIENhY2hlICovCisgICAgICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICgiIFNMRlNOUCIgKSApOworICAgICAgICB9CisjZW5kaWYgLyogS01QX0RFQlVHICovCisKKyAgICAgICAgaWYgKCAoYnVmLmVkeCA+PiAyOCkgJiAxICkgeworICAgICAgICAgICAgLyogQml0cyAyMy0xNjogTG9naWNhbCBQcm9jZXNzb3JzIHBlciBQaHlzaWNhbCBQcm9jZXNzb3IgKDEgZm9yIFA0KSAqLworICAgICAgICAgICAgbG9nX3Blcl9waHkgPSBkYXRhWyAyIF07CisgICAgICAgICAgICBwLT5hcGljX2lkICAgICA9IGRhdGFbIDMgXTsgLyogQml0cyAzMS0yNDogUHJvY2Vzc29yIEluaXRpYWwgQVBJQyBJRCAoWCkgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgSFQoJWQgVFBVcykiLCBsb2dfcGVyX3BoeSApICk7CisKKyAgICAgICAgICAgIGlmKCBsb2dfcGVyX3BoeSA+IDEgKSB7CisgICAgICAgICAgICAgICAgLyogZGVmYXVsdCB0byAxayBGT1IgSlQtZW5hYmxlZCBwcm9jZXNzb3JzICg0ayBvbiBPUyBYKikgKi8KKyNpZiBLTVBfT1NfREFSV0lOCisgICAgICAgICAgICAgICAgcC0+Y3B1X3N0YWNrb2Zmc2V0ID0gNCAqIDEwMjQ7CisjZWxzZQorICAgICAgICAgICAgICAgIHAtPmNwdV9zdGFja29mZnNldCA9IDEgKiAxMDI0OworI2VuZGlmCisgICAgICAgICAgICB9CisKKyAgICAgICAgICAgIHAtPnBoeXNpY2FsX2lkID0gX19rbXBfZ2V0X3BoeXNpY2FsX2lkKCBsb2dfcGVyX3BoeSwgcC0+YXBpY19pZCApOworICAgICAgICAgICAgcC0+bG9naWNhbF9pZCAgPSBfX2ttcF9nZXRfbG9naWNhbF9pZCggbG9nX3Blcl9waHksIHAtPmFwaWNfaWQgKTsKKyAgICAgICAgfQorI2lmZGVmIEtNUF9ERUJVRworICAgICAgICBpZiAoIChidWYuZWR4ID4+IDI5KSAmIDEgKSB7CisgICAgICAgICAgICAvKiBBVEhST1RMIC0gQXV0b21hdGljIFRocm90dGxlIENvbnRyb2wgKi8KKyAgICAgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgQVRIUk9UTCIgKSApOworICAgICAgICB9CisgICAgICAgIEtBX1RSQUNFKCB0cmFjZV9sZXZlbCwgKCIgXVxuIiApICk7CisKKyAgICAgICAgZm9yIChpID0gMjsgaSA8PSBtYXhfYXJnOyArK2kpIHsKKyAgICAgICAgICAgIF9fa21wX3g4Nl9jcHVpZCggaSwgMCwgJmJ1ZiApOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLAorICAgICAgICAgICAgICAgICAgICAgICggIklORk86IENQVUlEICVkOiBFQVg9MHglMDhYIEVCWD0weCUwOFggRUNYPTB4JTA4WCBFRFg9MHglMDhYXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgaSwgYnVmLmVheCwgYnVmLmVieCwgYnVmLmVjeCwgYnVmLmVkeCApICk7CisgICAgICAgIH0KKyNlbmRpZgorI2lmIEtNUF9VU0VfQURBUFRJVkVfTE9DS1MKKyAgICAgICAgcC0+cnRtID0gMDsKKyAgICAgICAgaWYgKG1heF9hcmcgPiA3KQorICAgICAgICB7CisgICAgICAgICAgICAvKiBSVE0gYml0IENQVUlELjA3OkVCWCwgYml0IDExICovCisgICAgICAgICAgICBfX2ttcF94ODZfY3B1aWQoNywgMCwgJmJ1Zik7CisgICAgICAgICAgICBwLT5ydG0gPSAoYnVmLmVieCA+PiAxMSkgJiAxOworICAgICAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoIiBSVE0iICkgKTsKKyAgICAgICAgfQorI2VuZGlmCisgICAgfTsgLy8gaWYKKworICAgIHsgLy8gUGFyc2UgQ1BVIGJyYW5kIHN0cmluZyBmb3IgZnJlcXVlbmN5LCBzYXZpbmcgdGhlIHN0cmluZyBmb3IgbGF0ZXIuCisgICAgICAgIGludCBpOworICAgICAgICBrbXBfY3B1aWRfdCAqIGJhc2UgPSAoa21wX2NwdWlkX3QgKikmcC0+bmFtZVswXTsKKworICAgICAgICAvLyBHZXQgQ1BVIGJyYW5kIHN0cmluZy4KKyAgICAgICAgZm9yICggaSA9IDA7IGkgPCAzOyArKyBpICkgeworICAgICAgICAgICAgX19rbXBfeDg2X2NwdWlkKCAweDgwMDAwMDAyICsgaSwgMCwgYmFzZStpICk7CisgICAgICAgIH07IC8vIGZvcgorICAgICAgICBwLT5uYW1lWyBzaXplb2YocC0+bmFtZSkgLSAxIF0gPSAwOyAvLyBKdXN0IGluIGNhc2UuIDstKQorICAgICAgICBLQV9UUkFDRSggdHJhY2VfbGV2ZWwsICggImNwdSBicmFuZCBzdHJpbmc6IFwiJXNcIlxuIiwgJnAtPm5hbWVbMF0gKSApOworCisgICAgICAgIC8vIFBhcnNlIGZyZXF1ZW5jeS4KKyAgICAgICAgcC0+ZnJlcXVlbmN5ID0gX19rbXBfcGFyc2VfZnJlcXVlbmN5KCBzdHJyY2hyKCAmcC0+bmFtZVswXSwgJyAnICkgKTsKKyAgICAgICAgS0FfVFJBQ0UoIHRyYWNlX2xldmVsLCAoICJjcHUgZnJlcXVlbmN5IGZyb20gYnJhbmQgc3RyaW5nOiAlIiBLTVBfVUlOVDY0X1NQRUMgIlxuIiwgcC0+ZnJlcXVlbmN5ICkgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9ob3N0X25hbWUoIGNoYXIgKmJ1ZmZlciwgc2l6ZV90IHNpemUgKQoreworICAgIEtNUF9ERUJVR19BU1NFUlQoc2l6ZSA+PSBzaXplb2YodW5rbm93bikpOworI2lmIEtNUF9PU19XSU5ET1dTCisgICAgeworCURXT1JECXMgPSBzaXplOworCisJaWYgKCEgR2V0Q29tcHV0ZXJOYW1lQSggYnVmZmVyLCAmIHMgKSkKKwkgICAgS01QX1NUUkNQWV9TKCBidWZmZXIsIHNpemUsIHVua25vd24gKTsKKyAgICB9CisjZWxzZQorICAgIGJ1ZmZlcltzaXplIC0gMl0gPSAwOworICAgIGlmIChnZXRob3N0bmFtZSggYnVmZmVyLCBzaXplICkgfHwgYnVmZmVyW3NpemUgLSAyXSAhPSAwKQorCUtNUF9TVFJDUFlfUyggYnVmZmVyLCBzaXplLCB1bmtub3duICk7CisjZW5kaWYKK30KKworLyogRXhwYW5kIHRoZSBtZXRhIGNoYXJhY3RlcnMgaW4gdGhlIGZpbGVuYW1lOgorICoKKyAqIEN1cnJlbnRseSBkZWZpbmVkIGNoYXJhY3RlcnMgYXJlOgorICoKKyAqICVIIHRoZSBob3N0bmFtZQorICogJVAgdGhlIG51bWJlciBvZiB0aHJlYWRzIHVzZWQuCisgKiAlSSB0aGUgdW5pcXVlIGlkZW50aWZpZXIgZm9yIHRoaXMgcnVuLgorICovCisKK3ZvaWQKK19fa21wX2V4cGFuZF9maWxlX25hbWUoIGNoYXIgKnJlc3VsdCwgc2l6ZV90IHJsZW4sIGNoYXIgKnBhdHRlcm4gKQoreworICAgIGNoYXIJKnBvcyA9IHJlc3VsdCwgKmVuZCA9IHJlc3VsdCArIHJsZW4gLSAxOworICAgIGNoYXIJIGJ1ZmZlclsyNTZdOworICAgIGludAkJIGRlZmF1bHRfY3B1X3dpZHRoID0gMTsKKyAgICBpbnQgICAgICAgICAgc25wX3Jlc3VsdDsKKworICAgIEtNUF9ERUJVR19BU1NFUlQocmxlbiA+IDApOworICAgICplbmQgPSAwOworICAgIHsKKwlpbnQgaTsKKwlmb3IoaSA9IF9fa21wX3hwcm9jOyBpID49IDEwOyBpIC89IDEwLCArK2RlZmF1bHRfY3B1X3dpZHRoKTsKKyAgICB9CisKKyAgICBpZiAocGF0dGVybiAhPSBOVUxMKSB7CisJd2hpbGUgKCpwYXR0ZXJuICE9ICdcMCcgJiYgcG9zIDwgZW5kKSB7CisJICAgIGlmICgqcGF0dGVybiAhPSAnJScpIHsKKwkJKnBvcysrID0gKnBhdHRlcm4rKzsKKwkgICAgfSBlbHNlIHsKKwkJY2hhciAqb2xkX3BhdHRlcm4gPSBwYXR0ZXJuOworCQlpbnQgd2lkdGggPSAxOworCQlpbnQgY3B1X3dpZHRoID0gZGVmYXVsdF9jcHVfd2lkdGg7CisKKwkJKytwYXR0ZXJuOworCisJCWlmICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKSB7CisJCSAgICB3aWR0aCA9IDA7CisJCSAgICBkbyB7CisJCQl3aWR0aCA9ICh3aWR0aCAqIDEwKSArICpwYXR0ZXJuKysgLSAnMCc7CisJCSAgICB9IHdoaWxlICgqcGF0dGVybiA+PSAnMCcgJiYgKnBhdHRlcm4gPD0gJzknKTsKKwkJICAgIGlmICh3aWR0aCA8IDAgfHwgd2lkdGggPiAxMDI0KQorCQkJd2lkdGggPSAxOworCisJCSAgICBjcHVfd2lkdGggPSB3aWR0aDsKKwkJfQorCisJCXN3aXRjaCAoKnBhdHRlcm4pIHsKKwkJY2FzZSAnSCc6CisJCWNhc2UgJ2gnOgorCQkgICAgeworCQkJX19rbXBfZXhwYW5kX2hvc3RfbmFtZSggYnVmZmVyLCBzaXplb2YoIGJ1ZmZlciApICk7CisJCQlLTVBfU1RSTkNQWSggcG9zLCAgYnVmZmVyLCBlbmQgLSBwb3MgKyAxKTsKKwkJCWlmKCplbmQgPT0gMCkgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ1AnOgorCQljYXNlICdwJzoKKwkJICAgIHsKKwkJCXNucF9yZXN1bHQgPSBLTVBfU05QUklOVEYoIHBvcywgZW5kIC0gcG9zICsgMSwgIiUwKmQiLCBjcHVfd2lkdGgsIF9fa21wX2RmbHRfdGVhbV9udGggKTsKKwkJCWlmKHNucF9yZXN1bHQgPj0gMCAmJiBzbnBfcmVzdWx0IDw9IGVuZCAtIHBvcykgeworCQkJICAgIHdoaWxlICggKnBvcyApCisJCQkJKytwb3M7CisJCQkgICAgKytwYXR0ZXJuOworCQkJfSBlbHNlCisJCQkgICAgcG9zID0gZW5kOworCQkgICAgfQorCQkgICAgYnJlYWs7CisJCWNhc2UgJ0knOgorCQljYXNlICdpJzoKKwkJICAgIHsKKwkJCXBpZF90IGlkID0gZ2V0cGlkKCk7CisJCQlzbnBfcmVzdWx0ID0gS01QX1NOUFJJTlRGKCBwb3MsIGVuZCAtIHBvcyArIDEsICIlMCpkIiwgd2lkdGgsIGlkICk7CisJCQlpZihzbnBfcmVzdWx0ID49IDAgJiYgc25wX3Jlc3VsdCA8PSBlbmQgLSBwb3MpIHsKKwkJCSAgICB3aGlsZSAoICpwb3MgKQorCQkJCSsrcG9zOworCQkJICAgICsrcGF0dGVybjsKKwkJCX0gZWxzZQorCQkJICAgIHBvcyA9IGVuZDsKKwkJCWJyZWFrOworCQkgICAgfQorCQljYXNlICclJzoKKwkJICAgIHsKKwkJCSpwb3MrKyA9ICclJzsKKwkJCSsrcGF0dGVybjsKKwkJCWJyZWFrOworCQkgICAgfQorCQlkZWZhdWx0OgorCQkgICAgeworCQkJKnBvcysrID0gJyUnOworCQkJcGF0dGVybiA9IG9sZF9wYXR0ZXJuICsgMTsKKwkJCWJyZWFrOworCQkgICAgfQorCQl9CisJICAgIH0KKwl9CisJLyogVE9ETzogSG93IGRvIHdlIGdldCByaWQgb2YgdGhpcz8gKi8KKwlpZigqcGF0dGVybiAhPSAnXDAnKQorCSAgICBLTVBfRkFUQUwoIEZpbGVOYW1lVG9vTG9uZyApOworICAgIH0KKworICAgICpwb3MgPSAnXDAnOworfQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0M2RlNjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uYwpAQCAtMCwwICsxLDIxMiBAQAorLyoKKyAqIGttcF92ZXJzaW9uLmMKKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF92ZXJzaW9uLmgiCisKKy8vIFJlcGxhY2Ugd2l0aCBzbmFwc2hvdCBkYXRlIFlZWVlNTUREIGZvciBwcm9tb3Rpb24gYnVpbGQuCisjZGVmaW5lIEtNUF9WRVJTSU9OX0JVSUxEICAgIDIwMTQwOTI2CisKKy8vIEhlbHBlciBtYWNyb3MgdG8gY29udmVydCB2YWx1ZSBvZiBtYWNybyB0byBzdHJpbmcgbGl0ZXJhbC4KKyNkZWZpbmUgX3N0cmluZ2VyKCB4ICkgI3gKKyNkZWZpbmUgc3RyaW5nZXIoIHggKSAgX3N0cmluZ2VyKCB4ICkKKworLy8gRGV0ZWN0IGNvbXBpbGVyLgorI2lmIEtNUF9DT01QSUxFUl9JQ0MKKyAgICAjaWYgICBfX0lOVEVMX0NPTVBJTEVSID09IDEwMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMC4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTEwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDExLjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMTEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTEuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEyMDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMi4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTIxMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDEyLjEiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxMzAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTMuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDEzMTAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxMy4xIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTQwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE0LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNDEwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTQuMSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDE1MDAKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciAxNS4wIgorICAgICNlbGlmIF9fSU5URUxfQ09NUElMRVIgPT0gMTYwMAorICAgICAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiSW50ZWwgQysrIENvbXBpbGVyIDE2LjAiCisgICAgI2VsaWYgX19JTlRFTF9DT01QSUxFUiA9PSAxNzAwCisgICAgICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJJbnRlbCBDKysgQ29tcGlsZXIgMTcuMCIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDk5OTgKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyAgICAjZWxpZiBfX0lOVEVMX0NPTVBJTEVSID09IDk5OTkKKyAgICAgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkludGVsIEMrKyBDb21waWxlciBtYWlubGluZSIKKyAgICAjZW5kaWYKKyNlbGlmIEtNUF9DT01QSUxFUl9DTEFORworICAgICNkZWZpbmUgS01QX0NPTVBJTEVSICJDbGFuZyAiIHN0cmluZ2VyKCBfX2NsYW5nX21ham9yX18gKSAiLiIgc3RyaW5nZXIoIF9fY2xhbmdfbWlub3JfXyApCisjZWxpZiBLTVBfQ09NUElMRVJfR0NDCisgICAgI2RlZmluZSBLTVBfQ09NUElMRVIgIkdDQyAiIHN0cmluZ2VyKCBfX0dOVUNfXyApICIuIiBzdHJpbmdlciggX19HTlVDX01JTk9SX18gKQorI2VsaWYgS01QX0NPTVBJTEVSX01TVkMKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAiTVNWQyAiIHN0cmluZ2VyKCBfTVNDX0ZVTExfVkVSICkKKyNlbmRpZgorI2lmbmRlZiBLTVBfQ09NUElMRVIKKyAgICAjd2FybmluZyAiVW5rbm93biBjb21waWxlciIKKyAgICAjZGVmaW5lIEtNUF9DT01QSUxFUiAidW5rbm93biBjb21waWxlciIKKyNlbmRpZgorCisvLyBEZXRlY3QgbGlicnJheSB0eXBlIChwZXJmLCBzdHViKS4KKyNpZmRlZiBLTVBfU1RVQgorICAgICNkZWZpbmUgS01QX0xJQl9UWVBFICJzdHViIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSUJfVFlQRSAicGVyZm9ybWFuY2UiCisjZW5kaWYgLy8gS01QX0xJQl9UWVBFCisKKy8vIERldGVjdCBsaW5rIHR5cGUgKHN0YXRpYywgZHluYW1pYykuCisjaWZkZWYgS01QX0RZTkFNSUNfTElCCisgICAgI2RlZmluZSBLTVBfTElOS19UWVBFICJkeW5hbWljIgorI2Vsc2UKKyAgICAjZGVmaW5lIEtNUF9MSU5LX1RZUEUgInN0YXRpYyIKKyNlbmRpZiAvLyBLTVBfTElOS19UWVBFCisKKy8vIEZpbmFsbHksIGRlZmluZSBzdHJpbmdzLgorI2RlZmluZSBLTVBfTElCUkFSWSAgIEtNUF9MSUJfVFlQRSAiIGxpYnJhcnkgKCIgS01QX0xJTktfVFlQRSAiKSIKKyNkZWZpbmUgS01QX0NPUFlSSUdIVCAiIgorCitpbnQgY29uc3QgX19rbXBfdmVyc2lvbl9tYWpvciA9IEtNUF9WRVJTSU9OX01BSk9SOworaW50IGNvbnN0IF9fa21wX3ZlcnNpb25fbWlub3IgPSBLTVBfVkVSU0lPTl9NSU5PUjsKK2ludCBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkID0gS01QX1ZFUlNJT05fQlVJTEQ7CitpbnQgY29uc3QgX19rbXBfb3Blbm1wX3ZlcnNpb24gPQorICAgICNpZiBPTVBfNDBfRU5BQkxFRAorICAgICAgICAyMDEzMDc7CisgICAgI2Vsc2UKKyAgICAgICAgMjAxMTA3OworICAgICNlbmRpZgorCisvKiBEbyBOT1QgY2hhbmdlIHRoZSBmb3JtYXQgb2YgdGhpcyBzdHJpbmchICBJbnRlbChSKSBUaHJlYWQgUHJvZmlsZXIgY2hlY2tzIGZvciBhCisgICBzcGVjaWZpYyBmb3JtYXQgc29tZSBjaGFuZ2VzIGluIHRoZSByZWNvZ25pdGlvbiByb3V0aW5lIHRoZXJlIG5lZWQgdG8KKyAgIGJlIG1hZGUgYmVmb3JlIHRoaXMgaXMgY2hhbmdlZC4KKyovCitjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdID0KKyAgICBLTVBfVkVSU0lPTl9QUkVGSVggS01QX0xJQlJBUlkKKyAgICAiIHZlci4gIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUFKT1IgKSAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX01JTk9SICkKKyAgICAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX0JVSUxEICkgIiAiCisgICAgS01QX0NPUFlSSUdIVDsKKworY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2NvcHlyaWdodFtdICAgICAgPSBLTVBfVkVSU0lPTl9QUkVGSVggS01QX0NPUFlSSUdIVDsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saWJfdmVyW10gICAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJ2ZXJzaW9uOiAiIHN0cmluZ2VyKCBLTVBfVkVSU0lPTl9NQUpPUiApICIuIiBzdHJpbmdlciggS01QX1ZFUlNJT05fTUlOT1IgKSAiLiIgc3RyaW5nZXIoIEtNUF9WRVJTSU9OX0JVSUxEICk7CitjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXSAgICAgICA9IEtNUF9WRVJTSU9OX1BSRUZJWCAibGlicmFyeSB0eXBlOiAiIEtNUF9MSUJfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9saW5rX3R5cGVbXSAgICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJsaW5rIHR5cGU6ICIgS01QX0xJTktfVFlQRTsKK2NoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF90aW1lW10gICAgID0gS01QX1ZFUlNJT05fUFJFRklYICJidWlsZCB0aW1lOiAiICJub190aW1lc3RhbXAiOworI2lmIEtNUF9NSUMyCisgICAgY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX3RhcmdldF9lbnZbXSA9IEtNUF9WRVJTSU9OX1BSRUZJWCAidGFyZ2V0IGVudmlyb25tZW50OiBNSUMyIjsKKyNlbmRpZgorY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX2NvbXBpbGVyW10gPSBLTVBfVkVSU0lPTl9QUkVGSVggImJ1aWxkIGNvbXBpbGVyOiAiIEtNUF9DT01QSUxFUjsKKworLy8KKy8vIENhbGxlZCBhdCBzZXJpYWwgaW5pdGlhbGl6YXRpb24gdGltZS4KKy8vCitzdGF0aWMgaW50IF9fa21wX3ZlcnNpb25fMV9wcmludGVkID0gRkFMU0U7CisKK3ZvaWQKK19fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApCit7CisgICAgaWYgKCBfX2ttcF92ZXJzaW9uXzFfcHJpbnRlZCApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisgICAgX19rbXBfdmVyc2lvbl8xX3ByaW50ZWQgPSBUUlVFOworCisgICAgI2lmbmRlZiBLTVBfU1RVQgorICAgICAgICBrbXBfc3RyX2J1Zl90IGJ1ZmZlcjsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9pbml0KCAmIGJ1ZmZlciApOworICAgICAgICAvLyBQcmludCB2ZXJzaW9uIHN0cmluZ3Mgc2tpcHBpbmcgaW5pdGlhbCBtYWdpYy4KKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9saWJfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2xpbmtfdHlwZVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc1xuIiwgJiBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAjaWYgS01QX01JQworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudlsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICNlbmRpZgorICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fYnVpbGRfY29tcGlsZXJbIEtNUF9WRVJTSU9OX01BR0lDX0xFTiBdICk7CisgICAgICAgICNpZiBkZWZpbmVkKEtNUF9HT01QX0NPTVBBVCkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9hbHRfY29tcFsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgI2VuZGlmIC8qIGRlZmluZWQoS01QX0dPTVBfQ09NUEFUKSAqLworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIGJ1ZmZlciwgIiVzXG4iLCAmIF9fa21wX3ZlcnNpb25fb21wX2FwaVsgS01QX1ZFUlNJT05fTUFHSUNfTEVOIF0gKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCggJiBidWZmZXIsICIlc2R5bmFtaWMgZXJyb3IgY2hlY2tpbmc6ICVzXG4iLCBLTVBfVkVSU0lPTl9QUkVGX1NUUiwgKCBfX2ttcF9lbnZfY29uc2lzdGVuY3lfY2hlY2sgPyAieWVzIiA6ICJubyIgKSAgKTsKKyAgICAgICAgI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgZm9yICggaW50IGkgPSBic19wbGFpbl9iYXJyaWVyOyBpIDwgYnNfbGFzdF9iYXJyaWVyOyArKyBpICkgeworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoCisgICAgICAgICAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgICAgICAgICAiJXMlcyBiYXJyaWVyIGJyYW5jaCBiaXRzOiBnYXRoZXI9JXUsIHJlbGVhc2U9JXVcbiIsCisgICAgICAgICAgICAgICAgICAgIEtNUF9WRVJTSU9OX1BSRUZfU1RSLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3R5cGVfbmFtZVsgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX2dhdGhlcl9icmFuY2hfYml0c1sgaSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3JlbGVhc2VfYnJhbmNoX2JpdHNbIGkgXQorICAgICAgICAgICAgICAgICk7IC8vIF9fa21wX3N0cl9idWZfcHJpbnQKKyAgICAgICAgICAgIH07IC8vIGZvciBpCisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IGJzX3BsYWluX2JhcnJpZXI7IGkgPCBic19sYXN0X2JhcnJpZXI7ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICAgICAgICAgJiBidWZmZXIsCisgICAgICAgICAgICAgICAgICAgICIlcyVzIGJhcnJpZXIgcGF0dGVybjogZ2F0aGVyPSVzLCByZWxlYXNlPSVzXG4iLAorICAgICAgICAgICAgICAgICAgICBLTVBfVkVSU0lPTl9QUkVGX1NUUiwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl90eXBlX25hbWVbIGkgXSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfYmFycmllcl9wYXR0ZXJuX25hbWVbIF9fa21wX2JhcnJpZXJfZ2F0aGVyX3BhdHRlcm5bIGkgXSBdLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9iYXJyaWVyX3BhdHRlcm5fbmFtZVsgX19rbXBfYmFycmllcl9yZWxlYXNlX3BhdHRlcm5bIGkgXSBdCisgICAgICAgICAgICAgICAgKTsgLy8gX19rbXBfc3RyX2J1Zl9wcmludAorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgYnVmZmVyLCAiJXNcbiIsICYgX19rbXBfdmVyc2lvbl9sb2NrWyBLTVBfVkVSU0lPTl9NQUdJQ19MRU4gXSApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9wcmludCgKKyAgICAgICAgICAgICYgYnVmZmVyLAorICAgICAgICAgICAgIiVzdGhyZWFkIGFmZmluaXR5IHN1cHBvcnQ6ICVzXG4iLAorICAgICAgICAgICAgS01QX1ZFUlNJT05fUFJFRl9TVFIsCisgICAgICAgICAgICAjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0NBUEFCTEUoKQorICAgICAgICAgICAgICAgICAgICA/CisgICAgICAgICAgICAgICAgICAgICgKKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX2FmZmluaXR5X3R5cGUgPT0gYWZmaW5pdHlfbm9uZQorICAgICAgICAgICAgICAgICAgICAgICAgPworICAgICAgICAgICAgICAgICAgICAgICAgIm5vdCB1c2VkIgorICAgICAgICAgICAgICAgICAgICAgICAgOgorICAgICAgICAgICAgICAgICAgICAgICAgInllcyIKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICAgICAgICAgICAgICA6CisgICAgICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICAgICApCisgICAgICAgICAgICAjZWxzZQorICAgICAgICAgICAgICAgICJubyIKKyAgICAgICAgICAgICNlbmRpZgorICAgICAgICApOworICAgICAgICBfX2ttcF9wcmludGYoICIlcyIsIGJ1ZmZlci5zdHIgKTsKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIGJ1ZmZlciApOworICAgICAgICBLX0RJQUcoIDEsICggIktNUF9WRVJTSU9OIGlzIHRydWVcbiIgKSApOworICAgICNlbmRpZiAvLyBLTVBfU1RVQgorfSAvLyBfX2ttcF9wcmludF92ZXJzaW9uXzEKKworLy8KKy8vIENhbGxlZCBhdCBwYXJhbGxlbCBpbml0aWFsaXphdGlvbiB0aW1lLgorLy8KK3N0YXRpYyBpbnQgX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgPSBGQUxTRTsKKwordm9pZAorX19rbXBfcHJpbnRfdmVyc2lvbl8yKCB2b2lkICkgeworICAgIGlmICggX19rbXBfdmVyc2lvbl8yX3ByaW50ZWQgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX3ZlcnNpb25fMl9wcmludGVkID0gVFJVRTsKK30gLy8gX19rbXBfcHJpbnRfdmVyc2lvbl8yCisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfdmVyc2lvbi5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIxMjg1M2IKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3ZlcnNpb24uaApAQCAtMCwwICsxLDY4IEBACisvKgorICoga21wX3ZlcnNpb24uaCAtLSB2ZXJzaW9uIG51bWJlciBmb3IgdGhpcyByZWxlYXNlCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fSAorI2RlZmluZSBLTVBfVkVSU0lPTl9ICisKKyNpZmRlZiBfX2NwbHVzcGx1cworICAgIGV4dGVybiAiQyIgeworI2VuZGlmIC8vIF9fY3BsdXNwbHVzCisKKyNpZm5kZWYgS01QX1ZFUlNJT05fTUFKT1IKKyAgICAjZXJyb3IgS01QX1ZFUlNJT05fTUFKT1IgbWFjcm8gaXMgbm90IGRlZmluZWQuCisjZW5kaWYKKyNkZWZpbmUgS01QX1ZFUlNJT05fTUlOT1IgICAgICAgMAorLyoKKyAgICBVc2luZyAibWFnaWMiIHByZWZpeCBpbiBhbGwgdGhlIHZlcnNpb24gc3RyaW5ncyBpcyByYXRoZXIgY29udmVuaWVudCB0byBnZXQgc3RhdGljIHZlcnNpb24gaW5mbworICAgIGZyb20gYmluYXJpZXMgYnkgdXNpbmcgc3RhbmRhcmQgdXRpbGl0aWVzICJzdHJpbmdzIiBhbmQgImdyZXAiLCBlLiBnLjoKKyAgICAgICAgJCBzdHJpbmdzIGxpYm9tcC5zbyB8IGdyZXAgIkAoIykiCisgICAgZ2l2ZXMgY2xlYW4gbGlzdCBvZiBhbGwgdmVyc2lvbiBzdHJpbmdzIGluIHRoZSBsaWJyYXJ5LiBMZWFkaW5nIHplcm8gaGVscHMgdG8ga2VlcCB2ZXJzaW9uCisgICAgc3RyaW5nIHNlcGFyYXRlIGZyb20gcHJpbnRhYmxlIGNoYXJhY3RlcnMgd2hpY2ggbWF5IG9jY3VycyBqdXN0IGJlZm9yZSB2ZXJzaW9uIHN0cmluZy4KKyovCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX1NUUiAgICJceDAwQCgjKSAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX01BR0lDX0xFTiAgIDYgICAgICAgICAgICAgICAgLy8gTGVuZ3RoIG9mIEtNUF9WRVJTSU9OX01BR0lDX1NUUi4KKyNkZWZpbmUgS01QX1ZFUlNJT05fUFJFRl9TVFIgICAgIkludGVsKFIpIE9NUCAiCisjZGVmaW5lIEtNUF9WRVJTSU9OX1BSRUZJWCAgICAgIEtNUF9WRVJTSU9OX01BR0lDX1NUUiBLTVBfVkVSU0lPTl9QUkVGX1NUUgorCisvKiBkZWNsYXJlIGFsbCB0aGUgdmVyc2lvbiBzdHJpbmcgY29uc3RhbnRzIGZvciBLTVBfVkVSU0lPTiBlbnYuIHZhcmlhYmxlICovCitleHRlcm4gaW50ICBjb25zdCBfX2ttcF92ZXJzaW9uX21ham9yOworZXh0ZXJuIGludCAgY29uc3QgX19rbXBfdmVyc2lvbl9taW5vcjsKK2V4dGVybiBpbnQgIGNvbnN0IF9fa21wX3ZlcnNpb25fYnVpbGQ7CitleHRlcm4gaW50ICBjb25zdCBfX2ttcF9vcGVubXBfdmVyc2lvbjsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX2NvcHlyaWdodFtdOyAgICAvLyBPbGQgdmFyaWFibGUsIGtlcHQgZm9yIGNvbXBhdGliaWxpdHkgd2l0aCBJVEMgYW5kIElUUC4KK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fY29weXJpZ2h0W107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2xpYl92ZXJbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGliX3R5cGVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fbGlua190eXBlW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX2J1aWxkX3RpbWVbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fdGFyZ2V0X2VudltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9idWlsZF9jb21waWxlcltdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9hbHRfY29tcFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9vbXBfYXBpW107CisvLyA/Pz8gZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9kZWJ1Z1tdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9sb2NrW107CitleHRlcm4gY2hhciBjb25zdCBfX2ttcF92ZXJzaW9uX25lc3RlZF9zdGF0c19yZXBvcnRpbmdbXTsKK2V4dGVybiBjaGFyIGNvbnN0IF9fa21wX3ZlcnNpb25fZnRuc3RkY2FsbFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5jZGVjbFtdOworZXh0ZXJuIGNoYXIgY29uc3QgX19rbXBfdmVyc2lvbl9mdG5leHRyYVtdOworCit2b2lkIF9fa21wX3ByaW50X3ZlcnNpb25fMSggdm9pZCApOwordm9pZCBfX2ttcF9wcmludF92ZXJzaW9uXzIoIHZvaWQgKTsKKworI2lmZGVmIF9fY3BsdXNwbHVzCisgICAgfSAvLyBleHRlcm4gIkMiCisjZW5kaWYgLy8gX19jcGx1c3BsdXMKKworI2VuZGlmIC8qIEtNUF9WRVJTSU9OX0ggKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmNwcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wNWIxZTA1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF93YWl0X3JlbGVhc2UuY3BwCkBAIC0wLDAgKzEsMjYgQEAKKy8qCisgKiBrbXBfd2FpdF9yZWxlYXNlLmNwcCAtLSBXYWl0L1JlbGVhc2UgaW1wbGVtZW50YXRpb24KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKK3ZvaWQgX19rbXBfd2FpdF82NChrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ZsYWdfNjQgKmZsYWcsIGludCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikgKQoreworICAgIF9fa21wX3dhaXRfdGVtcGxhdGUodGhpc190aHIsIGZsYWcsIGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikgKTsKK30KKwordm9pZCBfX2ttcF9yZWxlYXNlXzY0KGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZShmbGFnKTsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfd2FpdF9yZWxlYXNlLmggYi9yYzMvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM4ZjZiNWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMva21wX3dhaXRfcmVsZWFzZS5oCkBAIC0wLDAgKzEsNTk4IEBACisvKgorICoga21wX3dhaXRfcmVsZWFzZS5oIC0tIFdhaXQvUmVsZWFzZSBpbXBsZW1lbnRhdGlvbgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XQUlUX1JFTEVBU0VfSAorI2RlZmluZSBLTVBfV0FJVF9SRUxFQVNFX0gKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RhdHMuaCIKKworLyohCitAZGVmZ3JvdXAgV0FJVF9SRUxFQVNFIFdhaXQvUmVsZWFzZSBvcGVyYXRpb25zCisKK1RoZSBkZWZpbml0aW9ucyBhbmQgZnVuY3Rpb25zIGhlcmUgaW1wbGVtZW50IHRoZSBsb3dlc3QgbGV2ZWwgdGhyZWFkCitzeW5jaHJvbml6YXRpb25zIG9mIHN1c3BlbmRpbmcgYSB0aHJlYWQgYW5kIGF3YWtpbmcgaXQuIFRoZXkgYXJlIHVzZWQKK3RvIGJ1aWxkIGhpZ2hlciBsZXZlbCBvcGVyYXRpb25zIHN1Y2ggYXMgYmFycmllcnMgYW5kIGZvcmsvam9pbi4KKyovCisKKy8qIQorQGluZ3JvdXAgV0FJVF9SRUxFQVNFCitAeworKi8KKworLyohCisgKiBUaGUgZmxhZ190eXBlIGRlc2NyaWJlcyB0aGUgc3RvcmFnZSB1c2VkIGZvciB0aGUgZmxhZy4KKyAqLworZW51bSBmbGFnX3R5cGUgeworICAgIGZsYWczMiwgICAgICAgIC8qKjwgMzIgYml0IGZsYWdzICovCisgICAgZmxhZzY0LCAgICAgICAgLyoqPCA2NCBiaXQgZmxhZ3MgKi8KKyAgICBmbGFnX29uY29yZSAgICAvKio8IHNwZWNpYWwgNjQtYml0IGZsYWcgZm9yIG9uLWNvcmUgYmFycmllciAoaGllcmFyY2hpY2FsKSAqLworfTsKKworLyohCisgKiBCYXNlIGNsYXNzIGZvciB3YWl0L3JlbGVhc2Ugdm9sYXRpbGUgZmxhZworICovCit0ZW1wbGF0ZSA8dHlwZW5hbWUgUD4KK2NsYXNzIGttcF9mbGFnIHsKKyAgICB2b2xhdGlsZSBQICogbG9jOyAgLyoqPCBQb2ludGVyIHRvIHRoZSBmbGFnIHN0b3JhZ2UgdGhhdCBpcyBtb2RpZmllZCBieSBhbm90aGVyIHRocmVhZCAqLworICAgIGZsYWdfdHlwZSB0OyAgICAgICAvKio8ICJUeXBlIiBvZiB0aGUgZmxhZyBpbiBsb2MgKi8KKyBwdWJsaWM6CisgICAgdHlwZWRlZiBQIGZsYWdfdDsKKyAgICBrbXBfZmxhZyh2b2xhdGlsZSBQICpwLCBmbGFnX3R5cGUgZnQpIDogbG9jKHApLCB0KGZ0KSB7fQorICAgIC8qIQorICAgICAqIEByZXN1bHQgdGhlIHBvaW50ZXIgdG8gdGhlIGFjdHVhbCBmbGFnCisgICAgICovCisgICAgdm9sYXRpbGUgUCAqIGdldCgpIHsgcmV0dXJuIGxvYzsgfQorICAgIC8qIQorICAgICAqIEBwYXJhbSBuZXdfbG9jIGluICAgc2V0IGxvYyB0byBwb2ludCBhdCBuZXdfbG9jCisgICAgICovCisgICAgdm9pZCBzZXQodm9sYXRpbGUgUCAqbmV3X2xvYykgeyBsb2MgPSBuZXdfbG9jOyB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0aGUgZmxhZ190eXBlCisgICAgICovCisgICAgZmxhZ190eXBlIGdldF90eXBlKCkgeyByZXR1cm4gdDsgfQorICAgIC8vIERlcml2ZWQgY2xhc3NlcyBtdXN0IHByb3ZpZGUgdGhlIGZvbGxvd2luZzoKKyAgICAvKgorICAgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSk7CisgICAga21wX3VpbnQzMiBnZXRfbnVtX3dhaXRlcnMoKTsKKyAgICBib29sIGRvbmVfY2hlY2soKTsKKyAgICBib29sIGRvbmVfY2hlY2tfdmFsKFAgb2xkX2xvYyk7CisgICAgYm9vbCBub3Rkb25lX2NoZWNrKCk7CisgICAgUCBpbnRlcm5hbF9yZWxlYXNlKCk7CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKTsKKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCk7CisgICAgUCBzZXRfc2xlZXBpbmcoKTsKKyAgICBQIHVuc2V0X3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19zbGVlcGluZygpOworICAgIGJvb2wgaXNfYW55X3NsZWVwaW5nKCk7CisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoUCBvbGRfbG9jKTsKKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpOworICAgICovCit9OworCisvKiBTcGluIHdhaXQgbG9vcCB0aGF0IGZpcnN0IGRvZXMgcGF1c2UsIHRoZW4geWllbGQsIHRoZW4gc2xlZXAuIEEgdGhyZWFkIHRoYXQgY2FsbHMgX19rbXBfd2FpdF8qCisgICBtdXN0IG1ha2UgY2VydGFpbiB0aGF0IGFub3RoZXIgdGhyZWFkIGNhbGxzIF9fa21wX3JlbGVhc2UgdG8gd2FrZSBpdCBiYWNrIHVwIHRvIHByZXZlbnQgZGVhZGxvY2tzISAgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkCitfX2ttcF93YWl0X3RlbXBsYXRlKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBDICpmbGFnLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSApCit7CisgICAgLy8gTk9URTogV2UgbWF5IG5vdCBiZWxvbmcgdG8gYSB0ZWFtIGF0IHRoaXMgcG9pbnQuCisgICAgdm9sYXRpbGUgdHlwZW5hbWUgQzo6ZmxhZ190ICpzcGluID0gZmxhZy0+Z2V0KCk7CisgICAga21wX3VpbnQzMiBzcGluczsKKyAgICBrbXBfdWludDMyIGhpYmVybmF0ZTsKKyAgICBpbnQgdGhfZ3RpZDsKKyAgICBpbnQgdGFza3NfY29tcGxldGVkID0gRkFMU0U7CisgICAgaW50IG92ZXJzdWJzY3JpYmVkOworCisgICAgS01QX0ZTWU5DX1NQSU5fSU5JVChzcGluLCBOVUxMKTsKKyAgICBpZiAoZmxhZy0+ZG9uZV9jaGVjaygpKSB7CisgICAgICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKHNwaW4pOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIHRoX2d0aWQgPSB0aGlzX3Roci0+dGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIEtBX1RSQUNFKDIwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgd2FpdGluZyBmb3IgZmxhZyglcClcbiIsIHRoX2d0aWQsIGZsYWcpKTsKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIHN0YXRzX3N0YXRlX2UgdGhyZWFkX3N0YXRlID0gS01QX0dFVF9USFJFQURfU1RBVEUoKTsKKyNlbmRpZgorCisjaWYgT01QVF9TVVBQT1JUICYmIE9NUFRfQkxBTUUKKyAgICBvbXB0X3N0YXRlX3Qgb21wdF9zdGF0ZSA9IHRoaXNfdGhyLT50aC5vbXB0X3RocmVhZF9pbmZvLnN0YXRlOworICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICBpZiAob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX2lkbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9iZWdpbikpIHsKKyAgICAgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9iZWdpbikodGhfZ3RpZCArIDEpOworICAgICAgICAgICAgfQorICAgICAgICB9IGVsc2UgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4pKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0KTsKKworICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90KiB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwSWQ7CisgICAgICAgICAgICBvbXB0X3Rhc2tfaWRfdCB0SWQ7CisgICAgICAgICAgICBpZiAodGVhbSl7CisgICAgICAgICAgICAgICAgcElkID0gdGVhbS0+b21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGVhbS0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcElkID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfYmVnaW4pKHBJZCwgdElkKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgLy8gU2V0dXAgZm9yIHdhaXRpbmcKKyAgICBLTVBfSU5JVF9ZSUVMRChzcGlucyk7CisKKyAgICBpZiAoX19rbXBfZGZsdF9ibG9ja3RpbWUgIT0gS01QX01BWF9CTE9DS1RJTUUpIHsKKyAgICAgICAgLy8gVGhlIHdvcmtlciB0aHJlYWRzIGNhbm5vdCByZWx5IG9uIHRoZSB0ZWFtIHN0cnVjdCBleGlzdGluZyBhdCB0aGlzIHBvaW50LgorICAgICAgICAvLyBVc2UgdGhlIGJ0IHZhbHVlcyBjYWNoZWQgaW4gdGhlIHRocmVhZCBzdHJ1Y3QgaW5zdGVhZC4KKyNpZmRlZiBLTVBfQURKVVNUX0JMT0NLVElNRQorICAgICAgICBpZiAoX19rbXBfemVyb19idCAmJiAhdGhpc190aHItPnRoLnRoX3RlYW1fYnRfc2V0KQorICAgICAgICAgICAgLy8gRm9yY2UgaW1tZWRpYXRlIHN1c3BlbmQgaWYgbm90IHNldCBieSB1c2VyIGFuZCBtb3JlIHRocmVhZHMgdGhhbiBhdmFpbGFibGUgcHJvY3MKKyAgICAgICAgICAgIGhpYmVybmF0ZSA9IDA7CisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIGhpYmVybmF0ZSA9IHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFsczsKKyNlbHNlCisgICAgICAgIGhpYmVybmF0ZSA9IHRoaXNfdGhyLT50aC50aF90ZWFtX2J0X2ludGVydmFsczsKKyNlbmRpZiAvKiBLTVBfQURKVVNUX0JMT0NLVElNRSAqLworCisgICAgICAgIC8qIElmIHRoZSBibG9ja3RpbWUgaXMgbm9uemVybywgd2Ugd2FudCB0byBtYWtlIHN1cmUgdGhhdCB3ZSBzcGluIHdhaXQgZm9yIHRoZSBlbnRpcmV0eQorICAgICAgICAgICBvZiB0aGUgc3BlY2lmaWVkICNpbnRlcnZhbHMsIHBsdXMgdXAgdG8gb25lIGludGVydmFsIG1vcmUuICBUaGlzIGluY3JlbWVudCBtYWtlCisgICAgICAgICAgIGNlcnRhaW4gdGhhdCB0aGlzIHRocmVhZCBkb2Vzbid0IGdvIHRvIHNsZWVwIHRvbyBzb29uLiAgKi8KKyAgICAgICAgaWYgKGhpYmVybmF0ZSAhPSAwKQorICAgICAgICAgICAgaGliZXJuYXRlKys7CisKKyAgICAgICAgLy8gQWRkIGluIHRoZSBjdXJyZW50IHRpbWUgdmFsdWUuCisgICAgICAgIGhpYmVybmF0ZSArPSBUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSk7CisgICAgICAgIEtGX1RSQUNFKDIwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgbm93PSVkLCBoaWJlcm5hdGU9JWQsIGludGVydmFscz0lZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgaGliZXJuYXRlLAorICAgICAgICAgICAgICAgICAgICAgIGhpYmVybmF0ZSAtIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKSk7CisgICAgfQorCisgICAgb3ZlcnN1YnNjcmliZWQgPSAoVENSXzQoX19rbXBfbnRoKSA+IF9fa21wX2F2YWlsX3Byb2MpOworICAgIEtNUF9NQigpOworCisgICAgLy8gTWFpbiB3YWl0IHNwaW4gbG9vcAorICAgIHdoaWxlIChmbGFnLT5ub3Rkb25lX2NoZWNrKCkpIHsKKyAgICAgICAgaW50IGluX3Bvb2w7CisgICAgICAgIGttcF90YXNrX3RlYW1fdCAqIHRhc2tfdGVhbSA9IE5VTEw7CisgICAgICAgIGlmIChfX2ttcF90YXNraW5nX21vZGUgIT0gdHNrbV9pbW1lZGlhdGVfZXhlYykgeworICAgICAgICAgICAgdGFza190ZWFtID0gdGhpc190aHItPnRoLnRoX3Rhc2tfdGVhbTsKKyAgICAgICAgICAgIC8qIElmIHRoZSB0aHJlYWQncyB0YXNrIHRlYW0gcG9pbnRlciBpcyBOVUxMLCBpdCBtZWFucyBvbmUgb2YgMyB0aGluZ3M6CisJICAgICAgIDEpIEEgbmV3bHktY3JlYXRlZCB0aHJlYWQgaXMgZmlyc3QgYmVpbmcgcmVsZWFzZWQgYnkgX19rbXBfZm9ya19iYXJyaWVyKCksIGFuZAorCSAgICAgICAgICBpdHMgdGFzayB0ZWFtIGhhcyBub3QgYmVlbiBzZXQgdXAgeWV0LgorCSAgICAgICAyKSBBbGwgdGFza3MgaGF2ZSBiZWVuIGV4ZWN1dGVkIHRvIGNvbXBsZXRpb24uCisJICAgICAgIDMpIFRhc2tpbmcgaXMgb2ZmIGZvciB0aGlzIHJlZ2lvbi4gIFRoaXMgY291bGQgYmUgYmVjYXVzZSB3ZSBhcmUgaW4gYSBzZXJpYWxpemVkIHJlZ2lvbgorCSAgICAgICAgICAocGVyaGFwcyB0aGUgb3V0ZXIgb25lKSwgb3IgZWxzZSB0YXNraW5nIHdhcyBtYW51YWxseSBkaXNhYmxlZCAoS01QX1RBU0tJTkc9MCkuICAqLworICAgICAgICAgICAgaWYgKHRhc2tfdGVhbSAhPSBOVUxMKSB7CisgICAgICAgICAgICAgICAgaWYgKFRDUl9TWU5DXzQodGFza190ZWFtLT50dC50dF9hY3RpdmUpKSB7CisgICAgICAgICAgICAgICAgICAgIGlmIChLTVBfVEFTS0lOR19FTkFCTEVEKHRhc2tfdGVhbSkpCisgICAgICAgICAgICAgICAgICAgICAgICBmbGFnLT5leGVjdXRlX3Rhc2tzKHRoaXNfdGhyLCB0aF9ndGlkLCBmaW5hbF9zcGluLCAmdGFza3NfY29tcGxldGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIDApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCghS01QX01BU1RFUl9USUQodGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfdGlkKSk7CisgICAgICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF90YXNrX3RlYW0gPSBOVUxMOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0gLy8gaWYKKyAgICAgICAgfSAvLyBpZgorCisgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoc3Bpbik7CisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisKKyAgICAgICAgLy8gSWYgd2UgYXJlIG92ZXJzdWJzY3JpYmVkLCBvciBoYXZlIHdhaXRlZCBhIGJpdCAoYW5kIEtNUF9MSUJSQVJZPXRocm91Z2hwdXQpLCB0aGVuIHlpZWxkCisgICAgICAgIEtNUF9ZSUVMRChvdmVyc3Vic2NyaWJlZCk7CisgICAgICAgIC8vIFRPRE86IFNob3VsZCBpdCBiZSBudW1iZXIgb2YgY29yZXMgaW5zdGVhZCBvZiB0aHJlYWQgY29udGV4dHM/IExpa2U6CisgICAgICAgIC8vIEtNUF9ZSUVMRChUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfbmNvcmVzKTsKKyAgICAgICAgLy8gTmVlZCBwZXJmb3JtYW5jZSBpbXByb3ZlbWVudCBkYXRhIHRvIG1ha2UgdGhlIGNoYW5nZS4uLgorICAgICAgICBLTVBfWUlFTERfU1BJTihzcGlucyk7CisKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhpcyB0aHJlYWQgd2FzIHRyYW5zZmVycmVkIGZyb20gYSB0ZWFtCisgICAgICAgIC8vIHRvIHRoZSB0aHJlYWQgcG9vbCAob3IgdmljZS12ZXJzYSkgd2hpbGUgc3Bpbm5pbmcuCisgICAgICAgIGluX3Bvb2wgPSAhIVRDUl80KHRoaXNfdGhyLT50aC50aF9pbl9wb29sKTsKKyAgICAgICAgaWYgKGluX3Bvb2wgIT0gISF0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wpIHsKKyAgICAgICAgICAgIGlmIChpbl9wb29sKSB7IC8vIFJlY2VudGx5IHRyYW5zZmVycmVkIGZyb20gdGVhbSB0byBwb29sCisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigoa21wX2ludDMyICopJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGgpOworICAgICAgICAgICAgICAgIHRoaXNfdGhyLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICAgICAgLyogSGVyZSwgd2UgY2Fubm90IGFzc2VydCB0aGF0OgorICAgICAgICAgICAgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoVENSXzQoX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCkgPD0gX19rbXBfdGhyZWFkX3Bvb2xfbnRoKTsKKyAgICAgICAgICAgICAgICAgICBfX2ttcF90aHJlYWRfcG9vbF9udGggaXMgaW5jL2RlYydkIGJ5IHRoZSBtYXN0ZXIgdGhyZWFkIHdoaWxlIHRoZSBmb3JrL2pvaW4KKyAgICAgICAgICAgICAgICAgICBsb2NrIGlzIGhlbGQsIHdoZXJlYXMgX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCBpcyBpbmMvZGVjJ2QgYXN5bmNocm9ub3VzbHkKKyAgICAgICAgICAgICAgICAgICBieSB0aGUgd29ya2Vycy4gIFRoZSB0d28gY2FuIGdldCBvdXQgb2Ygc3luYyBmb3IgYnJpZWYgcGVyaW9kcyBvZiB0aW1lLiAgKi8KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeyAvLyBSZWNlbnRseSB0cmFuc2ZlcnJlZCBmcm9tIHBvb2wgdG8gdGVhbQorICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCk7CisgICAgICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVChUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwKTsKKyAgICAgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBGQUxTRTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWYgS01QX1NUQVRTX0VOQUJMRUQKKyAgICAgICAgLy8gQ2hlY2sgaWYgdGhyZWFkIGhhcyBiZWVuIHNpZ25hbGxlZCB0byBpZGxlIHN0YXRlCisgICAgICAgIC8vIFRoaXMgaW5kaWNhdGVzIHRoYXQgdGhlIGxvZ2ljYWwgImpvaW4tYmFycmllciIgaGFzIGZpbmlzaGVkCisgICAgICAgIGlmICh0aGlzX3Roci0+dGgudGhfc3RhdHMtPmlzSWRsZSgpICYmIEtNUF9HRVRfVEhSRUFEX1NUQVRFKCkgPT0gRk9SS19KT0lOX0JBUlJJRVIpIHsKKyAgICAgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFKElETEUpOworICAgICAgICAgICAgS01QX1BVU0hfUEFSVElUSU9ORURfVElNRVIoT01QX2lkbGUpOworICAgICAgICB9CisjZW5kaWYKKworICAgICAgICAvLyBEb24ndCBzdXNwZW5kIGlmIEtNUF9CTE9DS1RJTUUgaXMgc2V0IHRvICJpbmZpbml0ZSIKKyAgICAgICAgaWYgKF9fa21wX2RmbHRfYmxvY2t0aW1lID09IEtNUF9NQVhfQkxPQ0tUSU1FKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gRG9uJ3Qgc3VzcGVuZCBpZiB0aGVyZSBpcyBhIGxpa2VsaWhvb2Qgb2YgbmV3IHRhc2tzIGJlaW5nIHNwYXduZWQuCisgICAgICAgIGlmICgodGFza190ZWFtICE9IE5VTEwpICYmIFRDUl80KHRhc2tfdGVhbS0+dHQudHRfZm91bmRfdGFza3MpKQorICAgICAgICAgICAgY29udGludWU7CisKKyAgICAgICAgLy8gSWYgd2UgaGF2ZSB3YWl0ZWQgYSBiaXQgbW9yZSwgZmFsbCBhc2xlZXAKKyAgICAgICAgaWYgKFRDUl80KF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlKSA8IGhpYmVybmF0ZSkKKyAgICAgICAgICAgIGNvbnRpbnVlOworCisgICAgICAgIEtGX1RSQUNFKDUwLCAoIl9fa21wX3dhaXRfc2xlZXA6IFQjJWQgc3VzcGVuZCB0aW1lIHJlYWNoZWRcbiIsIHRoX2d0aWQpKTsKKworICAgICAgICBmbGFnLT5zdXNwZW5kKHRoX2d0aWQpOworCisgICAgICAgIGlmIChUQ1JfNChfX2ttcF9nbG9iYWwuZy5nX2RvbmUpKSB7CisgICAgICAgICAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCkKKyAgICAgICAgICAgICAgICBfX2ttcF9hYm9ydF90aHJlYWQoKTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICB9CisgICAgICAgIC8vIFRPRE86IElmIHRocmVhZCBpcyBkb25lIHdpdGggd29yayBhbmQgdGltZXMgb3V0LCBkaXNiYW5kL2ZyZWUKKyAgICB9CisKKyNpZiBPTVBUX1NVUFBPUlQgJiYgT01QVF9CTEFNRQorICAgIGlmIChvbXB0X2VuYWJsZWQgJiYKKyAgICAgICAgb21wdF9zdGF0ZSAhPSBvbXB0X3N0YXRlX3VuZGVmaW5lZCkgeworICAgICAgICBpZiAob21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX2lkbGUpIHsKKyAgICAgICAgICAgIGlmIChvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaWRsZV9lbmQpKSB7CisgICAgICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X2lkbGVfZW5kKSh0aF9ndGlkICsgMSk7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmQpKSB7CisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKG9tcHRfc3RhdGUgPT0gb21wdF9zdGF0ZV93YWl0X2JhcnJpZXIgfHwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9zdGF0ZSA9PSBvbXB0X3N0YXRlX3dhaXRfYmFycmllcl9pbXBsaWNpdCB8fAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICBvbXB0X3N0YXRlID09IG9tcHRfc3RhdGVfd2FpdF9iYXJyaWVyX2V4cGxpY2l0KTsKKworICAgICAgICAgICAgb21wdF9sd190YXNrdGVhbV90KiB0ZWFtID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKyAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBwSWQ7CisgICAgICAgICAgICBvbXB0X3Rhc2tfaWRfdCB0SWQ7CisgICAgICAgICAgICBpZiAodGVhbSl7CisgICAgICAgICAgICAgICAgcElkID0gdGVhbS0+b21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGVhbS0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcElkID0gdGhpc190aHItPnRoLnRoX3RlYW0tPnQub21wdF90ZWFtX2luZm8ucGFyYWxsZWxfaWQ7CisgICAgICAgICAgICAgICAgdElkID0gdGhpc190aHItPnRoLnRoX2N1cnJlbnRfdGFzay0+b21wdF90YXNrX2luZm8udGFza19pZDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF93YWl0X2JhcnJpZXJfZW5kKShwSWQsIHRJZCk7CisgICAgICAgIH0KKyAgICB9CisjZW5kaWYKKyNpZiBLTVBfU1RBVFNfRU5BQkxFRAorICAgIC8vIElmIHdlIHdlcmUgcHV0IGludG8gaWRsZSBzdGF0ZSwgcG9wIHRoYXQgb2ZmIHRoZSBzdGF0ZSBzdGFjaworICAgIGlmIChLTVBfR0VUX1RIUkVBRF9TVEFURSgpID09IElETEUpIHsKKyAgICAgICAgS01QX1BPUF9QQVJUSVRJT05FRF9USU1FUigpOworICAgICAgICBLTVBfU0VUX1RIUkVBRF9TVEFURSh0aHJlYWRfc3RhdGUpOworICAgICAgICB0aGlzX3Roci0+dGgudGhfc3RhdHMtPnJlc2V0SWRsZUZsYWcoKTsKKyAgICB9CisjZW5kaWYKKworICAgIEtNUF9GU1lOQ19TUElOX0FDUVVJUkVEKHNwaW4pOworfQorCisvKiBSZWxlYXNlIGFueSB0aHJlYWRzIHNwZWNpZmllZCBhcyB3YWl0aW5nIG9uIHRoZSBmbGFnIGJ5IHJlbGVhc2luZyB0aGUgZmxhZyBhbmQgcmVzdW1lIHRoZSB3YWl0aW5nIHRocmVhZAorICAgaWYgaW5kaWNhdGVkIGJ5IHRoZSBzbGVlcCBiaXQocykuIEEgdGhyZWFkIHRoYXQgY2FsbHMgX19rbXBfd2FpdF90ZW1wbGF0ZSBtdXN0IGNhbGwgdGhpcyBmdW5jdGlvbiB0byB3YWtlCisgICB1cCB0aGUgcG90ZW50aWFsbHkgc2xlZXBpbmcgdGhyZWFkIGFuZCBwcmV2ZW50IGRlYWRsb2NrcyEgICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZAorX19rbXBfcmVsZWFzZV90ZW1wbGF0ZShDICpmbGFnKQoreworI2lmZGVmIEtNUF9ERUJVRworICAgIGludCBndGlkID0gVENSXzQoX19rbXBfaW5pdF9ndGlkKSA/IF9fa21wX2dldF9ndGlkKCkgOiAtMTsKKyNlbmRpZgorICAgIEtGX1RSQUNFKDIwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgcmVsZWFzaW5nIGZsYWcoJXgpXG4iLCBndGlkLCBmbGFnLT5nZXQoKSkpOworICAgIEtNUF9ERUJVR19BU1NFUlQoZmxhZy0+Z2V0KCkpOworICAgIEtNUF9GU1lOQ19SRUxFQVNJTkcoZmxhZy0+Z2V0KCkpOworCisgICAgZmxhZy0+aW50ZXJuYWxfcmVsZWFzZSgpOworCisgICAgS0ZfVFJBQ0UoMTAwLCAoIl9fa21wX3JlbGVhc2U6IFQjJWQgc2V0IG5ldyBzcGluPSVkXG4iLCBndGlkLCBmbGFnLT5nZXQoKSwgKihmbGFnLT5nZXQoKSkpKTsKKworICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSAhPSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAvLyBPbmx5IG5lZWQgdG8gY2hlY2sgc2xlZXAgc3R1ZmYgaWYgaW5maW5pdGUgYmxvY2sgdGltZSBub3Qgc2V0CisgICAgICAgIGlmIChmbGFnLT5pc19hbnlfc2xlZXBpbmcoKSkgeyAvLyBBcmUgKmFueSogb2YgdGhlIHRocmVhZHMgdGhhdCB3YWl0IG9uIHRoaXMgZmxhZyBzbGVlcGluZz8KKyAgICAgICAgICAgIGZvciAodW5zaWduZWQgaW50IGk9MDsgaTxmbGFnLT5nZXRfbnVtX3dhaXRlcnMoKTsgKytpKSB7CisgICAgICAgICAgICAgICAga21wX2luZm9fdCAqIHdhaXRlciA9IGZsYWctPmdldF93YWl0ZXIoaSk7IC8vIGlmIGEgc2xlZXBpbmcgd2FpdGVyIGV4aXN0cyBhdCBpLCBzZXRzIGN1cnJlbnRfd2FpdGVyIHRvIGkgaW5zaWRlIHRoZSBmbGFnCisgICAgICAgICAgICAgICAgaWYgKHdhaXRlcikgeworICAgICAgICAgICAgICAgICAgICBpbnQgd2FpdF9ndGlkID0gd2FpdGVyLT50aC50aF9pbmZvLmRzLmRzX2d0aWQ7CisgICAgICAgICAgICAgICAgICAgIC8vIFdha2UgdXAgdGhyZWFkIGlmIG5lZWRlZAorICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSg1MCwgKCJfX2ttcF9yZWxlYXNlOiBUIyVkIHdha2luZyB1cCB0aHJlYWQgVCMlZCBzaW5jZSBzbGVlcCBmbGFnKCVwKSBzZXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgd2FpdF9ndGlkLCBmbGFnLT5nZXQoKSkpOworICAgICAgICAgICAgICAgICAgICBmbGFnLT5yZXN1bWUod2FpdF9ndGlkKTsgLy8gdW5zZXRzIGZsYWcncyBjdXJyZW50X3dhaXRlciB3aGVuIGRvbmUKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9Cit9CisKK3RlbXBsYXRlIDx0eXBlbmFtZSBGbGFnVHlwZT4KK3N0cnVjdCBmbGFnX3RyYWl0cyB7fTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBmbGFnX3RyYWl0czxrbXBfdWludDMyPiB7CisgICAgdHlwZWRlZiBrbXBfdWludDMyIGZsYWdfdDsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ190eXBlIHQgPSBmbGFnMzI7CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGNyKGZsYWdfdCBmKSB7IHJldHVybiBUQ1JfNChmKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hZGQ0KHZvbGF0aWxlIGZsYWdfdCAqZikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BREQ0XzMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKilmKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9vcih2b2xhdGlsZSBmbGFnX3QgKmYsIGZsYWdfdCB2KSB7IHJldHVybiBLTVBfVEVTVF9USEVOX09SMzIoKHZvbGF0aWxlIGttcF9pbnQzMiAqKWYsIHYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX2FuZCh2b2xhdGlsZSBmbGFnX3QgKmYsIGZsYWdfdCB2KSB7IHJldHVybiBLTVBfVEVTVF9USEVOX0FORDMyKCh2b2xhdGlsZSBrbXBfaW50MzIgKilmLCB2KTsgfQorfTsKKwordGVtcGxhdGUgPD4KK3N0cnVjdCBmbGFnX3RyYWl0czxrbXBfdWludDY0PiB7CisgICAgdHlwZWRlZiBrbXBfdWludDY0IGZsYWdfdDsKKyAgICBzdGF0aWMgY29uc3QgZmxhZ190eXBlIHQgPSBmbGFnNjQ7CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGNyKGZsYWdfdCBmKSB7IHJldHVybiBUQ1JfOChmKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9hZGQ0KHZvbGF0aWxlIGZsYWdfdCAqZikgeyByZXR1cm4gS01QX1RFU1RfVEhFTl9BREQ0XzY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilmKTsgfQorICAgIHN0YXRpYyBpbmxpbmUgZmxhZ190IHRlc3RfdGhlbl9vcih2b2xhdGlsZSBmbGFnX3QgKmYsIGZsYWdfdCB2KSB7IHJldHVybiBLTVBfVEVTVF9USEVOX09SNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWYsIHYpOyB9CisgICAgc3RhdGljIGlubGluZSBmbGFnX3QgdGVzdF90aGVuX2FuZCh2b2xhdGlsZSBmbGFnX3QgKmYsIGZsYWdfdCB2KSB7IHJldHVybiBLTVBfVEVTVF9USEVOX0FORDY0KCh2b2xhdGlsZSBrbXBfaW50NjQgKilmLCB2KTsgfQorfTsKKwordGVtcGxhdGUgPHR5cGVuYW1lIEZsYWdUeXBlPgorY2xhc3Mga21wX2Jhc2ljX2ZsYWcgOiBwdWJsaWMga21wX2ZsYWc8RmxhZ1R5cGU+IHsKKyAgICB0eXBlZGVmIGZsYWdfdHJhaXRzPEZsYWdUeXBlPiB0cmFpdHNfdHlwZTsKKyAgICBGbGFnVHlwZSBjaGVja2VyOyAgLyoqPCBWYWx1ZSB0byBjb21wYXJlIGZsYWcgdG8gdG8gY2hlY2sgaWYgZmxhZyBoYXMgYmVlbiByZWxlYXNlZC4gKi8KKyAgICBrbXBfaW5mb190ICogd2FpdGluZ190aHJlYWRzWzFdOyAgLyoqPCBBcnJheSBvZiB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoaXMgdGhyZWFkLiAqLworICAgIGttcF91aW50MzIgbnVtX3dhaXRpbmdfdGhyZWFkczsgICAgICAgLyoqPCBOdW1iZXIgb2YgdGhyZWFkcyBzbGVlcGluZyBvbiB0aGlzIHRocmVhZC4gKi8KKyBwdWJsaWM6CisgICAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnApIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSB7fQorICAgIGttcF9iYXNpY19mbGFnKHZvbGF0aWxlIEZsYWdUeXBlICpwLCBrbXBfaW5mb190ICp0aHIpIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgbnVtX3dhaXRpbmdfdGhyZWFkcygxKSB7CisgICAgICAgIHdhaXRpbmdfdGhyZWFkc1swXSA9IHRocjsKKyAgICB9CisgICAga21wX2Jhc2ljX2ZsYWcodm9sYXRpbGUgRmxhZ1R5cGUgKnAsIEZsYWdUeXBlIGMpIDoga21wX2ZsYWc8RmxhZ1R5cGU+KHAsIHRyYWl0c190eXBlOjp0KSwgY2hlY2tlcihjKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSB7fQorICAgIC8qIQorICAgICAqIHBhcmFtIGkgaW4gICBpbmRleCBpbnRvIHdhaXRpbmdfdGhyZWFkcworICAgICAqIEByZXN1bHQgdGhlIHRocmVhZCB0aGF0IGlzIHdhaXRpbmcgYXQgaW5kZXggaQorICAgICAqLworICAgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGk8bnVtX3dhaXRpbmdfdGhyZWFkcyk7CisgICAgICAgIHJldHVybiB3YWl0aW5nX3RocmVhZHNbaV07CisgICAgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgbnVtX3dhaXRpbmdfdGhyZWFkcworICAgICAqLworICAgIGttcF91aW50MzIgZ2V0X251bV93YWl0ZXJzKCkgeyByZXR1cm4gbnVtX3dhaXRpbmdfdGhyZWFkczsgfQorICAgIC8qIQorICAgICAqIEBwYXJhbSB0aHIgaW4gICB0aGUgdGhyZWFkIHdoaWNoIGlzIG5vdyB3YWl0aW5nCisgICAgICoKKyAgICAgKiBJbnNlcnQgYSB3YWl0aW5nIHRocmVhZCBhdCBpbmRleCAwLgorICAgICAqLworICAgIHZvaWQgc2V0X3dhaXRlcihrbXBfaW5mb190ICp0aHIpIHsKKyAgICAgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOworICAgICAgICBudW1fd2FpdGluZ190aHJlYWRzID0gMTsKKyAgICB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0cnVlIGlmIHRoZSBmbGFnIG9iamVjdCBoYXMgYmVlbiByZWxlYXNlZC4KKyAgICAgKi8KKyAgICBib29sIGRvbmVfY2hlY2soKSB7IHJldHVybiB0cmFpdHNfdHlwZTo6dGNyKCoodGhpcy0+Z2V0KCkpKSA9PSBjaGVja2VyOyB9CisgICAgLyohCisgICAgICogQHBhcmFtIG9sZF9sb2MgaW4gICBvbGQgdmFsdWUgb2YgZmxhZworICAgICAqIEByZXN1bHQgdHJ1ZSBpZiB0aGUgZmxhZydzIG9sZCB2YWx1ZSBpbmRpY2F0ZXMgaXQgd2FzIHJlbGVhc2VkLgorICAgICAqLworICAgIGJvb2wgZG9uZV9jaGVja192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyA9PSBjaGVja2VyOyB9CisgICAgLyohCisgICAgICogQHJlc3VsdCB0cnVlIGlmIHRoZSBmbGFnIG9iamVjdCBpcyBub3QgeWV0IHJlbGVhc2VkLgorICAgICAqIFVzZWQgaW4gX19rbXBfd2FpdF90ZW1wbGF0ZSBsaWtlOgorICAgICAqIEBjb2RlCisgICAgICogd2hpbGUgKGZsYWcubm90ZG9uZV9jaGVjaygpKSB7IHBhdXNlKCk7IH0KKyAgICAgKiBAZW5kY29kZQorICAgICAqLworICAgIGJvb2wgbm90ZG9uZV9jaGVjaygpIHsgcmV0dXJuIHRyYWl0c190eXBlOjp0Y3IoKih0aGlzLT5nZXQoKSkpICE9IGNoZWNrZXI7IH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSByZWxlYXNlIHdhcyBhcHBsaWVkLgorICAgICAqIFRyaWdnZXIgYWxsIHdhaXRpbmcgdGhyZWFkcyB0byBydW4gYnkgbW9kaWZ5aW5nIGZsYWcgdG8gcmVsZWFzZSBzdGF0ZS4KKyAgICAgKi8KKyAgICB2b2lkIGludGVybmFsX3JlbGVhc2UoKSB7CisgICAgICAgICh2b2lkKSB0cmFpdHNfdHlwZTo6dGVzdF90aGVuX2FkZDQoKHZvbGF0aWxlIEZsYWdUeXBlICopdGhpcy0+Z2V0KCkpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcmVzdWx0IEFjdHVhbCBmbGFnIHZhbHVlIGJlZm9yZSBzbGVlcCBiaXQocykgc2V0LgorICAgICAqIE5vdGVzIHRoYXQgdGhlcmUgaXMgYXQgbGVhc3Qgb25lIHRocmVhZCBzbGVlcGluZyBvbiB0aGUgZmxhZyBieSBzZXR0aW5nIHNsZWVwIGJpdChzKS4KKyAgICAgKi8KKyAgICBGbGFnVHlwZSBzZXRfc2xlZXBpbmcoKSB7CisgICAgICAgIHJldHVybiB0cmFpdHNfdHlwZTo6dGVzdF90aGVuX29yKCh2b2xhdGlsZSBGbGFnVHlwZSAqKXRoaXMtPmdldCgpLCBLTVBfQkFSUklFUl9TTEVFUF9TVEFURSk7CisgICAgfQorICAgIC8qIQorICAgICAqIEByZXN1bHQgQWN0dWFsIGZsYWcgdmFsdWUgYmVmb3JlIHNsZWVwIGJpdChzKSBjbGVhcmVkLgorICAgICAqIE5vdGVzIHRoYXQgdGhlcmUgYXJlIG5vIGxvbmdlciB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnIGJ5IGNsZWFyaW5nIHNsZWVwIGJpdChzKS4KKyAgICAgKi8KKyAgICBGbGFnVHlwZSB1bnNldF9zbGVlcGluZygpIHsKKyAgICAgICAgcmV0dXJuIHRyYWl0c190eXBlOjp0ZXN0X3RoZW5fYW5kKCh2b2xhdGlsZSBGbGFnVHlwZSAqKXRoaXMtPmdldCgpLCB+S01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICAvKiEKKyAgICAgKiBAcGFyYW0gb2xkX2xvYyBpbiAgIG9sZCB2YWx1ZSBvZiBmbGFnCisgICAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnJ3Mgb2xkIHZhbHVlIGluIG9sZF9sb2MuCisgICAgICovCisgICAgYm9vbCBpc19zbGVlcGluZ192YWwoRmxhZ1R5cGUgb2xkX2xvYykgeyByZXR1cm4gb2xkX2xvYyAmIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFOyB9CisgICAgLyohCisgICAgICogVGVzdCB3aGV0aGVyIHRoZXJlIGFyZSB0aHJlYWRzIHNsZWVwaW5nIG9uIHRoZSBmbGFnLgorICAgICAqLworICAgIGJvb2wgaXNfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKih0aGlzLT5nZXQoKSkpOyB9CisgICAgYm9vbCBpc19hbnlfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKih0aGlzLT5nZXQoKSkpOyB9CisgICAga21wX3VpbnQ4ICpnZXRfc3RvbGVuKCkgeyByZXR1cm4gTlVMTDsgfQorICAgIGVudW0gYmFycmllcl90eXBlIGdldF9idCgpIHsgcmV0dXJuIGJzX2xhc3RfYmFycmllcjsgfQorfTsKKworY2xhc3Mga21wX2ZsYWdfMzIgOiBwdWJsaWMga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4geworIHB1YmxpYzoKKyAgICBrbXBfZmxhZ18zMih2b2xhdGlsZSBrbXBfdWludDMyICpwKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50MzI+KHApIHt9CisgICAga21wX2ZsYWdfMzIodm9sYXRpbGUga21wX3VpbnQzMiAqcCwga21wX2luZm9fdCAqdGhyKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50MzI+KHAsIHRocikge30KKyAgICBrbXBfZmxhZ18zMih2b2xhdGlsZSBrbXBfdWludDMyICpwLCBrbXBfdWludDMyIGMpIDoga21wX2Jhc2ljX2ZsYWc8a21wX3VpbnQzMj4ocCwgYykge30KKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpIHsgX19rbXBfc3VzcGVuZF8zMih0aF9ndGlkLCB0aGlzKTsgfQorICAgIHZvaWQgcmVzdW1lKGludCB0aF9ndGlkKSB7IF9fa21wX3Jlc3VtZV8zMih0aF9ndGlkLCB0aGlzKTsgfQorICAgIGludCBleGVjdXRlX3Rhc2tzKGttcF9pbmZvX3QgKnRoaXNfdGhyLCBrbXBfaW50MzIgZ3RpZCwgaW50IGZpbmFsX3NwaW4sIGludCAqdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaiksIGttcF9pbnQzMiBpc19jb25zdHJhaW5lZCkgeworICAgICAgICByZXR1cm4gX19rbXBfZXhlY3V0ZV90YXNrc18zMih0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaiksIGlzX2NvbnN0cmFpbmVkKTsKKyAgICB9CisgICAgdm9pZCB3YWl0KGttcF9pbmZvX3QgKnRoaXNfdGhyLCBpbnQgZmluYWxfc3BpbgorICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSkgeworICAgICAgICBfX2ttcF93YWl0X3RlbXBsYXRlKHRoaXNfdGhyLCB0aGlzLCBmaW5hbF9zcGluCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcoaXR0X3N5bmNfb2JqKSk7CisgICAgfQorICAgIHZvaWQgcmVsZWFzZSgpIHsgX19rbXBfcmVsZWFzZV90ZW1wbGF0ZSh0aGlzKTsgfQorICAgIGZsYWdfdHlwZSBnZXRfcHRyX3R5cGUoKSB7IHJldHVybiBmbGFnMzI7IH0KK307CisKK2NsYXNzIGttcF9mbGFnXzY0IDogcHVibGljIGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+IHsKKyBwdWJsaWM6CisgICAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCkgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwKSB7fQorICAgIGttcF9mbGFnXzY0KHZvbGF0aWxlIGttcF91aW50NjQgKnAsIGttcF9pbmZvX3QgKnRocikgOiBrbXBfYmFzaWNfZmxhZzxrbXBfdWludDY0PihwLCB0aHIpIHt9CisgICAga21wX2ZsYWdfNjQodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBjKSA6IGttcF9iYXNpY19mbGFnPGttcF91aW50NjQ+KHAsIGMpIHt9CisgICAgdm9pZCBzdXNwZW5kKGludCB0aF9ndGlkKSB7IF9fa21wX3N1c3BlbmRfNjQodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfNjQodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICBpbnQgZXhlY3V0ZV90YXNrcyhrbXBfaW5mb190ICp0aGlzX3Rociwga21wX2ludDMyIGd0aWQsIGludCBmaW5hbF9zcGluLCBpbnQgKnRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKHZvaWQgKiBpdHRfc3luY19vYmopLCBrbXBfaW50MzIgaXNfY29uc3RyYWluZWQpIHsKKyAgICAgICAgcmV0dXJuIF9fa21wX2V4ZWN1dGVfdGFza3NfNjQodGhpc190aHIsIGd0aWQsIHRoaXMsIGZpbmFsX3NwaW4sIHRocmVhZF9maW5pc2hlZAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7CisgICAgfQorICAgIHZvaWQgd2FpdChrbXBfaW5mb190ICp0aGlzX3RociwgaW50IGZpbmFsX3NwaW4KKyAgICAgICAgICAgICAgVVNFX0lUVF9CVUlMRF9BUkcodm9pZCAqIGl0dF9zeW5jX29iaikpIHsKKyAgICAgICAgX19rbXBfd2FpdF90ZW1wbGF0ZSh0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgICBmbGFnX3R5cGUgZ2V0X3B0cl90eXBlKCkgeyByZXR1cm4gZmxhZzY0OyB9Cit9OworCisvLyBIaWVyYXJjaGljYWwgNjQtYml0IG9uLWNvcmUgYmFycmllciBpbnN0YW50aWF0aW9uCitjbGFzcyBrbXBfZmxhZ19vbmNvcmUgOiBwdWJsaWMga21wX2ZsYWc8a21wX3VpbnQ2ND4geworICAgIGttcF91aW50NjQgY2hlY2tlcjsKKyAgICBrbXBfaW5mb190ICogd2FpdGluZ190aHJlYWRzWzFdOworICAgIGttcF91aW50MzIgbnVtX3dhaXRpbmdfdGhyZWFkczsKKyAgICBrbXBfdWludDMyIG9mZnNldDsgICAgICAvKio8IFBvcnRpb24gb2YgZmxhZyB0aGF0IGlzIG9mIGludGVyZXN0IGZvciBhbiBvcGVyYXRpb24uICovCisgICAgYm9vbCBmbGFnX3N3aXRjaDsgICAgICAgLyoqPCBJbmRpY2F0ZXMgYSBzd2l0Y2ggaW4gZmxhZyBsb2NhdGlvbi4gKi8KKyAgICBlbnVtIGJhcnJpZXJfdHlwZSBidDsgICAvKio8IEJhcnJpZXIgdHlwZS4gKi8KKyAgICBrbXBfaW5mb190ICogdGhpc190aHI7ICAvKio8IFRocmVhZCB0aGF0IG1heSBiZSByZWRpcmVjdGVkIHRvIGRpZmZlcmVudCBmbGFnIGxvY2F0aW9uLiAqLworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICB2b2lkICppdHRfc3luY19vYmo7ICAgICAvKio8IElUVCBvYmplY3QgdGhhdCBtdXN0IGJlIHBhc3NlZCB0byBuZXcgZmxhZyBsb2NhdGlvbi4gKi8KKyNlbmRpZgorICAgIHVuc2lnbmVkIGNoYXImIGJ5dGVyZWYodm9sYXRpbGUga21wX3VpbnQ2NCogbG9jLCBzaXplX3Qgb2Zmc2V0KSB7IHJldHVybiAoKHVuc2lnbmVkIGNoYXIgKilsb2MpW29mZnNldF07IH0KK3B1YmxpYzoKKyAgICBrbXBfZmxhZ19vbmNvcmUodm9sYXRpbGUga21wX3VpbnQ2NCAqcCkKKyAgICAgICAgOiBrbXBfZmxhZzxrbXBfdWludDY0PihwLCBmbGFnX29uY29yZSksIG51bV93YWl0aW5nX3RocmVhZHMoMCksIGZsYWdfc3dpdGNoKGZhbHNlKSB7fQorICAgIGttcF9mbGFnX29uY29yZSh2b2xhdGlsZSBrbXBfdWludDY0ICpwLCBrbXBfdWludDMyIGlkeCkKKyAgICAgICAgOiBrbXBfZmxhZzxrbXBfdWludDY0PihwLCBmbGFnX29uY29yZSksIG51bV93YWl0aW5nX3RocmVhZHMoMCksIG9mZnNldChpZHgpLCBmbGFnX3N3aXRjaChmYWxzZSkge30KKyAgICBrbXBfZmxhZ19vbmNvcmUodm9sYXRpbGUga21wX3VpbnQ2NCAqcCwga21wX3VpbnQ2NCBjLCBrbXBfdWludDMyIGlkeCwgZW51bSBiYXJyaWVyX3R5cGUgYmFyX3QsCisgICAgICAgICAgICAgICAgICAgIGttcF9pbmZvX3QgKiB0aHIKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICAgICAgICAgICAgICwgdm9pZCAqaXR0CisjZW5kaWYKKyAgICAgICAgICAgICAgICAgICAgKQorICAgICAgICA6IGttcF9mbGFnPGttcF91aW50NjQ+KHAsIGZsYWdfb25jb3JlKSwgY2hlY2tlcihjKSwgbnVtX3dhaXRpbmdfdGhyZWFkcygwKSwgb2Zmc2V0KGlkeCksCisgICAgICAgICAgZmxhZ19zd2l0Y2goZmFsc2UpLCBidChiYXJfdCksIHRoaXNfdGhyKHRocikKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgICwgaXR0X3N5bmNfb2JqKGl0dCkKKyNlbmRpZgorICAgICAgICB7fQorICAgIGttcF9pbmZvX3QgKiBnZXRfd2FpdGVyKGttcF91aW50MzIgaSkgeworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKGk8bnVtX3dhaXRpbmdfdGhyZWFkcyk7CisgICAgICAgIHJldHVybiB3YWl0aW5nX3RocmVhZHNbaV07CisgICAgfQorICAgIGttcF91aW50MzIgZ2V0X251bV93YWl0ZXJzKCkgeyByZXR1cm4gbnVtX3dhaXRpbmdfdGhyZWFkczsgfQorICAgIHZvaWQgc2V0X3dhaXRlcihrbXBfaW5mb190ICp0aHIpIHsKKyAgICAgICAgd2FpdGluZ190aHJlYWRzWzBdID0gdGhyOworICAgICAgICBudW1fd2FpdGluZ190aHJlYWRzID0gMTsKKyAgICB9CisgICAgYm9vbCBkb25lX2NoZWNrX3ZhbChrbXBfdWludDY0IG9sZF9sb2MpIHsgcmV0dXJuIGJ5dGVyZWYoJm9sZF9sb2Msb2Zmc2V0KSA9PSBjaGVja2VyOyB9CisgICAgYm9vbCBkb25lX2NoZWNrKCkgeyByZXR1cm4gZG9uZV9jaGVja192YWwoKmdldCgpKTsgfQorICAgIGJvb2wgbm90ZG9uZV9jaGVjaygpIHsKKyAgICAgICAgLy8gQ2FsY3VsYXRlIGZsYWdfc3dpdGNoCisgICAgICAgIGlmICh0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi53YWl0X2ZsYWcgPT0gS01QX0JBUlJJRVJfU1dJVENIX1RPX09XTl9GTEFHKQorICAgICAgICAgICAgZmxhZ19zd2l0Y2ggPSB0cnVlOworICAgICAgICBpZiAoYnl0ZXJlZihnZXQoKSxvZmZzZXQpICE9IDEgJiYgIWZsYWdfc3dpdGNoKQorICAgICAgICAgICAgcmV0dXJuIHRydWU7CisgICAgICAgIGVsc2UgaWYgKGZsYWdfc3dpdGNoKSB7CisgICAgICAgICAgICB0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi53YWl0X2ZsYWcgPSBLTVBfQkFSUklFUl9TV0lUQ0hJTkc7CisgICAgICAgICAgICBrbXBfZmxhZ182NCBmbGFnKCZ0aGlzX3Roci0+dGgudGhfYmFyW2J0XS5iYi5iX2dvLCAoa21wX3VpbnQ2NClLTVBfQkFSUklFUl9TVEFURV9CVU1QKTsKKyAgICAgICAgICAgIF9fa21wX3dhaXRfNjQodGhpc190aHIsICZmbGFnLCBUUlVFCisjaWYgVVNFX0lUVF9CVUlMRAorICAgICAgICAgICAgICAgICAgICAgICAgICAsIGl0dF9zeW5jX29iagorI2VuZGlmCisgICAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuIGZhbHNlOworICAgIH0KKyAgICB2b2lkIGludGVybmFsX3JlbGVhc2UoKSB7CisgICAgICAgIGlmIChfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSkgeworICAgICAgICAgICAgYnl0ZXJlZihnZXQoKSxvZmZzZXQpID0gMTsKKyAgICAgICAgfQorICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgIGttcF91aW50NjQgbWFzaz0wOworICAgICAgICAgICAgYnl0ZXJlZigmbWFzayxvZmZzZXQpID0gMTsKKyAgICAgICAgICAgICh2b2lkKSBLTVBfVEVTVF9USEVOX09SNjQoKHZvbGF0aWxlIGttcF9pbnQ2NCAqKWdldCgpLCBtYXNrKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBrbXBfdWludDY0IHNldF9zbGVlcGluZygpIHsKKyAgICAgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fT1I2NCgoa21wX2ludDY0IHZvbGF0aWxlICopZ2V0KCksIEtNUF9CQVJSSUVSX1NMRUVQX1NUQVRFKTsKKyAgICB9CisgICAga21wX3VpbnQ2NCB1bnNldF9zbGVlcGluZygpIHsKKyAgICAgICAgcmV0dXJuIEtNUF9URVNUX1RIRU5fQU5ENjQoKGttcF9pbnQ2NCB2b2xhdGlsZSAqKWdldCgpLCB+S01QX0JBUlJJRVJfU0xFRVBfU1RBVEUpOworICAgIH0KKyAgICBib29sIGlzX3NsZWVwaW5nX3ZhbChrbXBfdWludDY0IG9sZF9sb2MpIHsgcmV0dXJuIG9sZF9sb2MgJiBLTVBfQkFSUklFUl9TTEVFUF9TVEFURTsgfQorICAgIGJvb2wgaXNfc2xlZXBpbmcoKSB7IHJldHVybiBpc19zbGVlcGluZ192YWwoKmdldCgpKTsgfQorICAgIGJvb2wgaXNfYW55X3NsZWVwaW5nKCkgeyByZXR1cm4gaXNfc2xlZXBpbmdfdmFsKCpnZXQoKSk7IH0KKyAgICB2b2lkIHdhaXQoa21wX2luZm9fdCAqdGhpc190aHIsIGludCBmaW5hbF9zcGluKSB7CisgICAgICAgIF9fa21wX3dhaXRfdGVtcGxhdGU8a21wX2ZsYWdfb25jb3JlPih0aGlzX3RociwgdGhpcywgZmluYWxfc3BpbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIFVTRV9JVFRfQlVJTERfQVJHKGl0dF9zeW5jX29iaikpOworICAgIH0KKyAgICB2b2lkIHJlbGVhc2UoKSB7IF9fa21wX3JlbGVhc2VfdGVtcGxhdGUodGhpcyk7IH0KKyAgICB2b2lkIHN1c3BlbmQoaW50IHRoX2d0aWQpIHsgX19rbXBfc3VzcGVuZF9vbmNvcmUodGhfZ3RpZCwgdGhpcyk7IH0KKyAgICB2b2lkIHJlc3VtZShpbnQgdGhfZ3RpZCkgeyBfX2ttcF9yZXN1bWVfb25jb3JlKHRoX2d0aWQsIHRoaXMpOyB9CisgICAgaW50IGV4ZWN1dGVfdGFza3Moa21wX2luZm9fdCAqdGhpc190aHIsIGttcF9pbnQzMiBndGlkLCBpbnQgZmluYWxfc3BpbiwgaW50ICp0aHJlYWRfZmluaXNoZWQKKyAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyh2b2lkICogaXR0X3N5bmNfb2JqKSwga21wX2ludDMyIGlzX2NvbnN0cmFpbmVkKSB7CisgICAgICAgIHJldHVybiBfX2ttcF9leGVjdXRlX3Rhc2tzX29uY29yZSh0aGlzX3RociwgZ3RpZCwgdGhpcywgZmluYWxfc3BpbiwgdGhyZWFkX2ZpbmlzaGVkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBVU0VfSVRUX0JVSUxEX0FSRyhpdHRfc3luY19vYmopLCBpc19jb25zdHJhaW5lZCk7CisgICAgfQorICAgIGttcF91aW50OCAqZ2V0X3N0b2xlbigpIHsgcmV0dXJuIE5VTEw7IH0KKyAgICBlbnVtIGJhcnJpZXJfdHlwZSBnZXRfYnQoKSB7IHJldHVybiBidDsgfQorICAgIGZsYWdfdHlwZSBnZXRfcHRyX3R5cGUoKSB7IHJldHVybiBmbGFnX29uY29yZTsgfQorfTsKKworLy8gVXNlZCB0byB3YWtlIHVwIHRocmVhZHMsIHZvbGF0aWxlIHZvaWQqIGZsYWcgaXMgdXN1YWxseSB0aGUgdGhfc2xlZXBfbG9jIGFzc29jaWF0ZWQKKy8vIHdpdGggaW50IGd0aWQuCitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfbnVsbF9yZXN1bWVfd3JhcHBlcihpbnQgZ3RpZCwgdm9sYXRpbGUgdm9pZCAqZmxhZykgeworICAgIGlmICghZmxhZykgcmV0dXJuOworCisgICAgc3dpdGNoICgoKGttcF9mbGFnXzY0ICopZmxhZyktPmdldF90eXBlKCkpIHsKKyAgICBjYXNlIGZsYWczMjogX19rbXBfcmVzdW1lXzMyKGd0aWQsIE5VTEwpOyBicmVhazsKKyAgICBjYXNlIGZsYWc2NDogX19rbXBfcmVzdW1lXzY0KGd0aWQsIE5VTEwpOyBicmVhazsKKyAgICBjYXNlIGZsYWdfb25jb3JlOiBfX2ttcF9yZXN1bWVfb25jb3JlKGd0aWQsIE5VTEwpOyBicmVhazsKKyAgICB9Cit9CisKKy8qIQorQH0KKyovCisKKyNlbmRpZiAvLyBLTVBfV0FJVF9SRUxFQVNFX0gKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaCBiL3JjMy9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9nZXRwaWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MWEwNDZjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2ttcF93cmFwcGVyX2dldHBpZC5oCkBAIC0wLDAgKzEsNTYgQEAKKy8qCisgKiBrbXBfd3JhcHBlcl9nZXRwaWQuaCAtLSBnZXRwaWQoKSBkZWNsYXJhdGlvbi4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2lmbmRlZiBLTVBfV1JBUFBFUl9HRVRQSURfSAorI2RlZmluZSBLTVBfV1JBUFBFUl9HRVRQSURfSAorCisjaWYgS01QX09TX1VOSVgKKworICAgIC8vIE9uIFVuaXgtbGlrZSBzeXN0ZW1zIChMaW51eCogT1MgYW5kIE9TIFgqKSBnZXRwaWQoKSBpcyBkZWNsYXJlZCBpbiBzdGFuZGFyZCBoZWFkZXJzLgorICAgICNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyAgICAjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNlbGlmIEtNUF9PU19XSU5ET1dTCisKKyAgICAvLyBPbiBXaW5kb3dzKiBPUyBfZ2V0cGlkKCkgcmV0dXJucyBpbnQgKG5vdCBwaWRfdCkgYW5kIGlzIGRlY2xhcmVkIGluICJwcm9jZXNzLmgiLgorICAgICNpbmNsdWRlIDxwcm9jZXNzLmg+CisgICAgLy8gTGV0IHVzIHNpbXVsYXRlIFVuaXguCisgICAgdHlwZWRlZiBpbnQgcGlkX3Q7CisgICAgI2RlZmluZSBnZXRwaWQgX2dldHBpZAorCisjZWxzZQorCisgICAgI2Vycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgT1MuCisKKyNlbmRpZgorCisvKgorICAgIFRPRE86IEFsbCB0aGUgbGlib21wIHNvdXJjZSBjb2RlIHVzZXMgcGlkX3QgdHlwZSBmb3Igc3RvcmluZyB0aGUgcmVzdWx0IG9mIGdldHBpZCgpLCBpdCBpcyBnb29kLgorICAgIEJ1dCBvZnRlbiBpdCBwcmludGVkIGFzICIlZCIsIHRoYXQgaXMgbm90IGdvb2QsIGJlY2F1c2UgaXQgaWdub3JlcyBwaWRfdCBkZWZpbml0aW9uIChtYXkgcGlkX3QKKyAgICBiZSBsb25nZXIgdGhhdCBpbnQ/KS4gSXQgc2VlbXMgYWxsIHBpZCBwcmludHMgc2hvdWxkIGJlIHJld3JpdHRlbiBhcworCisgICAgICAgIHByaW50ZiggIiUiIEtNUF9VSU5UNjRfU1BFQywgKGttcF91aW50NjQpIHBpZCApOworCisgICAgb3IgKGF0IGxlYXN0KSBhcworCisgICAgICAgIHByaW50ZiggIiUiIEtNUF9VSU5UMzJfU1BFQywgKGttcF91aW50MzIpIHBpZCApOworCisgICAgKGttcF91aW50MzIsIGttcF91aW50NjQsIEtNUF9VSU5UNjRfU1BFQywgYW5kIEtNUF9VTklUMzJfU1BFQyBhcmUgZGVmaW5lZCBpbiAia21wX29zLmgiLikKKworKi8KKworI2VuZGlmIC8vIEtNUF9XUkFQUEVSX0dFVFBJRF9ICisKKy8vIGVuZCBvZiBmaWxlIC8vCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmggYi9yYzMvcnVudGltZS9zcmMva21wX3dyYXBwZXJfbWFsbG9jLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDUzZDFlZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy9rbXBfd3JhcHBlcl9tYWxsb2MuaApAQCAtMCwwICsxLDIwNSBAQAorLyoKKyAqIGttcF93cmFwcGVyX21hbGxvYy5oIC0tIFdyYXBwZXJzIGZvciBtZW1vcnkgYWxsb2NhdGlvbiByb3V0aW5lcworICogICAgICAgICAgICAgICAgICAgICAgICAgKG1hbGxvYygpLCBmcmVlKCksIGFuZCBvdGhlcnMpLgorICovCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZuZGVmIEtNUF9XUkFQUEVSX01BTExPQ19ICisjZGVmaW5lIEtNUF9XUkFQUEVSX01BTExPQ19ICisKKy8qCisgICAgVGhpcyBoZWFkZXIgc2VydmVzIGZvciAzIHB1cnBvc2VzOgorCisgICAgICAgIDEuIERlY2xhcmluZyBzdGFuZGFyZCBtZW1vcnkgYWxsb2NhdGlvbiByb3VyaW5lcyBpbiBPUy1pbmRlcGVuZGVudCB3YXkuCisgICAgICAgIDIuIFBhc3Npbmcgc291cmNlIGxvY2F0aW9uIGluZm8gdGhyb3VnaCBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVycy4KKyAgICAgICAgMy4gRW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLgorCisKKyAgICAxLiBEZWNsYXJpbmcgc3RhbmRhcmQgbWVtb3J5IGFsbG9jYXRpb24gcm91cmluZXMgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyAgICBPbiBMaW51eCogT1MsIGFsbG9jYSgpIGZ1bmN0aW9uIGlzIGRlY2xhcmVkIGluIDxhbGxvY2EuaD4gaGVhZGVyLCB3aGlsZSBvbiBXaW5kb3dzKiBPUyB0aGVyZSBpcyBubworICAgIDxhbGxvY2EuaD4gaGVhZGVyLCBmdW5jdGlvbiBfYWxsb2NhKCkgKG5vdGUgdW5kZXJzY29yZSEpIGlzIGRlY2xhcmVkIGluIDxtYWxsb2MuaD4uIFRoaXMgaGVhZGVyCisgICAgZWxpbWluYXRlcyB0aGVzZSBkaWZmZXJlbmNlcywgc28gY2xpZW50IGNvZGUgaW5jbHVpZGluZyAia21wX3dyYXBwZXJfbWFsbG9jLmgiIGNhbiByZWx5IG9uCisgICAgZm9sbG93aW5nIHJvdXRpbmVzOgorCisgICAgICAgIG1hbGxvYworICAgICAgICBjYWxsb2MKKyAgICAgICAgcmVhbGxvYworICAgICAgICBmcmVlCisgICAgICAgIGFsbG9jYQorCisgICAgaW4gT1MtaW5kZXBlbmRlbnQgd2F5LiBJdCBhbHNvIGVuYWJsZXMgbWVtb3J5IHRyYWNraW5nIGNhcGFiaWxpdGllcyBpbiBkZWJ1ZyBidWlsZC4gKEN1cnJlbnRseQorICAgIGl0IGlzIGF2YWlsYWJsZSBvbmx5IG9uIFdpbmRvd3MqIE9TLikKKworCisgICAgMi4gUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uIHdyYXBwZXJzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFNvbWUgdG9vbHMgbWF5IGhlbHAgZGVidWdnaW5nIG1lbW9yeSBlcnJvcnMsIGZvciBleGFtcGxlLCByZXBvcnQgbWVtb3J5IGxlYWtzLiBIb3dldmVyLCBtZW1vcnkKKyAgICBhbGxvY2F0aW9uIHdyYXBwZXJzIG1heSBoaW5kZXIgc291cmNlIGxvY2F0aW9uLgorCisgICAgRm9yIGV4YW1wbGU6CisKKyAgICAgICAgdm9pZCAqIGFsaWduZWRfbWFsbG9jKCBpbnQgc2l6ZSApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBtYWxsb2MoIHNpemUgKTsgLy8gQWxsIHRoZSBtZW1vcnkgbGVha3Mgd2lsbCBiZSByZXBvcnRlZCBhdCB0aGlzIGxpbmUuCisgICAgICAgICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9OworCisgICAgICAgIHB0ciA9IGFsaWduZWRfbWFsbG9jKCBzaXplICk7ICAgIC8vIE1lbW9yeSBsZWFrIHdpbGwgKm5vdCogYmUgZGV0ZWN0ZWQgaGVyZS4gOi0oCisKKyAgICBUbyBvdmVyY29tZSB0aGUgcHJvYmxlbSwgaW5mb3JtYXRpb24gYWJvdXQgb3JpZ2luYWwgc291cmNlIGxvY2F0aW9uIHNob3VsZCBiZSBwYXNzZWQgdGhyb3VnaCBhbGwKKyAgICB0aGUgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlcnMsIGZvciBleGFtcGxlOgorCisgICAgICAgIHZvaWQgKiBhbGlnbmVkX21hbGxvYyggaW50IHNpemUsIGNoYXIgY29uc3QgKiBmaWxlLCBpbnQgbGluZSApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBfbWFsbG9jX2RiZyggc2l6ZSwgZmlsZSwgbGluZSApOworICAgICAgICAgICAgLy8gc29tZSBhZGp1c3RtZW50cy4uLgorICAgICAgICAgICAgcmV0dXJuIHB0cjsKKyAgICAgICAgfTsKKworICAgICAgICB2b2lkICogcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUsIF9fRklMRV9fLCBfX0xJTkVfXyApOworCisgICAgVGhpcyBpcyBhIGdvb2QgaWRlYSBmb3IgZGVidWcsIGJ1dCBwYXNzaW5nIGFkZGl0aW9uYWwgYXJndW1lbnRzIGltcGFjdHMgcGVyZm9ybWFuY2UuIERpc2FibGluZworICAgIGV4dHJhIGFyZ3VtZW50cyBpbiByZWxlYXNlIHZlcnNpb24gb2YgdGhlIHNvZnR3YXJlIGludHJvZHVjZXMgdG9vIG1hbnkgY29uZGl0aW9uYWwgY29tcGlsYXRpb24sCisgICAgd2hpY2ggbWFrZXMgY29kZSB1bnJlYWRhYmxlLiBUaGlzIGhlYWRlciBkZWZpbmVzIGZldyBtYWNyb3MgYW5kIGZ1bmN0aW9ucyBmYWNpbGl0YXRpbmcgaXQ6CisKKyAgICAgICAgdm9pZCAqIF9hbGlnbmVkX21hbGxvYyggaW50IHNpemUgS01QX1NSQ19MT0NfREVDTCApIHsKKyAgICAgICAgICAgIHZvaWQgKiBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICAgICAvLyBzb21lIGFkanVzdG1lbnRzLi4uCisgICAgICAgICAgICByZXR1cm4gcHRyOworICAgICAgICB9OworICAgICAgICAjZGVmaW5lIGFsaWduZWRfbWFsbG9jKCBzaXplICkgX2FsaWduZWRfbWFsbG9jKCAoc2l6ZSkgS01QX1NSQ19MT0NfQ1VSUiApCisgICAgICAgICAgICAvLyBVc2UgbWFjcm8gaW5zdGVhZCBvZiBkaXJlY3QgY2FsbCB0byBmdW5jdGlvbi4KKworICAgICAgICB2b2lkICogcHRyID0gYWxpZ25lZF9tYWxsb2MoIHNpemUgKTsgIC8vIEJpbmdvISBNZW1vcnkgbGVhayB3aWxsIGJlIHJlcG9ydGVkIGF0IHRoaXMgbGluZS4KKworCisgICAgMy4gRW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzLgorICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworICAgIFNvbWUgcGxhdGZvcm1zIG1heSBvZmZlciBtZW1vcnkgZGVidWdnaW5nIGNhcGFiaWxpdGllcy4gRm9yIGV4YW1wbGUsIGRlYnVnIHZlcnNpb24gb2YgTWljcm9zb2Z0CisgICAgUlRMIHRyYWNrcyBhbGwgbWVtb3J5IGFsbG9jYXRpb25zIGFuZCBjYW4gcmVwb3J0IG1lbW9yeSBsZWFrcy4gVGhpcyBoZWFkZXIgZW5hYmxlcyB0aGlzLCBhbmQKKyAgICBtYWtlcyByZXBvcnQgbW9yZSB1c2VmdWwgKHNlZSAiUGFzc2luZyBzb3VyY2UgbG9jYXRpb24gaW5mbyB0aHJvdWdoIG1lbW9yeSBhbGxvY2F0aW9uCisgICAgd3JhcHBlcnMiKS4KKworKi8KKworI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAia21wX29zLmgiCisKKy8vIEluY2x1ZGUgYWxsb2NhKCkgZGVjbGFyYXRpb24uCisjaWYgS01QX09TX1dJTkRPV1MKKyAgICAjaW5jbHVkZSA8bWFsbG9jLmg+ICAgICAgICAvLyBXaW5kb3dzKiBPUzogX2FsbG9jYSgpIGRlY2xhcmVkIGluICJtYWxsb2MuaCIuCisgICAgI2RlZmluZSBhbGxvY2EgX2FsbG9jYSAgICAgLy8gQWxsb3cgdG8gdXNlIGFsbG9jYSgpIHdpdGggbm8gdW5kZXJzY29yZS4KKyNlbGlmIEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICAvLyBEZWNsYXJlZCBpbiAic3RkbGliLmgiLgorI2VsaWYgS01QX09TX1VOSVgKKyAgICAjaW5jbHVkZSA8YWxsb2NhLmg+ICAgICAgICAvLyBMaW51eCogT1MgYW5kIE9TIFgqOiBhbGxvYygpIGRlY2xhcmVkIGluICJhbGxvY2EiLgorI2Vsc2UKKyAgICAjZXJyb3IgVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4KKyNlbmRpZgorCisvKgorICAgIEtNUF9TUkNfTE9DX0RFQ0wgLS0gRGVjbGFyaW5nIHNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCBpbiBmdW5jdGlvbiBkZWNsYXJhdGlvbi4KKyAgICBLTVBfU1JDX0xPQ19QQVJNIC0tIFNvdXJjZSBsb2NhdGlvbiBwYXJhbWVtdGVycywgdG8gYmUgdXNlZCB0byBwYXNzIHBhcmFtZXRlcnMgdG8gdW5kZXJseWluZworICAgICAgICBsZXZlbHMuCisgICAgS01QX1NSQ19MT0NfQ1VSUiAtLSBTb3VyY2UgbG9jYXRpb24gYXJndW1lbnRzIGRlc2NyaWJpbmcgY3VycmVudCBsb2NhdGlvbiwgdG8gYmUgdXNlZCBhdAorICAgICAgICB0b3AtbGV2ZWwuCisKKyAgICBUeXBpY2FsIHVzYWdlOgorCisgICAgICAgIHZvaWQgKiBfYWxpZ25lZF9tYWxsb2MoIGludCBzaXplIEtNUF9TUkNfTE9DX0RFQ0wgKSB7CisgICAgICAgICAgICAvLyBOb3RlOiBDb21tYSBpcyBtaXNzZWQgYmVmb3JlIEtNUF9TUkNfTE9DX0RFQ0wuCisgICAgICAgICAgICBLRV9UUkFDRSggMjUsICggImNhbGxlZCBmcm9tICVzOiVkXG4iLCBLTVBfU1JDX0xPQ19QQVJNICkgKTsKKyAgICAgICAgICAgIC4uLgorICAgICAgICB9CisgICAgICAgICNkZWZpbmUgYWxpZ25lZF9tYWxsb2MoIHNpemUgKSBfYWxpZ25lZF9tYWxsb2MoIChzaXplKSBLTVBfU1JDX0xPQ19DVVJSICkKKyAgICAgICAgICAgIC8vIFVzZSBtYWNybyBpbnN0ZWFkIG9mIGRpcmVjdCBjYWxsIHRvIGZ1bmN0aW9uIC0tIG1hY3JvIHBhc3NlcyBpbmZvIGFib3V0IGN1cnJlbnQKKyAgICAgICAgICAgIC8vIHNvdXJjZSBsb2NhdGlvbiB0byB0aGUgZnVuYy4KKyovCisjaWYgS01QX0RFQlVHCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19ERUNMICAgICwgY2hhciBjb25zdCAqIF9maWxlXywgaW50IF9saW5lXworICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTSAgICAsIF9maWxlXywgX2xpbmVfCisgICAgI2RlZmluZSBLTVBfU1JDX0xPQ19DVVJSICAgICwgX19GSUxFX18sIF9fTElORV9fCisjZWxzZQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfREVDTAorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfUEFSTQorICAgICNkZWZpbmUgS01QX1NSQ19MT0NfQ1VSUgorI2VuZGlmIC8vIEtNUF9ERUJVRworCisvKgorICAgIG1hbGxvY19zcmNfbG9jKCkgYW5kIGZyZWVfc3JjX2xvYygpIGFyZSBwc2V1ZG8tZnVuY3Rpb25zIChyZWFsbHkgbWFjcm9zKSB3aXRoIGFjY2VwdHMgZXh0cmEKKyAgICBhcmd1bWVudHMgKHNvdXJjZSBsb2NhdGlvbiBpbmZvKSBpbiBkZWJ1ZyBtb2RlLiBUaGV5IHNob3VsZCBiZSB1c2VkIGluIHBsYWNlIG9mIG1hbGxvYygpIGFuZAorICAgIGZyZWUoKSwgdGhpcyBhbGxvd3MgZW5hYmxpbmcgbmF0aXZlIG1lbW9yeSBkZWJ1Z2dpbmcgY2FwYWJpbGl0aWVzIChpZiBhbnkpLgorCisgICAgVHlwaWNhbCB1c2FnZToKKworICAgICAgICBwdHIgPSBtYWxsb2Nfc3JjX2xvYyggc2l6ZSBLTVBfU1JDX0xPQ19QQVJNICk7CisgICAgICAgICAgICAvLyBJbnNpZGUgbWVtb3J5IGFsbG9jYXRpb24gd3JhcHBlciwgb3IKKyAgICAgICAgcHRyID0gbWFsbG9jX3NyY19sb2MoIHNpemUgS01QX1NSQ19MT0NfQ1VSUiApOworICAgICAgICAgICAgLy8gT3V0c2lkZSBvZiBtZW1vcnkgYWxsb2NhdGlvbiB3cmFwcGVyLgorCisKKyovCisjZGVmaW5lIG1hbGxvY19zcmNfbG9jKCBhcmdzICkgICAgX21hbGxvY19zcmNfbG9jKCBhcmdzICkKKyNkZWZpbmUgZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKSAgICBfZnJlZV9zcmNfbG9jKCAgIGFyZ3MgKQorICAgIC8qCisgICAgICAgIERlcGVuZGluZyBvbiBidWlsZCBtb2RlIChkZWJ1ZyBvciByZWxlYXNlKSwgbWFsbG9jX3NyY19sb2MgaXMgZGVjbGFyZWQgd2l0aCAxIG9yIDMKKyAgICAgICAgcGFyYW1ldGVycywgYnV0IGNhbGxzIHRvIG1hbGxvY19zcmNfbG9jKCkgYXJlIGFsd2F5cyB0aGUgc2FtZToKKworICAgICAgICAgICAgLi4uIG1hbGxvY19zcmNfbG9jKCBzaXplIEtNUF9TUkNfTE9DX1BBUk0gKTsgLy8gb3IgS01QX1NSQ19MT0NfQ1VSUgorCisgICAgICAgIENvbXBpbGVyIGlzc3VlcyB3YXJuaW5nL2Vycm9yICJ0b28gZmV3IGFyZ3VtZW50cyBpbiBtYWNybyBpbnZvY2F0aW9uIi4gRGVjbGFyaW5nIHR3bworICAgICAgICBtYWNyb3NlcywgbWFsbG9jX3NyY19sb2MoKSBhbmQgX21hbGxvY19zcmNfbG9jKCkgb3ZlcmNvbWVzIHRoZSBwcm9ibGVtLgorICAgICovCisKKyNpZiBLTVBfREVCVUcKKworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiBfREVCVUcKKyAgICAgICAgLy8gS01QX0RFQlVHICE9IF9ERUJVRy4gTVMgZGVidWcgUlRMIGlzIGF2YWlsYWJsZSBvbmx5IGlmIF9ERUJVRyBpcyBkZWZpbmVkLgorCisgICAgICAgIC8vIFdpbmRvd3MqIE9TIGhhcyBuYXRpdmUgbWVtb3J5IGRlYnVnZ2luZyBjYXBhYmlsaXRpZXMuIEVuYWJsZSB0aGVtLgorCisgICAgICAgICNpbmNsdWRlIDxjcnRkYmcuaD4KKworICAgICAgICAjZGVmaW5lIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgIF9DTElFTlRfQkxPQ0sKKyAgICAgICAgI2RlZmluZSBtYWxsb2MoIHNpemUgKSAgICAgICAgICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIGNhbGxvYyggbnVtLCBzaXplICkgICAgIF9jYWxsb2NfZGJnKCAobnVtKSwgKHNpemUpLCBLTVBfTUVNX0JMT0NLLCBfX0ZJTEVfXywgX19MSU5FX18gKQorICAgICAgICAjZGVmaW5lIHJlYWxsb2MoIHB0ciwgc2l6ZSApICAgIF9yZWFsbG9jX2RiZyggKHB0ciksIChzaXplKSwgS01QX01FTV9CTE9DSywgX19GSUxFX18sIF9fTElORV9fICkKKyAgICAgICAgI2RlZmluZSBmcmVlKCBwdHIgKSAgICAgICAgICAgICBfZnJlZV9kYmcoIChwdHIpLCBLTVBfTUVNX0JMT0NLICkKKworICAgICAgICAjZGVmaW5lIF9tYWxsb2Nfc3JjX2xvYyggc2l6ZSwgZmlsZSwgbGluZSApICBfbWFsbG9jX2RiZyggKHNpemUpLCBLTVBfTUVNX0JMT0NLLCAoZmlsZSksIChsaW5lKSApCisgICAgICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggICAgcHRyLCBmaWxlLCBsaW5lICkgIF9mcmVlX2RiZyggICAocHRyKSwgIEtNUF9NRU1fQkxPQ0sgICAgICAgICAgICAgICAgICkKKworICAgICNlbHNlCisKKyAgICAgICAgLy8gTGludXgqIE9TLCBPUyBYKiwgb3Igbm9uLWRlYnVnIFdpbmRvd3MqIE9TLgorCisgICAgICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplLCBmaWxlLCBsaW5lICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICAgICAjZGVmaW5lIF9mcmVlX3NyY19sb2MoIHB0ciwgZmlsZSwgbGluZSApICAgICAgIGZyZWUoIChwdHIpICkKKworICAgICNlbmRpZgorCisjZWxzZQorCisgICAgLy8gSW4gcmVsZWFzZSBidWlsZCBtYWxsb2Nfc3JjX2xvYygpIGFuZCBmcmVlX3NyY19sb2MoKSBkbyBub3QgaGF2ZSBleHRyYSBwYXJhbWV0ZXJzLgorICAgICNkZWZpbmUgX21hbGxvY19zcmNfbG9jKCBzaXplICkgICAgbWFsbG9jKCAoc2l6ZSkgKQorICAgICNkZWZpbmUgX2ZyZWVfc3JjX2xvYyggcHRyICkgICAgICAgZnJlZSggKHB0cikgKQorCisjZW5kaWYgLy8gS01QX0RFQlVHCisKKyNlbmRpZiAvLyBLTVBfV1JBUFBFUl9NQUxMT0NfSAorCisvLyBlbmQgb2YgZmlsZSAvLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIgYi9yYzMvcnVudGltZS9zcmMvbGlib21wLnJjLnZhcgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZjZhOWM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL2xpYm9tcC5yYy52YXIKQEAgLTAsMCArMSw3MCBAQAorLy8gbGlib21wLnJjLnZhcgorCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisjaW5jbHVkZSAid2lucmVzLmgiCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCitMQU5HVUFHRSBMQU5HX0VOR0xJU0gsIFNVQkxBTkdfRU5HTElTSF9VUyAgICAvLyBFbmdsaXNoIChVLlMuKSByZXNvdXJjZXMKKyNwcmFnbWEgY29kZV9wYWdlKDEyNTIpCisKK1ZTX1ZFUlNJT05fSU5GTyBWRVJTSU9OSU5GTworICAgIC8vIFBhcnRzIG9mIEZJTEVWRVJTSU9OIGFuZCBQUk9EVUNUVkVSU0lPTiBhcmUgMTYtYml0IGZpZWxkcywgZW50aXJlIGJ1aWxkIGRhdGUgeXl5eW1tZGQKKyAgICAvLyBkb2VzIG5vdCBmaXQgaW50byBvbmUgdmVyc2lvbiBwYXJ0LCBzbyB3ZSBuZWVkIHRvIHNwbGl0IGl0IGludG8geXl5eSBhbmQgbW1kZDoKKyAgICBGSUxFVkVSU0lPTiAgICBATElCT01QX1ZFUlNJT05fTUFKT1JALEBMSUJPTVBfVkVSU0lPTl9NSU5PUkAsQExJQk9NUF9WRVJTSU9OX0JVSUxEX1lFQVJALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9NT05USF9EQVlACisgICAgUFJPRFVDVFZFUlNJT04gQExJQk9NUF9WRVJTSU9OX01BSk9SQCxATElCT01QX1ZFUlNJT05fTUlOT1JALEBMSUJPTVBfVkVSU0lPTl9CVUlMRF9ZRUFSQCxATElCT01QX1ZFUlNJT05fQlVJTERfTU9OVEhfREFZQAorICAgIEZJTEVGTEFHU01BU0sgIFZTX0ZGSV9GSUxFRkxBR1NNQVNLCisgICAgRklMRUZMQUdTICAgICAgMAorI2lmIEtNUF9ERUJVRworICAgICAgICB8IFZTX0ZGX0RFQlVHCisjZW5kaWYKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgfCBWU19GRl9QUklWQVRFQlVJTEQgfCBWU19GRl9QUkVSRUxFQVNFCisjZW5kaWYKKyAgICBGSUxFT1MgICAgICAgICAgVk9TX05UX1dJTkRPV1MzMiAgICAvLyBXaW5kb3dzKiBTZXJ2ZXIqIDIwMDMsIFhQKiwgMjAwMCwgb3IgTlQqCisgICAgRklMRVRZUEUgICAgICAgIFZGVF9ETEwKKyAgICBCRUdJTgorICAgICAgICBCTE9DSyAiU3RyaW5nRmlsZUluZm8iCisgICAgICAgIEJFR0lOCisgICAgICAgICAgICBCTE9DSyAiMDQwOTA0YjAiICAgICAgICAgICAgLy8gVS5TLiBFbmdsaXNoLCBVbmljb2RlICgweDA0YjAgPT0gMTIwMCkKKyAgICAgICAgICAgIEJFR0lOCisKKyAgICAgICAgICAgICAgICAvLyBGaWxlRGVzY3JpcHRpb24gYW5kIExlZ2FsQ29weXJpZ2h0IHNob3VsZCBiZSBzaG9ydC4KKyAgICAgICAgICAgICAgICBWQUxVRSAiRmlsZURlc2NyaXB0aW9uIiwgICJMTFZNKiBPcGVuTVAqIFJ1bnRpbWUgTGlicmFyeVwwIgorICAgICAgICAgICAgICAgIC8vIEZvbGxvd2luZyB2YWx1ZXMgbWF5IGJlIHJlbGF0aXZlbHkgbG9uZy4KKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tcGFueU5hbWUiLCAgICAgICJMTFZNXDAiCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIkxlZ2FsVHJhZGVtYXJrcyIsICAiXDAiICAvLyBOb3QgdXNlZCBmb3Igbm93LgorICAgICAgICAgICAgICAgIFZBTFVFICJQcm9kdWN0TmFtZSIsICAgICAgIkxMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5XDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIlByb2R1Y3RWZXJzaW9uIiwgICAiQExJQk9NUF9WRVJTSU9OX01BSk9SQC5ATElCT01QX1ZFUlNJT05fTUlOT1JAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIkZpbGVWZXJzaW9uIiwgICAgICAiQExJQk9NUF9WRVJTSU9OX0JVSUxEQFwwIgorICAgICAgICAgICAgICAgIFZBTFVFICJJbnRlcm5hbE5hbWUiLCAgICAgIkBMSUJPTVBfTElCX0ZJTEVAXDAiCisgICAgICAgICAgICAgICAgVkFMVUUgIk9yaWdpbmFsRmlsZW5hbWUiLCAiQExJQk9NUF9MSUJfRklMRUBcMCIKKyAgICAgICAgICAgICAgICBWQUxVRSAiQ29tbWVudHMiLAorICAgICAgICAgICAgICAgICAgICAiTExWTSogT3Blbk1QKiBATElCT01QX0xFR0FMX1RZUEVAIExpYnJhcnkgIgorICAgICAgICAgICAgICAgICAgICAidmVyc2lvbiBATElCT01QX1ZFUlNJT05fTUFKT1JALkBMSUJPTVBfVkVSU0lPTl9NSU5PUkAuQExJQk9NUF9WRVJTSU9OX0JVSUxEQCAiCisgICAgICAgICAgICAgICAgICAgICJmb3IgQExJQk9NUF9MRUdBTF9BUkNIQCBhcmNoaXRlY3R1cmUgYnVpbHQgb24gQExJQk9NUF9CVUlMRF9EQVRFQC5cMCIKKyNpZiBATElCT01QX1ZFUlNJT05fQlVJTERAID09IDAKKyAgICAgICAgICAgICAgICAgICAgVkFMVUUgIlByaXZhdGVCdWlsZCIsCisgICAgICAgICAgICAgICAgICAgICAgICAiVGhpcyBpcyBhIGRldmVsb3BtZW50IGJ1aWxkLlwwIgorI2VuZGlmCisgICAgICAgICAgICAgICAgLy8gVkFMVUUgIlNwZWNpYWxCdWlsZCIsICAgICAiXDAiICAgIC8vIE5vdCB1c2VkIGZvciBub3cuCisKKyAgICAgICAgICAgIEVORAorICAgICAgICBFTkQKKyAgICAgICAgQkxPQ0sgIlZhckZpbGVJbmZvIgorICAgICAgICBCRUdJTgorICAgICAgICAgICAgVkFMVUUgIlRyYW5zbGF0aW9uIiwgMTAzMywgMTIwMAorICAgICAgICAgICAgLy8gMTAzMyAtLSBVLlMuIEVuZ2xpc2gsIDEyMDAgLS0gVW5pY29kZQorICAgICAgICBFTkQKKyAgICBFTkQKKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9vbXB0LWV2ZW50LXNwZWNpZmljLmggYi9yYzMvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkZjEyMTMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvb21wdC1ldmVudC1zcGVjaWZpYy5oCkBAIC0wLDAgKzEsMTUyIEBACisjaWZuZGVmICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisjZGVmaW5lICBfX09NUFRfRVZFTlRfU1BFQ0lGSUNfSF9fCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIEZpbGU6IG9tcHQtZXZlbnQtc3BlY2lmaWMuaAorICoKKyAqIERlc2NyaXB0aW9uOgorICoKKyAqICAgc3BlY2lmeSB3aGljaCBvZiB0aGUgT01QVCBldmVudHMgYXJlIGltcGxlbWVudGVkIGJ5IHRoaXMgcnVudGltZSBzeXN0ZW0KKyAqICAgYW5kIHRoZSBsZXZlbCBvZiB0aGVpciBpbXBsZW1lbnRhdGlvbiBieSBhIHJ1bnRpbWUgc3lzdGVtLgorICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIF9vbXB0X3Rva2VucGFzdGVfaGVscGVyKHgseSkgICAgICAgIHggIyMgeQorI2RlZmluZSBfb21wdF90b2tlbnBhc3RlKHgseSkgICAgICAgICAgICAgICBfb21wdF90b2tlbnBhc3RlX2hlbHBlcih4LHkpCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGUpIF9vbXB0X3Rva2VucGFzdGUoZSxfaW1wbGVtZW50ZWQpCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBTcGVjaWZ5IHdoZXRoZXIgYW4gZXZlbnQgbWF5IG9jY3VyIG9yIG5vdCwgYW5kIHdoZXRoZXIgZXZlbnQgY2FsbGJhY2tzCisgfCBuZXZlciwgc29tZXRpbWVzLCBvciBhbHdheXMgb2NjdXIuCisgfAorIHwgVGhlIHZhbHVlcyBmb3IgdGhlc2UgY29uc3RhbnRzIGFyZSBkZWZpbmVkIGluIHNlY3Rpb24gNi4xLjIgb2YKKyB8IHRoZSBPTVBUIFRSLiBUaGV5IGFyZSBleHBvc2VkIHRvIHRvb2xzIHRocm91Z2ggb21wdF9zZXRfY2FsbGJhY2suCisgKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tKi8KKworI2RlZmluZSBvbXB0X2V2ZW50X05FVkVSICAgICAgICAgICAgIG9tcHRfc2V0X3Jlc3VsdF9ldmVudF9uZXZlcl9vY2N1cnMKKyNkZWZpbmUgb21wdF9ldmVudF9VTklNUExFTUVOVEVEICAgICBvbXB0X3NldF9yZXN1bHRfZXZlbnRfbWF5X29jY3VyX25vX2NhbGxiYWNrCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0NPTlZFTklFTlQgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19zb21lCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZUyAgICAgICAgb21wdF9zZXRfcmVzdWx0X2V2ZW50X21heV9vY2N1cl9jYWxsYmFja19hbHdheXMKKworI2lmIE9NUFRfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZWxzZQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNlbmRpZgorCisjaWYgT01QVF9CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNlbHNlCisjZGVmaW5lIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRSAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmCisKKy8qLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIHwgTWFuZGF0b3J5IEV2ZW50cworICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisjZGVmaW5lIG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZUworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKworI2RlZmluZSBvbXB0X2V2ZW50X3RocmVhZF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVMKKyNkZWZpbmUgb21wdF9ldmVudF90aHJlYWRfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9jb250cm9sX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKyNkZWZpbmUgb21wdF9ldmVudF9ydW50aW1lX3NodXRkb3duX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTCisKKworLyotLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgfCBPcHRpb25hbCBFdmVudHMgKGJsYW1lIHNoaWZ0aW5nKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pZGxlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfaWRsZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2VfbmVzdF9sb2NrX2xhc3RfaW1wbGVtZW50ZWQgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX0JMQU1FCisjZGVmaW5lIG9tcHRfZXZlbnRfcmVsZWFzZV9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19CTEFNRQorI2RlZmluZSBvbXB0X2V2ZW50X3JlbGVhc2Vfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfQkxBTUUKKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IE9wdGlvbmFsIEV2ZW50cyAoc3luY2hyb25vdXMgZXZlbnRzKQorICstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSovCisKKyNkZWZpbmUgb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdGlhbF90YXNrX2JlZ2luX2ltcGxlbWVudGVkICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRpYWxfdGFza19lbmRfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tfc3dpdGNoX2ltcGxlbWVudGVkICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2xvb3BfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9sb29wX2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9zZWN0aW9uc19iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfc2VjdGlvbnNfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX2luX2Jsb2NrX2JlZ2luX2ltcGxlbWVudGVkICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3NpbmdsZV9pbl9ibG9ja19lbmRfaW1wbGVtZW50ZWQgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9zaW5nbGVfb3RoZXJzX2JlZ2luX2ltcGxlbWVudGVkICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfc2luZ2xlX290aGVyc19lbmRfaW1wbGVtZW50ZWQgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfd29ya3NoYXJlX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dvcmtzaGFyZV9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKworI2RlZmluZSBvbXB0X2V2ZW50X21hc3Rlcl9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9tYXN0ZXJfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYmFycmllcl9lbmRfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfdGFza3dhaXRfYmVnaW5faW1wbGVtZW50ZWQgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2t3YWl0X2VuZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X3Rhc2tncm91cF9iZWdpbl9pbXBsZW1lbnRlZCAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF90YXNrZ3JvdXBfZW5kX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNkZWZpbmUgb21wdF9ldmVudF9yZWxlYXNlX25lc3RfbG9ja19wcmV2X2ltcGxlbWVudGVkICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF93YWl0X2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisjZGVmaW5lIG9tcHRfZXZlbnRfd2FpdF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X3dhaXRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2xvY2tfaW1wbGVtZW50ZWQgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9uZXN0X2xvY2tfZmlyc3RfaW1wbGVtZW50ZWQgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfbmVzdF9sb2NrX25leHRfaW1wbGVtZW50ZWQgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2FjcXVpcmVkX2NyaXRpY2FsX2ltcGxlbWVudGVkICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyNkZWZpbmUgb21wdF9ldmVudF9hY3F1aXJlZF9hdG9taWNfaW1wbGVtZW50ZWQgICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjZGVmaW5lIG9tcHRfZXZlbnRfYWNxdWlyZWRfb3JkZXJlZF9pbXBsZW1lbnRlZCAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorCisjZGVmaW5lIG9tcHRfZXZlbnRfaW5pdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICAgICAgIG9tcHRfZXZlbnRfTUFZX0FMV0FZU19UUkFDRQorI2RlZmluZSBvbXB0X2V2ZW50X2luaXRfbmVzdF9sb2NrX2ltcGxlbWVudGVkICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKworI2RlZmluZSBvbXB0X2V2ZW50X2Rlc3Ryb3lfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNkZWZpbmUgb21wdF9ldmVudF9kZXN0cm95X25lc3RfbG9ja19pbXBsZW1lbnRlZCAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisKKyNkZWZpbmUgb21wdF9ldmVudF9mbHVzaF9pbXBsZW1lbnRlZCAgICAgICAgICAgICAgICAgICAgb21wdF9ldmVudF9VTklNUExFTUVOVEVECisKKyNpZiBPTVBfNDBfRU5BQkxFRAorIyBkZWZpbmUgb21wdF9ldmVudF90YXNrX2RlcGVuZGVuY2VzX2ltcGxlbWVudGVkICAgICAgICAgb21wdF9ldmVudF9NQVlfQUxXQVlTX1RSQUNFCisjIGRlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZV9wYWlyX2ltcGxlbWVudGVkICAgICBvbXB0X2V2ZW50X01BWV9BTFdBWVNfVFJBQ0UKKyNlbHNlCisjIGRlZmluZSBvbXB0X2V2ZW50X3Rhc2tfZGVwZW5kZW5jZXNfaW1wbGVtZW50ZWQgICAgICAgICBvbXB0X2V2ZW50X1VOSU1QTEVNRU5URUQKKyMgZGVmaW5lIG9tcHRfZXZlbnRfdGFza19kZXBlbmRlbmNlX3BhaXJfaW1wbGVtZW50ZWQgICAgIG9tcHRfZXZlbnRfVU5JTVBMRU1FTlRFRAorI2VuZGlmIC8qIE9NUF80MF9FTkFCTEVEICovCisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL29tcHQtZ2VuZXJhbC5jIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtZ2VuZXJhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjM0ZjEwNzMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvb21wdC1nZW5lcmFsLmMKQEAgLTAsMCArMSw1MzUgQEAKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3lzdGVtIGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSA8YXNzZXJ0Lmg+CisKKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBvbXB0IGluY2x1ZGUgZmlsZXMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5jIgorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBtYWNyb3MKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisjZGVmaW5lIG9tcHRfZ2V0X2NhbGxiYWNrX3N1Y2Nlc3MgMQorI2RlZmluZSBvbXB0X2dldF9jYWxsYmFja19mYWlsdXJlIDAKKworI2RlZmluZSBub190b29sX3ByZXNlbnQgMAorCisjZGVmaW5lIE9NUFRfQVBJX1JPVVRJTkUgc3RhdGljCisKKyNpZm5kZWYgT01QVF9TVFJfTUFUQ0gKKyNkZWZpbmUgT01QVF9TVFJfTUFUQ0goaGF5c3RhY2ssIG5lZWRsZSkgKCFzdHJjYXNlY21wKGhheXN0YWNrLCBuZWVkbGUpKQorI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiB0eXBlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBjb25zdCBjaGFyICpzdGF0ZV9uYW1lOworICAgIG9tcHRfc3RhdGVfdCAgc3RhdGVfaWQ7Cit9IG9tcHRfc3RhdGVfaW5mb190OworCisKK2VudW0gdG9vbF9zZXR0aW5nX2UgeworICAgIG9tcF90b29sX2Vycm9yLAorICAgIG9tcF90b29sX3Vuc2V0LAorICAgIG9tcF90b29sX2Rpc2FibGVkLAorICAgIG9tcF90b29sX2VuYWJsZWQKK307CisKKwordHlwZWRlZiB2b2lkICgqb21wdF9pbml0aWFsaXplX3QpICgKKyAgICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IG9tcHRfZm5fbG9va3VwLAorICAgIGNvbnN0IGNoYXIgKnZlcnNpb24sCisgICAgdW5zaWduZWQgaW50IG9tcHRfdmVyc2lvbgorKTsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZ2xvYmFsIHZhcmlhYmxlcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK2ludCBvbXB0X2VuYWJsZWQgPSAwOworCitvbXB0X3N0YXRlX2luZm9fdCBvbXB0X3N0YXRlX2luZm9bXSA9IHsKKyNkZWZpbmUgb21wdF9zdGF0ZV9tYWNybyhzdGF0ZSwgY29kZSkgeyAjIHN0YXRlLCBzdGF0ZSB9LAorICAgIEZPUkVBQ0hfT01QVF9TVEFURShvbXB0X3N0YXRlX21hY3JvKQorI3VuZGVmIG9tcHRfc3RhdGVfbWFjcm8KK307CisKK29tcHRfY2FsbGJhY2tzX3Qgb21wdF9jYWxsYmFja3M7CisKK3N0YXRpYyBvbXB0X2luaXRpYWxpemVfdCAgb21wdF9pbml0aWFsaXplX2ZuID0gTlVMTDsKKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZm9yd2FyZCBkZWNsYXJhdGlvbnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgb21wdF9pbnRlcmZhY2VfZm5fdCBvbXB0X2ZuX2xvb2t1cChjb25zdCBjaGFyICpzKTsKKworT01QVF9BUElfUk9VVElORSBvbXB0X3RocmVhZF9pZF90IG9tcHRfZ2V0X3RocmVhZF9pZCh2b2lkKTsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGluaXRpYWxpemF0aW9uIGFuZCBmaW5hbGl6YXRpb24gKHByaXZhdGUgb3BlcmF0aW9ucykKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvKiBPbiBVbml4LWxpa2Ugc3lzdGVtcyB0aGF0IHN1cHBvcnQgd2VhayBzeW1ib2xzIHRoZSBmb2xsb3dpbmcgaW1wbGVtZW50YXRpb24KKyAqIG9mIG9tcHRfdG9vbCgpIHdpbGwgYmUgdXNlZCBpbiBjYXNlIG5vIHRvb2wtc3VwcGxpZWQgaW1wbGVtZW50YXRpb24gb2YKKyAqIHRoaXMgZnVuY3Rpb24gaXMgcHJlc2VudCBpbiB0aGUgYWRkcmVzcyBzcGFjZSBvZiBhIHByb2Nlc3MuCisgKgorICogT24gV2luZG93cywgdGhlIG9tcHRfdG9vbF93aW5kb3dzIGZ1bmN0aW9uIGlzIHVzZWQgdG8gZmluZCB0aGUKKyAqIG9tcHRfdG9vbCBzeW1ib2wgYWNyb3NzIGFsbCBtb2R1bGVzIGxvYWRlZCBieSBhIHByb2Nlc3MuIElmIG9tcHRfdG9vbCBpcworICogZm91bmQsIG9tcHRfdG9vbCdzIHJldHVybiB2YWx1ZSBpcyB1c2VkIHRvIGluaXRpYWxpemUgdGhlIHRvb2wuIE90aGVyd2lzZSwKKyAqIE5VTEwgaXMgcmV0dXJuZWQgYW5kIE9NUFQgd29uJ3QgYmUgZW5hYmxlZCAqLworI2lmIE9NUFRfSEFWRV9XRUFLX0FUVFJJQlVURQorX09NUF9FWFRFUk4KK19fYXR0cmlidXRlX18gKCggd2VhayApKQorb21wdF9pbml0aWFsaXplX3Qgb21wdF90b29sKCkKK3sKKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3Rvb2woKSBpcyBjYWxsZWQgZnJvbSB0aGUgUlRMXG4iKTsKKyNlbmRpZgorICAgIHJldHVybiBOVUxMOworfQorCisjZWxpZiBPTVBUX0hBVkVfUFNBUEkKKworI2luY2x1ZGUgPHBzYXBpLmg+CisjcHJhZ21hIGNvbW1lbnQobGliLCAicHNhcGkubGliIikKKyNkZWZpbmUgb21wdF90b29sIG9tcHRfdG9vbF93aW5kb3dzCisKKy8vIFRoZSBudW1iZXIgb2YgbG9hZGVkIG1vZHVsZXMgdG8gc3RhcnQgZW51bWVyYXRpb24gd2l0aCBFbnVtUHJvY2Vzc01vZHVsZXMoKQorI2RlZmluZSBOVU1fTU9EVUxFUyAxMjgKKworc3RhdGljCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2xfd2luZG93cygpCit7CisgICAgaW50IGk7CisgICAgRFdPUkQgbmVlZGVkLCBuZXdfc2l6ZTsKKyAgICBITU9EVUxFICptb2R1bGVzOworICAgIEhBTkRMRSAgcHJvY2VzcyA9IEdldEN1cnJlbnRQcm9jZXNzKCk7CisgICAgbW9kdWxlcyA9IChITU9EVUxFKiltYWxsb2MoIE5VTV9NT0RVTEVTICogc2l6ZW9mKEhNT0RVTEUpICk7CisgICAgb21wdF9pbml0aWFsaXplX3QgKCpvbXB0X3Rvb2xfcCkoKSA9IE5VTEw7CisKKyNpZiBPTVBUX0RFQlVHCisgICAgcHJpbnRmKCJvbXB0X3Rvb2xfd2luZG93cygpOiBsb29raW5nIGZvciBvbXB0X3Rvb2xcbiIpOworI2VuZGlmCisgICAgaWYgKCFFbnVtUHJvY2Vzc01vZHVsZXMoIHByb2Nlc3MsIG1vZHVsZXMsIE5VTV9NT0RVTEVTICogc2l6ZW9mKEhNT0RVTEUpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJm5lZWRlZCkpIHsKKyAgICAgICAgLy8gUmVnYXJkbGVzcyBvZiB0aGUgZXJyb3IgcmVhc29uIHVzZSB0aGUgc3R1YiBpbml0aWFsaXphdGlvbiBmdW5jdGlvbgorICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICByZXR1cm4gTlVMTDsKKyAgICB9CisgICAgLy8gQ2hlY2sgaWYgTlVNX01PRFVMRVMgaXMgZW5vdWdoIHRvIGxpc3QgYWxsIG1vZHVsZXMKKyAgICBuZXdfc2l6ZSA9IG5lZWRlZCAvIHNpemVvZihITU9EVUxFKTsKKyAgICBpZiAobmV3X3NpemUgPiBOVU1fTU9EVUxFUykgeworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IHJlc2l6ZSBidWZmZXIgdG8gJWQgYnl0ZXNcbiIsIG5lZWRlZCk7CisjZW5kaWYKKyAgICAgICAgbW9kdWxlcyA9IChITU9EVUxFKilyZWFsbG9jKCBtb2R1bGVzLCBuZWVkZWQgKTsKKyAgICAgICAgLy8gSWYgcmVzaXppbmcgZmFpbGVkIHVzZSB0aGUgc3R1YiBmdW5jdGlvbi4KKyAgICAgICAgaWYgKCFFbnVtUHJvY2Vzc01vZHVsZXMocHJvY2VzcywgbW9kdWxlcywgbmVlZGVkLCAmbmVlZGVkKSkgeworICAgICAgICAgICAgZnJlZShtb2R1bGVzKTsKKyAgICAgICAgICAgIHJldHVybiBOVUxMOworICAgICAgICB9CisgICAgfQorICAgIGZvciAoaSA9IDA7IGkgPCBuZXdfc2l6ZTsgKytpKSB7CisgICAgICAgIChGQVJQUk9DICYpb21wdF90b29sX3AgPSBHZXRQcm9jQWRkcmVzcyhtb2R1bGVzW2ldLCAib21wdF90b29sIik7CisgICAgICAgIGlmIChvbXB0X3Rvb2xfcCkgeworI2lmIE9NUFRfREVCVUcKKyAgICAgICAgICAgIFRDSEFSIG1vZE5hbWVbTUFYX1BBVEhdOworICAgICAgICAgICAgaWYgKEdldE1vZHVsZUZpbGVOYW1lKG1vZHVsZXNbaV0sIG1vZE5hbWUsIE1BWF9QQVRIKSkKKyAgICAgICAgICAgICAgICBwcmludGYoIm9tcHRfdG9vbF93aW5kb3dzKCk6IG9tcHRfdG9vbCBmb3VuZCBpbiBtb2R1bGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1vZE5hbWUpOworI2VuZGlmCisgICAgICAgICAgICBmcmVlKG1vZHVsZXMpOworICAgICAgICAgICAgcmV0dXJuIG9tcHRfdG9vbF9wKCk7CisgICAgICAgIH0KKyNpZiBPTVBUX0RFQlVHCisgICAgICAgIGVsc2UgeworICAgICAgICAgICAgVENIQVIgbW9kTmFtZVtNQVhfUEFUSF07CisgICAgICAgICAgICBpZiAoR2V0TW9kdWxlRmlsZU5hbWUobW9kdWxlc1tpXSwgbW9kTmFtZSwgTUFYX1BBVEgpKQorICAgICAgICAgICAgICAgIHByaW50Zigib21wdF90b29sX3dpbmRvd3MoKTogb21wdF90b29sIG5vdCBmb3VuZCBpbiBtb2R1bGUgJXNcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIG1vZE5hbWUpOworICAgICAgICB9CisjZW5kaWYKKyAgICB9CisgICAgZnJlZShtb2R1bGVzKTsKKyAgICByZXR1cm4gTlVMTDsKK30KKyNlbHNlCisjIGVycm9yIEVpdGhlciBfX2F0dHJpYnV0ZV9fKCh3ZWFrKSkgb3IgcHNhcGkuZGxsIGFyZSByZXF1aXJlZCBmb3IgT01QVCBzdXBwb3J0CisjZW5kaWYgLy8gT01QVF9IQVZFX1dFQUtfQVRUUklCVVRFCisKK3ZvaWQgb21wdF9wcmVfaW5pdCgpCit7CisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIC8vIEV4ZWN1dGUgdGhlIHByZS1pbml0aWFsaXphdGlvbiBsb2dpYyBvbmx5IG9uY2UuCisgICAgLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorICAgIHN0YXRpYyBpbnQgb21wdF9wcmVfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKG9tcHRfcHJlX2luaXRpYWxpemVkKSByZXR1cm47CisKKyAgICBvbXB0X3ByZV9pbml0aWFsaXplZCA9IDE7CisKKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgLy8gVXNlIGEgdG9vbCBpZmYgYSB0b29sIGlzIGVuYWJsZWQgYW5kIGF2YWlsYWJsZS4KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgY29uc3QgY2hhciAqb21wdF9lbnZfdmFyID0gZ2V0ZW52KCJPTVBfVE9PTCIpOworICAgIHRvb2xfc2V0dGluZ19lIHRvb2xfc2V0dGluZyA9IG9tcF90b29sX2Vycm9yOworCisgICAgaWYgKCFvbXB0X2Vudl92YXIgIHx8ICFzdHJjbXAob21wdF9lbnZfdmFyLCAiIikpCisgICAgICAgIHRvb2xfc2V0dGluZyA9IG9tcF90b29sX3Vuc2V0OworICAgIGVsc2UgaWYgKE9NUFRfU1RSX01BVENIKG9tcHRfZW52X3ZhciwgImRpc2FibGVkIikpCisgICAgICAgIHRvb2xfc2V0dGluZyA9IG9tcF90b29sX2Rpc2FibGVkOworICAgIGVsc2UgaWYgKE9NUFRfU1RSX01BVENIKG9tcHRfZW52X3ZhciwgImVuYWJsZWQiKSkKKyAgICAgICAgdG9vbF9zZXR0aW5nID0gb21wX3Rvb2xfZW5hYmxlZDsKKworI2lmIE9NUFRfREVCVUcKKyAgICBwcmludGYoIm9tcHRfcHJlX2luaXQoKTogdG9vbF9zZXR0aW5nID0gJWRcbiIsIHRvb2xfc2V0dGluZyk7CisjZW5kaWYKKyAgICBzd2l0Y2godG9vbF9zZXR0aW5nKSB7CisgICAgY2FzZSBvbXBfdG9vbF9kaXNhYmxlZDoKKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIG9tcF90b29sX3Vuc2V0OgorICAgIGNhc2Ugb21wX3Rvb2xfZW5hYmxlZDoKKyAgICAgICAgb21wdF9pbml0aWFsaXplX2ZuID0gb21wdF90b29sKCk7CisgICAgICAgIGlmIChvbXB0X2luaXRpYWxpemVfZm4pIHsKKyAgICAgICAgICAgIG9tcHRfZW5hYmxlZCA9IDE7CisgICAgICAgIH0KKyAgICAgICAgYnJlYWs7CisKKyAgICBjYXNlIG9tcF90b29sX2Vycm9yOgorICAgICAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICAgICAgICJXYXJuaW5nOiBPTVBfVE9PTCBoYXMgaW52YWxpZCB2YWx1ZSBcIiVzXCIuXG4iCisgICAgICAgICAgICAiICBsZWdhbCB2YWx1ZXMgYXJlIChOVUxMLFwiXCIsXCJkaXNhYmxlZFwiLCIKKyAgICAgICAgICAgICJcImVuYWJsZWRcIikuXG4iLCBvbXB0X2Vudl92YXIpOworICAgICAgICBicmVhazsKKyAgICB9CisjaWYgT01QVF9ERUJVRworICAgIHByaW50Zigib21wdF9wcmVfaW5pdCgpOiBvbXB0X2VuYWJsZWQgPSAlZFxuIiwgb21wdF9lbmFibGVkKTsKKyNlbmRpZgorfQorCisKK3ZvaWQgb21wdF9wb3N0X2luaXQoKQoreworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBFeGVjdXRlIHRoZSBwb3N0LWluaXRpYWxpemF0aW9uIGxvZ2ljIG9ubHkgb25jZS4KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgc3RhdGljIGludCBvbXB0X3Bvc3RfaW5pdGlhbGl6ZWQgPSAwOworCisgICAgaWYgKG9tcHRfcG9zdF9pbml0aWFsaXplZCkgcmV0dXJuOworCisgICAgb21wdF9wb3N0X2luaXRpYWxpemVkID0gMTsKKworICAgIC8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAvLyBJbml0aWFsaXplIHRoZSB0b29sIGlmIHNvIGluZGljYXRlZC4KKyAgICAvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBvbXB0X2luaXRpYWxpemVfZm4ob21wdF9mbl9sb29rdXAsIG9tcHRfZ2V0X3J1bnRpbWVfdmVyc2lvbigpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgT01QVF9WRVJTSU9OKTsKKworICAgICAgICBvbXB0X3RocmVhZF90ICpyb290X3RocmVhZCA9IG9tcHRfZ2V0X3RocmVhZCgpOworCisgICAgICAgIG9tcHRfc2V0X3RocmVhZF9zdGF0ZShyb290X3RocmVhZCwgb21wdF9zdGF0ZV9vdmVyaGVhZCk7CisKKyAgICAgICAgaWYgKG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF90aHJlYWRfYmVnaW4pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKQorICAgICAgICAgICAgICAgIChvbXB0X3RocmVhZF9pbml0aWFsLCBvbXB0X2dldF90aHJlYWRfaWQoKSk7CisgICAgICAgIH0KKworICAgICAgICBvbXB0X3NldF90aHJlYWRfc3RhdGUocm9vdF90aHJlYWQsIG9tcHRfc3RhdGVfd29ya19zZXJpYWwpOworICAgIH0KK30KKworCit2b2lkIG9tcHRfZmluaSgpCit7CisgICAgaWYgKG9tcHRfZW5hYmxlZCkgeworICAgICAgICBpZiAob21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3J1bnRpbWVfc2h1dGRvd24pKSB7CisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcnVudGltZV9zaHV0ZG93bikoKTsKKyAgICAgICAgfQorICAgIH0KKworICAgIG9tcHRfZW5hYmxlZCA9IDA7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBpbnRlcmZhY2Ugb3BlcmF0aW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogc3RhdGUKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitPTVBUX0FQSV9ST1VUSU5FIGludCBvbXB0X2VudW1lcmF0ZV9zdGF0ZShpbnQgY3VycmVudF9zdGF0ZSwgaW50ICpuZXh0X3N0YXRlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY29uc3QgY2hhciAqKm5leHRfc3RhdGVfbmFtZSkKK3sKKyAgICBjb25zdCBzdGF0aWMgaW50IGxlbiA9IHNpemVvZihvbXB0X3N0YXRlX2luZm8pIC8gc2l6ZW9mKG9tcHRfc3RhdGVfaW5mb190KTsKKyAgICBpbnQgaSA9IDA7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgbGVuIC0gMTsgaSsrKSB7CisgICAgICAgIGlmIChvbXB0X3N0YXRlX2luZm9baV0uc3RhdGVfaWQgPT0gY3VycmVudF9zdGF0ZSkgeworICAgICAgICAgICAgKm5leHRfc3RhdGUgPSBvbXB0X3N0YXRlX2luZm9baSsxXS5zdGF0ZV9pZDsKKyAgICAgICAgICAgICpuZXh0X3N0YXRlX25hbWUgPSBvbXB0X3N0YXRlX2luZm9baSsxXS5zdGF0ZV9uYW1lOworICAgICAgICAgICAgcmV0dXJuIDE7CisgICAgICAgIH0KKyAgICB9CisKKyAgICByZXR1cm4gMDsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogY2FsbGJhY2tzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF90IGV2aWQsIG9tcHRfY2FsbGJhY2tfdCBjYikKK3sKKyAgICBzd2l0Y2ggKGV2aWQpIHsKKworI2RlZmluZSBvbXB0X2V2ZW50X21hY3JvKGV2ZW50X25hbWUsIGNhbGxiYWNrX3R5cGUsIGV2ZW50X2lkKSAgICAgICAgICAgICAgICAgIFwKKyAgICBjYXNlIGV2ZW50X25hbWU6ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIGlmIChvbXB0X2V2ZW50X2ltcGxlbWVudGF0aW9uX3N0YXR1cyhldmVudF9uYW1lKSkgeyAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhldmVudF9uYW1lKSA9IChjYWxsYmFja190eXBlKSBjYjsgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiBvbXB0X2V2ZW50X2ltcGxlbWVudGF0aW9uX3N0YXR1cyhldmVudF9uYW1lKTsKKworICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworCisgICAgZGVmYXVsdDogcmV0dXJuIG9tcHRfc2V0X3Jlc3VsdF9yZWdpc3RyYXRpb25fZXJyb3I7CisgICAgfQorfQorCisKK09NUFRfQVBJX1JPVVRJTkUgaW50IG9tcHRfZ2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdCBldmlkLCBvbXB0X2NhbGxiYWNrX3QgKmNiKQoreworICAgIHN3aXRjaCAoZXZpZCkgeworCisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnRfbmFtZSwgY2FsbGJhY2tfdHlwZSwgZXZlbnRfaWQpICAgICAgICAgICAgICAgICAgXAorICAgIGNhc2UgZXZlbnRfbmFtZTogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKG9tcHRfZXZlbnRfaW1wbGVtZW50YXRpb25fc3RhdHVzKGV2ZW50X25hbWUpKSB7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBvbXB0X2NhbGxiYWNrX3QgbXljYiA9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIChvbXB0X2NhbGxiYWNrX3QpIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2soZXZlbnRfbmFtZSk7ICAgIFwKKyAgICAgICAgICAgIGlmIChteWNiKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgKmNiID0gbXljYjsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICAgICAgICAgIHJldHVybiBvbXB0X2dldF9jYWxsYmFja19zdWNjZXNzOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICByZXR1cm4gb21wdF9nZXRfY2FsbGJhY2tfZmFpbHVyZTsKKworICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworCisgICAgZGVmYXVsdDogcmV0dXJuIG9tcHRfZ2V0X2NhbGxiYWNrX2ZhaWx1cmU7CisgICAgfQorfQorCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogcGFyYWxsZWwgcmVnaW9ucworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfZ2V0X3BhcmFsbGVsX2lkKGludCBhbmNlc3Rvcl9sZXZlbCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9wYXJhbGxlbF9pZF9pbnRlcm5hbChhbmNlc3Rvcl9sZXZlbCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplKGludCBhbmNlc3Rvcl9sZXZlbCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemVfaW50ZXJuYWwoYW5jZXN0b3JfbGV2ZWwpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgdm9pZCAqb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb24oaW50IGFuY2VzdG9yX2xldmVsKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3BhcmFsbGVsX2Z1bmN0aW9uX2ludGVybmFsKGFuY2VzdG9yX2xldmVsKTsKK30KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfc3RhdGVfdCBvbXB0X2dldF9zdGF0ZShvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKQoreworICAgIG9tcHRfc3RhdGVfdCB0aHJlYWRfc3RhdGUgPSBfX29tcHRfZ2V0X3N0YXRlX2ludGVybmFsKG9tcHRfd2FpdF9pZCk7CisKKyAgICBpZiAodGhyZWFkX3N0YXRlID09IG9tcHRfc3RhdGVfdW5kZWZpbmVkKSB7CisgICAgICAgIHRocmVhZF9zdGF0ZSA9IG9tcHRfc3RhdGVfd29ya19zZXJpYWw7CisgICAgfQorCisgICAgcmV0dXJuIHRocmVhZF9zdGF0ZTsKK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogdGhyZWFkcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworT01QVF9BUElfUk9VVElORSB2b2lkICpvbXB0X2dldF9pZGxlX2ZyYW1lKCkKK3sKKyAgICByZXR1cm4gX19vbXB0X2dldF9pZGxlX2ZyYW1lX2ludGVybmFsKCk7Cit9CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHRhc2tzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCitPTVBUX0FQSV9ST1VUSU5FIG9tcHRfdGhyZWFkX2lkX3Qgb21wdF9nZXRfdGhyZWFkX2lkKHZvaWQpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGhyZWFkX2lkX2ludGVybmFsKCk7Cit9CisKK09NUFRfQVBJX1JPVVRJTkUgb21wdF90YXNrX2lkX3Qgb21wdF9nZXRfdGFza19pZChpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworT01QVF9BUElfUk9VVElORSBvbXB0X2ZyYW1lX3QgKm9tcHRfZ2V0X3Rhc2tfZnJhbWUoaW50IGRlcHRoKQoreworICAgIHJldHVybiBfX29tcHRfZ2V0X3Rhc2tfZnJhbWVfaW50ZXJuYWwoZGVwdGgpOworfQorCisKK09NUFRfQVBJX1JPVVRJTkUgdm9pZCAqb21wdF9nZXRfdGFza19mdW5jdGlvbihpbnQgZGVwdGgpCit7CisgICAgcmV0dXJuIF9fb21wdF9nZXRfdGFza19mdW5jdGlvbl9pbnRlcm5hbChkZXB0aCk7Cit9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBwbGFjZWhvbGRlcnMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisvLyBEb24ndCBkZWZpbmUgdGhpcyBhcyBzdGF0aWMuIFRoZSBsb2FkZXIgbWF5IGNob29zZSB0byBlbGltaW5hdGUgdGhlIHN5bWJvbAorLy8gZXZlbiB0aG91Z2ggaXQgaXMgbmVlZGVkIGJ5IHRvb2xzLgorI2RlZmluZSBPTVBUX0FQSV9QTEFDRUhPTERFUgorCisvLyBFbnN1cmUgdGhhdCBwbGFjZWhvbGRlcnMgZG9uJ3QgaGF2ZSBtYW5nbGVkIG5hbWVzIGluIHRoZSBzeW1ib2wgdGFibGUuCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X2lkbGUodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIGNhbGxpbmcgY29udGV4dCBvZgorICAgIC8vIGlkbGUgT3Blbk1QIHdvcmtlciB0aHJlYWRzLiBJdCBpcyBub3QgbWVhbnQgdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X292ZXJoZWFkKHZvaWQpCit7CisgICAgLy8gVGhpcyBmdW5jdGlvbiBpcyBhIHBsYWNlaG9sZGVyIHVzZWQgdG8gcmVwcmVzZW50IHRoZSBPcGVuTVAgY29udGV4dCBvZgorICAgIC8vIHRocmVhZHMgd29ya2luZyBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuICBJdCBpcyBub3QgbWVhbnQgdG8gYmUgaW52b2tlZC4KKyAgICBhc3NlcnQoMCk7Cit9CisKKworT01QVF9BUElfUExBQ0VIT0xERVIgdm9pZCBvbXB0X2JhcnJpZXJfd2FpdCh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgICAvLyB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgYmFycmllciBpbiB0aGUgT3Blbk1QIHJ1bnRpbWUuIEl0IGlzIG5vdCBtZWFudAorICAgIC8vIHRvIGJlIGludm9rZWQuCisgICAgYXNzZXJ0KDApOworfQorCisKK09NUFRfQVBJX1BMQUNFSE9MREVSIHZvaWQgb21wdF90YXNrX3dhaXQodm9pZCkKK3sKKyAgICAvLyBUaGlzIGZ1bmN0aW9uIGlzIGEgcGxhY2Vob2xkZXIgdXNlZCB0byByZXByZXNlbnQgdGhlIE9wZW5NUCBjb250ZXh0IG9mCisgICAgLy8gdGhyZWFkcyB3YWl0aW5nIGZvciBhIHRhc2sgaW4gdGhlIE9wZW5NUCBydW50aW1lLiBJdCBpcyBub3QgbWVhbnQKKyAgICAvLyB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworCitPTVBUX0FQSV9QTEFDRUhPTERFUiB2b2lkIG9tcHRfbXV0ZXhfd2FpdCh2b2lkKQoreworICAgIC8vIFRoaXMgZnVuY3Rpb24gaXMgYSBwbGFjZWhvbGRlciB1c2VkIHRvIHJlcHJlc2VudCB0aGUgT3Blbk1QIGNvbnRleHQgb2YKKyAgICAvLyB0aHJlYWRzIHdhaXRpbmcgZm9yIGEgbXV0ZXggaW4gdGhlIE9wZW5NUCBydW50aW1lLiBJdCBpcyBub3QgbWVhbnQKKyAgICAvLyB0byBiZSBpbnZva2VkLgorICAgIGFzc2VydCgwKTsKK30KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9OworI2VuZGlmCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBjb21wYXRhYmlsaXR5CisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworT01QVF9BUElfUk9VVElORSBpbnQgb21wdF9nZXRfb21wdF92ZXJzaW9uKCkKK3sKKyAgICByZXR1cm4gT01QVF9WRVJTSU9OOworfQorCisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgKiBhcHBsaWNhdGlvbi1mYWNpbmcgQVBJCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworCisvKi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyB8IGNvbnRyb2wKKyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0qLworCitfT01QX0VYVEVSTiB2b2lkIG9tcHRfY29udHJvbCh1aW50NjRfdCBjb21tYW5kLCB1aW50NjRfdCBtb2RpZmllcikKK3sKKyAgICBpZiAob21wdF9lbmFibGVkICYmIG9tcHRfY2FsbGJhY2tzLm9tcHRfY2FsbGJhY2sob21wdF9ldmVudF9jb250cm9sKSkgeworICAgICAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfY29udHJvbCkoY29tbWFuZCwgbW9kaWZpZXIpOworICAgIH0KK30KKworCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogQVBJIGlucXVpcnkgZm9yIHRvb2wKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCitzdGF0aWMgb21wdF9pbnRlcmZhY2VfZm5fdCBvbXB0X2ZuX2xvb2t1cChjb25zdCBjaGFyICpzKQoreworCisjZGVmaW5lIG9tcHRfaW50ZXJmYWNlX2ZuKGZuKSBcCisgICAgaWYgKHN0cmNtcChzLCAjZm4pID09IDApIHJldHVybiAob21wdF9pbnRlcmZhY2VfZm5fdCkgZm47CisKKyAgICBGT1JFQUNIX09NUFRfSU5RVUlSWV9GTihvbXB0X2ludGVyZmFjZV9mbikKKworICAgIEZPUkVBQ0hfT01QVF9QTEFDRUhPTERFUl9GTihvbXB0X2ludGVyZmFjZV9mbikKKworICAgIHJldHVybiAob21wdF9pbnRlcmZhY2VfZm5fdCkgMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy9vbXB0LWludGVybmFsLmggYi9yYzMvcnVudGltZS9zcmMvb21wdC1pbnRlcm5hbC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQyZGE5ZDgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvb21wdC1pbnRlcm5hbC5oCkBAIC0wLDAgKzEsOTMgQEAKKyNpZm5kZWYgX19PTVBUX0lOVEVSTkFMX0hfXworI2RlZmluZSBfX09NUFRfSU5URVJOQUxfSF9fCisKKyNpbmNsdWRlICJvbXB0LmgiCisjaW5jbHVkZSAib21wdC1ldmVudC1zcGVjaWZpYy5oIgorCisjZGVmaW5lIE9NUFRfVkVSU0lPTiAxCisKKyNkZWZpbmUgX09NUF9FWFRFUk4gZXh0ZXJuICJDIgorCisjZGVmaW5lIE9NUFRfSU5WT0tFUih4KSBcCisgICgoeCA9PSBmb3JrX2NvbnRleHRfZ251KSA/IG9tcHRfaW52b2tlcl9wcm9ncmFtIDogb21wdF9pbnZva2VyX3J1bnRpbWUpCisKKworI2RlZmluZSBvbXB0X2NhbGxiYWNrKGUpIGUgIyMgX2NhbGxiYWNrCisKKwordHlwZWRlZiBzdHJ1Y3Qgb21wdF9jYWxsYmFja3NfcyB7CisjZGVmaW5lIG9tcHRfZXZlbnRfbWFjcm8oZXZlbnQsIGNhbGxiYWNrLCBldmVudGlkKSBjYWxsYmFjayBvbXB0X2NhbGxiYWNrKGV2ZW50KTsKKworICAgIEZPUkVBQ0hfT01QVF9FVkVOVChvbXB0X2V2ZW50X21hY3JvKQorCisjdW5kZWYgb21wdF9ldmVudF9tYWNybworfSBvbXB0X2NhbGxiYWNrc190OworCisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcHRfZnJhbWVfdCAgICAgICAgICAgIGZyYW1lOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgIGZ1bmN0aW9uOworICAgIG9tcHRfdGFza19pZF90ICAgICAgICAgIHRhc2tfaWQ7CisjaWYgT01QXzQwX0VOQUJMRUQKKyAgICBpbnQgICAgICAgICAgICAgICAgICAgICBuZGVwczsKKyAgICBvbXB0X3Rhc2tfZGVwZW5kZW5jZV90ICAqZGVwczsKKyNlbmRpZiAvKiBPTVBfNDBfRU5BQkxFRCAqLworfSBvbXB0X3Rhc2tfaW5mb190OworCisKK3R5cGVkZWYgc3RydWN0IHsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgIHBhcmFsbGVsX2lkOworICAgIHZvaWQgICAgICAgICAgICAgICAgKm1pY3JvdGFzazsKK30gb21wdF90ZWFtX2luZm9fdDsKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X2x3X3Rhc2t0ZWFtX3MgeworICAgIG9tcHRfdGVhbV9pbmZvX3QgICAgb21wdF90ZWFtX2luZm87CisgICAgb21wdF90YXNrX2luZm9fdCAgICBvbXB0X3Rhc2tfaW5mbzsKKyAgICBzdHJ1Y3Qgb21wdF9sd190YXNrdGVhbV9zICpwYXJlbnQ7Cit9IG9tcHRfbHdfdGFza3RlYW1fdDsKKworCit0eXBlZGVmIHN0cnVjdCBvbXB0X3BhcmFsbGVsX2luZm9fcyB7CisgICAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQ7ICAgIC8qIGlkIG9mIHBhcmVudCB0YXNrICAgICAgICAgICAgKi8KKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQ7ICAgLyogaWQgb2YgcGFyYWxsZWwgcmVnaW9uICAgICAgICAqLworICAgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWU7ICAvKiBmcmFtZSBkYXRhIG9mIHBhcmVudCB0YXNrICAgICovCisgICAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb247ICAgICAgICAgIC8qIHBvaW50ZXIgdG8gb3V0bGluZWQgZnVuY3Rpb24gKi8KK30gb21wdF9wYXJhbGxlbF9pbmZvX3Q7CisKKwordHlwZWRlZiBzdHJ1Y3QgeworICAgIG9tcHRfc3RhdGVfdCAgICAgICAgc3RhdGU7CisgICAgb21wdF93YWl0X2lkX3QgICAgICB3YWl0X2lkOworICAgIHZvaWQgICAgICAgICAgICAgICAgKmlkbGVfZnJhbWU7Cit9IG9tcHRfdGhyZWFkX2luZm9fdDsKKworCitleHRlcm4gb21wdF9jYWxsYmFja3NfdCBvbXB0X2NhbGxiYWNrczsKKworI2lmIE9NUF80MF9FTkFCTEVEICYmIE9NUFRfU1VQUE9SVCAmJiBPTVBUX1RSQUNFCisjaWYgVVNFX0ZBU1RfTUVNT1JZCisjICBkZWZpbmUgS01QX09NUFRfREVQU19BTExPQyBfX2ttcF9mYXN0X2FsbG9jYXRlCisjICBkZWZpbmUgS01QX09NUFRfREVQU19GUkVFIF9fa21wX2Zhc3RfZnJlZQorIyBlbHNlCisjICBkZWZpbmUgS01QX09NUFRfREVQU19BTExPQyBfX2ttcF90aHJlYWRfbWFsbG9jCisjICBkZWZpbmUgS01QX09NUFRfREVQU19GUkVFIF9fa21wX3RocmVhZF9mcmVlCisjIGVuZGlmCisjZW5kaWYgLyogT01QXzQwX0VOQUJMRUQgJiYgT01QVF9TVVBQT1JUICYmIE9NUFRfVFJBQ0UgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCitleHRlcm4gIkMiIHsKKyNlbmRpZgorCit2b2lkIG9tcHRfcHJlX2luaXQodm9pZCk7Cit2b2lkIG9tcHRfcG9zdF9pbml0KHZvaWQpOwordm9pZCBvbXB0X2Zpbmkodm9pZCk7CisKK2V4dGVybiBpbnQgb21wdF9lbmFibGVkOworCisjaWZkZWYgX19jcGx1c3BsdXMKK307CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5jIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40OWY2NjhhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuYwpAQCAtMCwwICsxLDMzMiBAQAorLy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKy8vIGluY2x1ZGUgZmlsZXMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJvbXB0LWludGVybmFsLmgiCisjaW5jbHVkZSAib21wdC1zcGVjaWZpYy5oIgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gbWFjcm9zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisjZGVmaW5lIEdUSURfVE9fT01QVF9USFJFQURfSUQoaWQpICgob21wdF90aHJlYWRfaWRfdCkgKGlkID49MCkgPyBpZCArIDE6IDApCisKKyNkZWZpbmUgTFdUX0ZST01fVEVBTSh0ZWFtKSAodGVhbSktPnQub21wdF9zZXJpYWxpemVkX3RlYW1faW5mbzsKKworI2RlZmluZSBPTVBUX1RIUkVBRF9JRF9CSVRTIDE2CisKKy8vIDIwMTMgMDggMjQgLSBKb2huIE1lbGxvci1DcnVtbWV5CisvLyAgIGlkZWFsbHksIGEgdGhyZWFkIHNob3VsZCBhc3NpZ24gaXRzIG93biBpZHMgYmFzZWQgb24gdGhyZWFkIHByaXZhdGUgZGF0YS4KKy8vICAgaG93ZXZlciwgdGhlIHdheSB0aGUgaW50ZWwgcnVudGltZSByZWluaXRpYWxpemVzIHRocmVhZCBkYXRhIHN0cnVjdHVyZXMKKy8vICAgd2hlbiBpdCBjcmVhdGVzIHRlYW1zIG1ha2VzIGl0IGRpZmZpY3VsdCB0byBtYWludGFpbiBwZXJzaXN0ZW50IHRocmVhZAorLy8gICBkYXRhLiB1c2luZyBhIHNoYXJlZCB2YXJpYWJsZSBpbnN0ZWFkIGlzIHNpbXBsZS4gSSBsZWF2ZSBpdCB0byBpbnRlbCB0bworLy8gICBzb3J0IG91dCBob3cgdG8gaW1wbGVtZW50IGEgaGlnaGVyIHBlcmZvcm1hbmNlIHZlcnNpb24gaW4gdGhlaXIgcnVudGltZS4KKworLy8gd2hlbiB1c2luZyBmZXRjaF9hbmRfYWRkIHRvIGdlbmVyYXRlIHRoZSBJRHMsIHRoZXJlIGlzbid0IGFueSByZWFzb24gdG8gd2FzdGUKKy8vIGJpdHMgZm9yIHRocmVhZCBpZC4KKyNpZiAwCisjZGVmaW5lIE5FWFRfSUQoaWRfcHRyLHRpZCkgXAorICAoKEtNUF9URVNUX1RIRU5fSU5DNjQoaWRfcHRyKSA8PCBPTVBUX1RIUkVBRF9JRF9CSVRTKSB8ICh0aWQpKQorI2Vsc2UKKyNkZWZpbmUgTkVYVF9JRChpZF9wdHIsdGlkKSAoS01QX1RFU1RfVEhFTl9JTkM2NCgodm9sYXRpbGUga21wX2ludDY0ICopaWRfcHRyKSkKKyNlbmRpZgorCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gcHJpdmF0ZSBvcGVyYXRpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRyYXZlcnNlIHRoZSB0ZWFtIGFuZCB0YXNrIGhpZXJhcmNoeQorLy8gbm90ZTogX19vbXB0X2dldF90ZWFtaW5mbyBhbmQgX19vbXB0X2dldF90YXNraW5mbworLy8gICAgICAgdHJhdmVyc2UgdGhlIGhpZXJhcmNoeSBzaW1pbGFybHkgYW5kIG5lZWQgdG8gYmUKKy8vICAgICAgIGtlcHQgY29uc2lzdGVudAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfdGVhbV9pbmZvX3QgKgorX19vbXB0X2dldF90ZWFtaW5mbyhpbnQgZGVwdGgsIGludCAqc2l6ZSkKK3sKKyAgICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIGlmICh0aHIpIHsKKyAgICAgICAga21wX3RlYW0gKnRlYW0gPSB0aHItPnRoLnRoX3RlYW07CisgICAgICAgIGlmICh0ZWFtID09IE5VTEwpIHJldHVybiBOVUxMOworCisgICAgICAgIG9tcHRfbHdfdGFza3RlYW1fdCAqbHd0ID0gTFdUX0ZST01fVEVBTSh0ZWFtKTsKKworICAgICAgICB3aGlsZShkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGx3dCkgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgICAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgICAgICAgaWYgKCFsd3QgJiYgdGVhbSkgdGVhbT10ZWFtLT50LnRfcGFyZW50OworCisgICAgICAgICAgICBkZXB0aC0tOworICAgICAgICB9CisKKyAgICAgICAgaWYgKGx3dCkgeworICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgaGF2ZSBvbmUgdGFzaworICAgICAgICAgICAgaWYgKHNpemUpICpzaXplID0gMTsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgbGlnaHR3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZsd3QtPm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9IGVsc2UgaWYgKHRlYW0pIHsKKyAgICAgICAgICAgIC8vIGV4dHJhY3Qgc2l6ZSBmcm9tIGhlYXZ5d2VpZ2h0IHRlYW0KKyAgICAgICAgICAgIGlmIChzaXplKSAqc2l6ZSA9IHRlYW0tPnQudF9ucHJvYzsKKworICAgICAgICAgICAgLy8gcmV0dXJuIHRlYW0gaW5mbyBmb3IgaGVhdnl3ZWlnaHQgdGVhbQorICAgICAgICAgICAgcmV0dXJuICZ0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIE5VTEw7Cit9CisKKworb21wdF90YXNrX2luZm9fdCAqCitfX29tcHRfZ2V0X3Rhc2tpbmZvKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gTlVMTDsKKyAgICBrbXBfaW5mb190ICp0aHIgPSBvbXB0X2dldF90aHJlYWQoKTsKKworICAgIGlmICh0aHIpIHsKKyAgICAgICAga21wX3Rhc2tkYXRhX3QgICp0YXNrZGF0YSA9IHRoci0+dGgudGhfY3VycmVudF90YXNrOworICAgICAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworCisgICAgICAgIHdoaWxlIChkZXB0aCA+IDApIHsKKyAgICAgICAgICAgIC8vIG5leHQgbGlnaHR3ZWlnaHQgdGVhbSAoaWYgYW55KQorICAgICAgICAgICAgaWYgKGx3dCkgbHd0ID0gbHd0LT5wYXJlbnQ7CisKKyAgICAgICAgICAgIC8vIG5leHQgaGVhdnl3ZWlnaHQgdGVhbSAoaWYgYW55KSBhZnRlcgorICAgICAgICAgICAgLy8gbGlnaHR3ZWlnaHQgdGVhbXMgYXJlIGV4aGF1c3RlZAorICAgICAgICAgICAgaWYgKCFsd3QgJiYgdGFza2RhdGEpIHsKKyAgICAgICAgICAgICAgICB0YXNrZGF0YSA9IHRhc2tkYXRhLT50ZF9wYXJlbnQ7CisgICAgICAgICAgICAgICAgaWYgKHRhc2tkYXRhKSB7CisgICAgICAgICAgICAgICAgICAgIGx3dCA9IExXVF9GUk9NX1RFQU0odGFza2RhdGEtPnRkX3RlYW0pOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGRlcHRoLS07CisgICAgICAgIH0KKworICAgICAgICBpZiAobHd0KSB7CisgICAgICAgICAgICBpbmZvID0gJmx3dC0+b21wdF90YXNrX2luZm87CisgICAgICAgIH0gZWxzZSBpZiAodGFza2RhdGEpIHsKKyAgICAgICAgICAgIGluZm8gPSAmdGFza2RhdGEtPm9tcHRfdGFza19pbmZvOworICAgICAgICB9CisgICAgfQorCisgICAgcmV0dXJuIGluZm87Cit9CisKKworCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorLy8gaW50ZXJmYWNlIG9wZXJhdGlvbnMKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGhyZWFkIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF90aHJlYWRfaWRfbmV3KCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF90aHJlYWRfaWQgPSAxOworICAgIHJldHVybiBORVhUX0lEKCZvbXB0X3RocmVhZF9pZCwgMCk7Cit9CisKK3ZvaWQKK19fb21wdF90aHJlYWRfYmVnaW4ob21wdF90aHJlYWRfdHlwZV90IHRocmVhZF90eXBlLCBpbnQgZ3RpZCkKK3sKKyAgICBvbXB0X2NhbGxiYWNrcy5vbXB0X2NhbGxiYWNrKG9tcHRfZXZlbnRfdGhyZWFkX2JlZ2luKSgKKyAgICAgICAgdGhyZWFkX3R5cGUsIEdUSURfVE9fT01QVF9USFJFQURfSUQoZ3RpZCkpOworfQorCisKK3ZvaWQKK19fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpCit7CisgICAgb21wdF9jYWxsYmFja3Mub21wdF9jYWxsYmFjayhvbXB0X2V2ZW50X3RocmVhZF9lbmQpKAorICAgICAgICB0aHJlYWRfdHlwZSwgR1RJRF9UT19PTVBUX1RIUkVBRF9JRChndGlkKSk7Cit9CisKKworb21wdF90aHJlYWRfaWRfdAorX19vbXB0X2dldF90aHJlYWRfaWRfaW50ZXJuYWwoKQoreworICAgIC8vIEZJWE1FCisgICAgLy8gdW50aWwgd2UgaGF2ZSBhIGJldHRlciB3YXkgb2YgYXNzaWduaW5nIGlkcywgdXNlIF9fa21wX2dldF9ndGlkCisgICAgLy8gc2luY2UgdGhlIHJldHVybiB2YWx1ZSBtaWdodCBiZSBuZWdhdGl2ZSwgd2UgbmVlZCB0byB0ZXN0IHRoYXQgYmVmb3JlCisgICAgLy8gYXNzaWduaW5nIGl0IHRvIGFuIG9tcHRfdGhyZWFkX2lkX3QsIHdoaWNoIGlzIHVuc2lnbmVkLgorICAgIGludCBpZCA9IF9fa21wX2dldF9ndGlkKCk7CisgICAgYXNzZXJ0KGlkID49IDApOworCisgICAgcmV0dXJuIEdUSURfVE9fT01QVF9USFJFQURfSUQoaWQpOworfQorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHN0YXRlIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfdGhyZWFkX2Fzc2lnbl93YWl0X2lkKHZvaWQgKnZhcmlhYmxlKQoreworICAgIGludCBndGlkID0gX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWMoKTsKKyAgICBrbXBfaW5mb190ICp0aSA9IG9tcHRfZ2V0X3RocmVhZF9ndGlkKGd0aWQpOworCisgICAgdGktPnRoLm9tcHRfdGhyZWFkX2luZm8ud2FpdF9pZCA9IChvbXB0X3dhaXRfaWRfdCkgdmFyaWFibGU7Cit9CisKK29tcHRfc3RhdGVfdAorX19vbXB0X2dldF9zdGF0ZV9pbnRlcm5hbChvbXB0X3dhaXRfaWRfdCAqb21wdF93YWl0X2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisKKyAgICBpZiAodGkpIHsKKyAgICAgICAgaWYgKG9tcHRfd2FpdF9pZCkKKyAgICAgICAgICAgICpvbXB0X3dhaXRfaWQgPSB0aS0+dGgub21wdF90aHJlYWRfaW5mby53YWl0X2lkOworICAgICAgICByZXR1cm4gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGU7CisgICAgfQorICAgIHJldHVybiBvbXB0X3N0YXRlX3VuZGVmaW5lZDsKK30KKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBpZGxlIGZyYW1lIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkICoKK19fb21wdF9nZXRfaWRsZV9mcmFtZV9pbnRlcm5hbCh2b2lkKQoreworICAgIGttcF9pbmZvX3QgKnRpID0gb21wdF9nZXRfdGhyZWFkKCk7CisgICAgcmV0dXJuIHRpID8gdGktPnRoLm9tcHRfdGhyZWFkX2luZm8uaWRsZV9mcmFtZSA6IE5VTEw7Cit9CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLyBwYXJhbGxlbCByZWdpb24gc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfcGFyYWxsZWxfaWRfdAorX19vbXB0X3BhcmFsbGVsX2lkX25ldyhpbnQgZ3RpZCkKK3sKKyAgICBzdGF0aWMgdWludDY0X3Qgb21wdF9wYXJhbGxlbF9pZCA9IDE7CisgICAgcmV0dXJuIGd0aWQgPj0gMCA/IE5FWFRfSUQoJm9tcHRfcGFyYWxsZWxfaWQsIGd0aWQpIDogMDsKK30KKworCit2b2lkICoKK19fb21wdF9nZXRfcGFyYWxsZWxfZnVuY3Rpb25faW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICB2b2lkICpmdW5jdGlvbiA9IGluZm8gPyBpbmZvLT5taWNyb3Rhc2sgOiBOVUxMOworICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworCitvbXB0X3BhcmFsbGVsX2lkX3QKK19fb21wdF9nZXRfcGFyYWxsZWxfaWRfaW50ZXJuYWwoaW50IGRlcHRoKQoreworICAgIG9tcHRfdGVhbV9pbmZvX3QgKmluZm8gPSBfX29tcHRfZ2V0X3RlYW1pbmZvKGRlcHRoLCBOVUxMKTsKKyAgICBvbXB0X3BhcmFsbGVsX2lkX3QgaWQgPSBpbmZvID8gaW5mby0+cGFyYWxsZWxfaWQgOiAwOworICAgIHJldHVybiBpZDsKK30KKworCitpbnQKK19fb21wdF9nZXRfcGFyYWxsZWxfdGVhbV9zaXplX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICAvLyBpbml0aWFsaXplIHRoZSByZXR1cm4gdmFsdWUgd2l0aCB0aGUgZXJyb3IgdmFsdWUuCisgICAgLy8gaWYgdGhlcmUgaXMgYSB0ZWFtIGF0IHRoZSBzcGVjaWZpZWQgZGVwdGgsIHRoZSBkZWZhdWx0CisgICAgLy8gdmFsdWUgd2lsbCBiZSBvdmVyd3JpdHRlbiB0aGUgc2l6ZSBvZiB0aGF0IHRlYW0uCisgICAgaW50IHNpemUgPSAtMTsKKyAgICAodm9pZCkgX19vbXB0X2dldF90ZWFtaW5mbyhkZXB0aCwgJnNpemUpOworICAgIHJldHVybiBzaXplOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbGlnaHR3ZWlnaHQgdGFzayB0ZWFtIHN1cHBvcnQKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCit2b2lkCitfX29tcHRfbHdfdGFza3RlYW1faW5pdChvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwga21wX2luZm9fdCAqdGhyLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIHZvaWQgKm1pY3JvdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkKK3sKKyAgICBsd3QtPm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7CisgICAgbHd0LT5vbXB0X3RlYW1faW5mby5taWNyb3Rhc2sgPSBtaWNyb3Rhc2s7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby50YXNrX2lkID0gMDsKKyAgICBsd3QtPm9tcHRfdGFza19pbmZvLmZyYW1lLnJlZW50ZXJfcnVudGltZV9mcmFtZSA9IDA7CisgICAgbHd0LT5vbXB0X3Rhc2tfaW5mby5mcmFtZS5leGl0X3J1bnRpbWVfZnJhbWUgPSAwOworICAgIGx3dC0+b21wdF90YXNrX2luZm8uZnVuY3Rpb24gPSBOVUxMOworICAgIGx3dC0+cGFyZW50ID0gMDsKK30KKworCit2b2lkCitfX29tcHRfbHdfdGFza3RlYW1fbGluayhvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwgIGttcF9pbmZvX3QgKnRocikKK3sKKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKm15X3BhcmVudCA9IHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgIGx3dC0+cGFyZW50ID0gbXlfcGFyZW50OworICAgIHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvID0gbHd0OworfQorCisKK29tcHRfbHdfdGFza3RlYW1fdCAqCitfX29tcHRfbHdfdGFza3RlYW1fdW5saW5rKGttcF9pbmZvX3QgKnRocikKK3sKKyAgICBvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dGFzayA9IHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvOworICAgIGlmIChsd3Rhc2spIHRoci0+dGgudGhfdGVhbS0+dC5vbXB0X3NlcmlhbGl6ZWRfdGVhbV9pbmZvID0gbHd0YXNrLT5wYXJlbnQ7CisgICAgcmV0dXJuIGx3dGFzazsKK30KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIHRhc2sgc3VwcG9ydAorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK29tcHRfdGFza19pZF90CitfX29tcHRfdGFza19pZF9uZXcoaW50IGd0aWQpCit7CisgICAgc3RhdGljIHVpbnQ2NF90IG9tcHRfdGFza19pZCA9IDE7CisgICAgcmV0dXJuIE5FWFRfSUQoJm9tcHRfdGFza19pZCwgZ3RpZCk7Cit9CisKKworb21wdF90YXNrX2lkX3QKK19fb21wdF9nZXRfdGFza19pZF9pbnRlcm5hbChpbnQgZGVwdGgpCit7CisgICAgb21wdF90YXNrX2luZm9fdCAqaW5mbyA9IF9fb21wdF9nZXRfdGFza2luZm8oZGVwdGgpOworICAgIG9tcHRfdGFza19pZF90IHRhc2tfaWQgPSBpbmZvID8gIGluZm8tPnRhc2tfaWQgOiAwOworICAgIHJldHVybiB0YXNrX2lkOworfQorCisKK3ZvaWQgKgorX19vbXB0X2dldF90YXNrX2Z1bmN0aW9uX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgICAgdm9pZCAqZnVuY3Rpb24gPSBpbmZvID8gaW5mby0+ZnVuY3Rpb24gOiBOVUxMOworICAgIHJldHVybiBmdW5jdGlvbjsKK30KKworCitvbXB0X2ZyYW1lX3QgKgorX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGludCBkZXB0aCkKK3sKKyAgICBvbXB0X3Rhc2tfaW5mb190ICppbmZvID0gX19vbXB0X2dldF90YXNraW5mbyhkZXB0aCk7CisgICAgb21wdF9mcmFtZV90ICpmcmFtZSA9IGluZm8gPyBmcmFtZSA9ICZpbmZvLT5mcmFtZSA6IE5VTEw7CisgICAgcmV0dXJuIGZyYW1lOworfQorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gdGVhbSBzdXBwb3J0CisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKwordm9pZAorX19vbXB0X3RlYW1fYXNzaWduX2lkKGttcF90ZWFtX3QgKnRlYW0sIG9tcHRfcGFyYWxsZWxfaWRfdCBvbXB0X3BpZCkKK3sKKyAgICB0ZWFtLT50Lm9tcHRfdGVhbV9pbmZvLnBhcmFsbGVsX2lkID0gb21wdF9waWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvb21wdC1zcGVjaWZpYy5oIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jOGI1MGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL29tcHQtc3BlY2lmaWMuaApAQCAtMCwwICsxLDkwIEBACisjaWZuZGVmIE9NUFRfU1BFQ0lGSUNfSAorI2RlZmluZSBPTVBUX1NQRUNJRklDX0gKKworI2luY2x1ZGUgImttcC5oIgorCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIHR5cGVzCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordHlwZWRlZiBrbXBfaW5mb190IG9tcHRfdGhyZWFkX3Q7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIGZvcndhcmQgZGVjbGFyYXRpb25zCisgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKwordm9pZCBfX29tcHRfdGVhbV9hc3NpZ25faWQoa21wX3RlYW1fdCAqdGVhbSwgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGlkKTsKK3ZvaWQgX19vbXB0X3RocmVhZF9hc3NpZ25fd2FpdF9pZCh2b2lkICp2YXJpYWJsZSk7CisKK3ZvaWQgX19vbXB0X2x3X3Rhc2t0ZWFtX2luaXQob21wdF9sd190YXNrdGVhbV90ICpsd3QsIG9tcHRfdGhyZWFkX3QgKnRociwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGd0aWQsIHZvaWQgKm1pY3JvdGFzaywKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgb21wdF9wYXJhbGxlbF9pZF90IG9tcHRfcGlkKTsKKwordm9pZCBfX29tcHRfbHdfdGFza3RlYW1fbGluayhvbXB0X2x3X3Rhc2t0ZWFtX3QgKmx3dCwgIG9tcHRfdGhyZWFkX3QgKnRocik7CisKK29tcHRfbHdfdGFza3RlYW1fdCAqIF9fb21wdF9sd190YXNrdGVhbV91bmxpbmsob21wdF90aHJlYWRfdCAqdGhyKTsKKworb21wdF9wYXJhbGxlbF9pZF90IF9fb21wdF9wYXJhbGxlbF9pZF9uZXcoaW50IGd0aWQpOworb21wdF90YXNrX2lkX3QgX19vbXB0X3Rhc2tfaWRfbmV3KGludCBndGlkKTsKKworb21wdF90ZWFtX2luZm9fdCAqX19vbXB0X2dldF90ZWFtaW5mbyhpbnQgZGVwdGgsIGludCAqc2l6ZSk7CisKK29tcHRfdGFza19pbmZvX3QgKl9fb21wdF9nZXRfdGFza2luZm8oaW50IGRlcHRoKTsKKwordm9pZCBfX29tcHRfdGhyZWFkX2JlZ2luKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpOworCit2b2lkIF9fb21wdF90aHJlYWRfZW5kKG9tcHRfdGhyZWFkX3R5cGVfdCB0aHJlYWRfdHlwZSwgaW50IGd0aWQpOworCitpbnQgX19vbXB0X2dldF9wYXJhbGxlbF90ZWFtX3NpemVfaW50ZXJuYWwoaW50IGFuY2VzdG9yX2xldmVsKTsKKworb21wdF90YXNrX2lkX3QgX19vbXB0X2dldF90YXNrX2lkX2ludGVybmFsKGludCBkZXB0aCk7CisKK29tcHRfZnJhbWVfdCAqX19vbXB0X2dldF90YXNrX2ZyYW1lX2ludGVybmFsKGludCBkZXB0aCk7CisKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAqIG1hY3JvcworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKyNkZWZpbmUgT01QVF9IQVZFX1dFQUtfQVRUUklCVVRFIEtNUF9IQVZFX1dFQUtfQVRUUklCVVRFCisjZGVmaW5lIE9NUFRfSEFWRV9QU0FQSSBLTVBfSEFWRV9QU0FQSQorI2RlZmluZSBPTVBUX1NUUl9NQVRDSChoYXlzdGFjaywgbmVlZGxlKSBfX2ttcF9zdHJfbWF0Y2goaGF5c3RhY2ssIDAsIG5lZWRsZSkKKworCisKKy8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisvLyBpbmxpbmUgZnVuY3Rpb25zCisvLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorCitpbmxpbmUgb21wdF90aHJlYWRfdCAqCitvbXB0X2dldF90aHJlYWRfZ3RpZChpbnQgZ3RpZCkKK3sKKyAgICByZXR1cm4gKGd0aWQgPj0gMCkgPyBfX2ttcF90aHJlYWRfZnJvbV9ndGlkKGd0aWQpIDogTlVMTDsKK30KKworCitpbmxpbmUgb21wdF90aHJlYWRfdCAqCitvbXB0X2dldF90aHJlYWQoKQoreworICAgIGludCBndGlkID0gX19rbXBfZ2V0X2d0aWQoKTsKKyAgICByZXR1cm4gb21wdF9nZXRfdGhyZWFkX2d0aWQoZ3RpZCk7Cit9CisKKworaW5saW5lIHZvaWQKK29tcHRfc2V0X3RocmVhZF9zdGF0ZShvbXB0X3RocmVhZF90ICp0aHJlYWQsIG9tcHRfc3RhdGVfdCBzdGF0ZSkKK3sKKyAgICB0aHJlYWQtPnRoLm9tcHRfdGhyZWFkX2luZm8uc3RhdGUgPSBzdGF0ZTsKK30KKworCitpbmxpbmUgY29uc3QgY2hhciAqCitvbXB0X2dldF9ydW50aW1lX3ZlcnNpb24oKQoreworICAgIHJldHVybiAmX19rbXBfdmVyc2lvbl9saWJfdmVyW0tNUF9WRVJTSU9OX01BR0lDX0xFTl07Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3Rlc3QtdG91Y2guYyBiL3JjMy9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmNlNTI5YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90ZXN0LXRvdWNoLmMKQEAgLTAsMCArMSwzMSBAQAorLy8gdGVzdC10b3VjaC5jIC8vCisKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCitleHRlcm4gZG91YmxlIG9tcF9nZXRfd3RpbWUoKTsKK2V4dGVybiBpbnQgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworZXh0ZXJuIGludCAgICBvbXBfZ2V0X21heF90aHJlYWRzKCk7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCitpbnQgbWFpbigpIHsKKyAgICBvbXBfZ2V0X3d0aW1lKCk7CisgICAgb21wX2dldF9udW1fdGhyZWFkcygpOworICAgIG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgICByZXR1cm4gMDsKK30KKworLy8gZW5kIG9mIGZpbGUgLy8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9kaXNhYmxlX3dhcm5pbmdzLmggYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiMjQyZmQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvZGlzYWJsZV93YXJuaW5ncy5oCkBAIC0wLDAgKzEsMjkgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDU5MykgICAvKiBwYXJhbWV0ZXIgIlhYWFgiIHdhcyBzZXQgYnV0IG5ldmVyIHVzZWQgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDM0NCkgICAvKiB0eXBlZGVmIG5hbWUgaGFzIGFscmVhZHkgYmVlbiBkZWNsYXJlZCAod2l0aCBzYW1lIHR5cGUpICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDE3NCkgICAvKiBleHByZXNzaW9uIGhhcyBubyBlZmZlY3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQxMjcpICAvKiBjb25kaXRpb25hbCBleHByZXNzaW9uIGlzIGNvbnN0YW50ICAgICAgICAgICAgICAgICAgICAgICovCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDQzMDYpICAvKiBjb252ZXJzaW9uIGZyb20gJz8nIHRvICc/JyBvZiBncmVhdGVyIHNpemUgICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIGRlZmluZWQgX19JTlRFTF9DT01QSUxFUgorCisjcHJhZ21hIHdhcm5pbmcgKGRpc2FibGU6IDg2OSkgIC8qIHBhcmFtZXRlciAiWFhYWFgiIHdhcyBuZXZlciByZWZlcmVuY2VkICAgICAgICAgICAgICAgICAgKi8KKyNwcmFnbWEgd2FybmluZyAoZGlzYWJsZTogMTQxOCkgLyogZXh0ZXJuYWwgZnVuY3Rpb24gZGVmaW5pdGlvbiB3aXRoIG5vIHByaW9yIGRlY2xhcmF0aW9uICAqLworI3ByYWdtYSB3YXJuaW5nIChkaXNhYmxlOiAxNDE5KSAvKiBleHRlcm5hbCBkZWNsYXJhdGlvbiBpbiBwcmltYXJ5IHNvdXJjZSBmaWxlICAgICAgICAgICAgICovCisKKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmggYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5LmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg0ZTI1NwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnkuaApAQCAtMCwwICsxLDM4MDQgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisjZGVmaW5lIF9JVFROT1RJRllfSF8KKworLyoqCitAZmlsZQorQGJyaWVmIFB1YmxpYyBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCitAbWFpbnBhZ2UKKworVGhlIElUVCBBUEkgaXMgdXNlZCB0byBhbm5vdGF0ZSBhIHVzZXIncyBwcm9ncmFtIHdpdGggYWRkaXRpb25hbCBpbmZvcm1hdGlvbgordGhhdCBjYW4gYmUgdXNlZCBieSBjb3JyZWN0bmVzcyBhbmQgcGVyZm9ybWFuY2UgdG9vbHMuIFRoZSB1c2VyIGluc2VydHMKK2NhbGxzIGluIHRoZWlyIHByb2dyYW0uIFRob3NlIGNhbGxzIGdlbmVyYXRlIGluZm9ybWF0aW9uIHRoYXQgaXMgY29sbGVjdGVkCithdCBydW50aW1lLCBhbmQgdXNlZCBieSBJbnRlbChSKSBUaHJlYWRpbmcgVG9vbHMuCisKK0BzZWN0aW9uIEFQSSBDb25jZXB0cworVGhlIGZvbGxvd2luZyBnZW5lcmFsIGNvbmNlcHRzIGFyZSB1c2VkIHRocm91Z2hvdXQgdGhlIEFQSS4KKworQHN1YnNlY3Rpb24gVW5pY29kZSBTdXBwb3J0CitNYW55IEFQSSBmdW5jdGlvbnMgdGFrZSBjaGFyYWN0ZXIgc3RyaW5nIGFyZ3VtZW50cy4gT24gV2luZG93cywgdGhlcmUKK2FyZSB0d28gdmVyc2lvbnMgb2YgZWFjaCBzdWNoIGZ1bmN0aW9uLiBUaGUgZnVuY3Rpb24gbmFtZSBpcyBzdWZmaXhlZAorYnkgVyBpZiBVbmljb2RlIHN1cHBvcnQgaXMgZW5hYmxlZCwgYW5kIGJ5IEEgb3RoZXJ3aXNlLiBBbnkgQVBJIGZ1bmN0aW9uCit0aGF0IHRha2VzIGEgY2hhcmFjdGVyIHN0cmluZyBhcmd1bWVudCBhZGhlcmVzIHRvIHRoaXMgY29udmVudGlvbi4KKworQHN1YnNlY3Rpb24gQ29uZGl0aW9uYWwgQ29tcGlsYXRpb24KK01hbnkgdXNlcnMgcHJlZmVyIGhhdmluZyBhbiBvcHRpb24gdG8gbW9kaWZ5IElUVCBBUEkgY29kZSB3aGVuIGxpbmtpbmcgaXQKK2luc2lkZSB0aGVpciBydW50aW1lcy4gSVRUIEFQSSBoZWFkZXIgZmlsZSBwcm92aWRlcyBhIG1lY2hhbmlzbSB0byByZXBsYWNlCitJVFQgQVBJIGZ1bmN0aW9uIG5hbWVzIGluc2lkZSB5b3VyIGNvZGUgd2l0aCBlbXB0eSBzdHJpbmdzLiBUbyBkbyB0aGlzLAorZGVmaW5lIHRoZSBtYWNyb3MgSU5URUxfTk9fSVRUTk9USUZZX0FQSSBkdXJpbmcgY29tcGlsYXRpb24gYW5kIHJlbW92ZSB0aGUKK3N0YXRpYyBsaWJyYXJ5IGZyb20gdGhlIGxpbmtlciBzY3JpcHQuCisKK0BzdWJzZWN0aW9uIERvbWFpbnMKK1tzZWUgZG9tYWluc10KK0RvbWFpbnMgcHJvdmlkZSBhIHdheSB0byBzZXBhcmF0ZSBub3RpZmljYXRpb24gZm9yIGRpZmZlcmVudCBtb2R1bGVzIG9yCitsaWJyYXJpZXMgaW4gYSBwcm9ncmFtLiBEb21haW5zIGFyZSBzcGVjaWZpZWQgYnkgZG90dGVkIGNoYXJhY3RlciBzdHJpbmdzLAorZS5nLiBUQkIuSW50ZXJuYWwuQ29udHJvbC4KKworQSBtZWNoYW5pc20gKHRvIGJlIHNwZWNpZmllZCkgaXMgcHJvdmlkZWQgdG8gZW5hYmxlIGFuZCBkaXNhYmxlCitkb21haW5zLiBCeSBkZWZhdWx0LCBhbGwgZG9tYWlucyBhcmUgZW5hYmxlZC4KK0BzdWJzZWN0aW9uIE5hbWVkIEVudGl0aWVzIGFuZCBJbnN0YW5jZXMKK05hbWVkIGVudGl0aWVzIChmcmFtZXMsIHJlZ2lvbnMsIHRhc2tzLCBhbmQgbWFya2VycykgY29tbXVuaWNhdGUKK2luZm9ybWF0aW9uIGFib3V0IHRoZSBwcm9ncmFtIHRvIHRoZSBhbmFseXNpcyB0b29scy4gQSBuYW1lZCBlbnRpdHkgb2Z0ZW4KK3JlZmVycyB0byBhIHNlY3Rpb24gb2YgcHJvZ3JhbSBjb2RlLCBvciB0byBzb21lIHNldCBvZiBsb2dpY2FsIGNvbmNlcHRzCit0aGF0IHRoZSBwcm9ncmFtbWVyIHdhbnRzIHRvIGdyb3VwIHRvZ2V0aGVyLgorCitOYW1lZCBlbnRpdGllcyByZWxhdGUgdG8gdGhlIHByb2dyYW1tZXIncyBzdGF0aWMgdmlldyBvZiB0aGUgcHJvZ3JhbS4gV2hlbgordGhlIHByb2dyYW0gYWN0dWFsbHkgZXhlY3V0ZXMsIG1hbnkgaW5zdGFuY2VzIG9mIGEgZ2l2ZW4gbmFtZWQgZW50aXR5CittYXkgYmUgY3JlYXRlZC4KKworVGhlIEFQSSBhbm5vdGF0aW9ucyBkZW5vdGUgaW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzLiBUaGUgYWN0dWFsCituYW1lZCBlbnRpdGllcyBhcmUgZGlzcGxheWVkIHVzaW5nIHRoZSBhbmFseXNpcyB0b29scy4gSW4gb3RoZXIgd29yZHMsCit0aGUgbmFtZWQgZW50aXRpZXMgY29tZSBpbnRvIGV4aXN0ZW5jZSB3aGVuIGluc3RhbmNlcyBhcmUgY3JlYXRlZC4KKworSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIG1heSBoYXZlIGluc3RhbmNlIGlkZW50aWZpZXJzIChJRHMpLiBTb21lCitBUEkgY2FsbHMgdXNlIGluc3RhbmNlIGlkZW50aWZpZXJzIHRvIGNyZWF0ZSByZWxhdGlvbnNoaXBzIGJldHdlZW4KK2RpZmZlcmVudCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuIE90aGVyIEFQSSBjYWxscyBhc3NvY2lhdGUgZGF0YQord2l0aCBpbnN0YW5jZXMgb2YgbmFtZWQgZW50aXRpZXMuCisKK1NvbWUgbmFtZWQgZW50aXRpZXMgbXVzdCBhbHdheXMgaGF2ZSBpbnN0YW5jZSBJRHMuIEluIHBhcnRpY3VsYXIsIHJlZ2lvbnMKK2FuZCBmcmFtZXMgYWx3YXlzIGhhdmUgSURzLiBUYXNrIGFuZCBtYXJrZXJzIG5lZWQgSURzIG9ubHkgaWYgdGhlIElEIGlzCituZWVkZWQgaW4gYW5vdGhlciBBUEkgY2FsbCAoc3VjaCBhcyBhZGRpbmcgYSByZWxhdGlvbiBvciBtZXRhZGF0YSkuCisKK1RoZSBsaWZldGltZSBvZiBpbnN0YW5jZSBJRHMgaXMgZGlzdGluY3QgZnJvbSB0aGUgbGlmZXRpbWUgb2YKK2luc3RhbmNlcy4gVGhpcyBhbGxvd3MgdmFyaW91cyByZWxhdGlvbnNoaXBzIHRvIGJlIHNwZWNpZmllZCBzZXBhcmF0ZQorZnJvbSB0aGUgYWN0dWFsIGV4ZWN1dGlvbiBvZiBpbnN0YW5jZXMuIFRoaXMgZmxleGliaWxpdHkgY29tZXMgYXQgdGhlCitleHBlbnNlIG9mIGV4dHJhIEFQSSBjYWxscy4KKworVGhlIHNhbWUgSUQgbWF5IG5vdCBiZSByZXVzZWQgZm9yIGRpZmZlcmVudCBpbnN0YW5jZXMsIHVubGVzcyBhIHByZXZpb3VzCitbcmVmXSBfX2l0dF9pZF9kZXN0cm95IGNhbGwgZm9yIHRoYXQgSUQgaGFzIGJlZW4gaXNzdWVkLgorKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lLCB1bnVzZWQpKQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWQorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIHByYWdtYSBtZXNzYWdlKCJXQVJOSU5HISEhIERlcHJlY2F0ZWQgQVBJIGlzIHVzZWQuIFBsZWFzZSB1bmRlZmluZSBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWSBtYWNybyIpCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICB3YXJuaW5nICJEZXByZWNhdGVkIEFQSSBpcyB1c2VkLiBQbGVhc2UgdW5kZWZpbmUgSU5URUxfSVRUTk9USUZZX0VOQUJMRV9MRUdBQ1kgbWFjcm8iCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgIGluY2x1ZGUgImxlZ2FjeS9pdHRub3RpZnkuaCIKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfRU5BQkxFX0xFR0FDWSAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKy8qIEhlbHBlciBtYWNybyBmb3Igam9pbmluZyB0b2tlbnMgKi8KKyNkZWZpbmUgSVRUX0pPSU5fQVVYKHAsbikgcCMjbgorI2RlZmluZSBJVFRfSk9JTihwLG4pICAgICBJVFRfSk9JTl9BVVgocCxuKQorCisjaWZkZWYgSVRUX01BSk9SCisjdW5kZWYgSVRUX01BSk9SCisjZW5kaWYKKyNpZmRlZiBJVFRfTUlOT1IKKyN1bmRlZiBJVFRfTUlOT1IKKyNlbmRpZgorI2RlZmluZSBJVFRfTUFKT1IgICAgIDMKKyNkZWZpbmUgSVRUX01JTk9SICAgICAwCisKKy8qIFN0YW5kYXJkIHZlcnNpb25pbmcgb2YgYSB0b2tlbiB3aXRoIG1ham9yIGFuZCBtaW5vciB2ZXJzaW9uIG51bWJlcnMgKi8KKyNkZWZpbmUgSVRUX1ZFUlNJT05JWkUoeCkgICAgXAorICAgIElUVF9KT0lOKHgsICAgICAgICAgICAgICBcCisgICAgSVRUX0pPSU4oXywgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihJVFRfTUFKT1IsICAgICAgXAorICAgIElUVF9KT0lOKF8sIElUVF9NSU5PUikpKSkKKworI2lmbmRlZiBJTlRFTF9JVFROT1RJRllfUFJFRklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BSRUZJWCBfX2l0dF8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUFJFRklYICovCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QT1NURklYCisjICBkZWZpbmUgSU5URUxfSVRUTk9USUZZX1BPU1RGSVggX3B0cl8KKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCAqLworCisjZGVmaW5lIElUVE5PVElGWV9OQU1FX0FVWChuKSBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLG4pCisjZGVmaW5lIElUVE5PVElGWV9OQU1FKG4pICAgICBJVFRfVkVSU0lPTklaRShJVFROT1RJRllfTkFNRV9BVVgoSVRUX0pPSU4obixJTlRFTF9JVFROT1RJRllfUE9TVEZJWCkpKQorCisjZGVmaW5lIElUVE5PVElGWV9WT0lEKG4pICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pCisjZGVmaW5lIElUVE5PVElGWV9EQVRBKG4pICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9WT0lEX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/ICh2b2lkKTAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICh2b2lkKTAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QwKG4sZCkgICAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMShuLGQseCkgICAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9EMihuLGQseCx5KSAgICghKGQpLT5mbGFncykgPyAgICAgICAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QzKG4sZCx4LHkseikgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6KQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENChuLGQseCx5LHosYSkgICAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhKQorI2RlZmluZSBJVFROT1RJRllfREFUQV9ENShuLGQseCx5LHosYSxiKSAgICghKGQpLT5mbGFncykgPyAwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q2KG4sZCx4LHkseixhLGIsYykgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYixjKQorCisjaWZkZWYgSVRUX1NUVUIKKyN1bmRlZiBJVFRfU1RVQgorI2VuZGlmCisjaWZkZWYgSVRUX1NUVUJWCisjdW5kZWYgSVRUX1NUVUJWCisjZW5kaWYKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncykgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICB0eXBlZGVmIHR5cGUgKGFwaSogSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpKSBhcmdzOyAgIFwKKyAgICBleHRlcm4gSVRUX0pPSU4oSVRUTk9USUZZX05BTUUobmFtZSksX3QpIElUVE5PVElGWV9OQU1FKG5hbWUpOworI2RlZmluZSBJVFRfU1RVQiBJVFRfU1RVQlYKKy8qKiBAZW5kY29uZCAqLworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZ3BhX2RvY3VtZW50YXRpb24gKi8KKy8qKgorICogQGRlZmdyb3VwIHB1YmxpYyBQdWJsaWMgQVBJCisgKiBAeworICogQH0KKyAqLworCisvKioKKyAqIEBkZWZncm91cCBjb250cm9sIENvbGxlY3Rpb24gQ29udHJvbAorICogQGluZ3JvdXAgcHVibGljCisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgbm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nIGNvbGxlY3RlZAorICoKKyAqIFBhdXNpbmcgb2NjdXJzIG5vdCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQgYnV0IGZvciBhbGwgcHJvY2VzcyBhcyB3ZWxsIGFzIHNwYXduZWQgcHJvY2Vzc2VzCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFOgorICogICAtIERvZXMgbm90IGFuYWx5emUgb3IgcmVwb3J0IGVycm9ycyB0aGF0IGludm9sdmUgbWVtb3J5IGFjY2Vzcy4KKyAqICAgLSBPdGhlciBlcnJvcnMgYXJlIHJlcG9ydGVkIGFzIHVzdWFsLiBQYXVzaW5nIGRhdGEgY29sbGVjdGlvbiBpbgorICogICAgIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFCisgKiAgICAgb25seSBwYXVzZXMgdHJhY2luZyBhbmQgYW5hbHl6aW5nIG1lbW9yeSBhY2Nlc3MuCisgKiAgICAgSXQgZG9lcyBub3QgcGF1c2UgdHJhY2luZyBvciBhbmFseXppbmcgdGhyZWFkaW5nIEFQSXMuCisgKiAgIC4KKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIGFuZCBJbnRlbChSKSBWVHVuZShUTSkgQW1wbGlmaWVyIFhFOgorICogICAtIERvZXMgY29udGludWUgdG8gcmVjb3JkIHdoZW4gbmV3IHRocmVhZHMgYXJlIHN0YXJ0ZWQuCisgKiAgIC4KKyAqIC0gT3RoZXIgZWZmZWN0czoKKyAqICAgLSBQb3NzaWJsZSByZWR1Y3Rpb24gb2YgcnVudGltZSBvdmVyaGVhZC4KKyAqICAgLgorICogQHsKKyAqLworLyoqIEBicmllZiBQYXVzZSBjb2xsZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9wYXVzZSh2b2lkKTsKKy8qKiBAYnJpZWYgUmVzdW1lIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Jlc3VtZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcGF1c2UsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfcGF1c2UgICAgICBJVFROT1RJRllfVk9JRChwYXVzZSkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICBJVFROT1RJRllfTkFNRShwYXVzZSkKKyNkZWZpbmUgX19pdHRfcmVzdW1lICAgICBJVFROT1RJRllfVk9JRChyZXN1bWUpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgSVRUTk9USUZZX05BTUUocmVzdW1lKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2UoKQorI2RlZmluZSBfX2l0dF9wYXVzZV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfcmVzdW1lKCkKKyNkZWZpbmUgX19pdHRfcmVzdW1lX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGNvbnRyb2wgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCB0aHJlYWRzIFRocmVhZHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogR2l2ZSBuYW1lcyB0byB0aHJlYWRzCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBTZXRzIHRocmVhZCBuYW1lIG9mIGNhbGxpbmcgdGhyZWFkCisgKiBAcGFyYW1baW5dIG5hbWUgLSBuYW1lIG9mIHRocmVhZAorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfc2V0X25hbWVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX3NldF9uYW1lVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lICAgICBfX2l0dF90aHJlYWRfc2V0X25hbWVXCisjICBkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZSAgICAgX19pdHRfdGhyZWFkX3NldF9uYW1lQQorIyAgZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF90aHJlYWRfc2V0X25hbWUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lQV9wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lVyAgICAgSVRUTk9USUZZX1ZPSUQodGhyZWFkX3NldF9uYW1lVykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWUgICAgIElUVE5PVElGWV9WT0lEKHRocmVhZF9zZXRfbmFtZSkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVBKG5hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lVyhuYW1lKQorI2RlZmluZSBfX2l0dF90aHJlYWRfc2V0X25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lKG5hbWUpCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3RocmVhZF9zZXRfbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKgorICogQGJyaWVmIE1hcmsgY3VycmVudCB0aHJlYWQgYXMgaWdub3JlZCBmcm9tIHRoaXMgcG9pbnQgb24sIGZvciB0aGUgZHVyYXRpb24gb2YgaXRzIGV4aXN0ZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGhyZWFkX2lnbm9yZSh2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX2lnbm9yZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlICAgICBJVFROT1RJRllfVk9JRCh0aHJlYWRfaWdub3JlKQorI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciBJVFROT1RJRllfTkFNRSh0aHJlYWRfaWdub3JlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lnbm9yZSgpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZ25vcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90aHJlYWRfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gdGhyZWFkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzdXBwcmVzcyBFcnJvciBzdXBwcmVzc2lvbgorICogQGluZ3JvdXAgcHVibGljCisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgZXJyb3JzIGFyZSBzdXBwcmVzc2VkCisgKgorICogQHsKKyAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgdXNlZCBmb3IgZXJyb3Igc3VwcHJlc3Npb24gaW4gY29ycmVjdG5lc3MgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrCisgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfYWxsX2Vycm9ycyAweDdmZmZmZmZmCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIGZvciBzdXBwcmVzc2lvbiBtYXNrIChzdXBwcmVzc2VzIGVycm9ycyBmcm9tIHRocmVhZGluZyBhbmFseXNpcykKKyAqLworI2RlZmluZSBfX2l0dF9zdXBwcmVzc190aHJlYWRpbmdfZXJyb3JzIDB4MDAwMDAwZmYKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgZm9yIHN1cHByZXNzaW9uIG1hc2sgKHN1cHByZXNzZXMgZXJyb3JzIGZyb20gbWVtb3J5IGFuYWx5c2lzKQorICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX21lbW9yeV9lcnJvcnMgMHgwMDAwZmYwMAorCisvKioKKyAqIEBicmllZiBTdGFydCBzdXBwcmVzc2luZyBlcnJvcnMgaWRlbnRpZmllZCBpbiBtYXNrIG9uIHRoaXMgdGhyZWFkCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX3B1c2godW5zaWduZWQgaW50IG1hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wdXNoLCAodW5zaWduZWQgaW50IG1hc2spKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wdXNoKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19wdXNoKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaChtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19wdXNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcHVzaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3RzIG9mIHRoZSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX3B1c2gKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3VwcHJlc3NfcG9wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19wb3ApCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX3BvcF9wdHIgSVRUTk9USUZZX05BTUUoc3VwcHJlc3NfcG9wKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wKCkKKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfcG9wX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGVudW0gX19pdHRfbW9kZWxfZGlzYWJsZQorICogQGJyaWVmIEVudW1lcmF0b3IgZm9yIHRoZSBkaXNhYmxlIG1ldGhvZHMKKyAqLwordHlwZWRlZiBlbnVtIF9faXR0X3N1cHByZXNzX21vZGUgeworICAgIF9faXR0X3Vuc3VwcHJlc3NfcmFuZ2UsCisgICAgX19pdHRfc3VwcHJlc3NfcmFuZ2UKK30gX19pdHRfc3VwcHJlc3NfbW9kZV90OworCisvKioKKyAqIEBicmllZiBNYXJrIGEgcmFuZ2Ugb2YgbWVtb3J5IGZvciBlcnJvciBzdXBwcmVzc2lvbiBvciB1bnN1cHByZXNzaW9uIGZvciBlcnJvciB0eXBlcyBpbmNsdWRlZCBpbiBtYXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19tYXJrX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlICAgICBJVFROT1RJRllfVk9JRChzdXBwcmVzc19tYXJrX3JhbmdlKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19tYXJrX3JhbmdlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZShtYXNrKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19tYXJrX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfbWFya19yYW5nZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVbmRvIHRoZSBlZmZlY3Qgb2YgYSBtYXRjaGluZyBjYWxsIHRvIF9faXR0X3N1cHByZXNzX21hcmtfcmFuZ2UuICAgSWYgbm90IG1hdGNoaW5nCisgKiAgICAgICAgY2FsbCBpcyBmb3VuZCwgbm90aGluZyBpcyBjaGFuZ2VkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZShfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX2NsZWFyX3JhbmdlLCAoX19pdHRfc3VwcHJlc3NfbW9kZV90IG1vZGUsIHVuc2lnbmVkIGludCBtYXNrLCB2b2lkICogYWRkcmVzcywgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9zdXBwcmVzc19jbGVhcl9yYW5nZSAgICAgSVRUTk9USUZZX1ZPSUQoc3VwcHJlc3NfY2xlYXJfcmFuZ2UpCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciBJVFROT1RJRllfTkFNRShzdXBwcmVzc19jbGVhcl9yYW5nZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlKG1hc2spCisjZGVmaW5lIF9faXR0X3N1cHByZXNzX2NsZWFyX3JhbmdlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3VwcHJlc3NfY2xlYXJfcmFuZ2VfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSAqLworLyoqIEB9IHN1cHByZXNzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIHN5bmMgU3luY2hyb25pemF0aW9uCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEluZGljYXRlIHVzZXItd3JpdHRlbiBzeW5jaHJvbml6YXRpb24gY29kZQorICogQHsKKyAqLworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9iYXJyaWVyIDEKKworLyoqCisgKiBAaGlkZWluaXRpYWxpemVyCisgKiBAYnJpZWYgcG9zc2libGUgdmFsdWUgb2YgYXR0cmlidXRlIGFyZ3VtZW50IGZvciBzeW5jIG9iamVjdCB0eXBlCisgKi8KKyNkZWZpbmUgX19pdHRfYXR0cl9tdXRleCAgIDIKKworLyoqCitAYnJpZWYgTmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKK0BwYXJhbVtpbl0gYWRkciAgICAgICBIYW5kbGUgZm9yIHRoZSBzeW5jaHJvbml6YXRpb24gb2JqZWN0LiBZb3Ugc2hvdWxkCit1c2UgYSByZWFsIGFkZHJlc3MgdG8gdW5pcXVlbHkgaWRlbnRpZnkgdGhlIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCitAcGFyYW1baW5dIG9ianR5cGUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCB0eXBlIHN0cmluZy4gSWYgTlVMTCBpcworcGFzc2VkLCB0aGUgbmFtZSB3aWxsIGJlICJVc2VyIFN5bmNocm9uaXphdGlvbiIuCitAcGFyYW1baW5dIG9iam5hbWUgICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwKK25vIG5hbWUgd2lsbCBiZSBhc3NpZ25lZCB0byB0aGUgb2JqZWN0LgorQHBhcmFtW2luXSBhdHRyaWJ1dGUgIG9uZSBvZiBbI19faXR0X2F0dHJfYmFycmllciwgI19faXR0X2F0dHJfbXV0ZXhdCisgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOwordm9pZCBJVFRBUEkgX19pdHRfc3luY19jcmVhdGVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgX19pdHRfc3luY19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfc3luY19jcmVhdGVfcHRyIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3N5bmNfY3JlYXRlICh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBjb25zdCBjaGFyICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZVcsICh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIqICAgIG9ianR5cGUsIGNvbnN0IGNoYXIqICAgIG9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZUEgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlVyAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19jcmVhdGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NyZWF0ZShhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorQGJyaWVmIFJlbmFtZSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QKKworWW91IGNhbiB1c2UgdGhlIHJlbmFtZSBjYWxsIHRvIGFzc2lnbiBvciByZWFzc2lnbiBhIG5hbWUgdG8gYSBnaXZlbgorc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gYWRkciAgaGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KK0BwYXJhbVtpbl0gbmFtZSAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4KKyovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3JlbmFtZVcodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lICAgICBfX2l0dF9zeW5jX3JlbmFtZUEKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgX19pdHRfc3luY19yZW5hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZW5hbWUodm9pZCAqYWRkciwgY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVuYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWVBKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lVykKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVXX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3JlbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWUgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfcmVuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19yZW5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZUEoYWRkciwgbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19yZW5hbWVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lVyhhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZShhZGRyLCBuYW1lKQorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfcmVuYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbmFtZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyBAYnJpZWYgRGVzdHJveSBhIHN5bmNocm9uaXphdGlvbiBvYmplY3QuCisgQHBhcmFtIGFkZHIgSGFuZGxlIGZvciB0aGUgc3luY2hyb25pemF0aW9uIG9iamVjdC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19kZXN0cm95KHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzeW5jX2Rlc3Ryb3kpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19kZXN0cm95KGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovLyoqCisgKiBAbmFtZSBncm91cCBvZiBmdW5jdGlvbnMgaXMgdXNlZCBmb3IgcGVyZm9ybWFuY2UgbWVhc3VyZW1lbnQgdG9vbHMKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogQHsgKi8KKy8qKgorICogQGJyaWVmIEVudGVyIHNwaW4gbG9vcCBvbiB1c2VyLWRlZmluZWQgc3luYyBvYmplY3QKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlICAgICBJVFROT1RJRllfVk9JRChzeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19wcmVwYXJlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBRdWl0IHNwaW4gbG9vcCB3aXRob3V0IGFjcXVpcmluZyBzcGluIG9iamVjdAorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfc3luY19jYW5jZWwgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoc3luY19jYW5jZWwpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9zeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N5bmNfY2FuY2VsX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN1Y2Nlc3NmdWwgc3BpbiBsb29wIGNvbXBsZXRpb24gKHN5bmMgb2JqZWN0IGFjcXVpcmVkKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWQgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfYWNxdWlyZWQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFN0YXJ0IHN5bmMgb2JqZWN0IHJlbGVhc2luZyBjb2RlLiBJcyBjYWxsZWQgYmVmb3JlIHRoZSBsb2NrIHJlbGVhc2UgY2FsbC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X3N5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChzeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfc3luY19yZWxlYXNpbmdfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKiBAfSBzeW5jIGdyb3VwICovCisKKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8vKioKKyAqIEBuYW1lIGdyb3VwIG9mIGZ1bmN0aW9ucyBpcyB1c2VkIGZvciBjb3JyZWN0bmVzcyBjaGVja2luZyB0b29scworICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBAeyAqLworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX3ByZXBhcmUodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZSAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfcHJlcGFyZSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcHJlcGFyZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmUoYWRkcikKKyNkZWZpbmUgX19pdHRfZnN5bmNfcHJlcGFyZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfY2FuY2VsKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19jYW5jZWwsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsICAgICBJVFROT1RJRllfVk9JRChmc3luY19jYW5jZWwpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfY2FuY2VsKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfY2FuY2VsKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2NhbmNlbF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEZhc3Qgc3luY2hyb25pemF0aW9uIHdoaWNoIGRvZXMgbm8gcmVxdWlyZSBzcGlubmluZy4KKyAqIC0gVGhpcyBzcGVjaWFsIGZ1bmN0aW9uIGlzIHRvIGJlIHVzZWQgYnkgVEJCIGFuZCBPcGVuTVAgbGlicmFyaWVzIG9ubHkgd2hlbiB0aGV5IGtub3cKKyAqICAgdGhlcmUgaXMgbm8gc3BpbiBidXQgdGhleSBuZWVkIHRvIHN1cHByZXNzIFRDIHdhcm5pbmdzIGFib3V0IHNoYXJlZCB2YXJpYWJsZSBtb2RpZmljYXRpb25zLgorICogLSBJdCBvbmx5IGhhcyBjb3JyZXNwb25kaW5nIHBvaW50ZXJzIGluIHN0YXRpYyBsaWJyYXJ5IGFuZCBkb2VzIG5vdCBoYXZlIGNvcnJlc3BvbmRpbmcgZnVuY3Rpb24KKyAqICAgaW4gZHluYW1pYyBsaWJyYXJ5LgorICogQHNlZSB2b2lkIF9faXR0X3N5bmNfYWNxdWlyZWQodm9pZCAqYWRkcik7CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZzeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9mc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQoZnN5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShmc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBsZWdhY3kKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBGYXN0IHN5bmNocm9uaXphdGlvbiB3aGljaCBkb2VzIG5vIHJlcXVpcmUgc3Bpbm5pbmcuCisgKiAtIFRoaXMgc3BlY2lhbCBmdW5jdGlvbiBpcyB0byBiZSB1c2VkIGJ5IFRCQiBhbmQgT3Blbk1QIGxpYnJhcmllcyBvbmx5IHdoZW4gdGhleSBrbm93CisgKiAgIHRoZXJlIGlzIG5vIHNwaW4gYnV0IHRoZXkgbmVlZCB0byBzdXBwcmVzcyBUQyB3YXJuaW5ncyBhYm91dCBzaGFyZWQgdmFyaWFibGUgbW9kaWZpY2F0aW9ucy4KKyAqIC0gSXQgb25seSBoYXMgY29ycmVzcG9uZGluZyBwb2ludGVycyBpbiBzdGF0aWMgbGlicmFyeSBhbmQgZG9lcyBub3QgaGF2ZSBjb3JyZXNwb25kaW5nIGZ1bmN0aW9uCisgKiAgIGluIGR5bmFtaWMgbGlicmFyeS4KKyAqIEBzZWUgdm9pZCBfX2l0dF9zeW5jX3JlbGVhc2luZyh2b2lkKiBhZGRyKTsKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnN5bmNfcmVsZWFzaW5nKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19yZWxlYXNpbmcsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nICAgICBJVFROT1RJRllfVk9JRChmc3luY19yZWxlYXNpbmcpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgSVRUTk9USUZZX05BTUUoZnN5bmNfcmVsZWFzaW5nKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZnN5bmNfcmVsZWFzaW5nKGFkZHIpCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZzeW5jX3JlbGVhc2luZ19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9ICovCisKKy8qKgorICogQGRlZmdyb3VwIG1vZGVsIE1vZGVsaW5nIGJ5IEludGVsKFIpIFBhcmFsbGVsIEFkdmlzb3IKKyAqIEBpbmdyb3VwIHB1YmxpYworICogVGhpcyBpcyB0aGUgc3Vic2V0IG9mIGl0dCB1c2VkIGZvciBtb2RlbGluZyBieSBJbnRlbChSKSBQYXJhbGxlbCBBZHZpc29yLgorICogVGhpcyBBUEkgaXMgY2FsbGVkIE9OTFkgdXNpbmcgYW5ub3RhdGUuaCwgYnkgIkFubm90YXRpb24iIG1hY3JvcworICogdGhlIHVzZXIgcGxhY2VzIGluIHRoZWlyIHNvdXJjZXMgZHVyaW5nIHRoZSBwYXJhbGxlbGlzbSBtb2RlbGluZyBzdGVwcy4KKyAqCisgKiBzaXRlX2JlZ2luL2VuZCBhbmQgdGFza19iZWdpbi9lbmQgdGFrZSB0aGUgYWRkcmVzcyBvZiBoYW5kbGUgdmFyaWFibGVzLAorICogd2hpY2ggYXJlIHdyaXRlYWJsZSBieSB0aGUgQVBJLiAgSGFuZGxlcyBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQgcHJpb3IKKyAqIHRvIHRoZSBmaXJzdCBjYWxsIHRvIGJlZ2luLCBvciBtYXkgY2F1c2UgYSBydW4tdGltZSBmYWlsdXJlLgorICogVGhlIGhhbmRsZXMgYXJlIGluaXRpYWxpemVkIGluIGEgbXVsdGktdGhyZWFkIHNhZmUgd2F5IGJ5IHRoZSBBUEkgaWYKKyAqIHRoZSBoYW5kbGUgaXMgMC4gIFRoZSBjb21tb25seSBleHBlY3RlZCBpZGlvbSBpcyBvbmUgc3RhdGljIGhhbmRsZSB0bworICogaWRlbnRpZnkgYSBzaXRlIG9yIHRhc2suICBJZiBhIHNpdGUgb3IgdGFzayBvZiB0aGUgc2FtZSBuYW1lIGhhcyBhbHJlYWR5CisgKiBiZWVuIHN0YXJ0ZWQgZHVyaW5nIHRoaXMgY29sbGVjdGlvbiwgdGhlIHNhbWUgaGFuZGxlIE1BWSBiZSByZXR1cm5lZCwKKyAqIGJ1dCBpcyBub3QgcmVxdWlyZWQgdG8gYmUgLSBpdCBpcyB1bnNwZWNpZmllZCBpZiBkYXRhIG1lcmdpbmcgaXMgZG9uZQorICogYmFzZWQgb24gbmFtZS4gIFRoZXNlIHJvdXRpbmVzIGFsc28gdGFrZSBhbiBpbnN0YW5jZSB2YXJpYWJsZS4gIExpa2UKKyAqIHRoZSBsZXhpY2FsIGluc3RhbmNlLCB0aGVzZSBtdXN0IGJlIDAgaW5pdGlhbGl6ZWQuICBVbmxpa2UgdGhlIGxleGljYWwKKyAqIGluc3RhbmNlLCB0aGlzIGlzIHVzZWQgdG8gdHJhY2sgYSBzaW5nbGUgZHluYW1pYyBpbnN0YW5jZS4KKyAqCisgKiBBUEkgdXNlZCBieSB0aGUgSW50ZWwoUikgUGFyYWxsZWwgQWR2aXNvciB0byBkZXNjcmliZSBwb3RlbnRpYWwgY29uY3VycmVuY3kKKyAqIGFuZCByZWxhdGVkIGFjdGl2aXRpZXMuIFVzZXItYWRkZWQgc291cmNlIGFubm90YXRpb25zIGV4cGFuZCB0byBjYWxscworICogdG8gdGhlc2UgcHJvY2VkdXJlcyB0byBlbmFibGUgbW9kZWxpbmcgb2YgYSBoeXBvdGhldGljYWwgY29uY3VycmVudAorICogZXhlY3V0aW9uIHNlcmlhbGx5LgorICogQHsKKyAqLworI2lmICFkZWZpbmVkKF9BRFZJU09SX0FOTk9UQVRFX0hfKSB8fCBkZWZpbmVkKEFOTk9UQVRFX0VYUEFORF9OVUxMKQorCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3NpdGU7ICAgICAgICAgICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgbGV4aWNhbCBzaXRlICAgICAqLwordHlwZWRlZiB2b2lkKiBfX2l0dF9tb2RlbF9zaXRlX2luc3RhbmNlOyAgICAvKiE8IEBicmllZiBoYW5kbGUgZm9yIGR5bmFtaWMgaW5zdGFuY2UgKi8KK3R5cGVkZWYgdm9pZCogX19pdHRfbW9kZWxfdGFzazsgICAgICAgICAgICAgLyohPCBAYnJpZWYgaGFuZGxlIGZvciBsZXhpY2FsIHNpdGUgICAgICovCit0eXBlZGVmIHZvaWQqIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2U7ICAgIC8qITwgQGJyaWVmIGhhbmRsZSBmb3IgZHluYW1pYyBpbnN0YW5jZSAqLworCisvKioKKyAqIEBlbnVtIF9faXR0X21vZGVsX2Rpc2FibGUKKyAqIEBicmllZiBFbnVtZXJhdG9yIGZvciB0aGUgZGlzYWJsZSBtZXRob2RzCisgKi8KK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfbW9kZWxfZGlzYWJsZV9vYnNlcnZhdGlvbiwKKyAgICBfX2l0dF9tb2RlbF9kaXNhYmxlX2NvbGxlY3Rpb24KK30gX19pdHRfbW9kZWxfZGlzYWJsZTsKKworI2VuZGlmIC8qICFfQURWSVNPUl9BTk5PVEFURV9IXyB8fCBBTk5PVEFURV9FWFBBTkRfTlVMTCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9TSVRFX0JFR0lOL0FOTk9UQVRFX1NJVEVfRU5EIHN1cHBvcnQuCisgKgorICogc2l0ZV9iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgY29uY3VycmVuY3kgc2l0ZS4KKyAqIHNpdGUgaW5zdGFuY2VzIG1heSBiZSByZWN1cnNpdmVseSBuZXN0ZWQgd2l0aCB0aGVtc2VsdmVzLgorICogc2l0ZV9lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZCBidXQgdW5lbmRlZCBzaXRlIGZvciB0aGUgY3VycmVudAorICogdGhyZWFkLiAgVGhlIGhhbmRsZSBwYXNzZWQgdG8gZW5kIG1heSBiZSB1c2VkIHRvIHZhbGlkYXRlIHN0cnVjdHVyZS4KKyAqIEluc3RhbmNlcyBvZiBhIHNpdGUgZW5jb3VudGVyZWQgb24gZGlmZmVyZW50IHRocmVhZHMgY29uY3VycmVudGx5CisgKiBhcmUgY29uc2lkZXJlZCBjb21wbGV0ZWx5IGRpc3RpbmN0LiBJZiB0aGUgc2l0ZSBuYW1lIGZvciB0d28gZGlmZmVyZW50CisgKiBsZXhpY2FsIHNpdGVzIG1hdGNoLCBpdCBpcyB1bnNwZWNpZmllZCB3aGV0aGVyIHRoZXkgYXJlIHRyZWF0ZWQgYXMgdGhlCisgKiBzYW1lIG9yIGRpZmZlcmVudCBmb3IgZGF0YSBwcmVzZW50YXRpb24uCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW4oX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcoY29uc3Qgd2NoYXJfdCAqbmFtZSk7CisjZW5kaWYKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbik7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9zaXRlX2VuZCAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3NpdGVfZW5kXzIodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW4sICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpKQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCBzaXRlTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2VuZCwgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpblcgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luVykKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbldfcHRyICBJVFROT1RJRllfTkFNRShtb2RlbF9zaXRlX2JlZ2luVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQSAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUwgICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9zaXRlX2JlZ2luQUwpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BTF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfc2l0ZV9lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3NpdGVfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3NpdGVfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luKHNpdGUsIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kKHNpdGUsIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfc2l0ZV9lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5XX3B0ciAgMAorI2VuZGlmCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfYmVnaW5BX3B0ciAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9zaXRlX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3NpdGVfZW5kXzJfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfVEFTS19CRUdJTi9BTk5PVEFURV9UQVNLX0VORCBzdXBwb3J0CisgKgorICogdGFza19iZWdpbi9lbmQgbW9kZWwgYSBwb3RlbnRpYWwgdGFzaywgd2hpY2ggaXMgY29udGFpbmVkIHdpdGhpbiB0aGUgbW9zdAorICogY2xvc2VseSBlbmNsb3NpbmcgZHluYW1pYyBzaXRlLiAgdGFza19lbmQgZXhpdHMgdGhlIG1vc3QgcmVjZW50bHkgc3RhcnRlZAorICogYnV0IHVuZW5kZWQgdGFzay4gIFRoZSBoYW5kbGUgcGFzc2VkIHRvIGVuZCBtYXkgYmUgdXNlZCB0byB2YWxpZGF0ZQorICogc3RydWN0dXJlLiAgSXQgaXMgdW5zcGVjaWZpZWQgaWYgYmFkIGR5bmFtaWMgbmVzdGluZyBpcyBkZXRlY3RlZC4gIElmIGl0CisgKiBpcywgaXQgc2hvdWxkIGJlIGVuY29kZWQgaW4gdGhlIHJlc3VsdGluZyBkYXRhIGNvbGxlY3Rpb24uICBUaGUgY29sbGVjdG9yCisgKiBzaG91bGQgbm90IGZhaWwgZHVlIHRvIGNvbnN0cnVjdCBuZXN0aW5nIGlzc3Vlcywgbm9yIGF0dGVtcHQgdG8gZGlyZWN0bHkKKyAqIGluZGljYXRlIHRoZSBwcm9ibGVtLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XKGNvbnN0IHdjaGFyX3QgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2VuZGlmCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShjb25zdCBjaGFyICpuYW1lKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBKGNvbnN0IGNoYXIgKm5hbWUpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgdGFza05hbWVMZW4pOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfdGFza19lbmQgIChfX2l0dF9tb2RlbF90YXNrICp0YXNrLCBfX2l0dF9tb2RlbF90YXNrX2luc3RhbmNlICppbnN0YW5jZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlLCBjb25zdCBjaGFyICpuYW1lKSkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSkpCisjZW5kaWYKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BLCAgKGNvbnN0IGNoYXIgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkFMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0EsICAoY29uc3QgY2hhciAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza0FMLCAgKGNvbnN0IGNoYXIgKm5hbWUsIHNpemVfdCB0YXNrTmFtZUxlbikpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2VuZCwgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfZW5kXzIsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW4gICAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpbikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpblcgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfYmVnaW5XKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19iZWdpblcpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrVyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tXKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza1dfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2l0ZXJhdGlvbl90YXNrVykKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQSAgICBJVFROT1RJRllfVk9JRChtb2RlbF90YXNrX2JlZ2luQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfdGFza19iZWdpbkFMKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfYmVnaW5BTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2l0ZXJhdGlvbl90YXNrQSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9pdGVyYXRpb25fdGFza0EpCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmQgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgSVRUTk9USUZZX05BTUUobW9kZWxfdGFza19lbmQpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzIgICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3Rhc2tfZW5kXzIpCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kXzJfcHRyICAgIElUVE5PVElGWV9OQU1FKG1vZGVsX3Rhc2tfZW5kXzIpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luKHRhc2ssIGluc3RhbmNlLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luX3B0ciAgMAorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luVyhuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luV19wdHIgIDAKKyNlbmRpZgorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFMKG5hbWUsIHNpdGVOYW1lTGVuKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2JlZ2luQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQShuYW1lKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pdGVyYXRpb25fdGFza0FfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUwobmFtZSwgc2l0ZU5hbWVMZW4pCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfZW5kKHRhc2ssIGluc3RhbmNlKQorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF9wdHIgICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF90YXNrX2VuZF8yKCkKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5fcHRyICAwCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5XX3B0ciAwCisjZW5kaWYKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19iZWdpbkFfcHRyICAwCisjZGVmaW5lIF9faXR0X21vZGVsX3Rhc2tfYmVnaW5BTF9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfaXRlcmF0aW9uX3Rhc2tBX3B0ciAgICAwCisjZGVmaW5lIF9faXR0X21vZGVsX2l0ZXJhdGlvbl90YXNrQUxfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfdGFza19lbmRfMl9wdHIgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9MT0NLX0FDUVVJUkUvQU5OT1RBVEVfTE9DS19SRUxFQVNFIHN1cHBvcnQKKyAqCisgKiBsb2NrX2FjcXVpcmUvcmVsZWFzZSBtb2RlbCBhIHBvdGVudGlhbCBsb2NrIGZvciBib3RoIGxvY2tzZXQgYW5kCisgKiBwZXJmb3JtYW5jZSBtb2RlbGluZy4gIEVhY2ggdW5pcXVlIGFkZHJlc3MgaXMgbW9kZWxlZCBhcyBhIHNlcGFyYXRlCisgKiBsb2NrLCB3aXRoIGludmFsaWQgYWRkcmVzc2VzIGJlaW5nIHZhbGlkIGxvY2sgSURzLiAgU3BlY2lmaWNhbGx5OgorICogbm8gc3RvcmFnZSBpcyBhY2Nlc3NlZCBieSB0aGUgQVBJIGF0IHRoZSBzcGVjaWZpZWQgYWRkcmVzcyAtIGl0IGlzIG9ubHkKKyAqIHVzZWQgZm9yIGxvY2sgaWRlbnRpZmljYXRpb24uICBMb2NrIGFjcXVpcmVzIG1heSBiZSBzZWxmLW5lc3RlZCBhbmQgYXJlCisgKiB1bmxvY2tlZCBieSBhIGNvcnJlc3BvbmRpbmcgbnVtYmVyIG9mIHJlbGVhc2VzLgorICogKFRoZXNlIGNsb3NlbHkgY29ycmVzcG9uZCB0byBfX2l0dF9zeW5jX2FjcXVpcmVkL19faXR0X3N5bmNfcmVsZWFzaW5nLAorICogYnV0IG1heSBub3QgaGF2ZSBpZGVudGljYWwgc2VtYW50aWNzLikKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKHZvaWQgKmxvY2spOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzIodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2Uodm9pZCAqbG9jayk7Cit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMih2b2lkICpsb2NrKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19hY3F1aXJlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgKHZvaWQgKmxvY2spKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAodm9pZCAqbG9jaykpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgKHZvaWQgKmxvY2spKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmUgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfYWNxdWlyZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX2FjcXVpcmUpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX2FjcXVpcmVfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfYWNxdWlyZV8yKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2xvY2tfcmVsZWFzZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9sb2NrX3JlbGVhc2UpCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9sb2NrX3JlbGVhc2VfMikKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlXzJfcHRyIElUVE5PVElGWV9OQU1FKG1vZGVsX2xvY2tfcmVsZWFzZV8yKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMihsb2NrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX2FjcXVpcmVfMl9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2UobG9jaykKKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19yZWxlYXNlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yKGxvY2spCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV8yX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfbG9ja19hY3F1aXJlX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfYWNxdWlyZV8yX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2xvY2tfcmVsZWFzZV9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9sb2NrX3JlbGVhc2VfMl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRUNPUkRfQUxMT0NBVElPTi9BTk5PVEFURV9SRUNPUkRfREVBTExPQ0FUSU9OIHN1cHBvcnQKKyAqCisgKiByZWNvcmRfYWxsb2NhdGlvbi9kZWFsbG9jYXRpb24gZGVzY3JpYmUgdXNlci1kZWZpbmVkIG1lbW9yeSBhbGxvY2F0b3IKKyAqIGJlaGF2aW9yLCB3aGljaCBtYXkgYmUgcmVxdWlyZWQgZm9yIGNvcnJlY3RuZXNzIG1vZGVsaW5nIHRvIHVuZGVyc3RhbmQKKyAqIHdoZW4gc3RvcmFnZSBpcyBub3QgZXhwZWN0ZWQgdG8gYmUgYWN0dWFsbHkgcmV1c2VkIGFjcm9zcyB0aHJlYWRzLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX3JlY29yZF9kZWFsbG9jYXRpb24odm9pZCAqYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uICAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfYWxsb2NhdGlvbl9wdHIgICBJVFROT1RJRllfTkFNRShtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbl9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlY29yZF9hbGxvY2F0aW9uX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbihhZGRyKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfcmVjb3JkX2FsbG9jYXRpb25fcHRyICAgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX0lORFVDVElPTl9VU0VTIHN1cHBvcnQKKyAqCisgKiBOb3RlIHBhcnRpY3VsYXIgc3RvcmFnZSBpcyBpbmR1Y3RpdmUgdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXModm9pZCogYWRkciwgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2luZHVjdGlvbl91c2VzKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfaW5kdWN0aW9uX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlcyhhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tb2RlbF9pbmR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfaW5kdWN0aW9uX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9SRURVQ1RJT05fVVNFUyBzdXBwb3J0CisgKgorICogTm90ZSBwYXJ0aWN1bGFyIHN0b3JhZ2UgaXMgdXNlZCBmb3IgcmVkdWN0aW9uIHRocm91Z2ggdGhlIGVuZAorICogb2YgdGhlIGN1cnJlbnQgc2l0ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfcmVkdWN0aW9uX3VzZXMpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9yZWR1Y3Rpb25fdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21vZGVsX3JlZHVjdGlvbl91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9yZWR1Y3Rpb25fdXNlc19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEFOTk9UQVRFX09CU0VSVkVfVVNFUyBzdXBwb3J0CisgKgorICogSGF2ZSBjb3JyZWN0bmVzcyBtb2RlbGluZyByZWNvcmQgb2JzZXJ2YXRpb25zIGFib3V0IHVzZXMgb2Ygc3RvcmFnZQorICogdGhyb3VnaCB0aGUgZW5kIG9mIHRoZSBjdXJyZW50IHNpdGUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfb2JzZXJ2ZV91c2VzLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX29ic2VydmVfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciBJVFROT1RJRllfTkFNRShtb2RlbF9vYnNlcnZlX3VzZXMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXMoYWRkciwgc2l6ZSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfb2JzZXJ2ZV91c2VzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tb2RlbF9vYnNlcnZlX3VzZXNfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBBTk5PVEFURV9DTEVBUl9VU0VTIHN1cHBvcnQKKyAqCisgKiBDbGVhciB0aGUgc3BlY2lhbCBoYW5kbGluZyBvZiBhIHBpZWNlIG9mIHN0b3JhZ2UgcmVsYXRlZCB0byBpbmR1Y3Rpb24sCisgKiByZWR1Y3Rpb24gb3Igb2JzZXJ2ZV91c2VzCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2NsZWFyX3VzZXModm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2NsZWFyX3VzZXMsICh2b2lkICphZGRyKSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlcyAgICAgSVRUTk9USUZZX1ZPSUQobW9kZWxfY2xlYXJfdXNlcykKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfY2xlYXJfdXNlcykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXMoYWRkcikKKyNkZWZpbmUgX19pdHRfbW9kZWxfY2xlYXJfdXNlc19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21vZGVsX2NsZWFyX3VzZXNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQU5OT1RBVEVfRElTQUJMRV8qX1BVU0gvQU5OT1RBVEVfRElTQUJMRV8qX1BPUCBzdXBwb3J0CisgKgorICogZGlzYWJsZV9wdXNoL2Rpc2FibGVfcG9wIHB1c2ggYW5kIHBvcCBkaXNhYmxpbmcgYmFzZWQgb24gYSBwYXJhbWV0ZXIuCisgKiBEaXNhYmxpbmcgb2JzZXJ2YXRpb25zIHN0b3BzIHByb2Nlc3Npbmcgb2YgbWVtb3J5IHJlZmVyZW5jZXMgZHVyaW5nCisgKiBjb3JyZWN0bmVzcyBtb2RlbGluZywgYW5kIGFsbCBhbm5vdGF0aW9ucyB0aGF0IG9jY3VyIGluIHRoZSBkaXNhYmxlZAorICogcmVnaW9uLiAgVGhpcyBhbGxvd3MgZGVzY3JpcHRpb24gb2YgY29kZSB0aGF0IGlzIGV4cGVjdGVkIHRvIGJlIGhhbmRsZWQKKyAqIHNwZWNpYWxseSBkdXJpbmcgY29udmVyc2lvbiB0byBwYXJhbGxlbGlzbSBvciB0aGF0IGlzIG5vdCByZWNvZ25pemVkCisgKiBieSB0b29scyAoZS5nLiBzb21lIGtpbmRzIG9mIHN5bmNocm9uaXphdGlvbiBvcGVyYXRpb25zLikKKyAqIFRoaXMgbWVjaGFuaXNtIGNhdXNlcyBhbGwgYW5ub3RhdGlvbnMgaW4gdGhlIGRpc2FibGVkIHJlZ2lvbiwgb3RoZXIKKyAqIHRoYW4gZGlzYWJsZV9wdXNoIGFuZCBkaXNhYmxlX3BvcCwgdG8gYmUgaWdub3JlZC4gIChGb3IgZXhhbXBsZSwgdGhpcworICogbWlnaHQgdmFsaWRseSBiZSB1c2VkIHRvIGRpc2FibGUgYW4gZW50aXJlIHBhcmFsbGVsIHNpdGUgYW5kIHRoZSBjb250YWluZWQKKyAqIHRhc2tzIGFuZCBsb2NraW5nIGluIGl0IGZvciBkYXRhIGNvbGxlY3Rpb24gcHVycG9zZXMuKQorICogVGhlIGRpc2FibGUgZm9yIGNvbGxlY3Rpb24gaXMgYSBtb3JlIGV4cGVuc2l2ZSBvcGVyYXRpb24sIGJ1dCByZWR1Y2VzCisgKiBjb2xsZWN0b3Igb3ZlcmhlYWQgc2lnbmlmaWNhbnRseS4gIFRoaXMgYXBwbGllcyB0byBCT1RIIGNvcnJlY3RuZXNzIGRhdGEKKyAqIGNvbGxlY3Rpb24gYW5kIHBlcmZvcm1hbmNlIGRhdGEgY29sbGVjdGlvbi4gIEZvciBleGFtcGxlLCBhIHNpdGUKKyAqIGNvbnRhaW5pbmcgYSB0YXNrIG1pZ2h0IG9ubHkgZW5hYmxlIGRhdGEgY29sbGVjdGlvbiBmb3IgdGhlIGZpcnN0IDEwCisgKiBpdGVyYXRpb25zLiAgQm90aCBwZXJmb3JtYW5jZSBhbmQgY29ycmVjdG5lc3MgZGF0YSBzaG91bGQgcmVmbGVjdCB0aGlzLAorICogYW5kIHRoZSBwcm9ncmFtIHNob3VsZCBydW4gYXMgY2xvc2UgdG8gZnVsbCBzcGVlZCBhcyBwb3NzaWJsZSB3aGVuCisgKiBjb2xsZWN0aW9uIGlzIGRpc2FibGVkLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9tb2RlbF9kaXNhYmxlX3B1c2goX19pdHRfbW9kZWxfZGlzYWJsZSB4KTsKK3ZvaWQgSVRUQVBJIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wKHZvaWQpOwordm9pZCBJVFRBUEkgX19pdHRfbW9kZWxfYWdncmVnYXRlX3Rhc2soc2l6ZV90IHgpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsIChfX2l0dF9tb2RlbF9kaXNhYmxlIHgpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfZGlzYWJsZV9wb3AsICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgKHNpemVfdCB4KSkKKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoICAgICBJVFROT1RJRllfVk9JRChtb2RlbF9kaXNhYmxlX3B1c2gpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgSVRUTk9USUZZX05BTUUobW9kZWxfZGlzYWJsZV9wdXNoKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcF9wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2Rpc2FibGVfcG9wKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFzayAgICAgIElUVE5PVElGWV9WT0lEKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2RlZmluZSBfX2l0dF9tb2RlbF9hZ2dyZWdhdGVfdGFza19wdHIgIElUVE5PVElGWV9OQU1FKG1vZGVsX2FnZ3JlZ2F0ZV90YXNrKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcHVzaF9wdHIgMAorI2RlZmluZSBfX2l0dF9tb2RlbF9kaXNhYmxlX3BvcCgpCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrKHgpCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbW9kZWxfZGlzYWJsZV9wdXNoX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2Rpc2FibGVfcG9wX3B0ciAwCisjZGVmaW5lIF9faXR0X21vZGVsX2FnZ3JlZ2F0ZV90YXNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbW9kZWwgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgaGVhcCBIZWFwCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEhlYXAgZ3JvdXAKKyAqIEB7CisgKi8KKwordHlwZWRlZiB2b2lkKiBfX2l0dF9oZWFwX2Z1bmN0aW9uOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gaWRlbnRpZmljYXRpb24gZm9yIGhlYXAgZnVuY3Rpb24KKyAqIEByZXR1cm4gbm9uLXplcm8gaWRlbnRpZmllciBvciBOVUxMCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2hlYXBfZnVuY3Rpb24gSVRUQVBJIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQShjb25zdCBjaGFyKiAgICBuYW1lLCBjb25zdCBjaGFyKiAgICBkb21haW4pOworX19pdHRfaGVhcF9mdW5jdGlvbiBJVFRBUEkgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZV9wdHIgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZSAgICAgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9oZWFwX2Z1bmN0aW9uIElUVEFQSSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZShjb25zdCBjaGFyKiBuYW1lLCBjb25zdCBjaGFyKiBkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlQSwgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QqIG5hbWUsIGNvbnN0IHdjaGFyX3QqIGRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlLCAgKGNvbnN0IGNoYXIqICAgIG5hbWUsIGNvbnN0IGNoYXIqICAgIGRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnVuY3Rpb25fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShoZWFwX2Z1bmN0aW9uX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlICAgICAgSVRUTk9USUZZX0RBVEEoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgSVRUTk9USUZZX05BTUUoaGVhcF9mdW5jdGlvbl9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZUEobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9oZWFwX2Z1bmN0aW9uX2NyZWF0ZVcobmFtZSwgZG9tYWluKSAoX19pdHRfaGVhcF9mdW5jdGlvbikwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlKG5hbWUsIGRvbWFpbikgIChfX2l0dF9oZWFwX2Z1bmN0aW9uKTAKKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfaGVhcF9mdW5jdGlvbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnVuY3Rpb25fY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBSZWNvcmQgYW4gYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luICAgICBJVFROT1RJRllfVk9JRChoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2FsbG9jYXRlX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbihoLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBhbGxvY2F0aW9uIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9hbGxvY2F0ZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqKiBhZGRyLCBzaXplX3Qgc2l6ZSwgaW50IGluaXRpYWxpemVkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfYWxsb2NhdGVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZF9wdHIgSVRUTk9USUZZX05BTUUoaGVhcF9hbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2FsbG9jYXRlX2VuZChoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9hbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfYWxsb2NhdGVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGZyZWUgYmVnaW4gb2NjdXJyZW5jZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9mcmVlX2JlZ2luKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcikpCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbiAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9mcmVlX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfZnJlZV9iZWdpbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbihoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfZnJlZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBmcmVlIGVuZCBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ZyZWVfZW5kKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfZnJlZV9lbmQsIChfX2l0dF9oZWFwX2Z1bmN0aW9uIGgsIHZvaWQqIGFkZHIpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kICAgICBJVFROT1RJRllfVk9JRChoZWFwX2ZyZWVfZW5kKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ZyZWVfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9mcmVlX2VuZChoLCBhZGRyKQorI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ZyZWVfZW5kX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIHJlYWxsb2NhdGlvbiBiZWdpbiBvY2N1cnJlbmNlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVhbGxvY2F0ZV9iZWdpbiwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9iZWdpbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWFsbG9jYXRlX2JlZ2luX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlYWxsb2NhdGVfYmVnaW4pCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW4oaCwgYWRkciwgbmV3X3NpemUsIGluaXRpYWxpemVkKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfYmVnaW5fcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9iZWdpbl9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiByZWFsbG9jYXRpb24gZW5kIG9jY3VycmVuY2UuCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiBhZGRyLCB2b2lkKiogbmV3X2FkZHIsIHNpemVfdCBuZXdfc2l6ZSwgaW50IGluaXRpYWxpemVkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCogYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCkpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVhbGxvY2F0ZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlYWxsb2NhdGVfZW5kKGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVhbGxvY2F0ZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGJyaWVmIGludGVybmFsIGFjY2VzcyBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4odm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIElUVE5PVElGWV9OQU1FKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4oKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiBpbnRlcm5hbCBhY2Nlc3MgZW5kICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX2ludGVybmFsX2FjY2Vzc19lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX2ludGVybmFsX2FjY2Vzc19lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBiZWdpbiAqLwordm9pZCBJVFRBUEkgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbih2b2lkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiwgICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbiAgICAgIElUVE5PVElGWV9WT0lEKGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4pCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbigpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW5fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9iZWdpbl9wdHIgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBicmllZiByZWNvcmQgbWVtb3J5IGdyb3d0aCBlbmQgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCAgICAgSVRUTk9USUZZX1ZPSUQoaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kX3B0ciBJVFROT1RJRllfTkFNRShoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfZW5kKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBTcGVjaWZ5IHRoZSB0eXBlIG9mIGhlYXAgZGV0ZWN0aW9uL3JlcG9ydGluZyB0byBtb2RpZnkuCisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIFJlcG9ydCBvbiBtZW1vcnkgbGVha3MuCisgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9sZWFrcyAweDAwMDAwMDAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIFJlcG9ydCBvbiBtZW1vcnkgZ3Jvd3RoLgorICovCisjZGVmaW5lIF9faXR0X2hlYXBfZ3Jvd3RoIDB4MDAwMDAwMDIKKworCisvKiogQGJyaWVmIGhlYXAgcmVzZXQgZGV0ZWN0aW9uICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3Jlc2V0X2RldGVjdGlvbih1bnNpZ25lZCBpbnQgcmVzZXRfbWFzayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVzZXRfZGV0ZWN0aW9uLCAgKHVuc2lnbmVkIGludCByZXNldF9tYXNrKSkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb24gICAgICBJVFROT1RJRllfVk9JRChoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICBJVFROT1RJRllfTkFNRShoZWFwX3Jlc2V0X2RldGVjdGlvbikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVzZXRfZGV0ZWN0aW9uKCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZXNldF9kZXRlY3Rpb25fcHRyICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgcmVwb3J0ICovCit2b2lkIElUVEFQSSBfX2l0dF9oZWFwX3JlY29yZCh1bnNpZ25lZCBpbnQgcmVjb3JkX21hc2spOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZCwgKHVuc2lnbmVkIGludCByZWNvcmRfbWFzaykpCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkICAgICBJVFROT1RJRllfVk9JRChoZWFwX3JlY29yZCkKKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmRfcHRyIElUVE5PVElGWV9OQU1FKGhlYXBfcmVjb3JkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfaGVhcF9yZWNvcmQoKQorI2RlZmluZSBfX2l0dF9oZWFwX3JlY29yZF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2hlYXBfcmVjb3JkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAfSBoZWFwIGdyb3VwICovCisvKiogQGVuZGNvbmQgKi8KKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisKKy8qKgorICogQGRlZmdyb3VwIGRvbWFpbnMgRG9tYWlucworICogQGluZ3JvdXAgcHVibGljCisgKiBEb21haW5zIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9kb21haW4KK3sKKyAgICB2b2xhdGlsZSBpbnQgZmxhZ3M7IC8qITwgWmVybyBpZiBkaXNhYmxlZCwgbm9uLXplcm8gaWYgZW5hYmxlZC4gVGhlIG1lYW5pbmcgb2YgZGlmZmVyZW50IG5vbi16ZXJvIHZhbHVlcyBpcyByZXNlcnZlZCB0byB0aGUgcnVudGltZSAqLworICAgIGNvbnN0IGNoYXIqIG5hbWVBOyAgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIG5hbWVXOyAvKiE8IENvcHkgb2Ygb3JpZ2luYWwgbmFtZSBpbiBVTklDT0RFLiAqLworI2Vsc2UgIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyAgICB2b2lkKiBuYW1lVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogZXh0cmEyOyAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qIG5leHQ7Cit9IF9faXR0X2RvbWFpbjsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGRvbWFpbnMKKyAqIEBicmllZiBDcmVhdGUgYSBkb21haW4uCisgKiBDcmVhdGUgZG9tYWluIHVzaW5nIHNvbWUgZG9tYWluIG5hbWU6IHRoZSBVUkkgbmFtaW5nIHN0eWxlIGlzIHJlY29tbWVuZGVkLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MKKyAqIGV4ZWN1dGlvbiB0aW1lLCB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2YKKyAqIHdoaWNoIHRocmVhZCBjcmVhdGVkIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gbmFtZSBuYW1lIG9mIGRvbWFpbgorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9kb21haW4qIElUVEFQSSBfX2l0dF9kb21haW5fY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X2RvbWFpbiogSVRUQVBJIF9faXR0X2RvbWFpbl9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlICAgICBfX2l0dF9kb21haW5fY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVfcHRyIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUgICAgIF9faXR0X2RvbWFpbl9jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZG9tYWluKiBJVFRBUEkgX19pdHRfZG9tYWluX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKGRvbWFpbl9jcmVhdGVXKQorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEoZG9tYWluX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBKG5hbWUpIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZVcobmFtZSkgKF9faXR0X2RvbWFpbiopMAorI2RlZmluZSBfX2l0dF9kb21haW5fY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGUobmFtZSkgIChfX2l0dF9kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2RvbWFpbl9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZG9tYWluX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBkb21haW5zIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGlkcyBJRHMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogSURzIGdyb3VwCisgKiBAeworICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9pZAoreworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBkMSwgZDIsIGQzOworfSBfX2l0dF9pZDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCitzdGF0aWMgY29uc3QgX19pdHRfaWQgX19pdHRfbnVsbCA9IHsgMCwgMCwgMCB9OworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIEEgY29udmVuaWVuY2UgZnVuY3Rpb24gaXMgcHJvdmlkZWQgdG8gY3JlYXRlIGFuIElEIHdpdGhvdXQgZG9tYWluIGNvbnRyb2wuCisgKiBAYnJpZWYgVGhpcyBpcyBhIGNvbnZlbmllbmNlIGZ1bmN0aW9uIHRvIGluaXRpYWxpemUgYW4gX19pdHRfaWQgc3RydWN0dXJlLgorICogQWZ0ZXIgeW91IG1ha2UgdGhlIElEIHdpdGggdGhpcyBmdW5jdGlvbiwgeW91IHN0aWxsIG11c3QgY3JlYXRlIGl0IHdpdGggdGhlCisgKiBfX2l0dF9pZF9jcmVhdGUgZnVuY3Rpb24gYmVmb3JlIHVzaW5nIHRoZSBJRCB0byBpZGVudGlmeSBhIG5hbWVkIGVudGl0eS4KKyAqIEBwYXJhbVtpbl0gYWRkciBUaGUgYWRkcmVzcyBvZiBvYmplY3Q7IGhpZ2ggUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICogQHBhcmFtW2luXSBleHRyYSBUaGUgZXh0cmEgZGF0YSB0byB1bmlxdWUgaWRlbnRpZnkgb2JqZWN0OyBsb3cgUVdPUkQgb2YgdGhlIElEIHZhbHVlLgorICovCisKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgX19pdHRfaWQgSVRUQVBJIF9faXR0X2lkX21ha2Uodm9pZCogYWRkciwgdW5zaWduZWQgbG9uZyBsb25nIGV4dHJhKQoreworICAgIF9faXR0X2lkIGlkID0gX19pdHRfbnVsbDsKKyAgICBpZC5kMSA9ICh1bnNpZ25lZCBsb25nIGxvbmcpKCh1aW50cHRyX3QpYWRkcik7CisgICAgaWQuZDIgPSAodW5zaWduZWQgbG9uZyBsb25nKWV4dHJhOworICAgIGlkLmQzID0gKHVuc2lnbmVkIGxvbmcgbG9uZykwOyAvKiBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICovCisgICAgcmV0dXJuIGlkOworfQorCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIENyZWF0ZSBhbiBpbnN0YW5jZSBvZiBpZGVudGlmaWVyLgorICogVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZiBhbiBpbnN0YW5jZSBvZgorICogdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElECisgKiBjYW4gYmUgdXNlZCB0byB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzCisgKiBfX2l0dF90YXNrX2JlZ2luLCBhbmQgdG8gc3BlY2lmeSByZWxhdGlvbnNoaXBzIGFtb25nCisgKiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBpbnN0YW5jZXMsIHVzaW5nIHRoZSBccmVmIHJlbGF0aW9ucyBBUElzLgorICogSW5zdGFuY2UgSURzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljIQorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gaWQgVGhlIElEIHRvIGNyZWF0ZS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfY3JlYXRlKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCkpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2NyZWF0ZSxkLHgpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZShkb21haW4saWQpCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGlkcworICogQGJyaWVmIERlc3Ryb3kgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4KKyAqIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIHZhbHVlIGluIHRoZSB0cmFjZS4KKyAqIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUgaW52YWxpZC4KKyAqIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveShjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBpZF9kZXN0cm95LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveShkLHgpIElUVE5PVElGWV9WT0lEX0QxKGlkX2Rlc3Ryb3ksZCx4KQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3koZG9tYWluLGlkKQorI2RlZmluZSBfX2l0dF9pZF9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGlkcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBoYW5kbGVzcyBTdHJpbmcgSGFuZGxlcworICogQGluZ3JvdXAgcHVibGljCisgKiBTdHJpbmcgSGFuZGxlcyBncm91cAorICogQHsKKyAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfc3RyaW5nX2hhbmRsZQoreworICAgIGNvbnN0IGNoYXIqIHN0ckE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gQVNDSUkuICovCisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorICAgIGNvbnN0IHdjaGFyX3QqIHN0clc7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBzdHJpbmcgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogc3RyVzsKKyNlbmRpZiAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgaW50ICAgZXh0cmExOyAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICAqLworICAgIHZvaWQqIGV4dHJhMjsgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIG5leHQ7Cit9IF9faXR0X3N0cmluZ19oYW5kbGU7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBoYW5kbGVzCisgKiBAYnJpZWYgQ3JlYXRlIGEgc3RyaW5nIGhhbmRsZS4KKyAqIENyZWF0ZSBhbmQgcmV0dXJuIGhhbmRsZSB2YWx1ZSB0aGF0IGNhbiBiZSBhc3NvY2lhdGVkIHdpdGggYSBzdHJpbmcuCisgKiBDb25zZWN1dGl2ZSBjYWxscyB0byBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZSB3aXRoIHRoZSBzYW1lIG5hbWUKKyAqIHJldHVybiB0aGUgc2FtZSB2YWx1ZS4gQmVjYXVzZSB0aGUgc2V0IG9mIHN0cmluZyBoYW5kbGVzIGlzIGV4cGVjdGVkIHRvIHJlbWFpbgorICogc3RhdGljIGR1cmluZyB0aGUgYXBwbGljYXRpb24ncyBleGVjdXRpb24gdGltZSwgdGhlcmUgaXMgbm8gbWVjaGFuaXNtIHRvIGRlc3Ryb3kgYSBzdHJpbmcgaGFuZGxlLgorICogQW55IHN0cmluZyBoYW5kbGUgY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBzdHJpbmcgaGFuZGxlLiBUaGlzIGNhbGwgaXMgdGhyZWFkLXNhZmUuCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIGlucHV0IHN0cmluZworICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUpOworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVyhjb25zdCB3Y2hhcl90ICpuYW1lKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUgICAgIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlKGNvbnN0IGNoYXIgKm5hbWUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHN0cmluZ19oYW5kbGVfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBKG5hbWUpIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9zdHJpbmdfaGFuZGxlX2NyZWF0ZVcobmFtZSkgKF9faXR0X3N0cmluZ19oYW5kbGUqKTAKKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGUobmFtZSkgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3RyaW5nX2hhbmRsZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N0cmluZ19oYW5kbGVfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGhhbmRsZXMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBfX2l0dF90aW1lc3RhbXA7CisvKiogQGVuZGNvbmQgKi8KKworc3RhdGljIGNvbnN0IF9faXR0X3RpbWVzdGFtcCBfX2l0dF90aW1lc3RhbXBfbm9uZSA9IChfX2l0dF90aW1lc3RhbXApLTFMTDsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBpbmdyb3VwIHRpbWVzdGFtcHMKKyAqIEBicmllZiBSZXR1cm4gdGltZXN0YW1wIGNvcnJlc3BvbmRpbmcgdG8gdGhlIGN1cnJlbnQgbW9tZW50LgorICogVGhpcyByZXR1cm5zIHRoZSB0aW1lc3RhbXAgaW4gdGhlIGZvcm1hdCB0aGF0IGlzIHRoZSBtb3N0IHJlbGV2YW50IGZvciB0aGUgY3VycmVudAorICogaG9zdCBvciBwbGF0Zm9ybSAoUkRUU0MsIFFQQywgYW5kIG90aGVycykuIFlvdSBjYW4gdXNlIHRoZSAiPCIgb3BlcmF0b3IgdG8KKyAqIGNvbXBhcmUgX19pdHRfdGltZXN0YW1wIHZhbHVlcy4KKyAqLworX19pdHRfdGltZXN0YW1wIElUVEFQSSBfX2l0dF9nZXRfdGltZXN0YW1wKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RpbWVzdGFtcCwgZ2V0X3RpbWVzdGFtcCwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wICAgICAgSVRUTk9USUZZX0RBVEEoZ2V0X3RpbWVzdGFtcCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgIElUVE5PVElGWV9OQU1FKGdldF90aW1lc3RhbXApCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9nZXRfdGltZXN0YW1wKCkKKyNkZWZpbmUgX19pdHRfZ2V0X3RpbWVzdGFtcF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2dldF90aW1lc3RhbXBfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0aW1lc3RhbXBzICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9ncGFfZG9jdW1lbnRhdGlvbiAqLworCisvKioKKyAqIEBkZWZncm91cCByZWdpb25zIFJlZ2lvbnMKKyAqIEBpbmdyb3VwIHB1YmxpYworICogUmVnaW9ucyBncm91cAorICogQHsKKyAqLworLyoqCisgKiBAaW5ncm91cCByZWdpb25zCisgKiBAYnJpZWYgQmVnaW4gb2YgcmVnaW9uIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9yZWdpb25fYmVnaW4gd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZAorICogdW50aWwgYSBjYWxsIHRvIF9faXR0X3JlZ2lvbl9lbmQgd2l0aCB0aGUgc2FtZSBJRAorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoZSBwYXJlbnQgb2YgdGhpcyByZWdpb24gaW5zdGFuY2UsIG9yIF9faXR0X251bGwKKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHJlZ2lvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgcmVnaW9ucworICogQGJyaWVmIEVuZCBvZiByZWdpb24gaW5zdGFuY2UuCisgKiBUaGUgZmlyc3QgY2FsbCB0byBfX2l0dF9yZWdpb25fZW5kIHdpdGggYSBnaXZlbiBJRCBlbmRzIHRoZQorICogcmVnaW9uLiBTdWNjZXNzaXZlIGNhbGxzIHdpdGggdGhlIHNhbWUgSUQgYXJlIGlnbm9yZWQsIGFzIGFyZQorICogY2FsbHMgdGhhdCBkbyBub3QgaGF2ZSBhIG1hdGNoaW5nIF9faXR0X3JlZ2lvbl9iZWdpbiBjYWxsLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyByZWdpb24gaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIHJlZ2lvbiBpbnN0YW5jZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWdpb25fZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlZ2lvbl9iZWdpbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVnaW9uX2VuZCwgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHJlZ2lvbl9iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWdpb25fYmVnaW5fcHRyICAgICAgSVRUTk9USUZZX05BTUUocmVnaW9uX2JlZ2luKQorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkgICAgICAgSVRUTk9USUZZX1ZPSURfRDEocmVnaW9uX2VuZCxkLHgpCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShyZWdpb25fZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luKGQseCx5LHopCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9iZWdpbl9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWdpb25fZW5kKGQseCkKKyNkZWZpbmUgX19pdHRfcmVnaW9uX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfcmVnaW9uX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X3JlZ2lvbl9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHJlZ2lvbnMgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgcHVibGljCisgKiBGcmFtZXMgYXJlIHNpbWlsYXIgdG8gcmVnaW9ucywgYnV0IGFyZSBpbnRlbmRlZCB0byBiZSBlYXNpZXIgdG8gdXNlIGFuZCB0byBpbXBsZW1lbnQuCisgKiBJbiBwYXJ0aWN1bGFyOgorICogLSBGcmFtZXMgYWx3YXlzIHJlcHJlc2VudCBwZXJpb2RzIG9mIGVsYXBzZWQgdGltZQorICogLSBCeSBkZWZhdWx0LCBmcmFtZXMgaGF2ZSBubyBuZXN0aW5nIHJlbGF0aW9uc2hpcHMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAaW5ncm91cCBmcmFtZXMKKyAqIEBicmllZiBCZWdpbiBhIGZyYW1lIGluc3RhbmNlLgorICogU3VjY2Vzc2l2ZSBjYWxscyB0byBfX2l0dF9mcmFtZV9iZWdpbiB3aXRoIHRoZQorICogc2FtZSBJRCBhcmUgaWdub3JlZCB1bnRpbCBhIGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggdGhlIHNhbWUgSUQuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBmcmFtZSBpbnN0YW5jZSBvciBOVUxMCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIEVuZCBhIGZyYW1lIGluc3RhbmNlLgorICogVGhlIGZpcnN0IGNhbGwgdG8gX19pdHRfZnJhbWVfZW5kIHdpdGggYSBnaXZlbiBJRAorICogZW5kcyB0aGUgZnJhbWUuIFN1Y2Nlc3NpdmUgY2FsbHMgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZCwgYXMgYXJlCisgKiBjYWxscyB0aGF0IGRvIG5vdCBoYXZlIGEgbWF0Y2hpbmcgX19pdHRfZnJhbWVfYmVnaW4gY2FsbC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwgZm9yIGN1cnJlbnQKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfZW5kX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpOworCisvKioKKyAqIEBpbmdyb3VwIGZyYW1lcworICogQGJyaWVmIFN1Ym1pdHMgYSBmcmFtZSBpbnN0YW5jZS4KKyAqIFN1Y2Nlc3NpdmUgY2FsbHMgdG8gX19pdHRfZnJhbWVfYmVnaW4gb3IgX19pdHRfZnJhbWVfc3VibWl0IHdpdGggdGhlCisgKiBzYW1lIElEIGFyZSBpZ25vcmVkIHVudGlsIGEgY2FsbCB0byBfX2l0dF9mcmFtZV9lbmQgb3IgX19pdHRfZnJhbWVfc3VibWl0CisgKiB3aXRoIHRoZSBzYW1lIElELgorICogUGFzc2luZyBzcGVjaWFsIF9faXR0X3RpbWVzdGFtcF9ub25lIHZhbHVlIGFzICJlbmQiIGFyZ3VtZW50IG1lYW5zCisgKiB0YWtlIHRoZSBjdXJyZW50IHRpbWVzdGFtcCBhcyB0aGUgZW5kIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgZnJhbWUgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGlzIGZyYW1lIGluc3RhbmNlIG9yIE5VTEwKKyAqIEBwYXJhbVtpbl0gYmVnaW4gVGltZXN0YW1wIG9mIHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZyYW1lCisgKiBAcGFyYW1baW5dIGVuZCBUaW1lc3RhbXAgb2YgdGhlIGVuZCBvZiB0aGUgZnJhbWUKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfZnJhbWVfc3VibWl0X3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsCisgICAgX19pdHRfdGltZXN0YW1wIGJlZ2luLCBfX2l0dF90aW1lc3RhbXAgZW5kKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW5fdjMsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmRfdjMsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX3N1Ym1pdF92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQsIF9faXR0X3RpbWVzdGFtcCBiZWdpbiwgX19pdHRfdGltZXN0YW1wIGVuZCkpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGQseCkgICAgICBJVFROT1RJRllfVk9JRF9EMShmcmFtZV9iZWdpbl92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzX3B0ciAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9iZWdpbl92MykKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGQseCkgICAgICAgIElUVE5PVElGWV9WT0lEX0QxKGZyYW1lX2VuZF92MyxkLHgpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF92M19wdHIgICAgICAgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmRfdjMpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92MyhkLHgsYixlKSBJVFROT1RJRllfVk9JRF9EMyhmcmFtZV9zdWJtaXRfdjMsZCx4LGIsZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKGZyYW1lX3N1Ym1pdF92MykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzKGRvbWFpbixpZCkKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzKGRvbWFpbixpZCxiZWdpbixlbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX3N1Ym1pdF92M19wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fdjNfcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kX3YzX3B0ciAgIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfc3VibWl0X3YzX3B0ciAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBmcmFtZXMgZ3JvdXAgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrZ3JvdXAgVGFzayBHcm91cAorICogQGluZ3JvdXAgcHVibGljCisgKiBUYXNrIEdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBpbmdyb3VwIHRhc2tfZ3JvdXBzCisgKiBAYnJpZWYgRGVub3RlcyBhIHRhc2tfZ3JvdXAgaW5zdGFuY2UuCisgKiBTdWNjZXNzaXZlIGNhbGxzIHRvIF9faXR0X3Rhc2tfZ3JvdXAgd2l0aCB0aGUgc2FtZSBJRCBhcmUgaWdub3JlZC4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZQorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZS4gTXVzdCBub3QgYmUgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIGluc3RhbmNlIElEIGZvciB0aGUgcGFyZW50IG9mIHRoaXMgdGFza19ncm91cCBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2tfZ3JvdXAKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19ncm91cChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19ncm91cCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwKGQseCx5LHopIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfZ3JvdXAsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2dyb3VwKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cChkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2dyb3VwX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19ncm91cF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IHRhc2tncm91cCBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCB0YXNrcyBUYXNrcworICogQGluZ3JvdXAgcHVibGljCisgKiBBIHRhc2sgaW5zdGFuY2UgcmVwcmVzZW50cyBhIHBpZWNlIG9mIHdvcmsgcGVyZm9ybWVkIGJ5IGEgcGFydGljdWxhcgorICogdGhyZWFkIGZvciBhIHBlcmlvZCBvZiB0aW1lLiBBIGNhbGwgdG8gX19pdHRfdGFza19iZWdpbiBjcmVhdGVzIGEKKyAqIHRhc2sgaW5zdGFuY2UuIFRoaXMgYmVjb21lcyB0aGUgY3VycmVudCBpbnN0YW5jZSBmb3IgdGhhdCB0YXNrIG9uIHRoYXQKKyAqIHRocmVhZC4gQSBmb2xsb3dpbmcgY2FsbCB0byBfX2l0dF90YXNrX2VuZCBvbiB0aGUgc2FtZSB0aHJlYWQgZW5kcyB0aGUKKyAqIGluc3RhbmNlLiBUaGVyZSBtYXkgYmUgbXVsdGlwbGUgc2ltdWx0YW5lb3VzIGluc3RhbmNlcyBvZiB0YXNrcyB3aXRoIHRoZQorICogc2FtZSBuYW1lIG9uIGRpZmZlcmVudCB0aHJlYWRzLiBJZiBhbiBJRCBpcyBzcGVjaWZpZWQsIHRoZSB0YXNrIGluc3RhbmNlCisgKiByZWNlaXZlcyB0aGF0IElELiBOZXN0ZWQgdGFza3MgYXJlIGFsbG93ZWQuCisgKgorICogTm90ZTogVGhlIHRhc2sgaXMgZGVmaW5lZCBieSB0aGUgYnJhY2tldGluZyBvZiBfX2l0dF90YXNrX2JlZ2luIGFuZAorICogX19pdHRfdGFza19lbmQgb24gdGhlIHNhbWUgdGhyZWFkLiBJZiBzb21lIHNjaGVkdWxpbmcgbWVjaGFuaXNtIGNhdXNlcworICogdGFzayBzd2l0Y2hpbmcgKHRoZSB0aHJlYWQgZXhlY3V0ZXMgYSBkaWZmZXJlbnQgdXNlciB0YXNrKSBvciB0YXNrCisgKiBzd2l0Y2hpbmcgKHRoZSB1c2VyIHRhc2sgc3dpdGNoZXMgdG8gYSBkaWZmZXJlbnQgdGhyZWFkKSB0aGVuIHRoaXMgYnJlYWtzCisgKiB0aGUgbm90aW9uIG9mICBjdXJyZW50IGluc3RhbmNlLiBBZGRpdGlvbmFsIEFQSSBjYWxscyBhcmUgcmVxdWlyZWQgdG8KKyAqIGRlYWwgd2l0aCB0aGF0IHBvc3NpYmlsaXR5LgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpOworCisvKioKKyAqIEBpbmdyb3VwIHRhc2tzCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlIChtYXkgYmUgMCkKKyAqIEBwYXJhbVtpbl0gcGFyZW50aWQgVGhlIHBhcmVudCBvZiB0aGlzIHRhc2sgKG1heSBiZSAwKQorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm4oY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKTsKKworLyoqCisgKiBAaW5ncm91cCB0YXNrcworICogQGJyaWVmIEVuZCB0aGUgY3VycmVudCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbiwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbiwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kLCAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbikpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZCx4LHkseikgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX3B0ciAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm4oZCx4LHkseikgSVRUTk9USUZZX1ZPSURfRDModGFza19iZWdpbl9mbixkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kKGQpICAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDAodGFza19lbmQsZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfcHRyICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW4oZG9tYWluLGlkLHBhcmVudGlkLG5hbWUpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbihkb21haW4saWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fcHRyIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmQoZG9tYWluKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9wdHIgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9wdHIgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2ZuX3B0ciAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX3B0ciAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSB0YXNrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVycyBDb3VudGVycworICogQGluZ3JvdXAgcHVibGljCisgKiBDb3VudGVycyBhcmUgdXNlci1kZWZpbmVkIG9iamVjdHMgd2l0aCBhIG1vbm90b25pY2FsbHkgaW5jcmVhc2luZworICogdmFsdWUuIENvdW50ZXIgdmFsdWVzIGFyZSA2NC1iaXQgdW5zaWduZWQgaW50ZWdlcnMuIENvdW50ZXIgdmFsdWVzCisgKiBhcmUgdHJhY2tlZCBwZXItdGhyZWFkLiBDb3VudGVycyBoYXZlIG5hbWVzIHRoYXQgY2FuIGJlIGRpc3BsYXllZCBpbgorICogdGhlIHRvb2xzLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIGNvdW50ZXJzCisgKiBAYnJpZWYgSW5jcmVtZW50IGEgY291bnRlciBieSBvbmUuCisgKiBUaGUgZmlyc3QgY2FsbCB3aXRoIGEgZ2l2ZW4gbmFtZSBjcmVhdGVzIGEgY291bnRlciBieSB0aGF0IG5hbWUgYW5kIHNldHMgaXRzCisgKiB2YWx1ZSB0byB6ZXJvIG9uIGV2ZXJ5IHRocmVhZC4gU3VjY2Vzc2l2ZSBjYWxscyBpbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUKKyAqIG9uIHRoZSB0aHJlYWQgb24gd2hpY2ggdGhlIGNhbGwgaXMgaXNzdWVkLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbC4gQ291bnRlciBuYW1lcyBhcmUgbm90IGRvbWFpbiBzcGVjaWZpYy4KKyAqICAgICAgICAgICAgVGhlIGRvbWFpbiBhcmd1bWVudCBpcyB1c2VkIG9ubHkgdG8gZW5hYmxlIG9yIGRpc2FibGUgdGhlIEFQSSBjYWxscy4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGUgY291bnRlcgorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luY192Myhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY291bnRlcnMKKyAqIEBicmllZiBJbmNyZW1lbnQgYSBjb3VudGVyIGJ5IHRoZSB2YWx1ZSBzcGVjaWZpZWQgaW4gZGVsdGEuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsLiBDb3VudGVyIG5hbWVzIGFyZSBub3QgZG9tYWluIHNwZWNpZmljLgorICogICAgICAgICAgICBUaGUgZG9tYWluIGFyZ3VtZW50IGlzIHVzZWQgb25seSB0byBlbmFibGUgb3IgZGlzYWJsZSB0aGUgQVBJIGNhbGxzLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoZSBjb3VudGVyCisgKiBAcGFyYW1baW5dIGRlbHRhIFRoZSBhbW91bnQgYnkgd2hpY2ggdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgZGVsdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhX3YzLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIHVuc2lnbmVkIGxvbmcgbG9uZyBkZWx0YSkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzKGQseCkgICAgICAgICBJVFROT1RJRllfVk9JRF9EMShjb3VudGVyX2luY192MyxkLHgpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX3YzX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShjb3VudGVyX2luY192MykKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZCx4LHkpIElUVE5PVElGWV9WT0lEX0QyKGNvdW50ZXJfaW5jX2RlbHRhX3YzLGQseCx5KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV92M19wdHIgICAgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGFfdjMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY192Myhkb21haW4sbmFtZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjMoZG9tYWluLG5hbWUsZGVsdGEpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3YzX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfdjNfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfdjNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtYXJrZXJzIE1hcmtlcnMKKyAqIE1hcmtlcnMgcmVwcmVzZW50IGEgc2luZ2xlIGRpc2NyZWV0IGV2ZW50IGluIHRpbWUuIE1hcmtlcnMgaGF2ZSBhIHNjb3BlLAorICogZGVzY3JpYmVkIGJ5IGFuIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9zY29wZS4gTWFya2VycyBhcmUgY3JlYXRlZCBieQorICogdGhlIEFQSSBjYWxsIF9faXR0X21hcmtlci4gQSBtYXJrZXIgaW5zdGFuY2UgY2FuIGJlIGdpdmVuIGFuIElEIGZvciB1c2UgaW4KKyAqIGFkZGluZyBtZXRhZGF0YS4KKyAqIEB7CisgKi8KKworLyoqCisgKiBAYnJpZWYgRGVzY3JpYmVzIHRoZSBzY29wZSBvZiBhbiBldmVudCBvYmplY3QgaW4gdGhlIHRyYWNlLgorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9zY29wZV91bmtub3duID0gMCwKKyAgICBfX2l0dF9zY29wZV9nbG9iYWwsCisgICAgX19pdHRfc2NvcGVfdHJhY2tfZ3JvdXAsCisgICAgX19pdHRfc2NvcGVfdHJhY2ssCisgICAgX19pdHRfc2NvcGVfdGFzaywKKyAgICBfX2l0dF9zY29wZV9tYXJrZXIKK30gX19pdHRfc2NvcGU7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdW5rbm93biAgX19pdHRfc2NvcGVfdW5rbm93bgorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfZ2xvYmFsICAgX19pdHRfc2NvcGVfZ2xvYmFsCisjZGVmaW5lIF9faXR0X21hcmtlcl9zY29wZV9wcm9jZXNzICBfX2l0dF9zY29wZV90cmFja19ncm91cAorI2RlZmluZSBfX2l0dF9tYXJrZXJfc2NvcGVfdGhyZWFkICAgX19pdHRfc2NvcGVfdHJhY2sKKyNkZWZpbmUgX19pdHRfbWFya2VyX3Njb3BlX3Rhc2sgICAgIF9faXR0X3Njb3BlX3Rhc2sKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UKKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpbnN0YW5jZSBJRCBmb3IgdGhpcyBtYXJrZXIgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBzY29wZSBUaGUgc2NvcGUgZm9yIHRoaXMgbWFya2VyCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X21hcmtlcihjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcihkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhtYXJrZXIsZCx4LHkseikKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcihkb21haW4saWQsbmFtZSxzY29wZSkKKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWFya2VyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbWFya2VycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBtZXRhZGF0YSBNZXRhZGF0YQorICogVGhlIG1ldGFkYXRhIEFQSSBpcyB1c2VkIHRvIGF0dGFjaCBleHRyYSBpbmZvcm1hdGlvbiB0byBuYW1lZAorICogZW50aXRpZXMuIE1ldGFkYXRhIGNhbiBiZSBhdHRhY2hlZCB0byBhbiBpZGVudGlmaWVkIG5hbWVkIGVudGl0eSBieSBJRCwKKyAqIG9yIHRvIHRoZSBjdXJyZW50IGVudGl0eSAod2hpY2ggaXMgYWx3YXlzIGEgdGFzaykuCisgKgorICogQ29uY2VwdHVhbGx5IG1ldGFkYXRhIGhhcyBhIHR5cGUgKHdoYXQga2luZCBvZiBtZXRhZGF0YSksIGEga2V5ICh0aGUKKyAqIG5hbWUgb2YgdGhlIG1ldGFkYXRhKSwgYW5kIGEgdmFsdWUgKHRoZSBhY3R1YWwgZGF0YSkuIFRoZSBlbmNvZGluZyBvZgorICogdGhlIHZhbHVlIGRlcGVuZHMgb24gdGhlIHR5cGUgb2YgdGhlIG1ldGFkYXRhLgorICoKKyAqIFRoZSB0eXBlIG9mIG1ldGFkYXRhIGlzIHNwZWNpZmllZCBieSBhbiBlbnVtZXJhdGVkIHR5cGUgX19pdHRfbWV0ZGF0YV90eXBlLgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBkZXNjcmliZXMgdGhlIHR5cGUgb2YgbWV0YWRhdGEKKyAqLwordHlwZWRlZiBlbnVtIHsKKyAgICBfX2l0dF9tZXRhZGF0YV91bmtub3duID0gMCwKKyAgICBfX2l0dF9tZXRhZGF0YV91NjQsICAgICAvKio8IFVuc2lnbmVkIDY0LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczY0LCAgICAgLyoqPCBTaWduZWQgNjQtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MzIsICAgICAvKio8IFVuc2lnbmVkIDMyLWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczMyLCAgICAgLyoqPCBTaWduZWQgMzItYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV91MTYsICAgICAvKio8IFVuc2lnbmVkIDE2LWJpdCBpbnRlZ2VyICovCisgICAgX19pdHRfbWV0YWRhdGFfczE2LCAgICAgLyoqPCBTaWduZWQgMTYtYml0IGludGVnZXIgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9mbG9hdCwgICAvKio8IFNpZ25lZCAzMi1iaXQgZmxvYXRpbmctcG9pbnQgKi8KKyAgICBfX2l0dF9tZXRhZGF0YV9kb3VibGUgICAvKio8IFNJZ25lZCA2NC1iaXQgZmxvYXRpbmctcG9pbnQgKi8KK30gX19pdHRfbWV0YWRhdGFfdHlwZTsKKworLyoqCisgKiBAaW5ncm91cCBwYXJhbWV0ZXJzCisgKiBAYnJpZWYgQWRkIG1ldGFkYXRhIHRvIGFuIGluc3RhbmNlIG9mIGEgbmFtZWQgZW50aXR5LgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBjb250cm9sbGluZyB0aGUgY2FsbAorICogQHBhcmFtW2luXSBpZCBUaGUgaWRlbnRpZmllciBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkLCBvciBfX2l0dF9udWxsIHRvIGFkZCB0byB0aGUgY3VycmVudCB0YXNrCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSkpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkLGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfcHRyICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX2FkZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZChkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfYWRkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIGlkIFRoZSBpZGVudGlmaWVyIG9mIHRoZSBpbnN0YW5jZSB0byB3aGljaCB0aGUgbWV0YWRhdGEgaXMgdG8gYmUgYWRkZWQsIG9yIF9faXR0X251bGwgdG8gYWRkIHRvIHRoZSBjdXJyZW50IHRhc2sKKyAqIEBwYXJhbVtpbl0ga2V5IFRoZSBuYW1lIG9mIHRoZSBtZXRhZGF0YQorICogQHBhcmFtW2luXSBkYXRhIFRoZSBtZXRhZGF0YSBpdHNlbGYKKyAqIEBwYXJhbVtpbl0gbGVuZ3RoIFRoZSBudW1iZXIgb2YgY2hhcmFjdGVycyBpbiB0aGUgc3RyaW5nLCBvciAtMSBpZiB0aGUgbGVuZ3RoIGlzIHVua25vd24gYnV0IHRoZSBzdHJpbmcgaXMgbnVsbC10ZXJtaW5hdGVkCisqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkICAgICBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBCisjICBkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKTsKKyNlbmRpZgorCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEEoZCx4LHkseixhKSBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBX3B0ciAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZEEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZFcsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKG1ldGFkYXRhX3N0cl9hZGRXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKSAgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZCxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRBKGQseCx5LHosYSkKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFcoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGQoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIHBhcmFtZXRlcnMKKyAqIEBicmllZiBBZGQgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gdHlwZSBUaGUgdHlwZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gY291bnQgVGhlIG51bWJlciBvZiBlbGVtZW50cyBvZiB0aGUgZ2l2ZW4gdHlwZS4gSWYgY291bnQgPT0gMCwgbm8gbWV0YWRhdGEgd2lsbCBiZSBhZGRlZC4KKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisqLwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIF9faXR0X21ldGFkYXRhX3R5cGUgdHlwZSwgc2l6ZV90IGNvdW50LCB2b2lkICpkYXRhKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEsYikgSVRUTk9USUZZX1ZPSURfRDUobWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhLGIpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAgICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9hZGRfd2l0aF9zY29wZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlKGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9hZGRfd2l0aF9zY29wZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX2FkZF93aXRoX3Njb3BlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgcGFyYW1ldGVycworICogQGJyaWVmIEFkZCBzdHJpbmcgbWV0YWRhdGEgdG8gYW4gaW5zdGFuY2Ugb2YgYSBuYW1lZCBlbnRpdHkuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBjYWxsCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBvZiB0aGUgaW5zdGFuY2UgdG8gd2hpY2ggdGhlIG1ldGFkYXRhIGlzIHRvIGJlIGFkZGVkCisKKyAqIEBwYXJhbVtpbl0gaWQgVGhlIGlkZW50aWZpZXIgb2YgdGhlIGluc3RhbmNlIHRvIHdoaWNoIHRoZSBtZXRhZGF0YSBpcyB0byBiZSBhZGRlZCwgb3IgX19pdHRfbnVsbCB0byBhZGQgdG8gdGhlIGN1cnJlbnQgdGFzaworCisgKiBAcGFyYW1baW5dIGtleSBUaGUgbmFtZSBvZiB0aGUgbWV0YWRhdGEKKyAqIEBwYXJhbVtpbl0gZGF0YSBUaGUgbWV0YWRhdGEgaXRzZWxmCisgKiBAcGFyYW1baW5dIGxlbmd0aCBUaGUgbnVtYmVyIG9mIGNoYXJhY3RlcnMgaW4gdGhlIHN0cmluZywgb3IgLTEgaWYgdGhlIGxlbmd0aCBpcyB1bmtub3duIGJ1dCB0aGUgc3RyaW5nIGlzIG51bGwtdGVybWluYXRlZAorKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3ZvaWQgSVRUQVBJIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOwordm9pZCBJVFRBUEkgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyhjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCAqZGF0YSwgc2l6ZV90IGxlbmd0aCk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZSAgICAgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVworIyAgZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUgICAgIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEKKyMgIGRlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit2b2lkIElUVEFQSSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpOworI2VuZGlmCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIgKmRhdGEsIHNpemVfdCBsZW5ndGgpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVBKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlVyxkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVdfcHRyICAgICAgICBJVFROT1RJRllfTkFNRShtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpICBJVFROT1RJRllfVk9JRF9ENChtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgICAgICAgSVRUTk9USUZZX05BTUUobWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQShkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUFfcHRyICAwCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcoZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXX3B0ciAgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZShkLHgseSx6LGEpCisjZGVmaW5lIF9faXR0X21ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZV9wdHIgICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQV9wdHIgIDAKKyNkZWZpbmUgX19pdHRfbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlV19wdHIgIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVfcHRyICAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQH0gbWV0YWRhdGEgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgcmVsYXRpb25zIFJlbGF0aW9ucworICogSW5zdGFuY2VzIG9mIG5hbWVkIGVudGl0aWVzIGNhbiBiZSBleHBsaWNpdGx5IGFzc29jaWF0ZWQgd2l0aCBvdGhlcgorICogaW5zdGFuY2VzIHVzaW5nIGluc3RhbmNlIElEcyBhbmQgdGhlIHJlbGF0aW9uc2hpcCBBUEkgY2FsbHMuCisgKgorICogQHsKKyAqLworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIFRoZSBraW5kIG9mIHJlbGF0aW9uIGJldHdlZW4gdHdvIGluc3RhbmNlcyBpcyBzcGVjaWZpZWQgYnkgdGhlIGVudW1lcmF0ZWQgdHlwZSBfX2l0dF9yZWxhdGlvbi4KKyAqIFJlbGF0aW9ucyBiZXR3ZWVuIGluc3RhbmNlcyBjYW4gYmUgYWRkZWQgd2l0aCBhbiBBUEkgY2FsbC4gVGhlIHJlbGF0aW9uCisgKiBBUEkgdXNlcyBpbnN0YW5jZSBJRHMuIFJlbGF0aW9ucyBjYW4gYmUgYWRkZWQgYmVmb3JlIG9yIGFmdGVyIHRoZSBhY3R1YWwKKyAqIGluc3RhbmNlcyBhcmUgY3JlYXRlZCBhbmQgcGVyc2lzdCBpbmRlcGVuZGVudGx5IG9mIHRoZSBpbnN0YW5jZXMuIFRoaXMKKyAqIGlzIHRoZSBtb3RpdmF0aW9uIGZvciBoYXZpbmcgZGlmZmVyZW50IGxpZmV0aW1lcyBmb3IgaW5zdGFuY2UgSURzIGFuZAorICogdGhlIGFjdHVhbCBpbnN0YW5jZXMuCisgKi8KK3R5cGVkZWYgZW51bQoreworICAgIF9faXR0X3JlbGF0aW9uX2lzX3Vua25vd24gPSAwLAorICAgIF9faXR0X3JlbGF0aW9uX2lzX2RlcGVuZGVudF9vbiwgICAgICAgICAvKio8ICJBIGlzIGRlcGVuZGVudCBvbiBCIiBtZWFucyB0aGF0IEEgY2Fubm90IHN0YXJ0IHVudGlsIEIgY29tcGxldGVzICovCisgICAgX19pdHRfcmVsYXRpb25faXNfc2libGluZ19vZiwgICAgICAgICAgIC8qKjwgIkEgaXMgc2libGluZyBvZiBCIiBtZWFucyB0aGF0IEEgYW5kIEIgd2VyZSBjcmVhdGVkIGFzIGEgZ3JvdXAgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19wYXJlbnRfb2YsICAgICAgICAgICAgLyoqPCAiQSBpcyBwYXJlbnQgb2YgQiIgbWVhbnMgdGhhdCBBIGNyZWF0ZWQgQiAqLworICAgIF9faXR0X3JlbGF0aW9uX2lzX2NvbnRpbnVhdGlvbl9vZiwgICAgICAvKio8ICJBIGlzIGNvbnRpbnVhdGlvbiBvZiBCIiBtZWFucyB0aGF0IEEgYXNzdW1lcyB0aGUgZGVwZW5kZW5jaWVzIG9mIEIgKi8KKyAgICBfX2l0dF9yZWxhdGlvbl9pc19jaGlsZF9vZiwgICAgICAgICAgICAgLyoqPCAiQSBpcyBjaGlsZCBvZiBCIiBtZWFucyB0aGF0IEEgd2FzIGNyZWF0ZWQgYnkgQiAoaW52ZXJzZSBvZiBpc19wYXJlbnRfb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfY29udGludWVkX2J5LCAgICAgICAgIC8qKjwgIkEgaXMgY29udGludWVkIGJ5IEIiIG1lYW5zIHRoYXQgQiBhc3N1bWVzIHRoZSBkZXBlbmRlbmNpZXMgb2YgQSAoaW52ZXJzZSBvZiBpc19jb250aW51YXRpb25fb2YpICovCisgICAgX19pdHRfcmVsYXRpb25faXNfcHJlZGVjZXNzb3JfdG8gICAgICAgIC8qKjwgIkEgaXMgcHJlZGVjZXNzb3IgdG8gQiIgbWVhbnMgdGhhdCBCIGNhbm5vdCBzdGFydCB1bnRpbCBBIGNvbXBsZXRlcyAoaW52ZXJzZSBvZiBpc19kZXBlbmRlbnRfb24pICovCit9IF9faXR0X3JlbGF0aW9uOworCisvKioKKyAqIEBpbmdyb3VwIHJlbGF0aW9ucworICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqCisgKiBAaW5ncm91cCByZWxhdGlvbnMKKyAqIEBicmllZiBBZGQgYSByZWxhdGlvbiBiZXR3ZWVuIHR3byBpbnN0YW5jZSBpZGVudGlmaWVycy4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGhlYWQgVGhlIElEIGZvciB0aGUgaGVhZCBvZiB0aGUgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gcmVsYXRpb24gVGhlIGtpbmQgb2YgcmVsYXRpb24KKyAqIEBwYXJhbVtpbl0gdGFpbCBUaGUgSUQgZm9yIHRoZSB0YWlsIG9mIHRoZSByZWxhdGlvbgorICovCit2b2lkIElUVEFQSSBfX2l0dF9yZWxhdGlvbl9hZGQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkLCAgICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaGVhZCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudChkLHgseSkgSVRUTk9USUZZX1ZPSURfRDIocmVsYXRpb25fYWRkX3RvX2N1cnJlbnQsZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfdG9fY3VycmVudCkKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkKGQseCx5LHopICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHJlbGF0aW9uX2FkZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUocmVsYXRpb25fYWRkKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnQoZCx4LHkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X3B0ciAwCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZChkLHgseSx6KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSByZWxhdGlvbnMgZ3JvdXAgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X2Nsb2NrX2luZm8KK3sKKyAgICB1bnNpZ25lZCBsb25nIGxvbmcgY2xvY2tfZnJlcTsgLyohPCBDbG9jayBkb21haW4gZnJlcXVlbmN5ICovCisgICAgdW5zaWduZWQgbG9uZyBsb25nIGNsb2NrX2Jhc2U7IC8qITwgQ2xvY2sgZG9tYWluIGJhc2UgdGltZXN0YW1wICovCit9IF9faXR0X2Nsb2NrX2luZm87CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIHZvaWQgKElUVEFQSSAqX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4pKF9faXR0X2Nsb2NrX2luZm8qIGNsb2NrX2luZm8sIHZvaWQqIGRhdGEpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI3ByYWdtYSBwYWNrKHB1c2gsIDgpCisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jbG9ja19kb21haW4KK3sKKyAgICBfX2l0dF9jbG9ja19pbmZvIGluZm87ICAgICAgLyohPCBNb3N0IHJlY2VudCBjbG9jayBkb21haW4gaW5mbyAqLworICAgIF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuOyAvKiE8IENhbGxiYWNrIGZ1bmN0aW9uIHBvaW50ZXIgKi8KKyAgICB2b2lkKiBmbl9kYXRhOyAgICAgICAgICAgICAgLyohPCBJbnB1dCBhcmd1bWVudCBmb3IgdGhlIGNhbGxiYWNrIGZ1bmN0aW9uICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gKi8KKyAgICBzdHJ1Y3QgX19faXR0X2Nsb2NrX2RvbWFpbiogbmV4dDsKK30gX19pdHRfY2xvY2tfZG9tYWluOworCisjcHJhZ21hIHBhY2socG9wKQorLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW5zCisgKiBAYnJpZWYgQ3JlYXRlIGEgY2xvY2sgZG9tYWluLgorICogQ2VydGFpbiBhcHBsaWNhdGlvbnMgcmVxdWlyZSB0aGUgY2FwYWJpbGl0eSB0byB0cmFjZSB0aGVpciBhcHBsaWNhdGlvbiB1c2luZworICogYSBjbG9jayBkb21haW4gZGlmZmVyZW50IHRoYW4gdGhlIENQVSwgZm9yIGluc3RhbmNlIHRoZSBpbnN0cnVtZW50YXRpb24gb2YgZXZlbnRzCisgKiB0aGF0IG9jY3VyIG9uIGEgR1BVLgorICogQmVjYXVzZSB0aGUgc2V0IG9mIGRvbWFpbnMgaXMgZXhwZWN0ZWQgdG8gYmUgc3RhdGljIG92ZXIgdGhlIGFwcGxpY2F0aW9uJ3MgZXhlY3V0aW9uIHRpbWUsCisgKiB0aGVyZSBpcyBubyBtZWNoYW5pc20gdG8gZGVzdHJveSBhIGRvbWFpbi4KKyAqIEFueSBkb21haW4gY2FuIGJlIGFjY2Vzc2VkIGJ5IGFueSB0aHJlYWQgaW4gdGhlIHByb2Nlc3MsIHJlZ2FyZGxlc3Mgb2Ygd2hpY2ggdGhyZWFkIGNyZWF0ZWQKKyAqIHRoZSBkb21haW4uIFRoaXMgY2FsbCBpcyB0aHJlYWQtc2FmZS4KKyAqIEBwYXJhbVtpbl0gZm4gQSBwb2ludGVyIHRvIGEgY2FsbGJhY2sgZnVuY3Rpb24gd2hpY2ggcmV0cmlldmVzIGFsdGVybmF0aXZlIENQVSB0aW1lc3RhbXBzCisgKiBAcGFyYW1baW5dIGZuX2RhdGEgQXJndW1lbnQgZm9yIGEgY2FsbGJhY2sgZnVuY3Rpb247IG1heSBiZSBOVUxMCisgKi8KK19faXR0X2Nsb2NrX2RvbWFpbiogSVRUQVBJIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUoX19pdHRfZ2V0X2Nsb2NrX2luZm9fZm4gZm4sIHZvaWQqIGZuX2RhdGEpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2Nsb2NrX2RvbWFpbiosIGNsb2NrX2RvbWFpbl9jcmVhdGUsIChfX2l0dF9nZXRfY2xvY2tfaW5mb19mbiBmbiwgdm9pZCogZm5fZGF0YSkpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNsb2NrX2RvbWFpbl9jcmVhdGUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jbG9ja19kb21haW5fY3JlYXRlKGZuLGZuX2RhdGEpIChfX2l0dF9jbG9ja19kb21haW4qKTAKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9jcmVhdGVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbnMKKyAqIEBicmllZiBSZWNhbGN1bGF0ZSBjbG9jayBkb21haW5zIGZyZXF1ZW5jZXMgYW5kIGNsb2NrIGJhc2UgdGltZXN0YW1wcy4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjbG9ja19kb21haW5fcmVzZXQsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0ICAgICBJVFROT1RJRllfVk9JRChjbG9ja19kb21haW5fcmVzZXQpCisjZGVmaW5lIF9faXR0X2Nsb2NrX2RvbWFpbl9yZXNldF9wdHIgSVRUTk9USUZZX05BTUUoY2xvY2tfZG9tYWluX3Jlc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0KCkKKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY2xvY2tfZG9tYWluX3Jlc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBDcmVhdGUgYW4gaW5zdGFuY2Ugb2YgaWRlbnRpZmllci4gVGhpcyBlc3RhYmxpc2hlcyB0aGUgYmVnaW5uaW5nIG9mIHRoZSBsaWZldGltZSBvZgorICogYW4gaW5zdGFuY2Ugb2YgdGhlIGdpdmVuIElEIGluIHRoZSB0cmFjZS4gT25jZSB0aGlzIGxpZmV0aW1lIHN0YXJ0cywgdGhlIElEIGNhbiBiZSB1c2VkIHRvCisgKiB0YWcgbmFtZWQgZW50aXR5IGluc3RhbmNlcyBpbiBjYWxscyBzdWNoIGFzIF9faXR0X3Rhc2tfYmVnaW4sIGFuZCB0byBzcGVjaWZ5IHJlbGF0aW9uc2hpcHMgYW1vbmcKKyAqIGlkZW50aWZpZWQgbmFtZWQgZW50aXR5IGluc3RhbmNlcywgdXNpbmcgdGhlIFxyZWYgcmVsYXRpb25zIEFQSXMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gY3JlYXRlLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9pZF9jcmVhdGVfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBEZXN0cm95IGFuIGluc3RhbmNlIG9mIGlkZW50aWZpZXIuIFRoaXMgZW5kcyB0aGUgbGlmZXRpbWUgb2YgdGhlIGN1cnJlbnQgaW5zdGFuY2Ugb2YgdGhlCisgKiBnaXZlbiBJRCB2YWx1ZSBpbiB0aGUgdHJhY2UuIEFueSByZWxhdGlvbnNoaXBzIHRoYXQgYXJlIGVzdGFibGlzaGVkIGFmdGVyIHRoaXMgbGlmZXRpbWUgZW5kcyBhcmUKKyAqIGludmFsaWQuIFRoaXMgY2FsbCBtdXN0IGJlIHBlcmZvcm1lZCBiZWZvcmUgdGhlIGdpdmVuIElEIHZhbHVlIGNhbiBiZSByZXVzZWQgZm9yIGEgZGlmZmVyZW50CisgKiBuYW1lZCBlbnRpdHkgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgSUQgdG8gZGVzdHJveS4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfaWRfZGVzdHJveV9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlX2V4LCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfZGVzdHJveV9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQpKQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXgoZCx4LHkseikgIElUVE5PVElGWV9WT0lEX0QzKGlkX2NyZWF0ZV9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgICAgIElUVE5PVElGWV9OQU1FKGlkX2NyZWF0ZV9leCkKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leChkLHgseSx6KSBJVFROT1RJRllfVk9JRF9EMyhpZF9kZXN0cm95X2V4LGQseCx5LHopCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyICAgICAgSVRUTk9USUZZX05BTUUoaWRfZGVzdHJveV9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2lkX2NyZWF0ZV9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCkKKyNkZWZpbmUgX19pdHRfaWRfY3JlYXRlX2V4X3B0ciAgICAwCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQpCisjZGVmaW5lIF9faXR0X2lkX2Rlc3Ryb3lfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9pZF9jcmVhdGVfZXhfcHRyICAgIDAKKyNkZWZpbmUgX19pdHRfaWRfZGVzdHJveV9leF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQmVnaW4gYSB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IGluc3RhbmNlIHRvIHdoaWNoIHRoaXMgdGFzayBpbnN0YW5jZSBiZWxvbmdzLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgb2YgdGhpcyB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lKTsKKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEJlZ2luIGEgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSB0YXNraWQgVGhlIGlkZW50aWZpZXIgZm9yIHRoaXMgdGFzayBpbnN0YW5jZSwgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbAorICogQHBhcmFtW2luXSBmbiBUaGUgcG9pbnRlciB0byB0aGUgZnVuY3Rpb24geW91IGFyZSB0cmFjaW5nCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbik7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgdGhlIGN1cnJlbnQgdGFzayBpbnN0YW5jZS4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gZm9yIHRoaXMgdGFzaworICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICovCit2b2lkIElUVEFQSSBfX2l0dF90YXNrX2VuZF9leChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXApOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX2V4LCAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm5fZXgsICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50aWQsIHZvaWQqIGZuKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX2V4LCAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wKSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkLHgseSx6LGEsYikgICAgICBJVFROT1RJRllfVk9JRF9ENSh0YXNrX2JlZ2luX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfYmVnaW5fZXgpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZCx4LHkseixhLGIpICAgSVRUTk9USUZZX1ZPSURfRDUodGFza19iZWdpbl9mbl9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9mbl9leF9wdHIgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX2ZuX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leChkLHgseSkgICAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QyKHRhc2tfZW5kX2V4LGQseCx5KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9leF9wdHIgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRhc2tfZW5kX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaWQscGFyZW50aWQsZm4pCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXApCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX2V4X3B0ciAgICAgICAgICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX2V4X3B0ciAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fZm5fZXhfcHRyICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfZXhfcHRyICAgICAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBpbmdyb3VwIG1hcmtlcnMKKyAqIEBicmllZiBDcmVhdGUgYSBtYXJrZXIgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIG1hcmtlcgorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBpZCBUaGUgaW5zdGFuY2UgSUQgZm9yIHRoaXMgbWFya2VyLCBvciBfX2l0dF9udWxsCisgKiBAcGFyYW1baW5dIG5hbWUgVGhlIG5hbWUgZm9yIHRoaXMgbWFya2VyCisgKiBAcGFyYW1baW5dIHNjb3BlIFRoZSBzY29wZSBmb3IgdGhpcyBtYXJrZXIKKyAqLwordm9pZCBJVFRBUEkgX19pdHRfbWFya2VyX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSkpCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkLHgseSx6LGEsYikgICAgSVRUTk9USUZZX1ZPSURfRDUobWFya2VyX2V4LGQseCx5LHosYSxiKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKG1hcmtlcl9leCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtlcl9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtcCxpZCxuYW1lLHNjb3BlKQorI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrZXJfZXhfcHRyICAgIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAaW5ncm91cCBjbG9ja2RvbWFpbgorICogQGJyaWVmIEFkZCBhIHJlbGF0aW9uIHRvIHRoZSBjdXJyZW50IHRhc2sgaW5zdGFuY2UuCisgKiBUaGUgY3VycmVudCB0YXNrIGluc3RhbmNlIGlzIHRoZSBoZWFkIG9mIHRoZSByZWxhdGlvbi4KKyAqIEBwYXJhbVtpbl0gZG9tYWluIFRoZSBkb21haW4gY29udHJvbGxpbmcgdGhpcyBjYWxsCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sICBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfcmVsYXRpb24gcmVsYXRpb24sIF9faXR0X2lkIHRhaWwpOworCisvKioKKyAqIEBpbmdyb3VwIGNsb2NrZG9tYWluCisgKiBAYnJpZWYgQWRkIGEgcmVsYXRpb24gYmV0d2VlbiB0d28gaW5zdGFuY2UgaWRlbnRpZmllcnMuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGNvbnRyb2xsaW5nIHRoaXMgY2FsbAorICogQHBhcmFtW2luXSBjbG9ja19kb21haW4gVGhlIGNsb2NrIGRvbWFpbiBjb250cm9sbGluZyB0aGUgZXhlY3V0aW9uIG9mIHRoaXMgY2FsbC4KKyAqIEBwYXJhbVtpbl0gdGltZXN0YW1wIFRoZSB1c2VyIGRlZmluZWQgdGltZXN0YW1wLgorICogQHBhcmFtW2luXSBoZWFkIFRoZSBJRCBmb3IgdGhlIGhlYWQgb2YgdGhlIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHJlbGF0aW9uIFRoZSBraW5kIG9mIHJlbGF0aW9uCisgKiBAcGFyYW1baW5dIHRhaWwgVGhlIElEIGZvciB0aGUgdGFpbCBvZiB0aGUgcmVsYXRpb24KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVsYXRpb25fYWRkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCAgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGhlYWQsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCkpCisjZGVmaW5lIF9faXR0X3JlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KGQseCx5LHosYSkgSVRUTk9USUZZX1ZPSURfRDQocmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsZCx4LHkseixhKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgICAgICAgIElUVE5PVElGWV9OQU1FKHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4KQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZCx4LHkseixhLGIpICAgICAgICAgIElUVE5PVElGWV9WT0lEX0Q1KHJlbGF0aW9uX2FkZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfcmVsYXRpb25fYWRkX2V4X3B0ciAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShyZWxhdGlvbl9hZGRfZXgpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leChkb21haW4sY2xvY2tfZG9tYWluLHRpbWVzdGFtZSxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsaGVhZCxyZWxhdGlvbix0YWlsKQorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfdG9fY3VycmVudF9leF9wdHIgMAorI2RlZmluZSBfX2l0dF9yZWxhdGlvbl9hZGRfZXhfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX2dyb3VwX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja19ncm91cF90eXBlX25vcm1hbCA9IDAKK30gX19pdHRfdHJhY2tfZ3JvdXBfdHlwZTsKKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfdHJhY2tfZ3JvdXAKK3sKKyAgICBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lOyAgICAgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIHN0cnVjdCBfX19pdHRfdHJhY2sqIHRyYWNrOyAgICAvKiE8IExpc3Qgb2YgY2hpbGQgdHJhY2tzICAgICovCisgICAgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0Z3R5cGU7IC8qITwgVHlwZSBvZiB0aGUgdHJhY2sgZ3JvdXAgKi8KKyAgICBpbnQgICBleHRyYTE7ICAgICAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgICAgICAvKiE8IFJlc2VydmVkLiBNdXN0IGJlIHplcm8gICovCisgICAgc3RydWN0IF9fX2l0dF90cmFja19ncm91cCogbmV4dDsKK30gX19pdHRfdHJhY2tfZ3JvdXA7CisKKyNwcmFnbWEgcGFjayhwb3ApCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUGxhY2Vob2xkZXIgZm9yIGN1c3RvbSB0cmFjayB0eXBlcy4gQ3VycmVudGx5LCAibm9ybWFsIiBjdXN0b20gdHJhY2sKKyAqIGlzIHRoZSBvbmx5IGF2YWlsYWJsZSB0cmFjayB0eXBlLgorICovCit0eXBlZGVmIGVudW0gX19faXR0X3RyYWNrX3R5cGUKK3sKKyAgICBfX2l0dF90cmFja190eXBlX25vcm1hbCA9IDAKKyNpZmRlZiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUKKyAgICAsIF9faXR0X3RyYWNrX3R5cGVfcXVldWUKKyNlbmRpZiAvKiBJTlRFTF9JVFROT1RJRllfQVBJX1BSSVZBVEUgKi8KK30gX19pdHRfdHJhY2tfdHlwZTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RyYWNrCit7CisgICAgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZTsgLyohPCBOYW1lIG9mIHRoZSB0cmFjayBncm91cCAqLworICAgIF9faXR0X3RyYWNrX2dyb3VwKiBncm91cDsgIC8qITwgUGFyZW50IGdyb3VwIHRvIGEgdHJhY2sgKi8KKyAgICBfX2l0dF90cmFja190eXBlIHR0eXBlOyAgICAvKiE8IFR5cGUgb2YgdGhlIHRyYWNrICAgICAgICovCisgICAgaW50ICAgZXh0cmExOyAgICAgICAgICAgICAgLyohPCBSZXNlcnZlZC4gTXVzdCBiZSB6ZXJvICAqLworICAgIHZvaWQqIGV4dHJhMjsgICAgICAgICAgICAgIC8qITwgUmVzZXJ2ZWQuIE11c3QgYmUgemVybyAgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RyYWNrKiBuZXh0OworfSBfX2l0dF90cmFjazsKKworI3ByYWdtYSBwYWNrKHBvcCkKKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjayBncm91cC4KKyAqLworX19pdHRfdHJhY2tfZ3JvdXAqIElUVEFQSSBfX2l0dF90cmFja19ncm91cF9jcmVhdGUoX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSwgX19pdHRfdHJhY2tfZ3JvdXBfdHlwZSB0cmFja19ncm91cF90eXBlKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90cmFja19ncm91cCosIHRyYWNrX2dyb3VwX2NyZWF0ZSwgKF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX2dyb3VwX3R5cGUgdHJhY2tfZ3JvdXBfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfZ3JvdXBfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19ncm91cF9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2dyb3VwX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZShuYW1lKSAgKF9faXR0X3RyYWNrX2dyb3VwKikwCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2dyb3VwX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBDcmVhdGUgbG9naWNhbCB0cmFjay4KKyAqLworX19pdHRfdHJhY2sqIElUVEFQSSBfX2l0dF90cmFja19jcmVhdGUoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3RyYWNrKiwgdHJhY2tfY3JlYXRlLCAoX19pdHRfdHJhY2tfZ3JvdXAqIHRyYWNrX2dyb3VwLF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUsIF9faXR0X3RyYWNrX3R5cGUgdHJhY2tfdHlwZSkpCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSAgICAgSVRUTk9USUZZX0RBVEEodHJhY2tfY3JlYXRlKQorI2RlZmluZSBfX2l0dF90cmFja19jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKHRyYWNrX2NyZWF0ZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3RyYWNrX2NyZWF0ZSh0cmFja19ncm91cCxuYW1lLHRyYWNrX3R5cGUpICAoX19pdHRfdHJhY2sqKTAKKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdHJhY2tfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFNldCB0aGUgbG9naWNhbCB0cmFjay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc2V0X3RyYWNrKF9faXR0X3RyYWNrKiB0cmFjayk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHNldF90cmFjaywgKF9faXR0X3RyYWNrICp0cmFjaykpCisjZGVmaW5lIF9faXR0X3NldF90cmFjayAgICAgSVRUTk9USUZZX1ZPSUQoc2V0X3RyYWNrKQorI2RlZmluZSBfX2l0dF9zZXRfdHJhY2tfcHRyIElUVE5PVElGWV9OQU1FKHNldF90cmFjaykKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3NldF90cmFjayh0cmFjaykKKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc2V0X3RyYWNrX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09ICovCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisvKioKKyAqIEBkZWZncm91cCBldmVudHMgRXZlbnRzCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIEV2ZW50cyBncm91cAorICogQHsKKyAqLworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZXZlbnRzIGdyb3VwICovCisKKworLyoqCisgKiBAZGVmZ3JvdXAgYXJyYXlzIEFycmF5cyBWaXN1YWxpemVyCisgKiBAaW5ncm91cCBwdWJsaWMKKyAqIFZpc3VhbGl6ZSBhcnJheXMKKyAqIEB7CisgKi8KKworLyoqCisgKiBAZW51bSBfX2l0dF9hdl9kYXRhX3R5cGUKKyAqIEBicmllZiBEZWZpbmVzIHR5cGVzIG9mIGFycmF5cyBkYXRhIChmb3IgQy9DKysgaW50cmluc2ljIHR5cGVzKQorICovCit0eXBlZGVmIGVudW0KK3sKKyAgICBfX2l0dF9lX2ZpcnN0ID0gMCwKKyAgICBfX2l0dF9lX2NoYXIgPSAwLCAgLyogMS1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VjaGFyLCAgICAgLyogMS1ieXRlIHVuc2lnbmVkIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX2ludDE2LCAgICAgLyogMi1ieXRlIGludGVnZXIgKi8KKyAgICBfX2l0dF9lX3VpbnQxNiwgICAgLyogMi1ieXRlIHVuc2lnbmVkIGludGVnZXIgICovCisgICAgX19pdHRfZV9pbnQzMiwgICAgIC8qIDQtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50MzIsICAgIC8qIDQtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9pbnQ2NCwgICAgIC8qIDgtYnl0ZSBpbnRlZ2VyICovCisgICAgX19pdHRfZV91aW50NjQsICAgIC8qIDgtYnl0ZSB1bnNpZ25lZCBpbnRlZ2VyICovCisgICAgX19pdHRfZV9mbG9hdCwgICAgIC8qIDQtYnl0ZSBmbG9hdGluZyAqLworICAgIF9faXR0X2VfZG91YmxlLCAgICAvKiA4LWJ5dGUgZmxvYXRpbmcgKi8KKyAgICBfX2l0dF9lX2xhc3QgPSBfX2l0dF9lX2RvdWJsZQorfSBfX2l0dF9hdl9kYXRhX3R5cGU7CisKKy8qKgorICogQGJyaWVmIFNhdmUgYW4gYXJyYXkgZGF0YSB0byBhIGZpbGUuCisgKiBPdXRwdXQgZm9ybWF0IGlzIGRlZmluZWQgYnkgdGhlIGZpbGUgZXh0ZW5zaW9uLiBUaGUgY3N2IGFuZCBibXAgZm9ybWF0cyBhcmUgc3VwcG9ydGVkIChibXAgLSBmb3IgMi1kaW1lbnNpb25hbCBhcnJheSBvbmx5KS4KKyAqIEBwYXJhbVtpbl0gZGF0YSAtIHBvaW50ZXIgdG8gdGhlIGFycmF5IGRhdGEKKyAqIEBwYXJhbVtpbl0gcmFuayAtIHRoZSByYW5rIG9mIHRoZSBhcnJheQorICogQHBhcmFtW2luXSBkaW1lbnNpb25zIC0gcG9pbnRlciB0byBhbiBhcnJheSBvZiBpbnRlZ2Vycywgd2hpY2ggc3BlY2lmaWVzIHRoZSBhcnJheSBkaW1lbnNpb25zLgorICogVGhlIHNpemUgb2YgZGltZW5zaW9ucyBtdXN0IGJlIGVxdWFsIHRvIHRoZSByYW5rCisgKiBAcGFyYW1baW5dIHR5cGUgLSB0aGUgdHlwZSBvZiB0aGUgYXJyYXksIHNwZWNpZmllZCBhcyBvbmUgb2YgdGhlIF9faXR0X2F2X2RhdGFfdHlwZSB2YWx1ZXMgKGZvciBpbnRyaW5zaWMgdHlwZXMpCisgKiBAcGFyYW1baW5dIGZpbGVQYXRoIC0gdGhlIGZpbGUgcGF0aDsgdGhlIG91dHB1dCBmb3JtYXQgaXMgZGVmaW5lZCBieSB0aGUgZmlsZSBleHRlbnNpb24KKyAqIEBwYXJhbVtpbl0gY29sdW1uT3JkZXIgLSBkZWZpbmVzIGhvdyB0aGUgYXJyYXkgaXMgc3RvcmVkIGluIHRoZSBsaW5lYXIgbWVtb3J5LgorICogSXQgc2hvdWxkIGJlIDEgZm9yIGNvbHVtbi1tYWpvciBvcmRlciAoZS5nLiBpbiBGT1JUUkFOKSBvciAwIC0gZm9yIHJvdy1tYWpvciBvcmRlciAoZS5nLiBpbiBDKS4KKyAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgSVRUQVBJIF9faXR0X2F2X3NhdmVBKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKK2ludCBJVFRBUEkgX19pdHRfYXZfc2F2ZVcodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9hdl9zYXZlICAgICBfX2l0dF9hdl9zYXZlVworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmVfcHRyIF9faXR0X2F2X3NhdmVXX3B0cgorI2Vsc2UgLyogVU5JQ09ERSAqLworIyAgZGVmaW5lIF9faXR0X2F2X3NhdmUgICAgIF9faXR0X2F2X3NhdmVBCisjICBkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgX19pdHRfYXZfc2F2ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworaW50IElUVEFQSSBfX2l0dF9hdl9zYXZlKHZvaWQgKmRhdGEsIGludCByYW5rLCBjb25zdCBpbnQgKmRpbWVuc2lvbnMsIGludCB0eXBlLCBjb25zdCBjaGFyICpmaWxlUGF0aCwgaW50IGNvbHVtbk9yZGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9hdl9zYXZlQSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZUEpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciBJVFROT1RJRllfTkFNRShhdl9zYXZlQSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVcgICAgIElUVE5PVElGWV9EQVRBKGF2X3NhdmVXKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlV19wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZSAgICAgSVRUTk9USUZZX0RBVEEoYXZfc2F2ZSkKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZV9wdHIgSVRUTk9USUZZX05BTUUoYXZfc2F2ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXKG5hbWUpCisjZGVmaW5lIF9faXR0X2F2X3NhdmVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZShuYW1lKQorI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfYXZfc2F2ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfYXZfc2F2ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9hdl9zYXZlX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKK3ZvaWQgSVRUQVBJIF9faXR0X2VuYWJsZV9hdHRhY2godm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGVuYWJsZV9hdHRhY2gsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaCAgICAgSVRUTk9USUZZX1ZPSUQoZW5hYmxlX2F0dGFjaCkKKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgSVRUTk9USUZZX05BTUUoZW5hYmxlX2F0dGFjaCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2VuYWJsZV9hdHRhY2goKQorI2RlZmluZSBfX2l0dF9lbmFibGVfYXR0YWNoX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZW5hYmxlX2F0dGFjaF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2dwYV9kb2N1bWVudGF0aW9uICovCisKKy8qKiBAfSBhcnJheXMgZ3JvdXAgKi8KKworLyoqIEBlbmRjb25kICovCisKKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworI2lmZGVmIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURQorCisjaWZuZGVmIF9JVFROT1RJRllfUFJJVkFURV8KKyNkZWZpbmUgX0lUVE5PVElGWV9QUklWQVRFXworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2suCisgKiBAcGFyYW1baW5dIHRhc2tpZCBUaGUgaWRlbnRpZmllciBmb3IgdGhpcyB0YXNrIGluc3RhbmNlLCAqY2Fubm90KiBiZSBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBwYXJlbnRpZCBUaGUgcGFyZW50IG9mIHRoaXMgdGFzaywgb3IgX19pdHRfbnVsbC4KKyAqIEBwYXJhbVtpbl0gbmFtZSBUaGUgbmFtZSBvZiB0aGlzIHRhc2suCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBCZWdpbiBhbiBvdmVybGFwcGVkIHRhc2sgaW5zdGFuY2UuCisgKiBAcGFyYW1baW5dIGRvbWFpbiBUaGUgZG9tYWluIGZvciB0aGlzIHRhc2sKKyAqIEBwYXJhbVtpbl0gY2xvY2tfZG9tYWluIFRoZSBjbG9jayBkb21haW4gY29udHJvbGxpbmcgdGhlIGV4ZWN1dGlvbiBvZiB0aGlzIGNhbGwuCisgKiBAcGFyYW1baW5dIHRpbWVzdGFtcCBUaGUgdXNlciBkZWZpbmVkIHRpbWVzdGFtcC4KKyAqIEBwYXJhbVtpbl0gdGFza2lkIFRoZSBpZGVudGlmaWVyIGZvciB0aGlzIHRhc2sgaW5zdGFuY2UsICpjYW5ub3QqIGJlIF9faXR0X251bGwuCisgKiBAcGFyYW1baW5dIHBhcmVudGlkIFRoZSBwYXJlbnQgb2YgdGhpcyB0YXNrLCBvciBfX2l0dF9udWxsLgorICogQHBhcmFtW2luXSBuYW1lIFRoZSBuYW1lIG9mIHRoaXMgdGFzay4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGNvbnN0IF9faXR0X2RvbWFpbiogZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSogbmFtZSk7CisKKy8qKgorICogQGluZ3JvdXAgdGFza3MKKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWQoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCk7CisKKy8qKgorICogQGluZ3JvdXAgY2xvY2tkb21haW4KKyAqIEBicmllZiBFbmQgYW4gb3ZlcmxhcHBlZCB0YXNrIGluc3RhbmNlLgorICogQHBhcmFtW2luXSBkb21haW4gVGhlIGRvbWFpbiBmb3IgdGhpcyB0YXNrCisgKiBAcGFyYW1baW5dIGNsb2NrX2RvbWFpbiBUaGUgY2xvY2sgZG9tYWluIGNvbnRyb2xsaW5nIHRoZSBleGVjdXRpb24gb2YgdGhpcyBjYWxsLgorICogQHBhcmFtW2luXSB0aW1lc3RhbXAgVGhlIHVzZXIgZGVmaW5lZCB0aW1lc3RhbXAuCisgKiBAcGFyYW1baW5dIHRhc2tpZCBFeHBsaWNpdCBJRCBvZiBmaW5pc2hlZCB0YXNrCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoY29uc3QgX19pdHRfZG9tYWluKiBkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCB0YXNraWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgdGFza2lkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCwgX19pdHRfaWQgcGFyZW50aWQsIF9faXR0X3N0cmluZ19oYW5kbGUqIG5hbWUpKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfb3ZlcmxhcHBlZCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIHRhc2tpZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCAgICAgICAgIChjb25zdCBfX2l0dF9kb21haW4qIGRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIHRhc2tpZCkpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZChkLHgseSx6KSAgICAgICAgICAgIElUVE5PVElGWV9WT0lEX0QzKHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2JlZ2luX292ZXJsYXBwZWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leChkLHgseSx6LGEsYikgICAgIElUVE5PVElGWV9WT0lEX0Q1KHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCxkLHgseSx6LGEsYikKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19iZWdpbl9vdmVybGFwcGVkX2V4KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGQseCkgICAgICAgICAgICAgICAgICBJVFROT1RJRllfVk9JRF9EMSh0YXNrX2VuZF9vdmVybGFwcGVkLGQseCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9wdHIgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGFza19lbmRfb3ZlcmxhcHBlZCkKKyNkZWZpbmUgX19pdHRfdGFza19lbmRfb3ZlcmxhcHBlZF9leChkLHgseSx6KSAgICAgICAgICAgSVRUTk9USUZZX1ZPSURfRDModGFza19lbmRfb3ZlcmxhcHBlZF9leCxkLHgseSx6KQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRSh0YXNrX2VuZF9vdmVybGFwcGVkX2V4KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQscGFyZW50aWQsbmFtZSkKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX3B0ciAgICAgICAgIDAKKyNkZWZpbmUgX19pdHRfdGFza19iZWdpbl9vdmVybGFwcGVkX2V4KGRvbWFpbixjbG9ja19kb21haW4sdGltZXN0YW1wLHRhc2tpZCxwYXJlbnRpZCxuYW1lKQorI2RlZmluZSBfX2l0dF90YXNrX2JlZ2luX292ZXJsYXBwZWRfZXhfcHRyICAgICAgMAorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkKGRvbWFpbix0YXNraWQpCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXgoZG9tYWluLGNsb2NrX2RvbWFpbix0aW1lc3RhbXAsdGFza2lkKQorI2RlZmluZSBfX2l0dF90YXNrX2VuZF9vdmVybGFwcGVkX2V4X3B0ciAgICAgICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9wdHIgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leF9wdHIgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfcHRyICAgICAgICAgICAwCisjZGVmaW5lIF9faXR0X3Rhc2tfZW5kX292ZXJsYXBwZWRfZXhfcHRyICAgICAgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlZmdyb3VwIG1ha3JzX2ludGVybmFsIE1hcmtzCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogTWFya3MgZ3JvdXAKKyAqIEB3YXJuaW5nIEludGVybmFsIEFQSToKKyAqICAgLSBJdCBpcyBub3Qgc2hpcHBlZCB0byBvdXRzaWRlIG9mIEludGVsCisgKiAgIC0gSXQgaXMgZGVsaXZlcmVkIHRvIGludGVybmFsIEludGVsIHRlYW1zIHVzaW5nIGUtbWFpbCBvciBTVk4gYWNjZXNzIG9ubHkKKyAqIEB7CisgKi8KKy8qKiBAYnJpZWYgdXNlciBtYXJrIHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X21hcmtfdHlwZTsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhIHVzZXIgbWFyayB0eXBlIHdpdGggdGhlIHNwZWNpZmllZCBuYW1lIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKiBAcGFyYW1baW5dIG5hbWUgLSBuYW1lIG9mIG1hcmsgdG8gY3JlYXRlCisgKiBAcmV0dXJuIFJldHVybnMgYSBoYW5kbGUgdG8gdGhlIG1hcmsgdHlwZQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitfX2l0dF9tYXJrX3R5cGUgSVRUQVBJIF9faXR0X21hcmtfY3JlYXRlQShjb25zdCBjaGFyICAgICpuYW1lKTsKK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZSAgICAgX19pdHRfbWFya19jcmVhdGVBCisjICBkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyIF9faXR0X21hcmtfY3JlYXRlQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK19faXR0X21hcmtfdHlwZSBJVFRBUEkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciAqbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZSwgIChjb25zdCBjaGFyICpuYW1lKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZUEpCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUobWFya19jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZVcgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShtYXJrX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICBJVFROT1RJRllfTkFNRShtYXJrX2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlQShuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X21hcmtfY3JlYXRlVyhuYW1lKSAoX19pdHRfbWFya190eXBlKTAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGUobmFtZSkgIChfX2l0dF9tYXJrX3R5cGUpMAorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2NyZWF0ZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbWFya19jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIENyZWF0ZXMgYSAiZGlzY3JldGUiIHVzZXIgbWFyayB0eXBlIG9mIHRoZSBzcGVjaWZpZWQgdHlwZSBhbmQgYW4gb3B0aW9uYWwgcGFyYW1ldGVyIHVzaW5nIGNoYXIgb3IgVW5pY29kZSBzdHJpbmcuCisgKgorICogLSBUaGUgbWFyayBvZiAiZGlzY3JldGUiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbiBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljayBzaWduLgorICogLSBUaGUgY2FsbCBpcyAic3luY2hyb25vdXMiIC0gZnVuY3Rpb24gcmV0dXJucyBhZnRlciBtYXJrIGlzIGFjdHVhbGx5IGFkZGVkIHRvIHJlc3VsdHMuCisgKiAtIFRoaXMgZnVuY3Rpb24gaXMgdXNlZnVsLCBmb3IgZXhhbXBsZSwgdG8gbWFyayBkaWZmZXJlbnQgcGhhc2VzIG9mIGFwcGxpY2F0aW9uCisgKiAgIChiZWdpbm5pbmcgb2YgdGhlIG5leHQgbWFyayBhdXRvbWF0aWNhbGx5IG1lYW5kIGVuZCBvZiBjdXJyZW50IHJlZ2lvbikuCisgKiAtIENhbiBiZSB1c2VkIHRvZ2V0aGVyIHdpdGggImNvbnRpbnVvdXMiIG1hcmtzIChzZWUgYmVsb3cpIGF0IHRoZSBzYW1lIGNvbGxlY3Rpb24gc2Vzc2lvbgorICogQHBhcmFtW2luXSBtdCAtIG1hcmssIGNyZWF0ZWQgYnkgX19pdHRfbWFya19jcmVhdGUoY29uc3QgY2hhciogbmFtZSkgZnVuY3Rpb24KKyAqIEBwYXJhbVtpbl0gcGFyYW1ldGVyIC0gc3RyaW5nIHBhcmFtZXRlciBvZiBtYXJrCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrQShfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlcik7CitpbnQgSVRUQVBJIF9faXR0X21hcmtXKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya1cKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFyayAgICAgX19pdHRfbWFya0EKKyMgIGRlZmluZSBfX2l0dF9tYXJrX3B0ciBfX2l0dF9tYXJrQV9wdHIKKyNlbmRpZiAvKiBVTklDT0RFICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBJVFRBUEkgX19pdHRfbWFyayhfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgKnBhcmFtZXRlcik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrLCAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya0EgICAgIElUVE5PVElGWV9EQVRBKG1hcmtBKQorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgSVRUTk9USUZZX05BTUUobWFya0EpCisjZGVmaW5lIF9faXR0X21hcmtXICAgICBJVFROT1RJRllfREFUQShtYXJrVykKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmsgICAgICBJVFROT1RJRllfREFUQShtYXJrKQorI2RlZmluZSBfX2l0dF9tYXJrX3B0ciAgSVRUTk9USUZZX05BTUUobWFyaykKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrVyhtdCwgcGFyYW1ldGVyKSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya1dfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrKG10LCBwYXJhbWV0ZXIpICAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X21hcmtfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFVzZSB0aGlzIGlmIG5lY2Vzc2FyeSB0byBjcmVhdGUgYSAiZGlzY3JldGUiIHVzZXIgZXZlbnQgdHlwZSAobWFyaykgZm9yIHByb2Nlc3MKKyAqIHJhdGhlciB0aGVuIGZvciBvbmUgdGhyZWFkCisgKiBAc2VlIGludCBfX2l0dF9tYXJrKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciogcGFyYW1ldGVyKTsKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgoraW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbEEoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpOworaW50IElUVEFQSSBfX2l0dF9tYXJrX2dsb2JhbFcoX19pdHRfbWFya190eXBlIG10LCBjb25zdCB3Y2hhcl90ICpwYXJhbWV0ZXIpOworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyMgIGRlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgX19pdHRfbWFya19nbG9iYWxXCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfcHRyIF9faXR0X21hcmtfZ2xvYmFsV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgICovCisjICBkZWZpbmUgX19pdHRfbWFya19nbG9iYWwgICAgIF9faXR0X21hcmtfZ2xvYmFsQQorIyAgZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgSVRUQVBJIF9faXR0X21hcmtfZ2xvYmFsKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAqcGFyYW1ldGVyKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIG1hcmtfZ2xvYmFsQSwgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbFcsIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IHdjaGFyX3QgKnBhcmFtZXRlcikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19nbG9iYWwsICAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICpwYXJhbWV0ZXIpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEEgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsQSkKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbEEpCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsVyAgICAgSVRUTk9USUZZX0RBVEEobWFya19nbG9iYWxXKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbCAgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIElUVE5PVElGWV9OQU1FKG1hcmtfZ2xvYmFsKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxBKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxXKG10LCBwYXJhbWV0ZXIpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbChtdCwgcGFyYW1ldGVyKSAgKGludCkwCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X21hcmtfZ2xvYmFsQV9wdHIgMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbFdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlcyBhbiAiZW5kIiBwb2ludCBmb3IgImNvbnRpbnVvdXMiIG1hcmsgd2l0aCBzcGVjaWZpZWQgbmFtZS4KKyAqCisgKiAtIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqICAgQWxzbyByZXR1cm5zIG5vbi16ZXJvIHZhbHVlIHdoZW4gcHJlY2VkaW5nICJiZWdpbiIgcG9pbnQgZm9yIHRoZQorICogICBtYXJrIHdpdGggdGhlIHNhbWUgbmFtZSBmYWlsZWQgdG8gYmUgY3JlYXRlZCBvciBub3QgY3JlYXRlZC4KKyAqIC0gVGhlIG1hcmsgb2YgImNvbnRpbnVvdXMiIHR5cGUgaXMgcGxhY2VkIHRvIGNvbGxlY3Rpb24gcmVzdWx0cyBpbgorICogICBjYXNlIG9mIHN1Y2Nlc3MuIEl0IGFwcGVhcnMgaW4gb3ZlcnRpbWUgdmlldyhzKSBhcyBhIHNwZWNpYWwgdGljaworICogICBzaWduIChkaWZmZXJlbnQgZnJvbSAiZGlzY3JldGUiIG1hcmspIHRvZ2V0aGVyIHdpdGggbGluZSBmcm9tCisgKiAgIGNvcnJlc3BvbmRpbmcgImJlZ2luIiBtYXJrIHRvICJlbmQiIG1hcmsuCisgKiBAbm90ZSBDb250aW51b3VzIG1hcmtzIGNhbiBvdmVybGFwIGFuZCBiZSBuZXN0ZWQgaW5zaWRlIGVhY2ggb3RoZXIuCisgKiBEaXNjcmV0ZSBtYXJrIGNhbiBiZSBuZXN0ZWQgaW5zaWRlIG1hcmtlZCByZWdpb24KKyAqIEBwYXJhbVtpbl0gbXQgLSBtYXJrLCBjcmVhdGVkIGJ5IF9faXR0X21hcmtfY3JlYXRlKGNvbnN0IGNoYXIqIG5hbWUpIGZ1bmN0aW9uCisgKiBAcmV0dXJuIFJldHVybnMgemVybyB2YWx1ZSBpbiBjYXNlIG9mIHN1Y2Nlc3MsIG5vbi16ZXJvIHZhbHVlIG90aGVyd2lzZS4KKyAqLworaW50IElUVEFQSSBfX2l0dF9tYXJrX29mZihfX2l0dF9tYXJrX3R5cGUgbXQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIGludCwgbWFya19vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX29mZiAgICAgSVRUTk9USUZZX0RBVEEobWFya19vZmYpCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX29mZikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21hcmtfb2ZmKG10KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfbWFya19vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX29mZl9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBVc2UgdGhpcyBpZiBuZWNlc3NhcnkgdG8gY3JlYXRlIGFuICJlbmQiIHBvaW50IGZvciBtYXJrIG9mIHByb2Nlc3MKKyAqIEBzZWUgaW50IF9faXR0X21hcmtfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisgKi8KK2ludCBJVFRBUEkgX19pdHRfbWFya19nbG9iYWxfb2ZmKF9faXR0X21hcmtfdHlwZSBtdCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgaW50LCBtYXJrX2dsb2JhbF9vZmYsIChfX2l0dF9tYXJrX3R5cGUgbXQpKQorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYgICAgIElUVE5PVElGWV9EQVRBKG1hcmtfZ2xvYmFsX29mZikKKyNkZWZpbmUgX19pdHRfbWFya19nbG9iYWxfb2ZmX3B0ciBJVFROT1RJRllfTkFNRShtYXJrX2dsb2JhbF9vZmYpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmYobXQpIChpbnQpMAorI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9tYXJrX2dsb2JhbF9vZmZfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBtYXJrcyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBjb3VudGVyc19pbnRlcm5hbCBDb3VudGVycworICogQGluZ3JvdXAgaW50ZXJuYWwKKyAqIENvdW50ZXJzIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jb3VudGVyICpfX2l0dF9jb3VudGVyOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBjb3VudGVyIHdpdGggZ2l2ZW4gbmFtZS9kb21haW4gZm9yIHRoZSBjYWxsaW5nIHRocmVhZAorICoKKyAqIEFmdGVyIF9faXR0X2NvdW50ZXJfY3JlYXRlKCkgaXMgY2FsbGVkLCBfX2l0dF9jb3VudGVyX2luYygpIC8gX19pdHRfY291bnRlcl9pbmNfZGVsdGEoKSBjYW4gYmUgdXNlZAorICogdG8gaW5jcmVtZW50IHRoZSBjb3VudGVyIG9uIGFueSB0aHJlYWQKKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfY291bnRlciBJVFRBUEkgX19pdHRfY291bnRlcl9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbik7CitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZVcoY29uc3Qgd2NoYXJfdCAqbmFtZSwgY29uc3Qgd2NoYXJfdCAqZG9tYWluKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZVdfcHRyCisjZWxzZSAvKiBVTklDT0RFICovCisjICBkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGUgICAgIF9faXR0X2NvdW50ZXJfY3JlYXRlQQorIyAgZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9jb3VudGVyIElUVEFQSSBfX2l0dF9jb3VudGVyX2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBjb25zdCBjaGFyICpkb21haW4pOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlQSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGNvbnN0IGNoYXIgICAgKmRvbWFpbikpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGNvbnN0IGNoYXIgKmRvbWFpbikpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoY291bnRlcl9jcmVhdGVBKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2NyZWF0ZUFfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVXICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZVcpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9jcmVhdGVXKQorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShjb3VudGVyX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfY3JlYXRlKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlVyhuYW1lLCBkb21haW4pCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlKG5hbWUsIGRvbWFpbikKKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfY291bnRlcl9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfY3JlYXRlX3B0ciAgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBjb3VudGVyIGlkZW50aWZpZWQgYnkgdGhlIHBvaW50ZXIgcHJldmlvdXNseSByZXR1cm5lZCBieSBfX2l0dF9jb3VudGVyX2NyZWF0ZSgpCisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfZGVzdHJveShfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9kZXN0cm95LCAoX19pdHRfY291bnRlciBpZCkpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveSAgICAgSVRUTk9USUZZX1ZPSUQoY291bnRlcl9kZXN0cm95KQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKGNvdW50ZXJfZGVzdHJveSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfZGVzdHJveShpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIEluY3JlbWVudCB0aGUgY291bnRlciB2YWx1ZQorICovCit2b2lkIElUVEFQSSBfX2l0dF9jb3VudGVyX2luYyhfX2l0dF9jb3VudGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmMsIChfX2l0dF9jb3VudGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmMgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmMpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luYyhpZCkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBJbmNyZW1lbnQgdGhlIGNvdW50ZXIgdmFsdWUgd2l0aCB4CisgKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhKF9faXR0X2NvdW50ZXIgaWQsIHVuc2lnbmVkIGxvbmcgbG9uZyB2YWx1ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfaW5jX2RlbHRhLCAoX19pdHRfY291bnRlciBpZCwgdW5zaWduZWQgbG9uZyBsb25nIHZhbHVlKSkKKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGEgICAgIElUVE5PVElGWV9WT0lEKGNvdW50ZXJfaW5jX2RlbHRhKQorI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YV9wdHIgSVRUTk9USUZZX05BTUUoY291bnRlcl9pbmNfZGVsdGEpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9jb3VudGVyX2luY19kZWx0YShpZCwgdmFsdWUpCisjZGVmaW5lIF9faXR0X2NvdW50ZXJfaW5jX2RlbHRhX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfY291bnRlcl9pbmNfZGVsdGFfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBjb3VudGVycyBncm91cCAqLworCisvKioKKyAqIEBkZWZncm91cCBzdGl0Y2ggU3RhY2sgU3RpdGNoaW5nCisgKiBAaW5ncm91cCBpbnRlcm5hbAorICogU3RhY2sgU3RpdGNoaW5nIGdyb3VwCisgKiBAeworICovCisvKioKKyAqIEBicmllZiBvcGFxdWUgc3RydWN0dXJlIGZvciBjb3VudGVyIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9jYWxsZXIgKl9faXR0X2NhbGxlcjsKKworLyoqCisgKiBAYnJpZWYgQ3JlYXRlIHRoZSBzdGl0Y2ggcG9pbnQgZS5nLiBhIHBvaW50IGluIGNhbGwgc3RhY2sgd2hlcmUgb3RoZXIgc3RhY2tzIHNob3VsZCBiZSBzdGl0Y2hlZCB0by4KKyAqIFRoZSBmdW5jdGlvbiByZXR1cm5zIGEgdW5pcXVlIGlkZW50aWZpZXIgd2hpY2ggaXMgdXNlZCB0byBtYXRjaCB0aGUgY3V0IHBvaW50cyB3aXRoIGNvcnJlc3BvbmRpbmcgc3RpdGNoIHBvaW50cy4KKyAqLworX19pdHRfY2FsbGVyIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NhbGxlciwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgKHZvaWQpKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlICAgICBJVFROT1RJRllfREFUQShzdGFja19jYWxsZXJfY3JlYXRlKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShzdGFja19jYWxsZXJfY3JlYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZSgpIChfX2l0dF9jYWxsZXIpMAorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZXJfY3JlYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2NyZWF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBicmllZiBEZXN0cm95IHRoZSBpbmZvcmFtdGlvbiBhYm91dCBzdGl0Y2ggcG9pbnQgaWRlbnRpZmllZCBieSB0aGUgcG9pbnRlciBwcmV2aW91c2x5IHJldHVybmVkIGJ5IF9faXR0X3N0YWNrX2NhbGxlcl9jcmVhdGUoKQorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZXJfZGVzdHJveShfX2l0dF9jYWxsZXIgaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZXJfZGVzdHJveSwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95ICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZXJfZGVzdHJveSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlcl9kZXN0cm95KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3koaWQpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlcl9kZXN0cm95X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVyX2Rlc3Ryb3lfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgU2V0cyB0aGUgY3V0IHBvaW50LiBTdGFjayBmcm9tIGVhY2ggZXZlbnQgd2hpY2ggb2NjdXJzIGFmdGVyIHRoaXMgY2FsbCB3aWxsIGJlIGN1dAorICogYXQgdGhlIHNhbWUgc3RhY2sgbGV2ZWwgdGhlIGZ1bmN0aW9uIHdhcyBjYWxsZWQgYW5kIHN0aXRjaGVkIHRvIHRoZSBjb3JyZXNwb25kaW5nIHN0aXRjaCBwb2ludC4KKyAqLwordm9pZCBJVFRBUEkgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyKF9faXR0X2NhbGxlciBpZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlZV9lbnRlciwgKF9faXR0X2NhbGxlciBpZCkpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlciAgICAgSVRUTk9USUZZX1ZPSUQoc3RhY2tfY2FsbGVlX2VudGVyKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfZW50ZXJfcHRyIElUVE5PVElGWV9OQU1FKHN0YWNrX2NhbGxlZV9lbnRlcikKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcihpZCkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2VudGVyX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFRoaXMgZnVuY3Rpb24gZWxpbWluYXRlcyB0aGUgY3V0IHBvaW50IHdoaWNoIHdhcyBzZXQgYnkgbGF0ZXN0IF9faXR0X3N0YWNrX2NhbGxlZV9lbnRlcigpLgorICovCit2b2lkIElUVEFQSSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmUoX19pdHRfY2FsbGVyIGlkKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2xlYXZlLCAoX19pdHRfY2FsbGVyIGlkKSkKKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlICAgICBJVFROT1RJRllfVk9JRChzdGFja19jYWxsZWVfbGVhdmUpCisjZGVmaW5lIF9faXR0X3N0YWNrX2NhbGxlZV9sZWF2ZV9wdHIgSVRUTk9USUZZX05BTUUoc3RhY2tfY2FsbGVlX2xlYXZlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhY2tfY2FsbGVlX2xlYXZlKGlkKQorI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9zdGFja19jYWxsZWVfbGVhdmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqIEB9IHN0aXRjaCBncm91cCAqLworCisvKiAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiAqLworCisjaW5jbHVkZSA8c3RkYXJnLmg+CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLwordHlwZWRlZiBlbnVtIF9faXR0X2Vycm9yX2NvZGUKK3sKKyAgICBfX2l0dF9lcnJvcl9zdWNjZXNzICAgICAgID0gMCwgLyohPCBubyBlcnJvciAqLworICAgIF9faXR0X2Vycm9yX25vX21vZHVsZSAgICAgPSAxLCAvKiE8IG1vZHVsZSBjYW4ndCBiZSBsb2FkZWQgKi8KKyAgICAvKiAlMSRzIC0tIGxpYnJhcnkgbmFtZTsgd2luOiAlMiRkIC0tIHN5c3RlbSBlcnJvciBjb2RlOyB1bng6ICUyJHMgLS0gc3lzdGVtIGVycm9yIG1lc3NhZ2UuICovCisgICAgX19pdHRfZXJyb3Jfbm9fc3ltYm9sICAgICA9IDIsIC8qITwgc3ltYm9sIG5vdCBmb3VuZCAqLworICAgIC8qICUxJHMgLS0gbGlicmFyeSBuYW1lLCAlMiRzIC0tIHN5bWJvbCBuYW1lLiAqLworICAgIF9faXR0X2Vycm9yX3Vua25vd25fZ3JvdXAgPSAzLCAvKiE8IHVua25vd24gZ3JvdXAgc3BlY2lmaWVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJHMgLS0gZ3JvdXAgbmFtZS4gKi8KKyAgICBfX2l0dF9lcnJvcl9jYW50X3JlYWRfZW52ID0gNCwgLyohPCBHZXRFbnZpcm9ubWVudFZhcmlhYmxlKCkgZmFpbGVkICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gc3lzdGVtIGVycm9yLiAqLworICAgIF9faXR0X2Vycm9yX2Vudl90b29fbG9uZyAgPSA1LCAvKiE8IHZhcmlhYmxlIHZhbHVlIHRvbyBsb25nICovCisgICAgLyogJTEkcyAtLSBlbnYgdmFyIG5hbWUsICUyJGQgLS0gYWN0dWFsIGxlbmd0aCBvZiB0aGUgdmFyLCAlMyRkIC0tIG1heCBhbGxvd2VkIGxlbmd0aC4gKi8KKyAgICBfX2l0dF9lcnJvcl9zeXN0ZW0gICAgICAgID0gNiAgLyohPCBwdGhyZWFkX211dGV4YXR0cl9pbml0IG9yIHB0aHJlYWRfbXV0ZXhfaW5pdCBmYWlsZWQgKi8KKyAgICAvKiAlMSRzIC0tIGZ1bmN0aW9uIG5hbWUsICUyJGQgLS0gZXJybm8uICovCit9IF9faXR0X2Vycm9yX2NvZGU7CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfZXJyb3JfaGFuZGxlcl90KShfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIHZhX2xpc3QpOworX19pdHRfZXJyb3JfaGFuZGxlcl90KiBfX2l0dF9zZXRfZXJyb3JfaGFuZGxlcihfX2l0dF9lcnJvcl9oYW5kbGVyX3QqKTsKKworY29uc3QgY2hhciogSVRUQVBJIF9faXR0X2FwaV92ZXJzaW9uKHZvaWQpOworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNkZWZpbmUgX19pdHRfZXJyb3JfaGFuZGxlciBJVFRfSk9JTihJTlRFTF9JVFROT1RJRllfUFJFRklYLCBlcnJvcl9oYW5kbGVyKQordm9pZCBfX2l0dF9lcnJvcl9oYW5kbGVyKF9faXR0X2Vycm9yX2NvZGUgY29kZSwgdmFfbGlzdCBhcmdzKTsKK2V4dGVybiBjb25zdCBpbnQgSVRUTk9USUZZX05BTUUoZXJyKTsKKyNkZWZpbmUgX19pdHRfZXJyIElUVE5PVElGWV9OQU1FKGVycikKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCkpCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uICAgICBJVFROT1RJRllfREFUQShhcGlfdmVyc2lvbikKKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIElUVE5PVElGWV9OQU1FKGFwaV92ZXJzaW9uKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb24oKSAgIChjb25zdCBjaGFyKikwCisjZGVmaW5lIF9faXR0X2FwaV92ZXJzaW9uX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfYXBpX3ZlcnNpb25fcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmZGVmIF9fY3BsdXNwbHVzCit9CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworI2VuZGlmIC8qIF9JVFROT1RJRllfUFJJVkFURV8gKi8KKworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9BUElfUFJJVkFURSAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9jb25maWcuaCBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTA2ODIzOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfY29uZmlnLmgKQEAgLTAsMCArMSw0NzggQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX0NPTkZJR19IXworI2RlZmluZSBfSVRUTk9USUZZX0NPTkZJR19IXworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSVRUX09TX1dJTgorIyAgZGVmaW5lIElUVF9PU19XSU4gICAxCisjZW5kaWYgLyogSVRUX09TX1dJTiAqLworCisjaWZuZGVmIElUVF9PU19MSU5VWAorIyAgZGVmaW5lIElUVF9PU19MSU5VWCAyCisjZW5kaWYgLyogSVRUX09TX0xJTlVYICovCisKKyNpZm5kZWYgSVRUX09TX01BQworIyAgZGVmaW5lIElUVF9PU19NQUMgICAzCisjZW5kaWYgLyogSVRUX09TX01BQyAqLworCisjaWZuZGVmIElUVF9PUworIyAgaWYgZGVmaW5lZCBXSU4zMiB8fCBkZWZpbmVkIF9XSU4zMgorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19XSU4KKyMgIGVsaWYgZGVmaW5lZCggX19BUFBMRV9fICkgJiYgZGVmaW5lZCggX19NQUNIX18gKQorIyAgICBkZWZpbmUgSVRUX09TIElUVF9PU19NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTElOVVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX09TICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1dJTgorIyAgZGVmaW5lIElUVF9QTEFURk9STV9XSU4gMQorI2VuZGlmIC8qIElUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fUE9TSVggMgorI2VuZGlmIC8qIElUVF9QTEFURk9STV9QT1NJWCAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9NQUMKKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fTUFDIDMKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fTUFDICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNCisjICBpZiBJVFRfT1M9PUlUVF9PU19XSU4KKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fV0lOCisjICBlbGlmIElUVF9PUz09SVRUX09TX01BQworIyAgICBkZWZpbmUgSVRUX1BMQVRGT1JNIElUVF9QTEFURk9STV9NQUMKKyMgIGVsc2UKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fUE9TSVgKKyMgIGVuZGlmCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNICovCisKKyNpZiBkZWZpbmVkKF9VTklDT0RFKSAmJiAhZGVmaW5lZChVTklDT0RFKQorI2RlZmluZSBVTklDT0RFCisjZW5kaWYKKworI2luY2x1ZGUgPHN0ZGRlZi5oPgorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2luY2x1ZGUgPHRjaGFyLmg+CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaW5jbHVkZSA8c3RkaW50Lmg+CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorI2luY2x1ZGUgPHdjaGFyLmg+CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWZuZGVmIENERUNMCisjICBpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyMgICAgZGVmaW5lIENERUNMIF9fY2RlY2wKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIENERUNMIF9fYXR0cmlidXRlX18gKChjZGVjbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgQ0RFQ0wgLyogYWN0dWFsIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIENERUNMICovCisKKyNpZm5kZWYgU1REQ0FMTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBTVERDQUxMIF9fc3RkY2FsbAorIyAgZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyMgICAgaWYgZGVmaW5lZCBfTV9JWDg2IHx8IGRlZmluZWQgX19pMzg2X18KKyMgICAgICBkZWZpbmUgU1REQ0FMTCBfX2F0dHJpYnV0ZV9fICgoc3RkY2FsbCkpCisjICAgIGVsc2UgIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgICAgICBkZWZpbmUgU1REQ0FMTCAvKiBzdXBwb3J0ZWQgb25seSBvbiB4ODYgcGxhdGZvcm0gKi8KKyMgICAgZW5kaWYgLyogX01fSVg4NiB8fCBfX2kzODZfXyAqLworIyAgZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogU1REQ0FMTCAqLworCisjZGVmaW5lIElUVEFQSSAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUEkgQ0RFQ0wKKworLyogVE9ETzogVGVtcG9yYXJ5IGZvciBjb21wYXRpYmlsaXR5ISAqLworI2RlZmluZSBJVFRBUElfQ0FMTCAgICBDREVDTAorI2RlZmluZSBMSUJJVFRBUElfQ0FMTCBDREVDTAorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisvKiB1c2UgX19mb3JjZWlubGluZSAoVkMrKyBzcGVjaWZpYykgKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgX19mb3JjZWlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSAvKiBub3RoaW5nICovCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKgorICogR2VuZXJhbGx5LCBmdW5jdGlvbnMgYXJlIG5vdCBpbmxpbmVkIHVubGVzcyBvcHRpbWl6YXRpb24gaXMgc3BlY2lmaWVkLgorICogRm9yIGZ1bmN0aW9ucyBkZWNsYXJlZCBpbmxpbmUsIHRoaXMgYXR0cmlidXRlIGlubGluZXMgdGhlIGZ1bmN0aW9uIGV2ZW4KKyAqIGlmIG5vIG9wdGltaXphdGlvbiBsZXZlbCB3YXMgc3BlY2lmaWVkLgorICovCisjaWZkZWYgX19TVFJJQ1RfQU5TSV9fCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIHN0YXRpYworI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKCh1bnVzZWQpKQorI2Vsc2UgIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMgaW5saW5lCisjZGVmaW5lIElUVF9JTkxJTkVfQVRUUklCVVRFIF9fYXR0cmlidXRlX18oKGFsd2F5c19pbmxpbmUsIHVudXNlZCkpCisjZW5kaWYgLyogX19TVFJJQ1RfQU5TSV9fICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisvKiogQGVuZGNvbmQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyCisjICBkZWZpbmUgSVRUX0FSQ0hfSUEzMiAgMQorI2VuZGlmIC8qIElUVF9BUkNIX0lBMzIgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9JQTMyRQorIyAgZGVmaW5lIElUVF9BUkNIX0lBMzJFIDIKKyNlbmRpZiAvKiBJVFRfQVJDSF9JQTMyRSAqLworCisvKiBXYXMgdGhlcmUgYSBtYWdpY2FsIHJlYXNvbiB3ZSBkaWRuJ3QgaGF2ZSAzIGhlcmUgYmVmb3JlPyAqLworI2lmbmRlZiBJVFRfQVJDSF9BQVJDSDY0CisjICBkZWZpbmUgSVRUX0FSQ0hfQUFSQ0g2NCAgMworI2VuZGlmIC8qIElUVF9BUkNIX0FBUkNINjQgKi8KKworI2lmbmRlZiBJVFRfQVJDSF9BUk0KKyMgIGRlZmluZSBJVFRfQVJDSF9BUk0gIDQKKyNlbmRpZiAvKiBJVFRfQVJDSF9BUk0gKi8KKworI2lmbmRlZiBJVFRfQVJDSF9QUEM2NAorIyAgZGVmaW5lIElUVF9BUkNIX1BQQzY0ICA1CisjZW5kaWYgLyogSVRUX0FSQ0hfUFBDNjQgKi8KKworCisjaWZuZGVmIElUVF9BUkNICisjICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMgorIyAgZWxpZiBkZWZpbmVkIF9NX1g2NCB8fCBkZWZpbmVkIF9NX0FNRDY0IHx8IGRlZmluZWQgX194ODZfNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfSUEzMkUKKyMgIGVsaWYgZGVmaW5lZCBfTV9JQTY0IHx8IGRlZmluZWQgX19pYTY0X18KKyMgICAgZGVmaW5lIElUVF9BUkNIIElUVF9BUkNIX0lBNjQKKyMgIGVsaWYgZGVmaW5lZCBfTV9BUk0gfHwgX19hcm1fXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQVJNCisjICBlbGlmIGRlZmluZWQgX19wb3dlcnBjNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfUFBDNjQKKyMgIGVsaWYgZGVmaW5lZCBfX2FhcmNoNjRfXworIyAgICBkZWZpbmUgSVRUX0FSQ0ggSVRUX0FSQ0hfQUFSQ0g2NAorIyAgZW5kaWYKKyNlbmRpZgorCisjaWZkZWYgX19jcGx1c3BsdXMKKyMgIGRlZmluZSBJVFRfRVhURVJOX0MgZXh0ZXJuICJDIgorIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19CRUdJTiBleHRlcm4gIkMiIHsKKyMgIGRlZmluZSBJVFRfRVhURVJOX0NfRU5EIH0KKyNlbHNlCisjICBkZWZpbmUgSVRUX0VYVEVSTl9DIC8qIG5vdGhpbmcgKi8KKyMgIGRlZmluZSBJVFRfRVhURVJOX0NfQkVHSU4gLyogbm90aGluZyAqLworIyAgZGVmaW5lIElUVF9FWFRFUk5fQ19FTkQgLyogbm90aGluZyAqLworI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNkZWZpbmUgSVRUX1RPX1NUUl9BVVgoeCkgI3gKKyNkZWZpbmUgSVRUX1RPX1NUUih4KSAgICAgSVRUX1RPX1NUUl9BVVgoeCkKKworI2RlZmluZSBfX0lUVF9CVUlMRF9BU1NFUlQoZXhwciwgc3VmZml4KSBkbyB7IFwKKyAgICBzdGF0aWMgY2hhciBfX2l0dF9idWlsZF9jaGVja18jI3N1ZmZpeFsoZXhwcikgPyAxIDogLTFdOyBcCisgICAgX19pdHRfYnVpbGRfY2hlY2tfIyNzdWZmaXhbMF0gPSAwOyBcCit9IHdoaWxlKDApCisjZGVmaW5lIF9JVFRfQlVJTERfQVNTRVJUKGV4cHIsIHN1ZmZpeCkgIF9fSVRUX0JVSUxEX0FTU0VSVCgoZXhwciksIHN1ZmZpeCkKKyNkZWZpbmUgSVRUX0JVSUxEX0FTU0VSVChleHByKSAgICAgICAgICAgX0lUVF9CVUlMRF9BU1NFUlQoKGV4cHIpLCBfX0xJTkVfXykKKworI2RlZmluZSBJVFRfTUFHSUMgeyAweEVELCAweEFCLCAweEFCLCAweEVDLCAweDBELCAweEVFLCAweERBLCAweDMwIH0KKworLyogUmVwbGFjZSB3aXRoIHNuYXBzaG90IGRhdGUgWVlZWU1NREQgZm9yIHByb21vdGlvbiBidWlsZC4gKi8KKyNkZWZpbmUgQVBJX1ZFUlNJT05fQlVJTEQgICAgMjAxMTExMTEKKworI2lmbmRlZiBBUElfVkVSU0lPTl9OVU0KKyNkZWZpbmUgQVBJX1ZFUlNJT05fTlVNIDAuMC4wCisjZW5kaWYgLyogQVBJX1ZFUlNJT05fTlVNICovCisKKyNkZWZpbmUgQVBJX1ZFUlNJT04gIklUVC1BUEktVmVyc2lvbiAiIElUVF9UT19TVFIoQVBJX1ZFUlNJT05fTlVNKSBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIgKCIgSVRUX1RPX1NUUihBUElfVkVSU0lPTl9CVUlMRCkgIikiCisKKy8qIE9TIGNvbW11bmljYXRpb24gZnVuY3Rpb25zICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBITU9EVUxFICAgICAgICAgICBsaWJfdDsKK3R5cGVkZWYgRFdPUkQgICAgICAgICAgICAgVElEVDsKK3R5cGVkZWYgQ1JJVElDQUxfU0VDVElPTiAgbXV0ZXhfdDsKKyNkZWZpbmUgTVVURVhfSU5JVElBTElaRVIgeyAwIH0KKyNkZWZpbmUgc3Ryb25nX2FsaWFzKG5hbWUsIGFsaWFzbmFtZSkgLyogZW1wdHkgZm9yIFdpbmRvd3MgKi8KKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxkbGZjbi5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNpZm5kZWYgX0dOVV9TT1VSQ0UKKyNkZWZpbmUgX0dOVV9TT1VSQ0UgMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSAqLworI2VuZGlmIC8qIF9HTlVfU09VUkNFICovCisjaWZuZGVmIF9fVVNFX1VOSVg5OAorI2RlZmluZSBfX1VTRV9VTklYOTggMSAvKiBuZWVkIGZvciBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSwgb24gU0xFUzExLjEgd2l0aCBnY2MgNC4zLjQgd2hlcmVpbiBwdGhyZWFkLmggbWlzc2luZyBkZXBlbmRlbmN5IG9uIF9fVVNFX1hPUEVOMks4ICovCisjZW5kaWYgLypfX1VTRV9VTklYOTgqLworI2luY2x1ZGUgPHB0aHJlYWQuaD4KK3R5cGVkZWYgdm9pZCogICAgICAgICAgICAgbGliX3Q7Cit0eXBlZGVmIHB0aHJlYWRfdCAgICAgICAgIFRJRFQ7Cit0eXBlZGVmIHB0aHJlYWRfbXV0ZXhfdCAgIG11dGV4X3Q7CisjZGVmaW5lIE1VVEVYX0lOSVRJQUxJWkVSIFBUSFJFQURfTVVURVhfSU5JVElBTElaRVIKKyNkZWZpbmUgX3N0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIFwKKyAgICAgICAgICAgIGV4dGVybiBfX3R5cGVvZiAobmFtZSkgYWxpYXNuYW1lIF9fYXR0cmlidXRlX18gKChhbGlhcyAoI25hbWUpKSk7CisjZGVmaW5lIHN0cm9uZ19hbGlhcyhuYW1lLCBhbGlhc25hbWUpIF9zdHJvbmdfYWxpYXMobmFtZSwgYWxpYXNuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2dldF9wcm9jKGxpYiwgbmFtZSkgR2V0UHJvY0FkZHJlc3MobGliLCBuYW1lKQorI2RlZmluZSBfX2l0dF9tdXRleF9pbml0KG11dGV4KSAgIEluaXRpYWxpemVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X2xvY2sobXV0ZXgpICAgRW50ZXJDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgTGVhdmVDcml0aWNhbFNlY3Rpb24obXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgTG9hZExpYnJhcnlBKG5hbWUpCisjZGVmaW5lIF9faXR0X3VubG9hZF9saWIoaGFuZGxlKSAgRnJlZUxpYnJhcnkoaGFuZGxlKQorI2RlZmluZSBfX2l0dF9zeXN0ZW1fZXJyb3IoKSAgICAgIChpbnQpR2V0TGFzdEVycm9yKCkKKyNkZWZpbmUgX19pdHRfZnN0cmNtcChzMSwgczIpICAgICBsc3RyY21wQShzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgbHN0cmxlbkEocykKKyNkZWZpbmUgX19pdHRfZnN0cmNweW4oczEsIHMyLCBsKSBsc3RyY3B5bkEoczEsIHMyLCBsKQorI2RlZmluZSBfX2l0dF9mc3RyZHVwKHMpICAgICAgICAgIF9zdHJkdXAocykKKyNkZWZpbmUgX19pdHRfdGhyZWFkX2lkKCkgICAgICAgICBHZXRDdXJyZW50VGhyZWFkSWQoKQorI2RlZmluZSBfX2l0dF90aHJlYWRfeWllbGQoKSAgICAgIFN3aXRjaFRvVGhyZWFkKCkKKyNpZm5kZWYgSVRUX1NJTVBMRV9JTklUCitJVFRfSU5MSU5FIGxvbmcKK19faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpIElUVF9JTkxJTkVfQVRUUklCVVRFOworSVRUX0lOTElORSBsb25nIF9faXR0X2ludGVybG9ja2VkX2luY3JlbWVudCh2b2xhdGlsZSBsb25nKiBwdHIpCit7CisgICAgcmV0dXJuIEludGVybG9ja2VkSW5jcmVtZW50KHB0cik7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZWxzZSAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfZ2V0X3Byb2MobGliLCBuYW1lKSBkbHN5bShsaWIsIG5hbWUpCisjZGVmaW5lIF9faXR0X211dGV4X2luaXQobXV0ZXgpICAge1wKKyAgICBwdGhyZWFkX211dGV4YXR0cl90IG11dGV4X2F0dHI7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgaW50IGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9pbml0KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhhdHRyX2luaXQiLCAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9zZXR0eXBlKCZtdXRleF9hdHRyLCAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBQVEhSRUFEX01VVEVYX1JFQ1VSU0lWRSk7ICAgICAgICBcCisgICAgaWYgKGVycm9yX2NvZGUpICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfc3lzdGVtLCAicHRocmVhZF9tdXRleGF0dHJfc2V0dHlwZSIsIFwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGVycm9yX2NvZGUpOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgZXJyb3JfY29kZSA9IHB0aHJlYWRfbXV0ZXhfaW5pdChtdXRleCwgJm11dGV4X2F0dHIpOyAgICAgICAgICAgICAgICAgICAgXAorICAgIGlmIChlcnJvcl9jb2RlKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX3N5c3RlbSwgInB0aHJlYWRfbXV0ZXhfaW5pdCIsICAgICAgICBcCisgICAgICAgICAgICAgICAgICAgICAgICAgICBlcnJvcl9jb2RlKTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIGVycm9yX2NvZGUgPSBwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95KCZtdXRleF9hdHRyKTsgICAgICAgICAgICAgICAgICAgIFwKKyAgICBpZiAoZXJyb3JfY29kZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9zeXN0ZW0sICJwdGhyZWFkX211dGV4YXR0cl9kZXN0cm95IiwgXAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZXJyb3JfY29kZSk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKyNkZWZpbmUgX19pdHRfbXV0ZXhfbG9jayhtdXRleCkgICBwdGhyZWFkX211dGV4X2xvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X211dGV4X3VubG9jayhtdXRleCkgcHRocmVhZF9tdXRleF91bmxvY2sobXV0ZXgpCisjZGVmaW5lIF9faXR0X2xvYWRfbGliKG5hbWUpICAgICAgZGxvcGVuKG5hbWUsIFJUTERfTEFaWSkKKyNkZWZpbmUgX19pdHRfdW5sb2FkX2xpYihoYW5kbGUpICBkbGNsb3NlKGhhbmRsZSkKKyNkZWZpbmUgX19pdHRfc3lzdGVtX2Vycm9yKCkgICAgICBlcnJubworI2RlZmluZSBfX2l0dF9mc3RyY21wKHMxLCBzMikgICAgIHN0cmNtcChzMSwgczIpCisjZGVmaW5lIF9faXR0X2ZzdHJsZW4ocykgICAgICAgICAgc3RybGVuKHMpCisjZGVmaW5lIF9faXR0X2ZzdHJjcHluKHMxLCBzMiwgbCkgc3RybmNweShzMSwgczIsIGwpCisjZGVmaW5lIF9faXR0X2ZzdHJkdXAocykgICAgICAgICAgc3RyZHVwKHMpCisjZGVmaW5lIF9faXR0X3RocmVhZF9pZCgpICAgICAgICAgcHRocmVhZF9zZWxmKCkKKyNkZWZpbmUgX19pdHRfdGhyZWFkX3lpZWxkKCkgICAgICBzY2hlZF95aWVsZCgpCisjaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBNjQKKyNpZmRlZiBfX0lOVEVMX0NPTVBJTEVSCisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19mZXRjaGFkZDRfYWNxKCh2b2lkICopYWRkciwgdmFsKQorI2Vsc2UgIC8qIF9fSU5URUxfQ09NUElMRVIgKi8KKy8qIFRPRE86IEFkZCBTdXBwb3J0IGZvciBub3QgSW50ZWwgY29tcGlsZXJzIGZvciBJQS02NCBhcmNoaXRlY3R1cmUgKi8KKyNlbmRpZiAvKiBfX0lOVEVMX0NPTVBJTEVSICovCisjZWxpZiBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMiB8fCBJVFRfQVJDSD09SVRUX0FSQ0hfSUEzMkUgLyogSVRUX0FSQ0ghPUlUVF9BUkNIX0lBNjQgKi8KK0lUVF9JTkxJTkUgbG9uZworX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkgSVRUX0lOTElORV9BVFRSSUJVVEU7CitJVFRfSU5MSU5FIGxvbmcgX19UQkJfbWFjaGluZV9mZXRjaGFkZDQodm9sYXRpbGUgdm9pZCogcHRyLCBsb25nIGFkZGVuZCkKK3sKKyAgICBsb25nIHJlc3VsdDsKKyAgICBfX2FzbV9fIF9fdm9sYXRpbGVfXygibG9ja1xueGFkZCAlMCwlMSIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAiPXIiKHJlc3VsdCksIj1tIigqKGludCopcHRyKQorICAgICAgICAgICAgICAgICAgICAgICAgICA6ICIwIihhZGRlbmQpLCAibSIoKihpbnQqKXB0cikKKyAgICAgICAgICAgICAgICAgICAgICAgICAgOiAibWVtb3J5Iik7CisgICAgcmV0dXJuIHJlc3VsdDsKK30KKyNlbGlmIElUVF9BUkNIPT1JVFRfQVJDSF9BUk0gfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX1BQQzY0IHx8IElUVF9BUkNIPT1JVFRfQVJDSF9BQVJDSDY0CisjZGVmaW5lIF9fVEJCX21hY2hpbmVfZmV0Y2hhZGQ0KGFkZHIsIHZhbCkgX19zeW5jX2ZldGNoX2FuZF9hZGQoYWRkciwgdmFsKQorI2VuZGlmIC8qIElUVF9BUkNIPT1JVFRfQVJDSF9JQTY0ICovCisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorSVRUX0lOTElORSBsb25nCitfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKSBJVFRfSU5MSU5FX0FUVFJJQlVURTsKK0lUVF9JTkxJTkUgbG9uZyBfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQodm9sYXRpbGUgbG9uZyogcHRyKQoreworICAgIHJldHVybiBfX1RCQl9tYWNoaW5lX2ZldGNoYWRkNChwdHIsIDEpICsgMUw7Cit9CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3R5cGVkZWYgZW51bSB7CisgICAgX19pdHRfY29sbGVjdGlvbl9ub3JtYWwgPSAwLAorICAgIF9faXR0X2NvbGxlY3Rpb25fcGF1c2VkID0gMQorfSBfX2l0dF9jb2xsZWN0aW9uX3N0YXRlOworCit0eXBlZGVmIGVudW0geworICAgIF9faXR0X3RocmVhZF9ub3JtYWwgID0gMCwKKyAgICBfX2l0dF90aHJlYWRfaWdub3JlZCA9IDEKK30gX19pdHRfdGhyZWFkX3N0YXRlOworCisjcHJhZ21hIHBhY2socHVzaCwgOCkKKwordHlwZWRlZiBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvCit7CisgICAgY29uc3QgY2hhciogbmFtZUE7IC8qITwgQ29weSBvZiBvcmlnaW5hbCBuYW1lIGluIEFTQ0lJLiAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICBjb25zdCB3Y2hhcl90KiBuYW1lVzsgLyohPCBDb3B5IG9mIG9yaWdpbmFsIG5hbWUgaW4gVU5JQ09ERS4gKi8KKyNlbHNlICAvKiBVTklDT0RFIHx8IF9VTklDT0RFICovCisgICAgdm9pZCogbmFtZVc7CisjZW5kaWYgLyogVU5JQ09ERSB8fCBfVU5JQ09ERSAqLworICAgIFRJRFQgICAgICAgICAgICAgICB0aWQ7CisgICAgX19pdHRfdGhyZWFkX3N0YXRlIHN0YXRlOyAgIC8qITwgVGhyZWFkIHN0YXRlIChwYXVzZWQgb3Igbm9ybWFsKSAqLworICAgIGludCAgICAgICAgICAgICAgICBleHRyYTE7ICAvKiE8IFJlc2VydmVkIHRvIHRoZSBydW50aW1lICovCisgICAgdm9pZCogICAgICAgICAgICAgIGV4dHJhMjsgIC8qITwgUmVzZXJ2ZWQgdG8gdGhlIHJ1bnRpbWUgKi8KKyAgICBzdHJ1Y3QgX19faXR0X3RocmVhZF9pbmZvKiBuZXh0OworfSBfX2l0dF90aHJlYWRfaW5mbzsKKworI2luY2x1ZGUgIml0dG5vdGlmeV90eXBlcy5oIiAvKiBGb3IgX19pdHRfZ3JvdXBfaWQgZGVmaW5pdGlvbiAqLworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm9fMjAxMDEwMDEKK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICBfX2l0dF9ncm91cF9pZCBncm91cDsKK30gIF9faXR0X2FwaV9pbmZvXzIwMTAxMDAxOworCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfYXBpX2luZm8KK3sKKyAgICBjb25zdCBjaGFyKiAgICBuYW1lOworICAgIHZvaWQqKiAgICAgICAgIGZ1bmNfcHRyOworICAgIHZvaWQqICAgICAgICAgIGluaXRfZnVuYzsKKyAgICB2b2lkKiAgICAgICAgICBudWxsX2Z1bmM7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXA7Cit9ICBfX2l0dF9hcGlfaW5mbzsKKworc3RydWN0IF9fX2l0dF9kb21haW47CitzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGU7CisKK3R5cGVkZWYgc3RydWN0IF9fX2l0dF9nbG9iYWwKK3sKKyAgICB1bnNpZ25lZCBjaGFyICAgICAgICAgIG1hZ2ljWzhdOworICAgIHVuc2lnbmVkIGxvbmcgICAgICAgICAgdmVyc2lvbl9tYWpvcjsKKyAgICB1bnNpZ25lZCBsb25nICAgICAgICAgIHZlcnNpb25fbWlub3I7CisgICAgdW5zaWduZWQgbG9uZyAgICAgICAgICB2ZXJzaW9uX2J1aWxkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgYXBpX2luaXRpYWxpemVkOworICAgIHZvbGF0aWxlIGxvbmcgICAgICAgICAgbXV0ZXhfaW5pdGlhbGl6ZWQ7CisgICAgdm9sYXRpbGUgbG9uZyAgICAgICAgICBhdG9taWNfY291bnRlcjsKKyAgICBtdXRleF90ICAgICAgICAgICAgICAgIG11dGV4OworICAgIGxpYl90ICAgICAgICAgICAgICAgICAgbGliOworICAgIHZvaWQqICAgICAgICAgICAgICAgICAgZXJyb3JfaGFuZGxlcjsKKyAgICBjb25zdCBjaGFyKiogICAgICAgICAgIGRsbF9wYXRoX3B0cjsKKyAgICBfX2l0dF9hcGlfaW5mbyogICAgICAgIGFwaV9saXN0X3B0cjsKKyAgICBzdHJ1Y3QgX19faXR0X2dsb2JhbCogIG5leHQ7CisgICAgLyogSm9pbmFibGUgc3RydWN0dXJlcyBiZWxvdyAqLworICAgIF9faXR0X3RocmVhZF9pbmZvKiAgICAgdGhyZWFkX2xpc3Q7CisgICAgc3RydWN0IF9fX2l0dF9kb21haW4qICBkb21haW5fbGlzdDsKKyAgICBzdHJ1Y3QgX19faXR0X3N0cmluZ19oYW5kbGUqIHN0cmluZ19saXN0OworICAgIF9faXR0X2NvbGxlY3Rpb25fc3RhdGUgc3RhdGU7Cit9IF9faXR0X2dsb2JhbDsKKworI3ByYWdtYSBwYWNrKHBvcCkKKworI2RlZmluZSBORVdfVEhSRUFEX0lORk9fVyhncHRyLGgsaF90YWlsLHQscyxuKSB7IFwKKyAgICBoID0gKF9faXR0X3RocmVhZF9pbmZvKiltYWxsb2Moc2l6ZW9mKF9faXR0X3RocmVhZF9pbmZvKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+dGlkICAgID0gdDsgXAorICAgICAgICBoLT5uYW1lQSAgPSBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IG4gPyBfd2NzZHVwKG4pIDogTlVMTDsgXAorICAgICAgICBoLT5zdGF0ZSAgPSBzOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT50aHJlYWRfbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1RIUkVBRF9JTkZPX0EoZ3B0cixoLGhfdGFpbCx0LHMsbikgeyBcCisgICAgaCA9IChfX2l0dF90aHJlYWRfaW5mbyopbWFsbG9jKHNpemVvZihfX2l0dF90aHJlYWRfaW5mbykpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPnRpZCAgICA9IHQ7IFwKKyAgICAgICAgaC0+bmFtZUEgID0gbiA/IF9faXR0X2ZzdHJkdXAobikgOiBOVUxMOyBcCisgICAgICAgIGgtPm5hbWVXICA9IE5VTEw7IFwKKyAgICAgICAgaC0+c3RhdGUgID0gczsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+dGhyZWFkX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZGVmaW5lIE5FV19ET01BSU5fVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfZG9tYWluKiltYWxsb2Moc2l6ZW9mKF9faXR0X2RvbWFpbikpOyBcCisgICAgaWYgKGggIT0gTlVMTCkgeyBcCisgICAgICAgIGgtPmZsYWdzICA9IDA7ICAgIC8qIGRvbWFpbiBpcyBkaXNhYmxlZCBieSBkZWZhdWx0ICovIFwKKyAgICAgICAgaC0+bmFtZUEgID0gTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPmRvbWFpbl9saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfRE9NQUlOX0EoZ3B0cixoLGhfdGFpbCxuYW1lKSB7IFwKKyAgICBoID0gKF9faXR0X2RvbWFpbiopbWFsbG9jKHNpemVvZihfX2l0dF9kb21haW4pKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5mbGFncyAgPSAwOyAgICAvKiBkb21haW4gaXMgZGlzYWJsZWQgYnkgZGVmYXVsdCAqLyBcCisgICAgICAgIGgtPm5hbWVBICA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsgXAorICAgICAgICBoLT5uYW1lVyAgPSBOVUxMOyBcCisgICAgICAgIGgtPmV4dHJhMSA9IDA7ICAgIC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+ZXh0cmEyID0gTlVMTDsgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5uZXh0ICAgPSBOVUxMOyBcCisgICAgICAgIGlmIChoX3RhaWwgPT0gTlVMTCkgXAorICAgICAgICAgICAgKGdwdHIpLT5kb21haW5fbGlzdCA9IGg7IFwKKyAgICAgICAgZWxzZSBcCisgICAgICAgICAgICBoX3RhaWwtPm5leHQgPSBoOyBcCisgICAgfSBcCit9CisKKyNkZWZpbmUgTkVXX1NUUklOR19IQU5ETEVfVyhncHRyLGgsaF90YWlsLG5hbWUpIHsgXAorICAgIGggPSAoX19pdHRfc3RyaW5nX2hhbmRsZSopbWFsbG9jKHNpemVvZihfX2l0dF9zdHJpbmdfaGFuZGxlKSk7IFwKKyAgICBpZiAoaCAhPSBOVUxMKSB7IFwKKyAgICAgICAgaC0+c3RyQSAgID0gTlVMTDsgXAorICAgICAgICBoLT5zdHJXICAgPSBuYW1lID8gX3djc2R1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+ZXh0cmExID0gMDsgICAgLyogcmVzZXJ2ZWQgKi8gXAorICAgICAgICBoLT5leHRyYTIgPSBOVUxMOyAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPm5leHQgICA9IE5VTEw7IFwKKyAgICAgICAgaWYgKGhfdGFpbCA9PSBOVUxMKSBcCisgICAgICAgICAgICAoZ3B0ciktPnN0cmluZ19saXN0ID0gaDsgXAorICAgICAgICBlbHNlIFwKKyAgICAgICAgICAgIGhfdGFpbC0+bmV4dCA9IGg7IFwKKyAgICB9IFwKK30KKworI2RlZmluZSBORVdfU1RSSU5HX0hBTkRMRV9BKGdwdHIsaCxoX3RhaWwsbmFtZSkgeyBcCisgICAgaCA9IChfX2l0dF9zdHJpbmdfaGFuZGxlKiltYWxsb2Moc2l6ZW9mKF9faXR0X3N0cmluZ19oYW5kbGUpKTsgXAorICAgIGlmIChoICE9IE5VTEwpIHsgXAorICAgICAgICBoLT5zdHJBICAgPSBuYW1lID8gX19pdHRfZnN0cmR1cChuYW1lKSA6IE5VTEw7IFwKKyAgICAgICAgaC0+c3RyVyAgID0gTlVMTDsgXAorICAgICAgICBoLT5leHRyYTEgPSAwOyAgICAvKiByZXNlcnZlZCAqLyBcCisgICAgICAgIGgtPmV4dHJhMiA9IE5VTEw7IC8qIHJlc2VydmVkICovIFwKKyAgICAgICAgaC0+bmV4dCAgID0gTlVMTDsgXAorICAgICAgICBpZiAoaF90YWlsID09IE5VTEwpIFwKKyAgICAgICAgICAgIChncHRyKS0+c3RyaW5nX2xpc3QgPSBoOyBcCisgICAgICAgIGVsc2UgXAorICAgICAgICAgICAgaF90YWlsLT5uZXh0ID0gaDsgXAorICAgIH0gXAorfQorCisjZW5kaWYgLyogX0lUVE5PVElGWV9DT05GSUdfSF8gKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmMgYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVmMzY1NzMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvaXR0bm90aWZ5X3N0YXRpYy5jCkBAIC0wLDAgKzEsMTA1MSBAQAorCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBQQVRIX01BWCA1MTIKKyNlbHNlIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgPGRsZmNuLmg+CisjaW5jbHVkZSA8ZXJybm8uaD4KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGFyZy5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorCisjZGVmaW5lIElOVEVMX05PX01BQ1JPX0JPRFkKKyNkZWZpbmUgSU5URUxfSVRUTk9USUZZX0FQSV9QUklWQVRFCisjaW5jbHVkZSAiaXR0bm90aWZ5LmgiCisjaW5jbHVkZSAibGVnYWN5L2l0dG5vdGlmeS5oIgorCisjaW5jbHVkZSAiZGlzYWJsZV93YXJuaW5ncy5oIgorCitzdGF0aWMgY29uc3QgY2hhciBhcGlfdmVyc2lvbltdID0gQVBJX1ZFUlNJT04gIlwwXG5AKCMpICRSZXZpc2lvbjogNDMzNzUgJFxuIjsKKworI2RlZmluZSBfTl8obikgSVRUX0pPSU4oSU5URUxfSVRUTk9USUZZX1BSRUZJWCxuKQorCisjaWYgSVRUX09TPT1JVFRfT1NfV0lOCitzdGF0aWMgY29uc3QgY2hhciogaXR0bm90aWZ5X2xpYl9uYW1lID0gImxpYml0dG5vdGlmeS5kbGwiOworI2VsaWYgSVRUX09TPT1JVFRfT1NfTElOVVgKK3N0YXRpYyBjb25zdCBjaGFyKiBpdHRub3RpZnlfbGliX25hbWUgPSAibGliaXR0bm90aWZ5LnNvIjsKKyNlbGlmIElUVF9PUz09SVRUX09TX01BQworc3RhdGljIGNvbnN0IGNoYXIqIGl0dG5vdGlmeV9saWJfbmFtZSA9ICJsaWJpdHRub3RpZnkuZHlsaWIiOworI2Vsc2UKKyNlcnJvciBVbnN1cHBvcnRlZCBvciB1bmtub3duIE9TLgorI2VuZGlmCisKKyNpZmRlZiBfX0FORFJPSURfXworI2luY2x1ZGUgPGFuZHJvaWQvbG9nLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXMvdHlwZXMuaD4KKyNpbmNsdWRlIDxzeXMvc3RhdC5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisjaW5jbHVkZSA8bGludXgvbGltaXRzLmg+CisKKyNpZmRlZiBJVFRfQU5EUk9JRF9MT0cKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR19UQUcgICAiSU5URUxfVlRVTkVfVVNFUkFQSSIKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0koLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19JTkZPLCBJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dXKC4uLikgKCh2b2lkKV9fYW5kcm9pZF9sb2dfcHJpbnQoQU5EUk9JRF9MT0dfV0FSTiwgSVRUX0FORFJPSURfTE9HX1RBRywgX19WQV9BUkdTX18pKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRSguLi4pICgodm9pZClfX2FuZHJvaWRfbG9nX3ByaW50KEFORFJPSURfTE9HX0VSUk9SLElUVF9BTkRST0lEX0xPR19UQUcsIF9fVkFfQVJHU19fKSkKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0QoLi4uKSAoKHZvaWQpX19hbmRyb2lkX2xvZ19wcmludChBTkRST0lEX0xPR19ERUJVRyxJVFRfQU5EUk9JRF9MT0dfVEFHLCBfX1ZBX0FSR1NfXykpCisjZWxzZQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HSSguLi4pCisgICAgI2RlZmluZSBJVFRfQU5EUk9JRF9MT0dXKC4uLikKKyAgICAjZGVmaW5lIElUVF9BTkRST0lEX0xPR0UoLi4uKQorICAgICNkZWZpbmUgSVRUX0FORFJPSURfTE9HRCguLi4pCisjZW5kaWYKKworLyogZGVmYXVsdCBsb2NhdGlvbiBvZiB1c2VyYXBpIGNvbGxlY3RvciBvbiBBbmRyb2lkICovCisjZGVmaW5lIEFORFJPSURfSVRUTk9USUZZX0RFRkFVTFRfUEFUSCAgIi9kYXRhL2RhdGEvY29tLmludGVsLnZ0dW5lL2ludGVsL2xpYml0dG5vdGlmeS5zbyIKKyNlbmRpZgorCisKKyNpZm5kZWYgTElCX1ZBUl9OQU1FCisjaWYgSVRUX0FSQ0g9PUlUVF9BUkNIX0lBMzIgfHwgSVRUX0FSQ0g9PUlUVF9BUkNIX0FSTQorI2RlZmluZSBMSUJfVkFSX05BTUUgSU5URUxfTElCSVRUTk9USUZZMzIKKyNlbHNlCisjZGVmaW5lIExJQl9WQVJfTkFNRSBJTlRFTF9MSUJJVFROT1RJRlk2NAorI2VuZGlmCisjZW5kaWYgLyogTElCX1ZBUl9OQU1FICovCisKKyNkZWZpbmUgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0socCkgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgaWYgKCFwLm11dGV4X2luaXRpYWxpemVkKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgeyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGlmIChfX2l0dF9pbnRlcmxvY2tlZF9pbmNyZW1lbnQoJnAuYXRvbWljX2NvdW50ZXIpID09IDEpIFwKKyAgICAgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBfX2l0dF9tdXRleF9pbml0KCZwLm11dGV4KTsgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICBwLm11dGV4X2luaXRpYWxpemVkID0gMTsgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgIGVsc2UgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICB3aGlsZSAoIXAubXV0ZXhfaW5pdGlhbGl6ZWQpICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfdGhyZWFkX3lpZWxkKCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgX19pdHRfbXV0ZXhfbG9jaygmcC5tdXRleCk7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworY29uc3QgaW50IF9OXyhlcnIpID0gMDsKKwordHlwZWRlZiBpbnQgKF9faXR0X2luaXRfaXR0bGliX3QpKGNvbnN0IGNoYXIqLCBfX2l0dF9ncm91cF9pZCk7CisKKy8qIHRoaXMgZGVmaW5lIHVzZWQgdG8gY29udHJvbCBpbml0aWFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9pbml0X2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0MgaW50IF9OXyhpbml0X2l0dGxpYikoY29uc3QgY2hhciosIF9faXR0X2dyb3VwX2lkKTsKK3N0YXRpYyBfX2l0dF9pbml0X2l0dGxpYl90KiBfX2l0dF9pbml0X2l0dGxpYl9wdHIgPSBfTl8oaW5pdF9pdHRsaWIpOworI2RlZmluZSBfX2l0dF9pbml0X2l0dGxpYl9uYW1lIF9faXR0X2luaXRfaXR0bGliX3B0cgorI2VuZGlmIC8qIF9faXR0X2luaXRfaXR0bGliX25hbWUgKi8KKwordHlwZWRlZiB2b2lkIChfX2l0dF9maW5pX2l0dGxpYl90KSh2b2lkKTsKKworLyogdGhpcyBkZWZpbmUgdXNlZCB0byBjb250cm9sIGZpbmFsaXphdGlvbiBmdW5jdGlvbiBuYW1lLiAqLworI2lmbmRlZiBfX2l0dF9maW5pX2l0dGxpYl9uYW1lCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZmluaV9pdHRsaWIpKHZvaWQpOworc3RhdGljIF9faXR0X2ZpbmlfaXR0bGliX3QqIF9faXR0X2ZpbmlfaXR0bGliX3B0ciA9IF9OXyhmaW5pX2l0dGxpYik7CisjZGVmaW5lIF9faXR0X2ZpbmlfaXR0bGliX25hbWUgX19pdHRfZmluaV9pdHRsaWJfcHRyCisjZW5kaWYgLyogX19pdHRfZmluaV9pdHRsaWJfbmFtZSAqLworCisvKiBidWlsZGluZyBwb2ludGVycyB0byBpbXBvcnRlZCBmdW5jcyAqLworI3VuZGVmIElUVF9TVFVCVgorI3VuZGVmIElUVF9TVFVCCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgICBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncztcCit0eXBlZGVmIHR5cGUgYXBpIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkgYXJnczsgICAgICAgICAgICAgICAgICBcCitJVFRfRVhURVJOX0NfQkVHSU4gSVRUX0pPSU4oX05fKG5hbWUpLF90KSogSVRUTk9USUZZX05BTUUobmFtZSkgPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKTsgSVRUX0VYVEVSTl9DX0VORCBcCitzdGF0aWMgdHlwZSBhcGkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkgYXJncyBcCit7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOyAgICAgICAgICAgICBcCisgICAgaWYgKElUVE5PVElGWV9OQU1FKG5hbWUpICYmIElUVE5PVElGWV9OQU1FKG5hbWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpKSBcCisgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShuYW1lKSBwYXJhbXM7ICAgICAgICAgICAgICAgICAgICBcCisgICAgZWxzZSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHJldHVybiAodHlwZSkwOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCit9CisKKyNkZWZpbmUgSVRUX1NUVUJWKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMscHRyLGdyb3VwLGZvcm1hdCkgIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzO1wKK3R5cGVkZWYgdHlwZSBhcGkgSVRUX0pPSU4oX05fKG5hbWUpLF90KSBhcmdzOyAgICAgICAgICAgICAgICAgIFwKK0lUVF9FWFRFUk5fQ19CRUdJTiBJVFRfSk9JTihfTl8obmFtZSksX3QpKiBJVFROT1RJRllfTkFNRShuYW1lKSA9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpOyBJVFRfRVhURVJOX0NfRU5EIFwKK3N0YXRpYyB0eXBlIGFwaSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSBhcmdzIFwKK3sgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBfX2l0dF9pbml0X2l0dGxpYl9uYW1lKE5VTEwsIF9faXR0X2dyb3VwX2FsbCk7ICAgICAgICAgICAgIFwKKyAgICBpZiAoSVRUTk9USUZZX05BTUUobmFtZSkgJiYgSVRUTk9USUZZX05BTUUobmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSkpIFwKKyAgICAgICAgSVRUTk9USUZZX05BTUUobmFtZSkgcGFyYW1zOyAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICBlbHNlICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKKyAgICAgICAgcmV0dXJuOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwKK30KKworI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisKKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLHB0cixncm91cCxmb3JtYXQpICAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQKKworI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzLHBhcmFtcyxwdHIsZ3JvdXAsZm9ybWF0KSAgXAorc3RhdGljIHR5cGUgYXBpIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpIGFyZ3M7XAordHlwZWRlZiB0eXBlIGFwaSBJVFRfSk9JTihfTl8obmFtZSksX3QpIGFyZ3M7ICAgICAgICAgICAgICAgICAgXAorSVRUX0VYVEVSTl9DX0JFR0lOIElUVF9KT0lOKF9OXyhuYW1lKSxfdCkqIElUVE5PVElGWV9OQU1FKG5hbWUpID0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSk7IElUVF9FWFRFUk5fQ19FTkQKKworI2RlZmluZSBfX0lUVF9JTlRFUk5BTF9JTklUCisjaW5jbHVkZSAiaXR0bm90aWZ5X3N0YXRpYy5oIgorI3VuZGVmIF9fSVRUX0lOVEVSTkFMX0lOSVQKKworSVRUX0dST1VQX0xJU1QoZ3JvdXBfbGlzdCk7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfYWxpYXMKK3sKKyAgICBjb25zdCBjaGFyKiAgICBlbnZfdmFyOworICAgIF9faXR0X2dyb3VwX2lkIGdyb3VwczsKK30gX19pdHRfZ3JvdXBfYWxpYXM7CisKK3N0YXRpYyBfX2l0dF9ncm91cF9hbGlhcyBncm91cF9hbGlhc1tdID0geworICAgIHsgIktNUF9GT1JfVFBST0ZJTEUiLCAoX19pdHRfZ3JvdXBfaWQpKF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9zeW5jICB8IF9faXR0X2dyb3VwX21hcmspIH0sCisgICAgeyAiS01QX0ZPUl9UQ0hFQ0siLCAgIChfX2l0dF9ncm91cF9pZCkoX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX3N5bmMgIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfc3VwcHJlc3MpIH0sCisgICAgeyBOVUxMLCAgICAgICAgICAgICAgIChfX2l0dF9ncm91cF9ub25lKSB9LAorICAgIHsgYXBpX3ZlcnNpb24sICAgICAgICAoX19pdHRfZ3JvdXBfbm9uZSkgfSAvKiAhISEgSnVzdCB0byBhdm9pZCB1bnVzZWQgY29kZSBlbGltaW5hdGlvbiAhISEgKi8KK307CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwdXNoKQorI3ByYWdtYSB3YXJuaW5nKGRpc2FibGU6IDQwNTQpIC8qIHdhcm5pbmcgQzQwNTQ6ICd0eXBlIGNhc3QnIDogZnJvbSBmdW5jdGlvbiBwb2ludGVyICdYWFgnIHRvIGRhdGEgcG9pbnRlciAndm9pZCAqJyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitzdGF0aWMgX19pdHRfYXBpX2luZm8gYXBpX2xpc3RbXSA9IHsKKy8qIERlZmluZSBmdW5jdGlvbnMgd2l0aCBzdGF0aWMgaW1wbGVtZW50YXRpb24gKi8KKyN1bmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCVgorI2RlZmluZSBJVFRfU1RVQihhcGksdHlwZSxuYW1lLGFyZ3MscGFyYW1zLG5hbWVpbmRsbCxncm91cCxmb3JtYXQpIHsgSVRUX1RPX1NUUihJVFRfSk9JTihfX2l0dF8sbmFtZWluZGxsKSksICh2b2lkKiopKHZvaWQqKSZJVFROT1RJRllfTkFNRShuYW1lKSwgKHZvaWQqKShzaXplX3QpJklUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhuYW1lKSxfaW5pdCkpLCAodm9pZCopKHNpemVfdCkmSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKG5hbWUpLF9pbml0KSksIChfX2l0dF9ncm91cF9pZCkoZ3JvdXApfSwKKyNkZWZpbmUgSVRUX1NUVUJWIElUVF9TVFVCCisjZGVmaW5lIF9fSVRUX0lOVEVSTkFMX0lOSVQKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisjdW5kZWYgX19JVFRfSU5URVJOQUxfSU5JVAorLyogRGVmaW5lIGZ1bmN0aW9ucyB3aXRob3V0IHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworI3VuZGVmIElUVF9TVFVCCisjdW5kZWYgSVRUX1NUVUJWCisjZGVmaW5lIElUVF9TVFVCKGFwaSx0eXBlLG5hbWUsYXJncyxwYXJhbXMsbmFtZWluZGxsLGdyb3VwLGZvcm1hdCkge0lUVF9UT19TVFIoSVRUX0pPSU4oX19pdHRfLG5hbWVpbmRsbCkpLCAodm9pZCoqKSh2b2lkKikmSVRUTk9USUZZX05BTUUobmFtZSksICh2b2lkKikoc2l6ZV90KSZJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8obmFtZSksX2luaXQpKSwgTlVMTCwgKF9faXR0X2dyb3VwX2lkKShncm91cCl9LAorI2RlZmluZSBJVFRfU1RVQlYgSVRUX1NUVUIKKyNpbmNsdWRlICJpdHRub3RpZnlfc3RhdGljLmgiCisgICAge05VTEwsIE5VTEwsIE5VTEwsIE5VTEwsIF9faXR0X2dyb3VwX25vbmV9Cit9OworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjcHJhZ21hIHdhcm5pbmcocG9wKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiBwcml2YXRlLCBpbml0IHRocmVhZCBpbmZvIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfdGhyZWFkX2luZm8gaW5pdF90aHJlYWRfaW5mbyA9IHsKKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogdGlkICovCisgICAgX19pdHRfdGhyZWFkX25vcm1hbCwgICAgICAgICAgICAgICAgICAgICAgLyogc3RhdGUgKi8KKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTEgKi8KKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBleHRyYTIgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKU5VTEwgICAgICAgICAgICAgICAgICAvKiBuZXh0ICovCit9OworCisvKiBwcml2YXRlLCBOVUxMIGRvbWFpbiBpdGVtLiB1c2VkIGZvciBpbnRlcm5hbCBwdXJwb3NlcyAqLworc3RhdGljIF9faXR0X2RvbWFpbiBudWxsX2RvbWFpbiA9IHsKKyAgICAwLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBmbGFnczogIGRpc2FibGVkIGJ5IGRlZmF1bHQgKi8KKyAgICAoY29uc3QgY2hhciopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2Vsc2UKKyAgICAodm9pZCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBuYW1lVyAqLworI2VuZGlmCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmExICovCisgICAgKHZvaWQqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZXh0cmEyICovCisgICAgKF9faXR0X2RvbWFpbiopTlVMTCAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCAqLworfTsKKworLyogcHJpdmF0ZSwgTlVMTCBzdHJpbmcgaGFuZGxlIGl0ZW0uIHVzZWQgZm9yIGludGVybmFsIHB1cnBvc2VzICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSBudWxsX3N0cmluZ19oYW5kbGUgPSB7CisgICAgKGNvbnN0IGNoYXIqKU5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgLyogc3RyQSAqLworI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyAgICAoY29uc3Qgd2NoYXJfdCopTlVMTCwgICAgICAgICAgICAgICAgICAgICAvKiBzdHJXICovCisjZWxzZQorICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIHN0clcgKi8KKyNlbmRpZgorICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMSAqLworICAgICh2b2lkKilOVUxMLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGV4dHJhMiAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKilOVUxMICAgICAgICAgICAgICAgIC8qIG5leHQgKi8KK307CisKK3N0YXRpYyBjb25zdCBjaGFyIGRsbF9wYXRoW1BBVEhfTUFYXSA9IHsgMCB9OworCisvKiBzdGF0aWMgcGFydCBkZXNjcmlwdG9yIHdoaWNoIGhhbmRsZXMuIGFsbCBub3RpZmljYXRpb24gYXBpIGF0dHJpYnV0ZXMuICovCitfX2l0dF9nbG9iYWwgX05fKF9pdHRhcGlfZ2xvYmFsKSA9IHsKKyAgICBJVFRfTUFHSUMsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIGlkZW50aWZpY2F0aW9uIGluZm8gKi8KKyAgICBJVFRfTUFKT1IsIElUVF9NSU5PUiwgQVBJX1ZFUlNJT05fQlVJTEQsICAgICAgIC8qIHZlcnNpb24gaW5mbyAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXBpX2luaXRpYWxpemVkICovCisgICAgMCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBtdXRleF9pbml0aWFsaXplZCAqLworICAgIDAsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogYXRvbWljX2NvdW50ZXIgKi8KKyAgICBNVVRFWF9JTklUSUFMSVpFUiwgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIG11dGV4ICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBkeW5hbWljIGxpYnJhcnkgaGFuZGxlICovCisgICAgTlVMTCwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlcnJvcl9oYW5kbGVyICovCisgICAgKGNvbnN0IGNoYXIqKikmZGxsX3BhdGgsICAgICAgICAgICAgICAgICAgICAgICAvKiBkbGxfcGF0aF9wdHIgKi8KKyAgICAoX19pdHRfYXBpX2luZm8qKSZhcGlfbGlzdCwgICAgICAgICAgICAgICAgICAgIC8qIGFwaV9saXN0X3B0ciAqLworICAgIE5VTEwsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogbmV4dCBfX2l0dF9nbG9iYWwgKi8KKyAgICAoX19pdHRfdGhyZWFkX2luZm8qKSZpbml0X3RocmVhZF9pbmZvLCAgICAgICAgIC8qIHRocmVhZF9saXN0ICovCisgICAgKF9faXR0X2RvbWFpbiopJm51bGxfZG9tYWluLCAgICAgICAgICAgICAgICAgICAvKiBkb21haW5fbGlzdCAqLworICAgIChfX2l0dF9zdHJpbmdfaGFuZGxlKikmbnVsbF9zdHJpbmdfaGFuZGxlLCAgICAgLyogc3RyaW5nX2xpc3QgKi8KKyAgICBfX2l0dF9jb2xsZWN0aW9uX25vcm1hbCAgICAgICAgICAgICAgICAgICAgICAgIC8qIGNvbGxlY3Rpb24gc3RhdGUgKi8KK307CisKK3R5cGVkZWYgdm9pZCAoX19pdHRfYXBpX2luaXRfdCkoX19pdHRfZ2xvYmFsKiwgX19pdHRfZ3JvdXBfaWQpOwordHlwZWRlZiB2b2lkIChfX2l0dF9hcGlfZmluaV90KShfX2l0dF9nbG9iYWwqKTsKKworLyogPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSAqLworCisjaWZkZWYgSVRUX05PVElGWV9FWFRfUkVQT1JUCitJVFRfRVhURVJOX0Mgdm9pZCBfTl8oZXJyb3JfaGFuZGxlcikoX19pdHRfZXJyb3JfY29kZSwgdmFfbGlzdCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NSkgLyogd2FybmluZyBDNDA1NTogJ3R5cGUgY2FzdCcgOiBmcm9tIGRhdGEgcG9pbnRlciAndm9pZCAqJyB0byBmdW5jdGlvbiBwb2ludGVyICdYWFgnICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9jb2RlIGNvZGUsIC4uLikKK3sKKyAgICB2YV9saXN0IGFyZ3M7CisgICAgdmFfc3RhcnQoYXJncywgY29kZSk7CisgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuZXJyb3JfaGFuZGxlciAhPSBOVUxMKQorICAgIHsKKyAgICAgICAgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBoYW5kbGVyID0gKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopKHNpemVfdClfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXI7CisgICAgICAgIGhhbmRsZXIoY29kZSwgYXJncyk7CisgICAgfQorI2lmZGVmIElUVF9OT1RJRllfRVhUX1JFUE9SVAorICAgIF9OXyhlcnJvcl9oYW5kbGVyKShjb2RlLCBhcmdzKTsKKyNlbmRpZiAvKiBJVFRfTk9USUZZX0VYVF9SRVBPUlQgKi8KKyAgICB2YV9lbmQoYXJncyk7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNwcmFnbWEgd2FybmluZyhwb3ApCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9kb21haW4qIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkoY29uc3Qgd2NoYXJfdCogbmFtZSkKK3sKKyAgICBfX2l0dF9kb21haW4gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpICYmIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVXKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoZG9tYWluX2NyZWF0ZVcpKG5hbWUpOworICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5uYW1lVywgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19ET01BSU5fVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlQSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworc3RhdGljIF9faXR0X2RvbWFpbiogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhkb21haW5fY3JlYXRlKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCit7CisgICAgX19pdHRfZG9tYWluICpoX3RhaWwsICpoOworCisgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCAmJiBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPT0gMCkKKyAgICB7CisgICAgICAgIF9faXR0X2luaXRfaXR0bGliX25hbWUoTlVMTCwgX19pdHRfZ3JvdXBfYWxsKTsKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyAgICAgICAgaWYgKElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGRvbWFpbl9jcmVhdGVBKSxfaW5pdCkpKQorICAgICAgICAgICAgcmV0dXJuIElUVE5PVElGWV9OQU1FKGRvbWFpbl9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAmJiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oZG9tYWluX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShkb21haW5fY3JlYXRlKShuYW1lKTsKKyNlbmRpZgorICAgIH0KKworICAgIGlmIChuYW1lID09IE5VTEwpCisgICAgICAgIHJldHVybiBfTl8oX2l0dGFwaV9nbG9iYWwpLmRvbWFpbl9saXN0OworCisgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS5kb21haW5fbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPm5hbWVBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+bmFtZUEsIG5hbWUpKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfRE9NQUlOX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyBfX2l0dF9zdHJpbmdfaGFuZGxlKiBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHN0cmluZ19oYW5kbGVfY3JlYXRlVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZVcpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVXKShuYW1lKTsKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJXICE9IE5VTEwgJiYgIXdjc2NtcChoLT5zdHJXLCBuYW1lKSkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgTkVXX1NUUklOR19IQU5ETEVfVygmX05fKF9pdHRhcGlfZ2xvYmFsKSxoLGhfdGFpbCxuYW1lKTsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICByZXR1cm4gaDsKK30KKworc3RhdGljIF9faXR0X3N0cmluZ19oYW5kbGUqIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8oc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgX19pdHRfc3RyaW5nX2hhbmRsZSogSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIF9faXR0X3N0cmluZ19oYW5kbGUgKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKSAmJiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZUEpLF9pbml0KSkpCisgICAgICAgICAgICByZXR1cm4gSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGVBKShuYW1lKTsKKyNlbHNlCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkgJiYgSVRUTk9USUZZX05BTUUoc3RyaW5nX2hhbmRsZV9jcmVhdGUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhzdHJpbmdfaGFuZGxlX2NyZWF0ZSksX2luaXQpKSkKKyAgICAgICAgICAgIHJldHVybiBJVFROT1RJRllfTkFNRShzdHJpbmdfaGFuZGxlX2NyZWF0ZSkobmFtZSk7CisjZW5kaWYKKyAgICB9CisKKyAgICBpZiAobmFtZSA9PSBOVUxMKQorICAgICAgICByZXR1cm4gX05fKF9pdHRhcGlfZ2xvYmFsKS5zdHJpbmdfbGlzdDsKKworICAgIElUVF9NVVRFWF9JTklUX0FORF9MT0NLKF9OXyhfaXR0YXBpX2dsb2JhbCkpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RyaW5nX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT5zdHJBICE9IE5VTEwgJiYgIV9faXR0X2ZzdHJjbXAoaC0+c3RyQSwgbmFtZSkpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19TVFJJTkdfSEFORExFX0EoJl9OXyhfaXR0YXBpX2dsb2JhbCksaCxoX3RhaWwsbmFtZSk7CisgICAgfQorICAgIF9faXR0X211dGV4X3VubG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgcmV0dXJuIGg7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocGF1c2UpICYmIElUVE5PVElGWV9OQU1FKHBhdXNlKSAhPSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8ocGF1c2UpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHBhdXNlKSgpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuc3RhdGUgPSBfX2l0dF9jb2xsZWN0aW9uX3BhdXNlZDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUocmVzdW1lKSAmJiBJVFROT1RJRllfTkFNRShyZXN1bWUpICE9IElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyhyZXN1bWUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHJlc3VtZSkoKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorICAgIH0KKyAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnN0YXRlID0gX19pdHRfY29sbGVjdGlvbl9ub3JtYWw7Cit9CisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lVykgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZVcpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZVcpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgfQorCisgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgZm9yIChoX3RhaWwgPSBOVUxMLCBoID0gX05fKF9pdHRhcGlfZ2xvYmFsKS50aHJlYWRfbGlzdDsgaCAhPSBOVUxMOyBoX3RhaWwgPSBoLCBoID0gaC0+bmV4dCkKKyAgICAgICAgaWYgKGgtPnRpZCA9PSB0aWQpCisgICAgICAgICAgICBicmVhazsKKyAgICBpZiAoaCA9PSBOVUxMKSB7CisgICAgICAgIE5FV19USFJFQURfSU5GT19XKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX25vcm1hbCwgbmFtZSk7CisgICAgfQorICAgIGVsc2UKKyAgICB7CisgICAgICAgIGgtPm5hbWVXID0gbmFtZSA/IF93Y3NkdXAobmFtZSkgOiBOVUxMOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0VyksX2luaXQpKShjb25zdCB3Y2hhcl90KiBuYW1lLCBpbnQgbmFtZWxlbikKK3sKKyAgICBuYW1lbGVuID0gbmFtZWxlbjsKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX3NldF9uYW1lVyksX2luaXQpKShuYW1lKTsKKyAgICByZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgSVRUQVBJIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWVBKSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKShjb25zdCBjaGFyKiBuYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworeworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lQSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZUEpKG5hbWUpOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgIGlmIChJVFROT1RJRllfTkFNRSh0aHJlYWRfc2V0X25hbWUpICYmIElUVE5PVElGWV9OQU1FKHRocmVhZF9zZXRfbmFtZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZSksX2luaXQpKSkKKyAgICAgICAgeworICAgICAgICAgICAgSVRUTk9USUZZX05BTUUodGhyZWFkX3NldF9uYW1lKShuYW1lKTsKKyAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKworICAgIF9faXR0X211dGV4X2xvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworICAgIGZvciAoaF90YWlsID0gTlVMTCwgaCA9IF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3Q7IGggIT0gTlVMTDsgaF90YWlsID0gaCwgaCA9IGgtPm5leHQpCisgICAgICAgIGlmIChoLT50aWQgPT0gdGlkKQorICAgICAgICAgICAgYnJlYWs7CisgICAgaWYgKGggPT0gTlVMTCkgeworICAgICAgICBORVdfVEhSRUFEX0lORk9fQSgmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaCwgaF90YWlsLCB0aWQsIF9faXR0X3RocmVhZF9ub3JtYWwsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5uYW1lQSA9IG5hbWUgPyBfX2l0dF9mc3RyZHVwKG5hbWUpIDogTlVMTDsKKyAgICB9CisgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorc3RhdGljIGludCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9uYW1lX3NldEEpLF9pbml0KSkoY29uc3QgY2hhciogbmFtZSwgaW50IG5hbWVsZW4pCit7CisgICAgbmFtZWxlbiA9IG5hbWVsZW47CisgICAgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9zZXRfbmFtZUEpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitzdGF0aWMgaW50IElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyX25hbWVfc2V0KSxfaW5pdCkpKGNvbnN0IGNoYXIqIG5hbWUsIGludCBuYW1lbGVuKQoreworICAgIG5hbWVsZW4gPSBuYW1lbGVuOworICAgIElUVF9WRVJTSU9OSVpFKElUVF9KT0lOKF9OXyh0aHJlYWRfc2V0X25hbWUpLF9pbml0KSkobmFtZSk7CisgICAgcmV0dXJuIDA7Cit9CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK3N0YXRpYyB2b2lkIElUVEFQSSBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSh2b2lkKQoreworICAgIFRJRFQgdGlkID0gX19pdHRfdGhyZWFkX2lkKCk7CisgICAgX19pdHRfdGhyZWFkX2luZm8gKmhfdGFpbCwgKmg7CisKKyAgICBpZiAoIV9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkICYmIF9OXyhfaXR0YXBpX2dsb2JhbCkudGhyZWFkX2xpc3QtPnRpZCA9PSAwKQorICAgIHsKKyAgICAgICAgX19pdHRfaW5pdF9pdHRsaWJfbmFtZShOVUxMLCBfX2l0dF9ncm91cF9hbGwpOworICAgICAgICBpZiAoSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgJiYgSVRUTk9USUZZX05BTUUodGhyZWFkX2lnbm9yZSkgIT0gSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocmVhZF9pZ25vcmUpLF9pbml0KSkpCisgICAgICAgIHsKKyAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpKCk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisKKyAgICBfX2l0dF9tdXRleF9sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICBmb3IgKGhfdGFpbCA9IE5VTEwsIGggPSBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0OyBoICE9IE5VTEw7IGhfdGFpbCA9IGgsIGggPSBoLT5uZXh0KQorICAgICAgICBpZiAoaC0+dGlkID09IHRpZCkKKyAgICAgICAgICAgIGJyZWFrOworICAgIGlmIChoID09IE5VTEwpIHsKKyAgICAgICAgc3RhdGljIGNvbnN0IGNoYXIqIG5hbWUgPSAidW5rbm93biI7CisgICAgICAgIE5FV19USFJFQURfSU5GT19BKCZfTl8oX2l0dGFwaV9nbG9iYWwpLCBoLCBoX3RhaWwsIHRpZCwgX19pdHRfdGhyZWFkX2lnbm9yZWQsIG5hbWUpOworICAgIH0KKyAgICBlbHNlCisgICAgeworICAgICAgICBoLT5zdGF0ZSA9IF9faXR0X3RocmVhZF9pZ25vcmVkOworICAgIH0KKyAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKHRocl9pZ25vcmUpLF9pbml0KSkodm9pZCkKK3sKKyAgICBJVFRfVkVSU0lPTklaRShJVFRfSk9JTihfTl8odGhyZWFkX2lnbm9yZSksX2luaXQpKSgpOworfQorCitzdGF0aWMgdm9pZCBJVFRBUEkgSVRUX1ZFUlNJT05JWkUoSVRUX0pPSU4oX05fKGVuYWJsZV9hdHRhY2gpLF9pbml0KSkodm9pZCkKK3sKKyNpZmRlZiBfX0FORFJPSURfXworICAgIC8qCisgICAgICogaWYgTElCX1ZBUl9OQU1FIGVudiB2YXJpYWJsZSB3ZXJlIHNldCBiZWZvcmUgdGhlbiBzdGF5IHByZXZpb3VzIHZhbHVlCisgICAgICogZWxzZSBzZXQgZGVmYXVsdCBwYXRoCisgICAgKi8KKyAgICBzZXRlbnYoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpLCBBTkRST0lEX0lUVE5PVElGWV9ERUZBVUxUX1BBVEgsIDApOworI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyBjb25zdCBjaGFyKiBfX2l0dF9mc3BsaXQoY29uc3QgY2hhciogcywgY29uc3QgY2hhciogc2VwLCBjb25zdCBjaGFyKiogb3V0LCBpbnQqIGxlbikKK3sKKyAgICBpbnQgaTsKKyAgICBpbnQgajsKKworICAgIGlmICghcyB8fCAhc2VwIHx8ICFvdXQgfHwgIWxlbikKKyAgICAgICAgcmV0dXJuIE5VTEw7CisKKyAgICBmb3IgKGkgPSAwOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICBpZiAoIXNbaV0pCisgICAgICAgIHJldHVybiBOVUxMOworCisgICAgKmxlbiA9IDA7CisgICAgKm91dCA9ICZzW2ldOworCisgICAgZm9yICg7IHNbaV07IGkrKywgKCpsZW4pKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoYikKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIGZvciAoOyBzW2ldOyBpKyspCisgICAgeworICAgICAgICBpbnQgYiA9IDA7CisgICAgICAgIGZvciAoaiA9IDA7IHNlcFtqXTsgaisrKQorICAgICAgICAgICAgaWYgKHNbaV0gPT0gc2VwW2pdKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIGIgPSAxOworICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgfQorICAgICAgICBpZiAoIWIpCisgICAgICAgICAgICBicmVhazsKKyAgICB9CisKKyAgICByZXR1cm4gJnNbaV07Cit9CisKKy8qIFRoaXMgZnVuY3Rpb24gcmV0dXJuIHZhbHVlIG9mIGVudiB2YXJpYWJsZSB0aGF0IHBsYWNlZCBpbnRvIHN0YXRpYyBidWZmZXIuCisgKiAhISEgVGhlIHNhbWUgc3RhdGljIGJ1ZmZlciBpcyB1c2VkIGZvciBzdWJzZXF1ZW50IGNhbGxzLiAhISEKKyAqIFRoaXMgd2FzIGRvbmUgdG8gYXZpb2QgZHluYW1pYyBhbGxvY2F0aW9uIGZvciBmZXcgY2FsbHMuCisgKiBBY3R1YWxseSB3ZSBuZWVkIHRoaXMgZnVuY3Rpb24gb25seSBmb3VyIHRpbWVzLgorICovCitzdGF0aWMgY29uc3QgY2hhciogX19pdHRfZ2V0X2Vudl92YXIoY29uc3QgY2hhciogbmFtZSkKK3sKKyNkZWZpbmUgTUFYX0VOVl9WQUxVRV9TSVpFIDQwODYKKyAgICBzdGF0aWMgY2hhciAgZW52X2J1ZmZbTUFYX0VOVl9WQUxVRV9TSVpFXTsKKyAgICBzdGF0aWMgY2hhciogZW52X3ZhbHVlID0gKGNoYXIqKWVudl9idWZmOworCisgICAgaWYgKG5hbWUgIT0gTlVMTCkKKyAgICB7CisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgIHNpemVfdCBtYXhfbGVuID0gTUFYX0VOVl9WQUxVRV9TSVpFIC0gKHNpemVfdCkoZW52X3ZhbHVlIC0gZW52X2J1ZmYpOworICAgICAgICBEV09SRCByYyA9IEdldEVudmlyb25tZW50VmFyaWFibGVBKG5hbWUsIGVudl92YWx1ZSwgKERXT1JEKW1heF9sZW4pOworICAgICAgICBpZiAocmMgPj0gbWF4X2xlbikKKyAgICAgICAgICAgIF9faXR0X3JlcG9ydF9lcnJvcihfX2l0dF9lcnJvcl9lbnZfdG9vX2xvbmcsIG5hbWUsIChzaXplX3QpcmMgLSAxLCAoc2l6ZV90KShtYXhfbGVuIC0gMSkpOworICAgICAgICBlbHNlIGlmIChyYyA+IDApCisgICAgICAgIHsKKyAgICAgICAgICAgIGNvbnN0IGNoYXIqIHJldCA9IChjb25zdCBjaGFyKillbnZfdmFsdWU7CisgICAgICAgICAgICBlbnZfdmFsdWUgKz0gcmMgKyAxOworICAgICAgICAgICAgcmV0dXJuIHJldDsKKyAgICAgICAgfQorICAgICAgICBlbHNlCisgICAgICAgIHsKKyAgICAgICAgICAgIC8qIElmIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIGVtcHR5LCBHZXRFbnZpcm9ybm1lbnRWYXJpYWJsZXMoKQorICAgICAgICAgICAgICogcmV0dXJucyB6ZXJvIChudW1iZXIgb2YgY2hhcmFjdGVycyAobm90IGluY2x1ZGluZyB0ZXJtaW5hdGluZyBudWxsKSwKKyAgICAgICAgICAgICAqIGFuZCBHZXRMYXN0RXJyb3IoKSByZXR1cm5zIEVSUk9SX1NVQ0NFU1MuICovCisgICAgICAgICAgICBEV09SRCBlcnIgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChlcnIgPT0gRVJST1JfU1VDQ0VTUykKKyAgICAgICAgICAgICAgICByZXR1cm4gZW52X3ZhbHVlOworCisgICAgICAgICAgICBpZiAoZXJyICE9IEVSUk9SX0VOVlZBUl9OT1RfRk9VTkQpCisgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX2NhbnRfcmVhZF9lbnYsIG5hbWUsIChpbnQpZXJyKTsKKyAgICAgICAgfQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworICAgICAgICBjaGFyKiBlbnYgPSBnZXRlbnYobmFtZSk7CisgICAgICAgIGlmIChlbnYgIT0gTlVMTCkKKyAgICAgICAgeworICAgICAgICAgICAgc2l6ZV90IGxlbiA9IHN0cmxlbihlbnYpOworICAgICAgICAgICAgc2l6ZV90IG1heF9sZW4gPSBNQVhfRU5WX1ZBTFVFX1NJWkUgLSAoc2l6ZV90KShlbnZfdmFsdWUgLSBlbnZfYnVmZik7CisgICAgICAgICAgICBpZiAobGVuIDwgbWF4X2xlbikKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiByZXQgPSAoY29uc3QgY2hhciopZW52X3ZhbHVlOworICAgICAgICAgICAgICAgIHN0cm5jcHkoZW52X3ZhbHVlLCBlbnYsIGxlbiArIDEpOworICAgICAgICAgICAgICAgIGVudl92YWx1ZSArPSBsZW4gKyAxOworICAgICAgICAgICAgICAgIHJldHVybiByZXQ7CisgICAgICAgICAgICB9IGVsc2UKKyAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3JfZW52X3Rvb19sb25nLCBuYW1lLCAoc2l6ZV90KWxlbiwgKHNpemVfdCkobWF4X2xlbiAtIDEpKTsKKyAgICAgICAgfQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworICAgIH0KKyAgICByZXR1cm4gTlVMTDsKK30KKworc3RhdGljIGNvbnN0IGNoYXIqIF9faXR0X2dldF9saWJfbmFtZSh2b2lkKQoreworICAgIGNvbnN0IGNoYXIqIGxpYl9uYW1lID0gX19pdHRfZ2V0X2Vudl92YXIoSVRUX1RPX1NUUihMSUJfVkFSX05BTUUpKTsKKworI2lmZGVmIF9fQU5EUk9JRF9fCisgICAgaWYgKGxpYl9uYW1lID09IE5VTEwpCisgICAgeworICAgICAgICBjb25zdCBjaGFyKiBjb25zdCBzeXN0ZW1fd2lkZV9tYXJrZXJfZmlsZW5hbWUgPSAiL2RhdGEvbG9jYWwvdG1wL2NvbS5pbnRlbC5pdHQuY29sbGVjdG9yX2xpYiI7CisgICAgICAgIGludCBpdHRfbWFya2VyX2ZpbGVfZmQgPSBvcGVuKHN5c3RlbV93aWRlX21hcmtlcl9maWxlbmFtZSwgT19SRE9OTFkpOworICAgICAgICBzc2l6ZV90IHJlcyA9IDA7CisKKyAgICAgICAgaWYgKGl0dF9tYXJrZXJfZmlsZV9mZCA9PSAtMSkKKyAgICAgICAgeworICAgICAgICAgICAgY29uc3QgcGlkX3QgbXlfcGlkID0gZ2V0cGlkKCk7CisgICAgICAgICAgICBjaGFyIGNtZGxpbmVfcGF0aFtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBjaGFyIHBhY2thZ2VfbmFtZVtQQVRIX01BWF0gPSB7MH07CisgICAgICAgICAgICBjaGFyIGFwcF9zYW5kYm94X2ZpbGVbUEFUSF9NQVhdID0gezB9OworICAgICAgICAgICAgaW50IGNtZGxpbmVfZmQgPSAwOworCisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJVbmFibGUgdG8gb3BlbiBzeXN0ZW0td2lkZSBtYXJrZXIgZmlsZS4iKTsKKyAgICAgICAgICAgIHNucHJpbnRmKGNtZGxpbmVfcGF0aCwgUEFUSF9NQVggLSAxLCAiL3Byb2MvJWQvY21kbGluZSIsIG15X3BpZCk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJDTUQgZmlsZTogJXNcbiIsIGNtZGxpbmVfcGF0aCk7CisgICAgICAgICAgICBjbWRsaW5lX2ZkID0gb3BlbihjbWRsaW5lX3BhdGgsIE9fUkRPTkxZKTsKKyAgICAgICAgICAgIGlmIChjbWRsaW5lX2ZkID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBvcGVuICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSByZWFkKGNtZGxpbmVfZmQsIHBhY2thZ2VfbmFtZSwgUEFUSF9NQVggLSAxKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIHJlYWQgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIHJlcyA9IGNsb3NlKGNtZGxpbmVfZmQpOworICAgICAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBjbWRsaW5lX3BhdGgpOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXMgPSBjbG9zZShjbWRsaW5lX2ZkKTsKKyAgICAgICAgICAgIGlmIChyZXMgPT0gLTEpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgY21kbGluZV9wYXRoKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJQYWNrYWdlIG5hbWU6ICVzXG4iLCBwYWNrYWdlX25hbWUpOworICAgICAgICAgICAgc25wcmludGYoYXBwX3NhbmRib3hfZmlsZSwgUEFUSF9NQVggLSAxLCAiL2RhdGEvZGF0YS8lcy9jb20uaW50ZWwuaXR0LmNvbGxlY3Rvcl9saWIiLCBwYWNrYWdlX25hbWUpOworICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiTGliIG1hcmtlciBmaWxlIG5hbWU6ICVzXG4iLCBhcHBfc2FuZGJveF9maWxlKTsKKyAgICAgICAgICAgIGl0dF9tYXJrZXJfZmlsZV9mZCA9IG9wZW4oYXBwX3NhbmRib3hfZmlsZSwgT19SRE9OTFkpOworICAgICAgICAgICAgaWYgKGl0dF9tYXJrZXJfZmlsZV9mZCA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gb3BlbiBhcHAgbWFya2VyIGZpbGUhIik7CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICB9CisKKyAgICAgICAgeworICAgICAgICAgICAgY2hhciBpdHRfbGliX25hbWVbUEFUSF9NQVhdID0gezB9OworCisgICAgICAgICAgICByZXMgPSByZWFkKGl0dF9tYXJrZXJfZmlsZV9mZCwgaXR0X2xpYl9uYW1lLCBQQVRIX01BWCAtIDEpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gcmVhZCAlcyBmaWxlISIsIGl0dF9tYXJrZXJfZmlsZV9mZCk7CisgICAgICAgICAgICAgICAgcmVzID0gY2xvc2UoaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HRSgiVW5hYmxlIHRvIGNsb3NlICVzIGZpbGUhIiwgaXR0X21hcmtlcl9maWxlX2ZkKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgcmV0dXJuIGxpYl9uYW1lOworICAgICAgICAgICAgfQorICAgICAgICAgICAgSVRUX0FORFJPSURfTE9HSSgiSVRUIExpYiBwYXRoOiAlcyIsIGl0dF9saWJfbmFtZSk7CisgICAgICAgICAgICByZXMgPSBjbG9zZShpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgaWYgKHJlcyA9PSAtMSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dFKCJVbmFibGUgdG8gY2xvc2UgJXMgZmlsZSEiLCBpdHRfbWFya2VyX2ZpbGVfZmQpOworICAgICAgICAgICAgICAgIHJldHVybiBsaWJfbmFtZTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0koIlNldCBlbnYiKTsKKyAgICAgICAgICAgIHJlcyA9IHNldGVudihJVFRfVE9fU1RSKExJQl9WQVJfTkFNRSksIGl0dF9saWJfbmFtZSwgMCk7CisgICAgICAgICAgICBpZiAocmVzID09IC0xKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIElUVF9BTkRST0lEX0xPR0UoIlVuYWJsZSB0byBzZXQgZW52IHZhciEiKTsKKyAgICAgICAgICAgICAgICByZXR1cm4gbGliX25hbWU7CisgICAgICAgICAgICB9CisgICAgICAgICAgICBsaWJfbmFtZSA9IF9faXR0X2dldF9lbnZfdmFyKElUVF9UT19TVFIoTElCX1ZBUl9OQU1FKSk7CisgICAgICAgICAgICBJVFRfQU5EUk9JRF9MT0dJKCJJVFQgTGliIHBhdGggZnJvbSBlbnY6ICVzIiwgaXR0X2xpYl9uYW1lKTsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZgorCisgICAgcmV0dXJuIGxpYl9uYW1lOworfQorCisjaWZuZGVmIG1pbgorI2RlZmluZSBtaW4oYSxiKSAoYSkgPCAoYikgPyAoYSkgOiAoYikKKyNlbmRpZiAvKiBtaW4gKi8KKworc3RhdGljIF9faXR0X2dyb3VwX2lkIF9faXR0X2dldF9ncm91cHModm9pZCkKK3sKKyAgICByZWdpc3RlciBpbnQgaTsKKyAgICBfX2l0dF9ncm91cF9pZCByZXMgPSBfX2l0dF9ncm91cF9ub25lOworICAgIGNvbnN0IGNoYXIqIHZhcl9uYW1lICA9ICJJTlRFTF9JVFROT1RJRllfR1JPVVBTIjsKKyAgICBjb25zdCBjaGFyKiBncm91cF9zdHIgPSBfX2l0dF9nZXRfZW52X3Zhcih2YXJfbmFtZSk7CisKKyAgICBpZiAoZ3JvdXBfc3RyICE9IE5VTEwpCisgICAgeworICAgICAgICBpbnQgbGVuOworICAgICAgICBjaGFyIGdyWzI1NV07CisgICAgICAgIGNvbnN0IGNoYXIqIGNodW5rOworICAgICAgICB3aGlsZSAoKGdyb3VwX3N0ciA9IF9faXR0X2ZzcGxpdChncm91cF9zdHIsICIsOyAiLCAmY2h1bmssICZsZW4pKSAhPSBOVUxMKQorICAgICAgICB7CisgICAgICAgICAgICBfX2l0dF9mc3RyY3B5bihnciwgY2h1bmssIHNpemVvZihncikgLSAxKTsKKyAgICAgICAgICAgIGdyW21pbihsZW4sIChpbnQpKHNpemVvZihncikgLSAxKSldID0gMDsKKworICAgICAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfbGlzdFtpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBpZiAoIV9faXR0X2ZzdHJjbXAoZ3IsIGdyb3VwX2xpc3RbaV0ubmFtZSkpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICByZXMgPSAoX19pdHRfZ3JvdXBfaWQpKHJlcyB8IGdyb3VwX2xpc3RbaV0uaWQpOworICAgICAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgLyogVE9ETzogISEhIFdvcmthcm91bmQgZm9yIGJ1ZyB3aXRoIHdhcm5pbmcgZm9yIHVua25vd24gZ3JvdXAgISEhCisgICAgICAgICAqIFNob3VsZCBiZSBmaXhlZCBpbiBuZXcgaW5pdGlhbGl6YXRpb24gc2NoZW1lLgorICAgICAgICAgKiBOb3cgdGhlIGZvbGxvd2luZyBncm91cHMgc2hvdWxkIGJlIHNldCBhbHdheXMuICovCisgICAgICAgIGZvciAoaSA9IDA7IGdyb3VwX2xpc3RbaV0uaWQgIT0gX19pdHRfZ3JvdXBfbm9uZTsgaSsrKQorICAgICAgICAgICAgaWYgKGdyb3VwX2xpc3RbaV0uaWQgIT0gX19pdHRfZ3JvdXBfYWxsICYmCisgICAgICAgICAgICAgICAgZ3JvdXBfbGlzdFtpXS5pZCA+IF9faXR0X2dyb3VwX3NwbGl0dGVyX21pbiAmJgorICAgICAgICAgICAgICAgIGdyb3VwX2xpc3RbaV0uaWQgPCBfX2l0dF9ncm91cF9zcGxpdHRlcl9tYXgpCisgICAgICAgICAgICAgICAgcmVzID0gKF9faXR0X2dyb3VwX2lkKShyZXMgfCBncm91cF9saXN0W2ldLmlkKTsKKyAgICAgICAgcmV0dXJuIHJlczsKKyAgICB9CisgICAgZWxzZQorICAgIHsKKyAgICAgICAgZm9yIChpID0gMDsgZ3JvdXBfYWxpYXNbaV0uZW52X3ZhciAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICBpZiAoX19pdHRfZ2V0X2Vudl92YXIoZ3JvdXBfYWxpYXNbaV0uZW52X3ZhcikgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICByZXR1cm4gZ3JvdXBfYWxpYXNbaV0uZ3JvdXBzOworICAgIH0KKworICAgIHJldHVybiByZXM7Cit9CisKK3N0YXRpYyBpbnQgX19pdHRfbGliX3ZlcnNpb24obGliX3QgbGliKQoreworICAgIGlmIChsaWIgPT0gTlVMTCkKKyAgICAgICAgcmV0dXJuIDA7CisgICAgaWYgKF9faXR0X2dldF9wcm9jKGxpYiwgIl9faXR0X2FwaV9pbml0IikpCisgICAgICAgIHJldHVybiAyOworICAgIGlmIChfX2l0dF9nZXRfcHJvYyhsaWIsICJfX2l0dF9hcGlfdmVyc2lvbiIpKQorICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworLyogSXQncyBub3QgdXNlZCByaWdodCBub3chIENvbW1lbnQgaXQgb3V0IHRvIGF2b2lkIHdhcm5pbmdzLgorc3RhdGljIHZvaWQgX19pdHRfcmVpbml0X2FsbF9wb2ludGVycyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIC8vIEZpbGwgYWxsIHBvaW50ZXJzIHdpdGggaW5pdGlhbCBzdHVicworICAgIGZvciAoaSA9IDA7IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm5hbWUgIT0gTlVMTDsgaSsrKQorICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5pbml0X2Z1bmM7Cit9CisqLworCitzdGF0aWMgdm9pZCBfX2l0dF9udWxsaWZ5X2FsbF9wb2ludGVycyh2b2lkKQoreworICAgIHJlZ2lzdGVyIGludCBpOworICAgIC8qIE51bGlmeSBhbGwgcG9pbnRlcnMgZXhjZXB0IGRvbWFpbl9jcmVhdGUgYW5kIHN0cmluZ19oYW5kbGVfY3JlYXRlICovCisgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHB1c2gpCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NCkgLyogd2FybmluZyBDNDA1NDogJ3R5cGUgY2FzdCcgOiBmcm9tIGZ1bmN0aW9uIHBvaW50ZXIgJ1hYWCcgdG8gZGF0YSBwb2ludGVyICd2b2lkIConICovCisjcHJhZ21hIHdhcm5pbmcoZGlzYWJsZTogNDA1NSkgLyogd2FybmluZyBDNDA1NTogJ3R5cGUgY2FzdCcgOiBmcm9tIGRhdGEgcG9pbnRlciAndm9pZCAqJyB0byBmdW5jdGlvbiBwb2ludGVyICdYWFgnICovCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9FWFRFUk5fQyB2b2lkIF9OXyhmaW5pX2l0dGxpYikodm9pZCkKK3sKKyAgICBfX2l0dF9hcGlfZmluaV90KiBfX2l0dF9hcGlfZmluaV9wdHI7CisgICAgc3RhdGljIHZvbGF0aWxlIFRJRFQgY3VycmVudF90aHJlYWQgPSAwOworCisgICAgaWYgKF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkKQorICAgIHsKKyAgICAgICAgX19pdHRfbXV0ZXhfbG9jaygmX05fKF9pdHRhcGlfZ2xvYmFsKS5tdXRleCk7CisgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdGhyZWFkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICAgICAgICAgICAgICBfX2l0dF9hcGlfZmluaV9wdHIgPSAoX19pdHRfYXBpX2ZpbmlfdCopKHNpemVfdClfX2l0dF9nZXRfcHJvYyhfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiwgIl9faXR0X2FwaV9maW5pIik7CisgICAgICAgICAgICAgICAgaWYgKF9faXR0X2FwaV9maW5pX3B0cikKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2ZpbmlfcHRyKCZfTl8oX2l0dGFwaV9nbG9iYWwpKTsKKworICAgICAgICAgICAgICAgIF9faXR0X251bGxpZnlfYWxsX3BvaW50ZXJzKCk7CisKKyAvKiBUT0RPOiAhISEgbm90IHNhZmUgISEhIGRvbid0IHN1cHBvcnQgdW5sb2FkIHNvIGZhci4KKyAgKiAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgIT0gTlVMTCkKKyAgKiAgICAgICAgICAgICAgICAgX19pdHRfdW5sb2FkX2xpYihfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYik7CisgICogICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgPSBOVUxMOworICAqLworICAgICAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2luaXRpYWxpemVkID0gMDsKKyAgICAgICAgICAgICAgICBjdXJyZW50X3RocmVhZCA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICAgICAgX19pdHRfbXV0ZXhfdW5sb2NrKCZfTl8oX2l0dGFwaV9nbG9iYWwpLm11dGV4KTsKKyAgICB9Cit9CisKK0lUVF9FWFRFUk5fQyBpbnQgX05fKGluaXRfaXR0bGliKShjb25zdCBjaGFyKiBsaWJfbmFtZSwgX19pdHRfZ3JvdXBfaWQgaW5pdF9ncm91cHMpCit7CisgICAgcmVnaXN0ZXIgaW50IGk7CisgICAgX19pdHRfZ3JvdXBfaWQgZ3JvdXBzOworI2lmZGVmIElUVF9DT01QTEVURV9HUk9VUAorICAgIF9faXR0X2dyb3VwX2lkIHplcm9fZ3JvdXAgPSBfX2l0dF9ncm91cF9ub25lOworI2VuZGlmIC8qIElUVF9DT01QTEVURV9HUk9VUCAqLworICAgIHN0YXRpYyB2b2xhdGlsZSBUSURUIGN1cnJlbnRfdGhyZWFkID0gMDsKKworICAgIGlmICghX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQpCisgICAgeworI2lmbmRlZiBJVFRfU0lNUExFX0lOSVQKKyAgICAgICAgSVRUX01VVEVYX0lOSVRfQU5EX0xPQ0soX05fKF9pdHRhcGlfZ2xvYmFsKSk7CisjZW5kaWYgLyogSVRUX1NJTVBMRV9JTklUICovCisKKyAgICAgICAgaWYgKCFfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9pbml0aWFsaXplZCkKKyAgICAgICAgeworICAgICAgICAgICAgaWYgKGN1cnJlbnRfdGhyZWFkID09IDApCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgY3VycmVudF90aHJlYWQgPSBfX2l0dF90aHJlYWRfaWQoKTsKKyAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLnRocmVhZF9saXN0LT50aWQgPSBjdXJyZW50X3RocmVhZDsKKyAgICAgICAgICAgICAgICBpZiAobGliX25hbWUgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgbGliX25hbWUgPSBfX2l0dF9nZXRfbGliX25hbWUoKTsKKyAgICAgICAgICAgICAgICBncm91cHMgPSBfX2l0dF9nZXRfZ3JvdXBzKCk7CisgICAgICAgICAgICAgICAgaWYgKGdyb3VwcyAhPSBfX2l0dF9ncm91cF9ub25lIHx8IGxpYl9uYW1lICE9IE5VTEwpCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBfTl8oX2l0dGFwaV9nbG9iYWwpLmxpYiA9IF9faXR0X2xvYWRfbGliKChsaWJfbmFtZSA9PSBOVUxMKSA/IGl0dG5vdGlmeV9saWJfbmFtZSA6IGxpYl9uYW1lKTsKKworICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIgIT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfdCogX19pdHRfYXBpX2luaXRfcHRyOworICAgICAgICAgICAgICAgICAgICAgICAgaW50IGxpYl92ZXJzaW9uID0gX19pdHRfbGliX3ZlcnNpb24oX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIpOworCisgICAgICAgICAgICAgICAgICAgICAgICBzd2l0Y2ggKGxpYl92ZXJzaW9uKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDA6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3JvdXBzID0gX19pdHRfZ3JvdXBfbGVnYWN5OworICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8qIEZpbGwgYWxsIHBvaW50ZXJzIGZyb20gZHluYW1pYyBsaWJyYXJ5ICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZ3JvdXAgJiBncm91cHMgJiBpbml0X2dyb3VwcykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKl9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmZ1bmNfcHRyID0gKHZvaWQqKV9faXR0X2dldF9wcm9jKF9OXyhfaXR0YXBpX2dsb2JhbCkubGliLCBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICgqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPT0gTlVMTCkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBSZXN0b3JlIHBvaW50ZXJzIGZvciBmdW5jdGlvbiB3aXRoIHN0YXRpYyBpbXBsZW1lbnRhdGlvbiAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciA9IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLm51bGxfZnVuYzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBfX2l0dF9yZXBvcnRfZXJyb3IoX19pdHRfZXJyb3Jfbm9fc3ltYm9sLCBsaWJfbmFtZSwgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSk7CisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgemVyb19ncm91cCA9IChfX2l0dF9ncm91cF9pZCkoemVyb19ncm91cCB8IF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwKTsKKyNlbmRpZiAvKiBJVFRfQ09NUExFVEVfR1JPVVAgKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKGdyb3VwcyA9PSBfX2l0dF9ncm91cF9sZWdhY3kpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBDb21wYXRpYmlsaXR5IHdpdGggbGVnYWN5IHRvb2xzICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHRocmVhZF9pZ25vcmUpICA9IElUVE5PVElGWV9OQU1FKHRocl9pZ25vcmUpOworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NyZWF0ZUEpICAgPSBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lQSk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfY3JlYXRlVykgICA9IElUVE5PVElGWV9OQU1FKHN5bmNfc2V0X25hbWVXKTsKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSVRUTk9USUZZX05BTUUoc3luY19jcmVhdGUpICAgID0gSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZSk7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfcHJlcGFyZSkgICA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3ByZXBhcmUpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2NhbmNlbCkgICAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19jYW5jZWwpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJVFROT1RJRllfTkFNRShzeW5jX2FjcXVpcmVkKSAgPSBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19hY3F1aXJlZCk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIElUVE5PVElGWV9OQU1FKHN5bmNfcmVsZWFzaW5nKSA9IElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3JlbGVhc2luZyk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQorCisjaWZkZWYgSVRUX0NPTVBMRVRFX0dST1VQCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgZm9yIChpID0gMDsgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0ubmFtZSAhPSBOVUxMOyBpKyspCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5ncm91cCAmIHplcm9fZ3JvdXApCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfbGlzdF9wdHJbaV0uZnVuY19wdHIgPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmM7CisjZW5kaWYgLyogSVRUX0NPTVBMRVRFX0dST1VQICovCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDI6CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfYXBpX2luaXRfcHRyID0gKF9faXR0X2FwaV9pbml0X3QqKShzaXplX3QpX19pdHRfZ2V0X3Byb2MoX05fKF9pdHRhcGlfZ2xvYmFsKS5saWIsICJfX2l0dF9hcGlfaW5pdCIpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmIChfX2l0dF9hcGlfaW5pdF9wdHIpCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIF9faXR0X2FwaV9pbml0X3B0cigmX05fKF9pdHRhcGlfZ2xvYmFsKSwgaW5pdF9ncm91cHMpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgICAgIGVsc2UKKyAgICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKworICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfcmVwb3J0X2Vycm9yKF9faXR0X2Vycm9yX25vX21vZHVsZSwgbGliX25hbWUsCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19pdHRfc3lzdGVtX2Vycm9yKCkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBkbGVycm9yKCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyAgICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgZWxzZQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgX19pdHRfbnVsbGlmeV9hbGxfcG9pbnRlcnMoKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5hcGlfaW5pdGlhbGl6ZWQgPSAxOworICAgICAgICAgICAgICAgIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgICAgICAvKiAhISEgSnVzdCB0byBhdm9pZCB1bnVzZWQgY29kZSBlbGltaW5hdGlvbiAhISEgKi8KKyAgICAgICAgICAgICAgICBpZiAoX19pdHRfZmluaV9pdHRsaWJfcHRyID09IF9OXyhmaW5pX2l0dGxpYikpIGN1cnJlbnRfdGhyZWFkID0gMDsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorCisjaWZuZGVmIElUVF9TSU1QTEVfSU5JVAorICAgICAgICBfX2l0dF9tdXRleF91bmxvY2soJl9OXyhfaXR0YXBpX2dsb2JhbCkubXV0ZXgpOworI2VuZGlmIC8qIElUVF9TSU1QTEVfSU5JVCAqLworICAgIH0KKworICAgIC8qIEV2YWx1YXRpbmcgaWYgYW55IGZ1bmN0aW9uIHB0ciBpcyBub24gZW1wdHkgYW5kIGl0J3MgaW4gaW5pdF9ncm91cHMgKi8KKyAgICBmb3IgKGkgPSAwOyBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5uYW1lICE9IE5VTEw7IGkrKykKKyAgICAgICAgaWYgKCpfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5mdW5jX3B0ciAhPSBfTl8oX2l0dGFwaV9nbG9iYWwpLmFwaV9saXN0X3B0cltpXS5udWxsX2Z1bmMgJiYKKyAgICAgICAgICAgIF9OXyhfaXR0YXBpX2dsb2JhbCkuYXBpX2xpc3RfcHRyW2ldLmdyb3VwICYgaW5pdF9ncm91cHMpCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICByZXR1cm4gMDsKK30KKworSVRUX0VYVEVSTl9DIF9faXR0X2Vycm9yX2hhbmRsZXJfdCogX05fKHNldF9lcnJvcl9oYW5kbGVyKShfX2l0dF9lcnJvcl9oYW5kbGVyX3QqIGhhbmRsZXIpCit7CisgICAgX19pdHRfZXJyb3JfaGFuZGxlcl90KiBwcmV2ID0gKF9faXR0X2Vycm9yX2hhbmRsZXJfdCopKHNpemVfdClfTl8oX2l0dGFwaV9nbG9iYWwpLmVycm9yX2hhbmRsZXI7CisgICAgX05fKF9pdHRhcGlfZ2xvYmFsKS5lcnJvcl9oYW5kbGVyID0gKHZvaWQqKShzaXplX3QpaGFuZGxlcjsKKyAgICByZXR1cm4gcHJldjsKK30KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI3ByYWdtYSB3YXJuaW5nKHBvcCkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV9zdGF0aWMuaCBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIxOGNjOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfc3RhdGljLmgKQEAgLTAsMCArMSwzMTYgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2luY2x1ZGUgIml0dG5vdGlmeV9jb25maWcuaCIKKworI2lmbmRlZiBJVFRfRk9STUFUX0RFRklORUQKKyMgIGlmbmRlZiBJVFRfRk9STUFUCisjICAgIGRlZmluZSBJVFRfRk9STUFUCisjICBlbmRpZiAvKiBJVFRfRk9STUFUICovCisjICBpZm5kZWYgSVRUX05PX1BBUkFNUworIyAgICBkZWZpbmUgSVRUX05PX1BBUkFNUworIyAgZW5kaWYgLyogSVRUX05PX1BBUkFNUyAqLworI2VuZGlmIC8qIElUVF9GT1JNQVRfREVGSU5FRCAqLworCisvKgorICogcGFyYW1ldGVycyBmb3IgbWFjcm8gZXhwZWN0ZWQ6CisgKiBJVFRfU1RVQihhcGksIHR5cGUsIGZ1bmNfbmFtZSwgYXJndW1lbnRzLCBwYXJhbXMsIGZ1bmNfbmFtZV9pbl9kbGwsIGdyb3VwLCBwcmludGZfZm10KQorICovCisjaWZkZWYgX19JVFRfSU5URVJOQUxfSU5JVAorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZG9tYWluKiwgZG9tYWluX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIGRvbWFpbl9jcmVhdGVBLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9kb21haW4qLCBkb21haW5fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgZG9tYWluX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2RvbWFpbiosIGRvbWFpbl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBkb21haW5fY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9zdHJpbmdfaGFuZGxlKiwgc3RyaW5nX2hhbmRsZV9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZUEsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X3N0cmluZ19oYW5kbGUqLCBzdHJpbmdfaGFuZGxlX2NyZWF0ZVcsIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHN0cmluZ19oYW5kbGVfY3JlYXRlVywgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RyaW5nX2hhbmRsZSosIHN0cmluZ19oYW5kbGVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgc3RyaW5nX2hhbmRsZV9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBwYXVzZSwgIF9faXR0X2dyb3VwX2NvbnRyb2wgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlc3VtZSwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIHJlc3VtZSwgX19pdHRfZ3JvdXBfY29udHJvbCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfc2V0X25hbWVBLCAoY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCB0aHJlYWRfc2V0X25hbWVBLCBfX2l0dF9ncm91cF90aHJlYWQsICJcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGhyZWFkX3NldF9uYW1lVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgdGhyZWFkX3NldF9uYW1lVywgX19pdHRfZ3JvdXBfdGhyZWFkLCAiXCIlU1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRocmVhZF9zZXRfbmFtZSwgIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIHRocmVhZF9zZXRfbmFtZSwgIF9faXR0X2dyb3VwX3RocmVhZCwgIlwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0aHJlYWRfaWdub3JlLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgdGhyZWFkX2lnbm9yZSwgX19pdHRfZ3JvdXBfdGhyZWFkLCAibm8gYXJncyIpCisKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgdGhyX25hbWVfc2V0QSwgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIHRocl9uYW1lX3NldEEsIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsICB0aHJfbmFtZV9zZXRXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgdGhyX25hbWVfc2V0VywgX19pdHRfZ3JvdXBfdGhyZWFkIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlU1wiLCAlZCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIHRocl9uYW1lX3NldCwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCB0aHJfbmFtZV9zZXQsICBfX2l0dF9ncm91cF90aHJlYWQgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVzXCIsICVkIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIHRocl9pZ25vcmUsICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgICAgIHRocl9pZ25vcmUsICAgIF9faXR0X2dyb3VwX3RocmVhZCB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZW5hYmxlX2F0dGFjaCwgKHZvaWQpLCAoSVRUX05PX1BBUkFNUyksIGVuYWJsZV9hdHRhY2gsIF9faXR0X2dyb3VwX2FsbCwgIm5vIGFyZ3MiKQorCisjZWxzZSAgLyogX19JVFRfSU5URVJOQUxfSU5JVCAqLworCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2NyZWF0ZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKSwgc3luY19jcmVhdGVBLCBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCwgXCIlc1wiLCBcIiVzXCIsICV4IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfY3JlYXRlVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX2NyZWF0ZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVTXCIsIFwiJVNcIiwgJXgiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVBLCAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19yZW5hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIGFkZHIsIG5hbWUpLCBzeW5jX3JlbmFtZVcsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYywgIiVwLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jcmVhdGUsICAodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSksIHN5bmNfY3JlYXRlLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3JlbmFtZSwgICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgYWRkciwgbmFtZSksIHN5bmNfcmVuYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2Rlc3Ryb3ksICAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfZGVzdHJveSwgICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcHJlcGFyZSwgICAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19wcmVwYXJlLCAgIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19jYW5jZWwsICAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfc3luYywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX2FjcXVpcmVkLCAgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9zeW5jLCAgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfcmVsZWFzaW5nLCAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19yZWxlYXNpbmcsIF9faXR0X2dyb3VwX3N5bmMsICAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wdXNoLCAgICAgICAodW5zaWduZWQgaW50IG1hc2spLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbWFzayksIHN1cHByZXNzX3B1c2gsICBfX2l0dF9ncm91cF9zdXBwcmVzcywgICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdXBwcmVzc19wb3AsICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgIHN1cHByZXNzX3BvcCwgICBfX2l0dF9ncm91cF9zdXBwcmVzcywgICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN1cHByZXNzX21hcmtfcmFuZ2UsIChfX2l0dF9zdXBwcmVzc19tb2RlX3QgbW9kZSwgdW5zaWduZWQgaW50IG1hc2ssIHZvaWQgKiBhZGRyZXNzLCBzaXplX3Qgc2l6ZSksKElUVF9GT1JNQVQgbW9kZSwgbWFzaywgYWRkcmVzcywgc2l6ZSksIHN1cHByZXNzX21hcmtfcmFuZ2UsIF9faXR0X2dyb3VwX3N1cHByZXNzLCAiJWQsICVwLCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3VwcHJlc3NfY2xlYXJfcmFuZ2UsKF9faXR0X3N1cHByZXNzX21vZGVfdCBtb2RlLCB1bnNpZ25lZCBpbnQgbWFzaywgdm9pZCAqIGFkZHJlc3MsIHNpemVfdCBzaXplKSwoSVRUX0ZPUk1BVCBtb2RlLCBtYXNrLCBhZGRyZXNzLCBzaXplKSwgc3VwcHJlc3NfY2xlYXJfcmFuZ2UsX19pdHRfZ3JvdXBfc3VwcHJlc3MsICIlZCwgJXAsICVwLCAlZCIpCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3ByZXBhcmUsICAgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19wcmVwYXJlLCAgIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnN5bmNfY2FuY2VsLCAgICAodm9pZCAqYWRkciksIChJVFRfRk9STUFUIGFkZHIpLCBzeW5jX2NhbmNlbCwgICAgX19pdHRfZ3JvdXBfZnN5bmMsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmc3luY19hY3F1aXJlZCwgICh2b2lkICphZGRyKSwgKElUVF9GT1JNQVQgYWRkciksIHN5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9mc3luYywgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZzeW5jX3JlbGVhc2luZywgKHZvaWQqIGFkZHIpLCAoSVRUX0ZPUk1BVCBhZGRyKSwgc3luY19yZWxlYXNpbmcsIF9faXR0X2dyb3VwX2ZzeW5jLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9zaXRlX2JlZ2luLCAgICAgICAgICAoX19pdHRfbW9kZWxfc2l0ZSAqc2l0ZSwgX19pdHRfbW9kZWxfc2l0ZV9pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpLCAoSVRUX0ZPUk1BVCBzaXRlLCBpbnN0YW5jZSwgbmFtZSksIG1vZGVsX3NpdGVfYmVnaW4sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9lbmQsICAgICAgICAgICAgKF9faXR0X21vZGVsX3NpdGUgKnNpdGUsIF9faXR0X21vZGVsX3NpdGVfaW5zdGFuY2UgKmluc3RhbmNlKSwgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgc2l0ZSwgaW5zdGFuY2UpLCAgICAgICBtb2RlbF9zaXRlX2VuZCwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF90YXNrX2JlZ2luLCAgICAgICAgICAoX19pdHRfbW9kZWxfdGFzayAqdGFzaywgX19pdHRfbW9kZWxfdGFza19pbnN0YW5jZSAqaW5zdGFuY2UsIGNvbnN0IGNoYXIgKm5hbWUpLCAoSVRUX0ZPUk1BVCB0YXNrLCBpbnN0YW5jZSwgbmFtZSksIG1vZGVsX3Rhc2tfYmVnaW4sIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVwLCBcIiVzXCIiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmQsICAgICAgICAgICAgKF9faXR0X21vZGVsX3Rhc2sgKnRhc2ssIF9faXR0X21vZGVsX3Rhc2tfaW5zdGFuY2UgKmluc3RhbmNlKSwgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgdGFzaywgaW5zdGFuY2UpLCAgICAgICBtb2RlbF90YXNrX2VuZCwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmUsICAgICAgICAodm9pZCAqbG9jayksIChJVFRfRk9STUFUIGxvY2spLCBtb2RlbF9sb2NrX2FjcXVpcmUsIF9faXR0X2dyb3VwX21vZGVsLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfbG9ja19yZWxlYXNlLCAgICAgICAgKHZvaWQgKmxvY2spLCAoSVRUX0ZPUk1BVCBsb2NrKSwgbW9kZWxfbG9ja19yZWxlYXNlLCBfX2l0dF9ncm91cF9tb2RlbCwgIiVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3JlY29yZF9hbGxvY2F0aW9uLCAgICh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9yZWNvcmRfYWxsb2NhdGlvbiwgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9yZWNvcmRfZGVhbGxvY2F0aW9uLCAodm9pZCAqYWRkciksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBhZGRyKSwgICAgICAgbW9kZWxfcmVjb3JkX2RlYWxsb2NhdGlvbiwgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pbmR1Y3Rpb25fdXNlcywgICAgICAodm9pZCogYWRkciwgc2l6ZV90IHNpemUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBzaXplKSwgbW9kZWxfaW5kdWN0aW9uX3VzZXMsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfcmVkdWN0aW9uX3VzZXMsICAgICAgKHZvaWQqIGFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1vZGVsX3JlZHVjdGlvbl91c2VzLCAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiJXAsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX29ic2VydmVfdXNlcywgICAgICAgICh2b2lkKiBhZGRyLCBzaXplX3Qgc2l6ZSksIChJVFRfRk9STUFUIGFkZHIsIHNpemUpLCBtb2RlbF9vYnNlcnZlX3VzZXMsICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIiVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9jbGVhcl91c2VzLCAgICAgICAgICAodm9pZCogYWRkciksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBhZGRyKSwgICAgICAgbW9kZWxfY2xlYXJfdXNlcywgICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpblcsICAgICAgICAgKGNvbnN0IHdjaGFyX3QgKm5hbWUpLCAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3NpdGVfYmVnaW5XLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5XLCAgICAgICAgIChjb25zdCB3Y2hhcl90ICpuYW1lKSwgICAgIChJVFRfRk9STUFUIG5hbWUpLCAgICAgICBtb2RlbF90YXNrX2JlZ2luVywgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9pdGVyYXRpb25fdGFza1csICAgICAoY29uc3Qgd2NoYXJfdCAqbmFtZSksICAgICAoSVRUX0ZPUk1BVCBuYW1lKSwgICAgICAgbW9kZWxfaXRlcmF0aW9uX3Rhc2tXLCAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfc2l0ZV9iZWdpbkEsICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3NpdGVfYmVnaW5BLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfYmVnaW5BTCwgICAgICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfc2l0ZV9iZWdpbkFMLCAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19iZWdpbkEsICAgICAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX3Rhc2tfYmVnaW5BLCAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3Rhc2tfYmVnaW5BTCwgICAgICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfdGFza19iZWdpbkFMLCAgICBfX2l0dF9ncm91cF9tb2RlbCwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBLCAgICAgKGNvbnN0IGNoYXIgKm5hbWUpLCAgICAgICAgKElUVF9GT1JNQVQgbmFtZSksICAgICAgIG1vZGVsX2l0ZXJhdGlvbl90YXNrQSwgICAgIF9faXR0X2dyb3VwX21vZGVsLCAiXCIlc1wiIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX2l0ZXJhdGlvbl90YXNrQUwsICAgIChjb25zdCBjaGFyICpuYW1lLCBzaXplX3QgbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbGVuKSwgbW9kZWxfaXRlcmF0aW9uX3Rhc2tBTCwgX19pdHRfZ3JvdXBfbW9kZWwsICJcIiVzXCIsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1vZGVsX3NpdGVfZW5kXzIsICAgICAgICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgIChJVFRfTk9fUEFSQU1TKSwgICAgICAgICBtb2RlbF9zaXRlX2VuZF8yLCAgICAgICAgICBfX2l0dF9ncm91cF9tb2RlbCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbW9kZWxfdGFza19lbmRfMiwgICAgICAgICAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgIG1vZGVsX3Rhc2tfZW5kXzIsICAgICAgICAgIF9faXR0X2dyb3VwX21vZGVsLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX2FjcXVpcmVfMiwgICAgICAodm9pZCAqbG9jayksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBsb2NrKSwgICAgICAgbW9kZWxfbG9ja19hY3F1aXJlXzIsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9sb2NrX3JlbGVhc2VfMiwgICAgICAodm9pZCAqbG9jayksICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBsb2NrKSwgICAgICAgbW9kZWxfbG9ja19yZWxlYXNlXzIsICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9hZ2dyZWdhdGVfdGFzaywgICAgICAoc2l6ZV90IGNvdW50KSwgICAgICAgICAgICAoSVRUX0ZPUk1BVCBjb3VudCksICAgICAgbW9kZWxfYWdncmVnYXRlX3Rhc2ssICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3B1c2gsICAgICAgICAoX19pdHRfbW9kZWxfZGlzYWJsZSB4KSwgICAoSVRUX0ZPUk1BVCB4KSwgICAgICAgICAgbW9kZWxfZGlzYWJsZV9wdXNoLCAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtb2RlbF9kaXNhYmxlX3BvcCwgICAgICAgICAodm9pZCksICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgICAgICAgbW9kZWxfZGlzYWJsZV9wb3AsICAgICAgICAgX19pdHRfZ3JvdXBfbW9kZWwsICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9oZWFwX2Z1bmN0aW9uLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBoZWFwX2Z1bmN0aW9uX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2hlYXAsICJcIiVzXCIsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2hlYXBfZnVuY3Rpb24sIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGhlYXBfZnVuY3Rpb25fY3JlYXRlVywgX19pdHRfZ3JvdXBfaGVhcCwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfaGVhcF9mdW5jdGlvbiwgaGVhcF9mdW5jdGlvbl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgaGVhcF9mdW5jdGlvbl9jcmVhdGUsICBfX2l0dF9ncm91cF9oZWFwLCAiXCIlc1wiLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfYmVnaW4sICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgc2l6ZV90IHNpemUsIGludCBpbml0aWFsaXplZCksICAgICAgICAgICAgIChJVFRfRk9STUFUIGgsIHNpemUsIGluaXRpYWxpemVkKSwgICAgICAgaGVhcF9hbGxvY2F0ZV9iZWdpbiwgX19pdHRfZ3JvdXBfaGVhcCwgIiVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfYWxsb2NhdGVfZW5kLCAgICAgKF9faXR0X2hlYXBfZnVuY3Rpb24gaCwgdm9pZCoqIGFkZHIsIHNpemVfdCBzaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAoSVRUX0ZPUk1BVCBoLCBhZGRyLCBzaXplLCBpbml0aWFsaXplZCksIGhlYXBfYWxsb2NhdGVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9mcmVlX2JlZ2luLCAgICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciksIChJVFRfRk9STUFUIGgsIGFkZHIpLCBoZWFwX2ZyZWVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9mcmVlX2VuZCwgICAgICAgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciksIChJVFRfRk9STUFUIGgsIGFkZHIpLCBoZWFwX2ZyZWVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2JlZ2luLCAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciwgc2l6ZV90IG5ld19zaXplLCBpbnQgaW5pdGlhbGl6ZWQpLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGgsIGFkZHIsIG5ld19zaXplLCBpbml0aWFsaXplZCksICAgICAgICAgICBoZWFwX3JlYWxsb2NhdGVfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVsdSwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZWFsbG9jYXRlX2VuZCwgICAoX19pdHRfaGVhcF9mdW5jdGlvbiBoLCB2b2lkKiAgYWRkciwgdm9pZCoqIG5ld19hZGRyLCBzaXplX3QgbmV3X3NpemUsIGludCBpbml0aWFsaXplZCksIChJVFRfRk9STUFUIGgsIGFkZHIsIG5ld19hZGRyLCBuZXdfc2l6ZSwgaW5pdGlhbGl6ZWQpLCBoZWFwX3JlYWxsb2NhdGVfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICIlcCwgJXAsICVwLCAlbHUsICVkIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2JlZ2luLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfYmVnaW4sIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfaW50ZXJuYWxfYWNjZXNzX2VuZCwgICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9pbnRlcm5hbF9hY2Nlc3NfZW5kLCAgIF9faXR0X2dyb3VwX2hlYXAsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGhlYXBfcmVjb3JkX21lbW9yeV9ncm93dGhfYmVnaW4sICh2b2lkKSwgKElUVF9OT19QQVJBTVMpLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2JlZ2luLCBfX2l0dF9ncm91cF9oZWFwLCAibm8gYXJncyIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZF9tZW1vcnlfZ3Jvd3RoX2VuZCwgICAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgaGVhcF9yZWNvcmRfbWVtb3J5X2dyb3d0aF9lbmQsICAgX19pdHRfZ3JvdXBfaGVhcCwgIm5vIGFyZ3MiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaGVhcF9yZXNldF9kZXRlY3Rpb24sICh1bnNpZ25lZCBpbnQgcmVzZXRfbWFzayksICAoSVRUX0ZPUk1BVCByZXNldF9tYXNrKSwgaGVhcF9yZXNldF9kZXRlY3Rpb24sIF9faXR0X2dyb3VwX2hlYXAsICIldSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBoZWFwX3JlY29yZCwgICAgICAgICAgKHVuc2lnbmVkIGludCByZWNvcmRfbWFzayksIChJVFRfRk9STUFUIHJlY29yZF9tYXNrKSwgIGhlYXBfcmVjb3JkLCAgICAgICAgX19pdHRfZ3JvdXBfaGVhcCwgIiV1IikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgaWRfY3JlYXRlLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCBpZF9jcmVhdGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3ksIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkKSwgaWRfZGVzdHJveSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCisKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfdGltZXN0YW1wLCBnZXRfdGltZXN0YW1wLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgZ2V0X3RpbWVzdGFtcCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIm5vIGFyZ3MiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fYmVnaW4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHJlZ2lvbl9iZWdpbiwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWdpb25fZW5kLCAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCAgICAgICAgICAgICAgIHJlZ2lvbl9lbmQsICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW5fdjMsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkICppZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCksICAgICAgICAgICAgIGZyYW1lX2JlZ2luX3YzLCAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGZyYW1lX2VuZF92MywgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCAqaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCAgICAgICAgICAgICBmcmFtZV9lbmRfdjMsICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9zdWJtaXRfdjMsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgKmlkLCBfX2l0dF90aW1lc3RhbXAgYmVnaW4sIF9faXR0X3RpbWVzdGFtcCBlbmQpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBiZWdpbiwgZW5kKSwgZnJhbWVfc3VibWl0X3YzLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZ3JvdXAsICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfaWQgcGFyZW50LCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwgcGFyZW50LCBuYW1lKSwgdGFza19ncm91cCwgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luLCAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBwYXJlbnQsIG5hbWUpLCB0YXNrX2JlZ2luLCAgICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlbHUsICVwIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZm4sIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgdm9pZCogZm4pLCAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgZm4pLCAgIHRhc2tfYmVnaW5fZm4sIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluKSwgICAgICAgICAgICAgICAgICAgdGFza19lbmQsICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY192MywgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUpLCAgICAgICAgY291bnRlcl9pbmNfdjMsICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luY19kZWx0YV92MywgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBkb21haW4sIG5hbWUsIHZhbHVlKSwgY291bnRlcl9pbmNfZGVsdGFfdjMsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1IikKKworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWFya2VyLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICpuYW1lLCBfX2l0dF9zY29wZSBzY29wZSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJWQiKQorCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9hZGQsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBfX2l0dF9tZXRhZGF0YV90eXBlIHR5cGUsIHNpemVfdCBjb3VudCwgdm9pZCAqZGF0YSksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgdHlwZSwgY291bnQsIGRhdGEpLCBtZXRhZGF0YV9hZGQsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlZCwgJWx1LCAlcCIpCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkQSwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyKiBkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBpZCwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJXAsICVwLCAlbHUiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZFcsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3Qgd2NoYXJfdCogZGF0YSwgc2l6ZV90IGxlbmd0aCksIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZFcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlbHUsICVwLCAlcCwgJWx1IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGQsICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IGNoYXIqIGRhdGEsIHNpemVfdCBsZW5ndGgpLCAgICAoSVRUX0ZPUk1BVCBkb21haW4sIGlkLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCwgJXAsICVsdSIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3JlbGF0aW9uIHJlbGF0aW9uLCBfX2l0dF9pZCB0YWlsKSwgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCByZWxhdGlvbiwgdGFpbCksICAgICAgIHJlbGF0aW9uX2FkZF90b19jdXJyZW50LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgaGVhZCwgcmVsYXRpb24sIHRhaWwpLCByZWxhdGlvbl9hZGQsICAgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVwIikKKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBuYW1lbGVuKSwgZXZlbnRfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIlwiJXNcIiwgJWQiKQorSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKSwgKElUVF9GT1JNQVQgbmFtZSwgbmFtZWxlbiksIGV2ZW50X2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmsgfCBfX2l0dF9ncm91cF9sZWdhY3ksICJcIiVTXCIsICVkIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZSwgIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbiksIChJVFRfRk9STUFUIG5hbWUsIG5hbWVsZW4pLCBldmVudF9jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiXCIlc1wiLCAlZCIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgIGV2ZW50X3N0YXJ0LCAgICAgICAgICAoX19pdHRfZXZlbnQgZXZlbnQpLCAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBldmVudCksICAgICAgICAgZXZlbnRfc3RhcnQsICAgX19pdHRfZ3JvdXBfbWFyayB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCAgZXZlbnRfZW5kLCAgICAgICAgICAgIChfX2l0dF9ldmVudCBldmVudCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGV2ZW50KSwgICAgICAgICBldmVudF9lbmQsICAgICBfX2l0dF9ncm91cF9tYXJrIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJWQiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2lmbmRlZiBfX0lUVF9JTlRFUk5BTF9CT0RZCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lQSwgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lQSwgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJXNcIiwgXCIlc1wiLCAleCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lVywgKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgXCIlU1wiLCAleCIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBhZGRyLCBvYmp0eXBlLCBvYmpuYW1lLCBhdHRyaWJ1dGUpLCBzeW5jX3NldF9uYW1lLCAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAicCwgXCIlc1wiLCBcIiVzXCIsICV4IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVBLCAodm9pZCAqcCwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSwgKElUVF9GT1JNQVQgcCwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKSwgbm90aWZ5X3N5bmNfbmFtZUEsIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCBcIiVzXCIsICVkLCBcIiVzXCIsICVkLCAleCIpCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZVcsICh2b2lkICpwLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpLCAoSVRUX0ZPUk1BVCBwLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpLCBub3RpZnlfc3luY19uYW1lVywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAsIFwiJVNcIiwgJWQsIFwiJVNcIiwgJWQsICV4IikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk0hPUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKnAsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSksIChJVFRfRk9STUFUIHAsIG9ianR5cGUsIHR5cGVsZW4sIG9iam5hbWUsIG5hbWVsZW4sIGF0dHJpYnV0ZSksIG5vdGlmeV9zeW5jX25hbWUsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCwgXCIlc1wiLCAlZCwgXCIlc1wiLCAlZCwgJXgiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAgICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3ByZXBhcmUsICAgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAgICAodm9pZCAqcCksIChJVFRfRk9STUFUIHApLCBub3RpZnlfc3luY19jYW5jZWwsICAgIF9faXR0X2dyb3VwX3N5bmMgfCBfX2l0dF9ncm91cF9mc3luYyB8IF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwIikKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX2FjcXVpcmVkLCAgKHZvaWQgKnApLCAoSVRUX0ZPUk1BVCBwKSwgbm90aWZ5X3N5bmNfYWNxdWlyZWQsICBfX2l0dF9ncm91cF9zeW5jIHwgX19pdHRfZ3JvdXBfZnN5bmMgfCBfX2l0dF9ncm91cF9sZWdhY3ksICIlcCIpCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19yZWxlYXNpbmcsICh2b2lkICpwKSwgKElUVF9GT1JNQVQgcCksIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgX19pdHRfZ3JvdXBfc3luYyB8IF9faXR0X2dyb3VwX2ZzeW5jIHwgX19pdHRfZ3JvdXBfbGVnYWN5LCAiJXAiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3JlYWQsICAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV9yZWFkLCAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3dyaXRlLCAgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV93cml0ZSwgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbWVtb3J5X3VwZGF0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSwgKElUVF9GT1JNQVQgYWRkciwgc2l6ZSksIG1lbW9yeV91cGRhdGUsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVwLCAlbHUiKQorCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3N0YXRlX3QsICAgICBzdGF0ZV9nZXQsICAgICh2b2lkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX05PX1BBUkFNUyksICAgc3RhdGVfZ2V0LCAgICBfX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfc3RhdGVfdCwgICAgIHN0YXRlX3NldCwgICAgKF9faXR0X3N0YXRlX3QgcyksICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIHMpLCAgICBzdGF0ZV9zZXQsICAgIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkIikKK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcyksIChJVFRfRk9STUFUIHAsIHMpLCBvYmpfbW9kZV9zZXQsIF9faXR0X2dyb3VwX2xlZ2FjeSwgIiVkLCAlZCIpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X3Rocl9zdGF0ZV90LCB0aHJfbW9kZV9zZXQsIChfX2l0dF90aHJfcHJvcF90IHAsIF9faXR0X3Rocl9zdGF0ZV90IHMpLCAoSVRUX0ZPUk1BVCBwLCBzKSwgdGhyX21vZGVfc2V0LCBfX2l0dF9ncm91cF9sZWdhY3ksICIlZCwgJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBkb21haW4pLCBmcmFtZV9jcmVhdGVBLCBfX2l0dF9ncm91cF9mcmFtZSwgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqZG9tYWluKSwgKElUVF9GT1JNQVQgZG9tYWluKSwgZnJhbWVfY3JlYXRlVywgX19pdHRfZ3JvdXBfZnJhbWUsICJcIiVzXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKmRvbWFpbiksIChJVFRfRk9STUFUIGRvbWFpbiksIGZyYW1lX2NyZWF0ZSwgIF9faXR0X2dyb3VwX2ZyYW1lLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9iZWdpbiwgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfYmVnaW4sICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgICAgICAgICAoX19pdHRfZnJhbWUgZnJhbWUpLCAgICAgKElUVF9GT1JNQVQgZnJhbWUpLCAgZnJhbWVfZW5kLCAgICAgX19pdHRfZ3JvdXBfZnJhbWUsICIlcCIpCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9jb3VudGVyLCBjb3VudGVyX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBjb25zdCBjaGFyICAgICpkb21haW4pLCAoSVRUX0ZPUk1BVCBuYW1lLCBkb21haW4pLCBjb3VudGVyX2NyZWF0ZUEsIF9faXR0X2dyb3VwX2NvdW50ZXIsICJcIiVzXCIsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2NvdW50ZXIsIGNvdW50ZXJfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGNvbnN0IHdjaGFyX3QgKmRvbWFpbiksIChJVFRfRk9STUFUIG5hbWUsIGRvbWFpbiksIGNvdW50ZXJfY3JlYXRlVywgX19pdHRfZ3JvdXBfY291bnRlciwgIlwiJXNcIiwgXCIlc1wiIikKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY291bnRlciwgY291bnRlcl9jcmVhdGUsICAoY29uc3QgY2hhciAgICAqbmFtZSwgY29uc3QgY2hhciAgICAqZG9tYWluKSwgKElUVF9GT1JNQVQgbmFtZSwgZG9tYWluKSwgY291bnRlcl9jcmVhdGUsICBfX2l0dF9ncm91cF9jb3VudGVyLCAiXCIlc1wiLCBcIiVzXCIiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGNvdW50ZXJfZGVzdHJveSwgICAoX19pdHRfY291bnRlciBpZCksICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgaWQpLCAgICAgICAgY291bnRlcl9kZXN0cm95LCAgIF9faXR0X2dyb3VwX2NvdW50ZXIsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBjb3VudGVyX2luYywgICAgICAgKF9faXR0X2NvdW50ZXIgaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGlkKSwgICAgICAgIGNvdW50ZXJfaW5jLCAgICAgICBfX2l0dF9ncm91cF9jb3VudGVyLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgY291bnRlcl9pbmNfZGVsdGEsIChfX2l0dF9jb3VudGVyIGlkLCB1bnNpZ25lZCBsb25nIGxvbmcgdmFsdWUpLCAoSVRUX0ZPUk1BVCBpZCwgdmFsdWUpLCBjb3VudGVyX2luY19kZWx0YSwgX19pdHRfZ3JvdXBfY291bnRlciwgIiVwLCAlbHUiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfbWFya190eXBlLCBtYXJrX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lKSwgKElUVF9GT1JNQVQgbmFtZSksIG1hcmtfY3JlYXRlQSwgX19pdHRfZ3JvdXBfbWFyaywgIlwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIF9faXR0X21hcmtfdHlwZSwgbWFya19jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSksIChJVFRfRk9STUFUIG5hbWUpLCBtYXJrX2NyZWF0ZVcsIF9faXR0X2dyb3VwX21hcmssICJcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9tYXJrX3R5cGUsIG1hcmtfY3JlYXRlLCAgKGNvbnN0IGNoYXIgICAgKm5hbWUpLCAoSVRUX0ZPUk1BVCBuYW1lKSwgbWFya19jcmVhdGUsICBfX2l0dF9ncm91cF9tYXJrLCAiXCIlc1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtBLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtXLCAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtXLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJVNcIiIpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNIT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmssICAgICAgICAgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3QgY2hhciAgICAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmssICBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgKElUVF9GT1JNQVQgbXQpLCBtYXJrX29mZiwgX19pdHRfZ3JvdXBfbWFyaywgIiVkIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxBLCAoX19pdHRfbWFya190eXBlIG10LCBjb25zdCBjaGFyICAgICpwYXJhbWV0ZXIpLCAoSVRUX0ZPUk1BVCBtdCwgcGFyYW1ldGVyKSwgbWFya19nbG9iYWxBLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQsIFwiJXNcIiIpCitJVFRfU1RVQihJVFRBUEksIGludCwgIG1hcmtfZ2xvYmFsVywgKF9faXR0X21hcmtfdHlwZSBtdCwgY29uc3Qgd2NoYXJfdCAqcGFyYW1ldGVyKSwgKElUVF9GT1JNQVQgbXQsIHBhcmFtZXRlciksIG1hcmtfZ2xvYmFsVywgX19pdHRfZ3JvdXBfbWFyaywgIiVkLCBcIiVTXCIiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsICBtYXJrX2dsb2JhbCwgIChfX2l0dF9tYXJrX3R5cGUgbXQsIGNvbnN0IGNoYXIgICAgKnBhcmFtZXRlciksIChJVFRfRk9STUFUIG10LCBwYXJhbWV0ZXIpLCBtYXJrX2dsb2JhbCwgIF9faXR0X2dyb3VwX21hcmssICIlZCwgXCIlU1wiIikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKElUVEFQSSwgaW50LCAgbWFya19nbG9iYWxfb2ZmLCAoX19pdHRfbWFya190eXBlIG10KSwgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCBtdCksICAgICAgICAgICAgbWFya19nbG9iYWxfb2ZmLCBfX2l0dF9ncm91cF9tYXJrLCAiJWQiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfY2FsbGVyLCBzdGFja19jYWxsZXJfY3JlYXRlLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgc3RhY2tfY2FsbGVyX2NyZWF0ZSwgIF9faXR0X2dyb3VwX3N0aXRjaCwgIm5vIGFyZ3MiKQorI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN0YWNrX2NhbGxlcl9kZXN0cm95LCAoX19pdHRfY2FsbGVyIGlkKSwgKElUVF9GT1JNQVQgaWQpLCBzdGFja19jYWxsZXJfZGVzdHJveSwgX19pdHRfZ3JvdXBfc3RpdGNoLCAiJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3RhY2tfY2FsbGVlX2VudGVyLCAgIChfX2l0dF9jYWxsZXIgaWQpLCAoSVRUX0ZPUk1BVCBpZCksIHN0YWNrX2NhbGxlZV9lbnRlciwgICBfX2l0dF9ncm91cF9zdGl0Y2gsICIlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzdGFja19jYWxsZWVfbGVhdmUsICAgKF9faXR0X2NhbGxlciBpZCksIChJVFRfRk9STUFUIGlkKSwgc3RhY2tfY2FsbGVlX2xlYXZlLCAgIF9faXR0X2dyb3VwX3N0aXRjaCwgIiVwIikKKworSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfY2xvY2tfZG9tYWluKiwgY2xvY2tfZG9tYWluX2NyZWF0ZSwgKF9faXR0X2dldF9jbG9ja19pbmZvX2ZuIGZuLCB2b2lkKiBmbl9kYXRhKSwgKElUVF9GT1JNQVQgZm4sIGZuX2RhdGEpLCBjbG9ja19kb21haW5fY3JlYXRlLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgICAgICAgICAgICAgICAgY2xvY2tfZG9tYWluX3Jlc2V0LCAgKHZvaWQpLCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9OT19QQVJBTVMpLCAgICAgICAgICBjbG9ja19kb21haW5fcmVzZXQsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICJubyBhcmdzIikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2NyZWF0ZV9leCwgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9jcmVhdGVfZXgsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIGlkX2Rlc3Ryb3lfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCBpZF9kZXN0cm95X2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfYmVnaW5fZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19iZWdpbl9mbl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudGlkLCB2b2lkKiBmbiksICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIHBhcmVudGlkLCBmbiksIHRhc2tfYmVnaW5fZm5fZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVsdSwgJXAiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgdGFza19lbmRfZXgsICAgICAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCksIHRhc2tfZW5kX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWQsICAgICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfaWQgaWQsIF9faXR0X2lkIHBhcmVudCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQsIHBhcmVudCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2JlZ2luX292ZXJsYXBwZWRfZXgsICAgIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkLCBfX2l0dF9pZCBwYXJlbnRpZCwgX19pdHRfc3RyaW5nX2hhbmRsZSAqbmFtZSksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGlkLCBwYXJlbnRpZCwgbmFtZSksIHRhc2tfYmVnaW5fb3ZlcmxhcHBlZF9leCwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlbHUsICVsdSwgJWx1LCAlcCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCB0YXNrX2VuZF9vdmVybGFwcGVkLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkLCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHRhc2tfZW5kX292ZXJsYXBwZWRfZXgsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfY2xvY2tfZG9tYWluKiBjbG9ja19kb21haW4sIHVuc2lnbmVkIGxvbmcgbG9uZyB0aW1lc3RhbXAsIF9faXR0X2lkIGlkKSwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQpLCB0YXNrX2VuZF9vdmVybGFwcGVkX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1hcmtlcl9leCwgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9jbG9ja19kb21haW4qIGNsb2NrX2RvbWFpbiwgdW5zaWduZWQgbG9uZyBsb25nIHRpbWVzdGFtcCwgX19pdHRfaWQgaWQsIF9faXR0X3N0cmluZ19oYW5kbGUgKm5hbWUsIF9faXR0X3Njb3BlIHNjb3BlKSwgKElUVF9GT1JNQVQgZG9tYWluLCBjbG9ja19kb21haW4sIHRpbWVzdGFtcCwgaWQsIG5hbWUsIHNjb3BlKSwgbWFya2VyX2V4LCBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJXAsICVsdSwgJWx1LCAlcCwgJWQiKQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgX19pdHRfbWV0YWRhdGFfdHlwZSB0eXBlLCBzaXplX3QgY291bnQsIHZvaWQgKmRhdGEpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIHR5cGUsIGNvdW50LCBkYXRhKSwgbWV0YWRhdGFfYWRkX3dpdGhfc2NvcGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVkLCAlbHUsICVwIikKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZUEsIChjb25zdCBfX2l0dF9kb21haW4gKmRvbWFpbiwgX19pdHRfc2NvcGUgc2NvcGUsIF9faXR0X3N0cmluZ19oYW5kbGUgKmtleSwgY29uc3QgY2hhciAqZGF0YSwgc2l6ZV90IGxlbmd0aCksICAgIChJVFRfRk9STUFUIGRvbWFpbiwgc2NvcGUsIGtleSwgZGF0YSwgbGVuZ3RoKSwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlQSwgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVkLCAlcCwgJXAsICVsdSIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGVXLCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X3Njb3BlIHNjb3BlLCBfX2l0dF9zdHJpbmdfaGFuZGxlICprZXksIGNvbnN0IHdjaGFyX3QgKmRhdGEsIHNpemVfdCBsZW5ndGgpLCAoSVRUX0ZPUk1BVCBkb21haW4sIHNjb3BlLCBrZXksIGRhdGEsIGxlbmd0aCksIG1ldGFkYXRhX3N0cl9hZGRfd2l0aF9zY29wZVcsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCwgJXAsICVwLCAlbHUiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgbWV0YWRhdGFfc3RyX2FkZF93aXRoX3Njb3BlLCAgKGNvbnN0IF9faXR0X2RvbWFpbiAqZG9tYWluLCBfX2l0dF9zY29wZSBzY29wZSwgX19pdHRfc3RyaW5nX2hhbmRsZSAqa2V5LCBjb25zdCBjaGFyICpkYXRhLCBzaXplX3QgbGVuZ3RoKSwgICAgKElUVF9GT1JNQVQgZG9tYWluLCBzY29wZSwga2V5LCBkYXRhLCBsZW5ndGgpLCBtZXRhZGF0YV9zdHJfYWRkX3dpdGhfc2NvcGUsICBfX2l0dF9ncm91cF9zdHJ1Y3R1cmUsICIlcCwgJWQsICVwLCAlcCwgJWx1IikKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF90b19jdXJyZW50X2V4LCAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksICAgICAgICAgICAgICAgIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIHJlbGF0aW9uLCB0YWlsKSwgICAgICAgcmVsYXRpb25fYWRkX3RvX2N1cnJlbnRfZXgsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlZCwgJWx1IikKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHJlbGF0aW9uX2FkZF9leCwgICAgICAgICAgICAoY29uc3QgX19pdHRfZG9tYWluICpkb21haW4sIF9faXR0X2Nsb2NrX2RvbWFpbiogY2xvY2tfZG9tYWluLCB1bnNpZ25lZCBsb25nIGxvbmcgdGltZXN0YW1wLCBfX2l0dF9pZCBoZWFkLCBfX2l0dF9yZWxhdGlvbiByZWxhdGlvbiwgX19pdHRfaWQgdGFpbCksIChJVFRfRk9STUFUIGRvbWFpbiwgY2xvY2tfZG9tYWluLCB0aW1lc3RhbXAsIGhlYWQsIHJlbGF0aW9uLCB0YWlsKSwgcmVsYXRpb25fYWRkX2V4LCAgICAgICAgICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlcCwgJWx1LCAlbHUsICVkLCAlbHUiKQorSVRUX1NUVUIoSVRUQVBJLCAgX19pdHRfdHJhY2tfZ3JvdXAqLCB0cmFja19ncm91cF9jcmVhdGUsIChfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja19ncm91cF90eXBlIHRyYWNrX2dyb3VwX3R5cGUpLCAgICAgICAgICAgICAgICAgICAgKElUVF9GT1JNQVQgbmFtZSwgdHJhY2tfZ3JvdXBfdHlwZSksICAgICAgICB0cmFja19ncm91cF9jcmVhdGUsIF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgIiVwLCAlZCIpCitJVFRfU1RVQihJVFRBUEksICBfX2l0dF90cmFjayosICAgICAgIHRyYWNrX2NyZWF0ZSwgICAgICAgKF9faXR0X3RyYWNrX2dyb3VwKiB0cmFja19ncm91cCxfX2l0dF9zdHJpbmdfaGFuZGxlKiBuYW1lLCBfX2l0dF90cmFja190eXBlIHRyYWNrX3R5cGUpLCAoSVRUX0ZPUk1BVCB0cmFja19ncm91cCwgbmFtZSwgdHJhY2tfdHlwZSksIHRyYWNrX2NyZWF0ZSwgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAsICVwLCAlZCIpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgKF9faXR0X3RyYWNrICp0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoSVRUX0ZPUk1BVCB0cmFjayksICAgICAgICAgICAgICAgICAgICAgICAgIHNldF90cmFjaywgICAgICAgICAgX19pdHRfZ3JvdXBfc3RydWN0dXJlLCAiJXAiKQorCisjaWZuZGVmIF9fSVRUX0lOVEVSTkFMX0JPRFkKK0lUVF9TVFVCKElUVEFQSSwgY29uc3QgY2hhciosIGFwaV92ZXJzaW9uLCAodm9pZCksIChJVFRfTk9fUEFSQU1TKSwgYXBpX3ZlcnNpb24sIF9faXR0X2dyb3VwX2FsbCAmIH5fX2l0dF9ncm91cF9sZWdhY3ksICJubyBhcmdzIikKKyNlbmRpZiAvKiBfX0lUVF9JTlRFUk5BTF9CT0RZICovCisKKyNpZm5kZWYgX19JVFRfSU5URVJOQUxfQk9EWQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVBLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlQSwgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmVXLCAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IHdjaGFyX3QgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlVywgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJVNcIiwgJWQiKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STSE9SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoSVRUQVBJLCBpbnQsIGF2X3NhdmUsICAodm9pZCAqZGF0YSwgaW50IHJhbmssIGNvbnN0IGludCAqZGltZW5zaW9ucywgaW50IHR5cGUsIGNvbnN0IGNoYXIgKmZpbGVQYXRoLCBpbnQgY29sdW1uT3JkZXIpLCAoSVRUX0ZPUk1BVCBkYXRhLCByYW5rLCBkaW1lbnNpb25zLCB0eXBlLCBmaWxlUGF0aCwgY29sdW1uT3JkZXIpLCBhdl9zYXZlLCAgX19pdHRfZ3JvdXBfYXJyYXlzLCAiJXAsICVkLCAlcCwgJWQsIFwiJXNcIiwgJWQiKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0JPRFkgKi8KKworI2VuZGlmIC8qIF9fSVRUX0lOVEVSTkFMX0lOSVQgKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaCBiL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9pdHRub3RpZnlfdHlwZXMuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zNjk1YTY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3RoaXJkcGFydHkvaXR0bm90aWZ5L2l0dG5vdGlmeV90eXBlcy5oCkBAIC0wLDAgKzEsNjcgQEAKKworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKy8vCisvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLworLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLworLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKworI2lmbmRlZiBfSVRUTk9USUZZX1RZUEVTX0hfCisjZGVmaW5lIF9JVFROT1RJRllfVFlQRVNfSF8KKwordHlwZWRlZiBlbnVtIF9fX2l0dF9ncm91cF9pZAoreworICAgIF9faXR0X2dyb3VwX25vbmUgICAgICA9IDAsCisgICAgX19pdHRfZ3JvdXBfbGVnYWN5ICAgID0gMTw8MCwKKyAgICBfX2l0dF9ncm91cF9jb250cm9sICAgPSAxPDwxLAorICAgIF9faXR0X2dyb3VwX3RocmVhZCAgICA9IDE8PDIsCisgICAgX19pdHRfZ3JvdXBfbWFyayAgICAgID0gMTw8MywKKyAgICBfX2l0dF9ncm91cF9zeW5jICAgICAgPSAxPDw0LAorICAgIF9faXR0X2dyb3VwX2ZzeW5jICAgICA9IDE8PDUsCisgICAgX19pdHRfZ3JvdXBfaml0ICAgICAgID0gMTw8NiwKKyAgICBfX2l0dF9ncm91cF9tb2RlbCAgICAgPSAxPDw3LAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21pbiA9IDE8PDcsCisgICAgX19pdHRfZ3JvdXBfY291bnRlciAgID0gMTw8OCwKKyAgICBfX2l0dF9ncm91cF9mcmFtZSAgICAgPSAxPDw5LAorICAgIF9faXR0X2dyb3VwX3N0aXRjaCAgICA9IDE8PDEwLAorICAgIF9faXR0X2dyb3VwX2hlYXAgICAgICA9IDE8PDExLAorICAgIF9faXR0X2dyb3VwX3NwbGl0dGVyX21heCA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N0cnVjdHVyZSA9IDE8PDEyLAorICAgIF9faXR0X2dyb3VwX3N1cHByZXNzID0gMTw8MTMsCisgICAgX19pdHRfZ3JvdXBfYXJyYXlzICAgID0gMTw8MTQsCisgICAgX19pdHRfZ3JvdXBfYWxsICAgICAgID0gLTEKK30gX19pdHRfZ3JvdXBfaWQ7CisKKyNwcmFnbWEgcGFjayhwdXNoLCA4KQorCit0eXBlZGVmIHN0cnVjdCBfX19pdHRfZ3JvdXBfbGlzdAoreworICAgIF9faXR0X2dyb3VwX2lkIGlkOworICAgIGNvbnN0IGNoYXIqICAgIG5hbWU7Cit9IF9faXR0X2dyb3VwX2xpc3Q7CisKKyNwcmFnbWEgcGFjayhwb3ApCisKKyNkZWZpbmUgSVRUX0dST1VQX0xJU1QodmFybmFtZSkgXAorICAgIHN0YXRpYyBfX2l0dF9ncm91cF9saXN0IHZhcm5hbWVbXSA9IHsgICAgICAgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FsbCwgICAgICAgImFsbCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvbnRyb2wsICAgImNvbnRyb2wiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3RocmVhZCwgICAgInRocmVhZCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21hcmssICAgICAgIm1hcmsiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N5bmMsICAgICAgInN5bmMiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZzeW5jLCAgICAgImZzeW5jIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ppdCwgICAgICAgImppdCIgICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX21vZGVsLCAgICAgIm1vZGVsIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2NvdW50ZXIsICAgImNvdW50ZXIiICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2ZyYW1lLCAgICAgImZyYW1lIiAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0aXRjaCwgICAgInN0aXRjaCIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2hlYXAsICAgICAgImhlYXAiICAgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N0cnVjdHVyZSwgInN0cnVjdHVyZSIgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX3N1cHByZXNzLCAgInN1cHByZXNzIiAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX2FycmF5cywgICAgImFycmF5cyIgICAgfSwgXAorICAgICAgICB7IF9faXR0X2dyb3VwX25vbmUsICAgICAgTlVMTCAgICAgICAgfSAgXAorICAgIH0KKworI2VuZGlmIC8qIF9JVFROT1RJRllfVFlQRVNfSF8gKi8KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy90aGlyZHBhcnR5L2l0dG5vdGlmeS9sZWdhY3kvaXR0bm90aWZ5LmggYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVlYzJjMGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS9zcmMvdGhpcmRwYXJ0eS9pdHRub3RpZnkvbGVnYWN5L2l0dG5vdGlmeS5oCkBAIC0wLDAgKzEsOTcyIEBACisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKyNpZm5kZWYgX0xFR0FDWV9JVFROT1RJRllfSF8KKyNkZWZpbmUgX0xFR0FDWV9JVFROT1RJRllfSF8KKworLyoqCisgKiBAZmlsZQorICogQGJyaWVmIExlZ2FjeSBVc2VyIEFQSSBmdW5jdGlvbnMgYW5kIHR5cGVzCisgKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElUVF9PU19XSU4KKyMgIGRlZmluZSBJVFRfT1NfV0lOICAgMQorI2VuZGlmIC8qIElUVF9PU19XSU4gKi8KKworI2lmbmRlZiBJVFRfT1NfTElOVVgKKyMgIGRlZmluZSBJVFRfT1NfTElOVVggMgorI2VuZGlmIC8qIElUVF9PU19MSU5VWCAqLworCisjaWZuZGVmIElUVF9PU19NQUMKKyMgIGRlZmluZSBJVFRfT1NfTUFDICAgMworI2VuZGlmIC8qIElUVF9PU19NQUMgKi8KKworI2lmbmRlZiBJVFRfT1MKKyMgIGlmIGRlZmluZWQgV0lOMzIgfHwgZGVmaW5lZCBfV0lOMzIKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfV0lOCisjICBlbGlmIGRlZmluZWQoIF9fQVBQTEVfXyApICYmIGRlZmluZWQoIF9fTUFDSF9fICkKKyMgICAgZGVmaW5lIElUVF9PUyBJVFRfT1NfTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfT1MgSVRUX09TX0xJTlVYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9PUyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STV9XSU4KKyMgIGRlZmluZSBJVFRfUExBVEZPUk1fV0lOIDEKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fV0lOICovCisKKyNpZm5kZWYgSVRUX1BMQVRGT1JNX1BPU0lYCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX1BPU0lYIDIKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk1fUE9TSVggKi8KKworI2lmbmRlZiBJVFRfUExBVEZPUk1fTUFDCisjICBkZWZpbmUgSVRUX1BMQVRGT1JNX01BQyAzCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNX01BQyAqLworCisjaWZuZGVmIElUVF9QTEFURk9STQorIyAgaWYgSVRUX09TPT1JVFRfT1NfV0lOCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1dJTgorIyAgZWxpZiBJVFRfT1M9PUlUVF9PU19NQUMKKyMgICAgZGVmaW5lIElUVF9QTEFURk9STSBJVFRfUExBVEZPUk1fTUFDCisjICBlbHNlCisjICAgIGRlZmluZSBJVFRfUExBVEZPUk0gSVRUX1BMQVRGT1JNX1BPU0lYCisjICBlbmRpZgorI2VuZGlmIC8qIElUVF9QTEFURk9STSAqLworCisjaWYgZGVmaW5lZChfVU5JQ09ERSkgJiYgIWRlZmluZWQoVU5JQ09ERSkKKyNkZWZpbmUgVU5JQ09ERQorI2VuZGlmCisKKyNpbmNsdWRlIDxzdGRkZWYuaD4KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNpbmNsdWRlIDx0Y2hhci5oPgorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2luY2x1ZGUgPHN0ZGludC5oPgorI2lmIGRlZmluZWQoVU5JQ09ERSkgfHwgZGVmaW5lZChfVU5JQ09ERSkKKyNpbmNsdWRlIDx3Y2hhci5oPgorI2VuZGlmIC8qIFVOSUNPREUgfHwgX1VOSUNPREUgKi8KKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworI2lmbmRlZiBDREVDTAorIyAgaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjICAgIGRlZmluZSBDREVDTCBfX2NkZWNsCisjICBlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworIyAgICBpZiBkZWZpbmVkIF9NX0lYODYgfHwgZGVmaW5lZCBfX2kzODZfXworIyAgICAgIGRlZmluZSBDREVDTCBfX2F0dHJpYnV0ZV9fICgoY2RlY2wpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIENERUNMIC8qIGFjdHVhbCBvbmx5IG9uIHg4NiBwbGF0Zm9ybSAqLworIyAgICBlbmRpZiAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICBlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBDREVDTCAqLworCisjaWZuZGVmIFNURENBTEwKKyMgIGlmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorIyAgICBkZWZpbmUgU1REQ0FMTCBfX3N0ZGNhbGwKKyMgIGVsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjICAgIGlmIGRlZmluZWQgX01fSVg4NiB8fCBkZWZpbmVkIF9faTM4Nl9fCisjICAgICAgZGVmaW5lIFNURENBTEwgX19hdHRyaWJ1dGVfXyAoKHN0ZGNhbGwpKQorIyAgICBlbHNlICAvKiBfTV9JWDg2IHx8IF9faTM4Nl9fICovCisjICAgICAgZGVmaW5lIFNURENBTEwgLyogc3VwcG9ydGVkIG9ubHkgb24geDg2IHBsYXRmb3JtICovCisjICAgIGVuZGlmIC8qIF9NX0lYODYgfHwgX19pMzg2X18gKi8KKyMgIGVuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIFNURENBTEwgKi8KKworI2RlZmluZSBJVFRBUEkgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJIENERUNMCisKKy8qIFRPRE86IFRlbXBvcmFyeSBmb3IgY29tcGF0aWJpbGl0eSEgKi8KKyNkZWZpbmUgSVRUQVBJX0NBTEwgICAgQ0RFQ0wKKyNkZWZpbmUgTElCSVRUQVBJX0NBTEwgQ0RFQ0wKKworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorLyogdXNlIF9fZm9yY2VpbmxpbmUgKFZDKysgc3BlY2lmaWMpICovCisjZGVmaW5lIElUVF9JTkxJTkUgICAgICAgICAgIF9fZm9yY2VpbmxpbmUKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgLyogbm90aGluZyAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoKKyAqIEdlbmVyYWxseSwgZnVuY3Rpb25zIGFyZSBub3QgaW5saW5lZCB1bmxlc3Mgb3B0aW1pemF0aW9uIGlzIHNwZWNpZmllZC4KKyAqIEZvciBmdW5jdGlvbnMgZGVjbGFyZWQgaW5saW5lLCB0aGlzIGF0dHJpYnV0ZSBpbmxpbmVzIHRoZSBmdW5jdGlvbiBldmVuCisgKiBpZiBubyBvcHRpbWl6YXRpb24gbGV2ZWwgd2FzIHNwZWNpZmllZC4KKyAqLworI2lmZGVmIF9fU1RSSUNUX0FOU0lfXworI2RlZmluZSBJVFRfSU5MSU5FICAgICAgICAgICBzdGF0aWMKKyNkZWZpbmUgSVRUX0lOTElORV9BVFRSSUJVVEUgX19hdHRyaWJ1dGVfXygodW51c2VkKSkKKyNlbHNlICAvKiBfX1NUUklDVF9BTlNJX18gKi8KKyNkZWZpbmUgSVRUX0lOTElORSAgICAgICAgICAgc3RhdGljIGlubGluZQorI2RlZmluZSBJVFRfSU5MSU5FX0FUVFJJQlVURSBfX2F0dHJpYnV0ZV9fKChhbHdheXNfaW5saW5lLCB1bnVzZWQpKQorI2VuZGlmIC8qIF9fU1RSSUNUX0FOU0lfXyAqLworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworLyogSGVscGVyIG1hY3JvIGZvciBqb2luaW5nIHRva2VucyAqLworI2RlZmluZSBJVFRfSk9JTl9BVVgocCxuKSBwIyNuCisjZGVmaW5lIElUVF9KT0lOKHAsbikgICAgIElUVF9KT0lOX0FVWChwLG4pCisKKyNpZmRlZiBJVFRfTUFKT1IKKyN1bmRlZiBJVFRfTUFKT1IKKyNlbmRpZgorI2lmZGVmIElUVF9NSU5PUgorI3VuZGVmIElUVF9NSU5PUgorI2VuZGlmCisjZGVmaW5lIElUVF9NQUpPUiAgICAgMworI2RlZmluZSBJVFRfTUlOT1IgICAgIDAKKworLyogU3RhbmRhcmQgdmVyc2lvbmluZyBvZiBhIHRva2VuIHdpdGggbWFqb3IgYW5kIG1pbm9yIHZlcnNpb24gbnVtYmVycyAqLworI2RlZmluZSBJVFRfVkVSU0lPTklaRSh4KSAgICBcCisgICAgSVRUX0pPSU4oeCwgICAgICAgICAgICAgIFwKKyAgICBJVFRfSk9JTihfLCAgICAgICAgICAgICAgXAorICAgIElUVF9KT0lOKElUVF9NQUpPUiwgICAgICBcCisgICAgSVRUX0pPSU4oXywgSVRUX01JTk9SKSkpKQorCisjaWZuZGVmIElOVEVMX0lUVE5PVElGWV9QUkVGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUFJFRklYIF9faXR0XworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QUkVGSVggKi8KKyNpZm5kZWYgSU5URUxfSVRUTk9USUZZX1BPU1RGSVgKKyMgIGRlZmluZSBJTlRFTF9JVFROT1RJRllfUE9TVEZJWCBfcHRyXworI2VuZGlmIC8qIElOVEVMX0lUVE5PVElGWV9QT1NURklYICovCisKKyNkZWZpbmUgSVRUTk9USUZZX05BTUVfQVVYKG4pIElUVF9KT0lOKElOVEVMX0lUVE5PVElGWV9QUkVGSVgsbikKKyNkZWZpbmUgSVRUTk9USUZZX05BTUUobikgICAgIElUVF9WRVJTSU9OSVpFKElUVE5PVElGWV9OQU1FX0FVWChJVFRfSk9JTihuLElOVEVMX0lUVE5PVElGWV9QT1NURklYKSkpCisKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSUQobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEEobikgKCFJVFROT1RJRllfTkFNRShuKSkgPyAgICAgICAwIDogSVRUTk9USUZZX05BTUUobikKKworI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMChuLGQpICAgICAgICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDEobixkLHgpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDIobixkLHgseSkgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5KQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9EMyhuLGQseCx5LHopICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseikKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDQobixkLHgseSx6LGEpICAgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSkKKyNkZWZpbmUgSVRUTk9USUZZX1ZPSURfRDUobixkLHgseSx6LGEsYikgICAoIShkKS0+ZmxhZ3MpID8gKHZvaWQpMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gKHZvaWQpMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiKQorI2RlZmluZSBJVFROT1RJRllfVk9JRF9ENihuLGQseCx5LHosYSxiLGMpICghKGQpLT5mbGFncykgPyAodm9pZCkwIDogKCFJVFROT1RJRllfTkFNRShuKSkgPyAodm9pZCkwIDogSVRUTk9USUZZX05BTUUobikoZCx4LHkseixhLGIsYykKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDAobixkKSAgICAgICAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QxKG4sZCx4KSAgICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0QyKG4sZCx4LHkpICAgKCEoZCktPmZsYWdzKSA/ICAgICAgIDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSkKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDMobixkLHgseSx6KSAoIShkKS0+ZmxhZ3MpID8gICAgICAgMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHopCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q0KG4sZCx4LHkseixhKSAgICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEpCisjZGVmaW5lIElUVE5PVElGWV9EQVRBX0Q1KG4sZCx4LHkseixhLGIpICAgKCEoZCktPmZsYWdzKSA/IDAgOiAoIUlUVE5PVElGWV9OQU1FKG4pKSA/ICAgICAgIDAgOiBJVFROT1RJRllfTkFNRShuKShkLHgseSx6LGEsYikKKyNkZWZpbmUgSVRUTk9USUZZX0RBVEFfRDYobixkLHgseSx6LGEsYixjKSAoIShkKS0+ZmxhZ3MpID8gMCA6ICghSVRUTk9USUZZX05BTUUobikpID8gICAgICAgMCA6IElUVE5PVElGWV9OQU1FKG4pKGQseCx5LHosYSxiLGMpCisKKyNpZmRlZiBJVFRfU1RVQgorI3VuZGVmIElUVF9TVFVCCisjZW5kaWYKKyNpZmRlZiBJVFRfU1RVQlYKKyN1bmRlZiBJVFRfU1RVQlYKKyNlbmRpZgorI2RlZmluZSBJVFRfU1RVQlYoYXBpLHR5cGUsbmFtZSxhcmdzKSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXAorICAgIHR5cGVkZWYgdHlwZSAoYXBpKiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkpIGFyZ3M7ICAgXAorICAgIGV4dGVybiBJVFRfSk9JTihJVFROT1RJRllfTkFNRShuYW1lKSxfdCkgSVRUTk9USUZZX05BTUUobmFtZSk7CisjZGVmaW5lIElUVF9TVFVCIElUVF9TVFVCVgorLyoqIEBlbmRjb25kICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworZXh0ZXJuICJDIiB7CisjZW5kaWYgLyogX19jcGx1c3BsdXMgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5IExlZ2FjeSBBUEkKKyAqIEB7CisgKiBAfQorICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9jb250cm9sIENvbGxlY3Rpb24gQ29udHJvbAorICogQGluZ3JvdXAgbGVnYWN5CisgKiBHZW5lcmFsIGJlaGF2aW9yOiBhcHBsaWNhdGlvbiBjb250aW51ZXMgdG8gcnVuLCBidXQgbm8gcHJvZmlsaW5nIGluZm9ybWF0aW9uIGlzIGJlaW5nIGNvbGxlY3RlZAorICoKKyAqIFBhdXNpbmcgb2NjdXJzIG5vdCBvbmx5IGZvciB0aGUgY3VycmVudCB0aHJlYWQgYnV0IGZvciBhbGwgcHJvY2VzcyBhcyB3ZWxsIGFzIHNwYXduZWQgcHJvY2Vzc2VzCisgKiAtIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFOgorICogICAtIERvZXMgbm90IGFuYWx5emUgb3IgcmVwb3J0IGVycm9ycyB0aGF0IGludm9sdmUgbWVtb3J5IGFjY2Vzcy4KKyAqICAgLSBPdGhlciBlcnJvcnMgYXJlIHJlcG9ydGVkIGFzIHVzdWFsLiBQYXVzaW5nIGRhdGEgY29sbGVjdGlvbiBpbgorICogICAgIEludGVsKFIpIFBhcmFsbGVsIEluc3BlY3RvciBhbmQgSW50ZWwoUikgSW5zcGVjdG9yIFhFCisgKiAgICAgb25seSBwYXVzZXMgdHJhY2luZyBhbmQgYW5hbHl6aW5nIG1lbW9yeSBhY2Nlc3MuCisgKiAgICAgSXQgZG9lcyBub3QgcGF1c2UgdHJhY2luZyBvciBhbmFseXppbmcgdGhyZWFkaW5nIEFQSXMuCisgKiAgIC4KKyAqIC0gSW50ZWwoUikgUGFyYWxsZWwgQW1wbGlmaWVyIGFuZCBJbnRlbChSKSBWVHVuZShUTSkgQW1wbGlmaWVyIFhFOgorICogICAtIERvZXMgY29udGludWUgdG8gcmVjb3JkIHdoZW4gbmV3IHRocmVhZHMgYXJlIHN0YXJ0ZWQuCisgKiAgIC4KKyAqIC0gT3RoZXIgZWZmZWN0czoKKyAqICAgLSBQb3NzaWJsZSByZWR1Y3Rpb24gb2YgcnVudGltZSBvdmVyaGVhZC4KKyAqICAgLgorICogQHsKKyAqLworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKiogQGJyaWVmIFBhdXNlIGNvbGxlY3Rpb24gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X3BhdXNlKHZvaWQpOworLyoqIEBicmllZiBSZXN1bWUgY29sbGVjdGlvbiAqLwordm9pZCBJVFRBUEkgX19pdHRfcmVzdW1lKHZvaWQpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBwYXVzZSwgICAodm9pZCkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCByZXN1bWUsICAodm9pZCkpCisjZGVmaW5lIF9faXR0X3BhdXNlICAgICAgSVRUTk9USUZZX1ZPSUQocGF1c2UpCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgSVRUTk9USUZZX05BTUUocGF1c2UpCisjZGVmaW5lIF9faXR0X3Jlc3VtZSAgICAgSVRUTk9USUZZX1ZPSUQocmVzdW1lKQorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIElUVE5PVElGWV9OQU1FKHJlc3VtZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3BhdXNlKCkKKyNkZWZpbmUgX19pdHRfcGF1c2VfcHRyICAwCisjZGVmaW5lIF9faXR0X3Jlc3VtZSgpCisjZGVmaW5lIF9faXR0X3Jlc3VtZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3BhdXNlX3B0ciAgMAorI2RlZmluZSBfX2l0dF9yZXN1bWVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKyNlbmRpZiAvKiBfSVRUTk9USUZZX0hfICovCisvKiogQH0gbGVnYWN5X2NvbnRyb2wgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3RocmVhZHMgVGhyZWFkcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBUaHJlYWRzIGdyb3VwCisgKiBAd2FybmluZyBMZWdhY3kgQVBJCisgKiBAeworICovCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBTZXQgbmFtZSB0byBiZSBhc3NvY2lhdGVkIHdpdGggdGhyZWFkIGluIGFuYWx5c2lzIEdVSS4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldEEoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pOworaW50IExJQklUVEFQSSBfX2l0dF90aHJfbmFtZV9zZXRXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0ICAgICBfX2l0dF90aHJfbmFtZV9zZXRXCisjICBkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBfX2l0dF90aHJfbmFtZV9zZXRXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIF9faXR0X3Rocl9uYW1lX3NldEEKKyMgIGRlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRfcHRyIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitpbnQgTElCSVRUQVBJIF9faXR0X3Rocl9uYW1lX3NldChjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCB0aHJfbmFtZV9zZXRBLCAoY29uc3QgY2hhciAgICAqbmFtZSwgaW50IG5hbWVsZW4pKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIHRocl9uYW1lX3NldFcsIChjb25zdCB3Y2hhcl90ICpuYW1lLCBpbnQgbmFtZWxlbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgdGhyX25hbWVfc2V0LCAgKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QSAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0QV9wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0QSkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyAgICAgSVRUTk9USUZZX0RBVEEodGhyX25hbWVfc2V0VykKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgSVRUTk9USUZZX05BTUUodGhyX25hbWVfc2V0VykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXQgICAgIElUVE5PVElGWV9EQVRBKHRocl9uYW1lX3NldCkKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0X3B0ciBJVFROT1RJRllfTkFNRSh0aHJfbmFtZV9zZXQpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRBKG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0VyhuYW1lLCBuYW1lbGVuKQorI2RlZmluZSBfX2l0dF90aHJfbmFtZV9zZXRXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0KG5hbWUsIG5hbWVsZW4pCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldEFfcHRyIDAKKyNkZWZpbmUgX19pdHRfdGhyX25hbWVfc2V0V19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3Rocl9uYW1lX3NldF9wdHIgMAorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBNYXJrIGN1cnJlbnQgdGhyZWFkIGFzIGlnbm9yZWQgZnJvbSB0aGlzIHBvaW50IG9uLCBmb3IgdGhlIGR1cmF0aW9uIG9mIGl0cyBleGlzdGVuY2UuCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X3Rocl9pZ25vcmUodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIHRocl9pZ25vcmUsICh2b2lkKSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZSAgICAgSVRUTk9USUZZX1ZPSUQodGhyX2lnbm9yZSkKKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgSVRUTk9USUZZX05BTUUodGhyX2lnbm9yZSkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3Rocl9pZ25vcmUoKQorI2RlZmluZSBfX2l0dF90aHJfaWdub3JlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX2lnbm9yZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV90aHJlYWRzIGdyb3VwICovCisKKy8qKgorICogQGRlZmdyb3VwIGxlZ2FjeV9zeW5jIFN5bmNocm9uaXphdGlvbgorICogQGluZ3JvdXAgbGVnYWN5CisgKiBTeW5jaHJvbml6YXRpb24gZ3JvdXAKKyAqIEB3YXJuaW5nIExlZ2FjeSBBUEkKKyAqIEB7CisgKi8KKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfYmFycmllciAxCisKKy8qKgorICogQGhpZGVpbml0aWFsaXplcgorICogQGJyaWVmIHBvc3NpYmxlIHZhbHVlIG9mIGF0dHJpYnV0ZSBhcmd1bWVudCBmb3Igc3luYyBvYmplY3QgdHlwZQorICovCisjZGVmaW5lIF9faXR0X2F0dHJfbXV0ZXggICAyCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgICAgLSBwb2ludGVyIHRvIHRoZSBzeW5jIG9iamVjdC4gWW91IHNob3VsZCB1c2UgYSByZWFsIHBvaW50ZXIgdG8geW91ciBvYmplY3QKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIG1ha2Ugc3VyZSB0aGF0IHRoZSB2YWx1ZXMgZG9uJ3QgY2xhc2ggd2l0aCBvdGhlciBvYmplY3QgYWRkcmVzc2VzCisgKiBAcGFyYW1baW5dIG9ianR5cGUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICBiZSBhc3N1bWVkIHRvIGJlIG9mIGdlbmVyaWMgIlVzZXIgU3luY2hyb25pemF0aW9uIiB0eXBlCisgKiBAcGFyYW1baW5dIG9iam5hbWUgLSBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IG5hbWUgc3RyaW5nLiBJZiBOVUxMLCBubyBuYW1lIHdpbGwgYmUgYXNzaWduZWQKKyAqICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICB0aGUgbmFtZQorICogQHBhcmFtW2luXSBhdHRyaWJ1dGUgLSBvbmUgb2YgWyNfX2l0dF9hdHRyX2JhcnJpZXIsICNfX2l0dF9hdHRyX211dGV4XSB2YWx1ZXMgd2hpY2ggZGVmaW5lcyB0aGUKKyAqICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZUEodm9pZCAqYWRkciwgY29uc3QgY2hhciAgICAqb2JqdHlwZSwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSk7Cit2b2lkIElUVEFQSSBfX2l0dF9zeW5jX3NldF9uYW1lVyh2b2lkICphZGRyLCBjb25zdCB3Y2hhcl90ICpvYmp0eXBlLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgX19pdHRfc3luY19zZXRfbmFtZVcKKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lICAgICBfX2l0dF9zeW5jX3NldF9uYW1lQQorIyAgZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVfcHRyIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0cgorI2VuZGlmIC8qIFVOSUNPREUgKi8KKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLwordm9pZCBJVFRBUEkgX19pdHRfc3luY19zZXRfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyKiBvYmp0eXBlLCBjb25zdCBjaGFyKiBvYmpuYW1lLCBpbnQgYXR0cmlidXRlKTsKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgc3luY19zZXRfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgYXR0cmlidXRlKSkKK0lUVF9TVFVCVihJVFRBUEksIHZvaWQsIHN5bmNfc2V0X25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgY29uc3Qgd2NoYXJfdCAqb2JqbmFtZSwgaW50IGF0dHJpYnV0ZSkpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBzeW5jX3NldF9uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGNvbnN0IGNoYXIgICAgKm9iam5hbWUsIGludCBhdHRyaWJ1dGUpKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lQSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZUEpCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBX3B0ciBJVFROT1RJRllfTkFNRShzeW5jX3NldF9uYW1lQSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcgICAgIElUVE5PVElGWV9WT0lEKHN5bmNfc2V0X25hbWVXKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZVcpCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZSAgICAgSVRUTk9USUZZX1ZPSUQoc3luY19zZXRfbmFtZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZV9wdHIgSVRUTk9USUZZX05BTUUoc3luY19zZXRfbmFtZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWVBKGFkZHIsIG9ianR5cGUsIG9iam5hbWUsIGF0dHJpYnV0ZSkKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVcoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X3N5bmNfc2V0X25hbWUoYWRkciwgb2JqdHlwZSwgb2JqbmFtZSwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZUFfcHRyIDAKKyNkZWZpbmUgX19pdHRfc3luY19zZXRfbmFtZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9zeW5jX3NldF9uYW1lX3B0ciAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEFzc2lnbiBhIG5hbWUgYW5kIHR5cGUgdG8gYSBzeW5jIG9iamVjdCB1c2luZyBjaGFyIG9yIFVuaWNvZGUgc3RyaW5nCisgKiBAcGFyYW1baW5dIGFkZHIgLSAgICAgIHBvaW50ZXIgdG8gdGhlIHN5bmMgb2JqZWN0LiBZb3Ugc2hvdWxkIHVzZSBhIHJlYWwgcG9pbnRlciB0byB5b3VyIG9iamVjdAorICogICAgICAgICAgICAgICAgICAgICAgICB0byBtYWtlIHN1cmUgdGhhdCB0aGUgdmFsdWVzIGRvbid0IGNsYXNoIHdpdGggb3RoZXIgb2JqZWN0IGFkZHJlc3NlcworICogQHBhcmFtW2luXSBvYmp0eXBlIC0gICBudWxsLXRlcm1pbmF0ZWQgb2JqZWN0IHR5cGUgc3RyaW5nLiBJZiBOVUxMIGlzIHBhc3NlZCwgdGhlIG9iamVjdCB3aWxsCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGJlIGFzc3VtZWQgdG8gYmUgb2YgZ2VuZXJpYyAiVXNlciBTeW5jaHJvbml6YXRpb24iIHR5cGUKKyAqIEBwYXJhbVtpbl0gb2JqbmFtZSAtICAgbnVsbC10ZXJtaW5hdGVkIG9iamVjdCBuYW1lIHN0cmluZy4gSWYgTlVMTCwgbm8gbmFtZSB3aWxsIGJlIGFzc2lnbmVkCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRvIHRoZSBvYmplY3QgLS0geW91IGNhbiB1c2UgdGhlIF9faXR0X3N5bmNfcmVuYW1lIGNhbGwgbGF0ZXIgdG8gYXNzaWduCisgKiAgICAgICAgICAgICAgICAgICAgICAgIHRoZSBuYW1lCisgKiBAcGFyYW1baW5dIHR5cGVsZW4sIG5hbWVsZW4gLSAgIGEgbGVuZ3RoIG9mIHN0cmluZyBmb3IgYXBwcm9wcmlhdGUgb2JqdHlwZSBhbmQgb2JqbmFtZSBwYXJhbWV0ZXIKKyAqIEBwYXJhbVtpbl0gYXR0cmlidXRlIC0gb25lIG9mIFsjX19pdHRfYXR0cl9iYXJyaWVyLCAjX19pdHRfYXR0cl9tdXRleF0gdmFsdWVzIHdoaWNoIGRlZmluZXMgdGhlCisgKiAgICAgICAgICAgICAgICAgICAgICAgIGV4YWN0IHNlbWFudGljcyBvZiBob3cgcHJlcGFyZS9hY3F1aXJlZC9yZWxlYXNpbmcgY2FsbHMgd29yay4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAobmFtZSBvciBuYW1lbGVuIGJlaW5nIG51bGwsbmFtZSBhbmQgbmFtZWxlbiBtaXNtYXRjaGVkKQorICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVBKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CitpbnQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX25hbWVXKHZvaWQgKmFkZHIsIGNvbnN0IHdjaGFyX3QgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCB3Y2hhcl90ICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSk7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZVcKKyNlbHNlCisjICBkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQQorI2VuZGlmCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfbm90aWZ5X3N5bmNfbmFtZSh2b2lkICphZGRyLCBjb25zdCBjaGFyICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpOworI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCitJVFRfU1RVQihMSUJJVFRBUEksIGludCwgbm90aWZ5X3N5bmNfbmFtZUEsICh2b2lkICphZGRyLCBjb25zdCBjaGFyICAgICpvYmp0eXBlLCBpbnQgdHlwZWxlbiwgY29uc3QgY2hhciAgICAqb2JqbmFtZSwgaW50IG5hbWVsZW4sIGludCBhdHRyaWJ1dGUpKQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIG5vdGlmeV9zeW5jX25hbWVXLCAodm9pZCAqYWRkciwgY29uc3Qgd2NoYXJfdCAqb2JqdHlwZSwgaW50IHR5cGVsZW4sIGNvbnN0IHdjaGFyX3QgKm9iam5hbWUsIGludCBuYW1lbGVuLCBpbnQgYXR0cmlidXRlKSkKKyNlbHNlICAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBub3RpZnlfc3luY19uYW1lLCAgKHZvaWQgKmFkZHIsIGNvbnN0IGNoYXIgICAgKm9ianR5cGUsIGludCB0eXBlbGVuLCBjb25zdCBjaGFyICAgICpvYmpuYW1lLCBpbnQgbmFtZWxlbiwgaW50IGF0dHJpYnV0ZSkpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVBICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lQSkKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUFfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX25hbWVBKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyAgICAgSVRUTk9USUZZX0RBVEEobm90aWZ5X3N5bmNfbmFtZVcpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lICAgICBJVFROT1RJRllfREFUQShub3RpZnlfc3luY19uYW1lKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19uYW1lKQorI2VuZGlmIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZUEoYWRkciwgb2JqdHlwZSwgdHlwZWxlbiwgb2JqbmFtZSwgbmFtZWxlbiwgYXR0cmlidXRlKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lVyhhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVXX3B0ciAwCisjZWxzZSAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfbmFtZShhZGRyLCBvYmp0eXBlLCB0eXBlbGVuLCBvYmpuYW1lLCBuYW1lbGVuLCBhdHRyaWJ1dGUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19uYW1lV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX25hbWVfcHRyIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgRW50ZXIgc3BpbiBsb29wIG9uIHVzZXItZGVmaW5lZCBzeW5jIG9iamVjdAorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKHZvaWQqIGFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19wcmVwYXJlLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmUgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX3ByZXBhcmUpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX3ByZXBhcmVfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19wcmVwYXJlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIFF1aXQgc3BpbiBsb29wIHdpdGhvdXQgYWNxdWlyaW5nIHNwaW4gb2JqZWN0CisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCh2b2lkICphZGRyKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKExJQklUVEFQSSwgdm9pZCwgbm90aWZ5X3N5bmNfY2FuY2VsLCAodm9pZCAqYWRkcikpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfY2FuY2VsKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIElUVE5PVElGWV9OQU1FKG5vdGlmeV9zeW5jX2NhbmNlbCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2NhbmNlbChhZGRyKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19jYW5jZWxfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3VjY2Vzc2Z1bCBzcGluIGxvb3AgY29tcGxldGlvbiAoc3luYyBvYmplY3QgYWNxdWlyZWQpCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKHZvaWQgKmFkZHIpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBub3RpZnlfc3luY19hY3F1aXJlZCwgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19hY3F1aXJlZCAgICAgSVRUTk9USUZZX1ZPSUQobm90aWZ5X3N5bmNfYWNxdWlyZWQpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19hY3F1aXJlZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkKGFkZHIpCisjZGVmaW5lIF9faXR0X25vdGlmeV9zeW5jX2FjcXVpcmVkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfYWNxdWlyZWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgU3RhcnQgc3luYyBvYmplY3QgcmVsZWFzaW5nIGNvZGUuIElzIGNhbGxlZCBiZWZvcmUgdGhlIGxvY2sgcmVsZWFzZSBjYWxsLgorICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcodm9pZCogYWRkcik7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG5vdGlmeV9zeW5jX3JlbGVhc2luZywgKHZvaWQgKmFkZHIpKQorI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcgICAgIElUVE5PVElGWV9WT0lEKG5vdGlmeV9zeW5jX3JlbGVhc2luZykKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciBJVFROT1RJRllfTkFNRShub3RpZnlfc3luY19yZWxlYXNpbmcpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ub3RpZnlfc3luY19yZWxlYXNpbmcoYWRkcikKKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbm90aWZ5X3N5bmNfcmVsZWFzaW5nX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X3N5bmMgZ3JvdXAgKi8KKworI2lmbmRlZiBfSVRUTk9USUZZX0hfCisvKioKKyAqIEBkZWZncm91cCBsZWdhY3lfZXZlbnRzIEV2ZW50cworICogQGluZ3JvdXAgbGVnYWN5CisgKiBFdmVudHMgZ3JvdXAKKyAqIEB7CisgKi8KKworLyoqIEBicmllZiB1c2VyIGV2ZW50IHR5cGUgKi8KK3R5cGVkZWYgaW50IF9faXR0X2V2ZW50OworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYW4gZXZlbnQgbm90aWZpY2F0aW9uCisgKiBAbm90ZSBuYW1lIG9yIG5hbWVsZW4gYmVpbmcgbnVsbC9uYW1lIGFuZCBuYW1lbGVuIG5vdCBtYXRjaGluZywgdXNlciBldmVudCBmZWF0dXJlIG5vdCBlbmFibGVkCisgKiBAcmV0dXJuIG5vbi16ZXJvIGV2ZW50IGlkZW50aWZpZXIgdXBvbiBzdWNjZXNzIGFuZCBfX2l0dF9lcnIgb3RoZXJ3aXNlCisgKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVBKGNvbnN0IGNoYXIgICAgKm5hbWUsIGludCBuYW1lbGVuKTsKK19faXR0X2V2ZW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKm5hbWUsIGludCBuYW1lbGVuKTsKKyNpZiBkZWZpbmVkKFVOSUNPREUpIHx8IGRlZmluZWQoX1VOSUNPREUpCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlICAgICBfX2l0dF9ldmVudF9jcmVhdGVXCisjICBkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlX3B0ciBfX2l0dF9ldmVudF9jcmVhdGVXX3B0cgorI2Vsc2UKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgIF9faXR0X2V2ZW50X2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyIF9faXR0X2V2ZW50X2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworX19pdHRfZXZlbnQgTElCSVRUQVBJIF9faXR0X2V2ZW50X2NyZWF0ZShjb25zdCBjaGFyICpuYW1lLCBpbnQgbmFtZWxlbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKExJQklUVEFQSSwgX19pdHRfZXZlbnQsIGV2ZW50X2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpuYW1lLCBpbnQgbmFtZWxlbikpCitJVFRfU1RVQihMSUJJVFRBUEksIF9faXR0X2V2ZW50LCBldmVudF9jcmVhdGVXLCAoY29uc3Qgd2NoYXJfdCAqbmFtZSwgaW50IG5hbWVsZW4pKQorI2Vsc2UgIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworSVRUX1NUVUIoTElCSVRUQVBJLCBfX2l0dF9ldmVudCwgZXZlbnRfY3JlYXRlLCAgKGNvbnN0IGNoYXIgKm5hbWUsIGludCBuYW1lbGVuKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZXZlbnRfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUgICAgICBJVFROT1RJRllfREFUQShldmVudF9jcmVhdGUpCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIElUVE5PVElGWV9OQU1FKGV2ZW50X2NyZWF0ZSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjaWYgSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZUEobmFtZSwgbmFtZWxlbikgKF9faXR0X2V2ZW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVXKG5hbWUsIG5hbWVsZW4pIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGUobmFtZSwgbmFtZWxlbikgIChfX2l0dF9ldmVudCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2V2ZW50X2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9ldmVudF9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGJyaWVmIFJlY29yZCBhbiBldmVudCBvY2N1cnJlbmNlLgorICogQHJldHVybiBfX2l0dF9lcnIgdXBvbiBmYWlsdXJlIChpbnZhbGlkIGV2ZW50IGlkL3VzZXIgZXZlbnQgZmVhdHVyZSBub3QgZW5hYmxlZCkKKyAqLworaW50IExJQklUVEFQSSBfX2l0dF9ldmVudF9zdGFydChfX2l0dF9ldmVudCBldmVudCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKExJQklUVEFQSSwgaW50LCBldmVudF9zdGFydCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnQgICAgIElUVE5PVElGWV9EQVRBKGV2ZW50X3N0YXJ0KQorI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfc3RhcnQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9ldmVudF9zdGFydChldmVudCkgKGludCkwCisjZGVmaW5lIF9faXR0X2V2ZW50X3N0YXJ0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfc3RhcnRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAYnJpZWYgUmVjb3JkIGFuIGV2ZW50IGVuZCBvY2N1cnJlbmNlLgorICogQG5vdGUgSXQgaXMgb3B0aW9uYWwgaWYgZXZlbnRzIGRvIG5vdCBoYXZlIGR1cmF0aW9ucy4KKyAqIEByZXR1cm4gX19pdHRfZXJyIHVwb24gZmFpbHVyZSAoaW52YWxpZCBldmVudCBpZC91c2VyIGV2ZW50IGZlYXR1cmUgbm90IGVuYWJsZWQpCisgKi8KK2ludCBMSUJJVFRBUEkgX19pdHRfZXZlbnRfZW5kKF9faXR0X2V2ZW50IGV2ZW50KTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoTElCSVRUQVBJLCBpbnQsIGV2ZW50X2VuZCwgKF9faXR0X2V2ZW50IGV2ZW50KSkKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kICAgICBJVFROT1RJRllfREFUQShldmVudF9lbmQpCisjZGVmaW5lIF9faXR0X2V2ZW50X2VuZF9wdHIgSVRUTk9USUZZX05BTUUoZXZlbnRfZW5kKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kKGV2ZW50KSAoaW50KTAKKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfZXZlbnRfZW5kX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gbGVnYWN5X2V2ZW50cyBncm91cCAqLworI2VuZGlmIC8qIF9JVFROT1RJRllfSF8gKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X21lbW9yeSBNZW1vcnkgQWNjZXNzZXMKKyAqIEBpbmdyb3VwIGxlZ2FjeQorICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIEluZm9ybSB0aGUgdG9vbCBvZiBtZW1vcnkgYWNjZXNzZXMgb24gcmVhZGluZworICovCit2b2lkIExJQklUVEFQSSBfX2l0dF9tZW1vcnlfcmVhZCh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV9yZWFkLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfcmVhZCAgICAgSVRUTk9USUZZX1ZPSUQobWVtb3J5X3JlYWQpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfcmVhZCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV9yZWFkX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3JlYWRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKworLyoqCisgKiBAZGVwcmVjYXRlZCBMZWdhY3kgQVBJCisgKiBAYnJpZWYgSW5mb3JtIHRoZSB0b29sIG9mIG1lbW9yeSBhY2Nlc3NlcyBvbiB3cml0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV93cml0ZSh2b2lkICphZGRyLCBzaXplX3Qgc2l6ZSk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCVihMSUJJVFRBUEksIHZvaWQsIG1lbW9yeV93cml0ZSwgKHZvaWQgKmFkZHIsIHNpemVfdCBzaXplKSkKKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfd3JpdGUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgSVRUTk9USUZZX05BTUUobWVtb3J5X3dyaXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3dyaXRlKGFkZHIsIHNpemUpCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X21lbW9yeV93cml0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBJbmZvcm0gdGhlIHRvb2wgb2YgbWVtb3J5IGFjY2Vzc2VzIG9uIHVwZGF0aW5nCisgKi8KK3ZvaWQgTElCSVRUQVBJIF9faXR0X21lbW9yeV91cGRhdGUodm9pZCAqYWRkcmVzcywgc2l6ZV90IHNpemUpOworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KKyNpZm5kZWYgSU5URUxfTk9fTUFDUk9fQk9EWQorI2lmbmRlZiBJTlRFTF9OT19JVFROT1RJRllfQVBJCitJVFRfU1RVQlYoTElCSVRUQVBJLCB2b2lkLCBtZW1vcnlfdXBkYXRlLCAodm9pZCAqYWRkciwgc2l6ZV90IHNpemUpKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlICAgICBJVFROT1RJRllfVk9JRChtZW1vcnlfdXBkYXRlKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciBJVFROT1RJRllfTkFNRShtZW1vcnlfdXBkYXRlKQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZShhZGRyLCBzaXplKQorI2RlZmluZSBfX2l0dF9tZW1vcnlfdXBkYXRlX3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfbWVtb3J5X3VwZGF0ZV9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworLyoqIEB9IGxlZ2FjeV9tZW1vcnkgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgbGVnYWN5X3N0YXRlIFRocmVhZCBhbmQgT2JqZWN0IFN0YXRlcworICogQGluZ3JvdXAgbGVnYWN5CisgKi8KKworLyoqIEBicmllZiBzdGF0ZSB0eXBlICovCit0eXBlZGVmIGludCBfX2l0dF9zdGF0ZV90OworCisvKiogQGNvbmQgZXhjbHVkZV9mcm9tX2RvY3VtZW50YXRpb24gKi8KK3R5cGVkZWYgZW51bSBfX2l0dF9vYmpfc3RhdGUgeworICAgIF9faXR0X29ial9zdGF0ZV9lcnIgPSAwLAorICAgIF9faXR0X29ial9zdGF0ZV9jbHIgPSAxLAorICAgIF9faXR0X29ial9zdGF0ZV9zZXQgPSAyLAorICAgIF9faXR0X29ial9zdGF0ZV91c2UgPSAzCit9IF9faXR0X29ial9zdGF0ZV90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3N0YXRlIHsKKyAgICBfX2l0dF90aHJfc3RhdGVfZXJyID0gMCwKKyAgICBfX2l0dF90aHJfc3RhdGVfY2xyID0gMSwKKyAgICBfX2l0dF90aHJfc3RhdGVfc2V0ID0gMgorfSBfX2l0dF90aHJfc3RhdGVfdDsKKwordHlwZWRlZiBlbnVtIF9faXR0X29ial9wcm9wIHsKKyAgICBfX2l0dF9vYmpfcHJvcF93YXRjaCAgICA9IDEsCisgICAgX19pdHRfb2JqX3Byb3BfaWdub3JlICAgPSAyLAorICAgIF9faXR0X29ial9wcm9wX3NoYXJhYmxlID0gMworfSBfX2l0dF9vYmpfcHJvcF90OworCit0eXBlZGVmIGVudW0gX19pdHRfdGhyX3Byb3AgeworICAgIF9faXR0X3Rocl9wcm9wX3F1aWV0ID0gMQorfSBfX2l0dF90aHJfcHJvcF90OworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IHN0YXRlcworICovCitfX2l0dF9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF9zdGF0ZV9nZXQodm9pZCk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfZ2V0LCAodm9pZCkpCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCAgICAgSVRUTk9USUZZX0RBVEEoc3RhdGVfZ2V0KQorI2RlZmluZSBfX2l0dF9zdGF0ZV9nZXRfcHRyIElUVE5PVElGWV9OQU1FKHN0YXRlX2dldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldCh2b2lkKSAoX19pdHRfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3N0YXRlX2dldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBzdGF0ZXMKKyAqLworX19pdHRfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfc3RhdGVfc2V0KF9faXR0X3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfc3RhdGVfdCwgc3RhdGVfc2V0LCAoX19pdHRfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0ICAgICBJVFROT1RJRllfREFUQShzdGF0ZV9zZXQpCisjZGVmaW5lIF9faXR0X3N0YXRlX3NldF9wdHIgSVRUTk9USUZZX05BTUUoc3RhdGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0KHMpIChfX2l0dF9zdGF0ZV90KTAKKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2Vsc2UgIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKyNkZWZpbmUgX19pdHRfc3RhdGVfc2V0X3B0ciAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKgorICogQGRlcHJlY2F0ZWQgTGVnYWN5IEFQSQorICogQGJyaWVmIG1hbmFnaW5nIHRocmVhZCBhbmQgb2JqZWN0IG1vZGVzCisgKi8KK19faXR0X3Rocl9zdGF0ZV90IExJQklUVEFQSSBfX2l0dF90aHJfbW9kZV9zZXQoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF90aHJfc3RhdGVfdCwgdGhyX21vZGVfc2V0LCAoX19pdHRfdGhyX3Byb3BfdCBwLCBfX2l0dF90aHJfc3RhdGVfdCBzKSkKKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0ICAgICBJVFROT1RJRllfREFUQSh0aHJfbW9kZV9zZXQpCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgSVRUTk9USUZZX05BTUUodGhyX21vZGVfc2V0KQorI2Vsc2UgIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNkZWZpbmUgX19pdHRfdGhyX21vZGVfc2V0KHAsIHMpIChfX2l0dF90aHJfc3RhdGVfdCkwCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X3Rocl9tb2RlX3NldF9wdHIgMAorI2VuZGlmIC8qIElOVEVMX05PX01BQ1JPX0JPRFkgKi8KKy8qKiBAZW5kY29uZCAqLworCisvKioKKyAqIEBkZXByZWNhdGVkIExlZ2FjeSBBUEkKKyAqIEBicmllZiBtYW5hZ2luZyB0aHJlYWQgYW5kIG9iamVjdCBtb2RlcworICovCitfX2l0dF9vYmpfc3RhdGVfdCBMSUJJVFRBUEkgX19pdHRfb2JqX21vZGVfc2V0KF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3Qgcyk7CisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfb2JqX3N0YXRlX3QsIG9ial9tb2RlX3NldCwgKF9faXR0X29ial9wcm9wX3QgcCwgX19pdHRfb2JqX3N0YXRlX3QgcykpCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldCAgICAgSVRUTk9USUZZX0RBVEEob2JqX21vZGVfc2V0KQorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIElUVE5PVElGWV9OQU1FKG9ial9tb2RlX3NldCkKKyNlbHNlICAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZGVmaW5lIF9faXR0X29ial9tb2RlX3NldChwLCBzKSAoX19pdHRfb2JqX3N0YXRlX3QpMAorI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2RlZmluZSBfX2l0dF9vYmpfbW9kZV9zZXRfcHRyIDAKKyNlbmRpZiAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisvKiogQGVuZGNvbmQgKi8KKy8qKiBAfSBsZWdhY3lfc3RhdGUgZ3JvdXAgKi8KKworLyoqCisgKiBAZGVmZ3JvdXAgZnJhbWVzIEZyYW1lcworICogQGluZ3JvdXAgbGVnYWN5CisgKiBGcmFtZXMgZ3JvdXAKKyAqIEB7CisgKi8KKy8qKgorICogQGJyaWVmIG9wYXF1ZSBzdHJ1Y3R1cmUgZm9yIGZyYW1lIGlkZW50aWZpY2F0aW9uCisgKi8KK3R5cGVkZWYgc3RydWN0IF9faXR0X2ZyYW1lX3QgKl9faXR0X2ZyYW1lOworCisvKioKKyAqIEBicmllZiBDcmVhdGUgYSBnbG9iYWwgZnJhbWUgd2l0aCBnaXZlbiBkb21haW4KKyAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorX19pdHRfZnJhbWUgSVRUQVBJIF9faXR0X2ZyYW1lX2NyZWF0ZUEoY29uc3QgY2hhciAgICAqZG9tYWluKTsKK19faXR0X2ZyYW1lIElUVEFQSSBfX2l0dF9mcmFtZV9jcmVhdGVXKGNvbnN0IHdjaGFyX3QgKmRvbWFpbik7CisjaWYgZGVmaW5lZChVTklDT0RFKSB8fCBkZWZpbmVkKF9VTklDT0RFKQorIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZSAgICAgX19pdHRfZnJhbWVfY3JlYXRlVworIyAgZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIKKyNlbHNlIC8qIFVOSUNPREUgKi8KKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIF9faXR0X2ZyYW1lX2NyZWF0ZUEKKyMgIGRlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyIF9faXR0X2ZyYW1lX2NyZWF0ZUFfcHRyCisjZW5kaWYgLyogVU5JQ09ERSAqLworI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitfX2l0dF9mcmFtZSBJVFRBUEkgX19pdHRfZnJhbWVfY3JlYXRlKGNvbnN0IGNoYXIgKmRvbWFpbik7CisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisKKy8qKiBAY29uZCBleGNsdWRlX2Zyb21fZG9jdW1lbnRhdGlvbiAqLworI2lmbmRlZiBJTlRFTF9OT19NQUNST19CT0RZCisjaWZuZGVmIElOVEVMX05PX0lUVE5PVElGWV9BUEkKKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KK0lUVF9TVFVCKElUVEFQSSwgX19pdHRfZnJhbWUsIGZyYW1lX2NyZWF0ZUEsIChjb25zdCBjaGFyICAgICpkb21haW4pKQorSVRUX1NUVUIoSVRUQVBJLCBfX2l0dF9mcmFtZSwgZnJhbWVfY3JlYXRlVywgKGNvbnN0IHdjaGFyX3QgKmRvbWFpbikpCisjZWxzZSAgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCitJVFRfU1RVQihJVFRBUEksIF9faXR0X2ZyYW1lLCBmcmFtZV9jcmVhdGUsICAoY29uc3QgY2hhciAqZG9tYWluKSkKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNpZiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4KKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQSAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlQSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlVyAgICAgSVRUTk9USUZZX0RBVEEoZnJhbWVfY3JlYXRlVykKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfY3JlYXRlVykKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGUgICAgIElUVE5PVElGWV9EQVRBKGZyYW1lX2NyZWF0ZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlX3B0ciBJVFROT1RJRllfTkFNRShmcmFtZV9jcmVhdGUpCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlQV9wdHIgMAorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVXKGRvbWFpbikKKyNkZWZpbmUgX19pdHRfZnJhbWVfY3JlYXRlV19wdHIgMAorI2Vsc2UgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZShkb21haW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZV9wdHIgIDAKKyNlbmRpZiAvKiBJVFRfUExBVEZPUk09PUlUVF9QTEFURk9STV9XSU4gKi8KKyNlbmRpZiAvKiBJTlRFTF9OT19JVFROT1RJRllfQVBJICovCisjZWxzZSAgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworI2lmIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTgorI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVBX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2NyZWF0ZVdfcHRyIDAKKyNlbHNlIC8qIElUVF9QTEFURk9STT09SVRUX1BMQVRGT1JNX1dJTiAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9jcmVhdGVfcHRyICAwCisjZW5kaWYgLyogSVRUX1BMQVRGT1JNPT1JVFRfUExBVEZPUk1fV0lOICovCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisKKy8qKiBAYnJpZWYgUmVjb3JkIGFuIGZyYW1lIGJlZ2luIG9jY3VycmVuY2UuICovCit2b2lkIElUVEFQSSBfX2l0dF9mcmFtZV9iZWdpbihfX2l0dF9mcmFtZSBmcmFtZSk7CisvKiogQGJyaWVmIFJlY29yZCBhbiBmcmFtZSBlbmQgb2NjdXJyZW5jZS4gKi8KK3ZvaWQgSVRUQVBJIF9faXR0X2ZyYW1lX2VuZCAgKF9faXR0X2ZyYW1lIGZyYW1lKTsKKworLyoqIEBjb25kIGV4Y2x1ZGVfZnJvbV9kb2N1bWVudGF0aW9uICovCisjaWZuZGVmIElOVEVMX05PX01BQ1JPX0JPRFkKKyNpZm5kZWYgSU5URUxfTk9fSVRUTk9USUZZX0FQSQorSVRUX1NUVUJWKElUVEFQSSwgdm9pZCwgZnJhbWVfYmVnaW4sIChfX2l0dF9mcmFtZSBmcmFtZSkpCitJVFRfU1RVQlYoSVRUQVBJLCB2b2lkLCBmcmFtZV9lbmQsICAgKF9faXR0X2ZyYW1lIGZyYW1lKSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW4gICAgIElUVE5PVElGWV9WT0lEKGZyYW1lX2JlZ2luKQorI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbl9wdHIgSVRUTk9USUZZX05BTUUoZnJhbWVfYmVnaW4pCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZCAgICAgICBJVFROT1RJRllfVk9JRChmcmFtZV9lbmQpCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICBJVFROT1RJRllfTkFNRShmcmFtZV9lbmQpCisjZWxzZSAgLyogSU5URUxfTk9fSVRUTk9USUZZX0FQSSAqLworI2RlZmluZSBfX2l0dF9mcmFtZV9iZWdpbihmcmFtZSkKKyNkZWZpbmUgX19pdHRfZnJhbWVfYmVnaW5fcHRyIDAKKyNkZWZpbmUgX19pdHRfZnJhbWVfZW5kKGZyYW1lKQorI2RlZmluZSBfX2l0dF9mcmFtZV9lbmRfcHRyICAgMAorI2VuZGlmIC8qIElOVEVMX05PX0lUVE5PVElGWV9BUEkgKi8KKyNlbHNlICAvKiBJTlRFTF9OT19NQUNST19CT0RZICovCisjZGVmaW5lIF9faXR0X2ZyYW1lX2JlZ2luX3B0ciAwCisjZGVmaW5lIF9faXR0X2ZyYW1lX2VuZF9wdHIgICAwCisjZW5kaWYgLyogSU5URUxfTk9fTUFDUk9fQk9EWSAqLworLyoqIEBlbmRjb25kICovCisvKiogQH0gZnJhbWVzIGdyb3VwICovCisKKyNpZmRlZiBfX2NwbHVzcGx1cworfQorI2VuZGlmIC8qIF9fY3BsdXNwbHVzICovCisKKyNlbmRpZiAvKiBfTEVHQUNZX0lUVE5PVElGWV9IXyAqLwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMgYi9yYzMvcnVudGltZS9zcmMvel9MaW51eF9hc20ucwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42MDEzMGE0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3pfTGludXhfYXNtLnMKQEAgLTAsMCArMSwxODA3IEBACisvLyAgel9MaW51eF9hc20uczogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorLy8gICAgICAgICAgICAgICAgICAgIHdyaXR0ZW4gZm9yIEludGVsIHBsYXRmb3JtcyBydW5uaW5nIExpbnV4KiBPUworCisvLworLy8vLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8vLworLy8vLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisvLy8vCisvLy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisvLy8vCisvLy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWFjcm9zCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisjaW5jbHVkZSAia21wX2NvbmZpZy5oIgorCisjaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NAorCisjIGlmIEtNUF9NSUMKKy8vCisvLyB0aGUgJ2RlbGF5IHIxNi9yMzIvcjY0JyBzaG91bGQgYmUgdXNlZCBpbnN0ZWFkIG9mIHRoZSAncGF1c2UnLgorLy8gVGhlIGRlbGF5IG9wZXJhdGlvbiBoYXMgdGhlIGVmZmVjdCBvZiByZW1vdmluZyB0aGUgY3VycmVudCB0aHJlYWQgZnJvbQorLy8gdGhlIHJvdW5kLXJvYmluIEhUIG1lY2hhbmlzbSwgYW5kIHRoZXJlZm9yZSBzcGVlZHMgdXAgdGhlIGlzc3VlIHJhdGUgb2YKKy8vIHRoZSBvdGhlciB0aHJlYWRzIG9uIHRoZSBzYW1lIGNvcmUuCisvLworLy8gQSB2YWx1ZSBvZiAwIHdvcmtzIGZpbmUgZm9yIDw9IDIgdGhyZWFkcyBwZXIgY29yZSwgYnV0IGNhdXNlcyB0aGUgRVBDQworLy8gYmFycmllciB0aW1lIHRvIGluY3JlYXNlIGdyZWF0bHkgZm9yIDMgb3IgbW9yZSB0aHJlYWRzIHBlciBjb3JlLgorLy8KKy8vIEEgdmFsdWUgb2YgMTAwIHdvcmtzIHByZXR0eSB3ZWxsIGZvciB1cCB0byA0IHRocmVhZHMgcGVyIGNvcmUsIGJ1dCBpc24ndAorLy8gcXVpdGUgYXMgZmFzdCBhcyAwIGZvciAyIHRocmVhZHMgcGVyIGNvcmUuCisvLworLy8gV2UgbmVlZCB0byBjaGVjayB3aGF0IGhhcHBlbnMgZm9yIG92ZXJzdWJzY3JpcHRpb24gLyA+IDQgdGhyZWFkcyBwZXIgY29yZS4KKy8vIEl0IGlzIHBvc3NpYmxlIHRoYXQgd2UgbmVlZCB0byBwYXNzIHRoZSBkZWxheSB2YWx1ZSBpbiBhcyBhIHBhcmFtZXRlcgorLy8gdGhhdCB0aGUgY2FsbGVyIGRldGVybWluZXMgYmFzZWQgb24gdGhlIHRvdGFsICMgdGhyZWFkcyAvICMgY29yZXMuCisvLworLy8ubWFjcm8gcGF1c2Vfb3AKKy8vCW1vdiAgICAkMTAwLCAlcmF4CisvLwlkZWxheSAgJXJheAorLy8uZW5kbQorIyBlbHNlCisjICBkZWZpbmUgcGF1c2Vfb3AgICAuYnl0ZSAweGYzLDB4OTAKKyMgZW5kaWYgLy8gS01QX01JQworCisjIGlmIEtNUF9PU19EQVJXSU4KKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgXyMjeCAgLy8gZXh0cmEgdW5kZXJzY29yZSBmb3IgT1MgWCogc3ltYm9scworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSBMXyMjeCAgICAgICAgICAgICAvLyBmb3JtIHRoZSBuYW1lIG9mIGxhYmVsCisubWFjcm8gS01QX0NGSV9ERUZfT0ZGU0VUCisuZW5kbWFjcm8KKy5tYWNybyBLTVBfQ0ZJX09GRlNFVAorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9SRUdJU1RFUgorLmVuZG1hY3JvCisubWFjcm8gS01QX0NGSV9ERUYKKy5lbmRtYWNybworLm1hY3JvIEFMSUdOCisJLmFsaWduICQwCisuZW5kbWFjcm8KKy5tYWNybyBERUJVR19JTkZPCisvKiBOb3Qgc3VyZSB3aGF0IC5zaXplIGRvZXMgaW4gaWNjLCBub3Qgc3VyZSBpZiB3ZSBuZWVkIHRvIGRvIHNvbWV0aGluZworICAgc2ltaWxhciBmb3IgT1MgWCouCisqLworLmVuZG1hY3JvCisubWFjcm8gUFJPQworCUFMSUdOICA0CisJLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCkKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRSgkMCk6CisuZW5kbWFjcm8KKyMgZWxzZSAvLyBLTVBfT1NfREFSV0lOCisjICBkZWZpbmUgS01QX1BSRUZJWF9VTkRFUlNDT1JFKHgpIHggIC8vIG5vIGV4dHJhIHVuZGVyc2NvcmUgZm9yIExpbnV4KiBPUyBzeW1ib2xzCisvLyBGb3JtYXQgbGFiZWxzIHNvIHRoYXQgdGhleSBkb24ndCBvdmVycmlkZSBmdW5jdGlvbiBuYW1lcyBpbiBnZGIncyBiYWNrdHJhY2VzCisvLyBNSUMgYXNzZW1ibGVyIGRvZXNuJ3QgYWNjZXB0IC5MIHN5bnRheCwgdGhlIEwgd29ya3MgZmluZSB0aGVyZSAoYXMgd2VsbCBhcyBvbiBPUyBYKikKKyMgaWYgS01QX01JQworIyAgZGVmaW5lIEtNUF9MQUJFTCh4KSBMXyMjeCAgICAgICAgICAvLyBsb2NhbCBsYWJlbAorIyBlbHNlCisjICBkZWZpbmUgS01QX0xBQkVMKHgpIC5MXyMjeCAgICAgICAgIC8vIGxvY2FsIGxhYmVsIGhpZGRlbiBmcm9tIGJhY2t0cmFjZXMKKyMgZW5kaWYgLy8gS01QX01JQworLm1hY3JvIEFMSUdOIHNpemUKKwkuYWxpZ24gMTw8KFxzaXplKQorLmVuZG0KKy5tYWNybyBERUJVR19JTkZPIHByb2MKKwkuY2ZpX2VuZHByb2MKKy8vIE5vdCBzdXJlIHdoeSB3ZSBuZWVkIC50eXBlIGFuZCAuc2l6ZSBmb3IgdGhlIGZ1bmN0aW9ucworCS5hbGlnbiAxNgorCS50eXBlICBccHJvYyxAZnVuY3Rpb24KKyAgICAgICAgLnNpemUgIFxwcm9jLC4tXHByb2MKKy5lbmRtCisubWFjcm8gUFJPQyBwcm9jCisJQUxJR04gIDQKKyAgICAgICAgLmdsb2JsIEtNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYykKK0tNUF9QUkVGSVhfVU5ERVJTQ09SRShccHJvYyk6CisJLmNmaV9zdGFydHByb2MKKy5lbmRtCisubWFjcm8gS01QX0NGSV9ERUZfT0ZGU0VUIHN6CisJLmNmaV9kZWZfY2ZhX29mZnNldAlcc3oKKy5lbmRtCisubWFjcm8gS01QX0NGSV9PRkZTRVQgcmVnLCBzegorCS5jZmlfb2Zmc2V0CVxyZWcsXHN6CisuZW5kbQorLm1hY3JvIEtNUF9DRklfUkVHSVNURVIgcmVnCisJLmNmaV9kZWZfY2ZhX3JlZ2lzdGVyCVxyZWcKKy5lbmRtCisubWFjcm8gS01QX0NGSV9ERUYgcmVnLCBzegorCS5jZmlfZGVmX2NmYQlccmVnLFxzegorLmVuZG0KKyMgZW5kaWYgLy8gS01QX09TX0RBUldJTgorI2VuZGlmIC8vIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF94ODZfNjQKKworI2lmIEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9BQVJDSDY0CisKKyMgIGRlZmluZSBLTVBfUFJFRklYX1VOREVSU0NPUkUoeCkgeCAgLy8gbm8gZXh0cmEgdW5kZXJzY29yZSBmb3IgTGludXgqIE9TIHN5bWJvbHMKKy8vIEZvcm1hdCBsYWJlbHMgc28gdGhhdCB0aGV5IGRvbid0IG92ZXJyaWRlIGZ1bmN0aW9uIG5hbWVzIGluIGdkYidzIGJhY2t0cmFjZXMKKyMgIGRlZmluZSBLTVBfTEFCRUwoeCkgLkxfIyN4ICAgICAgICAgLy8gbG9jYWwgbGFiZWwgaGlkZGVuIGZyb20gYmFja3RyYWNlcworCisubWFjcm8gQUxJR04gc2l6ZQorCS5hbGlnbiAxPDwoXHNpemUpCisuZW5kbQorCisubWFjcm8gREVCVUdfSU5GTyBwcm9jCisJLmNmaV9lbmRwcm9jCisvLyBOb3Qgc3VyZSB3aHkgd2UgbmVlZCAudHlwZSBhbmQgLnNpemUgZm9yIHRoZSBmdW5jdGlvbnMKKwlBTElHTiAyCisJLnR5cGUgIFxwcm9jLEBmdW5jdGlvbgorCS5zaXplICBccHJvYywuLVxwcm9jCisuZW5kbQorCisubWFjcm8gUFJPQyBwcm9jCisJQUxJR04gMgorCS5nbG9ibCBLTVBfUFJFRklYX1VOREVSU0NPUkUoXHByb2MpCitLTVBfUFJFRklYX1VOREVSU0NPUkUoXHByb2MpOgorCS5jZmlfc3RhcnRwcm9jCisuZW5kbQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX0FBUkNINjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIGRhdGEKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyNpZmRlZiBLTVBfR09NUF9DT01QQVQKKworLy8KKy8vIFN1cHBvcnQgZm9yIHVubmFtZWQgY29tbW9uIGJsb2Nrcy4KKy8vCisvLyBCZWNhdXNlIHRoZSBzeW1ib2wgIi5nb21wX2NyaXRpY2FsX3VzZXJfIiBjb250YWlucyBhICIuIiwgd2UgaGF2ZSB0bworLy8gcHV0IHRoaXMgc3R1ZmYgaW4gYXNzZW1ibHkuCisvLworCisjIGlmIEtNUF9BUkNIX1g4NgorIyAgaWYgS01QX09TX0RBUldJTgorICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMgorICAgICAgICAuZGF0YQorICAgICAgICAuZ2xvYmwgX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAgICAgLmxvbmcgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyMgIGVsc2UgLyogTGludXgqIE9TICovCisgICAgICAgIC5kYXRhCisgICAgICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAgICAgLmRhdGEKKwlBTElHTiA0CisgICAgICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC40Ynl0ZSAuZ29tcF9jcml0aWNhbF91c2VyXworICAgICAgICAudHlwZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsQG9iamVjdAorICAgICAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsNAorIyAgZW5kaWYgLyogS01QX09TX0RBUldJTiAqLworIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgKi8KKworIyBpZiBLTVBfQVJDSF9YODZfNjQKKyMgIGlmIEtNUF9PU19EQVJXSU4KKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmNvbW0gLmdvbXBfY3JpdGljYWxfdXNlcl8sMzIKKyAgICAgICAgLmRhdGEKKyAgICAgICAgLmdsb2JsIF9fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgICAgIC5xdWFkIC5nb21wX2NyaXRpY2FsX3VzZXJfCisjICBlbHNlIC8qIExpbnV4KiBPUyAqLworICAgICAgICAuZGF0YQorICAgICAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgICAgIC5kYXRhCisJQUxJR04gOAorICAgICAgICAuZ2xvYmFsIF9fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcgorX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyOgorICAgICAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAgICAgLnR5cGUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLEBvYmplY3QKKyAgICAgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDgKKyMgIGVuZGlmIC8qIEtNUF9PU19EQVJXSU4gKi8KKyMgZW5kaWYgLyogS01QX0FSQ0hfWDg2XzY0ICovCisKKyNlbmRpZiAvKiBLTVBfR09NUF9DT01QQVQgKi8KKworCisjaWYgS01QX0FSQ0hfWDg2ICYmICFLTVBfQVJDSF9QUEM2NAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseSB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUKKy8vIHJ1bm5pbmcgTGludXgqIE9TCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKworCS5pZGVudCAiSW50ZWwgQ29ycG9yYXRpb24iCisJLmRhdGEKKwlBTElHTiA0CisvLyB2b2lkCisvLyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKTsKKy8vCisKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF94ODZfcGF1c2UKKworICAgICAgICBwYXVzZV9vcAorICAgICAgICByZXQKKworCURFQlVHX0lORk8gX19rbXBfeDg2X3BhdXNlCisKKy8vCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworLy8KKwlQUk9DICBfX2ttcF94ODZfY3B1aWQKKworCXB1c2hsICVlYnAKKwltb3ZsICAlZXNwLCVlYnAKKyAgICAgICAgcHVzaGwgJWVkaQorICAgICAgICBwdXNobCAlZWJ4CisgICAgICAgIHB1c2hsICVlY3gKKyAgICAgICAgcHVzaGwgJWVkeAorCisJbW92bCAgOCglZWJwKSwgJWVheAorCW1vdmwgIDEyKCVlYnApLCAlZWN4CisJY3B1aWQJCQkJLy8gUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworCW1vdmwgIDE2KCVlYnApLCAlZWRpCisJbW92bCAgJWVheCwgMCglZWRpKQorCW1vdmwgICVlYngsIDQoJWVkaSkKKwltb3ZsICAlZWN4LCA4KCVlZGkpCisJbW92bCAgJWVkeCwgMTIoJWVkaSkKKworICAgICAgICBwb3BsICAlZWR4CisgICAgICAgIHBvcGwgICVlY3gKKyAgICAgICAgcG9wbCAgJWVieAorICAgICAgICBwb3BsICAlZWRpCisgICAgICAgIG1vdmwgICVlYnAsICVlc3AKKyAgICAgICAgcG9wbCAgJWVicAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF94ODZfY3B1aWQKKworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3Rlc3RfdGhlbl9hZGQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKworICAgICAgICBQUk9DICAgICAgX19rbXBfdGVzdF90aGVuX2FkZDMyCisKKyAgICAgICAgbW92bCAgICAgIDQoJWVzcCksICVlY3gKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKwlERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ4CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklYWwKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4ICAgIC8vICJwIgorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2IgICAgICVhbCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkOAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfeGNoZ19maXhlZDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF94Y2hnX2ZpeGVkMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vIAlkOgk4KCVlc3ApCisvLyByZXR1cm46ICAgICAlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92dyAgICAgIDgoJWVzcCksICVheAkvLyAiZCIKKworICAgICAgICBsb2NrCisgICAgICAgIHhjaGd3ICAgICAlYXgsKCVlY3gpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJNCglZXNwKQorLy8gCWQ6CTgoJWVzcCkKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkMzIKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeCAgICAvLyAicCIKKyAgICAgICAgbW92bCAgICAgIDgoJWVzcCksICVlYXgJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnbCAgICAgJWVheCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMzIKKworCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3ZiICAgICAgOCglZXNwKSwgJWFsCisgICAgICAgIG1vdmIgICAgICAxMiglZXNwKSwgJWRsCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJWVjeCkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWFsID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdncgICAgICA4KCVlc3ApLCAlYXgKKyAgICAgICAgbW92dyAgICAgIDEyKCVlc3ApLCAlZHgKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hndyAgJWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlYXggPT0gKCVlY3gpIHNldCAlYWwgPSAxIGVsc2Ugc2V0ICVhbCA9IDAKKyAgICAgICAgYW5kICAgICAgICQxLCAlZWF4ICAgICAgLy8gc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICBzZXRlICAgICAgJWFsICAgICAgICAgICAvLyBpZiAlZWF4ID09ICglZWN4KSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CisKKyAgICAgICAgcHVzaGwgICAgICVlYnAKKyAgICAgICAgbW92bCAgICAgICVlc3AsICVlYnAKKyAgICAgICAgcHVzaGwgICAgICVlYngKKyAgICAgICAgcHVzaGwgICAgICVlZGkKKyAgICAgICAgbW92bCAgICAgIDgoJWVicCksICVlZGkKKyAgICAgICAgbW92bCAgICAgIDEyKCVlYnApLCAlZWF4ICAgICAgICAvLyAiY3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAxNiglZWJwKSwgJWVkeCAgICAgICAgLy8gImN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbW92bCAgICAgIDIwKCVlYnApLCAlZWJ4ICAgICAgICAvLyAic3YiIGxvdyBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyNCglZWJwKSwgJWVjeCAgICAgICAgLy8gInN2IiBoaWdoIG9yZGVyIHdvcmQKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnOGIgKCVlZGkpCisgICAgICAgIHNldGUgICAgICAlYWwgICAgICAgICAgIC8vIGlmICVlZHg6ZWF4ID09ICglZWRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZCAgICAgICAkMSwgJWVheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHBvcGwgICAgICAlZWRpCisgICAgICAgIHBvcGwgICAgICAlZWJ4CisgICAgICAgIG1vdmwgICAgICAlZWJwLCAlZXNwCisgICAgICAgIHBvcGwgICAgICAlZWJwCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisvLworLy8ga21wX2ludDgKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBjdiwga21wX2ludDggc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmIgICAgICA4KCVlc3ApLCAlYWwKKyAgICAgICAgbW92YiAgICAgIDEyKCVlc3ApLCAlZGwKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworLy8KKy8vIGttcF9pbnQxNgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYKKworICAgICAgICBtb3ZsICAgICAgNCglZXNwKSwgJWVjeAorICAgICAgICBtb3Z3ICAgICAgOCglZXNwKSwgJWF4CisgICAgICAgIG1vdncgICAgICAxMiglZXNwKSwgJWR4CisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJWVjeCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworLy8KKworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorCisgICAgICAgIG1vdmwgICAgICA0KCVlc3ApLCAlZWN4CisgICAgICAgIG1vdmwgICAgICA4KCVlc3ApLCAlZWF4CisgICAgICAgIG1vdmwgICAgICAxMiglZXNwKSwgJWVkeAorICAgICAgICBsb2NrCisgICAgICAgIGNtcHhjaGdsICAlZWR4LCglZWN4KQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCisKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7CisvLworICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorCisgICAgICAgIHB1c2hsICAgICAlZWJwCisgICAgICAgIG1vdmwgICAgICAlZXNwLCAlZWJwCisgICAgICAgIHB1c2hsICAgICAlZWJ4CisgICAgICAgIHB1c2hsICAgICAlZWRpCisgICAgICAgIG1vdmwgICAgICA4KCVlYnApLCAlZWRpCisgICAgICAgIG1vdmwgICAgICAxMiglZWJwKSwgJWVheCAgICAgICAgLy8gImN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMTYoJWVicCksICVlZHggICAgICAgIC8vICJjdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIG1vdmwgICAgICAyMCglZWJwKSwgJWVieCAgICAgICAgLy8gInN2IiBsb3cgb3JkZXIgd29yZAorICAgICAgICBtb3ZsICAgICAgMjQoJWVicCksICVlY3ggICAgICAgIC8vICJzdiIgaGlnaCBvcmRlciB3b3JkCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZzhiICglZWRpKQorICAgICAgICBwb3BsICAgICAgJWVkaQorICAgICAgICBwb3BsICAgICAgJWVieAorICAgICAgICBtb3ZsICAgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICAgJWVicAorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CTQoJWVzcCkKKy8vIAlkYXRhOgk4KCVlc3ApCisvLworLy8gcmV0dXJuOgklZWF4CisKKworICAgICAgICBQUk9DICBfX2ttcF94Y2hnX3JlYWwzMgorCisgICAgICAgIHB1c2hsICAgJWVicAorICAgICAgICBtb3ZsICAgICVlc3AsICVlYnAKKyAgICAgICAgc3VibCAgICAkNCwgJWVzcAorICAgICAgICBwdXNobCAgICVlc2kKKworICAgICAgICBtb3ZsICAgIDQoJWVicCksICVlc2kKKyAgICAgICAgZmxkcyAgICAoJWVzaSkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIGxvYWQgPGFkZHI+CisgICAgICAgIGZzdHMgICAgLTQoJWVicCkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIHN0b3JlIG9sZCB2YWx1ZQorCisgICAgICAgIG1vdmwgICAgOCglZWJwKSwgJWVheAorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAlZWF4LCAoJWVzaSkKKworICAgICAgICBmbGRzICAgIC00KCVlYnApCisgICAgICAgICAgICAgICAgICAgICAgICAvLyByZXR1cm4gb2xkIHZhbHVlCisKKyAgICAgICAgcG9wbCAgICAlZXNpCisgICAgICAgIG1vdmwgICAgJWVicCwgJWVzcAorICAgICAgICBwb3BsICAgICVlYnAKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX3JlYWwzMgorCisjIGVuZGlmIC8qICFLTVBfQVNNX0lOVFJJTlMgKi8KKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CTQoJWVzcCkKKy8vCisKKyAgICAgICAgUFJPQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisgICAgICAgIG1vdmwgIDQoJWVzcCksICVlYXgKKyAgICAgICAgZmxkY3cgKCVlYXgpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgk0KCVlc3ApCisvLworCisgICAgICAgIFBST0MgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgbW92bCAgNCglZXNwKSwgJWVheAorICAgICAgICBmc3RjdyAoJWVheCkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQoKTsKKy8vCisvLworCisgICAgICAgIFBST0MgIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKworICAgICAgICBmbmNsZXgKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwgaW50IGd0aWQsIGludCB0aWQsCisvLyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgYXJnYywgdm9pZCAqcF9hcmd2W10gKSB7CisvLyAgICAoKnBrZm4pKCAmIGd0aWQsICYgZ3RpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKworLy8gLS0gQmVnaW4gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gbWFya19iZWdpbjsKKwlQUk9DICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKwlwdXNobCAlZWJwCisJS01QX0NGSV9ERUZfT0ZGU0VUIDgKKwlLTVBfQ0ZJX09GRlNFVCBlYnAsLTgKKwltb3ZsICVlc3AsJWVicAkJLy8gZXN0YWJsaXNoIHRoZSBiYXNlIHBvaW50ZXIgZm9yIHRoaXMgcm91dGluZS4KKwlLTVBfQ0ZJX1JFR0lTVEVSIGVicAorCXN1YmwgJDgsJWVzcAkJLy8gYWxsb2NhdGUgc3BhY2UgZm9yIHR3byBsb2NhbCB2YXJpYWJsZXMuCisJCQkJLy8gVGhlc2UgdmFyaWJhbGVzIGFyZToKKwkJCQkvLwlhcmd2OiAtNCglZWJwKQorCQkJCS8vCXRlbXA6IC04KCVlYnApCisJCQkJLy8KKwlwdXNobCAlZWJ4CQkvLyBzYXZlICVlYnggdG8gdXNlIGR1cmluZyB0aGlzIHJvdXRpbmUKKwkJCQkvLworI2lmIE9NUFRfU1VQUE9SVAorCW1vdmwgMjgoJWVicCksJWVieAkvLyBnZXQgZXhpdF9mcmFtZSBhZGRyZXNzCisJbW92bCAlZWJwLCglZWJ4KQkvLyBzYXZlIGV4aXRfZnJhbWUKKyNlbmRpZgorCisJbW92bCAyMCglZWJwKSwlZWJ4CS8vIFN0YWNrIGFsaWdubWVudCAtICMgYXJncworCWFkZGwgJDIsJWVieAkJLy8gI2FyZ3MgKzIgIEFsd2F5cyBwYXNzIGF0IGxlYXN0IDIgYXJncyAoZ3RpZCBhbmQgdGlkKQorCXNobGwgJDIsJWVieAkJLy8gTnVtYmVyIG9mIGJ5dGVzIHVzZWQgb24gc3RhY2s6ICgjYXJncysyKSo0CisJbW92bCAlZXNwLCVlYXgJCS8vCisJc3VibCAlZWJ4LCVlYXgJCS8vICVlc3AtKCgjYXJncysyKSo0KSAtPiAlZWF4IC0tIHdpdGhvdXQgbW9kcywgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3ZsICVlYXgsJWVieAkJLy8gU2F2ZSB0byAlZWJ4CisJYW5kbCAkMHhGRkZGRkY4MCwlZWF4CS8vIG1hc2sgb2ZmIDcgYml0cworCXN1YmwgJWVheCwlZWJ4CQkvLyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSAlZXNwCisJc3VibCAlZWJ4LCVlc3AJCS8vIFByZXBhcmUgdGhlIHN0YWNrIHB0ciAtLQorCQkJCS8vICAgbm93IGl0IHdpbGwgYmUgYWxpZ25lZCBvbiAxMjgtYnl0ZSBib3VuZGFyeSBhdCB0aGUgY2FsbAorCisJbW92bCAyNCglZWJwKSwlZWF4CS8vIGNvcHkgZnJvbSBwX2FyZ3ZbXQorCW1vdmwgJWVheCwtNCglZWJwKQkvLyBpbnRvIHRoZSBsb2NhbCB2YXJpYWJsZSAqYXJndi4KKworCW1vdmwgMjAoJWVicCksJWVieAkvLyBhcmdjIGlzIDIwKCVlYnApCisJc2hsbCAkMiwlZWJ4CisKK0tNUF9MQUJFTChpbnZva2VfMik6CisJY21wbCAkMCwlZWJ4CisJamcgIEtNUF9MQUJFTChpbnZva2VfNCkKKwlqbXAgS01QX0xBQkVMKGludm9rZV8zKQorCUFMSUdOIDIKK0tNUF9MQUJFTChpbnZva2VfNCk6CisJbW92bCAtNCglZWJwKSwlZWF4CisJc3VibCAkNCwlZWJ4CQkJLy8gZGVjcmVtZW50IGFyZ2MuCisJYWRkbCAlZWJ4LCVlYXgJCQkvLyBpbmRleCBpbnRvIGFyZ3YuCisJbW92bCAoJWVheCksJWVkeAorCXB1c2hsICVlZHgKKworCWptcCBLTVBfTEFCRUwoaW52b2tlXzIpCisJQUxJR04gMgorS01QX0xBQkVMKGludm9rZV8zKToKKwlsZWFsIDE2KCVlYnApLCVlYXgJCS8vIHB1c2ggJiB0aWQKKwlwdXNobCAlZWF4CisKKwlsZWFsIDEyKCVlYnApLCVlYXgJCS8vIHB1c2ggJiBndGlkCisJcHVzaGwgJWVheAorCisJbW92bCA4KCVlYnApLCVlYngKKwljYWxsIColZWJ4CQkJLy8gY2FsbCAoKnBrZm4pKCk7CisKKwltb3ZsICQxLCVlYXgJCQkvLyByZXR1cm4gMTsKKworCW1vdmwgLTEyKCVlYnApLCVlYngJCS8vIHJlc3RvcmUgJWVieAorCWxlYXZlCisJS01QX0NGSV9ERUYgZXNwLDQKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKworLy8ga21wX3VpbnQ2NAorLy8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCisJUFJPQyAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisJcmR0c2MKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisvLyAtLSBFbmQgIF9fa21wX2hhcmR3YXJlX3RpbWVzdGFtcAorCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCisKKyNpZiBLTVBfQVJDSF9YODZfNjQKKworLy8gLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vIG1pY3JvdGFza2luZyByb3V0aW5lcyBzcGVjaWZpY2FsbHkgd3JpdHRlbiBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIGFuZAorLy8gSW50ZWwoUikgNjQgcnVubmluZyBMaW51eCogT1MKKy8vIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKy8vIC0tIE1hY2hpbmUgdHlwZSBQCisvLyBtYXJrX2Rlc2NyaXB0aW9uICJJbnRlbCBDb3Jwb3JhdGlvbiI7CisJLmlkZW50ICJJbnRlbCBDb3Jwb3JhdGlvbiIKKy8vIC0tCS5maWxlICJ6X0xpbnV4X2FzbS5zIgorCS5kYXRhCisJQUxJR04gNAorCisvLyBUbyBwcmV2ZW50IGdldHRpbmcgb3VyIGNvZGUgaW50byAuZGF0YSBzZWN0aW9uIC50ZXh0IGFkZGVkIHRvIGV2ZXJ5IHJvdXRpbmUgZGVmaW5pdGlvbiBmb3IgeDg2XzY0LgorLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94ODZfY3B1aWQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHZvaWQgKmNwdWlkX2J1ZmZlciApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJbW9kZToJCSVlZGkKKy8vIAltb2RlMjoJCSVlc2kKKy8vIAljcHVpZF9idWZmZXI6CSVyZHgKKworICAgICAgICAudGV4dAorCVBST0MgIF9fa21wX3g4Nl9jcHVpZAorCisJcHVzaHEgICVyYnAKKwltb3ZxICAgJXJzcCwlcmJwCisgICAgICAgIHB1c2hxICAlcmJ4CQkJLy8gY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKworCW1vdmwgICAlZXNpLCAlZWN4CQkvLyAibW9kZTIiCisJbW92bCAgICVlZGksICVlYXgJCS8vICJtb2RlIgorICAgICAgICBtb3ZxICAgJXJkeCwgJXJzaSAgICAgICAgICAgICAgIC8vIGNwdWlkX2J1ZmZlcgorCWNwdWlkCQkJCS8vIFF1ZXJ5IHRoZSBDUFVJRCBmb3IgdGhlIGN1cnJlbnQgcHJvY2Vzc29yCisKKwltb3ZsICAgJWVheCwgMCglcnNpKQkJLy8gc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdmwgICAlZWJ4LCA0KCVyc2kpCisJbW92bCAgICVlY3gsIDgoJXJzaSkKKwltb3ZsICAgJWVkeCwgMTIoJXJzaSkKKworICAgICAgICBwb3BxICAgJXJieAkJCS8vIGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIG1vdnEgICAlcmJwLCAlcnNwCisgICAgICAgIHBvcHEgICAlcmJwCisJcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94ODZfY3B1aWQKKworCisKKyMgaWYgIUtNUF9BU01fSU5UUklOUworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJWVzaQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJkIgorICAgICAgICBsb2NrCisgICAgICAgIHhhZGRsICAgICAlZWF4LCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3Rlc3RfdGhlbl9hZGQzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklcnNpCisvLwlyZXR1cm46CSVyYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheAkvLyAiZCIKKyAgICAgICAgbG9jaworICAgICAgICB4YWRkcSAgICAgJXJheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF90ZXN0X3RoZW5fYWRkNjQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQ4CisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAlkOgklc2lsCisvLworLy8gcmV0dXJuOgklYWwKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF94Y2hnX2ZpeGVkOAorCisgICAgICAgIG1vdmIgICAgICAlc2lsLCAlYWwJLy8gImQiCisKKyAgICAgICAgbG9jaworICAgICAgICB4Y2hnYiAgICAgJWFsLCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfZml4ZWQ4CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVzaQorLy8gcmV0dXJuOiAgICAgJWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19maXhlZDE2CisKKyAgICAgICAgbW92dyAgICAgICVzaSwgJWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3cgICAgICVheCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF94Y2hnX2ZpeGVkMTYKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX3hjaGdfZml4ZWQzMgorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJZDoJJWVzaQorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ2wgICAgICVlYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX2ZpeGVkNjQKKy8vCisvLyBrbXBfaW50NjQKKy8vIF9fa21wX3hjaGdfZml4ZWQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgZCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWQ6CSVyc2kKKy8vIHJldHVybjoJJXJheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfZml4ZWQ2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4CS8vICJkIgorCisgICAgICAgIGxvY2sKKyAgICAgICAgeGNoZ3EgICAgICVyYXgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19maXhlZDY0CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4CisKKyAgICAgICAgbW92YiAgICAgICVzaWwsICVhbAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2IgICVkbCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWFsID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKy8vCisvLyBrbXBfaW50MTYKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCXA6CSVyZGkKKy8vIAljdjoJJXNpCisvLwlzdjoJJWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNgorCisgICAgICAgIG1vdncgICAgICAlc2ksICVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWF4ID09ICglcmRpKSBzZXQgJWFsID0gMSBlbHNlIHNldCAlYWwgPSAwCisgICAgICAgIGFuZHEgICAgICAkMSwgJXJheCAgICAgIC8vIHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uIGZvciByZXR1cm4gdmFsdWUKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2CisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCisvLworLy8ga21wX2ludDMyCisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisgICAgICAgIG1vdmwgICAgICAlZXNpLCAlZWF4CS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnbCAgJWVkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJWVheCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorLy8KKy8vIGttcF9pbnQzMgorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklcnNpCisvLwlzdjoJJXJkeAorLy8JcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisgICAgICAgIG1vdnEgICAgICAlcnNpLCAlcmF4ICAgIC8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hncSAgJXJkeCwoJXJkaSkKKyAgICAgICAgc2V0ZSAgICAgICVhbCAgICAgICAgICAgLy8gaWYgJXJheCA9PSAoJXJkaSkgc2V0ICVhbCA9IDEgZWxzZSBzZXQgJWFsID0gMAorICAgICAgICBhbmRxICAgICAgJDEsICVyYXggICAgICAvLyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbiBmb3IgcmV0dXJuIHZhbHVlCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKy8vCisvLyBrbXBfaW50OAorLy8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklZXNpCisvLwlzdjoJJWVkeAorLy8KKy8vIHJldHVybjoJJWVheAorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworICAgICAgICBtb3ZiICAgICAgJXNpbCwgJWFsCS8vICJjdiIKKyAgICAgICAgbG9jaworICAgICAgICBjbXB4Y2hnYiAgJWRsLCglcmRpKQorICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CisvLworLy8ga21wX2ludDE2CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2X3JldCggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2Ogklc2kKKy8vCXN2OgklZHgKKy8vCisvLyByZXR1cm46CSVlYXgKKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisgICAgICAgIG1vdncgICAgICAlc2ksICVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3cgICVkeCwoJXJkaSkKKyAgICAgICAgcmV0CisKKyAgICAgICAgREVCVUdfSU5GTyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKy8vCisvLyBrbXBfaW50MzIKKy8vIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLyAJY3Y6CSVlc2kKKy8vCXN2OgklZWR4CisvLworLy8gcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworICAgICAgICBtb3ZsICAgICAgJWVzaSwgJWVheAkvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ2wgICVlZHgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CisvLworLy8ga21wX2ludDY0CisvLyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8gCWN2OgklcnNpCisvLwlzdjoJJXJkeAorLy8JcmV0dXJuOgklZWF4CisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworICAgICAgICBtb3ZxICAgICAgJXJzaSwgJXJheCAgICAvLyAiY3YiCisgICAgICAgIGxvY2sKKyAgICAgICAgY21weGNoZ3EgICVyZHgsKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKworIyBlbmRpZiAvKiAhS01QX0FTTV9JTlRSSU5TICovCisKKworIyBpZiAhS01QX01JQworCisjIGlmICFLTVBfQVNNX0lOVFJJTlMKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWwzMgorLy8KKy8vIGttcF9yZWFsMzIKKy8vIF9fa21wX3hjaGdfcmVhbDMyKCB2b2xhdGlsZSBrbXBfcmVhbDMyICphZGRyLCBrbXBfcmVhbDMyIGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gCWFkZHI6CSVyZGkKKy8vIAlkYXRhOgkleG1tMCAobG93ZXIgNCBieXRlcykKKy8vCisvLyByZXR1cm46CSV4bW0wIChsb3dlciA0IGJ5dGVzKQorCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3hjaGdfcmVhbDMyCisKKwltb3ZkCSV4bW0wLCAlZWF4CS8vIGxvYWQgImRhdGEiIHRvIGVheAorCisgICAgICAgICBsb2NrCisgICAgICAgICB4Y2hnbCAlZWF4LCAoJXJkaSkKKworCW1vdmQJJWVheCwgJXhtbTAJLy8gbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKworICAgICAgICByZXQKKworICAgICAgICBERUJVR19JTkZPIF9fa21wX3hjaGdfcmVhbDMyCisKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyBGVU5DVElPTiBfX2ttcF94Y2hnX3JlYWw2NAorLy8KKy8vIGttcF9yZWFsNjQKKy8vIF9fa21wX3hjaGdfcmVhbDY0KCB2b2xhdGlsZSBrbXBfcmVhbDY0ICphZGRyLCBrbXBfcmVhbDY0IGRhdGEgKTsKKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8gICAgICBhZGRyOiAgICVyZGkKKy8vICAgICAgZGF0YTogICAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vICAgICAgcmV0dXJuOiAleG1tMCAobG93ZXIgOCBieXRlcykKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfeGNoZ19yZWFsNjQKKworCW1vdmQJJXhtbTAsICVyYXgJLy8gbG9hZCAiZGF0YSIgdG8gcmF4CisKKyAgICAgICAgIGxvY2sKKwl4Y2hncSAgJXJheCwgKCVyZGkpCisKKwltb3ZkCSVyYXgsICV4bW0wCS8vIGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfeGNoZ19yZWFsNjQKKworCisjIGVuZGlmIC8qICFLTVBfTUlDICovCisKKyMgZW5kaWYgLyogIUtNUF9BU01fSU5UUklOUyAqLworCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorLy8KKy8vIHZvaWQKKy8vIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQoIGttcF9pbnQxNiAqcCApOworLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAJcDoJJXJkaQorLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgZmxkY3cgKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7CisvLworLy8gcGFyYW1ldGVyczoKKy8vIAlwOgklcmRpCisvLworCisgICAgICAgIC50ZXh0CisgICAgICAgIFBST0MgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCisKKyAgICAgICAgZnN0Y3cgKCVyZGkpCisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKworCisvLy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorLy8KKy8vIEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKy8vCisvLyB2b2lkCisvLyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisvLworLy8KKworICAgICAgICAudGV4dAorICAgICAgICBQUk9DICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCisKKyNpZiBLTVBfTUlDCisvLyBUT0RPOiByZW1vdmUgdGhlIHdvcmthcm91bmQgZm9yIHByb2JsZW0gd2l0aCBmbmNsZXggaW5zdHJ1Y3Rpb24gKG5vIENRIGtub3duKQorICAgICAgICBmc3RlbnYgIC0zMiglcnNwKSAgICAgICAgICAgICAgLy8gc3RvcmUgRlAgZW52CisgICAgICAgIGFuZHcgICAgJH4weDgwZmYsIDQtMzIoJXJzcCkgICAvLyBjbGVhciAwLTcsMTUgYml0cyBvZiBGUCBTVworICAgICAgICBmbGRlbnYgIC0zMiglcnNwKSAgICAgICAgICAgICAgLy8gbG9hZCBGUCBlbnYgYmFjaworICAgICAgICByZXQKKyNlbHNlCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKyNlbmRpZgorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZAorCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gdHlwZWRlZiB2b2lkCSgqbWljcm90YXNrX3QpKCBpbnQgKmd0aWQsIGludCAqdGlkLCAuLi4gKTsKKy8vCisvLyBpbnQKKy8vIF9fa21wX2ludm9rZV9taWNyb3Rhc2soIHZvaWQgKCpwa2ZuKSAoaW50IGd0aWQsIGludCB0aWQsIC4uLiksCisvLwkJICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKy8vICAgICAgICAgICAgICAgICAgICAgICAgIGludCBhcmdjLCB2b2lkICpwX2FyZ3ZbXSApIHsKKy8vICAgICgqcGtmbikoICYgZ3RpZCwgJiB0aWQsIGFyZ3ZbMF0sIC4uLiApOworLy8gICAgcmV0dXJuIDE7CisvLyB9CisvLworLy8gbm90ZToKKy8vCWF0IGNhbGwgdG8gcGtmbiBtdXN0IGhhdmUgJXJzcCAxMjgtYnl0ZSBhbGlnbmVkIGZvciBjb21waWxlcgorLy8KKy8vIHBhcmFtZXRlcnM6CisvLyAgICAgICVyZGk6ICAJcGtmbgorLy8JJWVzaToJZ3RpZAorLy8JJWVkeDoJdGlkCisvLwklZWN4OglhcmdjCisvLwklcjg6CXBfYXJndgorLy8JJXI5OgkmZXhpdF9mcmFtZQorLy8KKy8vIGxvY2FsczoKKy8vCV9fZ3RpZDoJZ3RpZCBwYXJtIHB1c2hlZCBvbiBzdGFjayBzbyBjYW4gcGFzcyAmZ3RpZCB0byBwa2ZuCisvLwlfX3RpZDoJdGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZ0aWQgdG8gcGtmbgorLy8KKy8vIHJlZyB0ZW1wczoKKy8vCSVyYXg6CXVzZWQgYWxsIG92ZXIgdGhlIHBsYWNlCisvLwklcmR4Ogl1c2VkIGluIHN0YWNrIHBvaW50ZXIgYWxpZ25tZW50IGNhbGN1bGF0aW9uCisvLwklcjExOgl1c2VkIHRvIHRyYXZlcnNlIHBfYXJndiBhcnJheQorLy8JJXJzaToJdXNlZCBhcyB0ZW1wb3JhcnkgZm9yIHN0YWNrIHBhcmFtZXRlcnMKKy8vCQl1c2VkIGFzIHRlbXBvcmFyeSBmb3IgbnVtYmVyIG9mIHBrZm4gcGFybXMgdG8gcHVzaAorLy8JJXJieDoJdXNlZCB0byBob2xkIHBrZm4gYWRkcmVzcywgYW5kIHplcm8gY29uc3RhbnQsIGNhbGxlZS1zYXZlCisvLworLy8gcmV0dXJuOgklZWF4IAkoYWx3YXlzIDEvVFJVRSkKKy8vCisKK19fZ3RpZCA9IC0xNgorX190aWQgPSAtMjQKKworLy8gLS0gQmVnaW4gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gbWFya19iZWdpbjsKKyAgICAgICAgLnRleHQKKwlQUk9DICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKwlwdXNocSAJJXJicAkJLy8gc2F2ZSBiYXNlIHBvaW50ZXIKKwlLTVBfQ0ZJX0RFRl9PRkZTRVQgMTYKKwlLTVBfQ0ZJX09GRlNFVCByYnAsLTE2CisJbW92cSAJJXJzcCwlcmJwCS8vIGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyIGZvciB0aGlzIHJvdXRpbmUuCisJS01QX0NGSV9SRUdJU1RFUiByYnAKKworI2lmIE9NUFRfU1VQUE9SVAorCW1vdnEJJXJicCwgKCVyOSkJLy8gc2F2ZSBleGl0X2ZyYW1lCisjZW5kaWYKKworCXB1c2hxIAklcmJ4CQkvLyAlcmJ4IGlzIGNhbGxlZS1zYXZlZCByZWdpc3RlcgorCXB1c2hxCSVyc2kJCS8vIFB1dCBndGlkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZ0Z2lkIHRvIHBrZm4KKwlwdXNocQklcmR4CQkvLyBQdXQgdGlkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZ0aWQgdG8gcGtmbgorCisJbW92cQklcmN4LCAlcmF4CS8vIFN0YWNrIGFsaWdubWVudCBjYWxjdWxhdGlvbiBiZWdpbnM7IGFyZ2MgLT4gJXJheAorCW1vdnEJJDAsICVyYngJLy8gY29uc3RhbnQgZm9yIGNtb3ZzIGxhdGVyCisJc3VicQkkNCwgJXJheAkvLyBzdWJ0cmFjdCBmb3VyIGFyZ3MgcGFzc2VkIGluIHJlZ2lzdGVycyB0byBwa2ZuCisjaWYgS01QX01JQworCWpzCUtNUF9MQUJFTChrbXBfMCkJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfMF9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzApOgorCW1vdnEJJXJieCwgJXJheAkvLyB6ZXJvIG5lZ2F0aXZlIHZhbHVlIGluICVyYXggPC0gbWF4KDAsIGFyZ2MtNCkKK0tNUF9MQUJFTChrbXBfMF9leGl0KToKKyNlbHNlCisJY21vdnNxCSVyYngsICVyYXgJLy8gemVybyBuZWdhdGl2ZSB2YWx1ZSBpbiAlcmF4IDwtIG1heCgwLCBhcmdjLTQpCisjZW5kaWYgLy8gS01QX01JQworCisJbW92cQklcmF4LCAlcnNpCS8vIHNhdmUgbWF4KDAsIGFyZ2MtNCkgLT4gJXJzaSBmb3IgbGF0ZXIKKwlzaGxxIAkkMywgJXJheAkvLyBOdW1iZXIgb2YgYnl0ZXMgdXNlZCBvbiBzdGFjazogbWF4KDAsIGFyZ2MtNCkqOAorCisJbW92cSAJJXJzcCwgJXJkeAkvLworCXN1YnEgCSVyYXgsICVyZHgJLy8gJXJzcC0obWF4KDAsYXJnYy00KSo4KSAtPiAlcmR4IC0tCisJCQkJLy8gd2l0aG91dCBhbGlnbiwgc3RhY2sgcHRyIHdvdWxkIGJlIHRoaXMKKwltb3ZxIAklcmR4LCAlcmF4CS8vIFNhdmUgdG8gJXJheAorCisJYW5kcSAJJDB4RkZGRkZGRkZGRkZGRkY4MCwgJXJheCAgLy8gbWFzayBvZmYgbG93ZXIgNyBiaXRzICgxMjggYnl0ZXMgYWxpZ24pCisJc3VicSAJJXJheCwgJXJkeAkvLyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSAlcnNwCisJc3VicSAJJXJkeCwgJXJzcAkvLyBQcmVwYXJlIHRoZSBzdGFjayBwdHIgLS0KKwkJCQkvLyBub3cgJXJzcCB3aWxsIGFsaWduIHRvIDEyOC1ieXRlIGJvdW5kYXJ5IGF0IGNhbGwgc2l0ZQorCisJCQkJLy8gc2V0dXAgcGtmbiBwYXJhbWV0ZXIgcmVnIGFuZCBzdGFjaworCW1vdnEJJXJjeCwgJXJheAkvLyBhcmdjIC0+ICVyYXgKKwljbXBxCSQwLCAlcnNpCisJamUJS01QX0xBQkVMKGttcF9pbnZva2VfcGFzc19wYXJtcykJLy8ganVtcCBhaGVhZCBpZiBubyBwYXJtcyB0byBwdXNoCisJc2hscQkkMywgJXJjeAkvLyBhcmdjKjggLT4gJXJjeAorCW1vdnEgCSVyOCwgJXJkeAkvLyBwX2FyZ3YgLT4gJXJkeAorCWFkZHEJJXJjeCwgJXJkeAkvLyAmcF9hcmd2W2FyZ2NdIC0+ICVyZHgKKworCW1vdnEJJXJzaSwgJXJjeAkvLyBtYXggKDAsIGFyZ2MtNCkgLT4gJXJjeAorCitLTVBfTEFCRUwoa21wX2ludm9rZV9wdXNoX3Bhcm1zKToKKwkvLyBwdXNoIG50aCAtIDd0aCBwYXJtcyB0byBwa2ZuIG9uIHN0YWNrCisJc3VicQkkOCwgJXJkeAkvLyBkZWNyZW1lbnQgcF9hcmd2IHBvaW50ZXIgdG8gcHJldmlvdXMgcGFybQorCW1vdnEJKCVyZHgpLCAlcnNpCS8vIHBfYXJndlslcmN4LTFdIC0+ICVyc2kKKwlwdXNocQklcnNpCQkvLyBwdXNoIHBfYXJndlslcmN4LTFdIG9udG8gc3RhY2sgKHJldmVyc2Ugb3JkZXIpCisJc3VibAkkMSwgJWVjeAorCisvLyBDNjk1NzA6ICJYODZfNjRfUkVMT0NfQlJBTkNIIG5vdCBzdXBwb3J0ZWQiIGVycm9yIGF0IGxpbmtpbmcgb24gbWFjXzMyZQorLy8JCWlmIHRoZSBuYW1lIG9mIHRoZSBsYWJlbCB0aGF0IGlzIGFuIG9wZXJhbmQgb2YgdGhpcyBqZWN4eiBzdGFydHMgd2l0aCBhIGRvdCAoIi4iKTsKKy8vCSAgIEFwcGxlJ3MgbGlua2VyIGRvZXMgbm90IHN1cHBvcnQgMS1ieXRlIGxlbmd0aCByZWxvY2F0aW9uOworLy8gICAgICAgICBSZXNvbHV0aW9uOiByZXBsYWNlIGFsbCAubGFiZWxYIGVudHJpZXMgd2l0aCBMX2xhYmVsWC4KKworCWplY3h6ICAgS01QX0xBQkVMKGttcF9pbnZva2VfcGFzc19wYXJtcykgIC8vIHN0b3Agd2hlbiBmb3VyIHBfYXJndltdIHBhcm1zIGxlZnQKKwlqbXAJS01QX0xBQkVMKGttcF9pbnZva2VfcHVzaF9wYXJtcykKKwlBTElHTiAzCitLTVBfTEFCRUwoa21wX2ludm9rZV9wYXNzX3Bhcm1zKToJLy8gcHV0IDFzdCAtIDZ0aCBwYXJtcyB0byBwa2ZuIGluIHJlZ2lzdGVycy4KKwkJCQkvLyBvcmRlciBoZXJlIGlzIGltcG9ydGFudCB0byBhdm9pZCB0cmFzaGluZworCQkJCS8vIHJlZ2lzdGVycyB1c2VkIGZvciBib3RoIGlucHV0IGFuZCBvdXRwdXQgcGFybXMhCisJbW92cQklcmRpLCAlcmJ4CS8vIHBrZm4gLT4gJXJieAorCWxlYXEJX19ndGlkKCVyYnApLCAlcmRpIC8vICZndGlkIC0+ICVyZGkgKHN0b3JlIDFzdCBwYXJtIHRvIHBrZm4pCisJbGVhcQlfX3RpZCglcmJwKSwgJXJzaSAgLy8gJnRpZCAtPiAlcnNpIChzdG9yZSAybmQgcGFybSB0byBwa2ZuKQorCisJbW92cQklcjgsICVyMTEJLy8gcF9hcmd2IC0+ICVyMTEKKworI2lmIEtNUF9NSUMKKwljbXBxCSQ0LCAlcmF4CS8vIGFyZ2MgPj0gND8KKwlqbnMJS01QX0xBQkVMKGttcF80KQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF80X2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfNCk6CisJbW92cQkyNCglcjExKSwgJXI5CS8vIHBfYXJndlszXSAtPiAlcjkgKHN0b3JlIDZ0aCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzRfZXhpdCk6CisKKwljbXBxCSQzLCAlcmF4CS8vIGFyZ2MgPj0gMz8KKwlqbnMJS01QX0xBQkVMKGttcF8zKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8zX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMyk6CisJbW92cQkxNiglcjExKSwgJXI4CS8vIHBfYXJndlsyXSAtPiAlcjggKHN0b3JlIDV0aCBwYXJtIHRvIHBrZm4pCitLTVBfTEFCRUwoa21wXzNfZXhpdCk6CisKKwljbXBxCSQyLCAlcmF4CS8vIGFyZ2MgPj0gMj8KKwlqbnMJS01QX0xBQkVMKGttcF8yKQkvLyBqdW1wIHRvIG1vdnEKKwlqbXAJS01QX0xBQkVMKGttcF8yX2V4aXQpCS8vIGp1bXAgYWhlYWQKK0tNUF9MQUJFTChrbXBfMik6CisJbW92cQk4KCVyMTEpLCAlcmN4CS8vIHBfYXJndlsxXSAtPiAlcmN4IChzdG9yZSA0dGggcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF8yX2V4aXQpOgorCisJY21wcQkkMSwgJXJheAkvLyBhcmdjID49IDE/CisJam5zCUtNUF9MQUJFTChrbXBfMSkJLy8ganVtcCB0byBtb3ZxCisJam1wCUtNUF9MQUJFTChrbXBfMV9leGl0KQkvLyBqdW1wIGFoZWFkCitLTVBfTEFCRUwoa21wXzEpOgorCW1vdnEJKCVyMTEpLCAlcmR4CS8vIHBfYXJndlswXSAtPiAlcmR4IChzdG9yZSAzcmQgcGFybSB0byBwa2ZuKQorS01QX0xBQkVMKGttcF8xX2V4aXQpOgorI2Vsc2UKKwljbXBxCSQ0LCAlcmF4CS8vIGFyZ2MgPj0gND8KKwljbW92bnNxCTI0KCVyMTEpLCAlcjkJLy8gcF9hcmd2WzNdIC0+ICVyOSAoc3RvcmUgNnRoIHBhcm0gdG8gcGtmbikKKworCWNtcHEJJDMsICVyYXgJLy8gYXJnYyA+PSAzPworCWNtb3Zuc3EJMTYoJXIxMSksICVyOAkvLyBwX2FyZ3ZbMl0gLT4gJXI4IChzdG9yZSA1dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMiwgJXJheAkvLyBhcmdjID49IDI/CisJY21vdm5zcQk4KCVyMTEpLCAlcmN4CS8vIHBfYXJndlsxXSAtPiAlcmN4IChzdG9yZSA0dGggcGFybSB0byBwa2ZuKQorCisJY21wcQkkMSwgJXJheAkvLyBhcmdjID49IDE/CisJY21vdm5zcQkoJXIxMSksICVyZHgJLy8gcF9hcmd2WzBdIC0+ICVyZHggKHN0b3JlIDNyZCBwYXJtIHRvIHBrZm4pCisjZW5kaWYgLy8gS01QX01JQworCisJY2FsbAkqJXJieAkJLy8gY2FsbCAoKnBrZm4pKCk7CisJbW92cQkkMSwgJXJheAkvLyBtb3ZlIDEgaW50byByZXR1cm4gcmVnaXN0ZXI7CisKKwltb3ZxCS04KCVyYnApLCAlcmJ4CS8vIHJlc3RvcmUgJXJieAl1c2luZyAlcmJwIHNpbmNlICVyc3Agd2FzIG1vZGlmaWVkCisJbW92cSAJJXJicCwgJXJzcAkvLyByZXN0b3JlIHN0YWNrIHBvaW50ZXIKKwlwb3BxIAklcmJwCQkvLyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKwlLTVBfQ0ZJX0RFRiByc3AsOAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyAtLSBFbmQgIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworLy8ga21wX3VpbnQ2NAorLy8gX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCisgICAgICAgIC50ZXh0CisJUFJPQyAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisJcmR0c2MKKwlzaGxxICAgICQzMiwgJXJkeAorCW9ycSAgICAgJXJkeCwgJXJheAorCXJldAorCisJREVCVUdfSU5GTyBfX2ttcF9oYXJkd2FyZV90aW1lc3RhbXAKKy8vIC0tIEVuZCAgX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wCisKKy8vLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisvLworLy8gRlVOQ1RJT04gX19rbXBfYnNyMzIKKy8vCisvLyBpbnQKKy8vIF9fa21wX2JzcjMyKCBpbnQgKTsKKy8vCisKKyAgICAgICAgLnRleHQKKyAgICAgICAgUFJPQyAgX19rbXBfYnNyMzIKKworICAgICAgICBic3IgICAgJWVkaSwlZWF4CisgICAgICAgIHJldAorCisgICAgICAgIERFQlVHX0lORk8gX19rbXBfYnNyMzIKKworCisvLyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4Nl82NCAqLworCisvLyAnCisjaWYgS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX0FBUkNINjQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8JeDA6CXBrZm4KKy8vCXcxOglndGlkCisvLwl3MjoJdGlkCisvLwl3MzoJYXJnYworLy8JeDQ6CXBfYXJndgorLy8JeDU6CSZleGl0X2ZyYW1lCisvLworLy8gbG9jYWxzOgorLy8JX19ndGlkOglndGlkIHBhcm0gcHVzaGVkIG9uIHN0YWNrIHNvIGNhbiBwYXNzICZndGlkIHRvIHBrZm4KKy8vCV9fdGlkOgl0aWQgcGFybSBwdXNoZWQgb24gc3RhY2sgc28gY2FuIHBhc3MgJnRpZCB0byBwa2ZuCisvLworLy8gcmVnIHRlbXBzOgorLy8JIHg4Ogl1c2VkIHRvIGhvbGQgcGtmbiBhZGRyZXNzCisvLwkgdzk6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBudW1iZXIgb2YgcGtmbiBwYXJtcworLy8JeDEwOgl1c2VkIHRvIHRyYXZlcnNlIHBfYXJndiBhcnJheQorLy8JeDExOgl1c2VkIGFzIHRlbXBvcmFyeSBmb3Igc3RhY2sgcGxhY2VtZW50IGNhbGN1bGF0aW9uCisvLwl4MTI6CXVzZWQgYXMgdGVtcG9yYXJ5IGZvciBzdGFjayBwYXJhbWV0ZXJzCisvLwl4MTk6CXVzZWQgdG8gcHJlc2VydmUgZXhpdF9mcmFtZV9wdHIsIGNhbGxlZS1zYXZlCisvLworLy8gcmV0dXJuOgl3MAkoYWx3YXlzIDEvVFJVRSkKKy8vCisKK19fZ3RpZCA9IDQKK19fdGlkID0gOAorCisvLyAtLSBCZWdpbiBfX2ttcF9pbnZva2VfbWljcm90YXNrCisvLyBtYXJrX2JlZ2luOworCS50ZXh0CisJUFJPQyBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKwlzdHAJeDI5LCB4MzAsIFtzcCwgIy0xNl0hCisjIGlmIE9NUFRfU1VQUE9SVAorCXN0cAl4MTksIHgyMCwgW3NwLCAjLTE2XSEKKyMgZW5kaWYKKwltb3YJeDI5LCBzcAorCisJb3JyCXc5LCB3enIsICMxCisJYWRkCXc5LCB3OSwgdzMsIGxzciAjMQorCXN1YglzcCwgc3AsIHc5LCBsc2wgIzQKKwltb3YJeDExLCBzcAorCisJbW92CXg4LCB4MAorCXN0cgl3MSwgW3gyOSwgIy1fX2d0aWRdCisJc3RyCXcyLCBbeDI5LCAjLV9fdGlkXQorCW1vdgl3OSwgdzMKKwltb3YJeDEwLCB4NAorIyBpZiBPTVBUX1NVUFBPUlQKKwltb3YJeDE5LCB4NQorCXN0cgl4MjksIFt4MTldCisjIGVuZGlmCisKKwlzdWIJeDAsIHgyOSwgI19fZ3RpZAorCXN1Ygl4MSwgeDI5LCAjX190aWQKKworCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4MiwgW3gxMF0KKworCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXgzLCBbeDEwLCAjOF0hCisKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4NCwgW3gxMCwgIzhdIQorCisJc3ViCXc5LCB3OSwgIzEKKwljYnoJdzksIEtNUF9MQUJFTChrbXBfMSkKKwlsZHIJeDUsIFt4MTAsICM4XSEKKworCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXg2LCBbeDEwLCAjOF0hCisKKwlzdWIJdzksIHc5LCAjMQorCWNiegl3OSwgS01QX0xBQkVMKGttcF8xKQorCWxkcgl4NywgW3gxMCwgIzhdIQorCitLTVBfTEFCRUwoa21wXzApOgorCXN1Ygl3OSwgdzksICMxCisJY2J6CXc5LCBLTVBfTEFCRUwoa21wXzEpCisJbGRyCXgxMiwgW3gxMCwgIzhdIQorCXN0cgl4MTIsIFt4MTFdLCAjOAorCWIJS01QX0xBQkVMKGttcF8wKQorS01QX0xBQkVMKGttcF8xKToKKwlibHIJeDgKKwlvcnIJdzAsIHd6ciwgIzEKKwltb3YJc3AsIHgyOQorIyBpZiBPTVBUX1NVUFBPUlQKKwlzdHIJeHpyLCBbeDE5XQorCWxkcAl4MTksIHgyMCwgW3NwXSwgIzE2CisjIGVuZGlmCisJbGRwCXgyOSwgeDMwLCBbc3BdLCAjMTYKKwlyZXQKKworCURFQlVHX0lORk8gX19rbXBfaW52b2tlX21pY3JvdGFzaworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKyNlbmRpZiAvKiBLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfQUFSQ0g2NCAqLworCisjaWYgS01QX0FSQ0hfUFBDNjQKKworLy8tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKy8vCisvLyB0eXBlZGVmIHZvaWQJKCptaWNyb3Rhc2tfdCkoIGludCAqZ3RpZCwgaW50ICp0aWQsIC4uLiApOworLy8KKy8vIGludAorLy8gX19rbXBfaW52b2tlX21pY3JvdGFzayggdm9pZCAoKnBrZm4pIChpbnQgZ3RpZCwgaW50IHRpZCwgLi4uKSwKKy8vCQkgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorLy8gICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworLy8gICAgKCpwa2ZuKSggJiBndGlkLCAmIHRpZCwgYXJndlswXSwgLi4uICk7CisvLyAgICByZXR1cm4gMTsKKy8vIH0KKy8vCisvLyBwYXJhbWV0ZXJzOgorLy8JcjM6CXBrZm4KKy8vCXI0OglndGlkCisvLwlyNToJdGlkCisvLwlyNjoJYXJnYworLy8Jcjc6CXBfYXJndgorLy8Jcjg6CSZleGl0X2ZyYW1lCisvLworLy8gcmV0dXJuOglyMwkoYWx3YXlzIDEvVFJVRSkKKy8vCisJLnRleHQKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKKwkuYWJpdmVyc2lvbiAyCisjIGVuZGlmCisJLmdsb2JsCV9fa21wX2ludm9rZV9taWNyb3Rhc2sKKworIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCS5wMmFsaWduCTQKKyMgZWxzZQorCS5wMmFsaWduCTIKKyMgZW5kaWYKKworCS50eXBlCV9fa21wX2ludm9rZV9taWNyb3Rhc2ssQGZ1bmN0aW9uCisKKyMgaWYgS01QX0FSQ0hfUFBDNjRfTEUKK19fa21wX2ludm9rZV9taWNyb3Rhc2s6CisuTGZ1bmNfYmVnaW4wOgorLkxmdW5jX2dlcDA6CisJYWRkaXMgMiwgMTIsIC5UT0MuLS5MZnVuY19nZXAwQGhhCisJYWRkaSAyLCAyLCAuVE9DLi0uTGZ1bmNfZ2VwMEBsCisuTGZ1bmNfbGVwMDoKKwkubG9jYWxlbnRyeQlfX2ttcF9pbnZva2VfbWljcm90YXNrLCAuTGZ1bmNfbGVwMC0uTGZ1bmNfZ2VwMAorIyBlbHNlCisJLnNlY3Rpb24JLm9wZCwiYXciLEBwcm9nYml0cworX19rbXBfaW52b2tlX21pY3JvdGFzazoKKwkucDJhbGlnbgkzCisJLnF1YWQJLkxmdW5jX2JlZ2luMAorCS5xdWFkCS5UT0MuQHRvY2Jhc2UKKwkucXVhZAkwCisJLnRleHQKKy5MZnVuY19iZWdpbjA6CisjIGVuZGlmCisKKy8vIC0tIEJlZ2luIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKy8vIG1hcmtfYmVnaW47CisKKy8vIFdlIG5lZWQgdG8gYWxsb2NhdGUgYSBzdGFjayBmcmFtZSBsYXJnZSBlbm91Z2ggdG8gaG9sZCBhbGwgb2YgdGhlIHBhcmFtZXRlcnMKKy8vIG9uIHRoZSBzdGFjayBmb3IgdGhlIG1pY3JvdGFzayBwbHVzIHdoYXQgdGhpcyBmdW5jdGlvbiBuZWVkcy4gVGhhdCdzIDQ4CisvLyBieXRlcyB1bmRlciB0aGUgRUxGdjEgQUJJICgzMiBieXRlcyB1bmRlciBFTEZ2MiksIHBsdXMgOCooMiArIGFyZ2MpIGZvciB0aGUKKy8vIHBhcmFtZXRlcnMgdG8gdGhlIG1pY3JvdGFzaywgcGx1cyA4IGJ5dGVzIHRvIHN0b3JlIHRoZSB2YWx1ZXMgb2YgcjQgYW5kIHI1LAorLy8gYW5kIDggYnl0ZXMgdG8gc3RvcmUgcjMxLiBXaXRoIE9NUC1UIHN1cHBvcnQsIHdlIG5lZWQgYW4gYWRkaXRpb25hbCA4IGJ5dGVzCisvLyB0byBzYXZlIHIzMCB0byBob2xkIGEgY29weSBvZiByOC4KKworCS5jZmlfc3RhcnRwcm9jCisJbWZsciAwCisJc3RkIDMxLCAtOCgxKQorCXN0ZCAwLCAxNigxKQorCisvLyBUaGlzIGlzIHVudXN1YWwgYmVjYXVzZSBub3JtYWxseSB3ZSdkIHNldCByMzEgZXF1YWwgdG8gcjEgYWZ0ZXIgdGhlIHN0YWNrCisvLyBmcmFtZSBpcyBlc3RhYmxpc2hlZC4gSW4gdGhpcyBjYXNlLCBob3dldmVyLCB3ZSBuZWVkIHRvIGR5bmFtaWNhbGx5IGNvbXB1dGUKKy8vIHRoZSBzdGFjayBmcmFtZSBzaXplLCBhbmQgc28gd2Uga2VlcCBhIGRpcmVjdCBjb3B5IG9mIHIxIHRvIGFjY2VzcyBvdXIKKy8vIHJlZ2lzdGVyIHNhdmUgYXJlYXMgYW5kIHJlc3RvcmUgdGhlIHIxIHZhbHVlIGJlZm9yZSByZXR1cm5pbmcuCisJbXIgMzEsIDEKKwkuY2ZpX2RlZl9jZmFfcmVnaXN0ZXIgcjMxCisJLmNmaV9vZmZzZXQgcjMxLCAtOAorCS5jZmlfb2Zmc2V0IGxyLCAxNgorCisvLyBDb21wdXRlIHRoZSBzaXplIG5lY2Vzc2FyeSBmb3IgdGhlIGxvY2FsIHN0YWNrIGZyYW1lLgorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCWxpIDEyLCA3MgorIyBlbHNlCisJbGkgMTIsIDg4CisjIGVuZGlmCisJc2xkaSAwLCA2LCAzCisJYWRkIDEyLCAwLCAxMgorCW5lZyAxMiwgMTIKKworLy8gV2UgbmVlZCB0byBtYWtlIHN1cmUgdGhhdCB0aGUgc3RhY2sgZnJhbWUgc3RheXMgYWxpZ25lZCAodG8gMTYgYnl0ZXMsIGV4Y2VwdAorLy8gdW5kZXIgdGhlIEJHL1EgQ05LLCB3aGVyZSBpdCBtdXN0IGJlIHRvIDMyIGJ5dGVzKS4KKyMgaWYgS01QX09TX0NOSworCWxpIDAsIC0zMgorIyBlbHNlCisJbGkgMCwgLTE2CisjIGVuZGlmCisJYW5kIDEyLCAwLCAxMgorCisvLyBFc3RhYmxpc2ggdGhlIGxvY2FsIHN0YWNrIGZyYW1lLgorCXN0ZHV4IDEsIDEsIDEyCisKKyMgaWYgT01QVF9TVVBQT1JUCisJLmNmaV9vZmZzZXQgcjMwLCAtMTYKKwlzdGQgMzAsIC0xNigzMSkKKwlzdGQgMSwgMCg4KQorCW1yIDMwLCA4CisjIGVuZGlmCisKKy8vIFN0b3JlIGd0aWQgYW5kIHRpZCB0byB0aGUgc3RhY2sgYmVjYXVzZSB0aGV5J3JlIHBhc3NlZCBieSByZWZlcmVuY2UgdG8gdGhlIG1pY3JvdGFzay4KKwlzdHcgNCwgLTIwKDMxKQorCXN0dyA1LCAtMjQoMzEpCisKKwltciAxMiwgNgorCW1yIDQsIDcKKworCWNtcHdpIDAsIDEyLCAxCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDUsIDAoNCkKKworCWNtcHdpIDAsIDEyLCAyCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDYsIDgoNCkKKworCWNtcHdpIDAsIDEyLCAzCisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDcsIDE2KDQpCisKKwljbXB3aSAwLCAxMiwgNAorCWJsdAkgMCwgLkxjYWxsCisKKwlsZCA4LCAyNCg0KQorCisJY21wd2kgMCwgMTIsIDUKKwlibHQJIDAsIC5MY2FsbAorCisJbGQgOSwgMzIoNCkKKworCWNtcHdpIDAsIDEyLCA2CisJYmx0CSAwLCAuTGNhbGwKKworCWxkIDEwLCA0MCg0KQorCisJY21wd2kgMCwgMTIsIDcKKwlibHQJIDAsIC5MY2FsbAorCisvLyBUaGVyZSBhcmUgbW9yZSB0aGFuIDYgbWljcm90YXNrIHBhcmFtZXRlcnMsIHNvIHdlIG5lZWQgdG8gc3RvcmUgdGhlCisvLyByZW1haW5kZXIgdG8gdGhlIHN0YWNrLgorCWFkZGkgMTIsIDEyLCAtNgorCW10Y3RyIDEyCisKKy8vIFRoZXNlIGFyZSBzZXQgdG8gOCBieXRlcyBiZWZvcmUgdGhlIGZpcnN0IGRlc2lyZWQgc3RvcmUgYWRkcmVzcyAod2UncmUgdXNpbmcKKy8vIHByZS1pbmNyZW1lbnQgbG9hZHMgYW5kIHN0b3JlcyBpbiB0aGUgbG9vcCBiZWxvdykuIFRoZSBwYXJhbWV0ZXIgc2F2ZSBhcmVhCisvLyBmb3IgdGhlIG1pY3JvdGFzayBiZWdpbnMgNDggKyA4KjggPT0gMTEyIGJ5dGVzIGFib3ZlIHIxIGZvciBFTEZ2MSBhbmQKKy8vIDMyICsgOCo4ID09IDk2IGJ5dGVzIGFib3ZlIHIxIGZvciBFTEZ2Mi4KKwlhZGRpIDQsIDQsIDQwCisjIGlmIEtNUF9BUkNIX1BQQzY0X0xFCisJYWRkaSAxMiwgMSwgODgKKyMgZWxzZQorCWFkZGkgMTIsIDEsIDEwNAorIyBlbmRpZgorCisuTG5leHQ6CisJbGR1IDAsIDgoNCkKKwlzdGR1IDAsIDgoMTIpCisJYmRueiAuTG5leHQKKworLkxjYWxsOgorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCXN0ZCAyLCAyNCgxKQorCW1yIDEyLCAzCisjZWxzZQorCXN0ZCAyLCA0MCgxKQorLy8gRm9yIEVMRnYxLCB3ZSBuZWVkIHRvIGxvYWQgdGhlIGFjdHVhbCBmdW5jdGlvbiBhZGRyZXNzIGZyb20gdGhlIGZ1bmN0aW9uIGRlc2NyaXB0b3IuCisJbGQgMTIsIDAoMykKKwlsZCAyLCA4KDMpCisJbGQgMTEsIDE2KDMpCisjZW5kaWYKKworCWFkZGkgMywgMzEsIC0yMAorCWFkZGkgNCwgMzEsIC0yNAorCisJbXRjdHIgMTIKKwliY3RybAorIyBpZiBLTVBfQVJDSF9QUEM2NF9MRQorCWxkIDIsIDI0KDEpCisjIGVsc2UKKwlsZCAyLCA0MCgxKQorIyBlbmRpZgorCisjIGlmIE9NUFRfU1VQUE9SVAorCWxpIDMsIDAKKwlzdGQgMywgMCgzMCkKKyMgZW5kaWYKKworCWxpIDMsIDEKKworIyBpZiBPTVBUX1NVUFBPUlQKKwlsZCAzMCwgLTE2KDMxKQorIyBlbmRpZgorCisJbXIgMSwgMzEKKwlsZCAwLCAxNigxKQorCWxkIDMxLCAtOCgxKQorCW10bHIgMAorCWJscgorCisJLmxvbmcJMAorCS5xdWFkCTAKKy5MZnVuY19lbmQwOgorCS5zaXplCV9fa21wX2ludm9rZV9taWNyb3Rhc2ssIC5MZnVuY19lbmQwLS5MZnVuY19iZWdpbjAKKwkuY2ZpX2VuZHByb2MKKworLy8gLS0gRW5kICBfX2ttcF9pbnZva2VfbWljcm90YXNrCisKKyNlbmRpZiAvKiBLTVBfQVJDSF9QUEM2NCAqLworCisjaWYgS01QX0FSQ0hfQVJNCisgICAgLmRhdGEKKyAgICAuY29tbSAuZ29tcF9jcml0aWNhbF91c2VyXywzMiw4CisgICAgLmRhdGEKKyAgICAuYWxpZ24gNAorICAgIC5nbG9iYWwgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyCitfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHI6CisgICAgLjRieXRlIC5nb21wX2NyaXRpY2FsX3VzZXJfCisgICAgLnNpemUgX19rbXBfdW5uYW1lZF9jcml0aWNhbF9hZGRyLDQKKyNlbmRpZiAvKiBLTVBfQVJDSF9BUk0gKi8KKworI2lmIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQKKyAgICAuZGF0YQorICAgIC5jb21tIC5nb21wX2NyaXRpY2FsX3VzZXJfLDMyLDgKKyAgICAuZGF0YQorICAgIC5hbGlnbiA4CisgICAgLmdsb2JhbCBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIKK19fa21wX3VubmFtZWRfY3JpdGljYWxfYWRkcjoKKyAgICAuOGJ5dGUgLmdvbXBfY3JpdGljYWxfdXNlcl8KKyAgICAuc2l6ZSBfX2ttcF91bm5hbWVkX2NyaXRpY2FsX2FkZHIsOAorI2VuZGlmIC8qIEtNUF9BUkNIX1BQQzY0IHx8IEtNUF9BUkNIX0FBUkNINjQgKi8KKworI2lmIEtNUF9PU19MSU5VWAorIyBpZiBLTVBfQVJDSF9BUk0KKy5zZWN0aW9uIC5ub3RlLkdOVS1zdGFjaywiIiwlcHJvZ2JpdHMKKyMgZWxzZQorLnNlY3Rpb24gLm5vdGUuR05VLXN0YWNrLCIiLEBwcm9nYml0cworIyBlbmRpZgorI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMgYi9yYzMvcnVudGltZS9zcmMvel9MaW51eF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWY0MmQ3MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy96X0xpbnV4X3V0aWwuYwpAQCAtMCwwICsxLDI2NTkgQEAKKy8qCisgKiB6X0xpbnV4X3V0aWwuYyAtLSBwbGF0Zm9ybSBzcGVjaWZpYyByb3V0aW5lcy4KKyAqLworCisKKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisvLworLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorLy8KKy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorLy8KKy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisKKworI2luY2x1ZGUgImttcC5oIgorI2luY2x1ZGUgImttcF93cmFwcGVyX2dldHBpZC5oIgorI2luY2x1ZGUgImttcF9pdHQuaCIKKyNpbmNsdWRlICJrbXBfc3RyLmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfbG9jay5oIgorI2luY2x1ZGUgImttcF9pby5oIgorI2luY2x1ZGUgImttcF9zdGF0cy5oIgorI2luY2x1ZGUgImttcF93YWl0X3JlbGVhc2UuaCIKKworI2lmICFLTVBfT1NfRlJFRUJTRCAmJiAhS01QX09TX05FVEJTRAorIyBpbmNsdWRlIDxhbGxvY2EuaD4KKyNlbmRpZgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPG1hdGguaD4gICAgICAgICAgICAgICAvLyBIVUdFX1ZBTC4KKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHN5cy90aW1lcy5oPgorI2luY2x1ZGUgPHN5cy9yZXNvdXJjZS5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisKKyNpZiBLTVBfT1NfTElOVVggJiYgIUtNUF9PU19DTksKKyMgaW5jbHVkZSA8c3lzL3N5c2luZm8uaD4KKyMgaWYgS01QX1VTRV9GVVRFWAorLy8gV2Ugc2hvdWxkIHJlYWxseSBpbmNsdWRlIDxmdXRleC5oPiwgYnV0IHRoYXQgY2F1c2VzIGNvbXBhdGliaWxpdHkgcHJvYmxlbXMgb24gZGlmZmVyZW50CisvLyBMaW51eCogT1MgZGlzdHJpYnV0aW9ucyB0aGF0IGVpdGhlciByZXF1aXJlIHRoYXQgeW91IGluY2x1ZGUgKG9yIGJyZWFrIHdoZW4geW91IHRyeSB0byBpbmNsdWRlKQorLy8gPHBjaS90eXBlcy5oPi4KKy8vIFNpbmNlIGFsbCB3ZSBuZWVkIGlzIHRoZSB0d28gbWFjcm9zIGJlbG93ICh3aGljaCBhcmUgcGFydCBvZiB0aGUga2VybmVsIEFCSSwgc28gY2FuJ3QgY2hhbmdlKQorLy8gd2UganVzdCBkZWZpbmUgdGhlIGNvbnN0YW50cyBoZXJlIGFuZCBkb24ndCBpbmNsdWRlIDxmdXRleC5oPgorIyAgaWZuZGVmIEZVVEVYX1dBSVQKKyMgICBkZWZpbmUgRlVURVhfV0FJVCAgICAwCisjICBlbmRpZgorIyAgaWZuZGVmIEZVVEVYX1dBS0UKKyMgICBkZWZpbmUgRlVURVhfV0FLRSAgICAxCisjICBlbmRpZgorIyBlbmRpZgorI2VsaWYgS01QX09TX0RBUldJTgorIyBpbmNsdWRlIDxzeXMvc3lzY3RsLmg+CisjIGluY2x1ZGUgPG1hY2gvbWFjaC5oPgorI2VsaWYgS01QX09TX0ZSRUVCU0QKKyMgaW5jbHVkZSA8cHRocmVhZF9ucC5oPgorI2VuZGlmCisKKyNpbmNsdWRlIDxkaXJlbnQuaD4KKyNpbmNsdWRlIDxjdHlwZS5oPgorI2luY2x1ZGUgPGZjbnRsLmg+CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0cnVjdCBrbXBfc3lzX3RpbWVyIHsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0YXJ0OworfTsKKworLy8gQ29udmVydCB0aW1lc3BlYyB0byBuYW5vc2Vjb25kcy4KKyNkZWZpbmUgVFMyTlModGltZXNwZWMpICgoKHRpbWVzcGVjKS50dl9zZWMgKiAxZTkpICsgKHRpbWVzcGVjKS50dl9uc2VjKQorCitzdGF0aWMgc3RydWN0IGttcF9zeXNfdGltZXIgX19rbXBfc3lzX3RpbWVyX2RhdGE7CisKKyNpZiBLTVBfSEFORExFX1NJR05BTFMKKyAgICB0eXBlZGVmIHZvaWQgICAgICAgICAgICAgICAgICAgICAgICAgICAgKCogc2lnX2Z1bmNfdCApKCBpbnQgKTsKKyAgICBTVEFUSUNfRUZJMl9XT1JLQVJPVU5EIHN0cnVjdCBzaWdhY3Rpb24gICAgX19rbXBfc2lnaGxkcnNbIE5TSUcgXTsKKyAgICBzdGF0aWMgc2lnc2V0X3QgICAgICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc2lnc2V0OworI2VuZGlmCisKK3N0YXRpYyBpbnQgX19rbXBfaW5pdF9ydW50aW1lICAgPSBGQUxTRTsKKworc3RhdGljIGludCBfX2ttcF9mb3JrX2NvdW50ID0gMDsKKworc3RhdGljIHB0aHJlYWRfY29uZGF0dHJfdCAgX19rbXBfc3VzcGVuZF9jb25kX2F0dHI7CitzdGF0aWMgcHRocmVhZF9tdXRleGF0dHJfdCBfX2ttcF9zdXNwZW5kX211dGV4X2F0dHI7CisKK3N0YXRpYyBrbXBfY29uZF9hbGlnbl90ICAgIF9fa21wX3dhaXRfY3Y7CitzdGF0aWMga21wX211dGV4X2FsaWduX3QgICBfX2ttcF93YWl0X214OworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWZkZWYgREVCVUdfU1VTUEVORAorc3RhdGljIHZvaWQKK19fa21wX3ByaW50X2NvbmQoIGNoYXIgKmJ1ZmZlciwga21wX2NvbmRfYWxpZ25fdCAqY29uZCApCit7CisgICAgS01QX1NOUFJJTlRGKCBidWZmZXIsIDEyOCwgIihjb25kIChsb2NrICglbGQsICVkKSksIChkZXNjciAoJXApKSkiLAorICAgICAgICAgICAgICAgICAgICAgIGNvbmQtPmNfY29uZC5fX2NfbG9jay5fX3N0YXR1cywgY29uZC0+Y19jb25kLl9fY19sb2NrLl9fc3BpbmxvY2ssCisgICAgICAgICAgICAgICAgICAgICAgY29uZC0+Y19jb25kLl9fY193YWl0aW5nICk7Cit9CisjZW5kaWYKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmICggS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQpCisKKy8qCisgKiBBZmZpbml0eSBzdXBwb3J0CisgKi8KKworLyoKKyAqIE9uIHNvbWUgb2YgdGhlIG9sZGVyIE9TJ3MgdGhhdCB3ZSBidWlsZCBvbiwgdGhlc2UgY29uc3RhbnRzIGFyZW4ndCBwcmVzZW50CisgKiBpbiA8YXNtL3VuaXN0ZC5oPiAjaW5jbHVkZWQgZnJvbSA8c3lzLnN5c2NhbGwuaD4uICBUaGV5IG11c3QgYmUgdGhlIHNhbWUgb24KKyAqIGFsbCBzeXN0ZW1zIG9mIHRoZSBzYW1lIGFyY2ggd2hlcmUgdGhleSBhcmUgZGVmaW5lZCwgYW5kIHRoZXkgY2Fubm90IGNoYW5nZS4KKyAqIHN0b25lIGZvcmV2ZXIuCisgKi8KKworIyAgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX0FSTQorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyNDEKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjQxCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjQyCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDI0MgorIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfQUFSQ0g2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAxMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMTIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMTIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDEyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKyMgIGVsaWYgS01QX0FSQ0hfWDg2XzY0CisjICAgaWZuZGVmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkKKyMgICAgZGVmaW5lIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIDIwMworIyAgIGVsaWYgX19OUl9zY2hlZF9zZXRhZmZpbml0eSAhPSAyMDMKKyMgICAgZXJyb3IgV3JvbmcgY29kZSBmb3Igc2V0YWZmaW5pdHkgc3lzdGVtIGNhbGwuCisjICAgZW5kaWYgLyogX19OUl9zY2hlZF9zZXRhZmZpbml0eSAqLworIyAgIGlmbmRlZiBfX05SX3NjaGVkX2dldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX2dldGFmZmluaXR5ICAyMDQKKyMgICBlbGlmIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgIT0gMjA0CisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHkgKi8KKworIyAgZWxpZiBLTVBfQVJDSF9QUEM2NAorIyAgIGlmbmRlZiBfX05SX3NjaGVkX3NldGFmZmluaXR5CisjICAgIGRlZmluZSBfX05SX3NjaGVkX3NldGFmZmluaXR5ICAyMjIKKyMgICBlbGlmIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgIT0gMjIyCisjICAgIGVycm9yIFdyb25nIGNvZGUgZm9yIHNldGFmZmluaXR5IHN5c3RlbSBjYWxsLgorIyAgIGVuZGlmIC8qIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHkgKi8KKyMgICBpZm5kZWYgX19OUl9zY2hlZF9nZXRhZmZpbml0eQorIyAgICBkZWZpbmUgX19OUl9zY2hlZF9nZXRhZmZpbml0eSAgMjIzCisjICAgZWxpZiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICE9IDIyMworIyAgICBlcnJvciBXcm9uZyBjb2RlIGZvciBnZXRhZmZpbml0eSBzeXN0ZW0gY2FsbC4KKyMgICBlbmRpZiAvKiBfX05SX3NjaGVkX2dldGFmZmluaXR5ICovCisKKworIyAgZWxzZQorIyAgIGVycm9yIFVua25vd24gb3IgdW5zdXBwb3J0ZWQgYXJjaGl0ZWN0dXJlCisKKyMgIGVuZGlmIC8qIEtNUF9BUkNIXyogKi8KKworaW50CitfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCBrbXBfYWZmaW5fbWFza190IGNvbnN0ICptYXNrLCBpbnQgYWJvcnRfb25fZXJyb3IgKQoreworICAgIEtNUF9BU1NFUlQyKEtNUF9BRkZJTklUWV9DQVBBQkxFKCksCisgICAgICAiSWxsZWdhbCBzZXQgYWZmaW5pdHkgb3BlcmF0aW9uIHdoZW4gbm90IGNhcGFibGUiKTsKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgaW50IHJldHZhbCA9IGh3bG9jX3NldF9jcHViaW5kKF9fa21wX2h3bG9jX3RvcG9sb2d5LCAoaHdsb2NfY3B1c2V0X3QpbWFzaywgSFdMT0NfQ1BVQklORF9USFJFQUQpOworI2Vsc2UKKyAgICBpbnQgcmV0dmFsID0gc3lzY2FsbCggX19OUl9zY2hlZF9zZXRhZmZpbml0eSwgMCwgX19rbXBfYWZmaW5fbWFza19zaXplLCBtYXNrICk7CisjZW5kaWYKKyAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworfQorCitpbnQKK19fa21wX2dldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIGdldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisjaWYgS01QX1VTRV9IV0xPQworICAgIGludCByZXR2YWwgPSBod2xvY19nZXRfY3B1YmluZChfX2ttcF9od2xvY190b3BvbG9neSwgKGh3bG9jX2NwdXNldF90KW1hc2ssIEhXTE9DX0NQVUJJTkRfVEhSRUFEKTsKKyNlbHNlCisgICAgaW50IHJldHZhbCA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfZ2V0YWZmaW5pdHksIDAsIF9fa21wX2FmZmluX21hc2tfc2l6ZSwgbWFzayApOworI2VuZGlmCisgICAgaWYgKHJldHZhbCA+PSAwKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0KKyAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggRmF0YWxTeXNFcnJvciApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorICAgIHJldHVybiBlcnJvcjsKK30KKwordm9pZAorX19rbXBfYWZmaW5pdHlfYmluZF90aHJlYWQoIGludCB3aGljaCApCit7CisgICAgS01QX0FTU0VSVDIoS01QX0FGRklOSVRZX0NBUEFCTEUoKSwKKyAgICAgICJJbGxlZ2FsIHNldCBhZmZpbml0eSBvcGVyYXRpb24gd2hlbiBub3QgY2FwYWJsZSIpOworCisgICAga21wX2FmZmluX21hc2tfdCAqbWFzazsKKyAgICBLTVBfQ1BVX0FMTE9DX09OX1NUQUNLKG1hc2spOworICAgIEtNUF9DUFVfWkVSTyhtYXNrKTsKKyAgICBLTVBfQ1BVX1NFVCh3aGljaCwgbWFzayk7CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKK30KKworLyoKKyAqIERldGVybWluZSBpZiB3ZSBjYW4gYWNjZXNzIGFmZmluaXR5IGZ1bmN0aW9uYWxpdHkgb24gdGhpcyB2ZXJzaW9uIG9mCisgKiBMaW51eCogT1MgYnkgY2hlY2tpbmcgX19OUl9zY2hlZF97Z2V0LHNldH1hZmZpbml0eSBzeXN0ZW0gY2FsbHMsIGFuZCBzZXQKKyAqIF9fa21wX2FmZmluX21hc2tfc2l6ZSB0byB0aGUgYXBwcm9wcmlhdGUgdmFsdWUgKDAgbWVhbnMgbm90IGNhcGFibGUpLgorICovCit2b2lkCitfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZShjb25zdCBjaGFyICplbnZfdmFyKQoreworICAgIC8vCisgICAgLy8gQ2hlY2sgYW5kIHNlZSBpZiB0aGUgT1Mgc3VwcG9ydHMgdGhyZWFkIGFmZmluaXR5LgorICAgIC8vCisKKyMgZGVmaW5lIEtNUF9DUFVfU0VUX1NJWkVfTElNSVQgICAgICAgICAgKDEwMjQqMTAyNCkKKworICAgIGludCBnQ29kZTsKKyAgICBpbnQgc0NvZGU7CisgICAga21wX2FmZmluX21hc2tfdCAqYnVmOworICAgIGJ1ZiA9ICgga21wX2FmZmluX21hc2tfdCAqICkgS01QX0lOVEVSTkFMX01BTExPQyggS01QX0NQVV9TRVRfU0laRV9MSU1JVCApOworCisgICAgLy8gSWYgTGludXgqIE9TOgorICAgIC8vIElmIHRoZSBzeXNjYWxsIGZhaWxzIG9yIHJldHVybnMgYSBzdWdnZXN0aW9uIGZvciB0aGUgc2l6ZSwKKyAgICAvLyB0aGVuIHdlIGRvbid0IGhhdmUgdG8gc2VhcmNoIGZvciBhbiBhcHByb3ByaWF0ZSBzaXplLgorICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgS01QX0NQVV9TRVRfU0laRV9MSU1JVCwgYnVmICk7CisgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgImluaXRpYWwgZ2V0YWZmaW5pdHkgY2FsbCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgIGdDb2RlLCBlcnJubykpOworCisgICAgLy9pZiAoKGdDb2RlIDwgMCkgJiYgKGVycm5vID09IEVOT1NZUykpCisgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAvLworICAgICAgICAvLyBTeXN0ZW0gY2FsbCBub3Qgc3VwcG9ydGVkCisgICAgICAgIC8vCisgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGVmYXVsdCkKKyAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBHZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfQorICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIGlmIChnQ29kZSA+IDApIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgLy8gVGhlIG9wdGltYWwgc2l0dWF0aW9uOiB0aGUgT1MgcmV0dXJucyB0aGUgc2l6ZSBvZiB0aGUgYnVmZmVyCisgICAgICAgIC8vIGl0IGV4cGVjdHMuCisgICAgICAgIC8vCisgICAgICAgIC8vIEEgdmVyaWZpY2F0aW9uIG9mIGNvcnJlY3QgYmVoYXZpb3IgaXMgdGhhdCBJc2V0YWZmaW5pdHkgb24gYSBOVUxMCisgICAgICAgIC8vIGJ1ZmZlciB3aXRoIHRoZSBzYW1lIHNpemUgZmFpbHMgd2l0aCBlcnJubyBzZXQgdG8gRUZBVUxULgorICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgfQorICAgICAgICAgICAgaWYgKGVycm5vID09IEVGQVVMVCkgeworICAgICAgICAgICAgICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoZ0NvZGUpOworICAgICAgICAgICAgICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgICAgICAgImFmZmluaXR5IHN1cHBvcnRlZCAobWFzayBzaXplICVkKVxuIiwKKyAgICAgICAgICAgICAgICAgIChpbnQpX19rbXBfYWZmaW5fbWFza19zaXplKSk7CisgICAgICAgICAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyAgICAvLworICAgIC8vIENhbGwgdGhlIGdldGFmZmluaXR5IHN5c3RlbSBjYWxsIHJlcGVhdGVkbHkgd2l0aCBpbmNyZWFzaW5nIHNldCBzaXplcworICAgIC8vIHVudGlsIHdlIHN1Y2NlZWQsIG9yIHJlYWNoIGFuIHVwcGVyIGJvdW5kIG9uIHRoZSBzZWFyY2guCisgICAgLy8KKyAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJzZWFyY2hpbmcgZm9yIHByb3BlciBzZXQgc2l6ZVxuIikpOworICAgIGludCBzaXplOworICAgIGZvciAoc2l6ZSA9IDE7IHNpemUgPD0gS01QX0NQVV9TRVRfU0laRV9MSU1JVDsgc2l6ZSAqPSAyKSB7CisgICAgICAgIGdDb2RlID0gc3lzY2FsbCggX19OUl9zY2hlZF9nZXRhZmZpbml0eSwgMCwgIHNpemUsIGJ1ZiApOworICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAiZ2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLCBzaXplLAorICAgICAgICAgICAgZ0NvZGUsIGVycm5vKSk7CisKKyAgICAgICAgaWYgKGdDb2RlIDwgMCkgeworICAgICAgICAgICAgaWYgKCBlcnJubyA9PSBFTk9TWVMgKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgLy8gV2Ugc2hvdWxkbid0IGdldCBoZXJlCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgzMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJpbmNvbnNpc3RlbnQgT1MgY2FsbCBiZWhhdmlvcjogZXJybm8gPT0gRU5PU1lTIGZvciBtYXNrIHNpemUgJWRcbiIsCisgICAgICAgICAgICAgICAgICAgc2l6ZSkpOworICAgICAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlIHx8IChfX2ttcF9hZmZpbml0eV93YXJuaW5ncworICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfbm9uZSkKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X2RlZmF1bHQpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kaXNhYmxlZCkpKSB7CisgICAgICAgICAgICAgICAgICAgIGludCBlcnJvciA9IGVycm5vOworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIEdldEFmZlN5c0NhbGxOb3RTdXBwb3J0ZWQsIGVudl92YXIgKSwKKyAgICAgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRElTQUJMRSgpOworICAgICAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKGJ1Zik7CisgICAgICAgICAgICAgICAgcmV0dXJuOworICAgICAgICAgICAgfQorICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKworICAgICAgICBzQ29kZSA9IHN5c2NhbGwoIF9fTlJfc2NoZWRfc2V0YWZmaW5pdHksIDAsIGdDb2RlLCBOVUxMICk7CisgICAgICAgIEtBX1RSQUNFKDMwLCAoICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAic2V0YWZmaW5pdHkgZm9yIG1hc2sgc2l6ZSAlZCByZXR1cm5lZCAlZCBlcnJubyA9ICVkXG4iLAorICAgICAgICAgICBnQ29kZSwgc0NvZGUsIGVycm5vKSk7CisgICAgICAgIGlmIChzQ29kZSA8IDApIHsKKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFTk9TWVMpIHsgLy8gTGludXgqIE9TIG9ubHkKKyAgICAgICAgICAgICAgICAvLworICAgICAgICAgICAgICAgIC8vIFdlIHNob3VsZG4ndCBnZXQgaGVyZQorICAgICAgICAgICAgICAgIC8vCisgICAgICAgICAgICAgICAgS0FfVFJBQ0UoMzAsICggIl9fa21wX2FmZmluaXR5X2RldGVybWluZV9jYXBhYmxlOiAiCisgICAgICAgICAgICAgICAgICAiaW5jb25zaXN0ZW50IE9TIGNhbGwgYmVoYXZpb3I6IGVycm5vID09IEVOT1NZUyBmb3IgbWFzayBzaXplICVkXG4iLAorICAgICAgICAgICAgICAgICAgIHNpemUpKTsKKyAgICAgICAgICAgICAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICAgICAgICAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAgICAgICAgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgICAgICAgICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBTZXRBZmZTeXNDYWxsTm90U3VwcG9ydGVkLCBlbnZfdmFyICksCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGlmIChlcnJubyA9PSBFRkFVTFQpIHsKKyAgICAgICAgICAgICAgICBLTVBfQUZGSU5JVFlfRU5BQkxFKGdDb2RlKTsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICAgICAgICAgICAgICJhZmZpbml0eSBzdXBwb3J0ZWQgKG1hc2sgc2l6ZSAlZClcbiIsCisgICAgICAgICAgICAgICAgICAgKGludClfX2ttcF9hZmZpbl9tYXNrX3NpemUpKTsKKyAgICAgICAgICAgICAgICBLTVBfSU5URVJOQUxfRlJFRShidWYpOworICAgICAgICAgICAgICAgIHJldHVybjsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICAvL2ludCBlcnJvciA9IGVycm5vOyAgLy8gc2F2ZSB1bmNhdWdodCBlcnJvciBjb2RlCisgICAgS01QX0lOVEVSTkFMX0ZSRUUoYnVmKTsKKyAgICAvLyBlcnJubyA9IGVycm9yOyAgLy8gcmVzdG9yZSB1bmNhdWdodCBlcnJvciBjb2RlLCB3aWxsIGJlIHByaW50ZWQgYXQgdGhlIG5leHQgS01QX1dBUk5JTkcgYmVsb3cKKworICAgIC8vCisgICAgLy8gQWZmaW5pdHkgaXMgbm90IHN1cHBvcnRlZAorICAgIC8vCisgICAgS01QX0FGRklOSVRZX0RJU0FCTEUoKTsKKyAgICBLQV9UUkFDRSgxMCwgKCAiX19rbXBfYWZmaW5pdHlfZGV0ZXJtaW5lX2NhcGFibGU6ICIKKyAgICAgICJjYW5ub3QgZGV0ZXJtaW5lIG1hc2sgc2l6ZSAtIGFmZmluaXR5IG5vdCBzdXBwb3J0ZWRcbiIpKTsKKyAgICBpZiAoX19rbXBfYWZmaW5pdHlfdmVyYm9zZSB8fCAoX19rbXBfYWZmaW5pdHlfd2FybmluZ3MKKyAgICAgICYmIChfX2ttcF9hZmZpbml0eV90eXBlICE9IGFmZmluaXR5X25vbmUpCisgICAgICAmJiAoX19rbXBfYWZmaW5pdHlfdHlwZSAhPSBhZmZpbml0eV9kZWZhdWx0KQorICAgICAgJiYgKF9fa21wX2FmZmluaXR5X3R5cGUgIT0gYWZmaW5pdHlfZGlzYWJsZWQpKSkgeworICAgICAgICBLTVBfV0FSTklORyggQWZmQ2FudEdldE1hc2tTaXplLCBlbnZfdmFyICk7CisgICAgfQorfQorCisjZW5kaWYgLy8gS01QX09TX0xJTlVYICYmIEtNUF9BRkZJTklUWV9TVVBQT1JURUQKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9VU0VfRlVURVgKKworaW50CitfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZSgpCit7CisgICAgaW50IGxvYyA9IDA7CisgICAgaW50IHJjID0gc3lzY2FsbCggX19OUl9mdXRleCwgJmxvYywgRlVURVhfV0FLRSwgMSwgTlVMTCwgTlVMTCwgMCApOworICAgIGludCByZXR2YWwgPSAoIHJjID09IDAgKSB8fCAoIGVycm5vICE9IEVOT1NZUyApOworCisgICAgS0FfVFJBQ0UoMTAsICggIl9fa21wX2Z1dGV4X2RldGVybWluZV9jYXBhYmxlOiByYyA9ICVkIGVycm5vID0gJWRcbiIsIHJjLAorICAgICAgZXJybm8gKSApOworICAgIEtBX1RSQUNFKDEwLCAoICJfX2ttcF9mdXRleF9kZXRlcm1pbmVfY2FwYWJsZTogZnV0ZXggc3lzY2FsbCVzIHN1cHBvcnRlZFxuIiwKKyAgICAgICAgcmV0dmFsID8gIiIgOiAiIG5vdCIgKSApOworCisgICAgcmV0dXJuIHJldHZhbDsKK30KKworI2VuZGlmIC8vIEtNUF9VU0VfRlVURVgKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KSAmJiAoISBLTVBfQVNNX0lOVFJJTlMpCisvKgorICogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIEtNUF9DT01QQVJFX0FORF9TVE9SRV9SRUw4ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FuZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50OCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl8xKCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQzMgorX19rbXBfdGVzdF90aGVuX29yMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKQoreworICAgIGttcF9pbnQzMiBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMMzIgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyMgaWYgS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1BQQzY0IHx8IChLTVBfT1NfTElOVVggJiYgS01QX0FSQ0hfQUFSQ0g2NCkKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fYWRkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKQoreworICAgIGttcF9pbnQ4IG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICsgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDY0CitfX2ttcF90ZXN0X3RoZW5fYWRkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKQoreworICAgIGttcF9pbnQ2NCBvbGRfdmFsdWUsIG5ld192YWx1ZTsKKworICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisKKyAgICB3aGlsZSAoICEgS01QX0NPTVBBUkVfQU5EX1NUT1JFX1JFTDY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorIyBlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfUFBDNjQgfHwgKEtNUF9PU19MSU5VWCAmJiBLTVBfQVJDSF9BQVJDSDY0KSAqLworCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSB8IGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBLTVBfQ09NUEFSRV9BTkRfU1RPUkVfUkVMNjQgKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzgoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSAmIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkgJiYgKCEgS01QX0FTTV9JTlRSSU5TKSAqLworCit2b2lkCitfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAgaW50IHN0YXR1czsKKyAgICBrbXBfaW5mb190ICAqdGggPSBfX2ttcF90aHJlYWRzWyBndGlkIF07CisKKyAgICBpZiAoICF0aCApIHJldHVybjsKKworICAgICNpZmRlZiBLTVBfQ0FOQ0VMX1RIUkVBRFMKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3Rlcm1pbmF0ZV90aHJlYWQ6IGtpbGwgKCVkKVxuIiwgZ3RpZCApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY2FuY2VsKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCAmJiBzdGF0dXMgIT0gRVNSQ0ggKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRUZXJtaW5hdGVXb3JrZXJUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAjZW5kaWYKKyAgICBfX2ttcF95aWVsZCggVFJVRSApOworfSAvLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisvKgorICogU2V0IHRocmVhZCBzdGFjayBpbmZvIGFjY29yZGluZyB0byB2YWx1ZXMgcmV0dXJuZWQgYnkKKyAqIHB0aHJlYWRfZ2V0YXR0cl9ucCgpLgorICogSWYgdmFsdWVzIGFyZSB1bnJlYXNvbmFibGUsIGFzc3VtZSBjYWxsIGZhaWxlZCBhbmQgdXNlCisgKiBpbmNyZW1lbnRhbCBzdGFjayByZWZpbmVtZW50IG1ldGhvZCBpbnN0ZWFkLgorICogUmV0dXJucyBUUlVFIGlmIHRoZSBzdGFjayBwYXJhbWV0ZXJzIGNvdWxkIGJlIGRldGVybWluZWQgZXhhY3RseSwKKyAqIEZBTFNFIGlmIGluY3JlbWVudGFsIHJlZmluZW1lbnQgaXMgbmVjZXNzYXJ5LgorICovCitzdGF0aWMga21wX2ludDMyCitfX2ttcF9zZXRfc3RhY2tfaW5mbyggaW50IGd0aWQsIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgICBzdGFja19kYXRhOworI2lmIEtNUF9PU19MSU5VWCB8fCBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgLyogTGludXgqIE9TIG9ubHkgLS0gbm8gcHRocmVhZF9nZXRhdHRyX25wIHN1cHBvcnQgb24gT1MgWCogKi8KKyAgICBwdGhyZWFkX2F0dHJfdCBhdHRyOworICAgIGludCAgICAgICAgICAgIHN0YXR1czsKKyAgICBzaXplX3QgICAgICAgICBzaXplID0gMDsKKyAgICB2b2lkICogICAgICAgICBhZGRyID0gMDsKKworICAgIC8qIEFsd2F5cyBkbyBpbmNyZW1lbnRhbCBzdGFjayByZWZpbmVtZW50IGZvciB1YmVybWFzdGVyIHRocmVhZHMgc2luY2UgdGhlIGluaXRpYWwKKyAgICAgICB0aHJlYWQgc3RhY2sgcmFuZ2UgY2FuIGJlIHJlZHVjZWQgYnkgc2libGluZyB0aHJlYWQgY3JlYXRpb24gc28gcHRocmVhZF9hdHRyX2dldHN0YWNrCisgICAgICAgbWF5IGNhdXNlIHRocmVhZCBndGlkIGFsaWFzaW5nICovCisgICAgaWYgKCAhIEtNUF9VQkVSX0dUSUQoZ3RpZCkgKSB7CisKKyAgICAgICAgLyogRmV0Y2ggdGhlIHJlYWwgdGhyZWFkIGF0dHJpYnV0ZXMgKi8KKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2luaXQoICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2luaXQiLCBzdGF0dXMgKTsKKyNpZiBLTVBfT1NfRlJFRUJTRCB8fCBLTVBfT1NfTkVUQlNECisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9nZXRfbnAoIHB0aHJlYWRfc2VsZigpLCAmYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRfbnAiLCBzdGF0dXMgKTsKKyNlbHNlCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfZ2V0YXR0cl9ucCggcHRocmVhZF9zZWxmKCksICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9nZXRhdHRyX25wIiwgc3RhdHVzICk7CisjZW5kaWYKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrKCAmYXR0ciwgJmFkZHIsICZzaXplICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2dldHN0YWNrIiwgc3RhdHVzICk7CisgICAgICAgIEtBX1RSQUNFKCA2MCwgKCAiX19rbXBfc2V0X3N0YWNrX2luZm86IFQjJWQgcHRocmVhZF9hdHRyX2dldHN0YWNrIHJldHVybmVkIHNpemU6ICVsdSwgIgorICAgICAgICAgICAgICAgICAgICAgICAgImxvdyBhZGRyOiAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHNpemUsIGFkZHIgKSk7CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICZhdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9hdHRyX2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICB9CisKKyAgICBpZiAoIHNpemUgIT0gMCAmJiBhZGRyICE9IDAgKSB7ICAgICAvKiB3YXMgc3RhY2sgcGFyYW1ldGVyIGRldGVybWluYXRpb24gc3VjY2Vzc2Z1bD8gKi8KKyAgICAgICAgLyogU3RvcmUgdGhlIGNvcnJlY3QgYmFzZSBhbmQgc2l6ZSAqLworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgKCgoY2hhciAqKWFkZHIpICsgc2l6ZSkpOworICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgc2l6ZSk7CisgICAgICAgIFRDV180KHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdywgRkFMU0UpOworICAgICAgICByZXR1cm4gVFJVRTsKKyAgICB9CisjZW5kaWYgLyogS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QgKi8KKyAgICAvKiBVc2UgaW5jcmVtZW50YWwgcmVmaW5lbWVudCBzdGFydGluZyBmcm9tIGluaXRpYWwgY29uc2VydmF0aXZlIGVzdGltYXRlICovCisgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIDApOworICAgIFRDV19QVFIodGggLT4gdGgudGhfaW5mby5kcy5kc19zdGFja2Jhc2UsICZzdGFja19kYXRhKTsKKyAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgIHJldHVybiBGQUxTRTsKK30KKworc3RhdGljIHZvaWQqCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICp0aHIgKQoreworICAgIGludCBzdGF0dXMsIG9sZF90eXBlLCBvbGRfc3RhdGU7CisjaWZkZWYgS01QX0JMT0NLX1NJR05BTFMKKyAgICBzaWdzZXRfdCAgICBuZXdfc2V0LCBvbGRfc2V0OworI2VuZGlmIC8qIEtNUF9CTE9DS19TSUdOQUxTICovCisgICAgdm9pZCAqZXhpdF92YWw7CisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICB2b2lkICogdm9sYXRpbGUgcGFkZGluZyA9IDA7CisjZW5kaWYKKyAgICBpbnQgZ3RpZDsKKworICAgIGd0aWQgPSAoKGttcF9pbmZvX3QqKXRocikgLT4gdGgudGhfaW5mby5kcy5kc19ndGlkOworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBndGlkICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0IF9fdGhyZWFkIGxvY2FsIGluZGV4IHRvIHBvaW50IHRvIHRocmVhZC1zcGVjaWZpYyBzdGF0cworICAgIF9fa21wX3N0YXRzX3RocmVhZF9wdHIgPSAoKGttcF9pbmZvX3QqKXRociktPnRoLnRoX3N0YXRzOworICAgIEtNUF9TVEFSVF9FWFBMSUNJVF9USU1FUihPTVBfd29ya2VyX3RocmVhZF9saWZlKTsKKyAgICBLTVBfU0VUX1RIUkVBRF9TVEFURShJRExFKTsKKyAgICBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMoT01QX2lkbGUpOworI2VuZGlmCisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9uYW1lKCBndGlkICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisjaWYgS01QX0FGRklOSVRZX1NVUFBPUlRFRAorICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisjZW5kaWYKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfQkxPQ0ssICYgbmV3X3NldCwgJiBvbGRfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKyAgICBpZiAoIF9fa21wX3N0a29mZnNldCA+IDAgJiYgZ3RpZCA+IDAgKSB7CisgICAgICAgIHBhZGRpbmcgPSBLTVBfQUxMT0NBKCBndGlkICogX19rbXBfc3Rrb2Zmc2V0ICk7CisgICAgfQorI2VuZGlmCisKKyAgICBLTVBfTUIoKTsKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgKGttcF9pbmZvX3QqKXRociApOworCisgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggKGttcF9pbmZvX3QqKXRociApOworCisgICAgZXhpdF92YWwgPSBfX2ttcF9sYXVuY2hfdGhyZWFkKCAoa21wX2luZm9fdCAqKSB0aHIgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfU0VUTUFTSywgJiBvbGRfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgcmV0dXJuIGV4aXRfdmFsOworfQorCisvKiBUaGUgbW9uaXRvciB0aHJlYWQgY29udHJvbHMgYWxsIG9mIHRoZSB0aHJlYWRzIGluIHRoZSBjb21wbGV4ICovCisKK3N0YXRpYyB2b2lkKgorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKnRociApCit7CisgICAgaW50ICAgICAgICAgc3RhdHVzLCBvbGRfdHlwZSwgb2xkX3N0YXRlOworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc2lnc2V0X3QgICAgbmV3X3NldDsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworICAgIHN0cnVjdCB0aW1lc3BlYyAgaW50ZXJ2YWw7CisgICAgaW50IHlpZWxkX2NvdW50OworICAgIGludCB5aWVsZF9jeWNsZXMgPSAwOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICMxIGxhdW5jaGVkXG4iICkgKTsKKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIHRoZSBtb25pdG9yIHRocmVhZCAqLworICAgIF9fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBLTVBfR1RJRF9NT05JVE9SICk7CisjaWZkZWYgS01QX1REQVRBX0dUSUQKKyAgICBfX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisgICAgS01QX01CKCk7CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X3RocmVhZF9pZ25vcmUoKTsgICAgLy8gSW5zdHJ1Y3QgSW50ZWwoUikgVGhyZWFkaW5nIFRvb2xzIHRvIGlnbm9yZSBtb25pdG9yIHRocmVhZC4KKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggKChrbXBfaW5mb190Kil0aHIpLT50aC50aF9pbmZvLmRzLmRzX2d0aWQsIChrbXBfaW5mb190Kil0aHIgKTsKKworICAgIF9fa21wX2NoZWNrX3N0YWNrX292ZXJsYXAoIChrbXBfaW5mb190Kil0aHIgKTsKKworI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2VsdHlwZSggUFRIUkVBRF9DQU5DRUxfQVNZTkNIUk9OT1VTLCAmIG9sZF90eXBlICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHR5cGUiLCBzdGF0dXMgKTsKKyAgICAvKiBqb3NoIHRvZG86IGlzbid0IFBUSFJFQURfQ0FOQ0VMX0VOQUJMRSBkZWZhdWx0IGZvciBuZXdseS1jcmVhdGVkIHRocmVhZHM/ICovCisgICAgc3RhdHVzID0gcHRocmVhZF9zZXRjYW5jZWxzdGF0ZSggUFRIUkVBRF9DQU5DRUxfRU5BQkxFLCAmIG9sZF9zdGF0ZSApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9zZXRjYW5jZWxzdGF0ZSIsIHN0YXR1cyApOworI2VuZGlmCisKKyAgICAjaWYgS01QX1JFQUxfVElNRV9GSVgKKyAgICAvLyBUaGlzIGlzIGEgcG90ZW50aWFsIGZpeCB3aGljaCBhbGxvd3MgYXBwbGljYXRpb24gd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3kgd29yay4KKyAgICAvLyBIb3dldmVyLCBkZWNpc2lvbiBhYm91dCB0aGUgZml4IGlzIG5vdCBtYWRlIHlldCwgc28gaXQgaXMgZGlzYWJsZWQgYnkgZGVmYXVsdC4KKyAgICB7IC8vIEFyZSBwcm9ncmFtIHN0YXJ0ZWQgd2l0aCByZWFsLXRpbWUgc2NoZWR1bGluZyBwb2xpY3k/CisgICAgICAgIGludCBzY2hlZCA9IHNjaGVkX2dldHNjaGVkdWxlciggMCApOworICAgICAgICBpZiAoIHNjaGVkID09IFNDSEVEX0ZJRk8gfHwgc2NoZWQgPT0gU0NIRURfUlIgKSB7CisgICAgICAgICAgICAvLyBZZXMsIHdlIGFyZSBhIHBhcnQgb2YgcmVhbC10aW1lIGFwcGxpY2F0aW9uLiBUcnkgdG8gaW5jcmVhc2UgdGhlIHByaW9yaXR5IG9mIHRoZQorICAgICAgICAgICAgLy8gbW9uaXRvci4KKyAgICAgICAgICAgIHN0cnVjdCBzY2hlZF9wYXJhbSBwYXJhbTsKKyAgICAgICAgICAgIGludCAgICBtYXhfcHJpb3JpdHkgPSBzY2hlZF9nZXRfcHJpb3JpdHlfbWF4KCBzY2hlZCApOworICAgICAgICAgICAgaW50ICAgIHJjOworICAgICAgICAgICAgS01QX1dBUk5JTkcoIFJlYWxUaW1lU2NoZWROb3RTdXBwb3J0ZWQgKTsKKyAgICAgICAgICAgIHNjaGVkX2dldHBhcmFtKCAwLCAmIHBhcmFtICk7CisgICAgICAgICAgICBpZiAoIHBhcmFtLnNjaGVkX3ByaW9yaXR5IDwgbWF4X3ByaW9yaXR5ICkgeworICAgICAgICAgICAgICAgIHBhcmFtLnNjaGVkX3ByaW9yaXR5ICs9IDE7CisgICAgICAgICAgICAgICAgcmMgPSBzY2hlZF9zZXRzY2hlZHVsZXIoIDAsIHNjaGVkLCAmIHBhcmFtICk7CisgICAgICAgICAgICAgICAgaWYgKCByYyAhPSAwICkgeworICAgICAgICAgICAgICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2hhbmdlTW9uaXRvclByaW9yaXR5ICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBNb25pdG9yV2lsbFN0YXJ2ZSApLAorICAgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCBhYm9ydCBoZXJlLCBiZWNhdXNlIG51bWJlciBvZiBDUFVzIG1heSBiZSBlbm91Z2ggZm9yIGFsbCB0aGUgdGhyZWFkcywKKyAgICAgICAgICAgICAgICAvLyBpbmNsdWRpbmcgdGhlIG1vbml0b3IgdGhyZWFkLCBzbyBhcHBsaWNhdGlvbiBjb3VsZCBwb3RlbnRpYWxseSB3b3JrLi4uCisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyggTW9uaXRvcldpbGxTdGFydmUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggUnVubmluZ0F0TWF4UHJpb3JpdHkgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7ICAvLyBBQzogZnJlZSB0aHJlYWQgdGhhdCB3YWl0cyBmb3IgbW9uaXRvciBzdGFydGVkCisgICAgfQorICAgICNlbmRpZiAvLyBLTVBfUkVBTF9USU1FX0ZJWAorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpZiAoIF9fa21wX21vbml0b3Jfd2FrZXVwcyA9PSAxICkgeworICAgICAgICBpbnRlcnZhbC50dl9zZWMgID0gMTsKKyAgICAgICAgaW50ZXJ2YWwudHZfbnNlYyA9IDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaW50ZXJ2YWwudHZfc2VjICA9IDA7CisgICAgICAgIGludGVydmFsLnR2X25zZWMgPSAoS01QX05TRUNfUEVSX1NFQyAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyk7CisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMiBtb25pdG9yXG4iICkgKTsKKworICAgIGlmIChfX2ttcF95aWVsZF9jeWNsZSkgeworICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDA7ICAvKiBTdGFydCBvdXQgd2l0aCB5aWVsZGluZyBzaHV0IG9mZiAqLworICAgICAgICB5aWVsZF9jb3VudCA9IF9fa21wX3lpZWxkX29mZl9jb3VudDsKKyAgICB9IGVsc2UgeworICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7ICAvKiBZaWVsZGluZyBpcyBvbiBwZXJtYW5lbnRseSAqLworICAgIH0KKworICAgIHdoaWxlKCAhIFRDUl80KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUgKSApIHsKKyAgICAgICAgc3RydWN0IHRpbWVzcGVjICBub3c7CisgICAgICAgIHN0cnVjdCB0aW1ldmFsICAgdHZhbDsKKworICAgICAgICAvKiAgVGhpcyB0aHJlYWQgbW9uaXRvcnMgdGhlIHN0YXRlIG9mIHRoZSBzeXN0ZW0gKi8KKworICAgICAgICBLQV9UUkFDRSggMTUsICggIl9fa21wX2xhdW5jaF9tb25pdG9yOiB1cGRhdGVcbiIgKSApOworCisgICAgICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZub3cgKTsKKworICAgICAgICBub3cudHZfc2VjICArPSBpbnRlcnZhbC50dl9zZWM7CisgICAgICAgIG5vdy50dl9uc2VjICs9IGludGVydmFsLnR2X25zZWM7CisKKyAgICAgICAgaWYgKG5vdy50dl9uc2VjID49IEtNUF9OU0VDX1BFUl9TRUMpIHsKKyAgICAgICAgICAgIG5vdy50dl9zZWMgICs9IDE7CisgICAgICAgICAgICBub3cudHZfbnNlYyAtPSBLTVBfTlNFQ19QRVJfU0VDOworICAgICAgICB9CisKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworICAgICAgICAvLyBBQzogdGhlIG1vbml0b3Igc2hvdWxkIG5vdCBmYWxsIGFzbGVlcCBpZiBnX2RvbmUgaGFzIGJlZW4gc2V0CisgICAgICAgIGlmICggIVRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkgKSB7ICAvLyBjaGVjayBvbmNlIG1vcmUgdW5kZXIgbXV0ZXgKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF90aW1lZHdhaXQoICZfX2ttcF93YWl0X2N2LmNfY29uZCwgJl9fa21wX3dhaXRfbXgubV9tdXRleCwgJm5vdyApOworICAgICAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN0YXR1cyAhPSBFVElNRURPVVQgJiYgc3RhdHVzICE9IEVJTlRSICkgeworICAgICAgICAgICAgICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF90aW1lZHdhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgICAgICB9OworICAgICAgICAgICAgfTsKKyAgICAgICAgfTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF91bmxvY2soICYgX19rbXBfd2FpdF9teC5tX211dGV4ICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKworICAgICAgICBpZiAoX19rbXBfeWllbGRfY3ljbGUpIHsKKyAgICAgICAgICAgIHlpZWxkX2N5Y2xlcysrOworICAgICAgICAgICAgaWYgKCAoeWllbGRfY3ljbGVzICUgeWllbGRfY291bnQpID09IDAgKSB7CisgICAgICAgICAgICAgICAgaWYgKF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX3lpZWxkaW5nX29uID0gMDsgICAvKiBUdXJuIGl0IG9mZiBub3cgKi8KKyAgICAgICAgICAgICAgICAgICAgeWllbGRfY291bnQgPSBfX2ttcF95aWVsZF9vZmZfY291bnQ7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeWllbGRpbmdfb24gPSAxOyAgIC8qIFR1cm4gaXQgb24gbm93ICovCisgICAgICAgICAgICAgICAgICAgIHlpZWxkX2NvdW50ID0gX19rbXBfeWllbGRfb25fY291bnQ7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIHlpZWxkX2N5Y2xlcyA9IDA7CisgICAgICAgICAgICB9CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBfX2ttcF95aWVsZGluZ19vbiA9IDE7CisgICAgICAgIH0KKworICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsCisgICAgICAgICAgVENSXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKyAxICk7CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjMyBjbGVhbnVwXG4iICkgKTsKKworI2lmZGVmIEtNUF9CTE9DS19TSUdOQUxTCisgICAgc3RhdHVzID0gc2lnZmlsbHNldCggJiBuZXdfc2V0ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJzaWdmaWxsc2V0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9zaWdtYXNrKCBTSUdfVU5CTE9DSywgJiBuZXdfc2V0LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NpZ21hc2siLCBzdGF0dXMgKTsKKyNlbmRpZiAvKiBLTVBfQkxPQ0tfU0lHTkFMUyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiAjNCBmaW5pc2hlZFxuIiApICk7CisKKyAgICBpZiggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwICkgeworICAgICAgICAvKiBub3cgd2UgbmVlZCB0byB0ZXJtaW5hdGUgdGhlIHdvcmtlciB0aHJlYWRzICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzUgdGVybWluYXRlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgLyogdGVybWluYXRlIHRoZSBPcGVuTVAgd29ya2VyIHRocmVhZHMgKi8KKyAgICAgICAgLyogVE9ETyB0aGlzIGlzIG5vdCB2YWxpZCBmb3Igc2libGluZyB0aHJlYWRzISEKKyAgICAgICAgICogdGhlIHViZXIgbWFzdGVyIG1pZ2h0IG5vdCBiZSAwIGFueW1vcmUuLiAqLworICAgICAgICBmb3IgKGd0aWQgPSAxOyBndGlkIDwgX19rbXBfdGhyZWFkc19jYXBhY2l0eTsgKytndGlkKQorICAgICAgICAgICAgX19rbXBfdGVybWluYXRlX3RocmVhZCggZ3RpZCApOworCisgICAgICAgIF9fa21wX2NsZWFudXAoKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfbGF1bmNoX21vbml0b3I6ICM2IHJhaXNlIHNpZz0lZFxuIiwgX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKQorICAgICAgICAgICAgcmFpc2UoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgKTsKKworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogIzcgZXhpdFxuIiApICk7CisKKyAgICByZXR1cm4gdGhyOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBwdGhyZWFkX3QgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgdGhyZWFkX2F0dHI7CisgICAgaW50ICAgICAgICAgICAgc3RhdHVzOworCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworI2lmIEtNUF9TVEFUU19FTkFCTEVECisgICAgLy8gc2V0cyB1cCB3b3JrZXIgdGhyZWFkIHN0YXRzCisgICAgX19rbXBfYWNxdWlyZV90YXNfbG9jaygmX19rbXBfc3RhdHNfbG9jaywgZ3RpZCk7CisKKyAgICAvLyB0aC0+dGgudGhfc3RhdHMgaXMgdXNlZCB0byB0cmFuc2ZlciB0aHJlYWQgc3BlY2lmaWMgc3RhdHMtcG9pbnRlciB0byBfX2ttcF9sYXVuY2hfd29ya2VyCisgICAgLy8gU28gd2hlbiB0aHJlYWQgaXMgY3JlYXRlZCAoZ29lcyBpbnRvIF9fa21wX2xhdW5jaF93b3JrZXIpIGl0IHdpbGwKKyAgICAvLyBzZXQgaXQncyBfX3RocmVhZCBsb2NhbCBwb2ludGVyIHRvIHRoLT50aC50aF9zdGF0cworICAgIHRoLT50aC50aF9zdGF0cyA9IF9fa21wX3N0YXRzX2xpc3QucHVzaF9iYWNrKGd0aWQpOworICAgIGlmKEtNUF9VQkVSX0dUSUQoZ3RpZCkpIHsKKyAgICAgICAgX19rbXBfc3RhdHNfc3RhcnRfdGltZSA9IHRzY190aWNrX2NvdW50Ojpub3coKTsKKyAgICAgICAgX19rbXBfc3RhdHNfdGhyZWFkX3B0ciA9IHRoLT50aC50aF9zdGF0czsKKyAgICAgICAgX19rbXBfc3RhdHNfaW5pdCgpOworICAgICAgICBLTVBfU1RBUlRfRVhQTElDSVRfVElNRVIoT01QX3dvcmtlcl90aHJlYWRfbGlmZSk7CisgICAgICAgIEtNUF9TRVRfVEhSRUFEX1NUQVRFKFNFUklBTF9SRUdJT04pOworICAgICAgICBLTVBfSU5JVF9QQVJUSVRJT05FRF9USU1FUlMoT01QX3NlcmlhbCk7CisgICAgfQorICAgIF9fa21wX3JlbGVhc2VfdGFzX2xvY2soJl9fa21wX3N0YXRzX2xvY2ssIGd0aWQpOworCisjZW5kaWYgLy8gS01QX1NUQVRTX0VOQUJMRUQKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IHViZXIgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworICAgICAgICB0aCAtPiB0aC50aF9pbmZvLmRzLmRzX3RocmVhZCA9IHB0aHJlYWRfc2VsZigpOworICAgICAgICBfX2ttcF9zZXRfc3RhY2tfaW5mbyggZ3RpZCwgdGggKTsKKyAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgcmV0dXJuOworICAgIH07IC8vIGlmCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworI2lmZGVmIEtNUF9USFJFQURfQVRUUgorICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICBpZiAoIHN0YXR1cyAhPSAwICkgeworICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBDYW50SW5pdFRocmVhZEF0dHJzICksIEtNUF9FUlIoIHN0YXR1cyApLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyggQ2FudFNldFdvcmtlclN0YXRlICksIEtNUF9FUlIoIHN0YXR1cyApLCBfX2ttcF9tc2dfbnVsbCk7CisgICAgfTsgLy8gaWYKKworICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuCisgICAgICogVGhlIG11bHRpcGxlIG9mIDIgaXMgdGhlcmUgYmVjYXVzZSBvbiBzb21lIG1hY2hpbmVzLCByZXF1ZXN0aW5nIGFuIHVudXN1YWwgc3RhY2tzaXplCisgICAgICogY2F1c2VzIHRoZSB0aHJlYWQgdG8gaGF2ZSBhbiBvZmZzZXQgYmVmb3JlIHRoZSBkdW1teSBhbGxvY2EoKSB0YWtlcyBwbGFjZSB0byBjcmVhdGUgdGhlCisgICAgICogb2Zmc2V0LiAgU2luY2Ugd2Ugd2FudCB0aGUgdXNlciB0byBoYXZlIGEgc3VmZmljaWVudCBzdGFja3NpemUgQU5EIHN1cHBvcnQgYSBzdGFjayBvZmZzZXQsIHdlCisgICAgICogYWxsb2NhKCkgdHdpY2UgdGhlIG9mZnNldCBzbyB0aGF0IHRoZSB1cGNvbWluZyBhbGxvY2EoKSBkb2VzIG5vdCBlbGltaW5hdGUgYW55IHByZW1hZGUKKyAgICAgKiBvZmZzZXQsIGFuZCBhbHNvIGdpdmVzIHRoZSB1c2VyIHRoZSBzdGFjayBzcGFjZSB0aGV5IHJlcXVlc3RlZCBmb3IgYWxsIHRocmVhZHMgKi8KKyAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKiAyOworCisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBUIyVkLCBkZWZhdWx0IHN0YWNrc2l6ZSA9ICVsdSBieXRlcywgIgorICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgZmluYWwgc3RhY2tzaXplID0gJWx1IGJ5dGVzXG4iLAorICAgICAgICAgICAgICAgICAgICBndGlkLCBLTVBfREVGQVVMVF9TVEtTSVpFLCBfX2ttcF9zdGtzaXplLCBzdGFja19zaXplICkgKTsKKworIyBpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgc3RhY2tfc2l6ZSApOworIyAgaWZkZWYgS01QX0JBQ0tVUF9TVEtTSVpFCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgaWYgKCAhIF9fa21wX2Vudl9zdGtzaXplICkgeworICAgICAgICAgICAgc3RhY2tfc2l6ZSA9IEtNUF9CQUNLVVBfU1RLU0laRSArIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisgICAgICAgICAgICBfX2ttcF9zdGtzaXplID0gS01QX0JBQ0tVUF9TVEtTSVpFOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IFQjJWQsIGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAiX19rbXBfc3Rrc2l6ZSA9ICVsdSBieXRlcywgKGJhY2t1cCkgZmluYWwgc3RhY2tzaXplID0gJWx1ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICJieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9ERUZBVUxUX1NUS1NJWkUsIF9fa21wX3N0a3NpemUsIHN0YWNrX3NpemUgKQorICAgICAgICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0c3RhY2tzaXplKCAmdGhyZWFkX2F0dHIsIHN0YWNrX3NpemUgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICB9OyAvLyBpZgorIyAgZW5kaWYgLyogS01QX0JBQ0tVUF9TVEtTSVpFICovCisgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgX19rbXBfbXNnKGttcF9tc19mYXRhbCwgS01QX01TRyggQ2FudFNldFdvcmtlclN0YWNrU2l6ZSwgc3RhY2tfc2l6ZSApLCBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIENoYW5nZVdvcmtlclN0YWNrU2l6ZSAgKSwgX19rbXBfbXNnX251bGwpOworICAgIH07IC8vIGlmCisjIGVuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgc3RhdHVzID0gcHRocmVhZF9jcmVhdGUoICYgaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfd29ya2VyLCAodm9pZCAqKSB0aCApOworICAgIGlmICggc3RhdHVzICE9IDAgfHwgISBoYW5kbGUgKSB7IC8vID8/PyBXaHkgZG8gd2UgY2hlY2sgaGFuZGxlPz8KKyNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgIGlmICggc3RhdHVzID09IEVJTlZBTCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIENhbnRTZXRXb3JrZXJTdGFja1NpemUsIHN0YWNrX3NpemUgKSwgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgICAgS01QX0hOVCggSW5jcmVhc2VXb3JrZXJTdGFja1NpemUgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9OworICAgICAgICBpZiAoIHN0YXR1cyA9PSBFTk9NRU0gKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coa21wX21zX2ZhdGFsLCBLTVBfTVNHKCBDYW50U2V0V29ya2VyU3RhY2tTaXplLCBzdGFja19zaXplICksIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlV29ya2VyU3RhY2tTaXplICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgfTsKKyNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgICAgIGlmICggc3RhdHVzID09IEVBR0FJTiApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIE5vUmVzb3VyY2VzRm9yV29ya2VyVGhyZWFkICksIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIERlY3JlYXNlX05VTV9USFJFQURTICksIF9fa21wX21zZ19udWxsKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NyZWF0ZSIsIHN0YXR1cyApOworICAgIH07IC8vIGlmCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfZGVzdHJveSggJiB0aHJlYWRfYXR0ciApOworICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBfX2ttcF9tc2coa21wX21zX3dhcm5pbmcsIEtNUF9NU0coIENhbnREZXN0cm95VGhyZWFkQXR0cnMgKSwgS01QX0VSUiggc3RhdHVzICksIF9fa21wX21zZ19udWxsKTsKKyAgICB9OyAvLyBpZgorI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogZG9uZSBjcmVhdGluZyB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX3dvcmtlcgorCisKK3ZvaWQKK19fa21wX2NyZWF0ZV9tb25pdG9yKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgcHRocmVhZF90ICAgICAgICAgICBoYW5kbGU7CisgICAgcHRocmVhZF9hdHRyX3QgICAgICB0aHJlYWRfYXR0cjsKKyAgICBzaXplX3QgICAgICAgICAgICAgIHNpemU7CisgICAgaW50ICAgICAgICAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgICAgICAgICBhdXRvX2Fkal9zaXplID0gRkFMU0U7CisKKyAgICBpZiggX19rbXBfZGZsdF9ibG9ja3RpbWUgPT0gS01QX01BWF9CTE9DS1RJTUUgKSB7CisgICAgICAgIC8vIFdlIGRvbid0IG5lZWQgbW9uaXRvciB0aHJlYWQgaW4gY2FzZSBvZiBNQVhfQkxPQ0tUSU1FCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogc2tpcHBpbmcgbW9uaXRvciB0aHJlYWQgYmVjYXVzZSBvZiBNQVggYmxvY2t0aW1lXG4iICkgKTsKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IDA7IC8vIHRoaXMgbWFrZXMgcmVhcF9tb25pdG9yIG5vLW9wCisgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgPSAwOworICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogdHJ5IHRvIGNyZWF0ZSBtb25pdG9yXG4iICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX01PTklUT1I7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IEtNUF9HVElEX01PTklUT1I7CisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgLTEgKTsgLy8gV2lsbCB1c2UgaXQgZm9yIHN5bmNocm9uaXphdGlvbiBhIGJpdCBsYXRlci4KKyAgICAjZWxzZQorICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUsIDAgKTsKKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgICNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICAgICAgICAgIGF1dG9fYWRqX3NpemUgPSBUUlVFOworICAgICAgICB9CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfYXR0cl9pbml0KCAmdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgS01QX01TRyggQ2FudEluaXRUaHJlYWRBdHRycyApLAorICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2F0dHJfc2V0ZGV0YWNoc3RhdGUoICYgdGhyZWFkX2F0dHIsIFBUSFJFQURfQ1JFQVRFX0pPSU5BQkxFICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhdGUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2dldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgJiBzaXplICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXR0cl9nZXRzdGFja3NpemUiLCBzdGF0dXMgKTsKKyAgICAgICAgI2Vsc2UKKyAgICAgICAgICAgIHNpemUgPSBfX2ttcF9zeXNfbWluX3N0a3NpemU7CisgICAgICAgICNlbmRpZiAvKiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFICovCisgICAgI2VuZGlmIC8qIEtNUF9USFJFQURfQVRUUiAqLworCisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPT0gMCApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gS01QX0RFRkFVTFRfTU9OSVRPUl9TVEtTSVpFOworICAgIH0KKyAgICBpZiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IF9fa21wX3N5c19taW5fc3Rrc2l6ZSApIHsKKyAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplID0gX19rbXBfc3lzX21pbl9zdGtzaXplOworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IGRlZmF1bHQgc3RhY2tzaXplID0gJWx1IGJ5dGVzLCIKKyAgICAgICAgICAgICAgICAgICAgInJlcXVlc3RlZCBzdGFja3NpemUgPSAlbHUgYnl0ZXNcbiIsCisgICAgICAgICAgICAgICAgICAgIHNpemUsIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSApICk7CisKKyAgICByZXRyeToKKworICAgIC8qIFNldCBzdGFjayBzaXplIGZvciB0aGlzIHRocmVhZCBub3cuICovCisKKyAgICAjaWZkZWYgX1BPU0lYX1RIUkVBRF9BVFRSX1NUQUNLU0laRQorICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBzZXR0aW5nIHN0YWNrc2l6ZSA9ICVsdSBieXRlcywiLAorICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICkgKTsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX3NldHN0YWNrc2l6ZSggJiB0aHJlYWRfYXR0ciwgX19rbXBfbW9uaXRvcl9zdGtzaXplICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICAgICBpZiAoIGF1dG9fYWRqX3NpemUgKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbW9uaXRvcl9zdGtzaXplICo9IDI7CisgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywgIC8vIHNob3VsZCB0aGlzIGJlIGZhdGFsPyAgQkIKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgKGxvbmcgaW50KSBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBDaGFuZ2VNb25pdG9yU3RhY2tTaXplICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY3JlYXRlKCAmaGFuZGxlLCAmIHRocmVhZF9hdHRyLCBfX2ttcF9sYXVuY2hfbW9uaXRvciwgKHZvaWQgKikgdGggKTsKKworICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgICNpZmRlZiBfUE9TSVhfVEhSRUFEX0FUVFJfU1RBQ0tTSVpFCisgICAgICAgICAgICBpZiAoIHN0YXR1cyA9PSBFSU5WQUwgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBhdXRvX2Fkal9zaXplICAmJiAoIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA8IChzaXplX3QpMHg0MDAwMDAwMCApICkgeworICAgICAgICAgICAgICAgICAgICBfX2ttcF9tb25pdG9yX3N0a3NpemUgKj0gMjsKKyAgICAgICAgICAgICAgICAgICAgZ290byByZXRyeTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRNb25pdG9yU3RhY2tTaXplLCBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9ITlQoIEluY3JlYXNlTW9uaXRvclN0YWNrU2l6ZSApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgaWYgKCBzdGF0dXMgPT0gRU5PTUVNICkgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0TW9uaXRvclN0YWNrU2l6ZSwgX19rbXBfbW9uaXRvcl9zdGtzaXplICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIHN0YXR1cyApLAorICAgICAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZU1vbml0b3JTdGFja1NpemUgKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgI2VuZGlmIC8qIF9QT1NJWF9USFJFQURfQVRUUl9TVEFDS1NJWkUgKi8KKyAgICAgICAgaWYgKCBzdGF0dXMgPT0gRUFHQUlOICkgeworICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBOb1Jlc291cmNlc0Zvck1vbml0b3JUaHJlYWQgKSwKKyAgICAgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgICAgICBLTVBfSE5UKCBEZWNyZWFzZU51bWJlck9mVGhyZWFkc0luVXNlICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jcmVhdGUiLCBzdGF0dXMgKTsKKyAgICB9OyAvLyBpZgorCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworCisgICAgI2lmIEtNUF9SRUFMX1RJTUVfRklYCisgICAgICAgIC8vIFdhaXQgZm9yIHRoZSBtb25pdG9yIHRocmVhZCBpcyByZWFsbHkgc3RhcnRlZCBhbmQgc2V0IGl0cyAqcHJpb3JpdHkqLgorICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBzaXplb2YoIGttcF91aW50MzIgKSA9PSBzaXplb2YoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlICkgKTsKKyAgICAgICAgX19rbXBfd2FpdF95aWVsZF80KAorICAgICAgICAgICAgKGttcF91aW50MzIgdm9sYXRpbGUgKikgJiBfX2ttcF9nbG9iYWwuZy5nX3RpbWUuZHQudF92YWx1ZSwgLTEsICYgX19rbXBfbmVxXzQsIE5VTEwKKyAgICAgICAgKTsKKyAgICAjZW5kaWYgLy8gS01QX1JFQUxfVElNRV9GSVgKKworICAgICNpZmRlZiBLTVBfVEhSRUFEX0FUVFIKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9hdHRyX2Rlc3Ryb3koICYgdGhyZWFkX2F0dHIgKTsKKyAgICAgICAgaWYgKCBzdGF0dXMgIT0gMCApIHsKKyAgICAgICAgICAgIF9fa21wX21zZyggICAgLy8KKyAgICAgICAgICAgICAgICBrbXBfbXNfd2FybmluZywKKyAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50RGVzdHJveVRocmVhZEF0dHJzICksCisgICAgICAgICAgICAgICAgS01QX0VSUiggc3RhdHVzICksCisgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmCisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfY3JlYXRlX21vbml0b3I6IG1vbml0b3IgY3JlYXRlZCAlIy44bHhcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKK30gLy8gX19rbXBfY3JlYXRlX21vbml0b3IKKwordm9pZAorX19rbXBfZXhpdF90aHJlYWQoCisgICAgaW50IGV4aXRfc3RhdHVzCispIHsKKyAgICBwdGhyZWFkX2V4aXQoICh2b2lkICopKGludHB0cl90KSBleGl0X3N0YXR1cyApOworfSAvLyBfX2ttcF9leGl0X3RocmVhZAorCit2b2lkIF9fa21wX3Jlc3VtZV9tb25pdG9yKCk7CisKK3ZvaWQKK19fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgdm9pZCAgICAgICAgKmV4aXRfdmFsOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogdHJ5IHRvIHJlYXAgbW9uaXRvciB0aHJlYWQgd2l0aCBoYW5kbGUgJSMuOGx4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7CisKKyAgICAvLyBJZiBtb25pdG9yIGhhcyBiZWVuIGNyZWF0ZWQsIGl0cyB0aWQgYW5kIGd0aWQgc2hvdWxkIGJlIEtNUF9HVElEX01PTklUT1IuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIDAsIGl0IG1lYW5zIHRoZSBtb25pdG9yIGRpZCBub3QgZXZlciBzdGFydC4KKyAgICAvLyBJZiBib3RoIHRpZCBhbmQgZ3RpZCBhcmUgS01QX0dUSURfRE5FLCB0aGUgbW9uaXRvciBoYXMgYmVlbiBzaHV0IGRvd24uCisgICAgS01QX0RFQlVHX0FTU0VSVCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkID09IHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKTsKKyAgICBpZiAoIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgIT0gS01QX0dUSURfTU9OSVRPUiApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogbW9uaXRvciBkaWQgbm90IHN0YXJ0LCByZXR1cm5pbmdcbiIpICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKworICAgIC8qIEZpcnN0LCBjaGVjayB0byBzZWUgd2hldGhlciB0aGUgbW9uaXRvciB0aHJlYWQgZXhpc3RzIHRvIHdha2UgaXQgdXAuIFRoaXMgaXMKKyAgICAgICB0byBhdm9pZCBwZXJmb3JtYW5jZSBwcm9ibGVtIHdoZW4gdGhlIG1vbml0b3Igc2xlZXBzIGR1cmluZyBibG9ja3RpbWUtc2l6ZQorICAgICAgIGludGVydmFsICovCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2tpbGwoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwgMCApOworICAgIGlmIChzdGF0dXMgIT0gRVNSQ0gpIHsKKyAgICAgICAgX19rbXBfcmVzdW1lX21vbml0b3IoKTsgICAvLyBXYWtlIHVwIHRoZSBtb25pdG9yIHRocmVhZAorICAgIH0KKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gam9pbiB3aXRoIG1vbml0b3JcbiIpICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9qb2luKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsICYgZXhpdF92YWwpOworICAgIGlmIChleGl0X3ZhbCAhPSB0aCkgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBSZWFwTW9uaXRvckVycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBzdGF0dXMgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorCisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfRE5FOworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfbW9uaXRvcjogZG9uZSByZWFwaW5nIG1vbml0b3IgdGhyZWFkIHdpdGggaGFuZGxlICUjLjhseFxuIiwKKyAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKK30KKwordm9pZAorX19rbXBfcmVhcF93b3JrZXIoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpbnQgICAgICAgICAgc3RhdHVzOworICAgIHZvaWQgICAgICAgICpleGl0X3ZhbDsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiB0cnkgdG8gcmVhcCBUIyVkXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfam9pbiggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAmIGV4aXRfdmFsKTsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICAvKiBEb24ndCBleHBvc2UgdGhlc2UgdG8gdGhlIHVzZXIgdW50aWwgd2UgdW5kZXJzdGFuZCB3aGVuIHRoZXkgdHJpZ2dlciAqLworICAgIGlmICggc3RhdHVzICE9IDAgKSB7CisgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIFJlYXBXb3JrZXJFcnJvciApLCBLTVBfRVJSKCBzdGF0dXMgKSwgX19rbXBfbXNnX251bGwpOworICAgIH0KKyAgICBpZiAoIGV4aXRfdmFsICE9IHRoICkgeworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiB3b3JrZXIgVCMlZCBkaWQgbm90IHJlYXAgcHJvcGVybHksIGV4aXRfdmFsID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkLCBleGl0X3ZhbCApICk7CisgICAgfQorI2VuZGlmIC8qIEtNUF9ERUJVRyAqLworCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3JlYXBfd29ya2VyOiBkb25lIHJlYXBpbmcgVCMlZFxuIiwgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCApICk7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30KKworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisKKworc3RhdGljIHZvaWQKK19fa21wX251bGxfaGFuZGxlciggaW50IHNpZ25vICkKK3sKKyAgICAvLyAgRG8gbm90aGluZywgZm9yIGRvaW5nIFNJR19JR04tdHlwZSBhY3Rpb25zLgorfSAvLyBfX2ttcF9udWxsX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfdGVhbV9oYW5kbGVyKCBpbnQgc2lnbm8gKQoreworICAgIGlmICggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCA9PSAwICkgeworICAgICAgICAvKiBTdGFnZSAxIHNpZ25hbCBoYW5kbGVyLCBsZXQncyBzaHV0IGRvd24gYWxsIG9mIHRoZSB0aHJlYWRzICovCisgICAgICAgICNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogY2F1Z2h0IHNpZ25hbCA9ICVkXG4iLCBzaWdubyApOworICAgICAgICAjZW5kaWYKKyAgICAgICAgc3dpdGNoICggc2lnbm8gKSB7CisgICAgICAgICAgICBjYXNlIFNJR0hVUCAgOgorICAgICAgICAgICAgY2FzZSBTSUdJTlQgIDoKKyAgICAgICAgICAgIGNhc2UgU0lHUVVJVCA6CisgICAgICAgICAgICBjYXNlIFNJR0lMTCAgOgorICAgICAgICAgICAgY2FzZSBTSUdBQlJUIDoKKyAgICAgICAgICAgIGNhc2UgU0lHRlBFICA6CisgICAgICAgICAgICBjYXNlIFNJR0JVUyAgOgorICAgICAgICAgICAgY2FzZSBTSUdTRUdWIDoKKyAgICAgICAgICAgICNpZmRlZiBTSUdTWVMKKyAgICAgICAgICAgICAgICBjYXNlIFNJR1NZUyA6CisgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgIGNhc2UgU0lHVEVSTSA6CisgICAgICAgICAgICAgICAgaWYgKCBfX2ttcF9kZWJ1Z19idWYgKSB7CisgICAgICAgICAgICAgICAgICAgIF9fa21wX2R1bXBfZGVidWdfYnVmZmVyKCApOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgICAgICAgICBUQ1dfNCggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCwgc2lnbm8gKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgICAgZGVmYXVsdDoKKyAgICAgICAgICAgICAgICAjaWZkZWYgS01QX0RFQlVHCisgICAgICAgICAgICAgICAgICAgIF9fa21wX2RlYnVnX3ByaW50ZiggIl9fa21wX3RlYW1faGFuZGxlcjogdW5rbm93biBzaWduYWwgdHlwZSIgKTsKKyAgICAgICAgICAgICAgICAjZW5kaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gc3dpdGNoCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfdGVhbV9oYW5kbGVyCisKKworc3RhdGljCit2b2lkIF9fa21wX3NpZ2FjdGlvbiggaW50IHNpZ251bSwgY29uc3Qgc3RydWN0IHNpZ2FjdGlvbiAqIGFjdCwgc3RydWN0IHNpZ2FjdGlvbiAqIG9sZGFjdCApIHsKKyAgICBpbnQgcmMgPSBzaWdhY3Rpb24oIHNpZ251bSwgYWN0LCBvbGRhY3QgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggInNpZ2FjdGlvbiIsIHJjICk7Cit9CisKKworc3RhdGljIHZvaWQKK19fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIGludCBzaWcsIHNpZ19mdW5jX3QgaGFuZGxlcl9mdW5jLCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoICVkLCAuLi4sICVkIClcbiIsIHNpZywgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBzdHJ1Y3Qgc2lnYWN0aW9uIG5ld19hY3Rpb247CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkX2FjdGlvbjsKKyAgICAgICAgbmV3X2FjdGlvbi5zYV9oYW5kbGVyID0gaGFuZGxlcl9mdW5jOworICAgICAgICBuZXdfYWN0aW9uLnNhX2ZsYWdzICAgPSAwOworICAgICAgICBzaWdmaWxsc2V0KCAmIG5ld19hY3Rpb24uc2FfbWFzayApOworICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBuZXdfYWN0aW9uLCAmIG9sZF9hY3Rpb24gKTsKKyAgICAgICAgaWYgKCBvbGRfYWN0aW9uLnNhX2hhbmRsZXIgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdLnNhX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBzaWdhZGRzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIC8vIFJlc3RvcmUva2VlcCB1c2VyJ3MgaGFuZGxlciBpZiBvbmUgcHJldmlvdXNseSBpbnN0YWxsZWQuCisgICAgICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBvbGRfYWN0aW9uLCBOVUxMICk7CisgICAgICAgIH07IC8vIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgLy8gU2F2ZSBpbml0aWFsL3N5c3RlbSBzaWduYWwgaGFuZGxlcnMgdG8gc2VlIGlmIHVzZXIgaGFuZGxlcnMgaW5zdGFsbGVkLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgTlVMTCwgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0gKTsKKyAgICB9OyAvLyBpZgorICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCit9IC8vIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIKKworCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkKK3sKKyAgICBLQl9UUkFDRSggNjAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlciggJWQgKVxuIiwgc2lnICkgKTsKKyAgICBpZiAoIHNpZ2lzbWVtYmVyKCAmIF9fa21wX3NpZ3NldCwgc2lnICkgKSB7CisgICAgICAgIHN0cnVjdCBzaWdhY3Rpb24gb2xkOworICAgICAgICBLTVBfTUIoKTsgICAgICAgLy8gRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLgorICAgICAgICBfX2ttcF9zaWdhY3Rpb24oIHNpZywgJiBfX2ttcF9zaWdobGRyc1sgc2lnIF0sICYgb2xkICk7CisgICAgICAgIGlmICggKCBvbGQuc2FfaGFuZGxlciAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSAmJiAoIG9sZC5zYV9oYW5kbGVyICE9IF9fa21wX251bGxfaGFuZGxlciApICkgeworICAgICAgICAgICAgLy8gUmVzdG9yZSB0aGUgdXNlcnMgc2lnbmFsIGhhbmRsZXIuCisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIF9fa21wX3NpZ2FjdGlvbiggc2lnLCAmIG9sZCwgTlVMTCApOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzaWdkZWxzZXQoICYgX19rbXBfc2lnc2V0LCBzaWcgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9OyAvLyBpZgorfSAvLyBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIKKworCit2b2lkCitfX2ttcF9pbnN0YWxsX3NpZ25hbHMoIGludCBwYXJhbGxlbF9pbml0ICkKK3sKKyAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFscyggJWQgKVxuIiwgcGFyYWxsZWxfaW5pdCApICk7CisgICAgaWYgKCBfX2ttcF9oYW5kbGVfc2lnbmFscyB8fCAhIHBhcmFsbGVsX2luaXQgKSB7CisgICAgICAgIC8vIElmICEgcGFyYWxsZWxfaW5pdCwgd2UgZG8gbm90IGluc3RhbGwgaGFuZGxlcnMsIGp1c3Qgc2F2ZSBvcmlnaW5hbCBoYW5kbGVycy4KKyAgICAgICAgLy8gTGV0IHVzIGRvIGl0IGV2ZW4gX19oYW5kbGVfc2lnbmFscyBpcyAwLgorICAgICAgICBzaWdlbXB0eXNldCggJiBfX2ttcF9zaWdzZXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSFVQLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdRVUlULCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHSUxMLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdGUEUsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlciggU0lHQlVTLCAgX19rbXBfdGVhbV9oYW5kbGVyLCBwYXJhbGxlbF9pbml0ICk7CisgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjaWZkZWYgU0lHU1lTCisgICAgICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdTWVMsICBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2VuZGlmIC8vIFNJR1NZUworICAgICAgICBfX2ttcF9pbnN0YWxsX29uZV9oYW5kbGVyKCBTSUdURVJNLCBfX2ttcF90ZWFtX2hhbmRsZXIsIHBhcmFsbGVsX2luaXQgKTsKKyAgICAgICAgI2lmZGVmIFNJR1BJUEUKKyAgICAgICAgICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1BJUEUsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgICAgICAjZW5kaWYgLy8gU0lHUElQRQorICAgIH07IC8vIGlmCit9IC8vIF9fa21wX2luc3RhbGxfc2lnbmFscworCisKK3ZvaWQKK19fa21wX3JlbW92ZV9zaWduYWxzKCB2b2lkICkKK3sKKyAgICBpbnQgICAgc2lnOworICAgIEtCX1RSQUNFKCAxMCwgKCAiX19rbXBfcmVtb3ZlX3NpZ25hbHMoKVxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2VuYWJsZSggaW50IG5ld19zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzLCBvbGRfc3RhdGU7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0Y2FuY2Vsc3RhdGUoIG5ld19zdGF0ZSwgJiBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIG9sZF9zdGF0ZSA9PSBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFICk7CisgICAgI2VuZGlmCit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqIG9sZF9zdGF0ZSApCit7CisgICAgI2lmZGVmIEtNUF9DQU5DRUxfVEhSRUFEUworICAgICAgICBpbnQgc3RhdHVzOworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX3NldGNhbmNlbHN0YXRlKCBQVEhSRUFEX0NBTkNFTF9ESVNBQkxFLCBvbGRfc3RhdGUgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldGNhbmNlbHN0YXRlIiwgc3RhdHVzICk7CisgICAgI2VuZGlmCit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3N0YXRpYyB2b2lkCitfX2ttcF9hdGZvcmtfcHJlcGFyZSAodm9pZCkKK3sKKyAgICAvKiAgbm90aGluZyB0byBkbyAgKi8KK30KKworc3RhdGljIHZvaWQKK19fa21wX2F0Zm9ya19wYXJlbnQgKHZvaWQpCit7CisgICAgLyogIG5vdGhpbmcgdG8gZG8gICovCit9CisKKy8qCisgICAgUmVzZXQgdGhlIGxpYnJhcnkgc28gZXhlY3V0aW9uIGluIHRoZSBjaGlsZCBzdGFydHMgImFsbCBvdmVyIGFnYWluIiB3aXRoCisgICAgY2xlYW4gZGF0YSBzdHJ1Y3R1cmVzIGluIGluaXRpYWwgc3RhdGVzLiAgRG9uJ3Qgd29ycnkgYWJvdXQgZnJlZWluZyBtZW1vcnkKKyAgICBhbGxvY2F0ZWQgYnkgcGFyZW50LCBqdXN0IGFiYW5kb24gaXQgdG8gYmUgc2FmZS4KKyovCitzdGF0aWMgdm9pZAorX19rbXBfYXRmb3JrX2NoaWxkICh2b2lkKQoreworICAgIC8qIFRPRE8gbWFrZSBzdXJlIHRoaXMgaXMgZG9uZSByaWdodCBmb3IgbmVzdGVkL3NpYmxpbmcgKi8KKyAgICAvLyBBVFQ6ICBNZW1vcnkgbGVha3MgYXJlIGhlcmU/IFRPRE86IENoZWNrIGl0IGFuZCBmaXguCisgICAgLyogS01QX0FTU0VSVCggMCApOyAqLworCisgICAgKytfX2ttcF9mb3JrX2NvdW50OworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9tb25pdG9yID0gMDsKKyAgICBfX2ttcF9pbml0X3BhcmFsbGVsID0gRkFMU0U7CisgICAgX19rbXBfaW5pdF9taWRkbGUgPSBGQUxTRTsKKyAgICBfX2ttcF9pbml0X3NlcmlhbCA9IEZBTFNFOworICAgIFRDV180KF9fa21wX2luaXRfZ3RpZCwgRkFMU0UpOworICAgIF9fa21wX2luaXRfY29tbW9uID0gRkFMU0U7CisKKyAgICBUQ1dfNChfX2ttcF9pbml0X3VzZXJfbG9ja3MsIEZBTFNFKTsKKyNpZiAhIEtNUF9VU0VfRFlOQU1JQ19MT0NLCisgICAgX19rbXBfdXNlcl9sb2NrX3RhYmxlLnVzZWQgPSAxOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS5hbGxvY2F0ZWQgPSAwOworICAgIF9fa21wX3VzZXJfbG9ja190YWJsZS50YWJsZSA9IE5VTEw7CisgICAgX19rbXBfbG9ja19ibG9ja3MgPSBOVUxMOworI2VuZGlmCisKKyAgICBfX2ttcF9hbGxfbnRoID0gMDsKKyAgICBUQ1dfNChfX2ttcF9udGgsIDApOworCisgICAgLyogTXVzdCBhY3R1YWxseSB6ZXJvIGFsbCB0aGUgKmNhY2hlIGFyZ3VtZW50cyBwYXNzZWQgdG8gX19rbXBjX3RocmVhZHByaXZhdGUgaGVyZQorICAgICAgIHNvIHRocmVhZHByaXZhdGUgZG9lc24ndCB1c2Ugc3RhbGUgZGF0YSAqLworICAgIEtBX1RSQUNFKCAxMCwgKCAiX19rbXBfYXRmb3JrX2NoaWxkOiBjaGVja2luZyBjYWNoZSBhZGRyZXNzIGxpc3QgJXBcbiIsCisgICAgICAgICAgICAgICAgIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCApICk7CisKKyAgICB3aGlsZSAoIF9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAhPSBOVUxMICkgeworCisgICAgICAgIGlmICggKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBLQ19UUkFDRSggNTAsICggIl9fa21wX2F0Zm9ya19jaGlsZDogemVyb2luZyBjYWNoZSBhdCBhZGRyZXNzICVwXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgJigqX19rbXBfdGhyZWFkcHJpdl9jYWNoZV9saXN0IC0+IGFkZHIpICkgKTsKKworICAgICAgICAgICAgKl9fa21wX3RocmVhZHByaXZfY2FjaGVfbGlzdCAtPiBhZGRyID0gTlVMTDsKKyAgICAgICAgfQorICAgICAgICBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgPSBfX2ttcF90aHJlYWRwcml2X2NhY2hlX2xpc3QgLT4gbmV4dDsKKyAgICB9CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKKworICAgIC8qIHJlc2V0IHN0YXRpY2FsbHkgaW5pdGlhbGl6ZWQgbG9ja3MgKi8KKyAgICBfX2ttcF9pbml0X2Jvb3RzdHJhcF9sb2NrKCAmX19rbXBfaW5pdHpfbG9jayApOworICAgIF9fa21wX2luaXRfYm9vdHN0cmFwX2xvY2soICZfX2ttcF9zdGRpb19sb2NrICk7CisgICAgX19rbXBfaW5pdF9ib290c3RyYXBfbG9jayggJl9fa21wX2NvbnNvbGVfbG9jayApOworCisgICAgLyogVGhpcyBpcyBuZWNlc3NhcnkgdG8gbWFrZSBzdXJlIG5vIHN0YWxlIGRhdGEgaXMgbGVmdCBhcm91bmQgKi8KKyAgICAvKiBBQzogY3VzdG9tZXJzIGNvbXBsYWluIHRoYXQgd2UgdXNlIHVuc2FmZSByb3V0aW5lcyBpbiB0aGUgYXRmb3JrCisgICAgICAgaGFuZGxlci4gTWF0aHdvcmtzOiBkbHN5bSgpIGlzIHVuc2FmZS4gV2UgY2FsbCBkbHN5bSBhbmQgZGxvcGVuCisgICAgICAgaW4gZHluYW1pY19saW5rIHdoZW4gY2hlY2sgdGhlIHByZXNlbmNlIG9mIHNoYXJlZCB0YmJtYWxsb2MgbGlicmFyeS4KKyAgICAgICBTdWdnZXN0aW9uIGlzIHRvIG1ha2UgdGhlIGxpYnJhcnkgaW5pdGlhbGl6YXRpb24gbGF6aWVyLCBzaW1pbGFyCisgICAgICAgdG8gd2hhdCBkb25lIGZvciBfX2ttcGNfYmVnaW4oKS4gKi8KKyAgICAvLyBUT0RPOiBzeW5jaHJvbml6ZSBhbGwgc3RhdGljIGluaXRpYWxpemF0aW9ucyB3aXRoIHJlZ3VsYXIgbGlicmFyeQorICAgIC8vICAgICAgIHN0YXJ0dXA7IGxvb2sgYXQga21wX2dsb2JhbC5jIGFuZCBldGMuCisgICAgLy9fX2ttcF9pbnRlcm5hbF9iZWdpbiAoKTsKKworfQorCit2b2lkCitfX2ttcF9yZWdpc3Rlcl9hdGZvcmsodm9pZCkgeworICAgIGlmICggX19rbXBfbmVlZF9yZWdpc3Rlcl9hdGZvcmsgKSB7CisgICAgICAgIGludCBzdGF0dXMgPSBwdGhyZWFkX2F0Zm9yayggX19rbXBfYXRmb3JrX3ByZXBhcmUsIF9fa21wX2F0Zm9ya19wYXJlbnQsIF9fa21wX2F0Zm9ya19jaGlsZCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfYXRmb3JrIiwgc3RhdHVzICk7CisgICAgICAgIF9fa21wX25lZWRfcmVnaXN0ZXJfYXRmb3JrID0gRkFMU0U7CisgICAgfQorfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfbXV0ZXhfYXR0ciApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleGF0dHJfaW5pdCIsIHN0YXR1cyApOworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZGF0dHJfaW5pdCggJl9fa21wX3N1c3BlbmRfY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRhdHRyX2luaXQiLCBzdGF0dXMgKTsKK30KKworc3RhdGljIHZvaWQKK19fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoIHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPD0gX19rbXBfZm9ya19jb3VudCApIHsKKyAgICAgICAgLyogdGhpcyBtZWFucyB3ZSBoYXZlbid0IGluaXRpYWxpemVkIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgICAgIHN0YXR1czsKKyAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX2luaXQoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQsICZfX2ttcF9zdXNwZW5kX2NvbmRfYXR0ciApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgX19rbXBfc3VzcGVuZF9tdXRleF9hdHRyICk7CisgICAgICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9pbml0Iiwgc3RhdHVzICk7CisgICAgICAgICoodm9sYXRpbGUgaW50KikmdGgtPnRoLnRoX3N1c3BlbmRfaW5pdF9jb3VudCA9IF9fa21wX2ZvcmtfY291bnQgKyAxOworICAgIH07Cit9CisKK3ZvaWQKK19fa21wX3N1c3BlbmRfdW5pbml0aWFsaXplX3RocmVhZCgga21wX2luZm9fdCAqdGggKQoreworICAgIGlmKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPiBfX2ttcF9mb3JrX2NvdW50KSB7CisgICAgICAgIC8qIHRoaXMgbWVhbnMgd2UgaGF2ZSBpbml0aWFsaXplIHRoZSBzdXNwZW5zaW9uIHB0aHJlYWQgb2JqZWN0cyBmb3IgdGhpcyB0aHJlYWQKKyAgICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBpbnQgc3RhdHVzOworCisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9kZXN0cm95KCAmdGgtPnRoLnRoX3N1c3BlbmRfY3YuY19jb25kICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRfZGVzdHJveSIsIHN0YXR1cyApOworICAgICAgICB9OworICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2Rlc3Ryb3koICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICAgICAgS01QX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2Rlc3Ryb3kiLCBzdGF0dXMgKTsKKyAgICAgICAgfTsKKyAgICAgICAgLS10aC0+dGgudGhfc3VzcGVuZF9pbml0X2NvdW50OworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKHRoLT50aC50aF9zdXNwZW5kX2luaXRfY291bnQgPT0gX19rbXBfZm9ya19jb3VudCk7CisgICAgfQorfQorCisvKiBUaGlzIHJvdXRpbmUgcHV0cyB0aGUgY2FsbGluZyB0aHJlYWQgdG8gc2xlZXAgYWZ0ZXIgc2V0dGluZyB0aGUKKyAqIHNsZWVwIGJpdCBmb3IgdGhlIGluZGljYXRlZCBmbGFnIHZhcmlhYmxlIHRvIHRydWUuCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUoIGludCB0aF9ndGlkLCBDICpmbGFnICkKK3sKKyAgICBLTVBfVElNRV9ERVZFTE9QRVJfQkxPQ0soVVNFUl9zdXNwZW5kKTsKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGhfZ3RpZF07CisgICAgaW50IHN0YXR1czsKKyAgICB0eXBlbmFtZSBDOjpmbGFnX3Qgb2xkX3NwaW47CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBlbnRlciBmb3IgZmxhZyA9ICVwXG4iLCB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF9sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMTAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc2V0dGluZyBzbGVlcCBiaXQgZm9yIHNwaW4oJXApXG4iLAorICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICAvKiBUT0RPOiBzaG91bGRuJ3QgdGhpcyB1c2UgcmVsZWFzZSBzZW1hbnRpY3MgdG8gZW5zdXJlIHRoYXQgX19rbXBfc3VzcGVuZF9pbml0aWFsaXplX3RocmVhZAorICAgICAgIGdldHMgY2FsbGVkIGZpcnN0PworICAgICovCisgICAgb2xkX3NwaW4gPSBmbGFnLT5zZXRfc2xlZXBpbmcoKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldCBzbGVlcCBiaXQgZm9yIHNwaW4oJXApPT0leCwgd2FzICV4XG4iLAorICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpLCAqKGZsYWctPmdldCgpKSwgb2xkX3NwaW4gKSApOworCisgICAgaWYgKCBmbGFnLT5kb25lX2NoZWNrX3ZhbChvbGRfc3BpbikgKSB7CisgICAgICAgIG9sZF9zcGluID0gZmxhZy0+dW5zZXRfc2xlZXBpbmcoKTsKKyAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZmFsc2UgYWxhcm0sIHJlc2V0IHNsZWVwIGJpdCBmb3Igc3BpbiglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQsIGZsYWctPmdldCgpKSApOworICAgIH0gZWxzZSB7CisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICAgICAgd2hpbGUgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgICAgICBfX2ttcF9zdXNwZW5kX2NvdW50Kys7CisgICAgICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICAgICAgX19rbXBfcHJpbnRmKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogc3VzcGVuZGluZyBUIyVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisjZW5kaWYKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBubyBsb25nZXIgYWN0aXZlIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKyAgICAgICAgICAgIH0KKworI2lmIFVTRV9TVVNQRU5EX1RJTUVPVVQKKyAgICAgICAgICAgIHN0cnVjdCB0aW1lc3BlYyAgbm93OworICAgICAgICAgICAgc3RydWN0IHRpbWV2YWwgICB0dmFsOworICAgICAgICAgICAgaW50IG1zZWNzOworCisgICAgICAgICAgICBzdGF0dXMgPSBnZXR0aW1lb2ZkYXkoICZ0dmFsLCBOVUxMICk7CisgICAgICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgICAgICAgICAgVElNRVZBTF9UT19USU1FU1BFQyggJnR2YWwsICZub3cgKTsKKworICAgICAgICAgICAgbXNlY3MgPSAoNCpfX2ttcF9kZmx0X2Jsb2NrdGltZSkgKyAyMDA7CisgICAgICAgICAgICBub3cudHZfc2VjICArPSBtc2VjcyAvIDEwMDA7CisgICAgICAgICAgICBub3cudHZfbnNlYyArPSAobXNlY3MgJSAxMDAwKSoxMDAwOworCisgICAgICAgICAgICBLRl9UUkFDRSggMTUsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBwdGhyZWFkX2NvbmRfdGltZWR3YWl0XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoX2d0aWQgKSApOworICAgICAgICAgICAgc3RhdHVzID0gcHRocmVhZF9jb25kX3RpbWVkd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXgsICYgbm93ICk7CisjZWxzZQorICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGFib3V0IHRvIHBlcmZvcm0gcHRocmVhZF9jb25kX3dhaXRcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCApICk7CisgICAgICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LmNfY29uZCwgJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyNlbmRpZgorCisgICAgICAgICAgICBpZiAoIChzdGF0dXMgIT0gMCkgJiYgKHN0YXR1cyAhPSBFSU5UUikgJiYgKHN0YXR1cyAhPSBFVElNRURPVVQpICkgeworICAgICAgICAgICAgICAgIEtNUF9TWVNGQUlMKCAicHRocmVhZF9jb25kX3dhaXQiLCBzdGF0dXMgKTsKKyAgICAgICAgICAgIH0KKyNpZmRlZiBLTVBfREVCVUcKKyAgICAgICAgICAgIGlmIChzdGF0dXMgPT0gRVRJTUVET1VUKSB7CisgICAgICAgICAgICAgICAgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMTAwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHRpbWVvdXQgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICBLRl9UUkFDRSggMiwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCB0aW1lb3V0IHdha2V1cCwgc2xlZXAgYml0IG5vdCBzZXQhXG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICB9IGVsc2UgaWYgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgICAgIEtGX1RSQUNFKCAxMDAsICggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgc3B1cmlvdXMgd2FrZXVwXG4iLCB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZgorICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMiggKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCA9IFRSVUU7CisgICAgICAgICAgICB9CisgICAgICAgIH0KKyAgICB9CisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdik7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgaGFzIGF3YWtlbmVkOiAlc1xuIiwgdGhfZ3RpZCwgYnVmZmVyICk7CisgICAgfQorI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisKKyAgICBLRl9UUkFDRSggMzAsICgiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBleGl0XG4iLCB0aF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9zdXNwZW5kXzMyKGludCB0aF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3N1c3BlbmRfNjQoaW50IHRoX2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF9vbmNvcmUoaW50IHRoX2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3N1c3BlbmRfdGVtcGxhdGUodGhfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogVGhpcyByb3V0aW5lIHNpZ25hbHMgdGhlIHRocmVhZCBzcGVjaWZpZWQgYnkgdGFyZ2V0X2d0aWQgdG8gd2FrZSB1cAorICogYWZ0ZXIgc2V0dGluZyB0aGUgc2xlZXAgYml0IGluZGljYXRlZCBieSB0aGUgZmxhZyBhcmd1bWVudCB0byBGQUxTRS4KKyAqIFRoZSB0YXJnZXQgdGhyZWFkIG11c3QgYWxyZWFkeSBoYXZlIGNhbGxlZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCkKKyAqLwordGVtcGxhdGUgPGNsYXNzIEM+CitzdGF0aWMgaW5saW5lIHZvaWQgX19rbXBfcmVzdW1lX3RlbXBsYXRlKCBpbnQgdGFyZ2V0X2d0aWQsIEMgKmZsYWcgKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX3Jlc3VtZSk7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RhcmdldF9ndGlkXTsKKyAgICBpbnQgc3RhdHVzOworCisjaWZkZWYgS01QX0RFQlVHCisgICAgaW50IGd0aWQgPSBUQ1JfNChfX2ttcF9pbml0X2d0aWQpID8gX19rbXBfZ2V0X2d0aWQoKSA6IC0xOworI2VuZGlmCisKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworICAgIEtNUF9ERUJVR19BU1NFUlQoIGd0aWQgIT0gdGFyZ2V0X2d0aWQgKTsKKworICAgIF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQoIHRoICk7CisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teC5tX211dGV4ICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2xvY2siLCBzdGF0dXMgKTsKKworICAgIGlmICghZmxhZykgeyAvLyBjb21pbmcgZnJvbSBfX2ttcF9udWxsX3Jlc3VtZV93cmFwcGVyCisgICAgICAgIGZsYWcgPSAoQyAqKXRoLT50aC50aF9zbGVlcF9sb2M7CisgICAgfQorCisgICAgLy8gRmlyc3QsIGNoZWNrIGlmIHRoZSBmbGFnIGlzIG51bGwgb3IgaXRzIHR5cGUgaGFzIGNoYW5nZWQuIElmIHNvLCBzb21lb25lIGVsc2Ugd29rZSBpdCB1cC4KKyAgICBpZiAoIWZsYWcgfHwgZmxhZy0+Z2V0X3R5cGUoKSAhPSBmbGFnLT5nZXRfcHRyX3R5cGUoKSkgeyAvLyBnZXRfcHRyX3R5cGUgc2ltcGx5IHNob3dzIHdoYXQgZmxhZyB3YXMgY2FzdCB0bworICAgICAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcsIHRocmVhZCBUIyVkIGFscmVhZHkgYXdha2U6IGZsYWcoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgTlVMTCApICk7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgICAgIHJldHVybjsKKyAgICB9CisgICAgZWxzZSB7IC8vIGlmIG11bHRpcGxlIHRocmVhZHMgYXJlIHNsZWVwaW5nLCBmbGFnIHNob3VsZCBiZSBpbnRlcm5hbGx5IHJlZmVycmluZyB0byBhIHNwZWNpZmljIHRocmVhZCBoZXJlCisgICAgICAgIHR5cGVuYW1lIEM6OmZsYWdfdCBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIGlmICggISBmbGFnLT5pc19zbGVlcGluZ192YWwob2xkX3NwaW4pICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDUsICggIl9fa21wX3Jlc3VtZV90ZW1wbGF0ZTogVCMlZCBleGl0aW5nLCB0aHJlYWQgVCMlZCBhbHJlYWR5IGF3YWtlOiBmbGFnKCVwKTogIgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpLCBvbGRfc3BpbiwgKmZsYWctPmdldCgpICkgKTsKKyAgICAgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgubV9tdXRleCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X3VubG9jayIsIHN0YXR1cyApOworICAgICAgICAgICAgcmV0dXJuOworICAgICAgICB9CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgIiV1ID0+ICV1XG4iLAorICAgICAgICAgICAgICAgICAgICAgICBndGlkLCB0YXJnZXRfZ3RpZCwgZmxhZy0+Z2V0KCksIG9sZF9zcGluLCAqZmxhZy0+Z2V0KCkgKSApOworICAgIH0KKyAgICBUQ1dfUFRSKHRoLT50aC50aF9zbGVlcF9sb2MsIE5VTEwpOworCisKKyNpZmRlZiBERUJVR19TVVNQRU5ECisgICAgeworICAgICAgICBjaGFyIGJ1ZmZlclsxMjhdOworICAgICAgICBfX2ttcF9wcmludF9jb25kKCBidWZmZXIsICZ0aC0+dGgudGhfc3VzcGVuZF9jdiApOworICAgICAgICBfX2ttcF9wcmludGYoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgcmVzdW1pbmcgVCMlZDogJXNcbiIsIGd0aWQsIHRhcmdldF9ndGlkLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKworICAgIHN0YXR1cyA9IHB0aHJlYWRfY29uZF9zaWduYWwoICZ0aC0+dGgudGhfc3VzcGVuZF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfdW5sb2NrIiwgc3RhdHVzICk7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZyBhZnRlciBzaWduYWxpbmcgd2FrZSB1cCBmb3IgVCMlZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQgKSApOworfQorCit2b2lkIF9fa21wX3Jlc3VtZV8zMihpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lXzY0KGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9yZXN1bWVfdGVtcGxhdGUodGFyZ2V0X2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9yZXN1bWVfb25jb3JlKGludCB0YXJnZXRfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KKwordm9pZAorX19rbXBfcmVzdW1lX21vbml0b3IoKQoreworICAgIEtNUF9USU1FX0RFVkVMT1BFUl9CTE9DSyhVU0VSX3Jlc3VtZSk7CisgICAgaW50IHN0YXR1czsKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisgICAgS0ZfVFJBQ0UoIDMwLCAoICJfX2ttcF9yZXN1bWVfbW9uaXRvcjogVCMlZCB3YW50cyB0byB3YWtldXAgVCMlZCBlbnRlclxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgS01QX0dUSURfTU9OSVRPUiApICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggZ3RpZCAhPSBLTVBfR1RJRF9NT05JVE9SICk7CisjZW5kaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X2xvY2soICZfX2ttcF93YWl0X214Lm1fbXV0ZXggKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfbG9jayIsIHN0YXR1cyApOworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICB7CisgICAgICAgIGNoYXIgYnVmZmVyWzEyOF07CisgICAgICAgIF9fa21wX3ByaW50X2NvbmQoIGJ1ZmZlciwgJl9fa21wX3dhaXRfY3YuY19jb25kICk7CisgICAgICAgIF9fa21wX3ByaW50ZiggIl9fa21wX3Jlc3VtZV9tb25pdG9yOiBUIyVkIHJlc3VtaW5nIFQjJWQ6ICVzXG4iLCBndGlkLCBLTVBfR1RJRF9NT05JVE9SLCBidWZmZXIgKTsKKyAgICB9CisjZW5kaWYKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfc2lnbmFsKCAmX19rbXBfd2FpdF9jdi5jX2NvbmQgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9zaWduYWwiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX211dGV4X3VubG9jayggJl9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9tdXRleF91bmxvY2siLCBzdGF0dXMgKTsKKyAgICBLRl9UUkFDRSggMzAsICggIl9fa21wX3Jlc3VtZV9tb25pdG9yOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIEtNUF9HVElEX01PTklUT1IgKSApOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF95aWVsZCggaW50IGNvbmQgKQoreworICAgIGlmIChjb25kICYmIF9fa21wX3lpZWxkaW5nX29uKSB7CisgICAgICAgIHNjaGVkX3lpZWxkKCk7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkCitfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggaW50IGd0aWQgKQoreworICAgIGlmKCBfX2ttcF9pbml0X2d0aWQgKSB7CisgICAgICAgIGludCBzdGF0dXM7CisgICAgICAgIHN0YXR1cyA9IHB0aHJlYWRfc2V0c3BlY2lmaWMoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksICh2b2lkKikoaW50cHRyX3QpKGd0aWQrMSkgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgc3RhdHVzICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfc2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmdcbiIgKSApOworICAgIH0KK30KKworaW50CitfX2ttcF9ndGlkX2dldF9zcGVjaWZpYygpCit7CisgICAgaW50IGd0aWQ7CisgICAgaWYgKCAhX19rbXBfaW5pdF9ndGlkICkgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9nZXRfc3BlY2lmaWM6IHJ1bnRpbWUgc2h1dGRvd24sIHJldHVybmluZyBLTVBfR1RJRF9TSFVURE9XTlxuIiApICk7CisgICAgICAgIHJldHVybiBLTVBfR1RJRF9TSFVURE9XTjsKKyAgICB9CisgICAgZ3RpZCA9IChpbnQpKHNpemVfdClwdGhyZWFkX2dldHNwZWNpZmljKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgaWYgKCBndGlkID09IDAgKSB7CisgICAgICAgIGd0aWQgPSBLTVBfR1RJRF9ETkU7CisgICAgfQorICAgIGVsc2UgeworICAgICAgICBndGlkLS07CisgICAgfQorICAgIEtBX1RSQUNFKCA1MCwgKCJfX2ttcF9ndGlkX2dldF9zcGVjaWZpYzoga2V5OiVkIGd0aWQ6JWRcbiIsCisgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitkb3VibGUKK19fa21wX3JlYWRfY3B1X3RpbWUoIHZvaWQgKQoreworICAgIC8qY2xvY2tfdCAgIHQ7Ki8KKyAgICBzdHJ1Y3QgdG1zICBidWZmZXI7CisKKyAgICAvKnQgPSovICB0aW1lcyggJiBidWZmZXIgKTsKKworICAgIHJldHVybiAoYnVmZmVyLnRtc191dGltZSArIGJ1ZmZlci50bXNfY3V0aW1lKSAvIChkb3VibGUpIENMT0NLU19QRVJfU0VDOworfQorCitpbnQKK19fa21wX3JlYWRfc3lzdGVtX2luZm8oIHN0cnVjdCBrbXBfc3lzX2luZm8gKmluZm8gKQoreworICAgIGludCBzdGF0dXM7CisgICAgc3RydWN0IHJ1c2FnZSByX3VzYWdlOworCisgICAgbWVtc2V0KCBpbmZvLCAwLCBzaXplb2YoICppbmZvICkgKTsKKworICAgIHN0YXR1cyA9IGdldHJ1c2FnZSggUlVTQUdFX1NFTEYsICZyX3VzYWdlKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHJ1c2FnZSIsIHN0YXR1cyApOworCisgICAgaW5mby0+bWF4cnNzICA9IHJfdXNhZ2UucnVfbWF4cnNzOyAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgaW5mby0+bWluZmx0ICA9IHJfdXNhZ2UucnVfbWluZmx0OyAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB3aXRob3V0IGFueSBJL08gICAgICAgICovCisgICAgaW5mby0+bWFqZmx0ICA9IHJfdXNhZ2UucnVfbWFqZmx0OyAgLyogdGhlIG51bWJlciBvZiBwYWdlIGZhdWx0cyBzZXJ2aWNlZCB0aGF0IHJlcXVpcmVkIEkvTyAgICAgICovCisgICAgaW5mby0+bnN3YXAgICA9IHJfdXNhZ2UucnVfbnN3YXA7ICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgaW5mby0+aW5ibG9jayA9IHJfdXNhZ2UucnVfaW5ibG9jazsgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gaW5wdXQgICovCisgICAgaW5mby0+b3VibG9jayA9IHJfdXNhZ2UucnVfb3VibG9jazsgLyogdGhlIG51bWJlciBvZiB0aW1lcyB0aGUgZmlsZSBzeXN0ZW0gaGFkIHRvIHBlcmZvcm0gb3V0cHV0ICovCisgICAgaW5mby0+bnZjc3cgICA9IHJfdXNhZ2UucnVfbnZjc3c7ICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgaW5mby0+bml2Y3N3ICA9IHJfdXNhZ2UucnVfbml2Y3N3OyAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyBmb3JjZWQgICAgICAgICAgICovCisKKyAgICByZXR1cm4gKHN0YXR1cyAhPSAwKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisgICAgZG91YmxlICAgICAgICAgICAgICB0X25zOworICAgIHN0cnVjdCB0aW1ldmFsICAgICAgdHZhbDsKKyAgICBzdHJ1Y3QgdGltZXNwZWMgICAgIHN0b3A7CisgICAgaW50IHN0YXR1czsKKworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmc3RvcCApOworICAgIHRfbnMgPSBUUzJOUyhzdG9wKSAtIFRTMk5TKF9fa21wX3N5c190aW1lcl9kYXRhLnN0YXJ0KTsKKyAgICAqZGVsdGEgPSAodF9ucyAqIDFlLTkpOworfQorCit2b2lkCitfX2ttcF9jbGVhcl9zeXN0ZW1fdGltZSggdm9pZCApCit7CisgICAgc3RydWN0IHRpbWV2YWwgdHZhbDsKKyAgICBpbnQgc3RhdHVzOworICAgIHN0YXR1cyA9IGdldHRpbWVvZmRheSggJnR2YWwsIE5VTEwgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTF9FUlJOTyggImdldHRpbWVvZmRheSIsIHN0YXR1cyApOworICAgIFRJTUVWQUxfVE9fVElNRVNQRUMoICZ0dmFsLCAmX19rbXBfc3lzX3RpbWVyX2RhdGEuc3RhcnQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmZGVmIEJVSUxEX1RWCisKK3ZvaWQKK19fa21wX3R2X3RocmVhZHByaXZhdGVfc3RvcmUoIGttcF9pbmZvX3QgKnRoLCB2b2lkICpnbG9iYWxfYWRkciwgdm9pZCAqdGhyZWFkX2FkZHIgKQoreworICAgIHN0cnVjdCB0dl9kYXRhICpwOworCisgICAgcCA9IChzdHJ1Y3QgdHZfZGF0YSAqKSBfX2ttcF9hbGxvY2F0ZSggc2l6ZW9mKCAqcCApICk7CisKKyAgICBwLT51LnRwLmdsb2JhbF9hZGRyID0gZ2xvYmFsX2FkZHI7CisgICAgcC0+dS50cC50aHJlYWRfYWRkciA9IHRocmVhZF9hZGRyOworCisgICAgcC0+dHlwZSA9ICh2b2lkICopIDE7CisKKyAgICBwLT5uZXh0ID0gIHRoLT50aC50aF9sb2NhbC50dl9kYXRhOworICAgIHRoLT50aC50aF9sb2NhbC50dl9kYXRhID0gcDsKKworICAgIGlmICggcC0+bmV4dCA9PSAwICkgeworICAgICAgICBpbnQgcmMgPSBwdGhyZWFkX3NldHNwZWNpZmljKCBfX2ttcF90dl9rZXksIHAgKTsKKyAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX3NldHNwZWNpZmljIiwgcmMgKTsKKyAgICB9Cit9CisKKyNlbmRpZiAvKiBCVUlMRF9UViAqLworCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCitzdGF0aWMgaW50CitfX2ttcF9nZXRfeHByb2MoIHZvaWQgKSB7CisKKyAgICBpbnQgciA9IDA7CisKKyAgICAjaWYgS01QX09TX0xJTlVYIHx8IEtNUF9PU19GUkVFQlNEIHx8IEtNUF9PU19ORVRCU0QKKworICAgICAgICByID0gc3lzY29uZiggX1NDX05QUk9DRVNTT1JTX09OTE4gKTsKKworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAvLyBCdWcgQzc3MDExIEhpZ2ggIk9wZW5NUCBUaHJlYWRzIGFuZCBudW1iZXIgb2YgYWN0aXZlIGNvcmVzIi4KKworICAgICAgICAvLyBGaW5kIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIENQVXMuCisgICAgICAgIGtlcm5fcmV0dXJuX3QgICAgICAgICAgcmM7CisgICAgICAgIGhvc3RfYmFzaWNfaW5mb19kYXRhX3QgaW5mbzsKKyAgICAgICAgbWFjaF9tc2dfdHlwZV9udW1iZXJfdCBudW0gPSBIT1NUX0JBU0lDX0lORk9fQ09VTlQ7CisgICAgICAgIHJjID0gaG9zdF9pbmZvKCBtYWNoX2hvc3Rfc2VsZigpLCBIT1NUX0JBU0lDX0lORk8sIChob3N0X2luZm9fdCkgJiBpbmZvLCAmIG51bSApOworICAgICAgICBpZiAoIHJjID09IDAgJiYgbnVtID09IEhPU1RfQkFTSUNfSU5GT19DT1VOVCApIHsKKyAgICAgICAgICAgIC8vIENhbm5vdCB1c2UgS0FfVFJBQ0UoKSBoZXJlIGJlY2F1c2UgdGhpcyBjb2RlIHdvcmtzIGJlZm9yZSB0cmFjZSBzdXBwb3J0IGlzCisgICAgICAgICAgICAvLyBpbml0aWFsaXplZC4KKyAgICAgICAgICAgIHIgPSBpbmZvLmF2YWlsX2NwdXM7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfV0FSTklORyggQ2FudEdldE51bUF2YWlsQ1BVICk7CisgICAgICAgICAgICBLTVBfSU5GT1JNKCBBc3N1bWVkTnVtQ1BVICk7CisgICAgICAgIH07IC8vIGlmCisKKyAgICAjZWxzZQorCisgICAgICAgICNlcnJvciAiVW5rbm93biBvciB1bnN1cHBvcnRlZCBPUy4iCisKKyAgICAjZW5kaWYKKworICAgIHJldHVybiByID4gMCA/IHIgOiAyOyAvKiBndWVzcyB2YWx1ZSBvZiAyIGlmIE9TIHRvbGQgdXMgMCAqLworCit9IC8vIF9fa21wX2dldF94cHJvYworCitpbnQKK19fa21wX3JlYWRfZnJvbV9maWxlKCBjaGFyIGNvbnN0ICpwYXRoLCBjaGFyIGNvbnN0ICpmb3JtYXQsIC4uLiApCit7CisgICAgaW50IHJlc3VsdDsKKyAgICB2YV9saXN0IGFyZ3M7CisKKyAgICB2YV9zdGFydChhcmdzLCBmb3JtYXQpOworICAgIEZJTEUgKmYgPSBmb3BlbihwYXRoLCAicmIiKTsKKyAgICBpZiAoIGYgPT0gTlVMTCApCisgICAgICAgIHJldHVybiAwOworICAgIHJlc3VsdCA9IHZmc2NhbmYoZiwgZm9ybWF0LCBhcmdzKTsKKyAgICBmY2xvc2UoZik7CisKKyAgICByZXR1cm4gcmVzdWx0OworfQorCit2b2lkCitfX2ttcF9ydW50aW1lX2luaXRpYWxpemUoIHZvaWQgKQoreworICAgIGludCBzdGF0dXM7CisgICAgcHRocmVhZF9tdXRleGF0dHJfdCBtdXRleF9hdHRyOworICAgIHB0aHJlYWRfY29uZGF0dHJfdCAgY29uZF9hdHRyOworCisgICAgaWYgKCBfX2ttcF9pbml0X3J1bnRpbWUgKSB7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorCisgICAgI2lmICggS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCApCisgICAgICAgIGlmICggISBfX2ttcF9jcHVpbmZvLmluaXRpYWxpemVkICkgeworICAgICAgICAgICAgX19rbXBfcXVlcnlfY3B1aWQoICZfX2ttcF9jcHVpbmZvICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIF9fa21wX3hwcm9jID0gX19rbXBfZ2V0X3hwcm9jKCk7CisKKyAgICBpZiAoIHN5c2NvbmYoIF9TQ19USFJFQURTICkgKSB7CisKKyAgICAgICAgLyogUXVlcnkgdGhlIG1heGltdW0gbnVtYmVyIG9mIHRocmVhZHMgKi8KKyAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBzeXNjb25mKCBfU0NfVEhSRUFEX1RIUkVBRFNfTUFYICk7CisgICAgICAgIGlmICggX19rbXBfc3lzX21heF9udGggPT0gLTEgKSB7CisgICAgICAgICAgICAvKiBVbmxpbWl0ZWQgdGhyZWFkcyBmb3IgTlBUTCAqLworICAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBJTlRfTUFYOworICAgICAgICB9CisgICAgICAgIGVsc2UgaWYgKCBfX2ttcF9zeXNfbWF4X250aCA8PSAxICkgeworICAgICAgICAgICAgLyogQ2FuJ3QgdGVsbCwganVzdCB1c2UgUFRIUkVBRF9USFJFQURTX01BWCAqLworICAgICAgICAgICAgX19rbXBfc3lzX21heF9udGggPSBLTVBfTUFYX05USDsKKyAgICAgICAgfQorCisgICAgICAgIC8qIFF1ZXJ5IHRoZSBtaW5pbXVtIHN0YWNrIHNpemUgKi8KKyAgICAgICAgX19rbXBfc3lzX21pbl9zdGtzaXplID0gc3lzY29uZiggX1NDX1RIUkVBRF9TVEFDS19NSU4gKTsKKyAgICAgICAgaWYgKCBfX2ttcF9zeXNfbWluX3N0a3NpemUgPD0gMSApIHsKKyAgICAgICAgICAgIF9fa21wX3N5c19taW5fc3Rrc2l6ZSA9IEtNUF9NSU5fU1RLU0laRTsKKyAgICAgICAgfQorICAgIH0KKworICAgIC8qIFNldCB1cCBtaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHN3aXRjaCB0byBUTFMgZ3RpZCAqLworICAgIF9fa21wX3Rsc19ndGlkX21pbiA9IEtNUF9UTFNfR1RJRF9NSU47CisKKyAgICAjaWZkZWYgQlVJTERfVFYKKyAgICAgICAgeworICAgICAgICAgICAgaW50IHJjID0gcHRocmVhZF9rZXlfY3JlYXRlKCAmIF9fa21wX3R2X2tleSwgMCApOworICAgICAgICAgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2tleV9jcmVhdGUiLCByYyApOworICAgICAgICB9CisgICAgI2VuZGlmCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2tleV9jcmVhdGUoICZfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBfX2ttcF9pbnRlcm5hbF9lbmRfZGVzdCApOworICAgIEtNUF9DSEVDS19TWVNGQUlMKCAicHRocmVhZF9rZXlfY3JlYXRlIiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleGF0dHJfaW5pdCggJiBtdXRleF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4YXR0cl9pbml0Iiwgc3RhdHVzICk7CisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9pbml0KCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCwgJiBtdXRleF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX211dGV4X2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRhdHRyX2luaXQoICYgY29uZF9hdHRyICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUwoICJwdGhyZWFkX2NvbmRhdHRyX2luaXQiLCBzdGF0dXMgKTsKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfaW5pdCggJiBfX2ttcF93YWl0X2N2LmNfY29uZCwgJiBjb25kX2F0dHIgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfY29uZF9pbml0Iiwgc3RhdHVzICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9pbml0aWFsaXplKCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gVFJVRTsKK30KKwordm9pZAorX19rbXBfcnVudGltZV9kZXN0cm95KCB2b2lkICkKK3sKKyAgICBpbnQgc3RhdHVzOworCisgICAgaWYgKCAhIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOyAvLyBOb3RoaW5nIHRvIGRvLgorICAgIH07CisKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgX19rbXBfaXR0X2Rlc3Ryb3koKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICBzdGF0dXMgPSBwdGhyZWFkX2tleV9kZWxldGUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2RlbGV0ZSIsIHN0YXR1cyApOworICAgICNpZmRlZiBCVUlMRF9UVgorICAgICAgICBzdGF0dXMgPSBwdGhyZWFkX2tleV9kZWxldGUoIF9fa21wX3R2X2tleSApOworICAgICAgICBLTVBfQ0hFQ0tfU1lTRkFJTCggInB0aHJlYWRfa2V5X2RlbGV0ZSIsIHN0YXR1cyApOworICAgICNlbmRpZgorCisgICAgc3RhdHVzID0gcHRocmVhZF9tdXRleF9kZXN0cm95KCAmIF9fa21wX3dhaXRfbXgubV9tdXRleCApOworICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfbXV0ZXhfZGVzdHJveSIsIHN0YXR1cyApOworICAgIH0KKyAgICBzdGF0dXMgPSBwdGhyZWFkX2NvbmRfZGVzdHJveSggJiBfX2ttcF93YWl0X2N2LmNfY29uZCApOworICAgIGlmICggc3RhdHVzICE9IDAgJiYgc3RhdHVzICE9IEVCVVNZICkgeworICAgICAgICBLTVBfU1lTRkFJTCggInB0aHJlYWRfY29uZF9kZXN0cm95Iiwgc3RhdHVzICk7CisgICAgfQorICAgICNpZiBLTVBfQUZGSU5JVFlfU1VQUE9SVEVECisgICAgICAgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworICAgICNlbmRpZgorCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gRkFMU0U7Cit9CisKKworLyogUHV0IHRoZSB0aHJlYWQgdG8gc2xlZXAgZm9yIGEgdGltZSBwZXJpb2QgKi8KKy8qIE5PVEU6IG5vdCBjdXJyZW50bHkgdXNlZCBhbnl3aGVyZSAqLwordm9pZAorX19rbXBfdGhyZWFkX3NsZWVwKCBpbnQgbWlsbGlzICkKK3sKKyAgICBzbGVlcCggICggbWlsbGlzICsgNTAwICkgLyAxMDAwICk7Cit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpbWUgZm9yIHRoZSB1c2VyICovCit2b2lkCitfX2ttcF9lbGFwc2VkKCBkb3VibGUgKnQgKQoreworICAgIGludCBzdGF0dXM7CisjIGlmZGVmIEZJWF9TR0lfQ0xPQ0sKKyAgICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisKKyAgICBzdGF0dXMgPSBjbG9ja19nZXR0aW1lKCBDTE9DS19QUk9DRVNTX0NQVVRJTUVfSUQsICZ0cyApOworICAgIEtNUF9DSEVDS19TWVNGQUlMX0VSUk5PKCAiY2xvY2tfZ2V0dGltZSIsIHN0YXR1cyApOworICAgICp0ID0gKGRvdWJsZSkgdHMudHZfbnNlYyAqICgxLjAgLyAoZG91YmxlKSBLTVBfTlNFQ19QRVJfU0VDKSArCisgICAgICAgIChkb3VibGUpIHRzLnR2X3NlYzsKKyMgZWxzZQorICAgIHN0cnVjdCB0aW1ldmFsIHR2OworCisgICAgc3RhdHVzID0gZ2V0dGltZW9mZGF5KCAmIHR2LCBOVUxMICk7CisgICAgS01QX0NIRUNLX1NZU0ZBSUxfRVJSTk8oICJnZXR0aW1lb2ZkYXkiLCBzdGF0dXMgKTsKKyAgICAqdCA9IChkb3VibGUpIHR2LnR2X3VzZWMgKiAoMS4wIC8gKGRvdWJsZSkgS01QX1VTRUNfUEVSX1NFQykgKworICAgICAgICAoZG91YmxlKSB0di50dl9zZWM7CisjIGVuZGlmCit9CisKKy8qIENhbGN1bGF0ZSB0aGUgZWxhcHNlZCB3YWxsIGNsb2NrIHRpY2sgZm9yIHRoZSB1c2VyICovCit2b2lkCitfX2ttcF9lbGFwc2VkX3RpY2soIGRvdWJsZSAqdCApCit7CisgICAgKnQgPSAxIC8gKGRvdWJsZSkgQ0xPQ0tTX1BFUl9TRUM7Cit9CisKKy8qIFJldHVybiB0aGUgY3VycmVudCB0aW1lIHN0YW1wIGluIG5zZWMgKi8KK2ttcF91aW50NjQKK19fa21wX25vd19uc2VjKCkKK3sKKyAgICBzdHJ1Y3QgdGltZXZhbCB0OworICAgIGdldHRpbWVvZmRheSgmdCwgTlVMTCk7CisgICAgcmV0dXJuIEtNUF9OU0VDX1BFUl9TRUMqdC50dl9zZWMgKyAxMDAwKnQudHZfdXNlYzsKK30KKworLyoKKyAgICBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLgorKi8KKworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKSB7CisKKyAgICBpbnQgZm91bmQgPSAwOworICAgIGludCByYzsKKworICAgICNpZiBLTVBfT1NfTElOVVggfHwgS01QX09TX0ZSRUVCU0QKKworICAgICAgICAvKgorICAgICAgICAgICAgT24gTGludXgqIE9TLCByZWFkIHRoZSAvcHJvYy88cGlkPi9tYXBzIHBzZXVkby1maWxlIHRvIGdldCBhbGwgdGhlIGFkZHJlc3MgcmFuZ2VzIG1hcHBlZAorICAgICAgICAgICAgaW50byB0aGUgYWRkcmVzcyBzcGFjZS4KKyAgICAgICAgKi8KKworICAgICAgICBjaGFyICogbmFtZSA9IF9fa21wX3N0cl9mb3JtYXQoICIvcHJvYy8lZC9tYXBzIiwgZ2V0cGlkKCkgKTsKKyAgICAgICAgRklMRSAqIGZpbGUgID0gTlVMTDsKKworICAgICAgICBmaWxlID0gZm9wZW4oIG5hbWUsICJyIiApOworICAgICAgICBLTVBfQVNTRVJUKCBmaWxlICE9IE5VTEwgKTsKKworICAgICAgICBmb3IgKCA7IDsgKSB7CisKKyAgICAgICAgICAgIHZvaWQgKiBiZWdpbm5pbmcgPSBOVUxMOworICAgICAgICAgICAgdm9pZCAqIGVuZGluZyAgICA9IE5VTEw7CisgICAgICAgICAgICBjaGFyICAgcGVybXNbIDUgXTsKKworICAgICAgICAgICAgcmMgPSBmc2NhbmYoIGZpbGUsICIlcC0lcCAlNHMgJSpbXlxuXVxuIiwgJiBiZWdpbm5pbmcsICYgZW5kaW5nLCBwZXJtcyApOworICAgICAgICAgICAgaWYgKCByYyA9PSBFT0YgKSB7CisgICAgICAgICAgICAgICAgYnJlYWs7CisgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgS01QX0FTU0VSVCggcmMgPT0gMyAmJiBLTVBfU1RSTEVOKCBwZXJtcyApID09IDQgKTsgLy8gTWFrZSBzdXJlIGFsbCBmaWVsZHMgYXJlIHJlYWQuCisKKyAgICAgICAgICAgIC8vIEVuZGluZyBhZGRyZXNzIGlzIG5vdCBpbmNsdWRlZCBpbiB0aGUgcmVnaW9uLCBidXQgYmVnaW5uaW5nIGlzLgorICAgICAgICAgICAgaWYgKCAoIGFkZHIgPj0gYmVnaW5uaW5nICkgJiYgKCBhZGRyIDwgZW5kaW5nICkgKSB7CisgICAgICAgICAgICAgICAgcGVybXNbIDIgXSA9IDA7ICAgIC8vIDN0aCBhbmQgNHRoIGNoYXJhY3RlciBkb2VzIG5vdCBtYXR0ZXIuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHBlcm1zLCAicnciICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgLy8gTWVtb3J5IHdlIGFyZSBsb29raW5nIGZvciBzaG91bGQgYmUgcmVhZGFibGUgYW5kIHdyaXRhYmxlLgorICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IDE7CisgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICBicmVhazsKKyAgICAgICAgICAgIH07IC8vIGlmCisKKyAgICAgICAgfTsgLy8gZm9yZXZlcgorCisgICAgICAgIC8vIEZyZWUgcmVzb3VyY2VzLgorICAgICAgICBmY2xvc2UoIGZpbGUgKTsKKyAgICAgICAgS01QX0lOVEVSTkFMX0ZSRUUoIG5hbWUgKTsKKworICAgICNlbGlmIEtNUF9PU19EQVJXSU4KKworICAgICAgICAvKgorICAgICAgICAgICAgT24gT1MgWCosIC9wcm9jIHBzZXVkbyBmaWxlc3lzdGVtIGlzIG5vdCBhdmFpbGFibGUuIFRyeSB0byByZWFkIG1lbW9yeSB1c2luZyB2bQorICAgICAgICAgICAgaW50ZXJmYWNlLgorICAgICAgICAqLworCisgICAgICAgIGludCAgICAgICBidWZmZXI7CisgICAgICAgIHZtX3NpemVfdCBjb3VudDsKKyAgICAgICAgcmMgPQorICAgICAgICAgICAgdm1fcmVhZF9vdmVyd3JpdGUoCisgICAgICAgICAgICAgICAgbWFjaF90YXNrX3NlbGYoKSwgICAgICAgICAgIC8vIFRhc2sgdG8gcmVhZCBtZW1vcnkgb2YuCisgICAgICAgICAgICAgICAgKHZtX2FkZHJlc3NfdCkoIGFkZHIgKSwgICAgIC8vIEFkZHJlc3MgdG8gcmVhZCBmcm9tLgorICAgICAgICAgICAgICAgIDEsICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBOdW1iZXIgb2YgYnl0ZXMgdG8gYmUgcmVhZC4KKyAgICAgICAgICAgICAgICAodm1fYWRkcmVzc190KSggJiBidWZmZXIgKSwgLy8gQWRkcmVzcyBvZiBidWZmZXIgdG8gc2F2ZSByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgICAgICYgY291bnQgICAgICAgICAgICAgICAgICAgICAvLyBBZGRyZXNzIG9mIHZhciB0byBzYXZlIG51bWJlciBvZiByZWFkIGJ5dGVzIGluLgorICAgICAgICAgICAgKTsKKyAgICAgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICAgICAgLy8gTWVtb3J5IHN1Y2Nlc3NmdWxseSByZWFkLgorICAgICAgICAgICAgZm91bmQgPSAxOworICAgICAgICB9OyAvLyBpZgorCisgICAgI2VsaWYgS01QX09TX0ZSRUVCU0QgfHwgS01QX09TX05FVEJTRAorCisgICAgICAgIC8vIEZJWE1FKEZyZWVCU0QsIE5ldEJTRCk6IEltcGxlbWVudCB0aGlzCisgICAgICAgIGZvdW5kID0gMTsKKworICAgICNlbHNlCisKKyAgICAgICAgI2Vycm9yICJVbmtub3duIG9yIHVuc3VwcG9ydGVkIE9TIgorCisgICAgI2VuZGlmCisKKyAgICByZXR1cm4gZm91bmQ7CisKK30gLy8gX19rbXBfaXNfYWRkcmVzc19tYXBwZWQKKworI2lmZGVmIFVTRV9MT0FEX0JBTEFOQ0UKKworCisjIGlmIEtNUF9PU19EQVJXSU4KKworLy8gVGhlIGZ1bmN0aW9uIHJldHVybnMgdGhlIHJvdW5kZWQgdmFsdWUgb2YgdGhlIHN5c3RlbSBsb2FkIGF2ZXJhZ2UKKy8vIGR1cmluZyBnaXZlbiB0aW1lIGludGVydmFsIHdoaWNoIGRlcGVuZHMgb24gdGhlIHZhbHVlIG9mCisvLyBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgdmFyaWFibGUgKGRlZmF1bHQgaXMgNjAgc2VjLCBvdGhlciB2YWx1ZXMKKy8vIG1heSBiZSAzMDAgc2VjIG9yIDkwMCBzZWMpLgorLy8gSXQgcmV0dXJucyAtMSBpbiBjYXNlIG9mIGVycm9yLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBkb3VibGUgYXZlcmFnZXNbM107CisgICAgaW50IHJldF9hdmcgPSAwOworCisgICAgaW50IHJlcyA9IGdldGxvYWRhdmcoIGF2ZXJhZ2VzLCAzICk7CisKKyAgICAvL0NoZWNrIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCB0byBkZXRlcm1pbmUgd2hpY2ggb2YgYXZlcmFnZXMgdG8gdXNlLgorICAgIC8vIGdldGxvYWRhdmcoKSBtYXkgcmV0dXJuIHRoZSBudW1iZXIgb2Ygc2FtcGxlcyBsZXNzIHRoYW4gcmVxdWVzdGVkIHRoYXQgaXMKKyAgICAvLyBsZXNzIHRoYW4gMy4KKyAgICBpZiAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA8IDE4MCAmJiAoIHJlcyA+PSAxICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1swXTsvLyAxIG1pbgorICAgIH0gZWxzZSBpZiAoICggX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsID49IDE4MAorICAgICAgICAgICAgICAgICAgJiYgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsIDwgNjAwICkgJiYgKCByZXMgPj0gMiApICkgeworICAgICAgICByZXRfYXZnID0gYXZlcmFnZXNbMV07Ly8gNSBtaW4KKyAgICB9IGVsc2UgaWYgKCAoIF9fa21wX2xvYWRfYmFsYW5jZV9pbnRlcnZhbCA+PSA2MDAgKSAmJiAoIHJlcyA9PSAzICkgKSB7CisgICAgICAgIHJldF9hdmcgPSBhdmVyYWdlc1syXTsvLyAxNSBtaW4KKyAgICB9IGVsc2Ugey8vIEVycm9yIG9jY3VycmVkCisgICAgICAgIHJldHVybiAtMTsKKyAgICB9CisKKyAgICByZXR1cm4gcmV0X2F2ZzsKK30KKworIyBlbHNlIC8vIExpbnV4KiBPUworCisvLyBUaGUgZnVjdGlvbiByZXR1cm5zIG51bWJlciBvZiBydW5uaW5nIChub3Qgc2xlZXBpbmcpIHRocmVhZHMsIG9yIC0xIGluIGNhc2Ugb2YgZXJyb3IuCisvLyBFcnJvciBjb3VsZCBiZSByZXBvcnRlZCBpZiBMaW51eCogT1Mga2VybmVsIHRvbyBvbGQgKHdpdGhvdXQgIi9wcm9jIiBzdXBwb3J0KS4KKy8vIENvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBzdG9wcyBpZiBtYXggcnVubmluZyB0aHJlYWRzIGVuY291bnRlcmVkLgoraW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkKK3sKKyAgICBzdGF0aWMgaW50IHBlcm1hbmVudF9lcnJvciA9IDA7CisKKyAgICBzdGF0aWMgaW50ICAgICBnbGJfcnVubmluZ190aHJlYWRzICAgICAgICAgID0gMDsgIC8qIFNhdmVkIGNvdW50IG9mIHRoZSBydW5uaW5nIHRocmVhZHMgZm9yIHRoZSB0aHJlYWQgYmFsYW5jZSBhbGdvcnRpaG0gKi8KKyAgICBzdGF0aWMgZG91YmxlICBnbGJfY2FsbF90aW1lID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorCisgICAgRElSICAqICAgICAgICAgIHByb2NfZGlyICAgPSBOVUxMOyAgICAvLyBIYW5kbGUgb2YgIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiBwcm9jX2VudHJ5ID0gTlVMTDsKKworICAgIGttcF9zdHJfYnVmX3QgICB0YXNrX3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vIiBwYXRoLgorICAgIERJUiAgKiAgICAgICAgICB0YXNrX2RpciAgID0gTlVMTDsgICAgLy8gSGFuZGxlIG9mICIvcHJvYy88cGlkPi90YXNrLzx0aWQ+LyIgZGlyZWN0b3J5LgorICAgIHN0cnVjdCBkaXJlbnQgKiB0YXNrX2VudHJ5ID0gTlVMTDsKKyAgICBpbnQgICAgICAgICAgICAgdGFza19wYXRoX2ZpeGVkX2xlbjsKKworICAgIGttcF9zdHJfYnVmX3QgICBzdGF0X3BhdGg7ICAgICAgICAgICAgLy8gIi9wcm9jLzxwaWQ+L3Rhc2svPHRpZD4vc3RhdCIgcGF0aC4KKyAgICBpbnQgICAgICAgICAgICAgc3RhdF9maWxlID0gLTE7CisgICAgaW50ICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW47CisKKyAgICBpbnQgdG90YWxfcHJvY2Vzc2VzID0gMDsgICAgICAgICAgICAgIC8vIFRvdGFsIG51bWJlciBvZiBwcm9jZXNzZXMgaW4gc3lzdGVtLgorICAgIGludCB0b3RhbF90aHJlYWRzICAgPSAwOyAgICAgICAgICAgICAgLy8gVG90YWwgbnVtYmVyIG9mIHRocmVhZHMgaW4gc3lzdGVtLgorCisgICAgZG91YmxlIGNhbGxfdGltZSA9IDAuMDsKKworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiB0YXNrX3BhdGggKTsKKyAgICBfX2ttcF9zdHJfYnVmX2luaXQoICYgc3RhdF9wYXRoICk7CisKKyAgICAgX19rbXBfZWxhcHNlZCggJiBjYWxsX3RpbWUgKTsKKworICAgIGlmICggZ2xiX2NhbGxfdGltZSAmJgorICAgICAgICAgICAgKCBjYWxsX3RpbWUgLSBnbGJfY2FsbF90aW1lIDwgX19rbXBfbG9hZF9iYWxhbmNlX2ludGVydmFsICkgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IGdsYl9ydW5uaW5nX3RocmVhZHM7CisgICAgICAgIGdvdG8gZmluaXNoOworICAgIH0KKworICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBzY2FubmluZyAiL3Byb2MvIiBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggcGVybWFuZW50X2Vycm9yICkgeworICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfTsgLy8gaWYKKworICAgIGlmICggbWF4IDw9IDAgKSB7CisgICAgICAgIG1heCA9IElOVF9NQVg7CisgICAgfTsgLy8gaWYKKworICAgIC8vIE9wZW4gIi9wcm9jLyIgZGlyZWN0b3J5LgorICAgIHByb2NfZGlyID0gb3BlbmRpciggIi9wcm9jIiApOworICAgIGlmICggcHJvY19kaXIgPT0gTlVMTCApIHsKKyAgICAgICAgLy8gQ2Fubm90IG9wZW4gIi9wcnJvYy8iLiBQcm9iYWJseSB0aGUga2VybmVsIGRvZXMgbm90IHN1cHBvcnQgaXQuIFJldHVybiBhbiBlcnJvciBub3cgYW5kCisgICAgICAgIC8vIGluIHN1YnNlcXVlbnQgY2FsbHMuCisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBwZXJtYW5lbnRfZXJyb3IgPSAxOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgLy8gSW5pdGlhbGl6ZSBmaXhlZCBwYXJ0IG9mIHRhc2tfcGF0aC4gVGhpcyBwYXJ0IHdpbGwgbm90IGNoYW5nZS4KKyAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvcHJvYy8iLCA2ICk7CisgICAgdGFza19wYXRoX2ZpeGVkX2xlbiA9IHRhc2tfcGF0aC51c2VkOyAgICAvLyBSZW1lbWJlciBudW1iZXIgb2YgdXNlZCBjaGFyYWN0ZXJzLgorCisgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgd2hpbGUgKCBwcm9jX2VudHJ5ICE9IE5VTEwgKSB7CisgICAgICAgIC8vIFByb2MgZW50cnkgaXMgYSBkaXJlY3RvcnkgYW5kIG5hbWUgc3RhcnRzIHdpdGggYSBkaWdpdC4gQXNzdW1lIGl0IGlzIGEgcHJvY2VzcycKKyAgICAgICAgLy8gZGlyZWN0b3J5LgorICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggcHJvY19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgKysgdG90YWxfcHJvY2Vzc2VzOworICAgICAgICAgICAgLy8gTWFrZSBzdXJlIGluaXQgcHJvY2VzcyBpcyB0aGUgdmVyeSBmaXJzdCBpbiAiL3Byb2MiLCBzbyB3ZSBjYW4gcmVwbGFjZQorICAgICAgICAgICAgLy8gc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgd2l0aCBzaW1wbGVyIHRvdGFsX3Byb2Nlc3NlcyA9PSAxLgorICAgICAgICAgICAgLy8gV2UgYXJlIGdvaW5nIHRvIGNoZWNrIHRoYXQgdG90YWxfcHJvY2Vzc2VzID09IDEgPT4gZF9uYW1lID09ICIxIiBpcyB0cnVlICh3aGVyZQorICAgICAgICAgICAgLy8gIj0+IiBpcyBpbXBsaWNhdGlvbikuIFNpbmNlIEMrKyBkb2VzIG5vdCBoYXZlID0+IG9wZXJhdG9yLCBsZXQgdXMgcmVwbGFjZSBpdCB3aXRoIGl0cworICAgICAgICAgICAgLy8gZXF1aXZhbGVudDogYSA9PiBiID09ICEgYSB8fCBiLgorICAgICAgICAgICAgS01QX0RFQlVHX0FTU0VSVCggdG90YWxfcHJvY2Vzc2VzICE9IDEgfHwgc3RyY21wKCBwcm9jX2VudHJ5LT5kX25hbWUsICIxIiApID09IDAgKTsKKworICAgICAgICAgICAgLy8gQ29uc3RydWN0IHRhc2tfcGF0aC4KKyAgICAgICAgICAgIHRhc2tfcGF0aC51c2VkID0gdGFza19wYXRoX2ZpeGVkX2xlbjsgICAgLy8gUmVzZXQgdGFza19wYXRoIHRvICIvcHJvYy8iLgorICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgdGFza19wYXRoLCBwcm9jX2VudHJ5LT5kX25hbWUsIEtNUF9TVFJMRU4oIHByb2NfZW50cnktPmRfbmFtZSApICk7CisgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiB0YXNrX3BhdGgsICIvdGFzayIsIDUgKTsKKworICAgICAgICAgICAgdGFza19kaXIgPSBvcGVuZGlyKCB0YXNrX3BhdGguc3RyICk7CisgICAgICAgICAgICBpZiAoIHRhc2tfZGlyID09IE5VTEwgKSB7CisgICAgICAgICAgICAgICAgLy8gUHJvY2VzcyBjYW4gZmluaXNoIGJldHdlZW4gcmVhZGluZyAiL3Byb2MvIiBkaXJlY3RvcnkgZW50cnkgYW5kIG9wZW5pbmcgcHJvY2VzcycKKyAgICAgICAgICAgICAgICAvLyAidGFzay8iIGRpcmVjdG9yeS4gU28sIGluIGdlbmVyYWwgY2FzZSB3ZSBzaG91bGQgbm90IGNvbXBsYWluLCBidXQgaGF2ZSB0byBza2lwCisgICAgICAgICAgICAgICAgLy8gdGhpcyBwcm9jZXNzIGFuZCByZWFkIHRoZSBuZXh0IG9uZS4KKyAgICAgICAgICAgICAgICAvLyBCdXQgb24gc3lzdGVtcyB3aXRoIG5vICJ0YXNrLyIgc3VwcG9ydCB3ZSB3aWxsIHNwZW5kIGxvdCBvZiB0aW1lIHRvIHNjYW4gIi9wcm9jLyIKKyAgICAgICAgICAgICAgICAvLyB0cmVlIGFnYWluIGFuZCBhZ2FpbiB3aXRob3V0IGFueSBiZW5lZml0LiAiaW5pdCIgcHJvY2VzcyAoaXRzIHBpZCBpcyAxKSBzaG91bGQKKyAgICAgICAgICAgICAgICAvLyBleGlzdCBhbHdheXMsIHNvLCBpZiB3ZSBjYW5ub3Qgb3BlbiAiL3Byb2MvMS90YXNrLyIgZGlyZWN0b3J5LCBpdCBtZWFucyAidGFzay8iCisgICAgICAgICAgICAgICAgLy8gaXMgbm90IHN1cHBvcnRlZCBieSBrZXJuZWwuIFJlcG9ydCBhbiBlcnJvciBub3cgYW5kIGluIHRoZSBmdXR1cmUuCisgICAgICAgICAgICAgICAgaWYgKCBzdHJjbXAoIHByb2NfZW50cnktPmRfbmFtZSwgIjEiICkgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7CisgICAgICAgICAgICAgICAgICAgIHBlcm1hbmVudF9lcnJvciA9IDE7CisgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAvLyBDb25zdHJ1Y3QgZml4ZWQgcGFydCBvZiBzdGF0IGZpbGUgcGF0aC4KKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NsZWFyKCAmIHN0YXRfcGF0aCApOworICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19wYXRoLnN0ciwgdGFza19wYXRoLnVzZWQgKTsKKyAgICAgICAgICAgICAgICBfX2ttcF9zdHJfYnVmX2NhdCggJiBzdGF0X3BhdGgsICIvIiwgMSApOworICAgICAgICAgICAgICAgIHN0YXRfcGF0aF9maXhlZF9sZW4gPSBzdGF0X3BhdGgudXNlZDsKKworICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIHdoaWxlICggdGFza19lbnRyeSAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAvLyBJdCBpcyBhIGRpcmVjdG9yeSBhbmQgbmFtZSBzdGFydHMgd2l0aCBhIGRpZ2l0LgorICAgICAgICAgICAgICAgICAgICBpZiAoIHByb2NfZW50cnktPmRfdHlwZSA9PSBEVF9ESVIgJiYgaXNkaWdpdCggdGFza19lbnRyeS0+ZF9uYW1lWyAwIF0gKSApIHsKKworICAgICAgICAgICAgICAgICAgICAgICAgKysgdG90YWxfdGhyZWFkczsKKworICAgICAgICAgICAgICAgICAgICAgICAgLy8gQ29uc3J1Y3QgY29tcGxldGUgc3RhdCBmaWxlIHBhdGguIEVhc2llc3Qgd2F5IHdvdWxkIGJlOgorICAgICAgICAgICAgICAgICAgICAgICAgLy8gIF9fa21wX3N0cl9idWZfcHJpbnQoICYgc3RhdF9wYXRoLCAiJXMvJXMvc3RhdCIsIHRhc2tfcGF0aC5zdHIsIHRhc2tfZW50cnktPmRfbmFtZSApOworICAgICAgICAgICAgICAgICAgICAgICAgLy8gYnV0IHNlcmlhZSBvZiBfX2ttcF9zdHJfYnVmX2NhdCB3b3JrcyBhIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X3BhdGgudXNlZCA9IHN0YXRfcGF0aF9maXhlZF9sZW47ICAgIC8vIFJlc2V0IHN0YXQgcGF0aCB0byBpdHMgZml4ZWQgcGFydC4KKyAgICAgICAgICAgICAgICAgICAgICAgIF9fa21wX3N0cl9idWZfY2F0KCAmIHN0YXRfcGF0aCwgdGFza19lbnRyeS0+ZF9uYW1lLCBLTVBfU1RSTEVOKCB0YXNrX2VudHJ5LT5kX25hbWUgKSApOworICAgICAgICAgICAgICAgICAgICAgICAgX19rbXBfc3RyX2J1Zl9jYXQoICYgc3RhdF9wYXRoLCAiL3N0YXQiLCA1ICk7CisKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIE5vdGU6IExvdy1sZXZlbCBBUEkgKG9wZW4vcmVhZC9jbG9zZSkgaXMgdXNlZC4gSGlnaC1sZXZlbCBBUEkKKyAgICAgICAgICAgICAgICAgICAgICAgIC8vIChmb3Blbi9mY2xvc2UpICB3b3JrcyB+IDMwICUgc2xvd2VyLgorICAgICAgICAgICAgICAgICAgICAgICAgc3RhdF9maWxlID0gb3Blbiggc3RhdF9wYXRoLnN0ciwgT19SRE9OTFkgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgIGlmICggc3RhdF9maWxlID09IC0xICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFdlIGNhbm5vdCByZXBvcnQgYW4gZXJyb3IgYmVjYXVzZSB0YXNrICh0aHJlYWQpIGNhbiB0ZXJtaW5hdGUganVzdAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJlZm9yZSByZWFkaW5nIHRoaXMgZmlsZS4KKyAgICAgICAgICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyoKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgQ29udGVudCBvZiAic3RhdCIgZmlsZSBsb29rcyBsaWtlOgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAyNDI4NSAocHJvZ3JhbSkgUyAuLi4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBJdCBpcyBhIHNpbmdsZSBsaW5lIChpZiBwcm9ncmFtIG5hbWUgZG9lcyBub3QgaW5jbHVkZSBmYW5ueQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBzeW1ib2xzKS4gRmlyc3QgbnVtYmVyIGlzIGEgdGhyZWFkIGlkLCB0aGVuIG5hbWUgb2YgZXhlY3V0YWJsZSBmaWxlCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWUgaW4gcGFyZXRoZXNlcywgdGhlbiBzdGF0ZSBvZiB0aGUgdGhyZWFkLiBXZSBuZWVkIGp1c3QgdGhyZWFkCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0YXRlLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdvb2QgbmV3czogTGVuZ3RoIG9mIHByb2dyYW0gbmFtZSBpcyAxNSBjaGFyYWN0ZXJzIG1heC4gTG9uZ2VyCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIG5hbWVzIGFyZSB0cnVuY2F0ZWQuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVGh1cywgd2UgbmVlZCByYXRoZXIgc2hvcnQgYnVmZmVyOiAxNSBjaGFycyBmb3IgcHJvZ3JhbSBuYW1lICsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMiBwYXJlbnRoZXNpcywgKyAzIHNwYWNlcyArIH43IGRpZ2l0cyBvZiBwaWQgPSAzNy4KKworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBCYWQgbmV3czogUHJvZ3JhbSBuYW1lIG1heSBjb250YWluIHNwZWNpYWwgc3ltYm9scyBsaWtlIHNwYWNlLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjbG9zaW5nIHBhcmVudGhlc2lzLCBvciBldmVuIG5ldyBsaW5lLiBUaGlzIG1ha2VzIHBhcnNpbmcgInN0YXQiCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZpbGUgbm90IDEwMCAlIHJlbGlhYmxlLiBJbiBjYXNlIG9mIGZhbm55IHByb2dyYW0gbmFtZXMgcGFyc2luZworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBtYXkgZmFpbCAocmVwb3J0IGluY29ycmVjdCB0aHJlYWQgc3RhdGUpLgorCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFBhcnNpbmcgInN0YXR1cyIgZmlsZSBsb29rcyBtb3JlIHByb21pc3NpbmcgKGR1ZSB0byBkaWZmZXJlbnQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmlsZSBzdHJ1Y3R1cmUgYW5kIGVzY2FwaW5nIHNwZWNpYWwgc3ltYm9scykgYnV0IHJlYWRpbmcgYW5kCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHBhcnNpbmcgb2YgInN0YXR1cyIgZmlsZSB3b3JrcyBzbG93ZXIuCisKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLS0gbG4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgYnVmZmVyWyA2NSBdOworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGludCBsZW47CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgbGVuID0gcmVhZCggc3RhdF9maWxlLCBidWZmZXIsIHNpemVvZiggYnVmZmVyICkgLSAxICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBsZW4gPj0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgYnVmZmVyWyBsZW4gXSA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFVzaW5nIHNjYW5mOgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyAgICAgc3NjYW5mKCBidWZmZXIsICIlKmQgKCUqcykgJWMgIiwgJiBzdGF0ZSApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvLyBsb29rcyB2ZXJ5IG5pY2UsIGJ1dCBzZWFyY2hpbmcgZm9yIGEgY2xvc2luZyBwYXJlbnRoZXNpcyB3b3JrcyBhCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIGJpdCBmYXN0ZXIuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNoYXIgKiBjbG9zZV9wYXJlbnQgPSBzdHJzdHIoIGJ1ZmZlciwgIikgIiApOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGNsb3NlX3BhcmVudCAhPSBOVUxMICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgY2hhciBzdGF0ZSA9ICogKCBjbG9zZV9wYXJlbnQgKyAyICk7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09ICdSJyApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICArKyBydW5uaW5nX3RocmVhZHM7CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPj0gbWF4ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB9OyAvLyBpZgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICBzdGF0X2ZpbGUgPSAtMTsKKyAgICAgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIH07IC8vIGlmCisgICAgICAgICAgICAgICAgICAgIHRhc2tfZW50cnkgPSByZWFkZGlyKCB0YXNrX2RpciApOworICAgICAgICAgICAgICAgIH07IC8vIHdoaWxlCisgICAgICAgICAgICAgICAgY2xvc2VkaXIoIHRhc2tfZGlyICk7CisgICAgICAgICAgICAgICAgdGFza19kaXIgPSBOVUxMOworICAgICAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgcHJvY19lbnRyeSA9IHJlYWRkaXIoIHByb2NfZGlyICk7CisgICAgfTsgLy8gd2hpbGUKKworICAgIC8vCisgICAgLy8gVGhlcmUgX21pZ2h0XyBiZSBhIHRpbWluZyBob2xlIHdoZXJlIHRoZSB0aHJlYWQgZXhlY3V0aW5nIHRoaXMKKyAgICAvLyBjb2RlIGdldCBza2lwcGVkIGluIHRoZSBsb2FkIGJhbGFuY2UsIGFuZCBydW5uaW5nX3RocmVhZHMgaXMgMC4KKyAgICAvLyBBc3NlcnQgaW4gdGhlIGRlYnVnIGJ1aWxkcyBvbmx5ISEhCisgICAgLy8KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBydW5uaW5nX3RocmVhZHMgPiAwICk7CisgICAgaWYgKCBydW5uaW5nX3RocmVhZHMgPD0gMCApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gMTsKKyAgICB9CisKKyAgICBmaW5pc2g6IC8vIENsZWFuIHVwIGFuZCBleGl0LgorICAgICAgICBpZiAoIHByb2NfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggcHJvY19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHRhc2tfcGF0aCApOworICAgICAgICBpZiAoIHRhc2tfZGlyICE9IE5VTEwgKSB7CisgICAgICAgICAgICBjbG9zZWRpciggdGFza19kaXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc3RyX2J1Zl9mcmVlKCAmIHN0YXRfcGF0aCApOworICAgICAgICBpZiAoIHN0YXRfZmlsZSAhPSAtMSApIHsKKyAgICAgICAgICAgIGNsb3NlKCBzdGF0X2ZpbGUgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgIGdsYl9ydW5uaW5nX3RocmVhZHMgPSBydW5uaW5nX3RocmVhZHM7CisKKyAgICByZXR1cm4gcnVubmluZ190aHJlYWRzOworCit9IC8vIF9fa21wX2dldF9sb2FkX2JhbGFuY2UKKworIyBlbmRpZiAvLyBLTVBfT1NfREFSV0lOCisKKyNlbmRpZiAvLyBVU0VfTE9BRF9CQUxBTkNFCisKKyNpZiAhKEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgfHwgS01QX01JQyB8fCAoS01QX09TX0xJTlVYICYmIEtNUF9BUkNIX0FBUkNINjQpIHx8IEtNUF9BUkNIX1BQQzY0KQorCisvLyB3ZSByZWFsbHkgb25seSBuZWVkIHRoZSBjYXNlIHdpdGggMSBhcmd1bWVudCwgYmVjYXVzZSBDTEFORyBhbHdheXMgYnVpbGQKKy8vIGEgc3RydWN0IG9mIHBvaW50ZXJzIHRvIHNoYXJlZCB2YXJpYWJsZXMgcmVmZXJlbmNlZCBpbiB0aGUgb3V0bGluZWQgZnVuY3Rpb24KK2ludAorX19rbXBfaW52b2tlX21pY3JvdGFzayggbWljcm90YXNrX3QgcGtmbiwKKyAgICAgICAgICAgICAgICAgICAgICAgIGludCBndGlkLCBpbnQgdGlkLAorICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdCisjaWYgT01QVF9TVVBQT1JUCisgICAgICAgICAgICAgICAgICAgICAgICAsIHZvaWQgKipleGl0X2ZyYW1lX3B0cgorI2VuZGlmCispCit7CisjaWYgT01QVF9TVVBQT1JUCisgICpleGl0X2ZyYW1lX3B0ciA9IF9fYnVpbHRpbl9mcmFtZV9hZGRyZXNzKDApOworI2VuZGlmCisKKyAgc3dpdGNoIChhcmdjKSB7CisgIGRlZmF1bHQ6CisgICAgZnByaW50ZihzdGRlcnIsICJUb28gbWFueSBhcmdzIHRvIG1pY3JvdGFzazogJWQhXG4iLCBhcmdjKTsKKyAgICBmZmx1c2goc3RkZXJyKTsKKyAgICBleGl0KC0xKTsKKyAgY2FzZSAwOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQpOworICAgIGJyZWFrOworICBjYXNlIDE6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAyOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdKTsKKyAgICBicmVhazsKKyAgY2FzZSAzOgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0pOworICAgIGJyZWFrOworICBjYXNlIDQ6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdKTsKKyAgICBicmVhazsKKyAgY2FzZSA1OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdKTsKKyAgICBicmVhazsKKyAgY2FzZSA2OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdKTsKKyAgICBicmVhazsKKyAgY2FzZSA3OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0pOworICAgIGJyZWFrOworICBjYXNlIDg6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddKTsKKyAgICBicmVhazsKKyAgY2FzZSA5OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMDoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxMjoKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSk7CisgICAgYnJlYWs7CisgIGNhc2UgMTM6CisgICAgKCpwa2ZuKSgmZ3RpZCwgJnRpZCwgcF9hcmd2WzBdLCBwX2FyZ3ZbMV0sIHBfYXJndlsyXSwgcF9hcmd2WzNdLCBwX2FyZ3ZbNF0sCisgICAgICAgICAgICBwX2FyZ3ZbNV0sIHBfYXJndls2XSwgcF9hcmd2WzddLCBwX2FyZ3ZbOF0sIHBfYXJndls5XSwgcF9hcmd2WzEwXSwKKyAgICAgICAgICAgIHBfYXJndlsxMV0sIHBfYXJndlsxMl0pOworICAgIGJyZWFrOworICBjYXNlIDE0OgorICAgICgqcGtmbikoJmd0aWQsICZ0aWQsIHBfYXJndlswXSwgcF9hcmd2WzFdLCBwX2FyZ3ZbMl0sIHBfYXJndlszXSwgcF9hcmd2WzRdLAorICAgICAgICAgICAgcF9hcmd2WzVdLCBwX2FyZ3ZbNl0sIHBfYXJndls3XSwgcF9hcmd2WzhdLCBwX2FyZ3ZbOV0sIHBfYXJndlsxMF0sCisgICAgICAgICAgICBwX2FyZ3ZbMTFdLCBwX2FyZ3ZbMTJdLCBwX2FyZ3ZbMTNdKTsKKyAgICBicmVhazsKKyAgY2FzZSAxNToKKyAgICAoKnBrZm4pKCZndGlkLCAmdGlkLCBwX2FyZ3ZbMF0sIHBfYXJndlsxXSwgcF9hcmd2WzJdLCBwX2FyZ3ZbM10sIHBfYXJndls0XSwKKyAgICAgICAgICAgIHBfYXJndls1XSwgcF9hcmd2WzZdLCBwX2FyZ3ZbN10sIHBfYXJndls4XSwgcF9hcmd2WzldLCBwX2FyZ3ZbMTBdLAorICAgICAgICAgICAgcF9hcmd2WzExXSwgcF9hcmd2WzEyXSwgcF9hcmd2WzEzXSwgcF9hcmd2WzE0XSk7CisgICAgYnJlYWs7CisgIH0KKworI2lmIE9NUFRfU1VQUE9SVAorICAqZXhpdF9mcmFtZV9wdHIgPSAwOworI2VuZGlmCisKKyAgcmV0dXJuIDE7Cit9CisKKyNlbmRpZgorCisvLyBlbmQgb2YgZmlsZSAvLworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS9zcmMvel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNGY5YTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfYXNtLmFzbQpAQCAtMCwwICsxLDE0MDIgQEAKKzsgIHpfV2luZG93c19OVC01ODZfYXNtLmFzbTogIC0gbWljcm90YXNraW5nIHJvdXRpbmVzIHNwZWNpZmljYWxseQorOyAgICB3cml0dGVuIGZvciBJQS0zMiBhcmNoaXRlY3R1cmUgYW5kIEludGVsKFIpIDY0IHJ1bm5pbmcgV2luZG93cyogT1MKKworOworOy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCis7Ly8KKzsvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCis7Ly8KKzsvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCis7Ly8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCis7Ly8KKzsvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworOworCisgICAgICAgIFRJVExFICAgel9XaW5kb3dzX05ULTU4Nl9hc20uYXNtCisKKzsgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT0gSUEtMzIgYXJjaGl0ZWN0dXJlID09PT09PT09PT09PT09PT09PT09PT09PT09CitpZmRlZiBfTV9JQTMyCisKKyAgICAgICAgLjU4NlAKKworaWYgQFZlcnNpb24gZ3QgNTEwCisgICAgICAgIC5tb2RlbCBIVUdFCitlbHNlCitfVEVYVCAgIFNFR01FTlQgUEFSQSBVU0UzMiBQVUJMSUMgJ0NPREUnCitfVEVYVCAgIEVORFMKK19EQVRBICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0RBVEEnCitfREFUQSAgIEVORFMKK0NPTlNUICAgU0VHTUVOVCBEV09SRCBVU0UzMiBQVUJMSUMgJ0NPTlNUJworQ09OU1QgICBFTkRTCitfQlNTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdCU1MnCitfQlNTICAgIEVORFMKKyQkU1lNQk9MUyAgICAgICBTRUdNRU5UIEJZVEUgVVNFMzIgJ0RFQlNZTScKKyQkU1lNQk9MUyAgICAgICBFTkRTCiskJFRZUEVTIFNFR01FTlQgQllURSBVU0UzMiAnREVCVFlQJworJCRUWVBFUyBFTkRTCitfVExTICAgIFNFR01FTlQgRFdPUkQgVVNFMzIgUFVCTElDICdUTFMnCitfVExTICAgIEVORFMKK0ZMQVQgICAgR1JPVVAgX0RBVEEsIENPTlNULCBfQlNTCisgICAgICAgIEFTU1VNRSAgQ1M6IEZMQVQsIERTOiBGTEFULCBTUzogRkxBVAorZW5kaWYKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfcGF1c2UKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfcGF1c2UoIHZvaWQgKQorOworCitQVUJMSUMgIF9fX2ttcF94ODZfcGF1c2UKK19wJCA9IDQKK19kJCA9IDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19fa21wX3g4Nl9wYXVzZSBQUk9DIE5FQVIKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIDs7IHBhdXNlCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X3BhdXNlIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94ODZfY3B1aWQKKzsKKzsgdm9pZAorOyBfX2ttcF94ODZfY3B1aWQoIGludCBtb2RlLCBpbnQgbW9kZTIsIHN0cnVjdCBrbXBfY3B1aWQgKnAgKTsKKzsKKworUFVCTElDICBfX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19tb2RlJCAgPSA4CitfbW9kZTIkID0gMTIKK19wJCAgICAgPSAxNgorX2VheCQgICA9IDAKK19lYngkICAgPSA0CitfZWN4JCAgID0gOAorX2VkeCQgICA9IDEyCisKK19fX2ttcF94ODZfY3B1aWQgUFJPQyBORUFSCisKKyAgICAgICAgcHVzaCAgICAgIGVicAorICAgICAgICBtb3YgICAgICAgZWJwLCBlc3AKKworICAgICAgICBwdXNoICAgICAgZWRpCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVjeAorICAgICAgICBwdXNoICAgICAgZWR4CisKKyAgICAgICAgbW92CSAgZWF4LCBEV09SRCBQVFIgX21vZGUkW2VicF0KKyAgICAgICAgbW92CSAgZWN4LCBEV09SRCBQVFIgX21vZGUyJFtlYnBdCisJY3B1aWQJCQkJCTsgUXVlcnkgdGhlIENQVUlEIGZvciB0aGUgY3VycmVudCBwcm9jZXNzb3IKKworICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKwltb3YgCSAgRFdPUkQgUFRSIF9lYXgkWyBlZGkgXSwgZWF4CisJbW92IAkgIERXT1JEIFBUUiBfZWJ4JFsgZWRpIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgX2VjeCRbIGVkaSBdLCBlY3gKKwltb3YgCSAgRFdPUkQgUFRSIF9lZHgkWyBlZGkgXSwgZWR4CisKKyAgICAgICAgcG9wICAgICAgIGVkeAorICAgICAgICBwb3AgICAgICAgZWN4CisgICAgICAgIHBvcCAgICAgICBlYngKKyAgICAgICAgcG9wICAgICAgIGVkaQorCisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfeDg2X2NwdWlkIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3Rlc3RfdGhlbl9hZGQzMgorX3AkID0gNAorX2QkID0gOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorbG9jayAgICB4YWRkICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfdGVzdF90aGVuX2FkZDMyIEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIGFsID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2KCB2b2xhdGlsZSBrbXBfaW50MTYgKnAsIGttcF9pbnQxNiBjdiwga21wX2ludDE2IHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgYXggPT0gW2VjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIGVheCwgMSAgICAgICA7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBjdiwga21wX2ludDMyIHN2ICk7Cis7CisKK1BVQkxJQyAgX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2N2JCA9IDgKK19zdiQgPSAxMgorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWF4ID09IFtlY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICBlYXgsIDEgICAgICAgOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19jdl9sb3ckID0gMTIKK19jdl9oaWdoJCA9IDE2Citfc3ZfbG93JCA9IDIwCitfc3ZfaGlnaCQgPSAyNAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgICAgZWJwCisgICAgICAgIG1vdiAgICAgICBlYnAsIGVzcAorICAgICAgICBwdXNoICAgICAgZWJ4CisgICAgICAgIHB1c2ggICAgICBlZGkKKyAgICAgICAgbW92ICAgICAgIGVkaSwgRFdPUkQgUFRSIF9wJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfY3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlZHgsIERXT1JEIFBUUiBfY3ZfaGlnaCRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWJ4LCBEV09SRCBQVFIgX3N2X2xvdyRbZWJwXQorICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3N2X2hpZ2gkW2VicF0KK2xvY2sgICAgY21weGNoZzhiIFFXT1JEIFBUUiBbZWRpXQorICAgICAgICBzZXRlICAgICAgYWwgICAgICAgICAgIDsgaWYgZWR4OmVheCA9PSBbZWRpXSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgZWF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcG9wICAgICAgIGVkaQorICAgICAgICBwb3AgICAgICAgZWJ4CisgICAgICAgIG1vdiAgICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgICAgZWJwCisgICAgICAgIHJldAorCitfX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKworUFVCTElDICBfX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgIEJZVEUgUFRSIF9kJFtlc3BdCitsb2NrICAgIHhjaGcgICAgICBCWVRFIFBUUiBbZWN4XSwgYWwKKyAgICAgICAgcmV0CisKK19fX2ttcF94Y2hnX2ZpeGVkOCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDE2IFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgYXgsICBXT1JEIFBUUiAgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIFdPUkQgUFRSIFtlY3hdLCBheAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMzIKKzsKKzsga21wX2ludDMyCis7IF9fa21wX3hjaGdfZml4ZWQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApOworOworCitQVUJMSUMgIF9fX2ttcF94Y2hnX2ZpeGVkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorX2QkID0gOAorCitfX19rbXBfeGNoZ19maXhlZDMyIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX2QkW2VzcF0KK2xvY2sgICAgeGNoZyAgICAgIERXT1JEIFBUUiBbZWN4XSwgZWF4CisgICAgICAgIHJldAorCitfX19rbXBfeGNoZ19maXhlZDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19yZWFsMzIKKzsKKzsga21wX3JlYWwzMgorOyBfX2ttcF94Y2hnX3JlYWwzMiggdm9sYXRpbGUga21wX3JlYWwzMiAqcCwga21wX3JlYWwzMiBkICk7Cis7CisKK1BVQkxJQyAgX19fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDgKK19kJCA9IDEyCitfb2xkX3ZhbHVlJCA9IC00CisKK19fX2ttcF94Y2hnX3JlYWwzMiBQUk9DIE5FQVIKKworICAgICAgICBwdXNoICAgIGVicAorICAgICAgICBtb3YgICAgIGVicCwgZXNwCisgICAgICAgIHN1YiAgICAgZXNwLCA0CisgICAgICAgIHB1c2ggICAgZXNpCisgICAgICAgIG1vdiAgICAgZXNpLCBEV09SRCBQVFIgX3AkW2VicF0KKworICAgICAgICBmbGQgICAgIERXT1JEIFBUUiBbZXNpXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgbG9hZCA8YWRkcj4KKyAgICAgICAgZnN0ICAgICBEV09SRCBQVFIgX29sZF92YWx1ZSRbZWJwXQorICAgICAgICAgICAgICAgICAgICAgICAgOzsgc3RvcmUgaW50byBvbGRfdmFsdWUKKworICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9kJFtlYnBdCisKK2xvY2sgICAgeGNoZyAgICBEV09SRCBQVFIgW2VzaV0sIGVheAorCisgICAgICAgIGZsZCAgICAgRFdPUkQgUFRSIF9vbGRfdmFsdWUkW2VicF0KKyAgICAgICAgICAgICAgICAgICAgICAgIDs7IHJldHVybiBvbGRfdmFsdWUKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX3hjaGdfcmVhbDMyIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKK19jdiQgPSA4Citfc3YkID0gMTIKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyBORUFSCisKKyAgICAgICAgbW92ICAgICAgIGVjeCwgRFdPUkQgUFRSIF9wJFtlc3BdCisgICAgICAgIG1vdiAgICAgICBhbCwgQllURSBQVFIgX2N2JFtlc3BdCisgICAgICAgIG1vdiAgICAgICBkbCwgQllURSBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbZWN4XSwgZGwKKyAgICAgICAgcmV0CisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2Cis7Cis7IGttcF9pbnQxNgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgY3YsIGttcF9pbnQxNiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGF4LCBXT1JEIFBUUiBfY3YkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGR4LCBXT1JEIFBUUiBfc3YkW2VzcF0KK2xvY2sgICAgY21weGNoZyAgIFdPUkQgUFRSIFtlY3hdLCBkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA0CitfY3YkID0gOAorX3N2JCA9IDEyCisKK19fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWN4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdiRbZXNwXQorICAgICAgICBtb3YgICAgICAgZWR4LCBEV09SRCBQVFIgX3N2JFtlc3BdCitsb2NrICAgIGNtcHhjaGcgICBEV09SRCBQVFIgW2VjeF0sIGVkeAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyIEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NCggdm9sYXRpbGUga21wX2ludDY0ICpwLCBrbXBfaW50NjQgY3YsIGttcF9pbnQ2NCBzdiApOworOworCitQVUJMSUMgIF9fX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcCQgPSA4CitfY3ZfbG93JCA9IDEyCitfY3ZfaGlnaCQgPSAxNgorX3N2X2xvdyQgPSAyMAorX3N2X2hpZ2gkID0gMjQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IFBST0MgTkVBUgorCisgICAgICAgIHB1c2ggICAgICBlYnAKKyAgICAgICAgbW92ICAgICAgIGVicCwgZXNwCisgICAgICAgIHB1c2ggICAgICBlYngKKyAgICAgICAgcHVzaCAgICAgIGVkaQorICAgICAgICBtb3YgICAgICAgZWRpLCBEV09SRCBQVFIgX3AkW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVheCwgRFdPUkQgUFRSIF9jdl9sb3ckW2VicF0KKyAgICAgICAgbW92ICAgICAgIGVkeCwgRFdPUkQgUFRSIF9jdl9oaWdoJFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlYngsIERXT1JEIFBUUiBfc3ZfbG93JFtlYnBdCisgICAgICAgIG1vdiAgICAgICBlY3gsIERXT1JEIFBUUiBfc3ZfaGlnaCRbZWJwXQorbG9jayAgICBjbXB4Y2hnOGIgUVdPUkQgUFRSIFtlZGldCisgICAgICAgIHBvcCAgICAgICBlZGkKKyAgICAgICAgcG9wICAgICAgIGVieAorICAgICAgICBtb3YgICAgICAgZXNwLCBlYnAKKyAgICAgICAgcG9wICAgICAgIGVicAorICAgICAgICByZXQKKworX19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX3AkID0gNAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBQUk9DIE5FQVIKKworICAgICAgICBtb3YgICAgICAgZWF4LCBEV09SRCBQVFIgX3AkW2VzcF0KKyAgICAgICAgZmxkY3cgICAgIFdPUkQgUFRSIFtlYXhdCisgICAgICAgIHJldAorCitfX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZAorOworOyB2b2lkCis7IF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICAgcDogICAgICA0KCVlc3ApCisKK1BVQkxJQyAgX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19wJCA9IDQKKworX19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgTkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIERXT1JEIFBUUiBfcCRbZXNwXQorICAgICAgICBmc3RjdyAgICAgV09SRCBQVFIgW2VheF0KKyAgICAgICAgcmV0CisKK19fX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCis7Cis7IHZvaWQKKzsgX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCgpOworOworCitQVUJMSUMgIF9fX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyBORUFSCisKKyAgICAgICAgZm5jbGV4CisgICAgICAgIHJldAorCitfX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkKKzsKKworUFVCTElDICBfX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfcGtmbiQgPSA4CitfZ3RpZCQgPSAxMgorX3RpZCQgPSAxNgorX2FyZ2MkID0gMjAKK19hcmd2JCA9IDI0CitpZiBPTVBUX1NVUFBPUlQKK19leGl0X2ZyYW1lJCA9IDI4CitlbmRpZgorX2kkID0gLTgKK19zdGtfYWRqJCA9IC0xNgorX3ZwdHIkID0gLTEyCitfcXB0ciQgPSAtNAorCitfX19rbXBfaW52b2tlX21pY3JvdGFzayBQUk9DIE5FQVIKKzsgTGluZSAxMDIKKyAgICAgICAgcHVzaCAgICBlYnAKKyAgICAgICAgbW92ICAgICBlYnAsIGVzcAorICAgICAgICBzdWIgICAgIGVzcCwgMTYgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA7IDAwMDAwMDEwSAorICAgICAgICBwdXNoICAgIGVieAorICAgICAgICBwdXNoICAgIGVzaQorICAgICAgICBwdXNoICAgIGVkaQoraWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX2V4aXRfZnJhbWUkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgW2VheF0sIGVicAorZW5kaWYKKzsgTGluZSAxMTQKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfYXJnYyRbZWJwXQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWF4CisKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCWxlYSAgICAgZWR4LCBEV09SRCBQVFIgW2VheCo0KzhdCisJbW92ICAgICBlY3gsIGVzcCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byBFQ1gKKwltb3YJZWF4LGVkeAkJOyBTYXZlIHRoZSBzaXplIG9mIHRoZSBhcmdzIGluIGVheAorCXN1YgllY3gsZWR4CQk7IGVzcC0oKCNhcmdzKzIpKjQpIC0+IGVjeCAtLSB3aXRob3V0IG1vZHMsIHN0YWNrIHB0ciB3b3VsZCBiZSB0aGlzCisJbW92CWVkeCxlY3gJCTsgU2F2ZSB0byBlZHgKKwlhbmQJZWN4LC0xMjgJOyBNYXNrIG9mZiA3IGJpdHMKKwlzdWIJZWR4LGVjeAkJOyBBbW91bnQgdG8gc3VidHJhY3QgZnJvbSBlc3AKKwlzdWIJZXNwLGVkeAkJOyBQcmVwYXJlIHN0YWNrIHB0ci0tIE5vdyBpdCB3aWxsIGJlIGFsaWduZWQgb24gMTI4LWJ5dGUgYm91bmRhcnkgYXQgdGhlIGNhbGwKKworCWFkZAllZHgsZWF4CQk7IENhbGN1bGF0ZSB0b3RhbCBzaXplIG9mIHRoZSBzdGFjayBkZWNyZW1lbnQuCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9zdGtfYWRqJFtlYnBdLCBlZHgKKzs7IC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisgICAgICAgIGptcCAgICAgU0hPUlQgJEwyMjIzNworJEwyMjIzODoKKyAgICAgICAgbW92ICAgICBlY3gsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBzdWIgICAgIGVjeCwgMQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgZWN4CiskTDIyMjM3OgorICAgICAgICBjbXAgICAgIERXT1JEIFBUUiBfaSRbZWJwXSwgMAorICAgICAgICBqbGUgICAgIFNIT1JUICRMMjIyMzkKKzsgTGluZSAxMTYKKyAgICAgICAgbW92ICAgICBlZHgsIERXT1JEIFBUUiBfaSRbZWJwXQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9hcmd2JFtlYnBdCisgICAgICAgIG1vdiAgICAgZWN4LCBEV09SRCBQVFIgW2VheCtlZHgqNC00XQorICAgICAgICBtb3YgICAgIERXT1JEIFBUUiBfdnB0ciRbZWJwXSwgZWN4Cis7IExpbmUgMTIzCisgICAgICAgIG1vdiAgICAgZWF4LCBEV09SRCBQVFIgX3ZwdHIkW2VicF0KKzsgTGluZSAxMjQKKyAgICAgICAgcHVzaCAgICBlYXgKKzsgTGluZSAxMjcKKyAgICAgICAgam1wICAgICBTSE9SVCAkTDIyMjM4CiskTDIyMjM5OgorOyBMaW5lIDEyOQorICAgICAgICBsZWEgICAgIGVkeCwgRFdPUkQgUFRSIF90aWQkW2VicF0KKyAgICAgICAgbW92ICAgICBEV09SRCBQVFIgX3ZwdHIkW2VicF0sIGVkeAorOyBMaW5lIDEzMAorICAgICAgICBsZWEgICAgIGVheCwgRFdPUkQgUFRSIF9ndGlkJFtlYnBdCisgICAgICAgIG1vdiAgICAgRFdPUkQgUFRSIF9xcHRyJFtlYnBdLCBlYXgKKzsgTGluZSAxNDMKKyAgICAgICAgbW92ICAgICBlYXgsIERXT1JEIFBUUiBfdnB0ciRbZWJwXQorOyBMaW5lIDE0NAorICAgICAgICBwdXNoICAgIGVheAorOyBMaW5lIDE0NQorICAgICAgICBtb3YgICAgIGVheCwgRFdPUkQgUFRSIF9xcHRyJFtlYnBdCis7IExpbmUgMTQ2CisgICAgICAgIHB1c2ggICAgZWF4Cis7IExpbmUgMTQ3CisgICAgICAgIGNhbGwgICAgRFdPUkQgUFRSIF9wa2ZuJFtlYnBdCis7IExpbmUgMTQ4CisgICAgICAgIGFkZCAgICAgZXNwLCBEV09SRCBQVFIgX3N0a19hZGokW2VicF0KKzsgTGluZSAxNTIKKyAgICAgICAgbW92ICAgICBlYXgsIDEKKzsgTGluZSAxNTMKKyAgICAgICAgcG9wICAgICBlZGkKKyAgICAgICAgcG9wICAgICBlc2kKKyAgICAgICAgcG9wICAgICBlYngKKyAgICAgICAgbW92ICAgICBlc3AsIGVicAorICAgICAgICBwb3AgICAgIGVicAorICAgICAgICByZXQgICAgIDAKK19fX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCis7ID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PSBJbnRlbChSKSA2NCA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitpZmRlZiBfTV9BTUQ2NAorCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3g4Nl9jcHVpZAorOworOyB2b2lkCis7IF9fa21wX3g4Nl9jcHVpZCggaW50IG1vZGUsIGludCBtb2RlMiwgc3RydWN0IGttcF9jcHVpZCAqcCApOworOworOyBwYXJhbWV0ZXJzOgorOwltb2RlOgkJZWN4Cis7CW1vZGUyOgkJZWR4Cis7CWNwdWlkX2J1ZmZlcjogCXI4CisKK1BVQkxJQyAgX19rbXBfeDg2X2NwdWlkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfeDg2X2NwdWlkIFBST0MgRlJBTUUgO05FQVIKKworICAgICAgICBwdXNoICAgICAgcmJwCisgICAgICAgIC5wdXNocmVnICByYnAKKyAgICAgICAgbW92ICAgICAgIHJicCwgcnNwCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgcHVzaCAgICAgIHJieAkJCQk7IGNhbGxlZS1zYXZlIHJlZ2lzdGVyCisgICAgICAgIC5wdXNocmVnICByYngKKyAgICAgICAgLkVORFBST0xPRworCisJbW92CSAgcjEwLCByOCAgICAgICAgICAgICAgICAgICAgICAgOyBwIHBhcmFtZXRlcgorICAgICAgICBtb3YJICBlYXgsIGVjeAkJCTsgbW9kZSBwYXJhbWV0ZXIKKyAgICAgICAgbW92CSAgZWN4LCBlZHggICAgICAgICAgICAgICAgICAgICAgOyBtb2RlMiBwYXJhbWV0ZXIKKwljcHVpZAkJCQkJOyBRdWVyeSB0aGUgQ1BVSUQgZm9yIHRoZSBjdXJyZW50IHByb2Nlc3NvcgorCisJbW92IAkgIERXT1JEIFBUUiAwWyByMTAgXSwgZWF4CTsgc3RvcmUgcmVzdWx0cyBpbnRvIGJ1ZmZlcgorCW1vdiAJICBEV09SRCBQVFIgNFsgcjEwIF0sIGVieAorCW1vdiAJICBEV09SRCBQVFIgOFsgcjEwIF0sIGVjeAorCW1vdiAJICBEV09SRCBQVFIgMTJbIHIxMCBdLCBlZHgKKworICAgICAgICBwb3AgICAgICAgcmJ4CQkJCTsgY2FsbGVlLXNhdmUgcmVnaXN0ZXIKKyAgICAgICAgbW92ICAgICAgIHJzcCwgcmJwCisgICAgICAgIHBvcCAgICAgICByYnAKKyAgICAgICAgcmV0CisKK19fa21wX3g4Nl9jcHVpZCBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfdGVzdF90aGVuX2FkZDMyCis7Cis7IGttcF9pbnQzMgorOyBfX2ttcF90ZXN0X3RoZW5fYWRkMzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWVkeAorOworOyByZXR1cm46IAllYXgKKworUFVCTElDICBfX2ttcF90ZXN0X3RoZW5fYWRkMzIKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfdGVzdF90aGVuX2FkZDMyIFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIGVheCwgZWR4Citsb2NrICAgIHhhZGQgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKyAgICAgICAgcmV0CisKK19fa21wX3Rlc3RfdGhlbl9hZGQzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3Rlc3RfdGhlbl9hZGQ2NAorOworOyBrbXBfaW50MzIKKzsgX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOglyZHgKKzsKKzsgcmV0dXJuOiAJcmF4CisKK1BVQkxJQyAgX19rbXBfdGVzdF90aGVuX2FkZDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3Rlc3RfdGhlbl9hZGQ2NCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICByYXgsIHJkeAorbG9jayAgICB4YWRkICAgIFFXT1JEIFBUUiBbcmN4XSwgcmF4CisgICAgICAgIHJldAorCitfX2ttcF90ZXN0X3RoZW5fYWRkNjQgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggY3YsIGttcF9pbnQ4IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJZWR4Cis7CXN2OglyOGQKKzsKKzsgcmV0dXJuOgllYXgKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBhbCwgZGwJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBCWVRFIFBUUiBbcmN4XSwgZGwKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICAJOyBpZiBhbCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIAk7IHNpZ24gZXh0ZW5kIHByZXZpb3VzIGluc3RydWN0aW9uCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTE2IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgICAgYXgsIGR4CTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgV09SRCBQVFIgW3JjeF0sIGR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgYXggPT0gW3JjeF0gc2V0IGFsID0gMSBlbHNlIHNldCBhbCA9IDAKKyAgICAgICAgYW5kICAgICAgIHJheCwgMSAgICAgICAJOyBzaWduIGV4dGVuZCBwcmV2aW91cyBpbnN0cnVjdGlvbgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmUxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgY3YsIGttcF9pbnQzMiBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmUzMgorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHNldGUgICAgICBhbCAgICAgICAgICAgCTsgaWYgZWF4ID09IFtyY3hdIHNldCBhbCA9IDEgZWxzZSBzZXQgYWwgPSAwCisgICAgICAgIGFuZCAgICAgICByYXgsIDEgICAgICAgCTsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlMzIgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQKKzsKKzsga21wX2ludDMyCis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGN2LCBrbXBfaW50NjQgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OglyZHgKKzsJc3Y6CXI4Cis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmU2NAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgc2V0ZSAgICAgIGFsICAgICAgICAgICA7IGlmIHJheCA9PSBbcmN4XSBzZXQgYWwgPSAxIGVsc2Ugc2V0IGFsID0gMAorICAgICAgICBhbmQgICAgICAgcmF4LCAxICAgICAgIDsgc2lnbiBleHRlbmQgcHJldmlvdXMgaW5zdHJ1Y3Rpb24KKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlNjQgRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkOAorOworOyBrbXBfaW50OAorOyBfX2ttcF94Y2hnX2ZpeGVkOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CWRsCis7Cis7IHJldHVybjogCWFsCisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDgKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkOCBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICAgIGFsLCAgZGwKK2xvY2sgICAgeGNoZyAgICAgIEJZVEUgUFRSIFtyY3hdLCBhbAorICAgICAgICByZXQKKworX19rbXBfeGNoZ19maXhlZDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fX2ttcF94Y2hnX2ZpeGVkMTYKKzsKKzsga21wX2ludDE2Cis7IF9fa21wX3hjaGdfZml4ZWQxNiggdm9sYXRpbGUga21wX2ludDE2ICpwLCBrbXBfaW50MTYgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJZHgKKzsKKzsgcmV0dXJuOiAJYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkMTYKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorCitfX2ttcF94Y2hnX2ZpeGVkMTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgIGR4Citsb2NrICAgIHhjaGcgICAgICBXT1JEIFBUUiBbcmN4XSwgYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQxNiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19fa21wX3hjaGdfZml4ZWQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfeGNoZ19maXhlZDMyKCB2b2xhdGlsZSBrbXBfaW50MzIgKnAsIGttcF9pbnQzMiBkICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwlkOgllZHgKKzsKKzsgcmV0dXJuOiAJZWF4CisKK1BVQkxJQyAgX19rbXBfeGNoZ19maXhlZDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfZml4ZWQzMiBQUk9DIDtORUFSCisKKyAgICAgICAgbW92ICAgICBlYXgsIGVkeAorbG9jayAgICB4Y2hnICAgIERXT1JEIFBUUiBbcmN4XSwgZWF4CisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX2ZpeGVkMzIgRU5EUAorX1RFWFQgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX19rbXBfeGNoZ19maXhlZDY0Cis7Cis7IGttcF9pbnQ2NAorOyBfX2ttcF94Y2hnX2ZpeGVkNjQoIHZvbGF0aWxlIGttcF9pbnQ2NCAqcCwga21wX2ludDY0IGQgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWQ6CXJkeAorOworOyByZXR1cm46IAlyYXgKKworUFVCTElDICBfX2ttcF94Y2hnX2ZpeGVkNjQKK19URVhUICAgU0VHTUVOVAorICAgICAgICBBTElHTiAxNgorX19rbXBfeGNoZ19maXhlZDY0IFBST0MgO05FQVIKKworICAgICAgICBtb3YgICAgIHJheCwgcmR4Citsb2NrICAgIHhjaGcgICAgUVdPUkQgUFRSIFtyY3hdLCByYXgKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfZml4ZWQ2NCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDgKKzsKKzsga21wX2ludDgKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJZWF4CisKK1BVQkxJQyAgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0OAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDggUFJPQyA7TkVBUgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQ4IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQxNgorOworOyBrbXBfaW50MTYKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYoIHZvbGF0aWxlIGttcF9pbnQxNiAqcCwga21wX2ludDE2IGN2LCBrbXBfaW50MTYgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MTYgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBheCwgZHgJOyAiY3YiCisJbW92CSAgZWR4LCByOGQJOyAic3YiCitsb2NrICAgIGNtcHhjaGcgICBXT1JEIFBUUiBbcmN4XSwgZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDE2IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMgorOworOyBrbXBfaW50MzIKKzsgX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIoIHZvbGF0aWxlIGttcF9pbnQzMiAqcCwga21wX2ludDMyIGN2LCBrbXBfaW50MzIgc3YgKTsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CWN2OgllZHgKKzsJc3Y6CXI4ZAorOworOyByZXR1cm46CWVheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0MzIgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICBlYXgsIGVkeAk7ICJjdiIKKwltb3YJICBlZHgsIHI4ZAk7ICJzdiIKK2xvY2sgICAgY21weGNoZyAgIERXT1JEIFBUUiBbcmN4XSwgZWR4CisgICAgICAgIHJldAorCitfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9yZXQzMiBFTkRQCitfVEVYVCAgICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQKKzsKKzsga21wX2ludDY0Cis7IF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBjdiwga21wX2ludDY0IHN2ICk7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOwljdjoJcmR4Cis7CXN2OglyOAorOworOyByZXR1cm46CXJheAorCitQVUJMSUMgIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfcmV0NjQgUFJPQyA7TkVBUgorCisgICAgICAgIG1vdiAgICAgICByYXgsIHJkeAk7ICJjdiIKKwltb3YJICByZHgsIHI4CTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgUVdPUkQgUFRSIFtyY3hdLCByZHgKKyAgICAgICAgcmV0CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX3JldDY0IEVORFAKK19URVhUICAgICBFTkRTCisKKworOy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorOworOyBGVU5DVElPTiBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorOworOyBrbXBfaW50OAorOyBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOCggdm9sYXRpbGUga21wX2ludDggKnAsIGttcF9pbnQ4IGN2LCBrbXBfaW50OCBzdiApOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJY3Y6CWVkeAorOwlzdjoJcjhkCis7Cis7IHJldHVybjoJYWwKKworUFVCTElDICBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZV9sb29wOAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2NvbXBhcmVfYW5kX3N0b3JlX2xvb3A4IFBST0MgO05FQVIKKyRfX2ttcF9sb29wOgorICAgICAgICBtb3YgICAgICAgYWwsIGRsCTsgImN2IgorCW1vdgkgIGVkeCwgcjhkCTsgInN2IgorbG9jayAgICBjbXB4Y2hnICAgQllURSBQVFIgW3JjeF0sIGRsCisgICAgICAgICAgICAgICAgICAgICAgICA7IENvbXBhcmUgQUwgd2l0aCBbcmN4XS4gIElmIGVxdWFsIHNldAorICAgICAgICAgICAgICAgICAgICAgICAgOyBaRiBhbmQgZXhjaGFuZ2UgREwgd2l0aCBbcmN4XS4gIEVsc2UsIGNsZWFyCisgICAgICAgICAgICAgICAgICAgICAgICA7IFpGIGFuZCBsb2FkIFtyY3hdIGludG8gQUwuCisgICAgICAgIGp6ICAgICAJU0hPUlQgJF9fa21wX3N1Y2Nlc3MKKworICAgICAgICBkYiAgICAgIDBmM0gKKyAgICAgICAgZGIgICAgICAwOTBIICAgIAkJOyBwYXVzZQorCisJam1wCVNIT1JUICRfX2ttcF9sb29wCisKKyRfX2ttcF9zdWNjZXNzOgorICAgICAgICByZXQKKworX19rbXBfY29tcGFyZV9hbmRfc3RvcmVfbG9vcDggRU5EUAorX1RFWFQgICAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDMyCis7Cis7IGttcF9yZWFsMzIKKzsgX19rbXBfeGNoZ19yZWFsMzIoIHZvbGF0aWxlIGttcF9yZWFsMzIgKnAsIGttcF9yZWFsMzIgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsgICAgICAgZDoJeG1tMSAobG93ZXIgNCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA0IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDMyCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDMyIFBST0MgO05FQVIKKworCW1vdmQJZWF4LCB4bW0xCQk7IGxvYWQgZAorCitsb2NrICAgIHhjaGcgICAgRFdPUkQgUFRSIFtyY3hdLCBlYXgKKworCW1vdmQJeG1tMCwgZWF4CQk7IGxvYWQgb2xkIHZhbHVlIGludG8gcmV0dXJuIHJlZ2lzdGVyCisgICAgICAgIHJldAorCitfX2ttcF94Y2hnX3JlYWwzMiBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX3hjaGdfcmVhbDY0Cis7Cis7IGttcF9yZWFsNjQKKzsgX19rbXBfeGNoZ19yZWFsNjQoIHZvbGF0aWxlIGttcF9yZWFsNjQgKnAsIGttcF9yZWFsNjQgZCApOworOworOyBwYXJhbWV0ZXJzOgorOwlwOglyY3gKKzsJZDoJeG1tMSAobG93ZXIgOCBieXRlcykKKzsKKzsgcmV0dXJuOgl4bW0wIChsb3dlciA4IGJ5dGVzKQorCitQVUJMSUMgIF9fa21wX3hjaGdfcmVhbDY0CitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3hjaGdfcmVhbDY0IFBST0MgO05FQVIKKworCW1vdmQJcmF4LCB4bW0xCQk7IGxvYWQgImQiCisKK2xvY2sgICAgeGNoZyAgICBRV09SRCBQVFIgW3JjeF0sIHJheAorCisJbW92ZAl4bW0wLCByYXgJCTsgbG9hZCBvbGQgdmFsdWUgaW50byByZXR1cm4gcmVnaXN0ZXIKKyAgICAgICAgcmV0CisKK19fa21wX3hjaGdfcmVhbDY0IEVORFAKK19URVhUICAgRU5EUworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2xvYWRfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkKCBrbXBfaW50MTYgKnAgKTsKKzsKKzsgcGFyYW1ldGVyczoKKzsJcDoJcmN4Cis7CisKK1BVQkxJQyAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZAorX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmbGRjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9sb2FkX3g4N19mcHVfY29udHJvbF93b3JkIEVORFAKK19URVhUICAgRU5EUworCisKKzstLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKzsKKzsgRlVOQ1RJT04gX19rbXBfc3RvcmVfeDg3X2ZwdV9jb250cm9sX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCgga21wX2ludDE2ICpwICk7Cis7Cis7IHBhcmFtZXRlcnM6Cis7CXA6CXJjeAorOworCitQVUJMSUMgIF9fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX3N0b3JlX3g4N19mcHVfY29udHJvbF93b3JkIFBST0MgO05FQVIKKworICAgICAgICBmc3RjdyAgIFdPUkQgUFRSIFtyY3hdCisgICAgICAgIHJldAorCitfX2ttcF9zdG9yZV94ODdfZnB1X2NvbnRyb2xfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQKKzsKKzsgdm9pZAorOyBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCkKKzsKKworUFVCTElDICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkCitfVEVYVCAgIFNFR01FTlQKKyAgICAgICAgQUxJR04gMTYKK19fa21wX2NsZWFyX3g4N19mcHVfc3RhdHVzX3dvcmQgUFJPQyA7TkVBUgorCisgICAgICAgIGZuY2xleAorICAgICAgICByZXQKKworX19rbXBfY2xlYXJfeDg3X2ZwdV9zdGF0dXNfd29yZCBFTkRQCitfVEVYVCAgIEVORFMKKworCis7LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCis7Cis7IEZVTkNUSU9OIF9fa21wX2ludm9rZV9taWNyb3Rhc2sKKzsKKzsgdHlwZWRlZiB2b2lkICAoKm1pY3JvdGFza190KSggaW50ICpndGlkLCBpbnQgKnRpZCwgLi4uICk7Cis7Cis7IGludAorOyBfX2ttcF9pbnZva2VfbWljcm90YXNrKCBtaWNyb3Rhc2tfdCBwa2ZuLAorOyAgICAgICAgICAgICAgICAgICAgICAgICBpbnQgZ3RpZCwgaW50IHRpZCwKKzsgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGFyZ2MsIHZvaWQgKnBfYXJndltdICkgeworOworOyAgICAgKCpwa2ZuKSAoICZndGlkLCAmdGlkLCBhcmd2WzBdLCAuLi4gKTsKKzsgICAgIHJldHVybiAxOworOyB9Cis7Cis7IG5vdGU6Cis7ICAgICAganVzdCBiZWZvcmUgY2FsbCB0byBwa2ZuIG11c3QgaGF2ZSByc3AgMTI4LWJ5dGUgYWxpZ25lZCBmb3IgY29tcGlsZXIKKzsKKzsgcGFyYW1ldGVyczoKKzsgICAgICByY3g6ICAgcGtmbgkxNltyYnBdCis7ICAgICAgZWR4OiAgIGd0aWQJMjRbcmJwXQorOyAgICAgIHI4ZDogICB0aWQJMzJbcmJwXQorOyAgICAgIHI5ZDogICBhcmdjCTQwW3JicF0KKzsgICAgICBbc3RdOiAgcF9hcmd2CTQ4W3JicF0KKzsKKzsgcmVnIHRlbXBzOgorOyAgICAgIHJheDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJkeDogICB1c2VkIGFsbCBvdmVyIHRoZSBwbGFjZQorOyAgICAgIHJjeDogICB1c2VkIGFzIGFyZ3VtZW50IGNvdW50ZXIgZm9yIHB1c2ggcGFybXMgbG9vcAorOyAgICAgIHIxMDogICB1c2VkIHRvIGhvbGQgcGtmbiBmdW5jdGlvbiBwb2ludGVyIGFyZ3VtZW50Cis7Cis7IHJldHVybjogICAgICBlYXggICAgKGFsd2F5cyAxL1RSVUUpCis7CisKKyRfcGtmbiAgID0gMTYKKyRfZ3RpZCAgID0gMjQKKyRfdGlkICAgID0gMzIKKyRfYXJnYyAgID0gNDAKKyRfcF9hcmd2ID0gNDgKK2lmIE9NUFRfU1VQUE9SVAorJF9leGl0X2ZyYW1lID0gNTYKK2VuZGlmCisKK1BVQkxJQyAgX19rbXBfaW52b2tlX21pY3JvdGFzaworX1RFWFQgICBTRUdNRU5UCisgICAgICAgIEFMSUdOIDE2CisKK19fa21wX2ludm9rZV9taWNyb3Rhc2sgUFJPQyBGUkFNRSA7TkVBUgorCW1vdglRV09SRCBQVFIgMTZbcnNwXSwgcmR4CTsgaG9tZSBndGlkIHBhcmFtZXRlcgorCW1vdiAJUVdPUkQgUFRSIDI0W3JzcF0sIHI4CTsgaG9tZSB0aWQgcGFyYW1ldGVyCisgICAgICAgIHB1c2ggICAgcmJwCQk7IHNhdmUgYmFzZSBwb2ludGVyCisgICAgICAgIC5wdXNocmVnIHJicAorCXN1Yglyc3AsIDAJCTsgbm8gZml4ZWQgYWxsb2NhdGlvbiBuZWNlc3NhcnkgLSBlbmQgcHJvbG9nCisKKyAgICAgICAgbGVhICAgICByYnAsIFFXT1JEIFBUUiBbcnNwXSAgIAk7IGVzdGFibGlzaCB0aGUgYmFzZSBwb2ludGVyCisgICAgICAgIC5zZXRmcmFtZSByYnAsIDAKKyAgICAgICAgLkVORFBST0xPRworaWYgT01QVF9TVVBQT1JUCisgICAgICAgIG1vdiAgICAgcmF4LCBRV09SRCBQVFIgJF9leGl0X2ZyYW1lW3JicF0KKyAgICAgICAgbW92ICAgICBRV09SRCBQVFIgW3JheF0sIHJicAorZW5kaWYKKwltb3YJcjEwLCByY3gJOyBzYXZlIHBrZm4gcG9pbnRlciBmb3IgbGF0ZXIKKworOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIG1vdiAgICAgcmF4LCByOQkJOyByYXggPD0gYXJnYworICAgICAgICBjbXAgICAgIHJheCwgMgorICAgICAgICBqZ2UgICAgIFNIT1JUICRfa21wX2ludm9rZV9zdGFja19hbGlnbgorICAgICAgICBtb3YgICAgIHJheCwgMiAgICAgICAgICA7IHNldCA0IGhvbWVzIGlmIGxlc3MgdGhhbiAyIHBhcm1zCiskX2ttcF9pbnZva2Vfc3RhY2tfYWxpZ246CisJbGVhICAgICByZHgsIFFXT1JEIFBUUiBbcmF4KjgrMTZdIDsgcmF4IDw9IChhcmdjICsgMikgKiA4CisJbW92ICAgICByYXgsIHJzcCAgICAgICAgOyBTYXZlIGN1cnJlbnQgU1AgaW50byByYXgKKwlzdWIJcmF4LCByZHgJOyByc3AgLSAoKGFyZ2MrMikqOCkgLT4gcmF4CisJCQkJOyB3aXRob3V0IGFsaWduLCByc3Agd291bGQgYmUgdGhpcworCWFuZCAgICAgcmF4LCAtMTI4ICAgICAgIDsgTWFzayBvZmYgNyBiaXRzICgxMjgtYnl0ZSBhbGlnbikKKwlhZGQgICAgIHJheCwgcmR4ICAgICAgICA7IGFkZCBzcGFjZSBmb3IgcHVzaCdzIGluIGEgbG9vcCBiZWxvdworCW1vdiAgICAgcnNwLCByYXggICAgICAgIDsgUHJlcGFyZSB0aGUgc3RhY2sgcHRyCisJCQkJOyBOb3cgaXQgd2lsbCBhbGlnbiB0byAxMjgtYnl0ZSBhdCB0aGUgY2FsbAorOzsgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgIAkJCTsgc2V0dXAgcGtmbiBwYXJhbWV0ZXIgc3RhY2sKKwltb3YJcmF4LCByOQkJOyByYXggPD0gYXJnYworCXNobAlyYXgsIDMJCTsgcmF4IDw9IGFyZ2MqOAorCW1vdglyZHgsIFFXT1JEIFBUUiAkX3BfYXJndltyYnBdCTsgcmR4IDw9IHBfYXJndgorCWFkZAlyZHgsIHJheAk7IHJkeCA8PSAmcF9hcmd2W2FyZ2NdCisJbW92CXJjeCwgcjkJCTsgcmN4IDw9IGFyZ2MKKwlqZWN4eglTSE9SVCAkX2ttcF9pbnZva2VfcGFzc19wYXJtcwk7IG5vdGhpbmcgdG8gcHVzaCBpZiBhcmdjPTAKKwljbXAJZWN4LCAxCQk7IGlmIGFyZ2M9MSBicmFuY2ggYWhlYWQKKwlqZQlTSE9SVCAkX2ttcF9pbnZva2Vfb25lX3Bhcm0KKwlzdWIJZWN4LCAyCQk7IGlmIGFyZ2M9MiBicmFuY2ggYWhlYWQsIHN1YnRyYWN0IHR3byBmcm9tCisJamUJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCiskX2ttcF9pbnZva2VfcHVzaF9wYXJtczoJOyBwdXNoIGxhc3QgLSA1dGggcGFybXMgdG8gcGtmbiBvbiBzdGFjaworCXN1YglyZHgsIDgJCTsgZGVjcmVtZW50IHBfYXJndiBwb2ludGVyIHRvIHByZXZpb3VzIHBhcm0KKwltb3YgCXI4LCBRV09SRCBQVFIgW3JkeF0gOyByOCA8PSBwX2FyZ3ZbcmN4LTFdCisJcHVzaAlyOAkJOyBwdXNoIHBfYXJndltyY3gtMV0gb250byBzdGFjayAocmV2ZXJzZSBvcmRlcikKKwlzdWIJZWN4LCAxCisJamVjeHoJU0hPUlQgJF9rbXBfaW52b2tlX3R3b19wYXJtcworCWptcAlTSE9SVCAkX2ttcF9pbnZva2VfcHVzaF9wYXJtcworCiskX2ttcF9pbnZva2VfdHdvX3Bhcm1zOgorCXN1YglyZHgsIDgJCTsgcHV0IDR0aCBwYXJtIHRvIHBrZm4gaW4gcjkKKwltb3YJcjksIFFXT1JEIFBUUiBbcmR4XSA7IHI5IDw9IHBfYXJndlsxXQorCiskX2ttcF9pbnZva2Vfb25lX3Bhcm06CisgICAgICAgIHN1YglyZHgsIDgJCTsgcHV0IDNyZCBwYXJtIHRvIHBrZm4gaW4gcjgKKwltb3YJcjgsIFFXT1JEIFBUUiBbcmR4XSA7IHI4IDw9IHBfYXJndlswXQorCiskX2ttcF9pbnZva2VfcGFzc19wYXJtczoJOyBwdXQgMXN0ICYgMm5kIHBhcm1zIHRvIHBrZm4gaW4gcmVnaXN0ZXJzCisJbGVhCXJkeCwgUVdPUkQgUFRSICRfdGlkW3JicF0gIDsgcmR4IDw9ICZ0aWQgKDJuZCBwYXJtIHRvIHBrZm4pCisJbGVhCXJjeCwgUVdPUkQgUFRSICRfZ3RpZFtyYnBdIDsgcmN4IDw9ICZndGlkICgxc3QgcGFybSB0byBwa2ZuKQorICAgICAgICBzdWIgICAgIHJzcCwgMzIgICAgICAgICA7IGFkZCBzdGFjayBzcGFjZSBmb3IgZmlyc3QgZm91ciBwYXJtcworCW1vdglyYXgsIHIxMAk7IHJheCA8PSBwa2ZuCisJY2FsbAlyYXgJCTsgY2FsbCAoKnBrZm4pKCkKKwltb3YJcmF4LCAxCQk7IG1vdmUgMSBpbnRvIHJldHVybiByZWdpc3RlcjsKKworICAgICAgICBsZWEgICAgIHJzcCwgUVdPUkQgUFRSIFtyYnBdCTsgcmVzdG9yZSBzdGFjayBwb2ludGVyCisKKzsJYWRkCXJzcCwgMAkJOyBubyBmaXhlZCBhbGxvY2F0aW9uIG5lY2Vzc2FyeSAtIHN0YXJ0IGVwaWxvZworICAgICAgICBwb3AgICAgIHJicAkJOyByZXN0b3JlIGZyYW1lIHBvaW50ZXIKKyAgICAgICAgcmV0CitfX2ttcF9pbnZva2VfbWljcm90YXNrIEVORFAKK19URVhUICAgRU5EUworCitlbmRpZgorCitFTkQKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYyBiL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlQtNTg2X3V0aWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYWVhZmFlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVC01ODZfdXRpbC5jCkBAIC0wLDAgKzEsMTYzIEBACisvKgorICogel9XaW5kb3dzX05ULTU4Nl91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKworI2lmIChLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0KQorLyogT25seSAzMi1iaXQgImFkZC1leGNoYW5nZSIgaW5zdHJ1Y3Rpb24gb24gSUEtMzIgYXJjaGl0ZWN0dXJlIGNhdXNlcyB1cyB0bworICogdXNlIGNvbXBhcmVfYW5kX3N0b3JlIGZvciB0aGVzZSByb3V0aW5lcworICovCisKK2ttcF9pbnQ4CitfX2ttcF90ZXN0X3RoZW5fb3I4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDgKK19fa21wX3Rlc3RfdGhlbl9hbmQ4KCB2b2xhdGlsZSBrbXBfaW50OCAqcCwga21wX2ludDggZCApCit7CisgICAga21wX2ludDggb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworCisgICAgd2hpbGUgKCAhIF9fa21wX2NvbXBhcmVfYW5kX3N0b3JlOCAoIHAsIG9sZF92YWx1ZSwgbmV3X3ZhbHVlICkgKQorICAgIHsKKyAgICAgICAgS01QX0NQVV9QQVVTRSgpOworICAgICAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICAgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKyAgICB9CisgICAgcmV0dXJuIG9sZF92YWx1ZTsKK30KKwora21wX2ludDMyCitfX2ttcF90ZXN0X3RoZW5fb3IzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlIHwgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50MzIKK19fa21wX3Rlc3RfdGhlbl9hbmQzMiggdm9sYXRpbGUga21wX2ludDMyICpwLCBrbXBfaW50MzIgZCApCit7CisgICAga21wX2ludDMyIG9sZF92YWx1ZSwgbmV3X3ZhbHVlOworCisgICAgb2xkX3ZhbHVlID0gVENSXzQoICpwICk7CisgICAgbmV3X3ZhbHVlID0gb2xkX3ZhbHVlICYgZDsKKworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTMyICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl80KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorCitrbXBfaW50OAorX19rbXBfdGVzdF90aGVuX2FkZDgoIHZvbGF0aWxlIGttcF9pbnQ4ICpwLCBrbXBfaW50OCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfMSggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTggKCBwLCBvbGRfdmFsdWUsIG5ld192YWx1ZSApICkKKyAgICB7CisgICAgICAgIEtNUF9DUFVfUEFVU0UoKTsKKyAgICAgICAgb2xkX3ZhbHVlID0gVENSXzEoICpwICk7CisgICAgICAgIG5ld192YWx1ZSA9IG9sZF92YWx1ZSArIGQ7CisgICAgfQorICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNpZiBLTVBfQVJDSF9YODYKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FkZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgKyBkOworICAgIH0KKyAgICByZXR1cm4gb2xkX3ZhbHVlOworfQorI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiAqLworCitrbXBfaW50NjQKK19fa21wX3Rlc3RfdGhlbl9vcjY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgfCBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKK2ttcF9pbnQ2NAorX19rbXBfdGVzdF90aGVuX2FuZDY0KCB2b2xhdGlsZSBrbXBfaW50NjQgKnAsIGttcF9pbnQ2NCBkICkKK3sKKyAgICBrbXBfaW50NjQgb2xkX3ZhbHVlLCBuZXdfdmFsdWU7CisKKyAgICBvbGRfdmFsdWUgPSBUQ1JfOCggKnAgKTsKKyAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIHdoaWxlICggISBfX2ttcF9jb21wYXJlX2FuZF9zdG9yZTY0ICggcCwgb2xkX3ZhbHVlLCBuZXdfdmFsdWUgKSApCisgICAgeworICAgICAgICBLTVBfQ1BVX1BBVVNFKCk7CisgICAgICAgIG9sZF92YWx1ZSA9IFRDUl84KCAqcCApOworICAgICAgICBuZXdfdmFsdWUgPSBvbGRfdmFsdWUgJiBkOworICAgIH0KKworICAgIHJldHVybiBvbGRfdmFsdWU7Cit9CisKKyNlbmRpZiAvKiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0ICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jIGIvcmMzL3J1bnRpbWUvc3JjL3pfV2luZG93c19OVF91dGlsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjNhZTBhNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3NyYy96X1dpbmRvd3NfTlRfdXRpbC5jCkBAIC0wLDAgKzEsMTk3NCBAQAorLyoKKyAqIHpfV2luZG93c19OVF91dGlsLmMgLS0gcGxhdGZvcm0gc3BlY2lmaWMgcm91dGluZXMuCisgKi8KKworCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworLy8KKy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKy8vCisvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKy8vCisvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworCisKKyNpbmNsdWRlICJrbXAuaCIKKyNpbmNsdWRlICJrbXBfaXR0LmgiCisjaW5jbHVkZSAia21wX2kxOG4uaCIKKyNpbmNsdWRlICJrbXBfaW8uaCIKKyNpbmNsdWRlICJrbXBfd2FpdF9yZWxlYXNlLmgiCisKKy8qIFRoaXMgY29kZSBpcyByZWxhdGVkIHRvIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbigpIGZ1bmN0aW9uLiBUaGlzIGZ1bmN0aW9uCisgICBpcyB1c2VkIGluIHRoZSBMb2FkIGJhbGFuY2UgYWxnb3JpdGhtIGZvciBPTVBfRFlOQU1JQz10cnVlIHRvIGZpbmQgdGhlCisgICBudW1iZXIgb2YgcnVubmluZyB0aHJlYWRzIGluIHRoZSBzeXN0ZW0uICovCisKKyNpbmNsdWRlIDxudHN0YXR1cy5oPgorI2luY2x1ZGUgPG50c2VjYXBpLmg+ICAgLy8gVU5JQ09ERV9TVFJJTkcKKworZW51bSBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MgeworICAgIFN5c3RlbVByb2Nlc3NJbmZvcm1hdGlvbiA9IDUKK307IC8vIFNZU1RFTV9JTkZPUk1BVElPTl9DTEFTUworCitzdHJ1Y3QgQ0xJRU5UX0lEIHsKKyAgICBIQU5ETEUgVW5pcXVlUHJvY2VzczsKKyAgICBIQU5ETEUgVW5pcXVlVGhyZWFkOworfTsgLy8gc3RydWN0IENMSUVOVF9JRAorCitlbnVtIFRIUkVBRF9TVEFURSB7CisgICAgU3RhdGVJbml0aWFsaXplZCwKKyAgICBTdGF0ZVJlYWR5LAorICAgIFN0YXRlUnVubmluZywKKyAgICBTdGF0ZVN0YW5kYnksCisgICAgU3RhdGVUZXJtaW5hdGVkLAorICAgIFN0YXRlV2FpdCwKKyAgICBTdGF0ZVRyYW5zaXRpb24sCisgICAgU3RhdGVVbmtub3duCit9OyAvLyBlbnVtIFRIUkVBRF9TVEFURQorCitzdHJ1Y3QgVk1fQ09VTlRFUlMgeworICAgIFNJWkVfVCAgICAgICAgUGVha1ZpcnR1YWxTaXplOworICAgIFNJWkVfVCAgICAgICAgVmlydHVhbFNpemU7CisgICAgVUxPTkcgICAgICAgICBQYWdlRmF1bHRDb3VudDsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtXb3JraW5nU2V0U2l6ZTsKKyAgICBTSVpFX1QgICAgICAgIFdvcmtpbmdTZXRTaXplOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQZWFrUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBRdW90YVBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUXVvdGFQZWFrTm9uUGFnZWRQb29sVXNhZ2U7CisgICAgU0laRV9UICAgICAgICBRdW90YU5vblBhZ2VkUG9vbFVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUGFnZWZpbGVVc2FnZTsKKyAgICBTSVpFX1QgICAgICAgIFBlYWtQYWdlZmlsZVVzYWdlOworICAgIFNJWkVfVCAgICAgICAgUHJpdmF0ZVBhZ2VDb3VudDsKK307IC8vIHN0cnVjdCBWTV9DT1VOVEVSUworCitzdHJ1Y3QgU1lTVEVNX1RIUkVBRCB7CisgIExBUkdFX0lOVEVHRVIgICBLZXJuZWxUaW1lOworICBMQVJHRV9JTlRFR0VSICAgVXNlclRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBDcmVhdGVUaW1lOworICBVTE9ORyAgICAgICAgICAgV2FpdFRpbWU7CisgIExQVk9JRCAgICAgICAgICBTdGFydEFkZHJlc3M7CisgIENMSUVOVF9JRCAgICAgICBDbGllbnRJZDsKKyAgRFdPUkQgICAgICAgICAgIFByaW9yaXR5OworICBMT05HICAgICAgICAgICAgQmFzZVByaW9yaXR5OworICBVTE9ORyAgICAgICAgICAgQ29udGV4dFN3aXRjaENvdW50OworICBUSFJFQURfU1RBVEUgICAgU3RhdGU7CisgIFVMT05HICAgICAgICAgICBXYWl0UmVhc29uOworfTsgLy8gU1lTVEVNX1RIUkVBRAorCitLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgS2VybmVsVGltZSApID09IDAgKTsKKyNpZiBLTVBfQVJDSF9YODYKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhcnRBZGRyZXNzICkgPT0gMjggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1RIUkVBRCwgU3RhdGUgICAgICAgICkgPT0gNTIgKTsKKyNlbHNlCisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXJ0QWRkcmVzcyApID09IDMyICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9USFJFQUQsIFN0YXRlICAgICAgICApID09IDY4ICk7CisjZW5kaWYKKworc3RydWN0IFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OIHsKKyAgVUxPTkcgICAgICAgICAgIE5leHRFbnRyeU9mZnNldDsKKyAgVUxPTkcgICAgICAgICAgIE51bWJlck9mVGhyZWFkczsKKyAgTEFSR0VfSU5URUdFUiAgIFJlc2VydmVkWyAzIF07CisgIExBUkdFX0lOVEVHRVIgICBDcmVhdGVUaW1lOworICBMQVJHRV9JTlRFR0VSICAgVXNlclRpbWU7CisgIExBUkdFX0lOVEVHRVIgICBLZXJuZWxUaW1lOworICBVTklDT0RFX1NUUklORyAgSW1hZ2VOYW1lOworICBEV09SRCAgICAgICAgICAgQmFzZVByaW9yaXR5OworICBIQU5ETEUgICAgICAgICAgUHJvY2Vzc0lkOworICBIQU5ETEUgICAgICAgICAgUGFyZW50UHJvY2Vzc0lkOworICBVTE9ORyAgICAgICAgICAgSGFuZGxlQ291bnQ7CisgIFVMT05HICAgICAgICAgICBSZXNlcnZlZDJbIDIgXTsKKyAgVk1fQ09VTlRFUlMgICAgIFZNQ291bnRlcnM7CisgIElPX0NPVU5URVJTICAgICBJT0NvdW50ZXJzOworICBTWVNURU1fVEhSRUFEICAgVGhyZWFkc1sgMSBdOworfTsgLy8gU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04KK3R5cGVkZWYgU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKiBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT047CisKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgTmV4dEVudHJ5T2Zmc2V0ICkgPT0gIDAgKTsKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgQ3JlYXRlVGltZSAgICAgICkgPT0gMzIgKTsKK0tNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSW1hZ2VOYW1lICAgICAgICkgPT0gNTYgKTsKKyNpZiBLTVBfQVJDSF9YODYKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFByb2Nlc3NJZCAgICAgICApID09ICA2OCApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSGFuZGxlQ291bnQgICAgICkgPT0gIDc2ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBWTUNvdW50ZXJzICAgICAgKSA9PSAgODggKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIElPQ291bnRlcnMgICAgICApID09IDEzNiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgVGhyZWFkcyAgICAgICAgICkgPT0gMTg0ICk7CisjZWxzZQorICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgUHJvY2Vzc0lkICAgICAgICkgPT0gIDgwICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBIYW5kbGVDb3VudCAgICAgKSA9PSAgOTYgKTsKKyAgICBLTVBfQlVJTERfQVNTRVJUKCBvZmZzZXRvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04sIFZNQ291bnRlcnMgICAgICApID09IDExMiApOworICAgIEtNUF9CVUlMRF9BU1NFUlQoIG9mZnNldG9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiwgSU9Db3VudGVycyAgICAgICkgPT0gMjA4ICk7CisgICAgS01QX0JVSUxEX0FTU0VSVCggb2Zmc2V0b2YoIFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OLCBUaHJlYWRzICAgICAgICAgKSA9PSAyNTYgKTsKKyNlbmRpZgorCit0eXBlZGVmIE5UU1RBVFVTIChOVEFQSSAqTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uX3QpKCBTWVNURU1fSU5GT1JNQVRJT05fQ0xBU1MsIFBWT0lELCBVTE9ORywgUFVMT05HICk7CitOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb25fdCBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gPSBOVUxMOworCitITU9EVUxFIG50ZGxsID0gTlVMTDsKKworLyogRW5kIG9mIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbigpLXJlbGF0ZWQgY29kZSAqLworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCitzdGF0aWMgSE1PRFVMRSBrZXJuZWwzMiA9IE5VTEw7CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0hBTkRMRV9TSUdOQUxTCisgICAgdHlwZWRlZiB2b2lkICAgICgqIHNpZ19mdW5jX3QgKSggaW50ICk7CisgICAgc3RhdGljIHNpZ19mdW5jX3QgIF9fa21wX3NpZ2hsZHJzWyBOU0lHIF07CisgICAgc3RhdGljIGludCAgICAgICAgIF9fa21wX3NpZ2luc3RhbGxlZFsgTlNJRyBdOworI2VuZGlmCisKK3N0YXRpYyBIQU5ETEUgICBfX2ttcF9tb25pdG9yX2V2Oworc3RhdGljIGttcF9pbnQ2NCBfX2ttcF93aW4zMl90aW1lOworZG91YmxlIF9fa21wX3dpbjMyX3RpY2s7CisKK2ludCBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK0NSSVRJQ0FMX1NFQ1RJT04gX19rbXBfd2luMzJfc2VjdGlvbjsKKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfaW5pdCgga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBJbml0aWFsaXplQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCAmIG14LT5jcywgIkNyaXRpY2FsIFNlY3Rpb24iICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfbG9jaygga21wX3dpbjMyX211dGV4X3QgKm14ICkKK3sKKyAgICBFbnRlckNyaXRpY2FsU2VjdGlvbiggJiBteC0+Y3MgKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCBrbXBfd2luMzJfbXV0ZXhfdCAqbXggKQoreworICAgIExlYXZlQ3JpdGljYWxTZWN0aW9uKCAmIG14LT5jcyApOworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2luaXQoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBjdi0+d2FpdGVyc19jb3VudF8gICAgICAgICA9IDA7CisgICAgY3YtPndhaXRfZ2VuZXJhdGlvbl9jb3VudF8gPSAwOworICAgIGN2LT5yZWxlYXNlX2NvdW50XyAgICAgICAgID0gMDsKKworICAgIC8qIEluaXRpYWxpemUgdGhlIGNyaXRpY2FsIHNlY3Rpb24gKi8KKyAgICBfX2ttcF93aW4zMl9tdXRleF9pbml0KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICAvKiBDcmVhdGUgYSBtYW51YWwtcmVzZXQgZXZlbnQuICovCisgICAgY3YtPmV2ZW50XyA9IENyZWF0ZUV2ZW50KCBOVUxMLCAgICAgLy8gbm8gc2VjdXJpdHkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIFRSVUUsICAgICAvLyBtYW51YWwtcmVzZXQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEZBTFNFLCAgICAvLyBub24tc2lnbmFsZWQgaW5pdGlhbGx5CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBOVUxMICk7ICAgLy8gdW5uYW1lZAorI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfc3lzdGVtX29iamVjdF9jcmVhdGVkKCBjdi0+ZXZlbnRfLCAiRXZlbnQiICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworfQorCit2b2lkCitfX2ttcF93aW4zMl9jb25kX2Rlc3Ryb3koIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9tdXRleF9kZXN0cm95KCAmIGN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisgICAgX19rbXBfZnJlZV9oYW5kbGUoIGN2LT5ldmVudF8gKTsKKyAgICBtZW1zZXQoIGN2LCAnXDAnLCBzaXplb2YoICpjdiApICk7Cit9CisKKy8qIFRPRE8gYXNzb2NpYXRlIGN2IHdpdGggYSB0ZWFtIGluc3RlYWQgb2YgYSB0aHJlYWQgc28gYXMgdG8gb3B0aW1pemUKKyAqIHRoZSBjYXNlIHdoZXJlIHdlIHdha2UgdXAgYSB3aG9sZSB0ZWFtICovCisKK3ZvaWQKK19fa21wX3dpbjMyX2NvbmRfd2FpdCgga21wX3dpbjMyX2NvbmRfdCAqY3YsIGttcF93aW4zMl9tdXRleF90ICpteCwga21wX2luZm9fdCAqdGgsIGludCBuZWVkX2RlY3JlYXNlX2xvYWQgKQoreworICAgIGludCBteV9nZW5lcmF0aW9uOworICAgIGludCBsYXN0X3dhaXRlcjsKKworICAgIC8qIEF2b2lkIHJhY2UgY29uZGl0aW9ucyAqLworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZjdi0+d2FpdGVyc19jb3VudF9sb2NrXyApOworCisgICAgLyogSW5jcmVtZW50IGNvdW50IG9mIHdhaXRlcnMgKi8KKyAgICBjdi0+d2FpdGVyc19jb3VudF8rKzsKKworICAgIC8qIFN0b3JlIGN1cnJlbnQgZ2VuZXJhdGlvbiBpbiBvdXIgYWN0aXZhdGlvbiByZWNvcmQuICovCisgICAgbXlfZ2VuZXJhdGlvbiA9IGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfOworCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKyAgICBfX2ttcF93aW4zMl9tdXRleF91bmxvY2soIG14ICk7CisKKyAgICBmb3IgKDs7KSB7CisgICAgICAgIGludCB3YWl0X2RvbmU7CisKKyAgICAgICAgLyogV2FpdCB1bnRpbCB0aGUgZXZlbnQgaXMgc2lnbmFsZWQgKi8KKyAgICAgICAgV2FpdEZvclNpbmdsZU9iamVjdCggY3YtPmV2ZW50XywgSU5GSU5JVEUgKTsKKworICAgICAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgICAgICAvKiBFeGl0IHRoZSBsb29wIHdoZW4gdGhlIDxjdi0+ZXZlbnRfPiBpcyBzaWduYWxlZCBhbmQKKyAgICAgICAgICogdGhlcmUgYXJlIHN0aWxsIHdhaXRpbmcgdGhyZWFkcyBmcm9tIHRoaXMgPHdhaXRfZ2VuZXJhdGlvbj4KKyAgICAgICAgICogdGhhdCBoYXZlbid0IGJlZW4gcmVsZWFzZWQgZnJvbSB0aGlzIHdhaXQgeWV0LiAgICAgICAgICAgICAgKi8KKyAgICAgICAgd2FpdF9kb25lID0gKCBjdi0+cmVsZWFzZV9jb3VudF8gPiAwICkgJiYKKyAgICAgICAgICAgICAgICAgICAgKCBjdi0+d2FpdF9nZW5lcmF0aW9uX2NvdW50XyAhPSBteV9nZW5lcmF0aW9uICk7CisKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18pOworCisgICAgICAgIC8qIHRoZXJlIHVzZWQgdG8gYmUgYSBzZW1pY29sb24gYWZ0ZXIgdGhlIGlmIHN0YXRlbWVudCwKKyAgICAgICAgICogaXQgbG9va2VkIGxpa2UgYSBidWcsIHNvIGkgcmVtb3ZlZCBpdCAqLworICAgICAgICBpZiggd2FpdF9kb25lICkKKyAgICAgICAgICAgIGJyZWFrOworICAgIH0KKworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soIG14ICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfbG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBjdi0+d2FpdGVyc19jb3VudF8tLTsKKyAgICBjdi0+cmVsZWFzZV9jb3VudF8tLTsKKworICAgIGxhc3Rfd2FpdGVyID0gICggY3YtPnJlbGVhc2VfY291bnRfID09IDAgKTsKKworICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJmN2LT53YWl0ZXJzX2NvdW50X2xvY2tfICk7CisKKyAgICBpZiggbGFzdF93YWl0ZXIgKSB7CisgICAgICAgIC8qIFdlJ3JlIHRoZSBsYXN0IHdhaXRlciB0byBiZSBub3RpZmllZCwgc28gcmVzZXQgdGhlIG1hbnVhbCBldmVudC4gKi8KKyAgICAgICAgUmVzZXRFdmVudCggY3YtPmV2ZW50XyApOworICAgIH0KK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9icm9hZGNhc3QoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9tdXRleF9sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKKworICAgIGlmKCBjdi0+d2FpdGVyc19jb3VudF8gPiAwICkgeworICAgICAgICBTZXRFdmVudCggY3YtPmV2ZW50XyApOworICAgICAgICAvKiBSZWxlYXNlIGFsbCB0aGUgdGhyZWFkcyBpbiB0aGlzIGdlbmVyYXRpb24uICovCisKKyAgICAgICAgY3YtPnJlbGVhc2VfY291bnRfID0gY3YtPndhaXRlcnNfY291bnRfOworCisgICAgICAgIC8qIFN0YXJ0IGEgbmV3IGdlbmVyYXRpb24uICovCisgICAgICAgIGN2LT53YWl0X2dlbmVyYXRpb25fY291bnRfKys7CisgICAgfQorCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmY3YtPndhaXRlcnNfY291bnRfbG9ja18gKTsKK30KKwordm9pZAorX19rbXBfd2luMzJfY29uZF9zaWduYWwoIGttcF93aW4zMl9jb25kX3QgKmN2ICkKK3sKKyAgICBfX2ttcF93aW4zMl9jb25kX2Jyb2FkY2FzdCggY3YgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfZW5hYmxlKCBpbnQgbmV3X3N0YXRlICkKK3sKKyAgICBpZiAoX19rbXBfaW5pdF9ydW50aW1lKQorICAgICAgICBMZWF2ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7Cit9CisKK3ZvaWQKK19fa21wX2Rpc2FibGUoIGludCAqb2xkX3N0YXRlICkKK3sKKyAgICAqb2xkX3N0YXRlID0gMDsKKworICAgIGlmIChfX2ttcF9pbml0X3J1bnRpbWUpCisgICAgICAgIEVudGVyQ3JpdGljYWxTZWN0aW9uKCAmIF9fa21wX3dpbjMyX3NlY3Rpb24gKTsKK30KKwordm9pZAorX19rbXBfc3VzcGVuZF9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICAvKiBkbyBub3RoaW5nICovCit9CisKK3N0YXRpYyB2b2lkCitfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCBrbXBfaW5mb190ICp0aCApCit7CisgICAgaWYgKCAhIFRDUl80KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0ICkgKSB7CisgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmVuJ3QgaW5pdGlhbGl6ZWQgdGhlIHN1c3BlbnNpb24gcHRocmVhZCBvYmplY3RzIGZvciB0aGlzIHRocmVhZAorICAgICAgICAgaW4gdGhpcyBpbnN0YW5jZSBvZiB0aGUgcHJvY2VzcyAqLworICAgICAgICBfX2ttcF93aW4zMl9jb25kX2luaXQoICAmdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfaW5pdCggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICAgIFRDV180KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0LCBUUlVFICk7CisgICAgfQorfQorCit2b2lkCitfX2ttcF9zdXNwZW5kX3VuaW5pdGlhbGl6ZV90aHJlYWQoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBpZiAoIFRDUl80KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0ICkgKSB7CisgICAgICAvKiB0aGlzIG1lYW5zIHdlIGhhdmUgaW5pdGlhbGl6ZSB0aGUgc3VzcGVuc2lvbiBwdGhyZWFkIG9iamVjdHMgZm9yIHRoaXMgdGhyZWFkCisgICAgICAgICBpbiB0aGlzIGluc3RhbmNlIG9mIHRoZSBwcm9jZXNzICovCisgICAgICBfX2ttcF93aW4zMl9jb25kX2Rlc3Ryb3koICYgdGgtPnRoLnRoX3N1c3BlbmRfY3YgKTsKKyAgICAgIF9fa21wX3dpbjMyX211dGV4X2Rlc3Ryb3koICYgdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgIFRDV180KCB0aC0+dGgudGhfc3VzcGVuZF9pbml0LCBGQUxTRSApOworICAgIH0KK30KKworLyogVGhpcyByb3V0aW5lIHB1dHMgdGhlIGNhbGxpbmcgdGhyZWFkIHRvIHNsZWVwIGFmdGVyIHNldHRpbmcgdGhlCisgKiBzbGVlcCBiaXQgZm9yIHRoZSBpbmRpY2F0ZWQgZmxhZyB2YXJpYWJsZSB0byB0cnVlLgorICovCit0ZW1wbGF0ZSA8Y2xhc3MgQz4KK3N0YXRpYyBpbmxpbmUgdm9pZCBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKCBpbnQgdGhfZ3RpZCwgQyAqZmxhZyApCit7CisgICAga21wX2luZm9fdCAqdGggPSBfX2ttcF90aHJlYWRzW3RoX2d0aWRdOworICAgIGludCBzdGF0dXM7CisgICAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluOworCisgICAgS0ZfVFJBQ0UoIDMwLCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgZW50ZXIgZm9yIGZsYWcncyBsb2MoJXApXG4iLCB0aF9ndGlkLCBmbGFnLT5nZXQoKSApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgS0ZfVFJBQ0UoIDEwLCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNldHRpbmcgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKVxuIiwKKyAgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCkgKSApOworCisgICAgLyogVE9ETzogc2hvdWxkbid0IHRoaXMgdXNlIHJlbGVhc2Ugc2VtYW50aWNzIHRvIGVuc3VyZSB0aGF0IF9fa21wX3N1c3BlbmRfaW5pdGlhbGl6ZV90aHJlYWQKKyAgICAgICBnZXRzIGNhbGxlZCBmaXJzdD8KKyAgICAqLworICAgIG9sZF9zcGluID0gZmxhZy0+c2V0X3NsZWVwaW5nKCk7CisKKyAgICBLRl9UUkFDRSggNSwgKCAiX19rbXBfc3VzcGVuZF90ZW1wbGF0ZTogVCMlZCBzZXQgc2xlZXAgYml0IGZvciBmbGFnJ3MgbG9jKCVwKT09JWRcbiIsCisgICAgICAgICAgICAgICAgICAgdGhfZ3RpZCwgZmxhZy0+Z2V0KCksICooZmxhZy0+Z2V0KCkpICkgKTsKKworICAgIGlmICggZmxhZy0+ZG9uZV9jaGVja192YWwob2xkX3NwaW4pICkgeworICAgICAgICBvbGRfc3BpbiA9IGZsYWctPnVuc2V0X3NsZWVwaW5nKCk7CisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGZhbHNlIGFsYXJtLCByZXNldCBzbGVlcCBiaXQgZm9yIGZsYWcncyBsb2MoJXApXG4iLAorICAgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkLCBmbGFnLT5nZXQoKSkgKTsKKyAgICB9IGVsc2UgeworI2lmZGVmIERFQlVHX1NVU1BFTkQKKyAgICAgICAgX19rbXBfc3VzcGVuZF9jb3VudCsrOworI2VuZGlmCisgICAgICAgIC8qIEVuY2Fwc3VsYXRlIGluIGEgbG9vcCBhcyB0aGUgZG9jdW1lbnRhdGlvbiBzdGF0ZXMgdGhhdCB0aGlzIG1heQorICAgICAgICAgKiAid2l0aCBsb3cgcHJvYmFiaWxpdHkiIHJldHVybiB3aGVuIHRoZSBjb25kaXRpb24gdmFyaWFibGUgaGFzCisgICAgICAgICAqIG5vdCBiZWVuIHNpZ25hbGVkIG9yIGJyb2FkY2FzdAorICAgICAgICAgKi8KKyAgICAgICAgaW50IGRlYWN0aXZhdGVkID0gRkFMU0U7CisgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX3NsZWVwX2xvYywgKHZvaWQgKilmbGFnKTsKKyAgICAgICAgd2hpbGUgKCBmbGFnLT5pc19zbGVlcGluZygpICkgeworICAgICAgICAgICAgS0ZfVFJBQ0UoIDE1LCAoIl9fa21wX3N1c3BlbmRfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gcGVyZm9ybSBrbXBfd2luMzJfY29uZF93YWl0KClcbiIsCisgICAgICAgICAgICAgICAgICAgICB0aF9ndGlkICkgKTsKKyAgICAgICAgICAgIC8vIE1hcmsgdGhlIHRocmVhZCBhcyBubyBsb25nZXIgYWN0aXZlIChvbmx5IGluIHRoZSBmaXJzdCBpdGVyYXRpb24gb2YgdGhlIGxvb3ApLgorICAgICAgICAgICAgaWYgKCAhIGRlYWN0aXZhdGVkICkgeworICAgICAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBGQUxTRTsKKyAgICAgICAgICAgICAgICBpZiAoIHRoLT50aC50aF9hY3RpdmVfaW5fcG9vbCApIHsKKyAgICAgICAgICAgICAgICAgICAgdGgtPnRoLnRoX2FjdGl2ZV9pbl9wb29sID0gRkFMU0U7CisgICAgICAgICAgICAgICAgICAgIEtNUF9URVNUX1RIRU5fREVDMzIoCisgICAgICAgICAgICAgICAgICAgICAgKGttcF9pbnQzMiAqKSAmX19rbXBfdGhyZWFkX3Bvb2xfYWN0aXZlX250aCApOworICAgICAgICAgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBUQ1JfNChfX2ttcF90aHJlYWRfcG9vbF9hY3RpdmVfbnRoKSA+PSAwICk7CisgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgIGRlYWN0aXZhdGVkID0gVFJVRTsKKworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgICAgIF9fa21wX3dpbjMyX2NvbmRfd2FpdCggJnRoLT50aC50aF9zdXNwZW5kX2N2LCAmdGgtPnRoLnRoX3N1c3BlbmRfbXgsIDAsIDAgKTsKKyAgICAgICAgICAgIH0KKworI2lmZGVmIEtNUF9ERUJVRworICAgICAgICAgICAgaWYoIGZsYWctPmlzX3NsZWVwaW5nKCkgKSB7CisgICAgICAgICAgICAgICAgS0ZfVFJBQ0UoIDEwMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIHNwdXJpb3VzIHdha2V1cFxuIiwgdGhfZ3RpZCApKTsKKyAgICAgICAgICAgIH0KKyNlbmRpZiAvKiBLTVBfREVCVUcgKi8KKworICAgICAgICB9IC8vIHdoaWxlCisKKyAgICAgICAgLy8gTWFyayB0aGUgdGhyZWFkIGFzIGFjdGl2ZSBhZ2FpbiAoaWYgaXQgd2FzIHByZXZpb3VzIG1hcmtlZCBhcyBpbmFjdGl2ZSkKKyAgICAgICAgaWYgKCBkZWFjdGl2YXRlZCApIHsKKyAgICAgICAgICAgIHRoLT50aC50aF9hY3RpdmUgPSBUUlVFOworICAgICAgICAgICAgaWYgKCBUQ1JfNCh0aC0+dGgudGhfaW5fcG9vbCkgKSB7CisgICAgICAgICAgICAgICAgS01QX1RFU1RfVEhFTl9JTkMzMigKKyAgICAgICAgICAgICAgICAgIChrbXBfaW50MzIgKikgJl9fa21wX3RocmVhZF9wb29sX2FjdGl2ZV9udGggKTsKKyAgICAgICAgICAgICAgICB0aC0+dGgudGhfYWN0aXZlX2luX3Bvb2wgPSBUUlVFOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorCisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCJfX2ttcF9zdXNwZW5kX3RlbXBsYXRlOiBUIyVkIGV4aXRcbiIsIHRoX2d0aWQgKSApOworfQorCit2b2lkIF9fa21wX3N1c3BlbmRfMzIoaW50IHRoX2d0aWQsIGttcF9mbGFnXzMyICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfc3VzcGVuZF82NChpbnQgdGhfZ3RpZCwga21wX2ZsYWdfNjQgKmZsYWcpIHsKKyAgICBfX2ttcF9zdXNwZW5kX3RlbXBsYXRlKHRoX2d0aWQsIGZsYWcpOworfQordm9pZCBfX2ttcF9zdXNwZW5kX29uY29yZShpbnQgdGhfZ3RpZCwga21wX2ZsYWdfb25jb3JlICpmbGFnKSB7CisgICAgX19rbXBfc3VzcGVuZF90ZW1wbGF0ZSh0aF9ndGlkLCBmbGFnKTsKK30KKworCisvKiBUaGlzIHJvdXRpbmUgc2lnbmFscyB0aGUgdGhyZWFkIHNwZWNpZmllZCBieSB0YXJnZXRfZ3RpZCB0byB3YWtlIHVwCisgKiBhZnRlciBzZXR0aW5nIHRoZSBzbGVlcCBiaXQgaW5kaWNhdGVkIGJ5IHRoZSBmbGFnIGFyZ3VtZW50IHRvIEZBTFNFCisgKi8KK3RlbXBsYXRlIDxjbGFzcyBDPgorc3RhdGljIGlubGluZSB2b2lkIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSggaW50IHRhcmdldF9ndGlkLCBDICpmbGFnICkKK3sKKyAgICBrbXBfaW5mb190ICp0aCA9IF9fa21wX3RocmVhZHNbdGFyZ2V0X2d0aWRdOworICAgIGludCBzdGF0dXM7CisKKyNpZmRlZiBLTVBfREVCVUcKKyAgICBpbnQgZ3RpZCA9IFRDUl80KF9fa21wX2luaXRfZ3RpZCkgPyBfX2ttcF9nZXRfZ3RpZCgpIDogLTE7CisjZW5kaWYKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIHdhbnRzIHRvIHdha2V1cCBUIyVkIGVudGVyXG4iLCBndGlkLCB0YXJnZXRfZ3RpZCApICk7CisKKyAgICBfX2ttcF9zdXNwZW5kX2luaXRpYWxpemVfdGhyZWFkKCB0aCApOworICAgIF9fa21wX3dpbjMyX211dGV4X2xvY2soICZ0aC0+dGgudGhfc3VzcGVuZF9teCApOworCisgICAgaWYgKCFmbGFnKSB7IC8vIGNvbWluZyBmcm9tIF9fa21wX251bGxfcmVzdW1lX3dyYXBwZXIKKyAgICAgICAgZmxhZyA9IChDICopdGgtPnRoLnRoX3NsZWVwX2xvYzsKKyAgICB9CisKKyAgICAvLyBGaXJzdCwgY2hlY2sgaWYgdGhlIGZsYWcgaXMgbnVsbCBvciBpdHMgdHlwZSBoYXMgY2hhbmdlZC4gSWYgc28sIHNvbWVvbmUgZWxzZSB3b2tlIGl0IHVwLgorICAgIGlmICghZmxhZyB8fCBmbGFnLT5nZXRfdHlwZSgpICE9IGZsYWctPmdldF9wdHJfdHlwZSgpKSB7IC8vIGdldF9wdHJfdHlwZSBzaW1wbHkgc2hvd3Mgd2hhdCBmbGFnIHdhcyBjYXN0IHRvCisgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZTogZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBOVUxMICkgKTsKKyAgICAgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgdHlwZW5hbWUgQzo6ZmxhZ190IG9sZF9zcGluID0gZmxhZy0+dW5zZXRfc2xlZXBpbmcoKTsKKyAgICAgICAgaWYgKCAhZmxhZy0+aXNfc2xlZXBpbmdfdmFsKG9sZF9zcGluKSApIHsKKyAgICAgICAgICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgZXhpdGluZywgdGhyZWFkIFQjJWQgYWxyZWFkeSBhd2FrZTogZmxhZydzIGxvYyglcCk6ICIKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICIldSA9PiAldVxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkLCBmbGFnLT5nZXQoKSwgb2xkX3NwaW4sICooZmxhZy0+Z2V0KCkpICkgKTsKKyAgICAgICAgICAgIF9fa21wX3dpbjMyX211dGV4X3VubG9jayggJnRoLT50aC50aF9zdXNwZW5kX214ICk7CisgICAgICAgICAgICByZXR1cm47CisgICAgICAgIH0KKyAgICB9CisgICAgVENXX1BUUih0aC0+dGgudGhfc2xlZXBfbG9jLCBOVUxMKTsKKworICAgIEtGX1RSQUNFKCA1LCAoICJfX2ttcF9yZXN1bWVfdGVtcGxhdGU6IFQjJWQgYWJvdXQgdG8gd2FrZXVwIFQjJWQsIHJlc2V0IHNsZWVwIGJpdCBmb3IgZmxhZydzIGxvYyglcClcbiIsCisgICAgICAgICAgICAgICAgICAgZ3RpZCwgdGFyZ2V0X2d0aWQsIGZsYWctPmdldCgpICkgKTsKKworICAgIF9fa21wX3dpbjMyX2NvbmRfc2lnbmFsKCAgJnRoLT50aC50aF9zdXNwZW5kX2N2ICk7CisgICAgX19rbXBfd2luMzJfbXV0ZXhfdW5sb2NrKCAmdGgtPnRoLnRoX3N1c3BlbmRfbXggKTsKKworICAgIEtGX1RSQUNFKCAzMCwgKCAiX19rbXBfcmVzdW1lX3RlbXBsYXRlOiBUIyVkIGV4aXRpbmcgYWZ0ZXIgc2lnbmFsaW5nIHdha2UgdXAgZm9yIFQjJWRcbiIsCisgICAgICAgICAgICAgICAgICAgIGd0aWQsIHRhcmdldF9ndGlkICkgKTsKK30KKwordm9pZCBfX2ttcF9yZXN1bWVfMzIoaW50IHRhcmdldF9ndGlkLCBrbXBfZmxhZ18zMiAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9Cit2b2lkIF9fa21wX3Jlc3VtZV82NChpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnXzY0ICpmbGFnKSB7CisgICAgX19rbXBfcmVzdW1lX3RlbXBsYXRlKHRhcmdldF9ndGlkLCBmbGFnKTsKK30KK3ZvaWQgX19rbXBfcmVzdW1lX29uY29yZShpbnQgdGFyZ2V0X2d0aWQsIGttcF9mbGFnX29uY29yZSAqZmxhZykgeworICAgIF9fa21wX3Jlc3VtZV90ZW1wbGF0ZSh0YXJnZXRfZ3RpZCwgZmxhZyk7Cit9CisKKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfeWllbGQoIGludCBjb25kICkKK3sKKyAgICBpZiAoY29uZCkKKyAgICAgICAgU2xlZXAoMCk7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKK3ZvaWQKK19fa21wX2d0aWRfc2V0X3NwZWNpZmljKCBpbnQgZ3RpZCApCit7CisgICAgaWYoIF9fa21wX2luaXRfZ3RpZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfc2V0X3NwZWNpZmljOiBUIyVkIGtleTolZFxuIiwKKyAgICAgICAgICAgICAgICAgICAgZ3RpZCwgX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSApKTsKKyAgICAgICAgaWYoICEgVGxzU2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXksIChMUFZPSUQpKGd0aWQrMSkpICkKKyAgICAgICAgICAgIEtNUF9GQVRBTCggVExTU2V0VmFsdWVGYWlsZWQgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBLQV9UUkFDRSggNTAsICgiX19rbXBfZ3RpZF9zZXRfc3BlY2lmaWM6IHJ1bnRpbWUgc2h1dGRvd24sIHJldHVybmluZ1xuIiApICk7CisgICAgfQorfQorCitpbnQKK19fa21wX2d0aWRfZ2V0X3NwZWNpZmljKCkKK3sKKyAgICBpbnQgZ3RpZDsKKyAgICBpZiggIV9fa21wX2luaXRfZ3RpZCApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBydW50aW1lIHNodXRkb3duLCByZXR1cm5pbmcgS01QX0dUSURfU0hVVERPV05cbiIgKSApOworICAgICAgICByZXR1cm4gS01QX0dUSURfU0hVVERPV047CisgICAgfQorICAgIGd0aWQgPSAoaW50KShrbXBfaW50cHRyX3QpVGxzR2V0VmFsdWUoIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKTsKKyAgICBpZiAoIGd0aWQgPT0gMCApIHsKKyAgICAgICAgZ3RpZCA9IEtNUF9HVElEX0RORTsKKyAgICB9CisgICAgZWxzZSB7CisgICAgICAgIGd0aWQtLTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDUwLCAoIl9fa21wX2d0aWRfZ2V0X3NwZWNpZmljOiBrZXk6JWQgZ3RpZDolZFxuIiwKKyAgICAgICAgICAgICAgICBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5LCBndGlkICkpOworICAgIHJldHVybiBndGlkOworfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisKKy8vCisvLyBPbmx5IDEgRFdPUkQgaW4gdGhlIG1hc2sgc2hvdWxkIGhhdmUgYW55IHByb2NzIHNldC4KKy8vIFJldHVybiB0aGUgYXBwcm9wcmlhdGUgaW5kZXgsIG9yIC0xIGZvciBhbiBpbnZhbGlkIG1hc2suCisvLworaW50CitfX2ttcF9nZXRfcHJvY19ncm91cCgga21wX2FmZmluX21hc2tfdCBjb25zdCAqbWFzayApCit7CisgICAgaW50IGk7CisgICAgaW50IGdyb3VwID0gLTE7CisgICAgZm9yIChpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrKSB7CisjaWYgS01QX1VTRV9IV0xPQworICAgICAgICAvLyBPbiB3aW5kb3dzLCB0aGUgbG9uZyB0eXBlIGlzIGFsd2F5cyAzMiBiaXRzCisgICAgICAgIHVuc2lnbmVkIGxvbmcgZmlyc3RfMzJfYml0cyA9IGh3bG9jX2JpdG1hcF90b19pdGhfdWxvbmcoKGh3bG9jX2NvbnN0X2JpdG1hcF90KW1hc2ssIGkqMik7CisgICAgICAgIHVuc2lnbmVkIGxvbmcgc2Vjb25kXzMyX2JpdHMgPSBod2xvY19iaXRtYXBfdG9faXRoX3Vsb25nKChod2xvY19jb25zdF9iaXRtYXBfdCltYXNrLCBpKjIrMSk7CisgICAgICAgIGlmIChmaXJzdF8zMl9iaXRzID09IDAgJiYgc2Vjb25kXzMyX2JpdHMgPT0gMCkgeworICAgICAgICAgICAgY29udGludWU7CisgICAgICAgIH0KKyNlbHNlCisgICAgICAgIGlmIChtYXNrW2ldID09IDApIHsKKyAgICAgICAgICAgIGNvbnRpbnVlOworICAgICAgICB9CisjZW5kaWYKKyAgICAgICAgaWYgKGdyb3VwID49IDApIHsKKyAgICAgICAgICAgIHJldHVybiAtMTsKKyAgICAgICAgfQorICAgICAgICBncm91cCA9IGk7CisgICAgfQorICAgIHJldHVybiBncm91cDsKK30KKworI2VuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCitpbnQKK19fa21wX3NldF9zeXN0ZW1fYWZmaW5pdHkoIGttcF9hZmZpbl9tYXNrX3QgY29uc3QgKm1hc2ssIGludCBhYm9ydF9vbl9lcnJvciApCit7CisjaWYgS01QX1VTRV9IV0xPQworICAgIGludCByZXR2YWwgPSBod2xvY19zZXRfY3B1YmluZChfX2ttcF9od2xvY190b3BvbG9neSwgKGh3bG9jX2NwdXNldF90KW1hc2ssIEhXTE9DX0NQVUJJTkRfVEhSRUFEKTsKKyAgICBpZiAocmV0dmFsID49IDApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorICAgIGludCBlcnJvciA9IGVycm5vOworICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGYXRhbFN5c0Vycm9yICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgcmV0dXJuIGVycm9yOworI2Vsc2UKKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAvLworICAgICAgICAvLyBDaGVjayBmb3IgYSB2YWxpZCBtYXNrLgorICAgICAgICAvLworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgaW50IGdyb3VwID0gX19rbXBfZ2V0X3Byb2NfZ3JvdXAoIG1hc2sgKTsKKyAgICAgICAgaWYgKGdyb3VwIDwgMCkgeworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgS01QX0ZBVEFMKEFmZmluaXR5SW52YWxpZE1hc2ssICJrbXBfc2V0X2FmZmluaXR5Iik7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gLTE7CisgICAgICAgIH0KKworICAgICAgICAvLworICAgICAgICAvLyBUcmFuc2Zvcm0gdGhlIGJpdCB2ZWN0b3IgaW50byBhIEdST1VQX0FGRklOSVRZIHN0cnVjdAorICAgICAgICAvLyBhbmQgbWFrZSB0aGUgc3lzdGVtIGNhbGwgdG8gc2V0IGFmZmluaXR5LgorICAgICAgICAvLworICAgICAgICBnYS5Hcm91cCA9IGdyb3VwOworICAgICAgICBnYS5NYXNrID0gbWFza1tncm91cF07CisgICAgICAgIGdhLlJlc2VydmVkWzBdID0gZ2EuUmVzZXJ2ZWRbMV0gPSBnYS5SZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkQWZmTWFzayApLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICAgICAgICAgICk7CisgICAgICAgICAgICB9CisgICAgICAgICAgICByZXR1cm4gZXJyb3I7CisgICAgICAgIH0KKyAgICB9CisgICAgZWxzZQorCisjIGVuZGlmIC8qIEtNUF9HUk9VUF9BRkZJTklUWSAqLworCisgICAgeworICAgICAgICBpZiAoIVNldFRocmVhZEFmZmluaXR5TWFzayggR2V0Q3VycmVudFRocmVhZCgpLCAqbWFzayApKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgIH0KKyNlbmRpZiAvKiBLTVBfVVNFX0hXTE9DICovCisgICAgcmV0dXJuIDA7Cit9CisKK2ludAorX19rbXBfZ2V0X3N5c3RlbV9hZmZpbml0eSgga21wX2FmZmluX21hc2tfdCAqbWFzaywgaW50IGFib3J0X29uX2Vycm9yICkKK3sKKyNpZiBLTVBfVVNFX0hXTE9DCisgICAgaW50IHJldHZhbCA9IGh3bG9jX2dldF9jcHViaW5kKF9fa21wX2h3bG9jX3RvcG9sb2d5LCAoaHdsb2NfY3B1c2V0X3QpbWFzaywgSFdMT0NfQ1BVQklORF9USFJFQUQpOworICAgIGlmIChyZXR2YWwgPj0gMCkgeworICAgICAgICByZXR1cm4gMDsKKyAgICB9CisgICAgaW50IGVycm9yID0gZXJybm87CisgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZhdGFsU3lzRXJyb3IgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKyAgICByZXR1cm4gZXJyb3I7CisjZWxzZSAvKiBLTVBfVVNFX0hXTE9DICovCisjIGlmIEtNUF9HUk9VUF9BRkZJTklUWQorCisgICAgaWYgKF9fa21wX251bV9wcm9jX2dyb3VwcyA+IDEpIHsKKyAgICAgICAgS01QX0NQVV9aRVJPKG1hc2spOworICAgICAgICBHUk9VUF9BRkZJTklUWSBnYTsKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworCisgICAgICAgIGlmIChfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5KEdldEN1cnJlbnRUaHJlYWQoKSwgJmdhKSA9PSAwKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFRocmVhZEdyb3VwQWZmaW5pdHkoKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisKKyAgICAgICAgaWYgKChnYS5Hcm91cCA8IDApIHx8IChnYS5Hcm91cCA+IF9fa21wX251bV9wcm9jX2dyb3VwcykKKyAgICAgICAgICB8fCAoZ2EuTWFzayA9PSAwKSkgeworICAgICAgICAgICAgcmV0dXJuIC0xOworICAgICAgICB9CisKKyAgICAgICAgbWFza1tnYS5Hcm91cF0gPSBnYS5NYXNrOworICAgIH0KKyAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbmV3TWFzaywgc3lzTWFzaywgcmV0dmFsOworCisgICAgICAgIGlmICghR2V0UHJvY2Vzc0FmZmluaXR5TWFzayhHZXRDdXJyZW50UHJvY2VzcygpLCAmbmV3TWFzaywgJnN5c01hc2spKSB7CisgICAgICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICAgICAgaWYgKGFib3J0X29uX2Vycm9yKSB7CisgICAgICAgICAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coRnVuY3Rpb25FcnJvciwgIkdldFByb2Nlc3NBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICAgICAgcmV0dXJuIGVycm9yOworICAgICAgICB9CisgICAgICAgIHJldHZhbCA9IFNldFRocmVhZEFmZmluaXR5TWFzayhHZXRDdXJyZW50VGhyZWFkKCksIG5ld01hc2spOworICAgICAgICBpZiAoISByZXR2YWwpIHsKKyAgICAgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgICAgICBpZiAoYWJvcnRfb25fZXJyb3IpIHsKKyAgICAgICAgICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgICAgICAgICAgS01QX01TRyhGdW5jdGlvbkVycm9yLCAiU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkiKSwKKyAgICAgICAgICAgICAgICAgICAgS01QX0VSUihlcnJvciksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIHJldHVybiBlcnJvcjsKKyAgICAgICAgfQorICAgICAgICBuZXdNYXNrID0gU2V0VGhyZWFkQWZmaW5pdHlNYXNrKEdldEN1cnJlbnRUaHJlYWQoKSwgcmV0dmFsKTsKKyAgICAgICAgaWYgKCEgbmV3TWFzaykgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChhYm9ydF9vbl9lcnJvcikgeworICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgICAgICAgICBLTVBfTVNHKEZ1bmN0aW9uRXJyb3IsICJTZXRUaHJlYWRBZmZpbml0eU1hc2soKSIpLAorICAgICAgICAgICAgICAgICAgICBLTVBfRVJSKGVycm9yKSwKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgICAgICptYXNrID0gcmV0dmFsOworICAgIH0KKyNlbmRpZiAvKiBLTVBfVVNFX0hXTE9DICovCisgICAgcmV0dXJuIDA7Cit9CisKK3ZvaWQKK19fa21wX2FmZmluaXR5X2JpbmRfdGhyZWFkKCBpbnQgcHJvYyApCit7CisjaWYgS01QX1VTRV9IV0xPQworICAgIGttcF9hZmZpbl9tYXNrX3QgKm1hc2s7CisgICAgS01QX0NQVV9BTExPQ19PTl9TVEFDSyhtYXNrKTsKKyAgICBLTVBfQ1BVX1pFUk8obWFzayk7CisgICAgS01QX0NQVV9TRVQocHJvYywgbWFzayk7CisgICAgX19rbXBfc2V0X3N5c3RlbV9hZmZpbml0eShtYXNrLCBUUlVFKTsKKyAgICBLTVBfQ1BVX0ZSRUVfRlJPTV9TVEFDSyhtYXNrKTsKKyNlbHNlIC8qIEtNUF9VU0VfSFdMT0MgKi8KKyMgaWYgS01QX0dST1VQX0FGRklOSVRZCisKKyAgICBpZiAoX19rbXBfbnVtX3Byb2NfZ3JvdXBzID4gMSkgeworICAgICAgICAvLworICAgICAgICAvLyBGb3JtIHRoZSBHUk9VUF9BRkZJTklUWSBzdHJ1Y3QgZGlyZWN0bHksIHJhdGhlciB0aGFuIGZpbGxpbmcKKyAgICAgICAgLy8gb3V0IGEgYml0IHZlY3RvciBhbmQgY2FsbGluZyBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCkuCisgICAgICAgIC8vCisgICAgICAgIEdST1VQX0FGRklOSVRZIGdhOworICAgICAgICBLTVBfREVCVUdfQVNTRVJUKChwcm9jID49IDApICYmIChwcm9jIDwgKF9fa21wX251bV9wcm9jX2dyb3VwcworICAgICAgICAgICAqIENIQVJfQklUICogc2l6ZW9mKERXT1JEX1BUUikpKSk7CisgICAgICAgIGdhLkdyb3VwID0gcHJvYyAvIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKTsKKyAgICAgICAgZ2EuTWFzayA9ICh1bnNpZ25lZCBsb25nIGxvbmcpMSA8PCAocHJvYyAlIChDSEFSX0JJVCAqIHNpemVvZihEV09SRF9QVFIpKSk7CisgICAgICAgIGdhLlJlc2VydmVkWzBdID0gZ2EuUmVzZXJ2ZWRbMV0gPSBnYS5SZXNlcnZlZFsyXSA9IDA7CisKKyAgICAgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwpOworICAgICAgICBpZiAoX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eShHZXRDdXJyZW50VGhyZWFkKCksICZnYSwgTlVMTCkgPT0gMCkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIGlmIChfX2ttcF9hZmZpbml0eV92ZXJib3NlKSB7IC8vIEFDOiBjb250aW51ZSBzaWxlbnRseSBpZiBub3QgdmVyYm9zZQorICAgICAgICAgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgICAgICAgICAga21wX21zX3dhcm5pbmcsCisgICAgICAgICAgICAgICAgICAgIEtNUF9NU0coIENhbnRTZXRUaHJlYWRBZmZNYXNrICksCisgICAgICAgICAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlCisKKyMgZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICB7CisgICAgICAgIGttcF9hZmZpbl9tYXNrX3QgbWFzazsKKyAgICAgICAgS01QX0NQVV9aRVJPKCZtYXNrKTsKKyAgICAgICAgS01QX0NQVV9TRVQocHJvYywgJm1hc2spOworICAgICAgICBfX2ttcF9zZXRfc3lzdGVtX2FmZmluaXR5KCZtYXNrLCBUUlVFKTsKKyAgICB9CisjZW5kaWYgLyogS01QX1VTRV9IV0xPQyAqLworfQorCit2b2lkCitfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZSggY29uc3QgY2hhciAqZW52X3ZhciApCit7CisgICAgLy8KKyAgICAvLyBBbGwgdmVyc2lvbnMgb2YgV2luZG93cyogT1MgKHNpbmNlIFdpbiAnOTUpIHN1cHBvcnQgU2V0VGhyZWFkQWZmaW5pdHlNYXNrKCkuCisgICAgLy8KKworI2lmIEtNUF9HUk9VUF9BRkZJTklUWQorICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoX19rbXBfbnVtX3Byb2NfZ3JvdXBzKnNpemVvZihrbXBfYWZmaW5fbWFza190KSk7CisjZWxzZQorICAgIEtNUF9BRkZJTklUWV9FTkFCTEUoc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpKTsKKyNlbmRpZgorCisgICAgS0FfVFJBQ0UoIDEwLCAoCisgICAgICAgICJfX2ttcF9hZmZpbml0eV9kZXRlcm1pbmVfY2FwYWJsZTogIgorICAgICAgICAgICAgIldpbmRvd3MqIE9TIGFmZmluaXR5IGludGVyZmFjZSBmdW5jdGlvbmFsIChtYXNrIHNpemUgPSAlIiBLTVBfU0laRV9UX1NQRUMgIikuXG4iLAorICAgICAgICBfX2ttcF9hZmZpbl9tYXNrX3NpemUKKyAgICApICk7Cit9CisKK2RvdWJsZQorX19rbXBfcmVhZF9jcHVfdGltZSggdm9pZCApCit7CisgICAgRklMRVRJTUUgICAgQ3JlYXRpb25UaW1lLCBFeGl0VGltZSwgS2VybmVsVGltZSwgVXNlclRpbWU7CisgICAgaW50ICAgICAgICAgc3RhdHVzOworICAgIGRvdWJsZSAgICAgIGNwdV90aW1lOworCisgICAgY3B1X3RpbWUgPSAwOworCisgICAgc3RhdHVzID0gR2V0UHJvY2Vzc1RpbWVzKCBHZXRDdXJyZW50UHJvY2VzcygpLCAmQ3JlYXRpb25UaW1lLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJkV4aXRUaW1lLCAmS2VybmVsVGltZSwgJlVzZXJUaW1lICk7CisKKyAgICBpZiAoc3RhdHVzKSB7CisgICAgICAgIGRvdWJsZSAgc2VjID0gMDsKKworICAgICAgICBzZWMgKz0gS2VybmVsVGltZS5kd0hpZ2hEYXRlVGltZTsKKyAgICAgICAgc2VjICs9IFVzZXJUaW1lLmR3SGlnaERhdGVUaW1lOworCisgICAgICAgIC8qIFNoaWZ0IGxlZnQgYnkgMzIgYml0cyAqLworICAgICAgICBzZWMgKj0gKGRvdWJsZSkgKDEgPDwgMTYpICogKGRvdWJsZSkgKDEgPDwgMTYpOworCisgICAgICAgIHNlYyArPSBLZXJuZWxUaW1lLmR3TG93RGF0ZVRpbWU7CisgICAgICAgIHNlYyArPSBVc2VyVGltZS5kd0xvd0RhdGVUaW1lOworCisgICAgICAgIGNwdV90aW1lICs9IChzZWMgKiAxMDAuMCkgLyBLTVBfTlNFQ19QRVJfU0VDOworICAgIH0KKworICAgIHJldHVybiBjcHVfdGltZTsKK30KKworaW50CitfX2ttcF9yZWFkX3N5c3RlbV9pbmZvKCBzdHJ1Y3Qga21wX3N5c19pbmZvICppbmZvICkKK3sKKyAgICBpbmZvLT5tYXhyc3MgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG1heGltdW0gcmVzaWRlbnQgc2V0IHNpemUgdXRpbGl6ZWQgKGluIGtpbG9ieXRlcykgICAgICovCisgICAgaW5mby0+bWluZmx0ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgcGFnZSBmYXVsdHMgc2VydmljZWQgd2l0aG91dCBhbnkgSS9PICAgICAgICAqLworICAgIGluZm8tPm1hamZsdCAgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHBhZ2UgZmF1bHRzIHNlcnZpY2VkIHRoYXQgcmVxdWlyZWQgSS9PICAgICAgKi8KKyAgICBpbmZvLT5uc3dhcCAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIHByb2Nlc3Mgd2FzICJzd2FwcGVkIiBvdXQgb2YgbWVtb3J5ICovCisgICAgaW5mby0+aW5ibG9jayA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgdGhlIGZpbGUgc3lzdGVtIGhhZCB0byBwZXJmb3JtIGlucHV0ICAqLworICAgIGluZm8tPm91YmxvY2sgPSAwOyAgICAgICAgICAgICAgICAgICAvKiB0aGUgbnVtYmVyIG9mIHRpbWVzIHRoZSBmaWxlIHN5c3RlbSBoYWQgdG8gcGVyZm9ybSBvdXRwdXQgKi8KKyAgICBpbmZvLT5udmNzdyAgID0gMDsgICAgICAgICAgICAgICAgICAgLyogdGhlIG51bWJlciBvZiB0aW1lcyBhIGNvbnRleHQgc3dpdGNoIHdhcyB2b2x1bnRhcmlseSAgICAgICovCisgICAgaW5mby0+bml2Y3N3ICA9IDA7ICAgICAgICAgICAgICAgICAgIC8qIHRoZSBudW1iZXIgb2YgdGltZXMgYSBjb250ZXh0IHN3aXRjaCB3YXMgZm9yY2VkICAgICAgICAgICAqLworCisgICAgcmV0dXJuIDE7Cit9CisKKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisKKwordm9pZAorX19rbXBfcnVudGltZV9pbml0aWFsaXplKCB2b2lkICkKK3sKKyAgICBTWVNURU1fSU5GTyBpbmZvOworICAgIGttcF9zdHJfYnVmX3QgcGF0aDsKKyAgICBVSU5UIHBhdGhfc2l6ZTsKKworICAgIGlmICggX19rbXBfaW5pdF9ydW50aW1lICkgeworICAgICAgICByZXR1cm47CisgICAgfTsKKworI2lmIEtNUF9EWU5BTUlDX0xJQgorICAgIC8qIFBpbiBkeW5hbWljIGxpYnJhcnkgZm9yIHRoZSBsaWZldGltZSBvZiBhcHBsaWNhdGlvbiAqLworICAgIHsKKyAgICAgICAgLy8gRmlyc3QsIHR1cm4gb2ZmIGVycm9yIG1lc3NhZ2UgYm94ZXMKKyAgICAgICAgVUlOVCBlcnJfbW9kZSA9IFNldEVycm9yTW9kZSAoU0VNX0ZBSUxDUklUSUNBTEVSUk9SUyk7CisgICAgICAgIEhNT0RVTEUgaDsKKyAgICAgICAgQk9PTCByZXQgPSBHZXRNb2R1bGVIYW5kbGVFeCggR0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19GUk9NX0FERFJFU1MKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB8R0VUX01PRFVMRV9IQU5ETEVfRVhfRkxBR19QSU4sCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKExQQ1RTVFIpJl9fa21wX3NlcmlhbF9pbml0aWFsaXplLCAmaCk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQyKGggJiYgcmV0LCAiT3Blbk1QIFJUTCBjYW5ub3QgZmluZCBpdHNlbGYgbG9hZGVkIik7CisgICAgICAgIFNldEVycm9yTW9kZSAoZXJyX21vZGUpOyAgIC8vIFJlc3RvcmUgZXJyb3IgbW9kZQorICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBkeW5hbWljIGxpYnJhcnkgcGlubmVkXG4iKSApOworICAgIH0KKyNlbmRpZgorCisgICAgSW5pdGlhbGl6ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7CisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoICYgX19rbXBfd2luMzJfc2VjdGlvbiwgIkNyaXRpY2FsIFNlY3Rpb24iICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIF9fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soKTsKKworICAgICNpZiAoS01QX0FSQ0hfWDg2IHx8IEtNUF9BUkNIX1g4Nl82NCkKKyAgICAgICAgaWYgKCAhIF9fa21wX2NwdWluZm8uaW5pdGlhbGl6ZWQgKSB7CisgICAgICAgICAgICBfX2ttcF9xdWVyeV9jcHVpZCggJiBfX2ttcF9jcHVpbmZvICk7CisgICAgICAgIH07IC8vIGlmCisgICAgI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIC8qIFNldCB1cCBtaW5pbXVtIG51bWJlciBvZiB0aHJlYWRzIHRvIHN3aXRjaCB0byBUTFMgZ3RpZCAqLworICAgICNpZiBLTVBfT1NfV0lORE9XUyAmJiAhIGRlZmluZWQgS01QX0RZTkFNSUNfTElCCisgICAgICAgIC8vIFdpbmRvd3MqIE9TLCBzdGF0aWMgbGlicmFyeS4KKyAgICAgICAgLyoKKyAgICAgICAgICAgIE5ldyB0aHJlYWQgbWF5IHVzZSBzdGFjayBzcGFjZSBwcmV2aW91c2x5IHVzZWQgYnkgYW5vdGhlciB0aHJlYWQsIGN1cnJlbnRseSB0ZXJtaW5hdGVkLgorICAgICAgICAgICAgT24gV2luZG93cyogT1MsIGluIGNhc2Ugb2Ygc3RhdGljIGxpbmtpbmcsIHdlIGRvIG5vdCBrbm93IHRoZSBtb21lbnQgb2YgdGhyZWFkIHRlcm1pbmF0aW9uLAorICAgICAgICAgICAgYW5kIG91ciBzdHJ1Y3R1cmVzIChfX2ttcF90aHJlYWRzIGFuZCBfX2ttcF9yb290IGFycmF5cykgYXJlIHN0aWxsIGtlZXAgaW5mbyBhYm91dCBkZWFkCisgICAgICAgICAgICB0aHJlYWRzLiBUaGlzIGxlYWRzIHRvIHByb2JsZW0gaW4gX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKSBmdW5jdGlvbjogaXQgd3JvbmdseQorICAgICAgICAgICAgZmluZHMgZ3RpZCAoYnkgc2VhcmNoaW5nIHRocm91Z2ggc3RhY2sgYWRkcmVzc2VzIG9mIGFsbCBrbm93biB0aHJlYWRzKSBmb3IgdW5yZWdpc3RlcmVkCisgICAgICAgICAgICBmb3JlaWduIHRyZWFkLgorCisgICAgICAgICAgICBTZXR0aW5nIF9fa21wX3Rsc19ndGlkX21pbiB0byAwIHdvcmthcm91bmRzIHRoaXMgcHJvYmxlbTogX19rbXBfZ2V0X2dsb2JhbF90aHJlYWRfaWQoKQorICAgICAgICAgICAgZG9lcyBub3Qgc2VhcmNoIHRocm91Z2ggc3RhY2tzLCBidXQgZ2V0IGd0aWQgZnJvbSBUTFMgaW1tZWRpYXRlbHkuCisKKyAgICAgICAgICAgIC0tbG4KKyAgICAgICAgKi8KKyAgICAgICAgX19rbXBfdGxzX2d0aWRfbWluID0gMDsKKyAgICAjZWxzZQorICAgICAgICBfX2ttcF90bHNfZ3RpZF9taW4gPSBLTVBfVExTX0dUSURfTUlOOworICAgICNlbmRpZgorCisgICAgLyogZm9yIHRoZSBzdGF0aWMgbGlicmFyeSAqLworICAgIGlmICggIV9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgKSB7CisgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSBUbHNBbGxvYygpOworICAgICAgICBpZiggX19rbXBfZ3RpZF90aHJlYWRwcml2YXRlX2tleSA9PSBUTFNfT1VUX09GX0lOREVYRVMgKSB7CisgICAgICAgICAgICBLTVBfRkFUQUwoIFRMU091dE9mSW5kZXhlcyApOworICAgICAgICB9CisgICAgfQorCisKKyAgICAvLworICAgIC8vIExvYWQgbnRkbGwuZGxsLgorICAgIC8vCisgICAgLyoKKyAgICAgICAgU2ltcGxlCisgICAgICAgICAgICBHZXRNb2R1bGVIYW5kbGUoICJudGRsbC5kbCIgKQorICAgICAgICBpcyBub3Qgc3VpdGFibGUgZHVlIHRvIHNlY3VyaXR5IGlzc3VlIChzZWUKKyAgICAgICAgaHR0cDovL3d3dy5taWNyb3NvZnQuY29tL3RlY2huZXQvc2VjdXJpdHkvYWR2aXNvcnkvMjI2OTYzNy5tc3B4KS4gV2UgaGF2ZSB0byBzcGVjaWZ5IGZ1bGwKKyAgICAgICAgcGF0aCB0byB0aGUgbGlicmFyeS4KKyAgICAqLworICAgIF9fa21wX3N0cl9idWZfaW5pdCggJiBwYXRoICk7CisgICAgcGF0aF9zaXplID0gR2V0U3lzdGVtRGlyZWN0b3J5KCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgS01QX0RFQlVHX0FTU0VSVCggcGF0aF9zaXplID4gMCApOworICAgIGlmICggcGF0aF9zaXplID49IHBhdGguc2l6ZSApIHsKKyAgICAgICAgLy8KKyAgICAgICAgLy8gQnVmZmVyIGlzIHRvbyBzaG9ydC4gIEV4cGFuZCB0aGUgYnVmZmVyIGFuZCB0cnkgYWdhaW4uCisgICAgICAgIC8vCisgICAgICAgIF9fa21wX3N0cl9idWZfcmVzZXJ2ZSggJiBwYXRoLCBwYXRoX3NpemUgKTsKKyAgICAgICAgcGF0aF9zaXplID0gR2V0U3lzdGVtRGlyZWN0b3J5KCBwYXRoLnN0ciwgcGF0aC5zaXplICk7CisgICAgICAgIEtNUF9ERUJVR19BU1NFUlQoIHBhdGhfc2l6ZSA+IDAgKTsKKyAgICB9OyAvLyBpZgorICAgIGlmICggcGF0aF9zaXplID4gMCAmJiBwYXRoX3NpemUgPCBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIE5vdyB3ZSBoYXZlIHN5c3RlbSBkaXJlY3RvcnkgbmFtZSBpbiB0aGUgYnVmZmVyLgorICAgICAgICAvLyBBcHBlbmQgYmFja3NsYXNoIGFuZCBuYW1lIG9mIGRsbCB0byBmb3JtIGZ1bGwgcGF0aCwKKyAgICAgICAgLy8KKyAgICAgICAgcGF0aC51c2VkID0gcGF0aF9zaXplOworICAgICAgICBfX2ttcF9zdHJfYnVmX3ByaW50KCAmIHBhdGgsICJcXCVzIiwgIm50ZGxsLmRsbCIgKTsKKworICAgICAgICAvLworICAgICAgICAvLyBOb3cgbG9hZCBudGRsbCB1c2luZyBmdWxsIHBhdGguCisgICAgICAgIC8vCisgICAgICAgIG50ZGxsID0gR2V0TW9kdWxlSGFuZGxlKCBwYXRoLnN0ciApOworICAgIH0KKworICAgIEtNUF9ERUJVR19BU1NFUlQoIG50ZGxsICE9IE5VTEwgKTsKKyAgICBpZiAoIG50ZGxsICE9IE5VTEwgKSB7CisgICAgICAgIE50UXVlcnlTeXN0ZW1JbmZvcm1hdGlvbiA9IChOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb25fdCkgR2V0UHJvY0FkZHJlc3MoIG50ZGxsLCAiTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uIiApOworICAgIH0KKyAgICBLTVBfREVCVUdfQVNTRVJUKCBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24gIT0gTlVMTCApOworCisjaWYgS01QX0dST1VQX0FGRklOSVRZCisgICAgLy8KKyAgICAvLyBMb2FkIGtlcm5lbDMyLmRsbC4KKyAgICAvLyBTYW1lIGNhdmVhdCAtIG11c3QgdXNlIGZ1bGwgc3lzdGVtIHBhdGggbmFtZS4KKyAgICAvLworICAgIGlmICggcGF0aF9zaXplID4gMCAmJiBwYXRoX3NpemUgPCBwYXRoLnNpemUgKSB7CisgICAgICAgIC8vCisgICAgICAgIC8vIFRydW5jYXRlIHRoZSBidWZmZXIgYmFjayB0byBqdXN0IHRoZSBzeXN0ZW0gcGF0aCBsZW5ndGgsCisgICAgICAgIC8vIGRpc2NhcmRpbmcgIlxcbnRkbGwuZGxsIiwgYW5kIHJlcGxhY2luZyBpdCB3aXRoICJrZXJuZWwzMi5kbGwiLgorICAgICAgICAvLworICAgICAgICBwYXRoLnVzZWQgPSBwYXRoX3NpemU7CisgICAgICAgIF9fa21wX3N0cl9idWZfcHJpbnQoICYgcGF0aCwgIlxcJXMiLCAia2VybmVsMzIuZGxsIiApOworCisgICAgICAgIC8vCisgICAgICAgIC8vIExvYWQga2VybmVsMzIuZGxsIHVzaW5nIGZ1bGwgcGF0aC4KKyAgICAgICAgLy8KKyAgICAgICAga2VybmVsMzIgPSBHZXRNb2R1bGVIYW5kbGUoIHBhdGguc3RyICk7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IGtlcm5lbDMyLmRsbCA9ICVzXG4iLCBwYXRoLnN0ciApICk7CisKKyAgICAgICAgLy8KKyAgICAgICAgLy8gTG9hZCB0aGUgZnVuY3Rpb24gcG9pbnRlcnMgdG8ga2VybmVsMzIuZGxsIHJvdXRpbmVzCisgICAgICAgIC8vIHRoYXQgbWF5IG9yIG1heSBub3QgZXhpc3Qgb24gdGhpcyBzeXN0ZW0uCisgICAgICAgIC8vCisgICAgICAgIGlmICgga2VybmVsMzIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ID0gKGttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudF90KSBHZXRQcm9jQWRkcmVzcygga2VybmVsMzIsICJHZXRBY3RpdmVQcm9jZXNzb3JDb3VudCIgKTsKKyAgICAgICAgICAgIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgPSAoa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnRfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCIgKTsKKyAgICAgICAgICAgIF9fa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAoa21wX0dldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiR2V0VGhyZWFkR3JvdXBBZmZpbml0eSIgKTsKKyAgICAgICAgICAgIF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAoa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHlfdCkgR2V0UHJvY0FkZHJlc3MoIGtlcm5lbDMyLCAiU2V0VGhyZWFkR3JvdXBBZmZpbml0eSIgKTsKKworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgPSAlcFxuIiwgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQgKSApOworICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9ICVwXG4iLCBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JHcm91cENvdW50ICkgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6X19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9ICVwXG4iLCBfX2ttcF9HZXRUaHJlYWRHcm91cEFmZmluaXR5ICkgKTsKKyAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IF9fa21wX1NldFRocmVhZEdyb3VwQWZmaW5pdHkgPSAlcFxuIiwgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSApICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiBzaXplb2Yoa21wX2FmZmluX21hc2tfdCkgPSAlZFxuIiwgc2l6ZW9mKGttcF9hZmZpbl9tYXNrX3QpICkgKTsKKworICAgICAgICAgICAgLy8KKyAgICAgICAgICAgIC8vIFNlZSBpZiBncm91cCBhZmZpbml0eSBpcyBzdXBwb3J0ZWQgb24gdGhpcyBzeXN0ZW0uCisgICAgICAgICAgICAvLyBJZiBzbywgY2FsY3VsYXRlIHRoZSAjZ3JvdXBzIGFuZCAjcHJvY3MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgLy8gR3JvdXAgYWZmaW5pdHkgd2FzIGludHJvZHVjZWQgd2l0aCBXaW5kb3dzKiA3IE9TIGFuZAorICAgICAgICAgICAgLy8gV2luZG93cyogU2VydmVyIDIwMDggUjIgT1MuCisgICAgICAgICAgICAvLworICAgICAgICAgICAgaWYgKCAoIF9fa21wX0dldEFjdGl2ZVByb2Nlc3NvckNvdW50ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoIF9fa21wX0dldEFjdGl2ZVByb2Nlc3Nvckdyb3VwQ291bnQgIT0gTlVMTCApCisgICAgICAgICAgICAgICYmICggX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSAhPSBOVUxMICkKKyAgICAgICAgICAgICAgJiYgKCBfX2ttcF9TZXRUaHJlYWRHcm91cEFmZmluaXR5ICE9IE5VTEwgKQorICAgICAgICAgICAgICAmJiAoICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzCisgICAgICAgICAgICAgID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCgpICkgPiAxICkgKSB7CisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICAvLyBDYWxjdWxhdGUgdGhlIHRvdGFsIG51bWJlciBvZiBhY3RpdmUgT1MgcHJvY3MuCisgICAgICAgICAgICAgICAgLy8KKyAgICAgICAgICAgICAgICBpbnQgaTsKKworICAgICAgICAgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6ICVkIHByb2Nlc3NvciBncm91cHMgZGV0ZWN0ZWRcbiIsIF9fa21wX251bV9wcm9jX2dyb3VwcyApICk7CisKKyAgICAgICAgICAgICAgICBfX2ttcF94cHJvYyA9IDA7CisKKyAgICAgICAgICAgICAgICBmb3IgKCBpID0gMDsgaSA8IF9fa21wX251bV9wcm9jX2dyb3VwczsgaSsrICkgeworICAgICAgICAgICAgICAgICAgICBEV09SRCBzaXplID0gX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yQ291bnQoIGkgKTsKKyAgICAgICAgICAgICAgICAgICAgX19rbXBfeHByb2MgKz0gc2l6ZTsKKyAgICAgICAgICAgICAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX3J1bnRpbWVfaW5pdGlhbGl6ZTogcHJvYyBncm91cCAlZCBzaXplID0gJWRcbiIsIGksIHNpemUgKSApOworICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICBlbHNlIHsKKyAgICAgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcnVudGltZV9pbml0aWFsaXplOiAlZCBwcm9jZXNzb3IgZ3JvdXBzIGRldGVjdGVkXG4iLCBfX2ttcF9udW1fcHJvY19ncm91cHMgKSApOworICAgICAgICAgICAgfQorICAgICAgICB9CisgICAgfQorICAgIGlmICggX19rbXBfbnVtX3Byb2NfZ3JvdXBzIDw9IDEgKSB7CisgICAgICAgIEdldFN5c3RlbUluZm8oICYgaW5mbyApOworICAgICAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisgICAgfQorI2Vsc2UKKyAgICBHZXRTeXN0ZW1JbmZvKCAmIGluZm8gKTsKKyAgICBfX2ttcF94cHJvYyA9IGluZm8uZHdOdW1iZXJPZlByb2Nlc3NvcnM7CisjZW5kaWYgLyogS01QX0dST1VQX0FGRklOSVRZICovCisKKyAgICAvLworICAgIC8vIElmIHRoZSBPUyBzYWlkIHRoZXJlIHdlcmUgMCBwcm9jcywgdGFrZSBhIGd1ZXNzIGFuZCB1c2UgYSB2YWx1ZSBvZiAyLgorICAgIC8vIFRoaXMgaXMgZG9uZSBmb3IgTGludXgqIE9TLCBhbHNvLiAgRG8gd2UgbmVlZCBlcnJvciAvIHdhcm5pbmc/CisgICAgLy8KKyAgICBpZiAoIF9fa21wX3hwcm9jIDw9IDAgKSB7CisgICAgICAgIF9fa21wX3hwcm9jID0gMjsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggNSwgKCJfX2ttcF9ydW50aW1lX2luaXRpYWxpemU6IHRvdGFsIHByb2Nlc3NvcnMgPSAlZFxuIiwgX19rbXBfeHByb2MpICk7CisKKyAgICBfX2ttcF9zdHJfYnVmX2ZyZWUoICYgcGF0aCApOworCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9pbml0aWFsaXplKCk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgX19rbXBfaW5pdF9ydW50aW1lID0gVFJVRTsKK30gLy8gX19rbXBfcnVudGltZV9pbml0aWFsaXplCisKK3ZvaWQKK19fa21wX3J1bnRpbWVfZGVzdHJveSggdm9pZCApCit7CisgICAgaWYgKCAhIF9fa21wX2luaXRfcnVudGltZSApIHsKKyAgICAgICAgcmV0dXJuOworICAgIH0KKworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICBfX2ttcF9pdHRfZGVzdHJveSgpOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIC8qIHdlIGNhbid0IERlbGV0ZUNyaXRpY2Fsc2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7ICovCisgICAgLyogZHVlIHRvIHRoZSBLWF9UUkFDRSgpIGNvbW1hbmRzICovCisgICAgS0FfVFJBQ0UoIDQwLCAoIl9fa21wX3J1bnRpbWVfZGVzdHJveVxuIiApKTsKKworICAgIGlmKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICkgeworICAgICAgICBUbHNGcmVlKCBfX2ttcF9ndGlkX3RocmVhZHByaXZhdGVfa2V5ICk7CisgICAgICAgIF9fa21wX2d0aWRfdGhyZWFkcHJpdmF0ZV9rZXkgPSAwOworICAgIH0KKworICAgIF9fa21wX2FmZmluaXR5X3VuaW5pdGlhbGl6ZSgpOworICAgIERlbGV0ZUNyaXRpY2FsU2VjdGlvbiggJiBfX2ttcF93aW4zMl9zZWN0aW9uICk7CisKKyAgICBudGRsbCA9IE5VTEw7CisgICAgTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID0gTlVMTDsKKworI2lmIEtNUF9BUkNIX1g4Nl82NAorICAgIGtlcm5lbDMyID0gTlVMTDsKKyAgICBfX2ttcF9HZXRBY3RpdmVQcm9jZXNzb3JDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0QWN0aXZlUHJvY2Vzc29yR3JvdXBDb3VudCA9IE5VTEw7CisgICAgX19rbXBfR2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisgICAgX19rbXBfU2V0VGhyZWFkR3JvdXBBZmZpbml0eSA9IE5VTEw7CisjZW5kaWYgLy8gS01QX0FSQ0hfWDg2XzY0CisKKyAgICBfX2ttcF9pbml0X3J1bnRpbWUgPSBGQUxTRTsKK30KKworCit2b2lkCitfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBpbnQgZ3RpZCApCit7CisgICAga21wX2luZm9fdCAgKnRoID0gX19rbXBfdGhyZWFkc1sgZ3RpZCBdOworCisgICAgaWYoICF0aCApIHJldHVybjsKKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF90ZXJtaW5hdGVfdGhyZWFkOiBraWxsICglZClcbiIsIGd0aWQgKSApOworCisgICAgaWYgKFRlcm1pbmF0ZVRocmVhZCggdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkLCAoRFdPUkQpIC0xKSA9PSBGQUxTRSkgeworICAgICAgICAvKiBJdCdzIE9LLCB0aGUgdGhyZWFkIG1heSBoYXZlIGV4aXRlZCBhbHJlYWR5ICovCisgICAgfQorICAgIF9fa21wX2ZyZWVfaGFuZGxlKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKwordm9pZAorX19rbXBfY2xlYXJfc3lzdGVtX3RpbWUoIHZvaWQgKQoreworICAgIEJPT0wgc3RhdHVzOworICAgIExBUkdFX0lOVEVHRVIgdGltZTsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiB0aW1lICk7CisgICAgX19rbXBfd2luMzJfdGltZSA9IChrbXBfaW50NjQpIHRpbWUuUXVhZFBhcnQ7Cit9CisKK3ZvaWQKK19fa21wX2luaXRpYWxpemVfc3lzdGVtX3RpY2soIHZvaWQgKQoreworICAgIHsKKyAgQk9PTCBzdGF0dXM7CisgIExBUkdFX0lOVEVHRVIgZnJlcTsKKworICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCAmIGZyZXEgKTsKKyAgaWYgKCEgc3RhdHVzKSB7CisgICAgICAgIERXT1JEIGVycm9yID0gR2V0TGFzdEVycm9yKCk7CisgICAgICAgIF9fa21wX21zZygKKyAgICAgICAgICAgIGttcF9tc19mYXRhbCwKKyAgICAgICAgICAgIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJRdWVyeVBlcmZvcm1hbmNlRnJlcXVlbmN5KCkiICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKworICB9CisgIGVsc2UgeworICAgICAgX19rbXBfd2luMzJfdGljayA9ICgoZG91YmxlKSAxLjApIC8gKGRvdWJsZSkgZnJlcS5RdWFkUGFydDsKKyAgfQorICAgIH0KK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGltZSBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZCggZG91YmxlICp0ICkKK3sKKyAgICBCT09MIHN0YXR1czsKKyAgICBMQVJHRV9JTlRFR0VSIG5vdzsKKyAgICBzdGF0dXMgPSBRdWVyeVBlcmZvcm1hbmNlQ291bnRlciggJiBub3cgKTsKKyAgICAqdCA9ICgoZG91YmxlKSBub3cuUXVhZFBhcnQpICogX19rbXBfd2luMzJfdGljazsKK30KKworLyogQ2FsY3VsYXRlIHRoZSBlbGFwc2VkIHdhbGwgY2xvY2sgdGljayBmb3IgdGhlIHVzZXIgKi8KKwordm9pZAorX19rbXBfZWxhcHNlZF90aWNrKCBkb3VibGUgKnQgKQoreworICAgICp0ID0gX19rbXBfd2luMzJfdGljazsKK30KKwordm9pZAorX19rbXBfcmVhZF9zeXN0ZW1fdGltZSggZG91YmxlICpkZWx0YSApCit7CisgICAgaWYgKGRlbHRhICE9IE5VTEwpIHsKKyAgICAgICAgQk9PTCBzdGF0dXM7CisgICAgICAgIExBUkdFX0lOVEVHRVIgbm93OworCisgICAgICAgIHN0YXR1cyA9IFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKCAmIG5vdyApOworCisgICAgICAgICpkZWx0YSA9ICgoZG91YmxlKSAoKChrbXBfaW50NjQpIG5vdy5RdWFkUGFydCkgLSBfX2ttcF93aW4zMl90aW1lKSkKKyAgICAqIF9fa21wX3dpbjMyX3RpY2s7CisgICAgfQorfQorCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKy8qIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSAqLworCit2b2lkICogX19zdGRjYWxsCitfX2ttcF9sYXVuY2hfd29ya2VyKCB2b2lkICphcmcgKQoreworICAgIHZvbGF0aWxlIHZvaWQgKnN0YWNrX2RhdGE7CisgICAgdm9pZCAqZXhpdF92YWw7CisgICAgdm9pZCAqcGFkZGluZyA9IDA7CisgICAga21wX2luZm9fdCAqdGhpc190aHIgPSAoa21wX2luZm9fdCAqKSBhcmc7CisgICAgaW50IGd0aWQ7CisKKyAgICBndGlkID0gdGhpc190aHItPnRoLnRoX2luZm8uZHMuZHNfZ3RpZDsKKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggZ3RpZCApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gZ3RpZDsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfbmFtZSggZ3RpZCApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKworICAgIF9fa21wX2FmZmluaXR5X3NldF9pbml0X21hc2soIGd0aWQsIEZBTFNFICk7CisKKyNpZiBLTVBfQVJDSF9YODYgfHwgS01QX0FSQ0hfWDg2XzY0CisgICAgLy8KKyAgICAvLyBTZXQgdGhlIEZQIGNvbnRyb2wgcmVncyB0byBiZSBhIGNvcHkgb2YKKyAgICAvLyB0aGUgcGFyYWxsZWwgaW5pdGlhbGl6YXRpb24gdGhyZWFkJ3MuCisgICAgLy8KKyAgICBfX2ttcF9jbGVhcl94ODdfZnB1X3N0YXR1c193b3JkKCk7CisgICAgX19rbXBfbG9hZF94ODdfZnB1X2NvbnRyb2xfd29yZCggJl9fa21wX2luaXRfeDg3X2ZwdV9jb250cm9sX3dvcmQgKTsKKyAgICBfX2ttcF9sb2FkX214Y3NyKCAmX19rbXBfaW5pdF9teGNzciApOworI2VuZGlmIC8qIEtNUF9BUkNIX1g4NiB8fCBLTVBfQVJDSF9YODZfNjQgKi8KKworICAgIGlmICggX19rbXBfc3Rrb2Zmc2V0ID4gMCAmJiBndGlkID4gMCApIHsKKyAgICAgICAgcGFkZGluZyA9IEtNUF9BTExPQ0EoIGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQgKTsKKyAgICB9CisKKyAgICBLTVBfRlNZTkNfUkVMRUFTSU5HKCAmdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSApOworICAgIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIFRSVUUgKTsKKworICAgIGlmICggVENSXzQoX19rbXBfZ3RpZF9tb2RlKSA8IDIgKSB7IC8vIGNoZWNrIHN0YWNrIG9ubHkgaWYgaXQgaXMgdXNlZCB0byBnZXQgZ3RpZAorICAgICAgICBUQ1dfUFRSKHRoaXNfdGhyLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrYmFzZSwgJnN0YWNrX2RhdGEpOworICAgICAgICBLTVBfQVNTRVJUKCB0aGlzX3RociAtPiB0aC50aF9pbmZvLmRzLmRzX3N0YWNrZ3JvdyA9PSBGQUxTRSApOworICAgICAgICBfX2ttcF9jaGVja19zdGFja19vdmVybGFwKCB0aGlzX3RociApOworICAgIH0KKyAgICBLTVBfTUIoKTsKKyAgICBleGl0X3ZhbCA9IF9fa21wX2xhdW5jaF90aHJlYWQoIHRoaXNfdGhyICk7CisgICAgS01QX0ZTWU5DX1JFTEVBU0lORyggJnRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUgKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgRkFMU0UgKTsKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gZXhpdF92YWw7Cit9CisKKy8qIFRoZSBtb25pdG9yIHRocmVhZCBjb250cm9scyBhbGwgb2YgdGhlIHRocmVhZHMgaW4gdGhlIGNvbXBsZXggKi8KKwordm9pZCAqIF9fc3RkY2FsbAorX19rbXBfbGF1bmNoX21vbml0b3IoIHZvaWQgKmFyZyApCit7CisgICAgRFdPUkQgICAgICAgIHdhaXRfc3RhdHVzOworICAgIGttcF90aHJlYWRfdCBtb25pdG9yOworICAgIGludCAgICAgICAgICBzdGF0dXM7CisgICAgaW50ICAgICAgICAgIGludGVydmFsOworICAgIGttcF9pbmZvX3QgKnRoaXNfdGhyID0gKGttcF9pbmZvX3QgKikgYXJnOworCisgICAgS01QX0RFQlVHX0FTU0VSVChfX2ttcF9pbml0X21vbml0b3IpOworICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDIgKTsgICAgLy8gQUM6IFNpZ25hbCB0aGUgbGlicmFyeSB0aGF0IG1vbml0b3IgaGFzIHN0YXJ0ZWQKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIC8vIFRPRE86IGhpZGUgIjIiIGluIGVudW0gKGxpa2Uge3RydWUsZmFsc2Usc3RhcnRlZH0pCisgICAgdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSBHZXRDdXJyZW50VGhyZWFkSWQoKTsKKyAgICBUQ1dfNCggdGhpc190aHIgLT4gdGgudGhfaW5mby5kcy5kc19hbGl2ZSwgVFJVRSApOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiBsYXVuY2hlZFxuIiApICk7CisKKyAgICBtb25pdG9yID0gR2V0Q3VycmVudFRocmVhZCgpOworCisgICAgLyogc2V0IHRocmVhZCBwcmlvcml0eSAqLworICAgIHN0YXR1cyA9IFNldFRocmVhZFByaW9yaXR5KCBtb25pdG9yLCBUSFJFQURfUFJJT1JJVFlfSElHSEVTVCApOworICAgIGlmICghIHN0YXR1cykgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50U2V0VGhyZWFkUHJpb3JpdHkgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KKworICAgIC8qIHJlZ2lzdGVyIHVzIGFzIG1vbml0b3IgKi8KKyAgICBfX2ttcF9ndGlkX3NldF9zcGVjaWZpYyggS01QX0dUSURfTU9OSVRPUiApOworI2lmZGVmIEtNUF9UREFUQV9HVElECisgICAgI2Vycm9yICJUaGlzIGRlZmluZSBjYXVzZXMgcHJvYmxlbXMgd2l0aCBMb2FkTGlicmFyeSgpICsgZGVjbHNwZWModGhyZWFkKSAiIFwKKyAgICAgICAgIm9uIFdpbmRvd3MqIE9TLiAgU2VlIENRNTA1NjQsIHRlc3RzIGttcF9sb2FkX2xpYnJhcnkqLmMgYW5kIHRoaXMgTVNETiAiIFwKKyAgICAgICAgInJlZmVyZW5jZTogaHR0cDovL3N1cHBvcnQubWljcm9zb2Z0LmNvbS9rYi8xMTg4MTYiCisgICAgLy9fX2ttcF9ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKyNlbmRpZgorCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF90aHJlYWRfaWdub3JlKCk7ICAgIC8vIEluc3RydWN0IEludGVsKFIpIFRocmVhZGluZyBUb29scyB0byBpZ25vcmUgbW9uaXRvciB0aHJlYWQuCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBpbnRlcnZhbCA9ICggMTAwMCAvIF9fa21wX21vbml0b3Jfd2FrZXVwcyApOyAvKiBpbiBtaWxsaXNlY29uZHMgKi8KKworICAgIHdoaWxlICghIFRDUl80KF9fa21wX2dsb2JhbC5nLmdfZG9uZSkpIHsKKyAgICAgICAgLyogIFRoaXMgdGhyZWFkIG1vbml0b3JzIHRoZSBzdGF0ZSBvZiB0aGUgc3lzdGVtICovCisKKyAgICAgICAgS0FfVFJBQ0UoIDE1LCAoICJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdXBkYXRlXG4iICkgKTsKKworICAgICAgICB3YWl0X3N0YXR1cyA9IFdhaXRGb3JTaW5nbGVPYmplY3QoIF9fa21wX21vbml0b3JfZXYsIGludGVydmFsICk7CisKKyAgICAgICAgaWYgKHdhaXRfc3RhdHVzID09IFdBSVRfVElNRU9VVCkgeworICAgICAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLAorICAgICAgICAgICAgICBUQ1JfNCggX19rbXBfZ2xvYmFsLmcuZ190aW1lLmR0LnRfdmFsdWUgKSArIDEgKTsKKyAgICAgICAgfQorCisgICAgICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworICAgIH0KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogZmluaXNoZWRcbiIgKSApOworCisgICAgc3RhdHVzID0gU2V0VGhyZWFkUHJpb3JpdHkoIG1vbml0b3IsIFRIUkVBRF9QUklPUklUWV9OT1JNQUwgKTsKKyAgICBpZiAoISBzdGF0dXMpIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldFRocmVhZFByaW9yaXR5ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisKKyAgICBpZiAoX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCAhPSAwKSB7CisgICAgICAgIC8qIG5vdyB3ZSBuZWVkIHRvIHRlcm1pbmF0ZSB0aGUgd29ya2VyIHRocmVhZHMgICAqLworICAgICAgICAvKiB0aGUgdmFsdWUgb2YgdF9hYm9ydCBpcyB0aGUgc2lnbmFsIHdlIGNhdWdodCAqLworCisgICAgICAgIGludCBndGlkOworCisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9sYXVuY2hfbW9uaXRvcjogdGVybWluYXRlIHNpZz0lZFxuIiwgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQpICkgKTsKKworICAgICAgICAvKiB0ZXJtaW5hdGUgdGhlIE9wZW5NUCB3b3JrZXIgdGhyZWFkcyAqLworICAgICAgICAvKiBUT0RPIHRoaXMgaXMgbm90IHZhbGlkIGZvciBzaWJsaW5nIHRocmVhZHMhIQorICAgICAgICAgKiB0aGUgdWJlciBtYXN0ZXIgbWlnaHQgbm90IGJlIDAgYW55bW9yZS4uICovCisgICAgICAgIGZvciAoZ3RpZCA9IDE7IGd0aWQgPCBfX2ttcF90aHJlYWRzX2NhcGFjaXR5OyArK2d0aWQpCisgICAgICAgICAgICBfX2ttcF90ZXJtaW5hdGVfdGhyZWFkKCBndGlkICk7CisKKyAgICAgICAgX19rbXBfY2xlYW51cCgpOworCisgICAgICAgIFNsZWVwKCAwICk7CisKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2xhdW5jaF9tb25pdG9yOiByYWlzZSBzaWc9JWRcbiIsIChfX2ttcF9nbG9iYWwuZy5nX2Fib3J0KSApICk7CisKKyAgICAgICAgaWYgKF9fa21wX2dsb2JhbC5nLmdfYWJvcnQgPiAwKSB7CisgICAgICAgICAgICByYWlzZSggX19rbXBfZ2xvYmFsLmcuZ19hYm9ydCApOworICAgICAgICB9CisgICAgfQorCisgICAgVENXXzQoIHRoaXNfdGhyIC0+IHRoLnRoX2luZm8uZHMuZHNfYWxpdmUsIEZBTFNFICk7CisKKyAgICBLTVBfTUIoKTsKKyAgICByZXR1cm4gYXJnOworfQorCit2b2lkCitfX2ttcF9jcmVhdGVfd29ya2VyKCBpbnQgZ3RpZCwga21wX2luZm9fdCAqdGgsIHNpemVfdCBzdGFja19zaXplICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICBoYW5kbGU7CisgICAgRFdPUkQgICAgICAgICAgaWRUaHJlYWQ7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX3dvcmtlcjogdHJ5IHRvIGNyZWF0ZSB0aHJlYWQgKCVkKVxuIiwgZ3RpZCApICk7CisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gZ3RpZDsKKworICAgIGlmICggS01QX1VCRVJfR1RJRChndGlkKSApIHsKKyAgICAgICAgaW50ICAgICBzdGFja19kYXRhOworCisgICAgICAgIC8qIFRPRE86IEdldEN1cnJlbnRUaHJlYWQoKSByZXR1cm5zIGEgcHNldWRvLWhhbmRsZSB0aGF0IGlzIHVuc3VpdGFibGUgZm9yIG90aGVyIHRocmVhZHMgdG8gdXNlLgorICAgICAgICAgICBJcyBpdCBhcHByb3ByaWF0ZSB0byBqdXN0IHVzZSBHZXRDdXJyZW50VGhyZWFkPyAgV2hlbiBzaG91bGQgd2UgY2xvc2UgdGhpcyBoYW5kbGU/ICBXaGVuCisgICAgICAgICAgIHVucmVnaXN0ZXJpbmcgdGhlIHJvb3Q/CisgICAgICAgICovCisgICAgICAgIHsKKyAgICAgICAgICAgIEJPT0wgcmM7CisgICAgICAgICAgICByYyA9IER1cGxpY2F0ZUhhbmRsZSgKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEdldEN1cnJlbnRQcm9jZXNzKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50VGhyZWFkKCksCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBHZXRDdXJyZW50UHJvY2VzcygpLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJnRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDAsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBGQUxTRSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIERVUExJQ0FURV9TQU1FX0FDQ0VTUworICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIEtNUF9BU1NFUlQoIHJjICk7CisgICAgICAgICAgICBLQV9UUkFDRSggMTAsICgiIF9fa21wX2NyZWF0ZV93b3JrZXI6IFJPT1QgSGFuZGxlIGR1cGxpY2F0ZWQsIHRoID0gJXAsIGhhbmRsZSA9ICUiIEtNUF9VSU5UUFRSX1NQRUMgIlxuIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpdGgsCisgICAgICAgICAgICAgICAgICAgICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkX2lkID0gR2V0Q3VycmVudFRocmVhZElkKCk7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCBUQ1JfNChfX2ttcF9ndGlkX21vZGUpIDwgMiApIHsgLy8gY2hlY2sgc3RhY2sgb25seSBpZiBpdCBpcyB1c2VkIHRvIGdldCBndGlkCisgICAgICAgICAgICAvKiB3ZSB3aWxsIGR5bmFtaWNhbGx5IHVwZGF0ZSB0aGUgc3RhY2sgcmFuZ2UgaWYgZ3RpZF9tb2RlID09IDEgKi8KKyAgICAgICAgICAgIFRDV19QVFIodGgtPnRoLnRoX2luZm8uZHMuZHNfc3RhY2tiYXNlLCAmc3RhY2tfZGF0YSk7CisgICAgICAgICAgICBUQ1dfUFRSKHRoLT50aC50aF9pbmZvLmRzLmRzX3N0YWNrc2l6ZSwgMCk7CisgICAgICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIFRSVUUpOworICAgICAgICAgICAgX19rbXBfY2hlY2tfc3RhY2tfb3ZlcmxhcCggdGggKTsKKyAgICAgICAgfQorICAgIH0KKyAgICBlbHNlIHsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICAgICAgLyogU2V0IHN0YWNrIHNpemUgZm9yIHRoaXMgdGhyZWFkIG5vdy4gKi8KKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9jcmVhdGVfd29ya2VyOiBzdGFja19zaXplID0gJSIgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzXG4iLCBzdGFja19zaXplICkgKTsKKworICAgICAgICBzdGFja19zaXplICs9IGd0aWQgKiBfX2ttcF9zdGtvZmZzZXQ7CisKKyAgICAgICAgVENXX1BUUih0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja3NpemUsIHN0YWNrX3NpemUpOworICAgICAgICBUQ1dfNCh0aC0+dGgudGhfaW5mby5kcy5kc19zdGFja2dyb3csIEZBTFNFKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChiZWZvcmUpIHN0YWNrX3NpemUgPSAlIgorICAgICAgICAgICAgICAgICAgICAgICAgS01QX1NJWkVfVF9TUEVDCisgICAgICAgICAgICAgICAgICAgICAgICAiIGJ5dGVzLCAmX19rbXBfbGF1bmNoX3dvcmtlciA9ICVwLCB0aCA9ICVwLCAiCisgICAgICAgICAgICAgICAgICAgICAgICAiJmlkVGhyZWFkID0gJXBcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCAmaWRUaHJlYWQgKSApOworCisgICAgICAgIGhhbmRsZSA9IENyZWF0ZVRocmVhZCggTlVMTCwgKFNJWkVfVCkgc3RhY2tfc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBUSFJFQURfU1RBUlRfUk9VVElORSkgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAoTFBWT0lEKSB0aCwgU1RBQ0tfU0laRV9QQVJBTV9JU19BX1JFU0VSVkFUSU9OLCAmaWRUaHJlYWQgKTsKKworICAgICAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX2NyZWF0ZV93b3JrZXI6IChhZnRlcikgc3RhY2tfc2l6ZSA9ICUiCisgICAgICAgICAgICAgICAgICAgICAgICBLTVBfU0laRV9UX1NQRUMKKyAgICAgICAgICAgICAgICAgICAgICAgICIgYnl0ZXMsICZfX2ttcF9sYXVuY2hfd29ya2VyID0gJXAsIHRoID0gJXAsICIKKyAgICAgICAgICAgICAgICAgICAgICAgICJpZFRocmVhZCA9ICV1LCBoYW5kbGUgPSAlIiBLTVBfVUlOVFBUUl9TUEVDICJcbiIsCisgICAgICAgICAgICAgICAgICAgICAgICAoU0laRV9UKSBzdGFja19zaXplLAorICAgICAgICAgICAgICAgICAgICAgICAgKExQVEhSRUFEX1NUQVJUX1JPVVRJTkUpICYgX19rbXBfbGF1bmNoX3dvcmtlciwKKyAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBpZFRocmVhZCwgaGFuZGxlICkgKTsKKworICAgICAgICBpZiAoIGhhbmRsZSA9PSAwICkgeworICAgICAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgICAgIF9fa21wX21zZyhrbXBfbXNfZmF0YWwsIEtNUF9NU0coIENhbnRDcmVhdGVUaHJlYWQgKSwgS01QX0VSUiggZXJyb3IgKSwgX19rbXBfbXNnX251bGwpOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGhyZWFkID0gaGFuZGxlOworICAgICAgICB9CisKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisgICAgfQorCisgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV93b3JrZXI6IGRvbmUgY3JlYXRpbmcgdGhyZWFkICglZClcbiIsIGd0aWQgKSApOworfQorCitpbnQKK19fa21wX3N0aWxsX3J1bm5pbmcoa21wX2luZm9fdCAqdGgpIHsKKyAgICByZXR1cm4gKFdBSVRfVElNRU9VVCA9PSBXYWl0Rm9yU2luZ2xlT2JqZWN0KCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIDApKTsKK30KKwordm9pZAorX19rbXBfY3JlYXRlX21vbml0b3IoIGttcF9pbmZvX3QgKnRoICkKK3sKKyAgICBrbXBfdGhyZWFkX3QgICAgICAgIGhhbmRsZTsKKyAgICBEV09SRCAgICAgICAgICAgICAgIGlkVGhyZWFkOworICAgIGludCAgICAgICAgICAgICAgICAgaWRlYWwsIG5ld19pZGVhbDsKKworICAgIGlmKCBfX2ttcF9kZmx0X2Jsb2NrdGltZSA9PSBLTVBfTUFYX0JMT0NLVElNRSApIHsKKyAgICAgICAgLy8gV2UgZG9uJ3QgbmVlZCBtb25pdG9yIHRocmVhZCBpbiBjYXNlIG9mIE1BWF9CTE9DS1RJTUUKKyAgICAgICAgS0FfVFJBQ0UoIDEwLCAoIl9fa21wX2NyZWF0ZV9tb25pdG9yOiBza2lwcGluZyBtb25pdG9yIHRocmVhZCBiZWNhdXNlIG9mIE1BWCBibG9ja3RpbWVcbiIgKSApOworICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gMDsgLy8gdGhpcyBtYWtlcyByZWFwX21vbml0b3Igbm8tb3AKKyAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCA9IDA7CisgICAgICAgIFRDV180KCBfX2ttcF9pbml0X21vbml0b3IsIDIgKTsgLy8gU2lnbmFsIHRvIHN0b3Agd2FpdGluZyBmb3IgbW9uaXRvciBjcmVhdGlvbgorICAgICAgICByZXR1cm47CisgICAgfQorICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogdHJ5IHRvIGNyZWF0ZSBtb25pdG9yXG4iICkgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgX19rbXBfbW9uaXRvcl9ldiA9IENyZWF0ZUV2ZW50KCBOVUxMLCBUUlVFLCBGQUxTRSwgTlVMTCApOworICAgIGlmICggX19rbXBfbW9uaXRvcl9ldiA9PSBOVUxMICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q3JlYXRlRXZlbnQgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH07IC8vIGlmCisjaWYgVVNFX0lUVF9CVUlMRAorICAgIF9fa21wX2l0dF9zeXN0ZW1fb2JqZWN0X2NyZWF0ZWQoIF9fa21wX21vbml0b3JfZXYsICJFdmVudCIgKTsKKyNlbmRpZiAvKiBVU0VfSVRUX0JVSUxEICovCisKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aWQgID0gS01QX0dUSURfTU9OSVRPUjsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkID0gS01QX0dUSURfTU9OSVRPUjsKKworICAgIC8vIEZJWE1FIC0gb24gV2luZG93cyogT1MsIGlmIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IDAsIGZpZ3VyZSBvdXQgaG93CisgICAgLy8gdG8gYXV0b21hdGljYWxseSBleHBhbmQgc3RhY2tzaXplIGJhc2VkIG9uIENyZWF0ZVRocmVhZCBlcnJvciBjb2RlLgorICAgIGlmICggX19rbXBfbW9uaXRvcl9zdGtzaXplID09IDAgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IEtNUF9ERUZBVUxUX01PTklUT1JfU1RLU0laRTsKKyAgICB9CisgICAgaWYgKCBfX2ttcF9tb25pdG9yX3N0a3NpemUgPCBfX2ttcF9zeXNfbWluX3N0a3NpemUgKSB7CisgICAgICAgIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSA9IF9fa21wX3N5c19taW5fc3Rrc2l6ZTsKKyAgICB9CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfY3JlYXRlX21vbml0b3I6IHJlcXVlc3RlZCBzdGFja3NpemUgPSAlZCBieXRlc1xuIiwKKyAgICAgICAgICAgICAgICAgICAoaW50KSBfX2ttcF9tb25pdG9yX3N0a3NpemUgKSApOworCisgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfdGltZS5kdC50X3ZhbHVlLCAwICk7CisKKyAgICBoYW5kbGUgPSBDcmVhdGVUaHJlYWQoIE5VTEwsIChTSVpFX1QpIF9fa21wX21vbml0b3Jfc3Rrc2l6ZSwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFRIUkVBRF9TVEFSVF9ST1VUSU5FKSBfX2ttcF9sYXVuY2hfbW9uaXRvciwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgIChMUFZPSUQpIHRoLCBTVEFDS19TSVpFX1BBUkFNX0lTX0FfUkVTRVJWQVRJT04sICZpZFRocmVhZCApOworICAgIGlmIChoYW5kbGUgPT0gMCkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q3JlYXRlVGhyZWFkICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgZWxzZQorICAgICAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgPSBoYW5kbGU7CisKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKworICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9jcmVhdGVfbW9uaXRvcjogbW9uaXRvciBjcmVhdGVkICVwXG4iLAorICAgICAgICAgICAgICAgICAgICh2b2lkICopIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCApICk7Cit9CisKKy8qCisgIENoZWNrIHRvIHNlZSBpZiB0aHJlYWQgaXMgc3RpbGwgYWxpdmUuCisKKyAgTk9URTogIFRoZSBFeGl0UHJvY2Vzcyhjb2RlKSBzeXN0ZW0gY2FsbCBjYXVzZXMgYWxsIHRocmVhZHMgdG8gVGVybWluYXRlCisgICAgICAgICB3aXRoIGEgZXhpdF92YWwgPSBjb2RlLiAgQmVjYXVzZSBvZiB0aGlzIHdlIGNhbiBub3QgcmVseSBvbgorICAgICAgICAgZXhpdF92YWwgaGF2aW5nIGFueSBwYXJ0aWN1bGFyIHZhbHVlLiAgU28gdGhpcyByb3V0aW5lIG1heQorICAgICAgICAgcmV0dXJuIFNUSUxMX0FMSVZFIGluIGV4aXRfdmFsIGV2ZW4gYWZ0ZXIgdGhlIHRocmVhZCBpcyBkZWFkLgorKi8KKworaW50CitfX2ttcF9pc190aHJlYWRfYWxpdmUoIGttcF9pbmZvX3QgKiB0aCwgRFdPUkQgKmV4aXRfdmFsICkKK3sKKyAgICBEV09SRCByYzsKKyAgICByYyA9IEdldEV4aXRDb2RlVGhyZWFkKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQsIGV4aXRfdmFsICk7CisgICAgaWYgKCByYyA9PSAwICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiR2V0RXhpdENvZGVUaHJlYWQoKSIgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH07IC8vIGlmCisgICAgcmV0dXJuICggKmV4aXRfdmFsID09IFNUSUxMX0FDVElWRSApOworfQorCisKK3ZvaWQKK19fa21wX2V4aXRfdGhyZWFkKAorICAgIGludCBleGl0X3N0YXR1cworKSB7CisgICAgRXhpdFRocmVhZCggZXhpdF9zdGF0dXMgKTsKK30gLy8gX19rbXBfZXhpdF90aHJlYWQKKworLyoKKyAgICBUaGlzIGlzIGEgY29tbW9uIHBhcnQgZm9yIGJvdGggX19rbXBfcmVhcF93b3JrZXIoKSBhbmQgX19rbXBfcmVhcF9tb25pdG9yKCkuCisqLworc3RhdGljIHZvaWQKK19fa21wX3JlYXBfY29tbW9uKCBrbXBfaW5mb190ICogdGggKQoreworICAgIERXT1JEIGV4aXRfdmFsOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCisKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfY29tbW9uOiB0cnkgdG8gcmVhcCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKworICAgIC8qCisgICAgICAgIDIwMDYtMTAtMTk6CisKKyAgICAgICAgVGhlcmUgYXJlIHR3byBvcHBvc2l0ZSBzaXR1YXRpb25zOgorCisgICAgICAgICAgICAxLiBXaW5kb3dzKiBPUyBrZWVwIHRocmVhZCBhbGl2ZSBhZnRlciBpdCByZXNldHMgZHNfYWxpdmUgZmxhZyBhbmQgZXhpdHMgZnJvbSB0aHJlYWQKKyAgICAgICAgICAgICAgIGZ1bmN0aW9uLiAoRm9yIGV4YW1wbGUsIHNlZSBDNzA3NzAvUTM5NDI4MSAidW5sb2FkaW5nIG9mIGRsbCBiYXNlZCBvbiBPTVAgaXMgdmVyeQorICAgICAgICAgICAgICAgc2xvdyIuKQorICAgICAgICAgICAgMi4gV2luZG93cyogT1MgbWF5IGtpbGwgdGhyZWFkIGJlZm9yZSBpdCByZXNldHMgZHNfYWxpdmUgZmxhZy4KKworICAgICAgICBSaWdodCBzb2x1dGlvbiBzZWVtcyB0byBiZSB3YWl0aW5nIGZvciAqZWl0aGVyKiB0aHJlYWQgdGVybWluYXRpb24gKm9yKiBkc19hbGl2ZSByZXNldHRpbmcuCisKKyAgICAqLworCisgICAgeworICAgICAgICAvLyBUT0RPOiBUaGlzIGNvZGUgaXMgdmVyeSBzaW1pbGFyIHRvIEtNUF9XQUlUX1lJRUxELiBOZWVkIHRvIGdlbmVyYWxpemUgS01QX1dBSVRfWUlFTEQgdG8KKyAgICAgICAgLy8gY292ZXIgdGhpcyB1c2FnZSBhbHNvLgorICAgICAgICB2b2lkICogb2JqID0gTlVMTDsKKyAgICAgICAgcmVnaXN0ZXIga21wX3VpbnQzMiBzcGluczsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIEtNUF9GU1lOQ19TUElOX0lOSVQoIG9iaiwgKHZvaWQqKSAmIHRoLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlICk7CisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgICAgICBLTVBfSU5JVF9ZSUVMRCggc3BpbnMgKTsKKyAgICAgICAgZG8geworI2lmIFVTRV9JVFRfQlVJTEQKKyAgICAgICAgICAgIEtNUF9GU1lOQ19TUElOX1BSRVBBUkUoIG9iaiApOworI2VuZGlmIC8qIFVTRV9JVFRfQlVJTEQgKi8KKyAgICAgICAgICAgIF9fa21wX2lzX3RocmVhZF9hbGl2ZSggdGgsICZleGl0X3ZhbCApOworICAgICAgICAgICAgS01QX1lJRUxEKCBUQ1JfNChfX2ttcF9udGgpID4gX19rbXBfYXZhaWxfcHJvYyApOworICAgICAgICAgICAgS01QX1lJRUxEX1NQSU4oIHNwaW5zICk7CisgICAgICAgIH0gd2hpbGUgKCBleGl0X3ZhbCA9PSBTVElMTF9BQ1RJVkUgJiYgVENSXzQoIHRoLT50aC50aF9pbmZvLmRzLmRzX2FsaXZlICkgKTsKKyNpZiBVU0VfSVRUX0JVSUxECisgICAgICAgIGlmICggZXhpdF92YWwgPT0gU1RJTExfQUNUSVZFICkgeworICAgICAgICAgICAgS01QX0ZTWU5DX0NBTkNFTCggb2JqICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBLTVBfRlNZTkNfU1BJTl9BQ1FVSVJFRCggb2JqICk7CisgICAgICAgIH07IC8vIGlmCisjZW5kaWYgLyogVVNFX0lUVF9CVUlMRCAqLworICAgIH0KKworICAgIF9fa21wX2ZyZWVfaGFuZGxlKCB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKTsKKworICAgIC8qCisgICAgICogTk9URTogIFRoZSBFeGl0UHJvY2Vzcyhjb2RlKSBzeXN0ZW0gY2FsbCBjYXVzZXMgYWxsIHRocmVhZHMgdG8gVGVybWluYXRlCisgICAgICogICAgICAgIHdpdGggYSBleGl0X3ZhbCA9IGNvZGUuICBCZWNhdXNlIG9mIHRoaXMgd2UgY2FuIG5vdCByZWx5IG9uCisgICAgICogICAgICAgIGV4aXRfdmFsIGhhdmluZyBhbnkgcGFydGljdWxhciB2YWx1ZS4KKyAgICAgKi8KKyAgICBpZiAoIGV4aXRfdmFsID09IFNUSUxMX0FDVElWRSApIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEsICggIl9fa21wX3JlYXBfY29tbW9uOiB0aHJlYWQgc3RpbGwgYWN0aXZlLlxuIiApICk7CisgICAgfSBlbHNlIGlmICggKHZvaWQgKikgZXhpdF92YWwgIT0gKHZvaWQgKikgdGgpIHsKKyAgICAgICAgS0FfVFJBQ0UoIDEsICggIl9fa21wX3JlYXBfY29tbW9uOiBFeGl0UHJvY2VzcyAvIFRlcm1pbmF0ZVRocmVhZCB1c2VkP1xuIiApICk7CisgICAgfTsgLy8gaWYKKworICAgIEtBX1RSQUNFKCAxMCwKKyAgICAgICAgKAorICAgICAgICAgICAgIl9fa21wX3JlYXBfY29tbW9uOiBkb25lIHJlYXBpbmcgKCVkKSwgaGFuZGxlID0gJSIgS01QX1VJTlRQVFJfU1BFQyAiXG4iLAorICAgICAgICAgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfZ3RpZCwKKyAgICAgICAgICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZAorICAgICAgICApCisgICAgKTsKKworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX3RocmVhZCAgICA9IDA7CisgICAgdGgtPnRoLnRoX2luZm8uZHMuZHNfdGlkICAgICAgID0gS01QX0dUSURfRE5FOworICAgIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgICAgICA9IEtNUF9HVElEX0RORTsKKyAgICB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWRfaWQgPSAwOworCisgICAgS01QX01CKCk7ICAgICAgIC8qIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4gICovCit9CisKK3ZvaWQKK19fa21wX3JlYXBfbW9uaXRvcigga21wX2luZm9fdCAqdGggKQoreworICAgIGludCBzdGF0dXM7CisKKyAgICBLQV9UUkFDRSggMTAsICgiX19rbXBfcmVhcF9tb25pdG9yOiB0cnkgdG8gcmVhcCAlcFxuIiwKKyAgICAgICAgICAgICAgICAgICAodm9pZCAqKSB0aC0+dGgudGhfaW5mby5kcy5kc190aHJlYWQgKSApOworCisgICAgLy8gSWYgbW9uaXRvciBoYXMgYmVlbiBjcmVhdGVkLCBpdHMgdGlkIGFuZCBndGlkIHNob3VsZCBiZSBLTVBfR1RJRF9NT05JVE9SLgorICAgIC8vIElmIGJvdGggdGlkIGFuZCBndGlkIGFyZSAwLCBpdCBtZWFucyB0aGUgbW9uaXRvciBkaWQgbm90IGV2ZXIgc3RhcnQuCisgICAgLy8gSWYgYm90aCB0aWQgYW5kIGd0aWQgYXJlIEtNUF9HVElEX0RORSwgdGhlIG1vbml0b3IgaGFzIGJlZW4gc2h1dCBkb3duLgorICAgIEtNUF9ERUJVR19BU1NFUlQoIHRoLT50aC50aF9pbmZvLmRzLmRzX3RpZCA9PSB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICk7CisgICAgaWYgKCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICE9IEtNUF9HVElEX01PTklUT1IgKSB7CisgICAgICAgIEtBX1RSQUNFKCAxMCwgKCJfX2ttcF9yZWFwX21vbml0b3I6IG1vbml0b3IgZGlkIG5vdCBzdGFydCwgcmV0dXJuaW5nXG4iKSApOworICAgICAgICByZXR1cm47CisgICAgfTsgLy8gaWYKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworCisgICAgc3RhdHVzID0gU2V0RXZlbnQoIF9fa21wX21vbml0b3JfZXYgKTsKKyAgICBpZiAoIHN0YXR1cyA9PSBGQUxTRSApIHsKKyAgICAgICAgRFdPUkQgZXJyb3IgPSBHZXRMYXN0RXJyb3IoKTsKKyAgICAgICAgX19rbXBfbXNnKAorICAgICAgICAgICAga21wX21zX2ZhdGFsLAorICAgICAgICAgICAgS01QX01TRyggQ2FudFNldEV2ZW50ICksCisgICAgICAgICAgICBLTVBfRVJSKCBlcnJvciApLAorICAgICAgICAgICAgX19rbXBfbXNnX251bGwKKyAgICAgICAgKTsKKyAgICB9CisgICAgS0FfVFJBQ0UoIDEwLCAoICJfX2ttcF9yZWFwX21vbml0b3I6IHJlYXBpbmcgdGhyZWFkICglZClcbiIsIHRoLT50aC50aF9pbmZvLmRzLmRzX2d0aWQgKSApOworICAgIF9fa21wX3JlYXBfY29tbW9uKCB0aCApOworCisgICAgX19rbXBfZnJlZV9oYW5kbGUoIF9fa21wX21vbml0b3JfZXYgKTsKKworICAgIEtNUF9NQigpOyAgICAgICAvKiBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuICAqLworfQorCit2b2lkCitfX2ttcF9yZWFwX3dvcmtlcigga21wX2luZm9fdCAqIHRoICkKK3sKKyAgICBLQV9UUkFDRSggMTAsICggIl9fa21wX3JlYXBfd29ya2VyOiByZWFwaW5nIHRocmVhZCAoJWQpXG4iLCB0aC0+dGgudGhfaW5mby5kcy5kc19ndGlkICkgKTsKKyAgICBfX2ttcF9yZWFwX2NvbW1vbiggdGggKTsKK30KKworLyogLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICovCisvKiAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gKi8KKworI2lmIEtNUF9IQU5ETEVfU0lHTkFMUworCisKK3N0YXRpYyB2b2lkCitfX2ttcF90ZWFtX2hhbmRsZXIoIGludCBzaWdubyApCit7CisgICAgaWYgKCBfX2ttcF9nbG9iYWwuZy5nX2Fib3J0ID09IDAgKSB7CisgICAgICAgIC8vIFN0YWdlIDEgc2lnbmFsIGhhbmRsZXIsIGxldCdzIHNodXQgZG93biBhbGwgb2YgdGhlIHRocmVhZHMuCisgICAgICAgIGlmICggX19rbXBfZGVidWdfYnVmICkgeworICAgICAgICAgICAgX19rbXBfZHVtcF9kZWJ1Z19idWZmZXIoKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICAgICAgVENXXzQoIF9fa21wX2dsb2JhbC5nLmdfYWJvcnQsIHNpZ25vICk7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIFRDV180KCBfX2ttcF9nbG9iYWwuZy5nX2RvbmUsIFRSVUUgKTsKKyAgICAgICAgS01QX01CKCk7ICAgICAgIC8vIEZsdXNoIGFsbCBwZW5kaW5nIG1lbW9yeSB3cml0ZSBpbnZhbGlkYXRlcy4KKyAgICB9Cit9IC8vIF9fa21wX3RlYW1faGFuZGxlcgorCisKKworc3RhdGljCitzaWdfZnVuY190IF9fa21wX3NpZ25hbCggaW50IHNpZ251bSwgc2lnX2Z1bmNfdCBoYW5kbGVyICkgeworICAgIHNpZ19mdW5jX3Qgb2xkID0gc2lnbmFsKCBzaWdudW0sIGhhbmRsZXIgKTsKKyAgICBpZiAoIG9sZCA9PSBTSUdfRVJSICkgeworICAgICAgICBpbnQgZXJyb3IgPSBlcnJubzsKKyAgICAgICAgX19rbXBfbXNnKCBrbXBfbXNfZmF0YWwsIEtNUF9NU0coIEZ1bmN0aW9uRXJyb3IsICJzaWduYWwiICksIEtNUF9FUlIoIGVycm9yICksIF9fa21wX21zZ19udWxsICk7CisgICAgfTsgLy8gaWYKKyAgICByZXR1cm4gb2xkOworfQorCitzdGF0aWMgdm9pZAorX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcigKKyAgICBpbnQgICAgICAgICAgIHNpZywKKyAgICBzaWdfZnVuY190ICAgIGhhbmRsZXIsCisgICAgaW50ICAgICAgICAgICBwYXJhbGxlbF9pbml0CispIHsKKyAgICBzaWdfZnVuY190IG9sZDsKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KKyAgICBLQl9UUkFDRSggNjAsICgiX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcjogY2FsbGVkOiBzaWc9JWRcbiIsIHNpZyApICk7CisgICAgaWYgKCBwYXJhbGxlbF9pbml0ICkgeworICAgICAgICBvbGQgPSBfX2ttcF9zaWduYWwoIHNpZywgaGFuZGxlciApOworICAgICAgICAvLyBTSUdfREZMIG9uIFdpbmRvd3MqIE9TIGluIE5VTEwgb3IgMC4KKyAgICAgICAgaWYgKCBvbGQgPT0gX19rbXBfc2lnaGxkcnNbIHNpZyBdICkgeworICAgICAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDE7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAvLyBSZXN0b3JlL2tlZXAgdXNlcidzIGhhbmRsZXIgaWYgb25lIHByZXZpb3VzbHkgaW5zdGFsbGVkLgorICAgICAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIG9sZCApOworICAgICAgICB9OyAvLyBpZgorICAgIH0gZWxzZSB7CisgICAgICAgIC8vIFNhdmUgaW5pdGlhbC9zeXN0ZW0gc2lnbmFsIGhhbmRsZXJzIHRvIHNlZSBpZiB1c2VyIGhhbmRsZXJzIGluc3RhbGxlZC4KKyAgICAgICAgLy8gMjAwOS0wOS0yMzogSXQgaXMgYSBkZWFkIGNvZGUuIE9uIFdpbmRvd3MqIE9TIF9fa21wX2luc3RhbGxfc2lnbmFscyBjYWxsZWQgb25jZSB3aXRoCisgICAgICAgIC8vIHBhcmFsbGVsX2luaXQgPT0gVFJVRS4KKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIFNJR19ERkwgKTsKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gb2xkOworICAgICAgICBfX2ttcF9zaWduYWwoIHNpZywgb2xkICk7CisgICAgfTsgLy8gaWYKKyAgICBLTVBfTUIoKTsgICAgICAgLyogRmx1c2ggYWxsIHBlbmRpbmcgbWVtb3J5IHdyaXRlIGludmFsaWRhdGVzLiAgKi8KK30gLy8gX19rbXBfaW5zdGFsbF9vbmVfaGFuZGxlcgorCitzdGF0aWMgdm9pZAorX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyKCBpbnQgc2lnICkgeworICAgIGlmICggX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSApIHsKKyAgICAgICAgc2lnX2Z1bmNfdCBvbGQ7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgICAgIEtCX1RSQUNFKCA2MCwgKCAiX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyOiBjYWxsZWQ6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgb2xkID0gX19rbXBfc2lnbmFsKCBzaWcsIF9fa21wX3NpZ2hsZHJzWyBzaWcgXSApOworICAgICAgICBpZiAoIG9sZCAhPSBfX2ttcF90ZWFtX2hhbmRsZXIgKSB7CisgICAgICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX3JlbW92ZV9vbmVfaGFuZGxlcjogb29wcywgbm90IG91ciBoYW5kbGVyLCByZXN0b3Jpbmc6IHNpZz0lZFxuIiwgc2lnICkgKTsKKyAgICAgICAgICAgIG9sZCA9IF9fa21wX3NpZ25hbCggc2lnLCBvbGQgKTsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgX19rbXBfc2lnaGxkcnNbIHNpZyBdID0gTlVMTDsKKyAgICAgICAgX19rbXBfc2lnaW5zdGFsbGVkWyBzaWcgXSA9IDA7CisgICAgICAgIEtNUF9NQigpOyAgICAgICAvLyBGbHVzaCBhbGwgcGVuZGluZyBtZW1vcnkgd3JpdGUgaW52YWxpZGF0ZXMuCisgICAgfTsgLy8gaWYKK30gLy8gX19rbXBfcmVtb3ZlX29uZV9oYW5kbGVyCisKKwordm9pZAorX19rbXBfaW5zdGFsbF9zaWduYWxzKCBpbnQgcGFyYWxsZWxfaW5pdCApCit7CisgICAgS0JfVFJBQ0UoIDEwLCAoICJfX2ttcF9pbnN0YWxsX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgaWYgKCAhIF9fa21wX2hhbmRsZV9zaWduYWxzICkgeworICAgICAgICBLQl9UUkFDRSggMTAsICggIl9fa21wX2luc3RhbGxfc2lnbmFsczogS01QX0hBTkRMRV9TSUdOQUxTIGlzIGZhbHNlIC0gaGFuZGxlcnMgbm90IGluc3RhbGxlZFxuIiApICk7CisgICAgICAgIHJldHVybjsKKyAgICB9OyAvLyBpZgorICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lOVCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0lMTCwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0FCUlQsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR0ZQRSwgIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1NFR1YsIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworICAgIF9fa21wX2luc3RhbGxfb25lX2hhbmRsZXIoIFNJR1RFUk0sIF9fa21wX3RlYW1faGFuZGxlciwgcGFyYWxsZWxfaW5pdCApOworfSAvLyBfX2ttcF9pbnN0YWxsX3NpZ25hbHMKKworCit2b2lkCitfX2ttcF9yZW1vdmVfc2lnbmFscyggdm9pZCApCit7CisgICAgaW50IHNpZzsKKyAgICBLQl9UUkFDRSggMTAsICgiX19rbXBfcmVtb3ZlX3NpZ25hbHM6IGNhbGxlZFxuIiApICk7CisgICAgZm9yICggc2lnID0gMTsgc2lnIDwgTlNJRzsgKysgc2lnICkgeworICAgICAgICBfX2ttcF9yZW1vdmVfb25lX2hhbmRsZXIoIHNpZyApOworICAgIH07IC8vIGZvciBzaWcKK30gLy8gX19rbXBfcmVtb3ZlX3NpZ25hbHMKKworCisjZW5kaWYgLy8gS01QX0hBTkRMRV9TSUdOQUxTCisKKy8qIFB1dCB0aGUgdGhyZWFkIHRvIHNsZWVwIGZvciBhIHRpbWUgcGVyaW9kICovCit2b2lkCitfX2ttcF90aHJlYWRfc2xlZXAoIGludCBtaWxsaXMgKQoreworICAgIERXT1JEIHN0YXR1czsKKworICAgIHN0YXR1cyA9IFNsZWVwRXgoIChEV09SRCkgbWlsbGlzLCBGQUxTRSApOworICAgIGlmICggc3RhdHVzICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBGdW5jdGlvbkVycm9yLCAiU2xlZXBFeCgpIiApLAorICAgICAgICAgICAgS01QX0VSUiggZXJyb3IgKSwKKyAgICAgICAgICAgIF9fa21wX21zZ19udWxsCisgICAgICAgICk7CisgICAgfQorfQorCisvKiBEZXRlcm1pbmUgd2hldGhlciB0aGUgZ2l2ZW4gYWRkcmVzcyBpcyBtYXBwZWQgaW50byB0aGUgY3VycmVudCBhZGRyZXNzIHNwYWNlLiAqLworaW50CitfX2ttcF9pc19hZGRyZXNzX21hcHBlZCggdm9pZCAqIGFkZHIgKQoreworICAgIERXT1JEIHN0YXR1czsKKyAgICBNRU1PUllfQkFTSUNfSU5GT1JNQVRJT04gbHBCdWZmZXI7CisgICAgU0laRV9UIGR3TGVuZ3RoOworCisgICAgZHdMZW5ndGggPSBzaXplb2YoTUVNT1JZX0JBU0lDX0lORk9STUFUSU9OKTsKKworICAgIHN0YXR1cyA9IFZpcnR1YWxRdWVyeSggYWRkciwgJmxwQnVmZmVyLCBkd0xlbmd0aCApOworCisgICAgcmV0dXJuICEoKCggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX1JFU0VSVkUpIHx8ICggbHBCdWZmZXIuU3RhdGUgPT0gTUVNX0ZSRUUgKSkgfHwKKyAgICAgICAoKCBscEJ1ZmZlci5Qcm90ZWN0ID09IFBBR0VfTk9BQ0NFU1MgKSB8fCAoIGxwQnVmZmVyLlByb3RlY3QgPT0gUEFHRV9FWEVDVVRFICkpKTsKK30KKwora21wX3VpbnQ2NAorX19rbXBfaGFyZHdhcmVfdGltZXN0YW1wKHZvaWQpCit7CisgICAga21wX3VpbnQ2NCByID0gMDsKKworICAgIFF1ZXJ5UGVyZm9ybWFuY2VDb3VudGVyKChMQVJHRV9JTlRFR0VSKikgJnIpOworICAgIHJldHVybiByOworfQorCisvKiBGcmVlIGhhbmRsZSBhbmQgY2hlY2sgdGhlIGVycm9yIGNvZGUgKi8KK3ZvaWQKK19fa21wX2ZyZWVfaGFuZGxlKCBrbXBfdGhyZWFkX3QgdEhhbmRsZSApCit7CisvKiBjYWxsZWQgd2l0aCBwYXJhbWV0ZXIgdHlwZSBIQU5ETEUgYWxzbywgdGh1cyBzdXBwb3NlIGttcF90aHJlYWRfdCBkZWZpbmVkIGFzIEhBTkRMRSAqLworICAgIEJPT0wgcmM7CisgICAgcmMgPSBDbG9zZUhhbmRsZSggdEhhbmRsZSApOworICAgIGlmICggIXJjICkgeworICAgICAgICBEV09SRCBlcnJvciA9IEdldExhc3RFcnJvcigpOworICAgICAgICBfX2ttcF9tc2coCisgICAgICAgICAgICBrbXBfbXNfZmF0YWwsCisgICAgICAgICAgICBLTVBfTVNHKCBDYW50Q2xvc2VIYW5kbGUgKSwKKyAgICAgICAgICAgIEtNUF9FUlIoIGVycm9yICksCisgICAgICAgICAgICBfX2ttcF9tc2dfbnVsbAorICAgICAgICApOworICAgIH0KK30KKworaW50CitfX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCBpbnQgbWF4ICkgeworCisgICAgc3RhdGljIFVMT05HIGdsYl9idWZmX3NpemUgPSAxMDAgKiAxMDI0OworCisgICAgc3RhdGljIGludCAgICAgZ2xiX3J1bm5pbmdfdGhyZWFkcyAgPSAwOyAgLyogU2F2ZWQgY291bnQgb2YgdGhlIHJ1bm5pbmcgdGhyZWFkcyBmb3IgdGhlIHRocmVhZCBiYWxhbmNlIGFsZ29ydGlobSAqLworICAgIHN0YXRpYyBkb3VibGUgIGdsYl9jYWxsX3RpbWUgICAgICAgID0gMDsgIC8qIFRocmVhZCBiYWxhbmNlIGFsZ29yaXRobSBjYWxsIHRpbWUgKi8KKworICAgIGludCBydW5uaW5nX3RocmVhZHMgPSAwOyAgICAgICAgICAgICAgLy8gTnVtYmVyIG9mIHJ1bm5pbmcgdGhyZWFkcyBpbiB0aGUgc3lzdGVtLgorICAgIE5UU1RBVFVTICBzdGF0dXMgICAgICAgID0gMDsKKyAgICBVTE9ORyAgICAgYnVmZl9zaXplICAgICA9IDA7CisgICAgVUxPTkcgICAgIGluZm9fc2l6ZSAgICAgPSAwOworICAgIHZvaWQgKiAgICBidWZmZXIgICAgICAgID0gTlVMTDsKKyAgICBQU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gc3BpID0gTlVMTDsKKyAgICBpbnQgZmlyc3RfdGltZSAgICAgICAgICA9IDE7CisKKyAgICBkb3VibGUgY2FsbF90aW1lID0gMC4wOyAvL3N0YXJ0LCBmaW5pc2g7CisKKyAgICBfX2ttcF9lbGFwc2VkKCAmIGNhbGxfdGltZSApOworCisgICAgaWYgKCBnbGJfY2FsbF90aW1lICYmCisgICAgICAgICAgICAoIGNhbGxfdGltZSAtIGdsYl9jYWxsX3RpbWUgPCBfX2ttcF9sb2FkX2JhbGFuY2VfaW50ZXJ2YWwgKSApIHsKKyAgICAgICAgcnVubmluZ190aHJlYWRzID0gZ2xiX3J1bm5pbmdfdGhyZWFkczsKKyAgICAgICAgZ290byBmaW5pc2g7CisgICAgfQorICAgIGdsYl9jYWxsX3RpbWUgPSBjYWxsX3RpbWU7CisKKyAgICAvLyBEbyBub3Qgc3BlbmQgdGltZSBvbiBydW5uaW5nIGFsZ29yaXRobSBpZiB3ZSBoYXZlIGEgcGVybWFuZW50IGVycm9yLgorICAgIGlmICggTnRRdWVyeVN5c3RlbUluZm9ybWF0aW9uID09IE5VTEwgKSB7CisgICAgICAgIHJ1bm5pbmdfdGhyZWFkcyA9IC0xOworICAgICAgICBnb3RvIGZpbmlzaDsKKyAgICB9OyAvLyBpZgorCisgICAgaWYgKCBtYXggPD0gMCApIHsKKyAgICAgICAgbWF4ID0gSU5UX01BWDsKKyAgICB9OyAvLyBpZgorCisgICAgZG8geworCisgICAgICAgIGlmICggZmlyc3RfdGltZSApIHsKKyAgICAgICAgICAgIGJ1ZmZfc2l6ZSA9IGdsYl9idWZmX3NpemU7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBidWZmX3NpemUgPSAyICogYnVmZl9zaXplOworICAgICAgICB9CisKKyAgICAgICAgYnVmZmVyID0gS01QX0lOVEVSTkFMX1JFQUxMT0MoIGJ1ZmZlciwgYnVmZl9zaXplICk7CisgICAgICAgIGlmICggYnVmZmVyID09IE5VTEwgKSB7CisgICAgICAgICAgICBydW5uaW5nX3RocmVhZHMgPSAtMTsKKyAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICB9OyAvLyBpZgorICAgICAgICBzdGF0dXMgPSBOdFF1ZXJ5U3lzdGVtSW5mb3JtYXRpb24oIFN5c3RlbVByb2Nlc3NJbmZvcm1hdGlvbiwgYnVmZmVyLCBidWZmX3NpemUsICYgaW5mb19zaXplICk7CisgICAgICAgIGZpcnN0X3RpbWUgPSAwOworCisgICAgfSB3aGlsZSAoIHN0YXR1cyA9PSBTVEFUVVNfSU5GT19MRU5HVEhfTUlTTUFUQ0ggKTsKKyAgICBnbGJfYnVmZl9zaXplID0gYnVmZl9zaXplOworCisgICAgI2RlZmluZSBDSEVDSyggY29uZCApICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIHsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICBLTVBfREVCVUdfQVNTRVJUKCBjb25kICk7ICAgICAgICAgICBcCisgICAgICAgICAgICBpZiAoICEgKCBjb25kICkgKSB7ICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgcnVubmluZ190aHJlYWRzID0gLTE7ICAgICAgICAgICBcCisgICAgICAgICAgICAgICAgZ290byBmaW5pc2g7ICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcCisgICAgICAgIH0KKworICAgIENIRUNLKCBidWZmX3NpemUgPj0gaW5mb19zaXplICk7CisgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCBidWZmZXIgKTsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIHB0cmRpZmZfdCBvZmZzZXQgPSB1aW50cHRyX3QoIHNwaSApIC0gdWludHB0cl90KCBidWZmZXIgKTsKKyAgICAgICAgQ0hFQ0soIDAgPD0gb2Zmc2V0ICYmIG9mZnNldCArIHNpemVvZiggU1lTVEVNX1BST0NFU1NfSU5GT1JNQVRJT04gKSA8IGluZm9fc2l6ZSApOworICAgICAgICBIQU5ETEUgcGlkID0gc3BpLT5Qcm9jZXNzSWQ7CisgICAgICAgIFVMT05HIG51bSA9IHNwaS0+TnVtYmVyT2ZUaHJlYWRzOworICAgICAgICBDSEVDSyggbnVtID49IDEgKTsKKyAgICAgICAgc2l6ZV90IHNwaV9zaXplID0gc2l6ZW9mKCBTWVNURU1fUFJPQ0VTU19JTkZPUk1BVElPTiApICsgc2l6ZW9mKCBTWVNURU1fVEhSRUFEICkgKiAoIG51bSAtIDEgKTsKKyAgICAgICAgQ0hFQ0soIG9mZnNldCArIHNwaV9zaXplIDwgaW5mb19zaXplICk7ICAgICAgICAgIC8vIE1ha2Ugc3VyZSBwcm9jZXNzIGluZm8gcmVjb3JkIGZpdHMgdGhlIGJ1ZmZlci4KKyAgICAgICAgaWYgKCBzcGktPk5leHRFbnRyeU9mZnNldCAhPSAwICkgeworICAgICAgICAgICAgQ0hFQ0soIHNwaV9zaXplIDw9IHNwaS0+TmV4dEVudHJ5T2Zmc2V0ICk7ICAgLy8gQW5kIGRvIG5vdCBvdmVybGFwIHdpdGggdGhlIG5leHQgcmVjb3JkLgorICAgICAgICB9OyAvLyBpZgorICAgICAgICAvLyBwaWQgPT0gMCBjb3JyZXNwb25kcyB0byB0aGUgU3lzdGVtIElkbGUgUHJvY2Vzcy4gSXQgYWx3YXlzIGhhcyBydW5uaW5nIHRocmVhZHMKKyAgICAgICAgLy8gb24gYWxsIGNvcmVzLiBTbywgd2UgZG9uJ3QgY29uc2lkZXIgdGhlIHJ1bm5pbmcgdGhyZWFkcyBvZiB0aGlzIHByb2Nlc3MuCisgICAgICAgIGlmICggcGlkICE9IDAgKSB7CisgICAgICAgICAgICBmb3IgKCBpbnQgaSA9IDA7IGkgPCBudW07ICsrIGkgKSB7CisgICAgICAgICAgICAgICAgVEhSRUFEX1NUQVRFIHN0YXRlID0gc3BpLT5UaHJlYWRzWyBpIF0uU3RhdGU7CisgICAgICAgICAgICAgICAgLy8gQ291bnQgdGhyZWFkcyB0aGF0IGhhdmUgUmVhZHkgb3IgUnVubmluZyBzdGF0ZS4KKyAgICAgICAgICAgICAgICAvLyAhISEgVE9ETzogV2h5IGNvbW1lbnQgZG9lcyBub3QgbWF0Y2ggdGhlIGNvZGU/Pz8KKyAgICAgICAgICAgICAgICBpZiAoIHN0YXRlID09IFN0YXRlUnVubmluZyApIHsKKyAgICAgICAgICAgICAgICAgICAgKysgcnVubmluZ190aHJlYWRzOworICAgICAgICAgICAgICAgICAgICAvLyBTdG9wIGNvdW50aW5nIHJ1bm5pbmcgdGhyZWFkcyBpZiB0aGUgbnVtYmVyIGlzIGFscmVhZHkgZ3JlYXRlciB0aGFuCisgICAgICAgICAgICAgICAgICAgIC8vIHRoZSBudW1iZXIgb2YgYXZhaWxhYmxlIGNvcmVzCisgICAgICAgICAgICAgICAgICAgIGlmICggcnVubmluZ190aHJlYWRzID49IG1heCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZmluaXNoOworICAgICAgICAgICAgICAgICAgICB9CisgICAgICAgICAgICAgICAgfSAvLyBpZgorICAgICAgICAgICAgfTsgLy8gZm9yIGkKKyAgICAgICAgfSAvLyBpZgorICAgICAgICBpZiAoIHNwaS0+TmV4dEVudHJ5T2Zmc2V0ID09IDAgKSB7CisgICAgICAgICAgICBicmVhazsKKyAgICAgICAgfTsgLy8gaWYKKyAgICAgICAgc3BpID0gUFNZU1RFTV9QUk9DRVNTX0lORk9STUFUSU9OKCB1aW50cHRyX3QoIHNwaSApICsgc3BpLT5OZXh0RW50cnlPZmZzZXQgKTsKKyAgICB9OyAvLyBmb3JldmVyCisKKyAgICAjdW5kZWYgQ0hFQ0sKKworICAgIGZpbmlzaDogLy8gQ2xlYW4gdXAgYW5kIGV4aXQuCisKKyAgICAgICAgaWYgKCBidWZmZXIgIT0gTlVMTCApIHsKKyAgICAgICAgICAgIEtNUF9JTlRFUk5BTF9GUkVFKCBidWZmZXIgKTsKKyAgICAgICAgfTsgLy8gaWYKKworICAgICAgICBnbGJfcnVubmluZ190aHJlYWRzID0gcnVubmluZ190aHJlYWRzOworCisgICAgICAgIHJldHVybiBydW5uaW5nX3RocmVhZHM7CisKK30gLy9fX2ttcF9nZXRfbG9hZF9iYWxhbmNlKCkKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9DTWFrZUxpc3RzLnR4dCBiL3JjMy9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2M0ZmM0MQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvQ01ha2VMaXN0cy50eHQKQEAgLTAsMCArMSw5OSBAQAorIyBDTWFrZUxpc3RzLnR4dCBmaWxlIGZvciB1bml0IHRlc3RpbmcgT3Blbk1QIExpYnJhcnkKK2luY2x1ZGUoRmluZFB5dGhvbkludGVycCkKK2luY2x1ZGUoQ2hlY2tUeXBlU2l6ZSkKK2luY2x1ZGUoQ2hlY2tMaWJyYXJ5RXhpc3RzKQorCitpZihOT1QgUFlUSE9OSU5URVJQX0ZPVU5EKQorICBsaWJvbXBfd2FybmluZ19zYXkoIkNvdWxkIG5vdCBmaW5kIFB5dGhvbi4iKQorICBsaWJvbXBfd2FybmluZ19zYXkoIlRoZSBjaGVjay1saWJvbXAgdGFyZ2V0IHdpbGwgbm90IGJlIGF2YWlsYWJsZSEiKQorICByZXR1cm4oKQorZW5kaWYoKQorCisjIFNvbWUgdGVzdHMgdXNlIG1hdGggZnVuY3Rpb25zCitjaGVja19saWJyYXJ5X2V4aXN0cyhtIHNxcnQgIiIgTElCT01QX0hBVkVfTElCTSkKKworbWFjcm8ocHl0aG9uaXplX2Jvb2wgdmFyKQorICBpZiAoJHt2YXJ9KQorICAgIHNldCgke3Zhcn0gVHJ1ZSkKKyAgZWxzZSgpCisgICAgc2V0KCR7dmFyfSBGYWxzZSkKKyAgZW5kaWYoKQorZW5kbWFjcm8oKQorCitweXRob25pemVfYm9vbChMSUJPTVBfVVNFX0hXTE9DKQorcHl0aG9uaXplX2Jvb2woTElCT01QX09NUFRfU1VQUE9SVCkKK3B5dGhvbml6ZV9ib29sKExJQk9NUF9PTVBUX0JMQU1FKQorcHl0aG9uaXplX2Jvb2woTElCT01QX09NUFRfVFJBQ0UpCitweXRob25pemVfYm9vbChMSUJPTVBfSEFWRV9MSUJNKQorCitzZXQoTElCT01QX1RFU1RfQ0ZMQUdTICIiIENBQ0hFIFNUUklORworICAiRXh0cmEgY29tcGlsZXIgZmxhZ3MgdG8gc2VuZCB0byB0aGUgdGVzdCBjb21waWxlciIpCisKK2lmKCR7TElCT01QX1NUQU5EQUxPTkVfQlVJTER9KQorICAjIE1ha2Ugc3VyZSB3ZSBjYW4gdXNlIHRoZSBjb25zb2xlIHBvb2wgZm9yIHJlY2VudCBjbWFrZSBhbmQgbmluamEgPiAxLjUKKyAgaWYoQ01BS0VfVkVSU0lPTiBWRVJTSU9OX0xFU1MgMy4xLjIwMTQxMTE3KQorICAgIHNldChjbWFrZV8zXzJfVVNFU19URVJNSU5BTCkKKyAgZWxzZSgpCisgICAgc2V0KGNtYWtlXzNfMl9VU0VTX1RFUk1JTkFMIFVTRVNfVEVSTUlOQUwpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX0NPTVBJTEVSICR7Q01BS0VfQ19DT01QSUxFUn0gQ0FDSEUgU1RSSU5HCisgICAgIkNvbXBpbGVyIHRvIHVzZSBmb3IgdGVzdGluZyBPcGVuTVAgbGlicmFyeSIpCisgIHNldChMSUJPTVBfVEVTVF9PUEVOTVBfRkxBRyAtZm9wZW5tcCBDQUNIRSBTVFJJTkcKKyAgICAiT3Blbk1QIGNvbXBpbGVyIGZsYWcgdG8gdXNlIGZvciB0ZXN0aW5nIE9wZW5NUCBsaWJyYXJ5IikKKyAgc2V0KExJQk9NUF9MTFZNX0xJVF9FWEVDVVRBQkxFICIiIENBQ0hFIFNUUklORworICAgICJQYXRoIHRvIGxsdm0tbGl0IikKKyAgZmluZF9wcm9ncmFtKExJVF9FWEVDVVRBQkxFCisgICAgTkFNRVMgbGx2bS1saXQgbGl0LnB5CisgICAgSElOVFMgJHtMSUJPTVBfTExWTV9MSVRfRVhFQ1VUQUJMRX0KKyAgICBQQVRIUyAke09QRU5NUF9MTFZNX1RPT0xTX0RJUn0pCisgIGlmKE5PVCBMSVRfRVhFQ1VUQUJMRSkKKyAgICBsaWJvbXBfc2F5KCJDYW5ub3QgZmluZCBsbHZtLWxpdC4iKQorICAgIGxpYm9tcF9zYXkoIlBsZWFzZSBwdXQgbGx2bS1saXQgaW4geW91ciBQQVRILCBzZXQgTElCT01QX0xMVk1fTElUX0VYRUNVVEFCTEUgdG8gaXRzIGZ1bGwgcGF0aCBvciBwb2ludCBPUEVOTVBfTExWTV9UT09MU19ESVIgdG8gaXRzIGRpcmVjdG9yeSIpCisgICAgbGlib21wX3dhcm5pbmdfc2F5KCJUaGUgY2hlY2stbGlib21wIHRhcmdldCB3aWxsIG5vdCBiZSBhdmFpbGFibGUhIikKKyAgICByZXR1cm4oKQorICBlbmRpZigpCisgIGZpbmRfcHJvZ3JhbShGSUxFQ0hFQ0tfRVhFQ1VUQUJMRQorICAgIE5BTUVTIEZpbGVDaGVjaworICAgIFBBVEhTICR7T1BFTk1QX0xMVk1fVE9PTFNfRElSfSkKKyAgaWYgKE5PVCBGSUxFQ0hFQ0tfRVhFQ1VUQUJMRSkKKyAgICAjIHNldCB0byBlbXB0eSBzdHJpbmcgc28gdGhhdCBsaXQgY2FuIGRpc2FibGUgZGVwZW5kZW50IHRlc3RzCisgICAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICIiKQorICBlbmRpZigpCisgICMgU2V0IGxpdCBhcmd1bWVudHMKKyAgIyBUaGUgLWogMSBsZXRzIHRoZSBhY3R1YWwgdGVzdHMgcnVuIHdpdGggdGhlIGVudGlyZSBtYWNoaW5lLgorICAjIFdlIGhhdmUgb25lIHRlc3QgdGhyZWFkIHRoYXQgc3Bhd25zIHRoZSB0ZXN0cyBzZXJpYWxseS4gIFRoaXMgYWxsb3dzCisgICMgRWFjaCB0ZXN0IHRvIHVzZSB0aGUgZW50aXJlIG1hY2hpbmUuCisgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiLXN2IC0tc2hvdy11bnN1cHBvcnRlZCAtLXNob3cteGZhaWwiKQorICBpZihNU1ZDIE9SIFhDT0RFKQorICAgIHNldChMSUJPTVBfTElUX0FSR1NfREVGQVVMVCAiJHtMSUJPTVBfTElUX0FSR1NfREVGQVVMVH0gLS1uby1wcm9ncmVzcy1iYXIiKQorICBlbmRpZigpCisgIHNldChMSUJPTVBfTElUX0FSR1MgIiR7TElCT01QX0xJVF9BUkdTX0RFRkFVTFR9IiBDQUNIRSBTVFJJTkcKKyAgICAiRGVmYXVsdCBvcHRpb25zIGZvciBsaXQiKQorICBzZXBhcmF0ZV9hcmd1bWVudHMoTElCT01QX0xJVF9BUkdTKQorICBhZGRfY3VzdG9tX3RhcmdldChjaGVjay1saWJvbXAKKyAgICBDT01NQU5EICR7UFlUSE9OX0VYRUNVVEFCTEV9ICR7TElUX0VYRUNVVEFCTEV9ICR7TElCT01QX0xJVF9BUkdTfSAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIG9tcAorICAgIENPTU1FTlQgIlJ1bm5pbmcgbGlib21wIHRlc3RzIgorICAgICR7Y21ha2VfM18yX1VTRVNfVEVSTUlOQUx9CisgICkKK2Vsc2UoKQorICAjIExMVk0gc291cmNlIHRyZWUgYnVpbGQsIHRlc3QganVzdC1idWlsdCBjbGFuZworICBpZihOT1QgTVNWQykKKyAgICBzZXQoTElCT01QX1RFU1RfQ09NUElMRVIgJHtMTFZNX1JVTlRJTUVfT1VUUFVUX0lOVERJUn0vY2xhbmcpCisgIGVsc2UoKQorICAgIHNldChMSUJPTVBfVEVTVF9DT01QSUxFUiAke0xMVk1fUlVOVElNRV9PVVRQVVRfSU5URElSfS9jbGFuZy5leGUpCisgIGVuZGlmKCkKKyAgc2V0KExJQk9NUF9URVNUX09QRU5NUF9GTEFHIC1mb3Blbm1wPWxpYm9tcCkKKyAgc2V0KEZJTEVDSEVDS19FWEVDVVRBQkxFICR7TExWTV9SVU5USU1FX09VVFBVVF9JTlRESVJ9L0ZpbGVDaGVjaykKKyAgIyBVc2UgYWRkX2xpdF90ZXN0c3VpdGUoKSBmcm9tIExMVk0gQ01ha2UuCisgIGFkZF9saXRfdGVzdHN1aXRlKGNoZWNrLWxpYm9tcAorICAgICJSdW5uaW5nIGxpYm9tcCB0ZXN0cyIKKyAgICAke0NNQUtFX0NVUlJFTlRfQklOQVJZX0RJUn0KKyAgICBERVBFTkRTIGNsYW5nIGNsYW5nLWhlYWRlcnMgRmlsZUNoZWNrIG9tcAorICApCitlbmRpZigpCisKKyMgQ29uZmlndXJlIHRoZSBsaXQuc2l0ZS5jZmcuaW4gZmlsZQorc2V0KEFVVE9fR0VOX0NPTU1FTlQgIiMjIEF1dG9nZW5lcmF0ZWQgYnkgbGlib21wIGNvbmZpZ3VyYXRpb24uXG4jIERvIG5vdCBlZGl0ISIpCitjb25maWd1cmVfZmlsZShsaXQuc2l0ZS5jZmcuaW4gbGl0LnNpdGUuY2ZnIEBPTkxZKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9oYXNfb3Blbm1wLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZGE5NWY1OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDIzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X2hhc19vcGVubXAoKQoreworICBpbnQgcnZhbHVlID0gMDsKKyNpZmRlZiBfT1BFTk1QCisgIHJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgcmV0dXJuIChydmFsdWUpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworICBpZighdGVzdF9oYXNfb3Blbm1wKCkpIHsKKyAgICBudW1fZmFpbGVkKys7CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL2ttcF9hbGlnbmVkX21hbGxvYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUzMDJmZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2FwaS9rbXBfYWxpZ25lZF9tYWxsb2MuYwpAQCAtMCwwICsxLDYyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRpbnQuaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBhbGlnbm1lbnRzW10gPSB7NjQsIDEyOCwgMjU2LCA1MTIsIDEwMjQsIDIwNDgsIDQwOTZ9OworCit1bnNpZ25lZCBhbGlnbmVkX2J5KHVpbnQ2NF90IGFkZHIpIHsKKyAgICB1aW50NjRfdCBhbGlnbm1lbnQgPSAxOworICAgIHdoaWxlKChhZGRyICYgKGFsaWdubWVudC0xKSkgPT0gMCkgeworICAgICAgICBhbGlnbm1lbnQgPDw9IDE7CisgICAgfQorICAgIHJldHVybiAoYWxpZ25tZW50ID4+IDEpOworfQorCitpbnQgdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKQoreworICBpbnQgZXJyID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGVycikKKyAgeworICAgIGludCBpOworICAgIGludCogcHRyOworICAgIHVpbnQ2NF90IGFkZHI7CisgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgZm9yKGkgPSAwOyBpIDwgc2l6ZW9mKGFsaWdubWVudHMpL3NpemVvZihpbnQpOyBpKyspIHsKKyAgICAgIGludCBhbGlnbm1lbnQgPSBhbGlnbm1lbnRzW2ldOworICAgICAgLy8gYWxsb2NhdGUgNjQgYnl0ZXMgd2l0aCA2NC1ieXRlIGFsaWdubWVudAorICAgICAgLy8gYWxsb2NhdGUgMTI4IGJ5dGVzIHdpdGggMTI4LWJ5dGUgYWxpZ25tZW50LCBldGMuCisgICAgICBwdHIgPSAoaW50KilrbXBfYWxpZ25lZF9tYWxsb2MoYWxpZ25tZW50LCBhbGlnbm1lbnQpOworICAgICAgYWRkciA9ICh1aW50NjRfdClwdHI7CisgICAgICBpZihhZGRyICYgKGFsaWdubWVudC0xKSkgeworICAgICAgICBwcmludGYoInRocmVhZCAlZDogYWRkciA9ICVwIChhbGlnbmVkIHRvICV1IGJ5dGVzKSBidXQgZXhwZWN0ZWQgIgorICAgICAgICAgICAgICAgIiBhbGlnbm1lbnQgPSAlZFxuIiwgdGlkLCBwdHIsIGFsaWduZWRfYnkoYWRkciksIGFsaWdubWVudCk7CisgICAgICAgIGVyciA9IDE7CisgICAgICB9CisgICAgICBrbXBfZnJlZShwdHIpOworICAgIH0KKworICAgIHB0ciA9IGttcF9hbGlnbmVkX21hbGxvYygxMjgsIDEyNyk7CisgICAgaWYgKHB0ciAhPSBOVUxMKSB7CisgICAgICBwcmludGYoInRocmVhZCAlZDoga21wX2FsaWduZWRfbWFsbG9jKCkgZGlkbid0IHJldHVybiBOVUxMIHdoZW4gIgorICAgICAgICAgICAgICJhbGlnbm1lbnQgd2FzIG5vdCBwb3dlciBvZiAyXG4iLCB0aWQpOworICAgICAgZXJyID0gMTsKKyAgICB9CisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiAhZXJyOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9rbXBfYWxpZ25lZF9tYWxsb2MoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfbnVtX3RocmVhZHMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYWYyODZkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF9udW1fdGhyZWFkcy5jCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX2dldF9udW1fdGhyZWFkcygpCit7CisgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICB0aHJlYWRzICovCisgIGludCBudGhyZWFkc19saWI7CisgIGludCBudGhyZWFkcyA9IDA7CisKKyAgbnRocmVhZHNfbGliID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgbnRocmVhZHMrKzsKKyAgICB9IC8qIGVuZCBvZiBjcml0aWNhbCAqLworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIG50aHJlYWRzX2xpYiA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICByZXR1cm4gKG50aHJlYWRzID09IG50aHJlYWRzX2xpYik7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjM1MjI2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGljay5jCkBAIC0wLDAgKzEsMjQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX2dldF93dGljaygpCit7CisgIGRvdWJsZSB0aWNrOworICB0aWNrID0gLTEuOworICB0aWNrID0gb21wX2dldF93dGljayAoKTsKKyAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfd3RpY2soKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9nZXRfd3RpbWUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzA5NDQwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9hcGkvb21wX2dldF93dGltZS5jCkBAIC0wLDAgKzEsMzMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX2dldF93dGltZSgpCit7CisgIGRvdWJsZSBzdGFydDsKKyAgZG91YmxlIGVuZDsKKyAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgIGRvdWJsZSB3YWl0X3RpbWUgPSA1LjA7CisgIHN0YXJ0ID0gMDsKKyAgZW5kID0gMDsKKyAgc3RhcnQgPSBvbXBfZ2V0X3d0aW1lKCk7CisgIG15X3NsZWVwICh3YWl0X3RpbWUpOworICBlbmQgPSBvbXBfZ2V0X3d0aW1lKCk7CisgIG1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgIHJldHVybiAoKG1lYXN1cmVkX3RpbWUgPiAwLjk3ICogd2FpdF90aW1lKSAmJiAobWVhc3VyZWRfdGltZSA8IDEuMDMgKiB3YWl0X3RpbWUpKSA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9nZXRfd3RpbWUoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9hcGkvb21wX2luX3BhcmFsbGVsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDA5MzEzZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvYXBpL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsMzkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIENoZWNrcyB0aGF0IGZhbHNlIGlzIHJldHVybmVkIHdoZW4gY2FsbGVkIGZyb20gc2VyaWFsIHJlZ2lvbgorICogYW5kIHRydWUgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgd2l0aGluIHBhcmFsbGVsIHJlZ2lvbi4KKyAqLworaW50IHRlc3Rfb21wX2luX3BhcmFsbGVsKCkKK3sKKyAgaW50IHNlcmlhbDsKKyAgaW50IGlzcGFyYWxsZWw7CisKKyAgc2VyaWFsID0gMTsKKyAgaXNwYXJhbGxlbCA9IDA7CisgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCgpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBpc3BhcmFsbGVsID0gb21wX2luX3BhcmFsbGVsKCk7CisgICAgfQorICB9CisgIHJldHVybiAoIShzZXJpYWwpICYmIGlzcGFyYWxsZWwpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfaW5fcGFyYWxsZWwoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYXRvbWljL29tcF9hdG9taWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43Y2RkMzBkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9hdG9taWMvb21wX2F0b21pYy5jCkBAIC0wLDAgKzEsMzY2IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERPVUJMRV9ESUdJVFMgMjAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfYXRvbWljKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkc3VtID0gMDsKKyAgZG91YmxlIGR0ID0gMC41OyAgLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQgeDsKKyAgaW50ICpsb2dpY3M7CisgIGludCBiaXRfYW5kID0gMTsKKyAgaW50IGJpdF9vciA9IDA7CisgIGludCBleGNsdXNpdl9iaXRfb3IgPSAwOworICBpbnQgajsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGtub3duX2RpZmY7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGxvZ2ljX2FuZCA9IDE7CisgIGludCBsb2dpY19vciA9IDA7CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsKKyAgZG91YmxlIGRwdCwgZGl2OworICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgbG9naWNzID0gbG9naWNzQXJyYXk7CisKKyAgc3VtID0gMDsKKyAgZGlmZiA9IDA7CisgIHByb2R1Y3QgPSAxOworCisgIC8vIHN1bSBvZiBpbnRlZ2VycyB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHN1bSArPSBpOworICAgIH0KKworICB9CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pCisgIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkLlxuIiwKKyAgICAgIHN1bSwga25vd25fc3VtKTsKKyAgICByZXN1bHQrKzsKKyAgfQorCisgIC8vIGRpZmZlcmVuY2Ugb2YgaW50ZWdlcnMgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRpZmYgLT0gaTsKKyAgICB9CisgIH0KKyAga25vd25fZGlmZiA9ICgoTE9PUENPVU5UIC0gMSkgKiBMT09QQ09VTlQpIC8gMiAqIC0xOworICBpZiAoZGlmZiAhPSBrbm93bl9kaWZmKQorICB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLAorICAgICAgZGlmZik7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBzdW0gb2YgZG91YmxlcyB0ZXN0CisgIGRzdW0gPSAwOworICBkcHQgPSAxOworICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkc3VtICs9IHBvdyAoZHQsIGkpOworICAgIH0KKyAgfQorICBpZiAoZHN1bSAhPSBka25vd25fc3VtICYmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikpIHsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bSAtIGRrbm93bl9zdW0pOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGlmZmVyZW5jZSBvZiBkb3VibGVzIHRlc3QKKyAgZHB0ID0gMTsKKyAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7ICsraikgeworICAgIGRwdCAqPSBkdDsKKyAgfQorICBkZGlmZiA9ICgxIC0gZHB0KSAvICgxIC0gZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IERPVUJMRV9ESUdJVFM7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBpKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVFIGluc3RlYWQgb2YgMC4wXG4iLAorICAgICAgZGRpZmYpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gcHJvZHVjdCBvZiBpbnRlZ2VycyB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDw9IE1BWF9GQUNUT1I7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBwcm9kdWN0ICo9IGk7CisgICAgfQorICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZiAoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgZnByaW50ZiAoc3RkZXJyLAorICAgICAgIkVycm9yIGluIHByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLAorICAgICAgcHJvZHVjdCwga25vd25fcHJvZHVjdCk7CisgICAgcmVzdWx0Kys7CisgIH0KKworICAvLyBkaXZpc2lvbiBvZiBpbnRlZ2VycyB0ZXN0CisgIHByb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIHByb2R1Y3QgLz0gaTsKKyAgICB9CisgIH0KKyAgaWYgKHByb2R1Y3QgIT0gMSkgeworICAgIGZwcmludGYgKHN0ZGVyciwKKyAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMVxuIiwKKyAgICAgIHByb2R1Y3QpOworICAgIHJlc3VsdCsrOworICB9CisKKyAgLy8gZGl2aXNpb24gb2YgZG91YmxlcyB0ZXN0CisgIGRpdiA9IDUuMEUrNTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGRpdiAvPSBpOworICAgIH0KKyAgfQorICBpZiAoZmFicyhkaXYtMC4xMzc3ODcpID49IDEuMEUtNCApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkaXZpc2lvbiB3aXRoIGRvdWJsZTogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgfQorCisgIC8vICsrIHRlc3QKKyAgeCA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCsrOworICAgIH0KKyAgfQorICBpZiAoeCAhPSBMT09QQ09VTlQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiArK1xuIik7CisgIH0KKworICAvLyAtLSB0ZXN0CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeC0tOworICAgIH0KKyAgfQorICBpZiAoeCAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gLS1cbiIpOworICB9CisKKyAgLy8gYml0LWFuZCB0ZXN0IHBhcnQgMQorICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICBsb2dpY3Nbal0gPSAxOworICB9CisgIGJpdF9hbmQgPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgLy8gYml0LWFuZCB0ZXN0IHBhcnQgMgorICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBiaXQtb3IgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKSB7CisgICAgbG9naWNzW2pdID0gMDsKKyAgfQorICBiaXRfb3IgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC1vciB0ZXN0IHBhcnQgMgorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIGJpdC14b3IgdGVzdCBwYXJ0IDEKKyAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgaisrKSB7CisgICAgbG9naWNzW2pdID0gMDsKKyAgfQorICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgIGV4Y2x1c2l2X2JpdF9vciBePSBsb2dpY3NbaV07CisgICAgfQorICB9CisgIGlmIChleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIC8vIGJpdC14b3IgdGVzdCBwYXJ0IDIKKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgIH0KKworICB9CisgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvLyBsZWZ0IHNoaWZ0IHRlc3QKKyAgeCA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTA7ICsraSkgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICB4IDw8PSAxOworICAgIH0KKworICB9CisgIGlmICggeCAhPSAxMDI0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gPDxcbiIpOworICAgIHggPSAxMDI0OworICB9CisKKyAgLy8gcmlnaHQgc2hpZnQgdGVzdAorICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpIHsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgeCA+Pj0gMTsKKyAgICB9CisgIH0KKyAgaWYgKHggIT0gMSkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluID4+XG4iKTsKKyAgfQorCisgIHJldHVybiAocmVzdWx0ID09IDApOworfSAvLyB0ZXN0X29tcF9hdG9taWMoKQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfYXRvbWljKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYyBiL3JjMy9ydW50aW1lL3Rlc3QvYmFycmllci9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZmIwNjAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2JhcnJpZXIvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQ0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9iYXJyaWVyKCkKK3sKKyAgaW50IHJlc3VsdDE7CisgIGludCByZXN1bHQyOworICByZXN1bHQxID0gMDsKKyAgcmVzdWx0MiA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgaWYgKHJhbmsgPT0xKSB7CisgICAgICBteV9zbGVlcCgoKGRvdWJsZSlTTEVFUFRJTUUpL1JFUEVUSVRJT05TKTsgLy8gZ2l2ZSAxIHNlYyB0byB3aG9sZSB0ZXN0CisgICAgICByZXN1bHQyID0gMzsKKyAgICB9CisgICAgI3ByYWdtYSBvbXAgYmFycmllcgorICAgIGlmIChyYW5rID09IDIpIHsKKyAgICAgIHJlc3VsdDEgPSByZXN1bHQyOworICAgIH0KKyAgfQorICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyNpZmRlZiBfT1BFTk1QCisgIG9tcF9zZXRfZHluYW1pYygwKTsgLy8gcHJldmVudCBydW50aW1lIHRvIGNoYW5nZSBudW1iZXIgb2YgdGhyZWFkcworICBvbXBfc2V0X251bV90aHJlYWRzKDQpOyAvLyB0aGUgdGVzdCBleHBlY3RzIGF0IGxlYXN0IDMgdGhyZWFkcworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2JhcnJpZXIoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorI2VuZGlmCisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9jcml0aWNhbC9vbXBfY3JpdGljYWwuYyBiL3JjMy9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTA3ZGJjYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvY3JpdGljYWwvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSwzNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfY3JpdGljYWwoKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworCisgIHN1bT0wOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IG15c3VtPTA7CisgICAgaW50IGk7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICBzdW0gPSBteXN1bSArc3VtOworICB9CisgIGtub3duX3N1bSA9IDk5OSAqIDEwMDAgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfY3JpdGljYWwoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvZW52L2ttcF9zZXRfZGlzcGF0Y2hfYnVmLmMgYi9yYzMvcnVudGltZS90ZXN0L2Vudi9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5ZWI3YjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2Vudi9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCkBAIC0wLDAgKzEsNzYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0wICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0xICVsaWJvbXAtcnVuICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz0zICVsaWJvbXAtcnVuCisvLyBSVU46IGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz00ICVsaWJvbXAtcnVuICYmIGVudiBLTVBfRElTUF9OVU1fQlVGRkVSUz03ICVsaWJvbXAtcnVuCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAtRE1ZX1NDSEVEVUxFPWd1aWRlZCAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MSAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9MyAlbGlib21wLXJ1biAmJiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NCAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0RJU1BfTlVNX0JVRkZFUlM9NyAlbGlib21wLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIElOQ1IgNworI2RlZmluZSBNWV9NQVggMjAwCisjZGVmaW5lIE1ZX01JTiAtMjAwCisjZGVmaW5lIE5VTV9MT09QUyAxMDAKKyNpZm5kZWYgTVlfU0NIRURVTEUKKyMgZGVmaW5lIE1ZX1NDSEVEVUxFIGR5bmFtaWMKKyNlbmRpZgorCitpbnQgYSwgYiwgYV9rbm93bl92YWx1ZSwgYl9rbm93bl92YWx1ZTsKKworaW50IHRlc3Rfa21wX3NldF9kaXNwX251bV9idWZmZXJzKCkKK3sKKyAgaW50IHN1Y2Nlc3MgPSAxOworICBhID0gMDsKKyAgYiA9IDA7CisgIC8vIHJ1biBtYW55IHNtYWxsIGR5bmFtaWMgbG9vcHMgdG8gc3RyZXNzIHRoZSBkaXNwYXRjaCBidWZmZXIgc3lzdGVtCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSxqOworICAgIGZvciAoaiA9IDA7IGogPCBOVU1fTE9PUFM7IGorKykgeworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKE1ZX1NDSEVEVUxFKSBub3dhaXQKKyAgICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYSsrOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKE1ZX1NDSEVEVUxFKSBub3dhaXQKKyAgICAgIGZvciAoaSA9IE1ZX01BWDsgaSA+PSBNWV9NSU47IGktPUlOQ1IpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGIrKzsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gZGV0ZWN0IGZhaWx1cmUKKyAgaWYgKGEgIT0gYV9rbm93bl92YWx1ZSB8fCBiICE9IGJfa25vd25fdmFsdWUpIHsKKyAgICBzdWNjZXNzID0gMDsKKyAgICBwcmludGYoImEgPSAlZCAoc2hvdWxkIGJlICVkKSwgYiA9ICVkIChzaG91bGQgYmUgJWQpXG4iLCBhLCBhX2tub3duX3ZhbHVlLAorICAgICAgICAgICBiLCBiX2tub3duX3ZhbHVlKTsKKyAgfQorICByZXR1cm4gc3VjY2VzczsKK30KKworaW50IG1haW4oaW50IGFyZ2MsIGNoYXIqKiBhcmd2KQoreworICBpbnQgaSxqOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIC8vIGZpZ3VyZSBvdXQgdGhlIGtub3duIHZhbHVlcyB0byBjb21wYXJlIHdpdGggY2FsY3VsYXRlZCByZXN1bHQKKyAgYV9rbm93bl92YWx1ZSA9IDA7CisgIGJfa25vd25fdmFsdWUgPSAwOworCisgIGZvciAoaiA9IDA7IGogPCBOVU1fTE9PUFM7IGorKykgeworICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikKKyAgICAgIGFfa25vd25fdmFsdWUrKzsKKyAgICBmb3IgKGkgPSBNWV9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKQorICAgICAgYl9rbm93bl92YWx1ZSsrOworICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9lbnYvb21wX3dhaXRfcG9saWN5LmMgYi9yYzMvcnVudGltZS90ZXN0L2Vudi9vbXBfd2FpdF9wb2xpY3kuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMjYwY2U0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9lbnYvb21wX3dhaXRfcG9saWN5LmMKQEAgLTAsMCArMSw0MCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgJiYgZW52IE9NUF9XQUlUX1BPTElDWT1hY3RpdmUgJWxpYm9tcC1ydW4gYWN0aXZlCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZSAmJiBlbnYgT01QX1dBSVRfUE9MSUNZPXBhc3NpdmUgJWxpYm9tcC1ydW4gcGFzc2l2ZQorLy8KKy8vIE9NUF9XQUlUX1BPTElDWT1hY3RpdmUgc2hvdWxkIGltcGx5IGJsb2NrdGltZSA9PSBJTlRfTUFYCisvLyBpLmUuLCB0aHJlYWRzIHNwaW4td2FpdCBmb3JldmVyCisvLyBPTVBfV0FJVF9QT0xJQ1k9cGFzc2l2ZSBzaG91bGQgaW1wbHkgYmxvY2t0aW1lID09IDAKKy8vIGkuZS4sIHRocmVhZHMgaW1tZWRpYXRlbHkgc2xlZXAKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0cmluZy5oPgorI2luY2x1ZGUgPGxpbWl0cy5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKwordm9pZCB1c2FnZSgpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInVzYWdlOiBvbXBfd2FpdF9wb2xpY3kgYWN0aXZlfHBhc3NpdmVcbiIpOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCBibG9ja3RpbWUsIHJldHZhbD0xOworICBjb25zdCBjaGFyKiBlbnZfdmFyX3ZhbHVlOworCisgIGlmIChhcmdjICE9IDIpIHsKKyAgICB1c2FnZSgpOworICAgIHJldHVybiAxOworICB9CisKKyAgYmxvY2t0aW1lID0ga21wX2dldF9ibG9ja3RpbWUoKTsKKworICBlbnZfdmFyX3ZhbHVlID0gYXJndlsxXTsKKyAgaWYgKCFzdHJjbXAoZW52X3Zhcl92YWx1ZSwgImFjdGl2ZSIpKSB7CisgICAgcmV0dmFsID0gKGJsb2NrdGltZSAhPSBJTlRfTUFYKTsKKyAgfSBlbHNlIGlmICghc3RyY21wKGVudl92YXJfdmFsdWUsICJwYXNzaXZlIikpIHsKKyAgICByZXR2YWwgPSAoYmxvY2t0aW1lICE9IDApOworICB9IGVsc2UgeworICAgIHVzYWdlKCk7CisgICAgcmV0dmFsID0gMTsKKyAgfQorCisgIHJldHVybiByZXR2YWw7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2ZsdXNoL29tcF9mbHVzaC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zZmQzY2RmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9mbHVzaC9vbXBfZmx1c2guYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF9mbHVzaCgpCit7CisgIGludCByZXN1bHQxOworICBpbnQgcmVzdWx0MjsKKyAgaW50IGR1bW15OworCisgIHJlc3VsdDEgPSAwOworICByZXN1bHQyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IHJhbms7CisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAjcHJhZ21hIG9tcCBiYXJyaWVyCisgICAgaWYgKHJhbmsgPT0gMSkgeworICAgICAgcmVzdWx0MiA9IDM7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0MikKKyAgICAgIGR1bW15ID0gcmVzdWx0MjsKKyAgICB9CisgICAgaWYgKHJhbmsgPT0gMCkgeworICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoIChyZXN1bHQyKQorICAgICAgcmVzdWx0MSA9IHJlc3VsdDI7CisgICAgfQorICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2ZsdXNoKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2xpdC5jZmcgYi9yYzMvcnVudGltZS90ZXN0L2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2YxOGRhNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvbGl0LmNmZwpAQCAtMCwwICsxLDEwNSBAQAorIyAtKi0gUHl0aG9uIC0qLSB2aW06IHNldCBmdD1weXRob24gdHM9NCBzdz00IGV4cGFuZHRhYiB0dz03OToKKyMgQ29uZmlndXJhdGlvbiBmaWxlIGZvciB0aGUgJ2xpdCcgdGVzdCBydW5uZXIuCisKK2ltcG9ydCBvcworaW1wb3J0IHJlCitpbXBvcnQgc3VicHJvY2VzcworaW1wb3J0IGxpdC5mb3JtYXRzCisKKyMgVGVsbCBweWxpbnQgdGhhdCB3ZSBrbm93IGNvbmZpZyBhbmQgbGl0X2NvbmZpZyBleGlzdCBzb21ld2hlcmUuCitpZiAnUFlMSU5UX0lNUE9SVCcgaW4gb3MuZW52aXJvbjoKKyAgICBjb25maWcgPSBvYmplY3QoKQorICAgIGxpdF9jb25maWcgPSBvYmplY3QoKQorCitkZWYgYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKHBhdGgpOgorICAgIGlmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdXaW5kb3dzJzoKKyAgICAgICAgbmFtZSA9ICdQQVRIJworICAgICAgICBzZXAgPSAnOycKKyAgICBlbGlmIGNvbmZpZy5vcGVyYXRpbmdfc3lzdGVtID09ICdEYXJ3aW4nOgorICAgICAgICBuYW1lID0gJ0RZTERfTElCUkFSWV9QQVRIJworICAgICAgICBzZXAgPSAnOicKKyAgICBlbHNlOgorICAgICAgICBuYW1lID0gJ0xEX0xJQlJBUllfUEFUSCcKKyAgICAgICAgc2VwID0gJzonCisgICAgaWYgbmFtZSBpbiBjb25maWcuZW52aXJvbm1lbnQ6CisgICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXSA9IHBhdGggKyBzZXAgKyBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0KKyAgICBlbHNlOgorICAgICAgICBjb25maWcuZW52aXJvbm1lbnRbbmFtZV0gPSBwYXRoCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnbGlib21wJworCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMuCitjb25maWcuc3VmZml4ZXMgPSBbJy5jJ10KKworIyB0ZXN0X3NvdXJjZV9yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkLgorY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSBvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSByb290IG9iamVjdCBkaXJlY3Rvcnkgd2hlcmUgb3V0cHV0IGlzIHBsYWNlZAorY29uZmlnLnRlc3RfZXhlY19yb290ID0gY29uZmlnLmxpYm9tcF9vYmpfcm9vdAorCisjIHRlc3QgZm9ybWF0Citjb25maWcudGVzdF9mb3JtYXQgPSBsaXQuZm9ybWF0cy5TaFRlc3QoKQorCisjIGNvbXBpbGVyIGZsYWdzCitjb25maWcudGVzdF9jZmxhZ3MgPSBjb25maWcudGVzdF9vcGVubXBfZmxhZyArIFwKKyAgICAiIC1JICIgKyBjb25maWcudGVzdF9zb3VyY2Vfcm9vdCArIFwKKyAgICAiIC1JICIgKyBjb25maWcub21wX2hlYWRlcl9kaXJlY3RvcnkgKyBcCisgICAgIiAtTCAiICsgY29uZmlnLmxpYnJhcnlfZGlyICsgXAorICAgICIgIiArIGNvbmZpZy50ZXN0X2V4dHJhX2NmbGFncworCisjIGV4dHJhIGxpYnJhcmllcworbGlicyA9ICIiCitpZiBjb25maWcuaGFzX2xpYm06CisgICAgbGlicyArPSAiIC1sbSIKKworIyBBbGxvdyBYRkFJTCB0byB3b3JrCitjb25maWcudGFyZ2V0X3RyaXBsZSA9IFsgXQoraWYgcmUuc2VhcmNoKCdnY2MnLCBjb25maWcudGVzdF9jb21waWxlcikgaXMgbm90IE5vbmU6CisgICAgY29uZmlnLmF2YWlsYWJsZV9mZWF0dXJlcy5hZGQoJ2djYycpCisKKyMgU2V0dXAgZW52aXJvbm1lbnQgdG8gZmluZCBkeW5hbWljIGxpYnJhcnkgYXQgcnVudGltZQorYXBwZW5kX2R5bmFtaWNfbGlicmFyeV9wYXRoKGNvbmZpZy5saWJyYXJ5X2RpcikKK2lmIGNvbmZpZy51c2luZ19od2xvYzoKKyAgICBhcHBlbmRfZHluYW1pY19saWJyYXJ5X3BhdGgoY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyKQorCisjIFJwYXRoIG1vZGlmaWNhdGlvbnMgZm9yIERhcndpbgoraWYgY29uZmlnLm9wZXJhdGluZ19zeXN0ZW0gPT0gJ0Rhcndpbic6CisgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLVdsLC1ycGF0aCwiICsgY29uZmlnLmxpYnJhcnlfZGlyCisgICAgaWYgY29uZmlnLnVzaW5nX2h3bG9jOgorICAgICAgICBjb25maWcudGVzdF9jZmxhZ3MgKz0gIiAtV2wsLXJwYXRoLCIgKyBjb25maWcuaHdsb2NfbGlicmFyeV9kaXIKKworIyBGaW5kIHRoZSBTREsgb24gRGFyd2luCitpZiBjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9PSAnRGFyd2luJzoKKyAgY21kID0gc3VicHJvY2Vzcy5Qb3BlbihbJ3hjcnVuJywgJy0tc2hvdy1zZGstcGF0aCddLAorICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZG91dD1zdWJwcm9jZXNzLlBJUEUsIHN0ZGVycj1zdWJwcm9jZXNzLlBJUEUpCisgIG91dCwgZXJyID0gY21kLmNvbW11bmljYXRlKCkKKyAgb3V0ID0gb3V0LnN0cmlwKCkKKyAgcmVzID0gY21kLndhaXQoKQorICBpZiByZXMgPT0gMCBhbmQgb3V0OgorICAgIGNvbmZpZy50ZXN0X2NmbGFncyArPSAiIC1pc3lzcm9vdCAiICsgb3V0CisKKyMgRGlzYWJsZSBPTVBUIHRlc3RzIGlmIEZpbGVDaGVjayB3YXMgbm90IGZvdW5kCitpZiBjb25maWcuaGFzX29tcHQgYW5kIGNvbmZpZy50ZXN0X2ZpbGVjaGVjayA9PSAiIjoKKyAgICBsaXRfY29uZmlnLm5vdGUoIk5vdCB0ZXN0aW5nIE9NUFQgYmVjYXVzZSBGaWxlQ2hlY2sgd2FzIG5vdCBmb3VuZCIpCisgICAgY29uZmlnLmhhc19vbXB0ID0gRmFsc2UKKworaWYgY29uZmlnLmhhc19vbXB0OgorICAgIGNvbmZpZy5hdmFpbGFibGVfZmVhdHVyZXMuYWRkKCJvbXB0IikKKyAgICAjIGZvciBjYWxsYmFjay5oCisgICAgY29uZmlnLnRlc3RfY2ZsYWdzICs9ICIgLUkgIiArIGNvbmZpZy50ZXN0X3NvdXJjZV9yb290ICsgIi9vbXB0IgorCisjIHN1YnN0aXR1dGlvbnMKK2lmIGNvbmZpZy5oYXNfb21wdDoKKyAgICBjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCJGaWxlQ2hlY2siLCBjb25maWcudGVzdF9maWxlY2hlY2spKQorICAgIGNvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVzb3J0LXRocmVhZHMiLCAic29ydCAtLW51bWVyaWMtc29ydCAtLXN0YWJsZSIpKQorCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wLWNvbXBpbGUtYW5kLXJ1biIsIFwKKyAgICAiJWxpYm9tcC1jb21waWxlICYmICVsaWJvbXAtcnVuIikpCitjb25maWcuc3Vic3RpdHV0aW9ucy5hcHBlbmQoKCIlbGlib21wLWNvbXBpbGUiLCBcCisgICAgIiVjbGFuZyAlY2ZsYWdzICVzIC1vICV0IiArIGxpYnMpKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCgiJWxpYm9tcC1ydW4iLCAiJXQiKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVjbGFuZyIsIGNvbmZpZy50ZXN0X2NvbXBpbGVyKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVvcGVubXBfZmxhZyIsIGNvbmZpZy50ZXN0X29wZW5tcF9mbGFnKSkKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCgoIiVjZmxhZ3MiLCBjb25maWcudGVzdF9jZmxhZ3MpKQorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2xpdC5zaXRlLmNmZy5pbiBiL3JjMy9ydW50aW1lL3Rlc3QvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ0ODEzMmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2xpdC5zaXRlLmNmZy5pbgpAQCAtMCwwICsxLDE4IEBACitAQVVUT19HRU5fQ09NTUVOVEAKKworY29uZmlnLnRlc3RfY29tcGlsZXIgPSAiQExJQk9NUF9URVNUX0NPTVBJTEVSQCIKK2NvbmZpZy50ZXN0X2ZpbGVjaGVjayA9ICJARklMRUNIRUNLX0VYRUNVVEFCTEVAIgorY29uZmlnLnRlc3Rfb3Blbm1wX2ZsYWcgPSAiQExJQk9NUF9URVNUX09QRU5NUF9GTEFHQCIKK2NvbmZpZy50ZXN0X2V4dHJhX2NmbGFncyA9ICJATElCT01QX1RFU1RfQ0ZMQUdTQCIKK2NvbmZpZy5saWJvbXBfb2JqX3Jvb3QgPSAiQENNQUtFX0NVUlJFTlRfQklOQVJZX0RJUkAiCitjb25maWcubGlicmFyeV9kaXIgPSAiQExJQk9NUF9MSUJSQVJZX0RJUkAiCitjb25maWcub21wX2hlYWRlcl9kaXJlY3RvcnkgPSAiQExJQk9NUF9CSU5BUllfRElSQC9zcmMiCitjb25maWcub3BlcmF0aW5nX3N5c3RlbSA9ICJAQ01BS0VfU1lTVEVNX05BTUVAIgorY29uZmlnLmh3bG9jX2xpYnJhcnlfZGlyID0gIkBMSUJPTVBfSFdMT0NfTElCUkFSWV9ESVJAIgorY29uZmlnLnVzaW5nX2h3bG9jID0gQExJQk9NUF9VU0VfSFdMT0NACitjb25maWcuaGFzX29tcHQgPSBATElCT01QX09NUFRfU1VQUE9SVEAgYW5kIEBMSUJPTVBfT01QVF9CTEFNRUAgYW5kIEBMSUJPTVBfT01QVF9UUkFDRUAKK2NvbmZpZy5oYXNfbGlibSA9IEBMSUJPTVBfSEFWRV9MSUJNQAorCisjIExldCB0aGUgbWFpbiBjb25maWcgZG8gdGhlIHJlYWwgd29yay4KK2xpdF9jb25maWcubG9hZF9jb25maWcoY29uZmlnLCAiQExJQk9NUF9CQVNFX0RJUkAvdGVzdC9saXQuY2ZnIikKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMgYi9yYzMvcnVudGltZS90ZXN0L2xvY2svb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMzAxZjI3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLy8gUlVOOiBlbnYgS01QX0xPQ0tfS0lORD10YXMgS01QX1NQSU5fQkFDS09GRl9QQVJBTVM9MjA0OCwyMDAgJWxpYm9tcC1ydW4KKy8vIFJVTjogZW52IEtNUF9MT0NLX0tJTkQ9ZnV0ZXggJWxpYm9tcC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF9sb2NrKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgb21wX2luaXRfbG9jaygmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBvbXBfc2V0X2xvY2soJmxjayk7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbG9jaygmbGNrKTsKKyAgICB9CisgIH0KKyAgb21wX2Rlc3Ryb3lfbG9jaygmbGNrKTsKKworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9sb2NrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2xvY2svb21wX25lc3RfbG9jay5jIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zM2Q3YzZhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9uZXN0X2xvY2tfdCBsY2s7CisKK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soKQoreworICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICBpbnQgaTsKKworICBvbXBfaW5pdF9uZXN0X2xvY2soJmxjayk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgICAgb21wX3NldF9uZXN0X2xvY2soJmxjayk7CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbmVzdF9sb2NrKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9uZXN0X2xvY2soJmxjayk7CisKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbmVzdF9sb2NrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbG9jay5jIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jNTEyMDU1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisvLyBSVU46IGVudiBLTVBfTE9DS19LSU5EPXRhcyAlbGlib21wLXJ1bgorLy8gUlVOOiBlbnYgS01QX0xPQ0tfS0lORD1mdXRleCAlbGlib21wLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitvbXBfbG9ja190IGxjazsKKworaW50IHRlc3Rfb21wX3Rlc3RfbG9jaygpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgbnJfaXRlcmF0aW9ucyA9IDA7CisgIGludCBpOworCisgIG9tcF9pbml0X2xvY2sgKCZsY2spOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQobGNrKQorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICB3aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorICAgICAge307CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZS0tOworICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBvbXBfdW5zZXRfbG9jayAoJmxjayk7CisgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rlc3RfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jIGIvcmMzL3J1bnRpbWUvdGVzdC9sb2NrL29tcF90ZXN0X25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJmYTZmZDIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L2xvY2svb21wX3Rlc3RfbmVzdF9sb2NrLmMKQEAgLTAsMCArMSw0NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgb21wX25lc3RfbG9ja190IGxjazsKKworaW50IHRlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisKKyAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykKKyAgeworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisgICAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworICAgICAgd2hpbGUoIW9tcF90ZXN0X25lc3RfbG9jayAoJmxjaykpCisgICAgICB7fTsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgIG5yX2l0ZXJhdGlvbnMrKzsKKyAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIG9tcF91bnNldF9uZXN0X2xvY2sgKCZsY2spOworICAgIH0KKyAgfQorICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90ZXN0X25lc3RfbG9jaygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jIGIvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFjYzdmOWUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyLmMKQEAgLTAsMCArMSwzOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfbWFzdGVyKCkKK3sKKyAgaW50IG50aHJlYWRzOworICBpbnQgZXhlY3V0aW5nX3RocmVhZDsKKworICBudGhyZWFkcyA9IDA7CisgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgbnRocmVhZHMrKzsKKyAgICAgIH0KKyAgICAgIGV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICB9IC8qIGVuZCBvZiBtYXN0ZXIqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX21hc3RlcigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlcl8zLmMgYi9yYzMvcnVudGltZS90ZXN0L21hc3Rlci9vbXBfbWFzdGVyXzMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yZTlmZGY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9tYXN0ZXIvb21wX21hc3Rlcl8zLmMKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfbWFzdGVyXzMoKQoreworICBpbnQgbnRocmVhZHM7CisgIGludCBleGVjdXRpbmdfdGhyZWFkOworICBpbnQgdGlkX3Jlc3VsdCA9IDA7IC8qIGNvdW50cyB1cCB0aGUgbnVtYmVyIG9mIHdyb25nIHRocmVhZCBuby4gZm9yCisgICAgICAgICAgICAgICB0aGUgbWFzdGVyIHRocmVhZC4gKE11c3QgYmUgMCkgKi8KKyAgbnRocmVhZHMgPSAwOworICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIHsKKyAgICAgIGludCB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIGlmICh0aWQgIT0gMCkgeworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7IHRpZF9yZXN1bHQrKzsgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgbnRocmVhZHMrKzsKKyAgICAgIH0KKyAgICAgIGV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKChudGhyZWFkcyA9PSAxKSAmJiAoZXhlY3V0aW5nX3RocmVhZCA9PSAwKSAmJiAodGlkX3Jlc3VsdCA9PSAwKSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9tYXN0ZXJfMygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvbWFueS1taWNyb3Rhc2stYXJncy5jIGIvcmMzL3J1bnRpbWUvdGVzdC9taXNjX2J1Z3MvbWFueS1taWNyb3Rhc2stYXJncy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzNTQ4NzIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L21pc2NfYnVncy9tYW55LW1pY3JvdGFzay1hcmdzLmMKQEAgLTAsMCArMSwzOCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK2ludCBtYWluKCkKK3sKKworICBpbnQgaTEgPSAwOworICBpbnQgaTIgPSAxOworICBpbnQgaTMgPSAyOworICBpbnQgaTQgPSAzOworICBpbnQgaTUgPSA0OworICBpbnQgaTYgPSA2OworICBpbnQgaTcgPSA3OworICBpbnQgaTggPSA4OworICBpbnQgaTkgPSA5OworICBpbnQgaTEwID0gMTA7CisgIGludCBpMTEgPSAxMTsKKyAgaW50IGkxMiA9IDEyOworICBpbnQgaTEzID0gMTM7CisgIGludCBpMTQgPSAxNDsKKyAgaW50IGkxNSA9IDE1OworICBpbnQgaTE2ID0gMTY7CisgCisgIGludCByID0gMDsgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGUoaTEsIGkyLCBpMywgaTQsIGk1LCBpNiwgaTcsIGk4LCBpOSwgaTEwLCBpMTEsIGkxMiwgaTEzLCBpMTQsIGkxNSwgaTE2KSByZWR1Y3Rpb24oKzpyKQorICBmb3IgKGludCBpID0gMDsgaSA8IGkxNjsgaSsrKSB7CisgICAgciArPSBpICsgaTEgKyBpMiArIGkzICsgaTQgKyBpNSArIGk2ICsgaTcgKyBpOCArIGk5ICsgaTEwICsgaTExICsgaTEyICsgaTEzICsgaTE0ICsgaTE1ICsgaTE2OworICB9CisKKyAgaW50IHJmID0gMjIxNjsKKyAgaWYgKHIgIT0gcmYpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgInIgc2hvdWxkIGJlICVkIGJ1dCBpbnN0ZWFkIGVxdWFscyAlZFxuIiwgcmYsIHIpOworICAgIHJldHVybiAxOworICB9CisKKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvbWlzY19idWdzL29tcF9mb3JlaWduX3RocmVhZF90ZWFtX3JldXNlLmMgYi9yYzMvcnVudGltZS90ZXN0L21pc2NfYnVncy9vbXBfZm9yZWlnbl90aHJlYWRfdGVhbV9yZXVzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkNzBkNDcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L21pc2NfYnVncy9vbXBfZm9yZWlnbl90aHJlYWRfdGVhbV9yZXVzZS5jCkBAIC0wLDAgKzEsODEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlIC1scHRocmVhZCAmJiAlbGlib21wLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIE5VTV9USFJFQURTIDEwCisKKy8qCisgQWZ0ZXIgaG90IHRlYW1zIHdlcmUgZW5hYmxlZCBieSBkZWZhdWx0LCB0aGUgbGlicmFyeSBzdGFydGVkIHVzaW5nIGxldmVscworIGtlcHQgaW4gdGhlIHRlYW0gc3RydWN0dXJlLiAgVGhlIGxldmVscyBhcmUgYnJva2VuIGluIGNhc2UgZm9yZWlnbiB0aHJlYWQKKyBleGl0cyBhbmQgcHV0cyBpdHMgdGVhbSBpbnRvIHRoZSBwb29sIHdoaWNoIGlzIHRoZW4gcmUtdXNlZCBieSBhbm90aGVyIGZvcmVpZ24KKyB0aHJlYWQuIFRoZSBicm9rZW4gYmVoYXZpb3Igb2JzZXJ2ZWQgaXMgd2hlbiBwcmludGluZyB0aGUgbGV2ZWxzIGZvciBlYWNoCisgbmV3IHRlYW0sIG9uZSBnZXRzIDEsIDIsIDEsIDIsIDEsIDIsIGV0Yy4gIFRoaXMgbWFrZXMgdGhlIGxpYnJhcnkgYmVsaWV2ZSB0aGF0CisgZXZlcnkgb3RoZXIgdGVhbSBpcyBuZXN0ZWQgd2hpY2ggaXMgaW5jb3JyZWN0LiAgV2hhdCBpcyB3YW50ZWQgaXMgZm9yIHRoZQorIGxldmVscyB0byBiZSAxLCAxLCAxLCBldGMuCisqLworCitpbnQgYSA9IDA7CitpbnQgbGV2ZWw7CisKK3R5cGVkZWYgc3RydWN0IHRocmVhZF9hcmdfdCB7CisgIGludCBpdGVyYXRpb25zOworfSB0aHJlYWRfYXJnX3Q7CisKK3ZvaWQqIHRocmVhZF9mdW5jdGlvbih2b2lkKiBhcmcpIHsKKyAgaW50IGk7CisgIHRocmVhZF9hcmdfdCogdGFyZyA9ICh0aHJlYWRfYXJnX3QqKWFyZzsKKyAgaW50IGl0ZXJhdGlvbnMgPSB0YXJnLT5pdGVyYXRpb25zOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgIHsKKyAgICAvLyBsZXZlbCBzaG91bGQgYWx3YXlzIGJlIDEKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICBsZXZlbCA9IG9tcF9nZXRfbGV2ZWwoKTsKKworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvcihpID0gMDsgaSA8IGl0ZXJhdGlvbnM7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBhKys7CisgICAgfQorICB9Cit9CisKK2ludCB0ZXN0X29tcF90ZWFtX3JldXNlKCkKK3sKKyAgaW50IGk7CisgIGludCBzdWNjZXNzID0gMTsKKyAgcHRocmVhZF90IHRocmVhZFtOVU1fVEhSRUFEU107CisgIHRocmVhZF9hcmdfdCB0aHJlYWRfYXJnW05VTV9USFJFQURTXTsKKyAgLy8gbGF1bmNoIE5VTV9USFJFQURTIHRocmVhZHMsIG9uZSBhdCBhIHRpbWUgdG8gcGVyZm9ybSB0aHJlYWRfZnVuY3Rpb24oKQorICBmb3IoaSA9IDA7IGkgPCBOVU1fVEhSRUFEUzsgaSsrKSB7CisgICAgdGhyZWFkX2FyZ1tpXS5pdGVyYXRpb25zID0gaSArIDE7CisgICAgcHRocmVhZF9jcmVhdGUodGhyZWFkK2ksIE5VTEwsIHRocmVhZF9mdW5jdGlvbiwgdGhyZWFkX2FyZytpKTsKKyAgICBwdGhyZWFkX2pvaW4oKih0aHJlYWQraSksIE5VTEwpOworICAgIC8vIGxldmVsIHJlYWQgaW4gdGhyZWFkX2Z1bmN0aW9uKCkncyBwYXJhbGxlbCByZWdpb24gc2hvdWxkIGJlIDEKKyAgICBpZihsZXZlbCAhPSAxKSB7CisgICAgICBmcHJpbnRmKHN0ZGVyciwgImVycm9yOiBmb3IgcHRocmVhZCAlZCBsZXZlbCBzaG91bGQgYmUgMSBidXQgIgorICAgICAgICAgICAgICAgICAgICAgICJpbnN0ZWFkIGVxdWFscyAlZFxuIiwgaSwgbGV2ZWwpOworICAgICAgc3VjY2VzcyA9IDA7CisgICAgfQorICB9CisgIC8vIG1ha2Ugc3VyZSB0aGUgZm9yIGxvb3Agd29ya3MKKyAgaW50IGtub3duX3N1bSA9IChOVU1fVEhSRUFEUyAqIChOVU1fVEhSRUFEUysxKSkgLyAyOworICBpZihhICE9IGtub3duX3N1bSkgeworICAgIGZwcmludGYoc3RkZXJyLCAiYSBzaG91bGQgYmUgJWQgYnV0IGluc3RlYWQgZXF1YWxzICVkXG4iLCBrbm93bl9zdW0sIGEpOworICAgIHN1Y2Nlc3MgPSAwOworICB9CisgIHJldHVybiBzdWNjZXNzOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBhID0gMDsKKyAgICBpZighdGVzdF9vbXBfdGVhbV9yZXVzZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXBfbXlfc2xlZXAuaCBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTM4ZDkzMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wX215X3NsZWVwLmgKQEAgLTAsMCArMSwzMyBAQAorI2lmbmRlZiBNWV9TTEVFUF9ICisjZGVmaW5lIE1ZX1NMRUVQX0gKKworLyohIFV0aWxpdHkgZnVuY3Rpb24gdG8gaGF2ZSBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggYmV0dGVyIHJlc29sdXRpb24gYW5kCisgKiAgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLiAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKworI2lmIGRlZmluZWQoX1dJTjMyKQorIyBpbmNsdWRlIDx3aW5kb3dzLmg+CisvLyBXaW5kb3dzIHZlcnNpb24gb2YgbXlfc2xlZXAoKSBmdW5jdGlvbgorc3RhdGljIHZvaWQgbXlfc2xlZXAoZG91YmxlIHNsZWVwdGltZSkgeworICBEV09SRCBtcyA9IChEV09SRCkgKHNsZWVwdGltZSAqIDEwMDAuMCk7CisgIFNsZWVwKG1zKTsKK30KKworCisjZWxzZSAvLyBfV0lOMzIKKworLy8gVW5pY2VzIHZlcnNpb24gb2YgbXlfc2xlZXAoKSBmdW5jdGlvbgorc3RhdGljIHZvaWQgbXlfc2xlZXAoZG91YmxlIHNsZWVwdGltZSkgeworICBzdHJ1Y3QgdGltZXNwZWMgdHM7CisgIHRzLnR2X3NlYyA9ICh0aW1lX3Qpc2xlZXB0aW1lOworICB0cy50dl9uc2VjID0gKGxvbmcpKChzbGVlcHRpbWUgLSAoZG91YmxlKXRzLnR2X3NlYykgKiAxRTkpOworICBuYW5vc2xlZXAoJnRzLCBOVUxMKTsKK30KKworI2VuZGlmIC8vIF9XSU4zMgorCisjZW5kaWYgLy8gTVlfU0xFRVBfSApkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmggYi9yYzMvcnVudGltZS90ZXN0L29tcF90ZXN0c3VpdGUuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lZWY1NDcwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXBfdGVzdHN1aXRlLmgKQEAgLTAsMCArMSw3OSBAQAorLyogR2xvYmFsIGhlYWRlcmZpbGUgb2YgdGhlIE9wZW5NUCBUZXN0c3VpdGUgKi8KKworI2lmbmRlZiBPTVBfVEVTVFNVSVRFX0gKKyNkZWZpbmUgT01QX1RFU1RTVUlURV9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKiBHZW5lcmFsICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworI2RlZmluZSBMT09QQ09VTlQgMTAwMCAvKiBOdW1iZXIgb2YgaXRlcmF0aW9ucyB0byBzbGl0IGFtb25nc3QgdGhyZWFkcyAqLworI2RlZmluZSBSRVBFVElUSU9OUyAxMCAvKiBOdW1iZXIgb2YgdGltZXMgdG8gcnVuIGVhY2ggdGVzdCAqLworCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FIDEKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTIDI1CisjZGVmaW5lIE1BWF9UQVNLU19QRVJfVEhSRUFEIDUKKworI2lmZGVmICBfV0lOMzIKKy8vIFdpbmRvd3MgdmVyc2lvbnMgb2YgcHRocmVhZF9jcmVhdGUoKSBhbmQgcHRocmVhZF9qb2luKCkKKyMgaW5jbHVkZSA8d2luZG93cy5oPgordHlwZWRlZiBIQU5ETEUgcHRocmVhZF90OworCisvLyBlbmNhcHN1bGF0ZXMgdGhlIGluZm9ybWF0aW9uIGFib3V0IGEgcHRocmVhZC1jYWxsYWJsZSBmdW5jdGlvbgorc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCB7CisgIHZvaWQqICgqc3RhcnRfcm91dGluZSkodm9pZCopOworICB2b2lkKiBhcmc7Cit9OworCisvLyBjYWxsIHRoZSB2b2lkKiBzdGFydF9yb3V0aW5lKHZvaWQqKTsKK3N0YXRpYyBEV09SRCBfX3RocmVhZF9mdW5jX3dyYXBwZXIoTFBWT0lEIGxwUGFyYW1ldGVyKSB7CisgIHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqIGZ1bmN0aW9uX2luZm9ybWF0aW9uOworICBmdW5jdGlvbl9pbmZvcm1hdGlvbiA9IChzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KilscFBhcmFtZXRlcjsKKyAgZnVuY3Rpb25faW5mb3JtYXRpb24tPnN0YXJ0X3JvdXRpbmUoZnVuY3Rpb25faW5mb3JtYXRpb24tPmFyZyk7CisgIGZyZWUoZnVuY3Rpb25faW5mb3JtYXRpb24pOworICByZXR1cm4gMDsKK30KKworLy8gYXR0ciBpcyBpZ25vcmVkCitzdGF0aWMgaW50IHB0aHJlYWRfY3JlYXRlKHB0aHJlYWRfdCAqdGhyZWFkLCB2b2lkICphdHRyLAorICAgICAgICAgICAgICAgICAgICAgICAgICB2b2lkICooKnN0YXJ0X3JvdXRpbmUpICh2b2lkICopLCB2b2lkICphcmcpIHsKKyAgcHRocmVhZF90IHB0aHJlYWQ7CisgIHN0cnVjdCB0aHJlYWRfZnVuY19pbmZvX3QqIGluZm87CisgIGluZm8gPSAoc3RydWN0IHRocmVhZF9mdW5jX2luZm9fdCopbWFsbG9jKHNpemVvZihzdHJ1Y3QgdGhyZWFkX2Z1bmNfaW5mb190KSk7CisgIGluZm8tPnN0YXJ0X3JvdXRpbmUgPSBzdGFydF9yb3V0aW5lOworICBpbmZvLT5hcmcgPSBhcmc7CisgIHB0aHJlYWQgPSBDcmVhdGVUaHJlYWQoTlVMTCwgMCwgX190aHJlYWRfZnVuY193cmFwcGVyLCBpbmZvLCAwLCBOVUxMKTsKKyAgaWYgKHB0aHJlYWQgPT0gTlVMTCkgeworICAgIGZwcmludGYoc3RkZXJyLCAiQ3JlYXRlVGhyZWFkKCkgZmFpbGVkOiBFcnJvciAjJXUuXG4iLCBHZXRMYXN0RXJyb3IoKSk7CisgICAgZXhpdCgxKTsKKyAgfQorICAqdGhyZWFkID0gcHRocmVhZDsKKyAgcmV0dXJuIDA7Cit9CisvLyByZXR2YWwgaXMgaWdub3JlZCBmb3Igbm93CitzdGF0aWMgaW50IHB0aHJlYWRfam9pbihwdGhyZWFkX3QgdGhyZWFkLCB2b2lkICoqcmV0dmFsKSB7CisgIGludCByYzsKKyAgcmMgPSBXYWl0Rm9yU2luZ2xlT2JqZWN0KHRocmVhZCwgSU5GSU5JVEUpOworICBpZiAocmMgPT0gV0FJVF9GQUlMRUQpIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIldhaXRGb3JTaW5nbGVPYmplY3QoKSBmYWlsZWQ6IEVycm9yICMldS5cbiIsCisgICAgICAgICAgICBHZXRMYXN0RXJyb3IoKSk7CisgICAgZXhpdCgxKTsKKyAgfQorICByYyA9IENsb3NlSGFuZGxlKHRocmVhZCk7CisgIGlmIChyYyA9PSAwKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJDbG9zZUhhbmRsZSgpIGZhaWxlZDogRXJyb3IgIyV1LlxuIiwgR2V0TGFzdEVycm9yKCkpOworICAgIGV4aXQoMSk7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisjZWxzZQorIyBpbmNsdWRlIDxwdGhyZWFkLmg+CisjZW5kaWYKKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvY2FsbGJhY2suaCBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9jYWxsYmFjay5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBhN2ViNzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvY2FsbGJhY2suaApAQCAtMCwwICsxLDEwOCBAQAorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8aW50dHlwZXMuaD4KKyNpbmNsdWRlIDxvbXB0Lmg+CisKK3N0YXRpYyBvbXB0X2dldF90YXNrX2lkX3Qgb21wdF9nZXRfdGFza19pZDsKK3N0YXRpYyBvbXB0X2dldF90aHJlYWRfaWRfdCBvbXB0X2dldF90aHJlYWRfaWQ7CitzdGF0aWMgb21wdF9nZXRfcGFyYWxsZWxfaWRfdCBvbXB0X2dldF9wYXJhbGxlbF9pZDsKKworc3RhdGljIHZvaWQgcHJpbnRfaWRzKGludCBsZXZlbCkKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogbGV2ZWwgJWQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgbGV2ZWwsIG9tcHRfZ2V0X3BhcmFsbGVsX2lkKGxldmVsKSwgb21wdF9nZXRfdGFza19pZChsZXZlbCkpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2JhcnJpZXJfZW5kKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHRhc2tfaWQ9JSIgUFJJdTY0ICJcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgdGFza19pZCk7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9sb29wX2JlZ2luKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHBhcmVudF90YXNrX2lkLAorICB2b2lkICp3b3Jrc2hhcmVfZnVuY3Rpb24pCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfbG9vcF9iZWdpbjogcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHBhcmVudF90YXNrX2lkPSUiIFBSSXU2NCAiLCB3b3Jrc2hhcmVfZnVuY3Rpb249JXBcbiIsIG9tcHRfZ2V0X3RocmVhZF9pZCgpLCBwYXJhbGxlbF9pZCwgcGFyZW50X3Rhc2tfaWQsIHdvcmtzaGFyZV9mdW5jdGlvbik7Cit9CisKK3N0YXRpYyB2b2lkCitvbl9vbXB0X2V2ZW50X2xvb3BfZW5kKAorICBvbXB0X3BhcmFsbGVsX2lkX3QgcGFyYWxsZWxfaWQsCisgIG9tcHRfdGFza19pZF90IHRhc2tfaWQpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfbG9vcF9lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbigKKyAgb21wdF90YXNrX2lkX3QgcGFyZW50X3Rhc2tfaWQsCisgIG9tcHRfZnJhbWVfdCAqcGFyZW50X3Rhc2tfZnJhbWUsCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgdWludDMyX3QgcmVxdWVzdGVkX3RlYW1fc2l6ZSwKKyAgdm9pZCAqcGFyYWxsZWxfZnVuY3Rpb24sCisgIG9tcHRfaW52b2tlcl90IGludm9rZXIpCit7CisgIHByaW50ZigiJSIgUFJJdTY0ICI6IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPSUiIFBSSXU2NCAiLCBwYXJlbnRfdGFza19mcmFtZT0lcCwgcGFyYWxsZWxfaWQ9JSIgUFJJdTY0ICIsIHJlcXVlc3RlZF90ZWFtX3NpemU9JSIgUFJJdTMyICIsIHBhcmFsbGVsX2Z1bmN0aW9uPSVwLCBpbnZva2VyPSVkXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyZW50X3Rhc2tfaWQsIHBhcmVudF90YXNrX2ZyYW1lLCBwYXJhbGxlbF9pZCwgcmVxdWVzdGVkX3RlYW1fc2l6ZSwgcGFyYWxsZWxfZnVuY3Rpb24sIGludm9rZXIpOworfQorCitzdGF0aWMgdm9pZAorb25fb21wdF9ldmVudF9wYXJhbGxlbF9lbmQoCisgIG9tcHRfcGFyYWxsZWxfaWRfdCBwYXJhbGxlbF9pZCwKKyAgb21wdF90YXNrX2lkX3QgdGFza19pZCwKKyAgb21wdF9pbnZva2VyX3QgaW52b2tlcikKK3sKKyAgcHJpbnRmKCIlIiBQUkl1NjQgIjogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPSUiIFBSSXU2NCAiLCB0YXNrX2lkPSUiIFBSSXU2NCAiLCBpbnZva2VyPSVkXG4iLCBvbXB0X2dldF90aHJlYWRfaWQoKSwgcGFyYWxsZWxfaWQsIHRhc2tfaWQsIGludm9rZXIpOworfQorCisKK3ZvaWQgb21wdF9pbml0aWFsaXplKAorICBvbXB0X2Z1bmN0aW9uX2xvb2t1cF90IGxvb2t1cCwKKyAgY29uc3QgY2hhciAqcnVudGltZV92ZXJzaW9uLAorICB1bnNpZ25lZCBpbnQgb21wdF92ZXJzaW9uKQoreworICBvbXB0X3NldF9jYWxsYmFja190IG9tcHRfc2V0X2NhbGxiYWNrID0gKG9tcHRfc2V0X2NhbGxiYWNrX3QpIGxvb2t1cCgib21wdF9zZXRfY2FsbGJhY2siKTsKKyAgb21wdF9nZXRfdGFza19pZCA9IChvbXB0X2dldF90YXNrX2lkX3QpIGxvb2t1cCgib21wdF9nZXRfdGFza19pZCIpOworICBvbXB0X2dldF90aHJlYWRfaWQgPSAob21wdF9nZXRfdGhyZWFkX2lkX3QpIGxvb2t1cCgib21wdF9nZXRfdGhyZWFkX2lkIik7CisgIG9tcHRfZ2V0X3BhcmFsbGVsX2lkID0gKG9tcHRfZ2V0X3BhcmFsbGVsX2lkX3QpIGxvb2t1cCgib21wdF9nZXRfcGFyYWxsZWxfaWQiKTsKKworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4sIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW4pOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X2JhcnJpZXJfZW5kLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9iYXJyaWVyX2VuZCk7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbiwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbik7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQsIChvbXB0X2NhbGxiYWNrX3QpICZvbl9vbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2JlZ2luLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9sb29wX2JlZ2luKTsKKyAgb21wdF9zZXRfY2FsbGJhY2sob21wdF9ldmVudF9sb29wX2VuZCwgKG9tcHRfY2FsbGJhY2tfdCkgJm9uX29tcHRfZXZlbnRfbG9vcF9lbmQpOworICBvbXB0X3NldF9jYWxsYmFjayhvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbik7CisgIG9tcHRfc2V0X2NhbGxiYWNrKG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kLCAob21wdF9jYWxsYmFja190KSAmb25fb21wdF9ldmVudF9wYXJhbGxlbF9lbmQpOworfQorCitvbXB0X2luaXRpYWxpemVfdCBvbXB0X3Rvb2woKQoreworICByZXR1cm4gJm9tcHRfaW5pdGlhbGl6ZTsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9uZXN0ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA2MDFhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZC5jCkBAIC0wLDAgKzEsMjM5IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1USFJFQURTICVzCisvLyBSRVFVSVJFUzogb21wdAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisjaW5jbHVkZSA8b21wLmg+CisKK2ludCBtYWluKCkKK3sKKyAgb21wX3NldF9uZXN0ZWQoMSk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIHByaW50X2lkcygwKTsKKyAgICBwcmludF9pZHMoMSk7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgICB7CisgICAgICBwcmludF9pZHMoMCk7CisgICAgICBwcmludF9pZHMoMSk7CisgICAgICBwcmludF9pZHMoMik7CisgICAgfQorICB9CisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbUEFSRU5UX1RBU0tfSUQ6WzAtOV0rXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBDSEVDSy1EQUc6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBOb3RlIHRoYXQgd2UgY2Fubm90IGVuc3VyZSB0aGF0IHRoZSB3b3JrZXIgdGhyZWFkcyBoYXZlIGFscmVhZHkgY2FsbGVkIGJhcnJpZXJfZW5kIGFuZCBpbXBsaWNpdF90YXNrX2VuZCBiZWZvcmUgcGFyYWxsZWxfZW5kIQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLLURBRzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisKKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gbmVzdGVkIHBhcmFsbGVsIG1hc3RlcnMKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OOjB4WzAtZl0rXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWU9MHh7e1swLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gbmVzdGVkIHBhcmFsbGVsIHdvcmtlciB0aHJlYWRzCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBjYW4ndCByZWxpYWJseSB0ZWxsIHdoaWNoIHBhcmFsbGVsIHJlZ2lvbiBpcyB0aGUgcGFyZW50Li4uCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9e3tbMC05XSt9fSwgdGFza19pZD17e1swLTldK319CisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIGNhbid0IHJlbGlhYmx5IHRlbGwgd2hpY2ggcGFyYWxsZWwgcmVnaW9uIGlzIHRoZSBwYXJlbnQuLi4KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD17e1swLTldK319LCB0YXNrX2lkPXt7WzAtOV0rfX0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gY2FuJ3QgcmVsaWFibHkgdGVsbCB3aGljaCBwYXJhbGxlbCByZWdpb24gaXMgdGhlIHBhcmVudC4uLgorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPXt7WzAtOV0rfX0sIHRhc2tfaWQ9e3tbMC05XSt9fQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbmVzdGVkX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mZWNiZGRjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3BhcmFsbGVsL25lc3RlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSwxMDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrIC0tY2hlY2stcHJlZml4PVRIUkVBRFMgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICBvbXBfc2V0X25lc3RlZCgwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcyg0KQorICAgIHsKKyAgICAgIHByaW50X2lkcygwKTsKKyAgICAgIHByaW50X2lkcygxKTsKKyAgICAgIHByaW50X2lkcygyKTsKKyAgICB9CisgIH0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWU9MHh7e1swLWZdK319LCBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVI6LitdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgZW5zdXJlIHRoYXQgdGhlIHdvcmtlciB0aHJlYWRzIGhhdmUgYWxyZWFkeSBjYWxsZWQgYmFycmllcl9lbmQgYW5kIGltcGxpY2l0X3Rhc2tfZW5kIGJlZm9yZSBwYXJhbGxlbF9lbmQhCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKworCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbUEFSRU5UX1RBU0tfSUQ6WzAtOV0rXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSOi4rXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT046MHhbMC1mXStdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgcGFyZW50X3Rhc2tfZnJhbWU9MHh7e1swLWZdK319LCBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj1bW05FU1RFRF9QQVJBTExFTF9GVU5DVElPTl1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDI6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPVtbTkVTVEVEX1BBUkFMTEVMX0ZVTkNUSU9OXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMTogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMjogcGFyYWxsZWxfaWQ9MCwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbTkVTVEVEX0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfZW5kOiBwYXJhbGxlbF9pZD1bW05FU1RFRF9QQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUl1dCisgIC8vIFRIUkVBRFMtTk9UOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQKKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IGxldmVsIDE6IHBhcmFsbGVsX2lkPTAsIHRhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9NCwgcGFyYWxsZWxfZnVuY3Rpb249W1tORVNURURfUEFSQUxMRUxfRlVOQ1RJT05dXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogbGV2ZWwgMDogcGFyYWxsZWxfaWQ9W1tORVNURURfUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW05FU1RFRF9JTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAyOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tORVNURURfSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbTkVTVEVEX1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKyAgLy8gVEhSRUFEUy1OT1Q6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZAorICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbm9ybWFsLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvbm9ybWFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODcyODQzZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9ub3JtYWwuYwpAQCAtMCwwICsxLDY4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgRmlsZUNoZWNrICVzCisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAtLWNoZWNrLXByZWZpeD1USFJFQURTICVzCisvLyBSRVFVSVJFUzogb21wdAorI2luY2x1ZGUgImNhbGxiYWNrLmgiCisKK2ludCBtYWluKCkKK3sKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIHByaW50X2lkcygwKTsKKyAgICBwcmludF9pZHMoMSk7CisgIH0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRDpbMC05XStdXTogb21wdF9ldmVudF9wYXJhbGxlbF9iZWdpbjogcGFyZW50X3Rhc2tfaWQ9W1tQQVJFTlRfVEFTS19JRDpbMC05XStdXSwgcGFyZW50X3Rhc2tfZnJhbWU9MHh7e1swLWZdK319LCBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEOlswLTldK11dLCByZXF1ZXN0ZWRfdGVhbV9zaXplPTQsIHBhcmFsbGVsX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVI6LitdXQorCisgIC8vIENIRUNLLURBRzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIE5vdGUgdGhhdCB3ZSBjYW5ub3QgZW5zdXJlIHRoYXQgdGhlIHdvcmtlciB0aHJlYWRzIGhhdmUgYWxyZWFkeSBjYWxsZWQgYmFycmllcl9lbmQgYW5kIGltcGxpY2l0X3Rhc2tfZW5kIGJlZm9yZSBwYXJhbGxlbF9lbmQhCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0stREFHOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfYmFycmllcl9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9wYXJhbGxlbF9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEXV0sIGludm9rZXI9W1tQQVJBTExFTF9JTlZPS0VSXV0KKworCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPVtbUEFSRU5UX1RBU0tfSUQ6WzAtOV0rXV0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9e3suKn19CisKKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBUSFJFQURTOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAwOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBUSFJFQURTLU5PVDoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kCisgIC8vIFRIUkVBRFM6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9iYXJyaWVyX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2JhcnJpZXJfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gVEhSRUFEUzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC9wYXJhbGxlbC9zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE1YTNmMDMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvcGFyYWxsZWwvc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsMjMgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCBGaWxlQ2hlY2sgJXMKKy8vIFJFUVVJUkVTOiBvbXB0CisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKworaW50IG1haW4oKQoreworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBudW1fdGhyZWFkcygxKQorICB7CisgICAgcHJpbnRfaWRzKDApOworICAgIHByaW50X2lkcygxKTsKKyAgfQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPVtbUEFSQUxMRUxfSU5WT0tFUjouK11dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IGxldmVsIDA6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBsZXZlbCAxOiBwYXJhbGxlbF9pZD0wLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbUEFSRU5UX1RBU0tfSURdXSwgaW52b2tlcj1bW1BBUkFMTEVMX0lOVk9LRVJdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2F1dG8uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xN2QyNmY1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvLmMKQEAgLTAsMCArMSw3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisvLyBHQ0MgZG9lc24ndCBjYWxsIHJ1bnRpbWUgZm9yIGF1dG8gPSBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBhdXRvCisjaW5jbHVkZSAiYmFzZS5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9hdXRvX3NlcmlhbGl6ZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0b19zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjc1NjE2NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYXV0b19zZXJpYWxpemVkLmMKQEAgLTAsMCArMSw3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlX3NlcmlhbGl6ZWQuaAorLy8gUkVRVUlSRVM6IG9tcHQKKy8vIEdDQyBkb2Vzbid0IGNhbGwgcnVudGltZSBmb3IgYXV0byA9IHN0YXRpYyBzY2hlZHVsZQorLy8gWEZBSUw6IGdjYworCisjZGVmaW5lIFNDSEVEVUxFIGF1dG8KKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYmFzZS5oIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDYxNWVkMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvYmFzZS5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpbmNsdWRlICJjYWxsYmFjay5oIgorI2luY2x1ZGUgPG9tcC5oPgorCitpbnQgbWFpbigpCit7CisgIHVuc2lnbmVkIGludCBpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBudW1fdGhyZWFkcyg0KSBzY2hlZHVsZShTQ0hFRFVMRSkKKyAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICB9CisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfcGFyYWxsZWxfYmVnaW46IHBhcmVudF90YXNrX2lkPXt7WzAtOV0rfX0sIHBhcmVudF90YXNrX2ZyYW1lPTB4e3tbMC1mXSt9fSwgcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRDpbMC05XStdXSwgcmVxdWVzdGVkX3RlYW1fc2l6ZT00LCBwYXJhbGxlbF9mdW5jdGlvbj0weHt7WzAtZl0rfX0sIGludm9rZXI9e3suKn19CisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgd29ya3NoYXJlX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSUQ6WzAtOV0rXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSUQ6WzAtOV0rXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9sb29wX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHBhcmVudF90YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dLCB3b3Jrc2hhcmVfZnVuY3Rpb249MHh7e1swLWZdK319CisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2ltcGxpY2l0X3Rhc2tfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKworICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRDpbMC05XStdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2JlZ2luOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEOlswLTldK11dCisgIC8vIENIRUNLOiB7e159fVtbVEhSRUFEX0lEXV06IG9tcHRfZXZlbnRfbG9vcF9iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCBwYXJlbnRfdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXSwgd29ya3NoYXJlX2Z1bmN0aW9uPTB4e3tbMC1mXSt9fQorICAvLyBDSEVDSzoge3tefX1bW1RIUkVBRF9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfZW5kOiBwYXJhbGxlbF9pZD1bW1BBUkFMTEVMX0lEXV0sIHRhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tUSFJFQURfSURdXTogb21wdF9ldmVudF9pbXBsaWNpdF90YXNrX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2Jhc2Vfc2VyaWFsaXplZC5oIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlX3NlcmlhbGl6ZWQuaApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xYzA1OWYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9iYXNlX3NlcmlhbGl6ZWQuaApAQCAtMCwwICsxLDIwIEBACisjaW5jbHVkZSAiY2FsbGJhY2suaCIKKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4oKQoreworICB1bnNpZ25lZCBpbnQgaTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgbnVtX3RocmVhZHMoMSkgc2NoZWR1bGUoU0NIRURVTEUpCisgIGZvciAoaSA9IDA7IGkgPCAxOyBpKyspIHsKKyAgfQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEOlswLTldK11dOiBvbXB0X2V2ZW50X3BhcmFsbGVsX2JlZ2luOiBwYXJlbnRfdGFza19pZD1bW1BBUkVOVF9UQVNLX0lEOlswLTldK11dLCBwYXJlbnRfdGFza19mcmFtZT0weHt7WzAtZl0rfX0sIHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSUQ6WzAtOV0rXV0sIHJlcXVlc3RlZF90ZWFtX3NpemU9MSwgcGFyYWxsZWxfZnVuY3Rpb249MHh7e1swLWZdK319LCBpbnZva2VyPXt7Lit9fQorCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19iZWdpbjogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRDpbMC05XStdXQorICAvLyBDSEVDSzoge3tefX1bW01BU1RFUl9JRF1dOiBvbXB0X2V2ZW50X2xvb3BfYmVnaW46IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgcGFyZW50X3Rhc2tfaWQ9W1tJTVBMSUNJVF9UQVNLX0lEXV0sIHdvcmtzaGFyZV9mdW5jdGlvbj0weHt7WzAtZl0rfX0KKyAgLy8gQ0hFQ0s6IHt7Xn19W1tNQVNURVJfSURdXTogb21wdF9ldmVudF9sb29wX2VuZDogcGFyYWxsZWxfaWQ9W1tQQVJBTExFTF9JRF1dLCB0YXNrX2lkPVtbSU1QTElDSVRfVEFTS19JRF1dCisgIC8vIENIRUNLOiB7e159fVtbTUFTVEVSX0lEXV06IG9tcHRfZXZlbnRfaW1wbGljaXRfdGFza19lbmQ6IHBhcmFsbGVsX2lkPVtbUEFSQUxMRUxfSURdXSwgdGFza19pZD1bW0lNUExJQ0lUX1RBU0tfSURdXQorCisgIHJldHVybiAwOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYTVhZTEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9keW5hbWljLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2UuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZHluYW1pY19zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWNfc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBmODA5MjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2R5bmFtaWNfc2VyaWFsaXplZC5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZV9zZXJpYWxpemVkLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZHluYW1pYworI2luY2x1ZGUgImJhc2Vfc2VyaWFsaXplZC5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDFiZmY0ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvZ3VpZGVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlLmgKKy8vIFJFUVVJUkVTOiBvbXB0CisKKyNkZWZpbmUgU0NIRURVTEUgZ3VpZGVkCisjaW5jbHVkZSAiYmFzZS5oIgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWRfc2VyaWFsaXplZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ndWlkZWRfc2VyaWFsaXplZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRiNTA5NmQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL2d1aWRlZF9zZXJpYWxpemVkLmMKQEAgLTAsMCArMSw1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuIHwgJXNvcnQtdGhyZWFkcyB8IEZpbGVDaGVjayAlUy9iYXNlX3NlcmlhbGl6ZWQuaAorLy8gUkVRVUlSRVM6IG9tcHQKKworI2RlZmluZSBTQ0hFRFVMRSBndWlkZWQKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmNmMTYwZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3IvcnVudGltZS5jCkBAIC0wLDAgKzEsNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3J1bnRpbWVfc2VyaWFsaXplZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lX3NlcmlhbGl6ZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzFkNjdkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9vbXB0L3dvcmtzaGFyaW5nL2Zvci9ydW50aW1lX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDUgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorCisjZGVmaW5lIFNDSEVEVUxFIHJ1bnRpbWUKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRkOTkwNTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpYy5jCkBAIC0wLDAgKzEsNyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1biB8ICVzb3J0LXRocmVhZHMgfCBGaWxlQ2hlY2sgJVMvYmFzZS5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlLmgiCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpY19zZXJpYWxpemVkLmMgYi9yYzMvcnVudGltZS90ZXN0L29tcHQvd29ya3NoYXJpbmcvZm9yL3N0YXRpY19zZXJpYWxpemVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDg2MGQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvb21wdC93b3Jrc2hhcmluZy9mb3Ivc3RhdGljX3NlcmlhbGl6ZWQuYwpAQCAtMCwwICsxLDcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4gfCAlc29ydC10aHJlYWRzIHwgRmlsZUNoZWNrICVTL2Jhc2Vfc2VyaWFsaXplZC5oCisvLyBSRVFVSVJFUzogb21wdAorLy8gR0NDIGRvZXNuJ3QgY2FsbCBydW50aW1lIGZvciBzdGF0aWMgc2NoZWR1bGUKKy8vIFhGQUlMOiBnY2MKKworI2RlZmluZSBTQ0hFRFVMRSBzdGF0aWMKKyNpbmNsdWRlICJiYXNlX3NlcmlhbGl6ZWQuaCIKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfbmVzdGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjczZTA3MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyoKKyAqIFRlc3QgaWYgdGhlIGNvbXBpbGVyIHN1cHBvcnRzIG5lc3RlZCBwYXJhbGxlbGlzbQorICogQnkgQ2h1bmh1YSBMaWFvLCBVbml2ZXJzaXR5IG9mIEhvdXN0b24KKyAqIE9jdC4gMjAwNQorICovCitpbnQgdGVzdF9vbXBfbmVzdGVkKCkKK3sKKyAgaW50IGNvdW50ZXIgPSAwOworI2lmZGVmIF9PUEVOTVAKKyAgb21wX3NldF9uZXN0ZWQoMSk7CisjZW5kaWYKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQoY291bnRlcikKKyAgeworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlcisrOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIGNvdW50ZXItLTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudGVyICE9IDApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfbmVzdGVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2NvcHlpbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYwMGY5YjcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9jb3B5aW4uYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbigpCit7CisgIGludCBzdW0sIG51bV90aHJlYWRzOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIHN1bTEgPSA3OworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgY29weWluKHN1bTEpCisgIHsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfY29weWluKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9kZWZhdWx0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMGE4ZTA5ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9kZWZhdWx0KCkKK3sKKyAgaW50IGk7CisgIGludCBzdW07CisgIGludCBteXN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGRlZmF1bHQoc2hhcmVkKSBwcml2YXRlKGkpIHByaXZhdGUobXlzdW0pCisgIHsKKyAgICBteXN1bSA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfSAgIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgZnByaW50ZihzdGRlcnIsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZGVmYXVsdCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kYmVlNzZjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvL3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID0gMDsKKyAgc3VtMT03OworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKHN1bTEpCisgIHsKKyAgICAvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspIHsKKyAgICAgIHN1bTEgPSBzdW0xICsgaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0xOworICAgICAgbnVtX3RocmVhZHMrKzsKKyAgICB9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9pZi5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hYmJmM2NkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9pZigpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBpbnQgbXlzdW07CisgIGludCBjb250cm9sPTE7CisKKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIGlmKGNvbnRyb2w9PTApCisgIHsKKyAgICBteXN1bSA9IDA7CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgbXlzdW0gPSBteXN1bSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgbXlzdW07CisgICAgfQorICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9pZigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGFmMWY5ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKQEAgLTAsMCArMSw0NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKQoreworICBpbnQgbnVtX2ZhaWxlZDsKKyAgaW50IHRocmVhZHM7CisgIGludCBudGhyZWFkczsKKyAgaW50IG1heF90aHJlYWRzID0gMDsKKworICBudW1fZmFpbGVkID0gMDsKKworICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIG1heF90aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgfQorCisgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgIGZvcih0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKSB7CisgICAgbnRocmVhZHMgPSAwOworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHJlZHVjdGlvbigrOm51bV9mYWlsZWQpIG51bV90aHJlYWRzKHRocmVhZHMpCisgICAgeworICAgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKHRocmVhZHMgPT0gb21wX2dldF9udW1fdGhyZWFkcygpKTsKKyAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgbnRocmVhZHMgKz0gMTsKKyAgICB9CisgICAgbnVtX2ZhaWxlZCA9IG51bV9mYWlsZWQgKyAhKG50aHJlYWRzID09IHRocmVhZHMpOworICB9CisgIHJldHVybiAoIW51bV9mYWlsZWQpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMzhlODA2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkKK3sKKyAgaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgaW50IGtub3duX3N1bTsKKworICBzdW0gPSAwOworICBudW1fdGhyZWFkcyA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShzdW0xKQorICB7CisgICAgaW50IGk7CisgICAgc3VtMSA9IDc7CisgICAgLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICBzdW0xID0gc3VtMSArIGk7CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgIG51bV90aHJlYWRzKys7CisgICAgfQorICB9CisgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDIgKyA3ICogbnVtX3RocmVhZHM7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmJiMDA5MzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3BhcmFsbGVsL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfcmVkdWN0aW9uKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgZG91YmxlIGRzdW07CisgIGRvdWJsZSBka25vd25fc3VtOworICBkb3VibGUgZHQ9MC41OyAvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgIGRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTk7CisgIGludCBkaWZmOworICBkb3VibGUgZGRpZmY7CisgIGludCBwcm9kdWN0OworICBpbnQga25vd25fcHJvZHVjdDsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50IGxvZ2ljc1tMT09QQ09VTlRdOworICBpbnQgaTsKKyAgZG91YmxlIGRwdDsKKyAgaW50IHJlc3VsdDsKKworICBzdW0gPTA7CisgIGRzdW09MDsKKyAgcHJvZHVjdD0xOworICBsb2dpY19hbmQ9MTsKKyAgbG9naWNfb3I9MDsKKyAgYml0X2FuZD0xOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisgIHJlc3VsdD0wOworICBkdCA9IDEuLzMuOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisKKyAgLyogVGVzdHMgZm9yIGludGVnZXJzICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKSB7CisgICAgc3VtPXN1bStpOworICB9CisKKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsKKyAgfQorCisgIGRpZmYgPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkgeworICAgIGRpZmY9ZGlmZi1pOworICB9CisKKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKyAgZHN1bT0wOworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgfQorCisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgZHB0PTE7CisKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAgLyogVGVzdHMgZm9yIHByb2R1Y3Qgb2YgaW50ZWdlcnMgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICBmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKSB7CisgICAgcHJvZHVjdCAqPSBpOworICB9CisKKyAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWNhbCBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBsb2dpY2FsIG9yICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKyAgfQorICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBhbmQgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY3NbaV09MTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBiaXRfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2Ugb3IgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICB9CisgIGlmKCFiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgeG9yICovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgfQorICBpZihleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICB9CisgIGlmKCFleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICAvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworICByZXR1cm4gKHJlc3VsdD09MCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC9wYXJhbGxlbC9vbXBfcGFyYWxsZWxfc2hhcmVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzE0NmNhNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvcGFyYWxsZWwvb21wX3BhcmFsbGVsX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZCgpCit7CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSBzaGFyZWQoc3VtKQorICB7CisKKyAgICBpbnQgbXlzdW0gPSAwOworICAgICNwcmFnbWEgb21wIGZvcgorICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgIG15c3VtID0gbXlzdW0gKyBpOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIG15c3VtOworICAgIH0KKworCisgIH0KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgICBmcHJpbnRmKHN0ZGVyciwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9rbXBfdGFza2xvb3AuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9rbXBfdGFza2xvb3AuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zYjMxOGJkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL2ttcF90YXNrbG9vcC5jCkBAIC0wLDAgKzEsMTU4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBOIDQKKyNkZWZpbmUgR1JBSU4gMTAKKyNkZWZpbmUgU1RSSURFIDMKKworLy8gZ2xvYmFscworaW50IHRoX2NvdW50ZXJbTl07CitpbnQgY291bnRlcjsKKworCisvLyBDb21waWxlci1nZW5lcmF0ZWQgY29kZSAoZW11bGF0aW9uKQordHlwZWRlZiBzdHJ1Y3QgaWRlbnQgeworICAgIHZvaWQqIGR1bW15OworfSBpZGVudF90OworCit0eXBlZGVmIHN0cnVjdCBzaGFyIHsKKyAgICBpbnQoKnB0aF9jb3VudGVyKVtOXTsKKyAgICBpbnQgKnBjb3VudGVyOworICAgIGludCAqcGo7Cit9ICpwc2hhcmVkczsKKwordHlwZWRlZiBzdHJ1Y3QgdGFzayB7CisgICAgcHNoYXJlZHMgc2hhcmVkczsKKyAgICBpbnQoKiByb3V0aW5lKShpbnQsc3RydWN0IHRhc2sqKTsKKyAgICBpbnQgcGFydF9pZDsKKy8vIHByaXZhdGVzOgorICAgIHVuc2lnbmVkIGxvbmcgbG9uZyBsYjsgLy8gbGlicmFyeSBhbHdheXMgdXNlcyBVTE9ORworICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB1YjsKKyAgICBpbnQgc3Q7CisgICAgaW50IGxhc3Q7CisgICAgaW50IGk7CisgICAgaW50IGo7CisgICAgaW50IHRoOworfSAqcHRhc2ssIGttcF90YXNrX3Q7CisKK3R5cGVkZWYgaW50KCogdGFza19lbnRyeV90KSggaW50LCBwdGFzayApOworCit2b2lkCitfX3Rhc2tfZHVwX2VudHJ5KHB0YXNrIHRhc2tfZHN0LCBwdGFzayB0YXNrX3NyYywgaW50IGxhc3Rwcml2KQoreworLy8gc2V0dXAgbGFzdHByaXZhdGUgZmxhZworICAgIHRhc2tfZHN0LT5sYXN0ID0gbGFzdHByaXY7CisvLyBjb3VsZCBiZSBjb25zdHJ1Y3RvciBjYWxscyBoZXJlLi4uCit9CisKKworLy8gT3Blbk1QIFJUTCBpbnRlcmZhY2VzCit0eXBlZGVmIHVuc2lnbmVkIGxvbmcgbG9uZyBrbXBfdWludDY0OwordHlwZWRlZiBsb25nIGxvbmcga21wX2ludDY0OworCisjaWZkZWYgX19jcGx1c3BsdXMKK2V4dGVybiAiQyIgeworI2VuZGlmCit2b2lkCitfX2ttcGNfdGFza2xvb3AoaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwga21wX3Rhc2tfdCAqdGFzaywgaW50IGlmX3ZhbCwKKyAgICAgICAgICAgICAgICBrbXBfdWludDY0ICpsYiwga21wX3VpbnQ2NCAqdWIsIGttcF9pbnQ2NCBzdCwKKyAgICAgICAgICAgICAgICBpbnQgbm9ncm91cCwgaW50IHNjaGVkLCBrbXBfaW50NjQgZ3JhaW5zaXplLCB2b2lkICp0YXNrX2R1cCApOworcHRhc2sKK19fa21wY19vbXBfdGFza19hbGxvYyggaWRlbnRfdCAqbG9jLCBpbnQgZ3RpZCwgaW50IGZsYWdzLAorICAgICAgICAgICAgICAgICAgc2l6ZV90IHNpemVvZl9rbXBfdGFza190LCBzaXplX3Qgc2l6ZW9mX3NoYXJlZHMsCisgICAgICAgICAgICAgICAgICB0YXNrX2VudHJ5X3QgdGFza19lbnRyeSApOwordm9pZCBfX2ttcGNfYXRvbWljX2ZpeGVkNF9hZGQodm9pZCAqaWRfcmVmLCBpbnQgZ3RpZCwgaW50ICogbGhzLCBpbnQgcmhzKTsKK2ludCAgX19rbXBjX2dsb2JhbF90aHJlYWRfbnVtKHZvaWQgKmlkX3JlZik7CisjaWZkZWYgX19jcGx1c3BsdXMKK30KKyNlbmRpZgorCisKKy8vIFVzZXIncyBjb2RlCitpbnQgdGFza19lbnRyeShpbnQgZ3RpZCwgcHRhc2sgdGFzaykKK3sKKyAgICBwc2hhcmVkcyBwc2hhciA9IHRhc2stPnNoYXJlZHM7CisgICAgZm9yKCB0YXNrLT5pID0gdGFzay0+bGI7IHRhc2stPmkgPD0gKGludCl0YXNrLT51YjsgdGFzay0+aSArPSB0YXNrLT5zdCApIHsKKyAgICAgICAgdGFzay0+dGggPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgX19rbXBjX2F0b21pY19maXhlZDRfYWRkKE5VTEwsZ3RpZCxwc2hhci0+cGNvdW50ZXIsMSk7CisgICAgICAgIF9fa21wY19hdG9taWNfZml4ZWQ0X2FkZChOVUxMLGd0aWQsJigoKnBzaGFyLT5wdGhfY291bnRlcilbdGFzay0+dGhdKSwxKTsKKyAgICAgICAgdGFzay0+aiA9IHRhc2stPmk7CisgICAgfQorICAgIG15X3NsZWVwKCAwLjEgKTsgLy8gc2xlZXAgMTAwIG1zIGluIG9yZGVyIHRvIGFsbG93IG90aGVyIHRocmVhZHMgdG8gc3RlYWwgdGFza3MKKyAgICBpZiggdGFzay0+bGFzdCApIHsKKyAgICAgICAgKihwc2hhci0+cGopID0gdGFzay0+ajsgLy8gbGFzdHByaXZhdGUKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgICBpbnQgaSwgaiwgZ3RpZCA9IF9fa21wY19nbG9iYWxfdGhyZWFkX251bShOVUxMKTsKKyAgICBwdGFzayB0YXNrOworICAgIHBzaGFyZWRzIHBzaDsKKyAgICBvbXBfc2V0X2R5bmFtaWMoMCk7CisgICAgY291bnRlciA9IDA7CisgICAgZm9yKCBpPTA7IGk8TjsgKytpICkKKyAgICAgICAgdGhfY291bnRlcltpXSA9IDA7CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoTikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBtYXN0ZXIKKyAgICAgIHsKKyAgICAgICAgaW50IGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisvKgorICogIFRoaXMgaXMgd2hhdCB0aGUgT3Blbk1QIHJ1bnRpbWUgY2FsbHMgY29ycmVzcG9uZCB0bzoKKyAgICAjcHJhZ21hIG9tcCB0YXNrbG9vcCBudW1fdGFza3MoTikgbGFzdHByaXZhdGUoaikKKyAgICBmb3IoIGk9MDsgaTxOKkdSQUlOKlNUUklERS0xOyBpKz1TVFJJREUgKQorICAgIHsKKyAgICAgICAgaW50IHRoID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgY291bnRlcisrOworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgICAgIHRoX2NvdW50ZXJbdGhdKys7CisgICAgICAgIGogPSBpOworICAgIH0KKyovCisgICAgdGFzayA9IF9fa21wY19vbXBfdGFza19hbGxvYyhOVUxMLGd0aWQsMSxzaXplb2Yoc3RydWN0IHRhc2spLHNpemVvZihzdHJ1Y3Qgc2hhciksJnRhc2tfZW50cnkpOworICAgIHBzaCA9IHRhc2stPnNoYXJlZHM7CisgICAgcHNoLT5wdGhfY291bnRlciA9ICZ0aF9jb3VudGVyOworICAgIHBzaC0+cGNvdW50ZXIgPSAmY291bnRlcjsKKyAgICBwc2gtPnBqID0gJmo7CisgICAgdGFzay0+bGIgPSAwOworICAgIHRhc2stPnViID0gTipHUkFJTipTVFJJREUtMjsKKyAgICB0YXNrLT5zdCA9IFNUUklERTsKKworICAgIF9fa21wY190YXNrbG9vcCgKKyAgICAgICAgTlVMTCwgICAgICAgICAgICAgLy8gbG9jYXRpb24KKyAgICAgICAgZ3RpZCwgICAgICAgICAgICAgLy8gZ3RpZAorICAgICAgICB0YXNrLCAgICAgICAgICAgICAvLyB0YXNrIHN0cnVjdHVyZQorICAgICAgICAxLCAgICAgICAgICAgICAgICAvLyBpZiBjbGF1c2UgdmFsdWUKKyAgICAgICAgJnRhc2stPmxiLCAgICAgICAgLy8gbG93ZXIgYm91bmQKKyAgICAgICAgJnRhc2stPnViLCAgICAgICAgLy8gdXBwZXIgYm91bmQKKyAgICAgICAgU1RSSURFLCAgICAgICAgICAgLy8gbG9vcCBpbmNyZW1lbnQKKyAgICAgICAgMCwgICAgICAgICAgICAgICAgLy8gMSBpZiBub2dyb3VwIHNwZWNpZmllZAorICAgICAgICAyLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB0eXBlOiAwLW5vbmUsIDEtZ3JhaW5zaXplLCAyLW51bV90YXNrcworICAgICAgICBOLCAgICAgICAgICAgICAgICAvLyBzY2hlZHVsZSB2YWx1ZSAoaWdub3JlZCBmb3IgdHlwZSAwKQorICAgICAgICAodm9pZCopJl9fdGFza19kdXBfZW50cnkgLy8gdGFza3MgZHVwbGljYXRpb24gcm91dGluZQorICAgICAgICApOworICAgICAgfSAvLyBlbmQgbWFzdGVyCisgICAgfSAvLyBlbmQgcGFyYWxsZWwKKy8vIGNoZWNrIHJlc3VsdHMKKyAgICBpZiggaiAhPSBOKkdSQUlOKlNUUklERS1TVFJJREUgKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IgaW4gbGFzdHByaXZhdGUsICVkICE9ICVkXG4iLGosTipHUkFJTipTVFJJREUtU1RSSURFKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGlmKCBjb3VudGVyICE9IE4qR1JBSU4gKSB7CisgICAgICAgIHByaW50ZigiRXJyb3IsIGNvdW50ZXIgJWQgIT0gJWRcbiIsY291bnRlcixOKkdSQUlOKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorICAgIGZvciggaT0wOyBpPE47ICsraSApIHsKKyAgICAgICAgaWYoIHRoX2NvdW50ZXJbaV0gJSBHUkFJTiApIHsKKyAgICAgICAgICAgIHByaW50ZigiRXJyb3IsIHRoX2NvdW50ZXJbJWRdID0gJWRcbiIsaSx0aF9jb3VudGVyW2ldKTsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9CisgICAgfQorICAgIHByaW50ZigicGFzc2VkXG4iKTsKKyAgICByZXR1cm4gMDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL25lc3RlZF9wYXJhbGxlbF90YXNraW5nLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDM3NGQ2ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9uZXN0ZWRfcGFyYWxsZWxfdGFza2luZy5jCkBAIC0wLDAgKzEsMzIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG9tcC5oPgorCisvKgorICogVGhpcyB0ZXN0IHdvdWxkIGhhbmcgd2hlbiBsZXZlbCBpbnN0ZWFkIG9mIGFjdGl2ZSBsZXZlbAorICogdXNlZCB0byBwdXNoIHRhc2sgc3RhdGUuCisgKi8KKworaW50IG1haW4oKQoreworICAvLyBJZiBudW1fdGhyZWFkcyBpcyBjaGFuZ2VkIHRvIGEgdmFsdWUgZ3JlYXRlciB0aGFuIDEsIHRoZW4gdGhlIHRlc3QgcGFzc2VzCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDEpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHByaW50ZigiSGVsbG8gV29ybGQgZnJvbSB0aHJlYWQgJWRcbiIsIG9tcF9nZXRfdGhyZWFkX251bSgpKTsKKyAgfQorCisgIHByaW50Zigib21wX251bV90aHJlYWRzOiAlZFxuIiwgb21wX2dldF9tYXhfdGhyZWFkcygpKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgbWFzdGVyCisgICAgI3ByYWdtYSBvbXAgdGFzayBkZWZhdWx0KG5vbmUpCisgICAgeworICAgICAgcHJpbnRmKCIlZCBpcyBleGVjdXRpbmcgdGhpcyB0YXNrXG4iLCBvbXBfZ2V0X3RocmVhZF9udW0oKSk7CisgICAgfQorICB9CisKKyAgcHJpbnRmKCJwYXNzXG4iKTsKKyAgcmV0dXJuIDA7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1MzRhYmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFzaygpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0bworICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzaworICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgIGZvciAoaSA9IDE7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICByZXR1cm4gMTsKKyAgfQorICByZXR1cm4gMDsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maW5hbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmI1MzFhZjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfZmluYWwuYwpAQCAtMCwwICsxLDY1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgdGVzdF9vbXBfdGFza19maW5hbCgpCit7CisgIGludCB0aWRzW05VTV9UQVNLU107CisgIGludCBpbmNsdWRlZHRpZHNbTlVNX1RBU0tTXTsKKyAgaW50IGk7CisgIGludCBlcnJvciA9IDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgLyogRmlyc3Qgd2UgaGF2ZSB0byBzdG9yZSB0aGUgdmFsdWUgb2YgdGhlIGxvb3AgaW5kZXggaW4gYSBuZXcgdmFyaWFibGUKKyAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0bworICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgKi8KKyAgICAgICAgaW50IG15aTsKKyAgICAgICAgbXlpID0gaTsKKworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIGZpbmFsKGk+PTEwKQorICAgICAgICB7CisgICAgICAgICAgdGlkc1tteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgLyogd2UgZ2VuZXJhdGUgaW5jbHVkZWQgdGFza3MgZm9yIGZpbmFsIHRhc2tzICovCisgICAgICAgICAgaWYobXlpID49IDEwKSB7CisgICAgICAgICAgICBpbnQgaW5jbHVkZWQgPSBteWk7CisgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICAgICAgICBpbmNsdWRlZHRpZHNbaW5jbHVkZWRdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgaW5jbHVkZWQgdGFzayBvZiB0aGUgZmluYWwgdGFzayAqLworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgfSAvKiBlbmQgb2YgaWYgaXQgaXMgYSBmaW5hbCB0YXNrKi8KKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSBmaW5hbCB0YXNrIGFuZCBpdHMgaW5jbHVkZWQgdGFzay4gKi8KKyAgZm9yIChpID0gMTA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmICh0aWRzW2ldICE9IGluY2x1ZGVkdGlkc1tpXSkgeworICAgICAgZXJyb3IrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGVsX2Zvcl9wcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ZpbmFsKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maXJzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kMWY3YzM1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBpOworICBpbnQgc3VtID0gMTIzNDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IHJlc3VsdCA9IDA7IC8qIGNvdW50cyB0aGUgd3Jvbmcgc3VtcyBmcm9tIHRhc2tzICovCisKKyAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgICNwcmFnbWEgb21wIHRhc2sgZmlyc3Rwcml2YXRlKHN1bSkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICB9CisKKyAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICBpZiAoc3VtICE9IGtub3duX3N1bSkgeworICAgICAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIHsgcmVzdWx0Kys7IH0KKyAgICAgICAgICB9CisgICAgICAgIH0gLyogb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZm9yIGxvb3AgKi8KKyAgICB9IC8qIG9tcCBzaW5nbGUgKi8KKyAgfSAvKiBvbXAgcGFyYWxsZWwgKi8KKyAgcmV0dXJuIChyZXN1bHQgPT0gMCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaWYuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YjQ3MjhlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2lmLmMKQEAgLTAsMCArMSw0MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2tfaWYoKQoreworICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICBpbnQgY291bnQ7CisgIGludCByZXN1bHQ7CisKKyAgY291bnQ9MDsKKyAgY29uZGl0aW9uX2ZhbHNlID0gKGNvdW50ID09IDEpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgdGFzayBpZiAoY29uZGl0aW9uX2ZhbHNlKSBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgIHsKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHJlc3VsdCA9ICgwID09IGNvdW50KTsKKyAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgY291bnQgPSAxOworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisgIHJldHVybiByZXN1bHQ7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90YXNrX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45MDVhYjlhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoKQoreworICBpbnQgaT01OworICBpbnQgayA9IDA7CisgIGludCByZXN1bHQgPSAwOworICBpbnQgdGFza19yZXN1bHQgPSAxOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUoaSkKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChyZXN1bHQgLCB0YXNrX3Jlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgIGludCBqOworICAgICAgICAgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgaWYoaSAhPSA1KQorICAgICAgICAgICAgdGFza19yZXN1bHQgPSAwOworICAgICAgICAgIGZvcihqID0gMDsgaiA8IE5VTV9UQVNLUzsgaisrKQorICAgICAgICAgICAgaSsrOworICAgICAgICAgIC8vdGhpcyBzaG91bGQgYmUgZmlyc3Rwcml2YXRlIGltcGxpY2l0bHkKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKyAgICAgIHJlc3VsdCA9ICh0YXNrX3Jlc3VsdCAmJiBpPT01KTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIHJlc3VsdDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaW9yaXR5LmMgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfcHJpb3JpdHkuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YjYyMzYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaW9yaXR5LmMKQEAgLTAsMCArMSwyMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgJiYgZW52IE9NUF9NQVhfVEFTS19QUklPUklUWT00MiAlbGlib21wLXJ1bgorLy8gVGVzdCBPTVAgNC41IHRhc2sgcHJpb3JpdGllcworLy8gQ3VycmVudGx5IG9ubHkgQVBJIGZ1bmN0aW9uIGFuZCBlbnZpcmFibGUgcGFyc2luZyBpbXBsZW1lbnRlZC4KKy8vIFRlc3QgZW52aXJvbm1lbnQgc2V0cyBlbnZpcmFibGU6IE9NUF9NQVhfVEFTS19QUklPUklUWT00MiBhcyB0ZXN0ZWQgYmVsb3cuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworaW50IG1haW4gKHZvaWQpIHsKKyAgICBpbnQgcGFzc2VkOworCisgICAgcGFzc2VkID0gKG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSA9PSA0Mik7CisgICAgcHJpbnRmKCJHb3QgJWRcbiIsIG9tcF9nZXRfbWF4X3Rhc2tfcHJpb3JpdHkoKSk7CisKKyAgICBpZiAocGFzc2VkKSB7CisgICAgICAgcHJpbnRmKCJwYXNzZWRcbiIpOworICAgICAgIHJldHVybiAwOworICAgIH0KKworICAgIHByaW50ZigiZmFpbGVkXG4iKTsKKyAgICByZXR1cm4gMTsKK30KKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2E5MzcxNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza19wcml2YXRlLmMKQEAgLTAsMCArMSw1MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19wcml2YXRlKCkKK3sKKyAgaW50IGk7CisgIGludCBrbm93bl9zdW07CisgIGludCBzdW0gPSAwOworICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIHByaXZhdGUoc3VtKSBzaGFyZWQocmVzdWx0LCBrbm93bl9zdW0pCisgICAgICAgIHsKKyAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKyAgICAgICAgICBzdW0gPSAwOworICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICB9CisgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyAgICAgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgICB9CisgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3NoYXJlZC5jIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrX3NoYXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjAzMDQwMjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2tfc2hhcmVkLmMKQEAgLTAsMCArMSw0MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKCkKK3sKKyAgaW50IGk7CisgIGludCBrID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGk9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgZm9yIChrID0gMDsgayA8IE5VTV9UQVNLUzsgaysrKSB7CisgICAgICAjcHJhZ21hIG9tcCB0YXNrIHNoYXJlZChpKQorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgaSsrOworICAgICAgICAvL3RoaXMgc2hvdWxkIGJlIHNoYXJlZCBpbXBsaWNpdGx5CisgICAgICB9CisgICAgfQorICB9CisgIHJlc3VsdCA9IGk7CisgIHJldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3Rhc2tfaW1wX3NoYXJlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jIGIvcmMzL3J1bnRpbWUvdGVzdC90YXNraW5nL29tcF90YXNrd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmMzYTBlYTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t3YWl0LmMKQEAgLTAsMCArMSw3NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IHRlc3Rfb21wX3Rhc2t3YWl0KCkKK3sKKyAgaW50IHJlc3VsdDEgPSAwOyAgIC8qIFN0b3JlcyBudW1iZXIgb2Ygbm90IGZpbmlzaGVkIHRhc2tzIGFmdGVyIHRoZSB0YXNrd2FpdCAqLworICBpbnQgcmVzdWx0MiA9IDA7ICAgLyogU3RvcmVzIG51bWJlciBvZiB3cm9uZyBhcnJheSBlbGVtZW50cyBhdCB0aGUgZW5kICovCisgIGludCBhcnJheVtOVU1fVEFTS1NdOworICBpbnQgaTsKKworICAvKiBmaWxsIGFycmF5ICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICBhcnJheVtpXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvCisgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAqLworICAgICAgICBpbnQgbXlpOworICAgICAgICBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgIHsKKyAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBhcnJheVtteWldID0gMTsKKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgICAgI3ByYWdtYSBvbXAgdGFza3dhaXQKKyAgICAgIC8qIGNoZWNrIGlmIGFsbCB0YXNrcyB3ZXJlIGZpbmlzaGVkICovCisgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspCisgICAgICAgIGlmIChhcnJheVtpXSAhPSAxKQorICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUKKyAgICAgICAqIHRoZSB2YWx1ZXMgaW4gdGhlIHRpZHMgYXJyYXkgKi8KKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpbnQgbXlpOworICAgICAgICBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgIHsKKyAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgcmVzdWx0MisrOworICB9CisgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3QvdGFza2luZy9vbXBfdGFza3lpZWxkLmMgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjViYjY5ODQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3Rhc2tpbmcvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCB0ZXN0X29tcF90YXNreWllbGQoKQoreworICBpbnQgaTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHN0YXJ0X3RpZFtOVU1fVEFTS1NdOworICBpbnQgY3VycmVudF90aWRbTlVNX1RBU0tTXTsKKworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICBzdGFydF90aWRbaV09MDsKKyAgICBjdXJyZW50X3RpZFtpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgdGFzayB1bnRpZWQKKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLAorICAgICAgLy9pLCBzdGFydF90aWRbaV0sIGkgLCBjdXJyZW50X3RpZFtpXSk7CisgICAgaWYgKGN1cnJlbnRfdGlkW2ldID09IHN0YXJ0X3RpZFtpXSkKKyAgICAgIGNvdW50Kys7CisgIH0KKyAgcmV0dXJuIChjb3VudDxOVU1fVEFTS1MpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfdGFza3lpZWxkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmEzZGQ4MGQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGUuYwpAQCAtMCwwICsxLDEwMiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogIGxvY2FsIGNvcHkgZm9yIGVhY2ggdGhyZWFkLiBPdGhlcndpc2UgcmFjZSBjb25kaXRpb24gYW5kCisgKiAgd3JvbmcgcmVzdWx0LgorICogMi4gSWYgdGhlIHZhbHVlIG9mIGxvY2FsIGNvcHkgaXMgcmV0YWluZWQgZm9yIHRoZSB0d28gYWRqYWNlbnQKKyAqICBwYXJhbGxlbCByZWdpb25zCisgKi8KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBzdW0wPTA7CitzdGF0aWMgaW50IG15dmFsdWUgPSAwOworCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15dmFsdWUpCisKK2ludCB0ZXN0X29tcF90aHJlYWRwcml2YXRlKCkKK3sKKyAgaW50IHN1bSA9IDA7CisgIGludCBrbm93bl9zdW07CisgIGludCBpOworICBpbnQgaXRlcjsKKyAgaW50ICpkYXRhOworICBpbnQgc2l6ZTsKKyAgaW50IG51bV9mYWlsZWQgPSAwOworICBpbnQgbXlfcmFuZG9tOworICBvbXBfc2V0X2R5bmFtaWMoMCk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICB7CisgICAgc3VtMCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgfSAvKmVuZCBvZiBjcml0aWNhbCAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGlmIChrbm93bl9zdW0gIT0gc3VtICkgeworICAgIGZwcmludGYgKHN0ZGVyciwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorCisgIC8qIHRoZSBuZXh0IHBhcmFsbGVsIHJlZ2lvbiBpcyBqdXN0IHVzZWQgdG8gZ2V0IHRoZSBudW1iZXIgb2YgdGhyZWFkcyovCisgIG9tcF9zZXRfZHluYW1pYygwKTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIG1hc3RlcgorICAgIHsKKyAgICAgIHNpemU9b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgZGF0YT0oaW50KikgbWFsbG9jKHNpemUqc2l6ZW9mKGludCkpOworICAgIH0KKyAgfS8qIGVuZCBwYXJhbGxlbCovCisKKyAgc3JhbmQoNDUpOworICBmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspIHsKKyAgICBteV9yYW5kb20gPSByYW5kKCk7IC8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzCisgICAgICAgICAgICAgICAgIGNhbGxlZCBpbnNpZGUgc2VyaWFsIHJlZ2lvbiovCisKKyAgICAvKiB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl5ZSBteXZhbHVlCisgICAgICAgYW5kIHRoZSBhcnJheSB3aXRoIG15X3JhbmRvbStyYW5rICovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICBpbnQgcmFuazsKKyAgICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgICBteXZhbHVlID0gZGF0YVtyYW5rXSA9IG15X3JhbmRvbSArIHJhbms7CisgICAgfQorCisgICAgLyogdGhlIHNlY29uZCBwYXJhbGxlbCByZWdpb24gdmVyaWZpZXMgdGhhdCB0aGUKKyAgICAgICB2YWx1ZSBvZiAibXl2YWx1ZSIgaXMgcmV0YWluZWQgKi8KKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbCByZWR1Y3Rpb24oKzpudW1fZmFpbGVkKQorICAgIHsKKyAgICAgIGludCByYW5rOworICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyAgICAgIG51bV9mYWlsZWQgPSBudW1fZmFpbGVkICsgKG15dmFsdWUgIT0gZGF0YVtyYW5rXSk7CisgICAgICBpZihteXZhbHVlICE9IGRhdGFbcmFua10pIHsKKyAgICAgICAgZnByaW50ZiAoc3RkZXJyLCAiIG15dmFsdWUgPSAlZCwgZGF0YVtyYW5rXT0gJWRcbiIsCisgICAgICAgICAgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGZyZWUgKGRhdGEpOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFudW1fZmFpbGVkOworfSAvKiBlbmQgb2YgY2hlY2tfdGhyZWFkcHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF90aHJlYWRwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGVfZm9yLmMgYi9yYzMvcnVudGltZS90ZXN0L3RocmVhZHByaXZhdGUvb21wX3RocmVhZHByaXZhdGVfZm9yLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzM0MmU2MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3QvdGhyZWFkcHJpdmF0ZS9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpAQCAtMCwwICsxLDQ4IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgaTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSkKKworaW50IHRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKCkKK3sKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IHN1bTsKKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHN1bSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBzdW0wID0gMCwgaTA7CisgICAgI3ByYWdtYSBvbXAgZm9yCisgICAgZm9yIChpMCA9IDE7IGkwIDw9IExPT1BDT1VOVDsgaTArKykgeworICAgICAgaSA9IGkwOworICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgfQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGlmIChrbm93bl9zdW0gIT0gc3VtICkgeworICAgIGZwcmludGYoc3RkZXJyLCAiIGtub3duX3N1bSA9ICVkLCBzdW0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3RocmVhZHByaXZhdGVfZm9yKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9idWdfc2V0X3NjaGVkdWxlXzAuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2J1Z19zZXRfc2NoZWR1bGVfMC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4OWUyMzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9idWdfc2V0X3NjaGVkdWxlXzAuYwpAQCAtMCwwICsxLDQwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFRlc3QgdGhhdCB0aGUgY2h1bmsgc2l6ZSBpcyBzZXQgdG8gZGVmYXVsdCAoMSkgd2hlbgorICAgY2h1bmsgc2l6ZSA8PSAwIGlzIHNwZWNpZmllZCAqLworaW50IGEgPSAwOworCitpbnQgdGVzdF9zZXRfc2NoZWR1bGVfMCgpCit7CisgIGludCBpOworICBhID0gMDsKKyAgb21wX3NldF9zY2hlZHVsZShvbXBfc2NoZWRfZHluYW1pYywwKTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHJ1bnRpbWUpCisgICAgZm9yKGkgPSAwOyBpIDwgMTA7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICBhKys7CisgICAgICBpZihhID4gMTApCisgICAgICAgIGV4aXQoMSk7CisgICAgfQorICB9CisgIHJldHVybiBhPT0xMDsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfc2V0X3NjaGVkdWxlXzAoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9kb2Fjcm9zc19jaGVjay5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Iva21wX2RvYWNyb3NzX2NoZWNrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzBlZTIwMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9kb2Fjcm9zc19jaGVjay5jCkBAIC0wLDAgKzEsNTYgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjZGVmaW5lIE4gICAxMDAwCisKK3N0cnVjdCBkaW0geworICBsb25nIGxvbmcgbG87IC8vIGxvd2VyCisgIGxvbmcgbG9uZyB1cDsgLy8gdXBwZXIKKyAgbG9uZyBsb25nIHN0OyAvLyBzdHJpZGUKK307CitleHRlcm4gdm9pZCBfX2ttcGNfZG9hY3Jvc3NfaW5pdCh2b2lkKiwgaW50LCBpbnQsIHN0cnVjdCBkaW0gKik7CitleHRlcm4gdm9pZCBfX2ttcGNfZG9hY3Jvc3Nfd2FpdCh2b2lkKiwgaW50LCBsb25nIGxvbmcqKTsKK2V4dGVybiB2b2lkIF9fa21wY19kb2Fjcm9zc19wb3N0KHZvaWQqLCBpbnQsIGxvbmcgbG9uZyopOworZXh0ZXJuIHZvaWQgX19rbXBjX2RvYWNyb3NzX2Zpbmkodm9pZCosIGludCk7CitleHRlcm4gaW50IF9fa21wY19nbG9iYWxfdGhyZWFkX251bSh2b2lkKik7CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBpdGVyW05dOworICBzdHJ1Y3QgZGltIGRpbXM7CisgIGZvciggaSA9IDA7IGkgPCBOOyArK2kgKQorICAgIGl0ZXJbaV0gPSAxOworICBkaW1zLmxvID0gMTsKKyAgZGltcy51cCA9IE4tMTsKKyAgZGltcy5zdCA9IDE7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSwgZ3RpZDsKKyAgICBsb25nIGxvbmcgdmVjOworICAgIGd0aWQgPSBfX2ttcGNfZ2xvYmFsX3RocmVhZF9udW0oTlVMTCk7CisgICAgX19rbXBjX2RvYWNyb3NzX2luaXQoTlVMTCxndGlkLDEsJmRpbXMpOyAvLyB0aHJlYWQgc3RhcnRzIHRoZSBsb29wCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShkeW5hbWljKQorICAgIGZvciggaSA9IDE7IGkgPCBOOyArK2kgKQorICAgIHsKKyAgICAgIC8vIHJ1bnRpbWUgY2FsbCBjb3JyZXNwb25kaW5nIHRvICNwcmFnbWEgb21wIG9yZGVyZWQgZGVwZW5kKHNpbms6aS0xKQorICAgICAgdmVjPWktMTsKKyAgICAgIF9fa21wY19kb2Fjcm9zc193YWl0KE5VTEwsZ3RpZCwmdmVjKTsKKyAgICAgIC8vIHVzZXIncyBjb2RlCisgICAgICBpdGVyW2ldID0gaXRlcltpLTFdICsgMTsKKyAgICAgIC8vIHJ1bnRpbWUgY2FsbCBjb3JyZXNwb25kaW5nIHRvICNwcmFnbWEgb21wIG9yZGVyZWQgZGVwZW5kKHNvdXJjZSkKKyAgICAgIHZlYz1pOworICAgICAgX19rbXBjX2RvYWNyb3NzX3Bvc3QoTlVMTCxndGlkLCZ2ZWMpOworICAgIH0KKyAgICAvLyB0aHJlYWQgZmluaXNoZXMgdGhlIGxvb3AgKHNob3VsZCBiZSBiZWZvcmUgdGhlIGxvb3AgYmFycmllcikKKyAgICBfX2ttcGNfZG9hY3Jvc3NfZmluaShOVUxMLGd0aWQpOworICB9CisgIGlmKCBpdGVyW04tMV0gPT0gTiApIHsKKyAgICBwcmludGYoInBhc3NlZFxuIik7CisgIH0gZWxzZSB7CisgICAgcHJpbnRmKCJmYWlsZWQgJWQgIT0gJWRcbiIsIGl0ZXJbTi0xXSwgTik7CisgICAgcmV0dXJuIDE7CisgIH0KKyAgcmV0dXJuIDA7Cit9CisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL2ttcF9zZXRfZGlzcGF0Y2hfYnVmLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE2Mzc4ZmUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9rbXBfc2V0X2Rpc3BhdGNoX2J1Zi5jCkBAIC0wLDAgKzEsOTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlICYmICVsaWJvbXAtcnVuIDcKKy8vIFJVTjogJWxpYm9tcC1ydW4gMCAmJiAlbGlib21wLXJ1biAtMQorLy8gUlVOOiAlbGlib21wLXJ1biAxICYmICVsaWJvbXAtcnVuIDIgJiYgJWxpYm9tcC1ydW4gNQorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1ndWlkZWQgJiYgJWxpYm9tcC1ydW4gNworLy8gUlVOOiAlbGlib21wLXJ1biAxICYmICVsaWJvbXAtcnVuIDIgJiYgJWxpYm9tcC1ydW4gNQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bGltaXRzLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIElOQ1IgNworI2RlZmluZSBNWV9NQVggMjAwCisjZGVmaW5lIE1ZX01JTiAtMjAwCisjaWZuZGVmIE1ZX1NDSEVEVUxFCisjIGRlZmluZSBNWV9TQ0hFRFVMRSBkeW5hbWljCisjZW5kaWYKKworaW50IG51bV9kaXNwX2J1ZmZlcnMsIG51bV9sb29wczsKK2ludCBhLCBiLCBhX2tub3duX3ZhbHVlLCBiX2tub3duX3ZhbHVlOworCitpbnQgdGVzdF9rbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMoKQoreworICBpbnQgc3VjY2VzcyA9IDE7CisgIGEgPSAwOworICBiID0gMDsKKyAgLy8gcnVuIG1hbnkgc21hbGwgZHluYW1pYyBsb29wcyB0byBzdHJlc3MgdGhlIGRpc3BhdGNoIGJ1ZmZlciBzeXN0ZW0KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpLGo7CisgICAgZm9yIChqID0gMDsgaiA8IG51bV9sb29wczsgaisrKSB7CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoTVlfU0NIRURVTEUpIG5vd2FpdAorICAgICAgZm9yIChpID0gTVlfTUlOOyBpIDwgTVlfTUFYOyBpKz1JTkNSKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBhKys7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoTVlfU0NIRURVTEUpIG5vd2FpdAorICAgICAgZm9yIChpID0gTVlfTUFYOyBpID49IE1ZX01JTjsgaS09SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYisrOworICAgICAgfQorICAgIH0KKyAgfQorICAvLyBkZXRlY3QgZmFpbHVyZQorICBpZiAoYSAhPSBhX2tub3duX3ZhbHVlIHx8IGIgIT0gYl9rbm93bl92YWx1ZSkgeworICAgIHN1Y2Nlc3MgPSAwOworICAgIHByaW50ZigiYSA9ICVkIChzaG91bGQgYmUgJWQpLCBiID0gJWQgKHNob3VsZCBiZSAlZClcbiIsIGEsIGFfa25vd25fdmFsdWUsCisgICAgICAgICAgIGIsIGJfa25vd25fdmFsdWUpOworICB9CisgIHJldHVybiBzdWNjZXNzOworfQorCitpbnQgbWFpbihpbnQgYXJnYywgY2hhcioqIGFyZ3YpCit7CisgIGludCBpLGo7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgaWYgKGFyZ2MgIT0gMikgeworICAgIGZwcmludGYoc3RkZXJyLCAidXNhZ2U6ICVzIG51bV9kaXNwX2J1ZmZlcnNcbiIsIGFyZ3ZbMF0pOworICAgIGV4aXQoMSk7CisgIH0KKworICAvLyBzZXQgdGhlIG51bWJlciBvZiBkaXNwYXRjaCBidWZmZXJzCisgIG51bV9kaXNwX2J1ZmZlcnMgPSBhdG9pKGFyZ3ZbMV0pOworICBrbXBfc2V0X2Rpc3BfbnVtX2J1ZmZlcnMobnVtX2Rpc3BfYnVmZmVycyk7CisKKyAgLy8gZmlndXJlIG91dCB0aGUga25vd24gdmFsdWVzIHRvIGNvbXBhcmUgd2l0aCBjYWxjdWxhdGVkIHJlc3VsdAorICBhX2tub3duX3ZhbHVlID0gMDsKKyAgYl9rbm93bl92YWx1ZSA9IDA7CisKKyAgLy8gaWYgc3BlY2lmaWVkIHRvIHVzZSBiYWQgbnVtX2Rpc3BfYnVmZmVycyBzZXQgbnVtX2xvb3BzCisgIC8vIHRvIHNvbWV0aGluZyByZWFzb25hYmxlCisgIGlmIChudW1fZGlzcF9idWZmZXJzIDw9IDApCisgICAgbnVtX2xvb3BzID0gMTA7CisgIGVsc2UKKyAgICBudW1fbG9vcHMgPSBudW1fZGlzcF9idWZmZXJzKjEwOworCisgIGZvciAoaiA9IDA7IGogPCBudW1fbG9vcHM7IGorKykgeworICAgIGZvciAoaSA9IE1ZX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikKKyAgICAgIGFfa25vd25fdmFsdWUrKzsKKyAgICBmb3IgKGkgPSBNWV9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKQorICAgICAgYl9rbm93bl92YWx1ZSsrOworICB9CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X2ttcF9zZXRfZGlzcF9udW1fYnVmZmVycygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9iaWdib3VuZHMuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfYmlnYm91bmRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODJmNTc5YgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfYmlnYm91bmRzLmMKQEAgLTAsMCArMSw2NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1zdGF0aWMgJiYgJWxpYm9tcC1ydW4KKy8vIFJVTjogJWxpYm9tcC1jb21waWxlIC1ETVlfU0NIRURVTEU9ZHluYW1pYyAmJiAlbGlib21wLXJ1bgorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUgLURNWV9TQ0hFRFVMRT1ndWlkZWQgJiYgJWxpYm9tcC1ydW4KKy8vIFhGQUlMOiAqCisvKgorICogVGVzdCB0aGF0IGxhcmdlIGJvdW5kcyBhcmUgaGFuZGxlZCBwcm9wZXJseSBhbmQgY2FsY3VsYXRpb25zIG9mCisgKiBsb29wIGl0ZXJhdGlvbnMgZG9uJ3QgYWNjaWRlbnRseSBvdmVyZmxvdworICovCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDxsaW1pdHMuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKyNkZWZpbmUgSU5DUiA1MDAwMDAwMAorI2RlZmluZSBNWV9NQVggMjAwMDAwMDAwMAorI2RlZmluZSBNWV9NSU4gLTIwMDAwMDAwMDAKKyNpZm5kZWYgTVlfU0NIRURVTEUKKyMgZGVmaW5lIE1ZX1NDSEVEVUxFIHN0YXRpYworI2VuZGlmCisKK2ludCBhLCBiLCBhX2tub3duX3ZhbHVlLCBiX2tub3duX3ZhbHVlOworCitpbnQgdGVzdF9vbXBfZm9yX2JpZ2JvdW5kcygpCit7CisgIGEgPSAwOworICBiID0gMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkKKyAgICBmb3IgKGkgPSBJTlRfTUlOOyBpIDwgTVlfTUFYOyBpKz1JTkNSKSB7CisgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICBhKys7CisgICAgfQorICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShNWV9TQ0hFRFVMRSkKKyAgICBmb3IgKGkgPSBJTlRfTUFYOyBpID49IE1ZX01JTjsgaS09SU5DUikgeworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgYisrOworICAgIH0KKyAgfQorICBwcmludGYoImEgPSAlZCAoc2hvdWxkIGJlICVkKSwgYiA9ICVkIChzaG91bGQgYmUgJWQpXG4iLCBhLCBhX2tub3duX3ZhbHVlLCBiLCBiX2tub3duX3ZhbHVlKTsKKyAgcmV0dXJuIChhID09IGFfa25vd25fdmFsdWUgJiYgYiA9PSBiX2tub3duX3ZhbHVlKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBhX2tub3duX3ZhbHVlID0gMDsKKyAgZm9yIChpID0gSU5UX01JTjsgaSA8IE1ZX01BWDsgaSs9SU5DUikgeworICAgICAgYV9rbm93bl92YWx1ZSsrOworICB9CisKKyAgYl9rbm93bl92YWx1ZSA9IDA7CisgIGZvciAoaSA9IElOVF9NQVg7IGkgPj0gTVlfTUlOOyBpLT1JTkNSKSB7CisgICAgICBiX2tub3duX3ZhbHVlKys7CisgIH0KKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9iaWdib3VuZHMoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfY29sbGFwc2UuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfY29sbGFwc2UuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDgwODZkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTEgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseQorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIHN0YXRpYyBpbnQgbGFzdF9pOworICBpbnQgaXNsYXJnZXI7CisgIGlmIChpPT0xKQorICAgIGxhc3RfaT0wOworICBpc2xhcmdlciA9ICgoaSA+PSBsYXN0X2kpJiYoaSAtIGxhc3RfaTw9MSkpOworICBsYXN0X2kgPSBpOworICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpCit7CisgIGludCBpc19sYXJnZXIgPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaSxqOworICAgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgI3ByYWdtYSBvbXAgZm9yIHByaXZhdGUoaSxqKSBzY2hlZHVsZShzdGF0aWMsMSkgY29sbGFwc2UoMikgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgZm9yIChqID0xOyBqIDwxMDA7IGorKykgeworICAgICAgICAjcHJhZ21hIG9tcCBvcmRlcmVkCisgICAgICAgIG15X2lzbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcihpKSYmbXlfaXNsYXJnZXI7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICB9CisgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9jb2xsYXBzZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9maXJzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmM0MTIxYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCB0ZXN0X29tcF9mb3JfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisgIGludCB0aHJlYWRzbnVtOworCisgIHN1bSA9IDA7CisgIHN1bTAgPSAxMjM0NTsKKyAgc3VtMSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgIH0KKyAgICAvKiBzdW0wID0gMDsgKi8KKworICAgIGludCBpOworICAgICNwcmFnbWEgb21wIGZvciBmaXJzdHByaXZhdGUoc3VtMCkKKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICBzdW0wID0gc3VtMCArIGk7CisgICAgICBzdW0xID0gc3VtMDsKKyAgICB9ICAvKiBlbmQgb2YgZm9yICovCisKKyAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgIHsKKyAgICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgfSAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICBrbm93bl9zdW0gPSAxMjM0NSogdGhyZWFkc251bSsgKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjg4Njk0YjgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCB0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IGkwOworCisgIGkwID0gLTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTAgPSAwOworICAgIHsgIC8qIEJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisgICAgICBpbnQgaTsKKyAgICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgbGFzdHByaXZhdGUoaTApCisgICAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgaTAgPSBpOworICAgICAgfSAgLyogZW5kIG9mIGZvciAqLworICAgIH0gIC8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgIH0gIC8qIGVuZCBvZiBjcml0aWNhbCAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIGZwcmludGYoc3RkZXJyLCAia25vd25fc3VtID0gJWQgLCBzdW0gPSAlZFxuIixrbm93bl9zdW0sc3VtKTsKKyAgZnByaW50ZihzdGRlcnIsICJMT09QQ09VTlQgPSAlZCAsIGkwID0gJWRcbiIsTE9PUENPVU5ULGkwKTsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9ub3dhaXQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTVhNDc3NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw3NyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKgorICogVGhpcyB0ZXN0IHdpbGwgaGFuZyBpZiB0aGUgbm93YWl0IGlzIG5vdCB3b3JraW5nIHByb3Blcmx5LgorICoKKyAqIEl0IHJlbGllcyBvbiBhIHRocmVhZCBza2lwcGluZyB0byB0aGUgc2Vjb25kIGZvciBjb25zdHJ1Y3QgdG8KKyAqIHJlbGVhc2UgdGhlIHRocmVhZHMgaW4gdGhlIGZpcnN0IGZvciBjb25zdHJ1Y3QuCisgKgorICogQWxzbywgd2UgdXNlIHN0YXRpYyBzY2hlZHVsaW5nIHRvIGd1YXJhbnRlZSB0aGF0IG9uZQorICogdGhyZWFkIHdpbGwgbWFrZSBpdCB0byB0aGUgc2Vjb25kIGZvciBjb25zdHJ1Y3QuCisgKi8KK3ZvbGF0aWxlIGludCByZWxlYXNlOwordm9sYXRpbGUgaW50IGNvdW50OworCit2b2lkIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBmb3IgY29uc3RydWN0IgorICAgICIgYW5kIHdhaXRzLlxuIiwgcmFuayk7CisgIHdoaWxlIChyZWxlYXNlID09IDApOworICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgY291bnQrKzsKK30KKwordm9pZCByZWxlYXNlX2FuZF9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIHNldHMgcmVsZWFzZSB0byAxXG4iLCByYW5rKTsKKyAgcmVsZWFzZSA9IDE7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCitpbnQgdGVzdF9vbXBfZm9yX25vd2FpdCgpCit7CisgIHJlbGVhc2UgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCByYW5rOworICAgIGludCBpOworCisgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgZm9yIChpID0gMDsgaSA8IDQ7IGkrKykgeworICAgICAgaWYgKGkgPCAzKQorICAgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgICAgZWxzZSB7CisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBmb3IgYW5kIGdvZXMgIgorICAgICAgICAgICJpbW1lZGlhdGVseSB0byB0aGUgbmV4dCBmb3IgY29uc3RydWN0IHRvIHJlbGVhc2UuXG4iLCByYW5rKTsKKyAgICAgICAgI3ByYWdtYSBvbXAgYXRvbWljCisgICAgICAgIGNvdW50Kys7CisgICAgICB9CisgICAgfQorCisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykKKyAgICBmb3IgKGkgPSAwOyBpIDwgNDsgaSsrKSB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisgIH0KKyAgcmV0dXJuIChjb3VudD09OCk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfbm93YWl0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX29yZGVyZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4YWM3ZWIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX29yZGVyZWQuYwpAQCAtMCwwICsxLDYwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseQorICAgd2l0aCBlYWNoIGNhbGwgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlciAoaW50IGkpCit7CisgIGludCBpc2xhcmdlcjsKKyAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgIGxhc3RfaSA9IGk7CisgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoKQoreworICBpbnQgc3VtOworICBpbnQgaXNfbGFyZ2VyID0gMTsKKyAgaW50IGtub3duX3N1bTsKKworICBsYXN0X2kgPSAwOworICBzdW0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBpbnQgbXlfaXNsYXJnZXIgPSAxOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsMSkgb3JkZXJlZAorICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykgeworICAgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgICAgeworICAgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkgJiYgbXlfaXNsYXJnZXI7CisgICAgICAgIHN1bSA9IHN1bSArIGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9vcmRlcmVkKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3JfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmNTM3YjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3ByaXZhdGUuYwpAQCAtMCwwICsxLDYzIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yaygpCit7CisgIGludCBpOworICBkb3VibGUgc3VtID0gMDsKKyAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKyAgc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICB9Cit9CisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX3ByaXZhdGUoKQoreworICBpbnQgc3VtID0gMDsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtMCA9IDA7ICAvKiBzZXR0aW5nIChnbG9iYWwpIHN1bTAgPSAwICovCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHN1bTEgPSAwOyAgLyogc2V0dGluZyBzdW0xIGluIGVhY2ggdGhyZWFkIHRvIDAgKi8KKyAgICB7ICAvKiBiZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworICAgICAgaW50IGk7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShzdW0wKSBzY2hlZHVsZShzdGF0aWMsMSkKKyAgICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICAgc3VtMCA9IHN1bTE7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgZG9fc29tZV93b3JrICgpOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBzdW0xID0gc3VtMDsKKyAgICAgIH0KKyAgICB9ICAvKiBlbmQgb2Ygb3JwaGFuZWQgYmxvY2sgKi8KKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9ICAvKmVuZCBvZiBjcml0aWNhbCovCisgIH0gIC8qIGVuZCBvZiBwYXJhbGxlbCovCisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3JlZHVjdGlvbi5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOGYwOTA3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDMzOSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwICAvKiAxMCEgKi8KKworaW50IHRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24gKCkKK3sKKyAgZG91YmxlIGR0OworICBpbnQgc3VtOworICBpbnQgZGlmZjsKKyAgaW50IHByb2R1Y3QgPSAxOworICBkb3VibGUgZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IGxvZ2ljX2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X2FuZDsKKyAgaW50IGJpdF9vcjsKKyAgaW50IGV4Y2x1c2l2X2JpdF9vcjsKKyAgaW50ICpsb2dpY3M7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworICBpbnQga25vd25fcHJvZHVjdDsKKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yID0gMS5FLTk7IC8qIG92ZXIgYWxsIHJvdW5kaW5nIGVycm9yIHRvIGJlCisgICAgICAgICAgICAgICAgICAgIGlnbm9yZWQgaW4gdGhlIGRvdWJsZSB0ZXN0cyAqLworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0ID0gMDsKKyAgaW50IGxvZ2ljc0FycmF5W0xPT1BDT1VOVF07CisKKyAgLyogVmFyaWFibGVzIGZvciBpbnRlZ2VyIHRlc3RzICovCisgIHN1bSA9IDA7CisgIHByb2R1Y3QgPSAxOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgIGR0ID0gMS4gLyAzLjsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZHN1bSA9IDAuOworICAvKiBWYXJpYWJlbGVzIGZvciBsb2dpYyAgdGVzdHMgKi8KKyAgbG9naWNzID0gbG9naWNzQXJyYXk7CisgIGxvZ2ljX2FuZCA9IDE7CisgIGxvZ2ljX29yID0gMDsKKyAgLyogVmFyaWFiZWxlcyBmb3IgYml0IG9wZXJhdG9ycyB0ZXN0cyAqLworICBiaXRfYW5kID0gMTsKKyAgYml0X29yID0gMDsKKyAgLyogVmFyaWFibGVzIGZvciBleGNsdXNpdiBiaXQgb3IgKi8KKyAgZXhjbHVzaXZfYml0X29yID0gMDsKKworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICAvKiogVGVzdHMgZm9yIGludGVnZXJzICAgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgaW50ZWdlciBhZGRpdGlvbiAqKioqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCs6c3VtKQorICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyAgICAgIHN1bSA9IHN1bSArIGo7CisgICAgfQorICB9CisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKSB7CisgICAgICBkaWZmID0gZGlmZiAtIGo7CisgICAgfQorICB9CisgIGlmIChkaWZmICE9IDApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBpbnRlZ2VyIG11bHRpcGxpY2F0aW9uICoqKiovCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKSB7CisgICAgICBwcm9kdWN0ICo9IGo7CisgICAgfQorICB9CisgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICBpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyAgLyoqIFRlc3RzIGZvciBkb3VibGVzICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGRvdWJsZSBhZGRpdGlvbiAqKioqLworICBkc3VtID0gMC47CisgIGRwdCA9IDEuOworICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKSB7CisgICAgZHB0ICo9IGR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigrOmRzdW0pCisgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykgeworICAgICAgZHN1bSArPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mOiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIC8qKioqIFRlc3RpbmcgZG91YmxlIHN1YnRyYWN0aW9uICoqKiovCisgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKSB7CisgICAgICBkZGlmZiAtPSBwb3cgKGR0LCBqKTsKKyAgICB9CisgIH0KKyAgaWYgKGZhYnMgKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLCBkZGlmZik7CisgIH0KKworCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgbG9naWNhbCB2YWx1ZXMgICAgICAgICAgICAgICAgICAgICAgICoqLworICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisgIC8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmKGxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICBsb2dpY3NbaV0gPSAwOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAobG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisgIC8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKworICAvKioqKiBUZXN0aW5nIGJpdCBhbmQgKioqKi8KKyAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKSB7CisgICAgbG9naWNzW2ldID0gMTsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2pdKTsKKyAgICB9CisgIH0KKyAgaWYgKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmIChzdGRlcnIsICJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICAvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICBsb2dpY3NbaV0gPSAwOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIGludCBqOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opIHsKKyAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKyAgICB9CisgIH0KKyAgaWYgKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYgKHN0ZGVyciwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworICAgIGxvZ2ljc1tpXSA9IDA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGo7CisgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikgeworICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2pdOworICAgIH0KKyAgfQorICBpZiAoZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgajsKKyAgICAjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKSB7CisgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisgICAgfQorICB9CisgIGlmICghZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisgIH0KKworICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKKyAgZnJlZSAobG9naWNzKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9yZWR1Y3Rpb24oKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDc1NjE3YwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfYXV0by5jCkBAIC0wLDAgKzEsNjkgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgdGVzdF9vbXBfZm9yX2F1dG8oKQoreworICBpbnQgajsKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisgIGludCB0aHJlYWRzbnVtOworCisgIHN1bSA9IDA7CisgIHN1bTAgPSAxMjM0NTsKKworICAvLyBhcnJheSB3aGljaCBrZWVwcyB0cmFjayBvZiB3aGljaCB0aHJlYWRzIHBhcnRpY2lwYXRlZCBpbiB0aGUgZm9yIGxvb3AKKyAgLy8gZS5nLiwgZ2l2ZW4gNCB0aHJlYWRzLCBbIDAgfCAxIHwgMSB8IDAgXSBpbXBsaWVzCisgIC8vICAgICAgIHRocmVhZHMgMCBhbmQgMyBkaWQgbm90LCB0aHJlYWRzIDEgYW5kIDIgZGlkCisgIGludCBtYXhfdGhyZWFkcyA9IG9tcF9nZXRfbWF4X3RocmVhZHMoKTsKKyAgaW50KiBhY3RpdmVfdGhyZWFkcyA9IChpbnQqKW1hbGxvYyhzaXplb2YoaW50KSptYXhfdGhyZWFkcyk7CisgIGZvcihqID0gMDsgaiA8IG1heF90aHJlYWRzOyBqKyspCisgICAgYWN0aXZlX3RocmVhZHNbal0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICBpbnQgaTsKKyAgICBzdW0xID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmb3IgZmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pCisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykgeworICAgICAgYWN0aXZlX3RocmVhZHNbb21wX2dldF90aHJlYWRfbnVtKCldID0gMTsKKyAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgIHN1bTEgPSBzdW0wOworICAgIH0KKworICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgeworICAgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICB9CisgIH0KKworICAvLyBjb3VudCB0aGUgdGhyZWFkcyB0aGF0IHBhcnRpY2lwYXRlZCAoc3VtIGlzIHN0b3JlZCBpbiB0aHJlYWRzbnVtKQorICB0aHJlYWRzbnVtPTA7CisgIGZvcihqID0gMDsgaiA8IG1heF90aHJlYWRzOyBqKyspIHsKKyAgICBpZihhY3RpdmVfdGhyZWFkc1tqXSkKKyAgICAgIHRocmVhZHNudW0rKzsKKyAgfQorICBmcmVlKGFjdGl2ZV90aHJlYWRzKTsKKworICBrbm93bl9zdW0gPSAxMjM0NSAqIHRocmVhZHNudW0gKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9CisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3JfYXV0bygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42ZDRmNTliCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKQEAgLTAsMCArMSw4OSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorLyoKKyAqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyAqIE1ldGhvZDogY2FjdWxhdGUgaG93IG1hbnkgdGltZXMgdGhlIGl0ZXJhdGlvbiBzcGFjZSBpcyBkaXNwYXRjaGVkCisgKiAgICAgYW5kIGp1ZGdlIGlmIGVhY2ggZGlzcGF0Y2ggaGFzIHRoZSByZXF1ZXN0ZWQgY2h1bmsgc2l6ZQorICogICAgIHVubGVzcyBpdCBpcyB0aGUgbGFzdCBvbmUuCisgKiBJdCBpcyBwb3NzaWJsZSBmb3IgdHdvIGFkamFjZW50IGNodW5rcyBhcmUgYXNzaWduZWQgdG8gdGhlIHNhbWUgdGhyZWFkCisgKiBNb2RpZmllZCBieSBDaHVuaHVhIExpYW8KKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIENGRE1BWF9TSVpFIDEwMAorY29uc3QgaW50IGNodW5rX3NpemUgPSA3OworCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMoKQoreworICBpbnQgdGlkOworICBpbnQgKnRpZHM7CisgIGludCBpOworICBpbnQgdGlkc0FycmF5W0NGRE1BWF9TSVpFXTsKKyAgaW50IGNvdW50ID0gMDsKKyAgaW50IHRtcF9jb3VudCA9IDA7IC8qZGlzcGF0Y2ggdGltZXMqLworICBpbnQgKnRtcDsgIC8qc3RvcmUgY2h1bmsgc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaCovCisgIGludCByZXN1bHQgPSAwOworCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZSh0aWQpIHNoYXJlZCh0aWRzKQorICB7ICAgICAgICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGludCB0aWQ7CisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLGNodW5rX3NpemUpCisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspIHsKKyAgICAgIHRpZHNbaV0gPSB0aWQ7CisgICAgfQorICB9CisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKSB7CisgICAgaWYgKHRpZHNbaV0gIT0gdGlkc1tpICsgMV0pIHsKKyAgICAgIGNvdW50Kys7CisgICAgfQorICB9CisKKyAgdG1wID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChjb3VudCArIDEpKTsKKyAgdG1wWzBdID0gMTsKKworICBmb3IgKGkgPSAwOyBpIDwgQ0ZETUFYX1NJWkUgLSAxOyArK2kpIHsKKyAgICBpZiAodG1wX2NvdW50ID4gY291bnQpIHsKKyAgICAgIHByaW50ZiAoIi0tLS0tLS0tLS0tLS0tLS0tLS0tXG5UZXN0aW50ZXJuYWwgRXJyb3I6IExpc3QgdG9vIHNtYWxsISEhXG4tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7ICAvKiBFcnJvciBoYW5kbGluZyAqLworICAgICAgYnJlYWs7CisgICAgfQorICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKSB7CisgICAgICB0bXBfY291bnQrKzsKKyAgICAgIHRtcFt0bXBfY291bnRdID0gMTsKKyAgICB9IGVsc2UgeworICAgICAgdG1wW3RtcF9jb3VudF0rKzsKKyAgICB9CisgIH0KKyAgLyogaXMgZHluYW1pYyBzdGF0ZW1lbnQgd29ya2luZz8gKi8KKyAgZm9yIChpID0gMDsgaSA8IGNvdW50OyBpKyspIHsKKyAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgeworICAgICAgLyogaXQgaXMgcG9zc2libGUgZm9yIDIgYWRqYWNlbnQgY2h1bmtzIGFzc2lnbmVkIHRvIGEgc2FtZSB0aHJlYWQgKi8KKyAgICAgIHJlc3VsdCsrOworICAgICAgZnByaW50ZihzdGRlcnIsIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICAgICAgLyogcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsgKi8KKyAgICB9CisgIH0KKyAgaWYgKCh0bXBbY291bnRdJWNodW5rX3NpemUpIT0oQ0ZETUFYX1NJWkUlY2h1bmtfc2l6ZSkpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwidGhlIGxhc3QgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS5cbiIpOworICB9CisgIC8qIGZvciAoaW50IGk9MDtpPGNvdW50KzE7KytpKSBwcmludGYoIiVkXHQ6PVx0JWRcbiIsaSsxLHRtcFtpXSk7ICovCisgIHJldHVybiAocmVzdWx0PT0wKTsKK30KK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMWVlNzQ0OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKQEAgLTAsMCArMSwyMTcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKworLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgIDE0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgOAorICogMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICA3CisgKiAwIDAgMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgIDcKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FICAwLjAwNQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDEKKyNlbmRpZgorCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpCit7CisgIGludCAqIHRpZHM7CisgIGludCAqIGNodW5rc2l6ZXM7CisgIGludCBub3RvdXQ7CisgIGludCBtYXhpdGVyOworICBpbnQgdGhyZWFkczsKKyAgaW50IGk7CisgIGludCByZXN1bHQ7CisKKyAgdGlkcyA9IChpbnQgKikgbWFsbG9jIChzaXplb2YgKGludCkgKiAoQ0ZTTUFYX1NJWkUgKyAxKSk7CisgIG1heGl0ZXIgPSAwOworICByZXN1bHQgPSAxOworICBub3RvdXQgPSAxOworCisgIC8qIFRlc3RpbmcgaWYgZW5vdWdoIHRocmVhZHMgYXJlIGF2YWlsYWJsZSBmb3IgdGhpcyBjaGVjay4gKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzKCk7CisgICAgfQorICB9CisKKyAgLyogZW5zdXJlIHRoZXJlIGFyZSBhdCBsZWFzdCB0d28gdGhyZWFkcyAqLworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisKKyAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6CisgICAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgIGRvdWJsZSBjb3VudDsKKyAgICBpbnQgdGlkOworICAgIGludCBqOworCisgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisgICAgI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCBzY2hlZHVsZShndWlkZWQpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICB3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgIGNvdW50ICs9IFNMRUVQVElNRTsKKyNpZmRlZiBWRVJCT1NFCisgICAgICAgIHByaW50ZigiLiIpOworI2VuZGlmCisgICAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgICAgaWYgKGNvdW50ID4gMC4pIHByaW50ZigiIHdhaXRlZCAlbGYgc1xuIiwgY291bnQpOworI2VuZGlmCisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworICAgICAgdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisgICAgICBwcmludGYoIiVkIGZpbmlzaGVkIGJ5ICVkXG4iLGosdGlkKTsKKyNlbmRpZgorICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIG5vdG91dCA9IDA7CisgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAqCisgICAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworICB7CisgICAgaW50IGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKyAgICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisgICAgaW50IGdsb2JhbF9jaHVua25yID0gMDsKKyAgICBpbnQgb3BlbndvcmsgPSBDRlNNQVhfU0laRTsKKyAgICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKyAgICBpbnQqIGxvY2FsX2NodW5rbnIgPSAoaW50KiltYWxsb2ModGhyZWFkcyAqIHNpemVvZihpbnQpKTsKKyAgICBkb3VibGUgYyA9IDE7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgdGhyZWFkczsgaSsrKQorICAgICAgbG9jYWxfY2h1bmtucltpXSA9IDA7CisKKyAgICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgLyoKKyAgICAgKiBkZXRlcm1pbmUgdGhlIG51bWJlciBvZiBnbG9iYWwgY2h1bmtzCisgICAgICovCisgICAgLy8gZnByaW50ZihzdGRlcnIsIiMgZ2xvYmFsX2NodW5rbnIgdGhyZWFkIGxvY2FsX2NodW5rbnIgY2h1bmtzaXplXG4iKTsKKyAgICBmb3IoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgaWYgKGxhc3RfdGhyZWFkbnI9PXRpZHNbaV0pIHsKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUrKzsKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIGZwcmludGYoc3RkZXJyLCAiJWRcdCVkXHQlZFx0JWRcbiIsIGdsb2JhbF9jaHVua25yLAorICAgICAgICAgICBsYXN0X3RocmVhZG5yLCBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdLCBtKTsgKi8KKyAgICAgICAgZ2xvYmFsX2NodW5rbnIrKzsKKyAgICAgICAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworICAgICAgICBsYXN0X3RocmVhZG5yID0gdGlkc1tpXTsKKyAgICAgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgICAgfQorICAgIH0KKyAgICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworICAgIGNodW5rc2l6ZXMgPSAoaW50KiltYWxsb2MoZ2xvYmFsX2NodW5rbnIgKiBzaXplb2YoaW50KSk7CisKKyAgICAvKgorICAgICogRXZhbHVhdGUgdGhlIHNpemVzIG9mIHRoZSBnbG9iYWwgY2h1bmtzCisgICAgKi8KKyAgICBnbG9iYWxfY2h1bmtuciA9IDA7CisgICAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworICAgIGxhc3RfdGhyZWFkbnIgPSB0aWRzWzBdOworICAgIGZvciAoaSA9IDE7IGkgPD0gQ0ZTTUFYX1NJWkU7ICsraSkgeworICAgICAgLyogSWYgdGhlIHRocmVhZG51bWJlciB3YXMgdGhlIHNhbWUgYXMgYmVmb3JlIGluY3JlYXNlIHRoZQorICAgICAgICogZGV0ZWN0ZWQgY2h1bmtzaXplIGZvciB0aGlzIGNodW5rIG90aGVyd2lzZSBzZXQgdGhlIGRldGVjdGVkCisgICAgICAgKiBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQKKyAgICAgICAqIHRocmVhZCBpbiBsYXN0X3RocmVhZG5yLgorICAgICAgICovCisgICAgICBpZiAobGFzdF90aHJlYWRuciA9PSB0aWRzW2ldKSB7CisgICAgICAgIGRldGVybWluZWRfY2h1bmtzaXplKys7CisgICAgICB9IGVsc2UgeworICAgICAgICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworICAgICAgICBnbG9iYWxfY2h1bmtucisrOworICAgICAgICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisgICAgICAgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworICAgICAgICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisgICAgICB9CisgICAgfQorCisjaWZkZWYgVkVSQk9TRQorICAgIGZwcmludGYoc3RkZXJyLCAiZm91bmRcdGV4cGVjdGVkXHRjb25zdGFudFxuIik7CisjZW5kaWYKKworICAgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwKKyAgICAgICBkZWNyZWFzZSBvZiB0aGUgY2h1bmtzaXplICovCisgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKyAgICBjID0gKGRvdWJsZSkgY2h1bmtzaXplc1swXSAvIGV4cGVjdGVkX2NodW5rX3NpemU7CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgZ2xvYmFsX2NodW5rbnI7IGkrKykgeworICAgICAgLyogY2FsY3VsYXRlIHRoZSBuZXcgZXhwZWN0ZWQgY2h1bmtzaXplICovCisgICAgICBpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpCisgICAgICAgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiJThkXHQlOGRcdCVsZlxuIiwgY2h1bmtzaXplc1tpXSwKKyAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSwgYyAqIGNodW5rc2l6ZXNbaV0vZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisjZW5kaWYKKyAgICAgIC8qIGNoZWNrIGlmIGNodW5rc2l6ZSBpcyBpbnNpZGUgdGhlIHJvdW5kaW5nIGVycm9ycyAqLworICAgICAgaWYgKGFicyAoY2h1bmtzaXplc1tpXSAtIGV4cGVjdGVkX2NodW5rX3NpemUpID49IDIpIHsKKyAgICAgICAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorICAgICAgICBmcHJpbnRmKHN0ZGVyciwgIkNodW5rc2l6ZSBkaWZmZXJlZCBmcm9tIGV4cGVjdGVkICIKKyAgICAgICAgICAidmFsdWU6ICVkIGluc3RlYWQgb2YgJWRcbiIsIGNodW5rc2l6ZXNbaV0sCisgICAgICAgICAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisgICAgICAgIHJldHVybiAwOworI2VuZGlmCisgICAgICB9IC8qIGVuZCBpZiAqLworCisjaWZuZGVmIFZFUkJPU0UKKyAgICAgIGlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDApCisgICAgICAgIGZwcmludGYoc3RkZXJyLCAiQ2h1bmtzaXplIGRpZCBub3QgZGVjcmVhc2U6ICVkIgorICAgICAgICAgICIgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisgICAgICAvKiBjYWxjdWxhdGluZyB0aGUgcmVtYWluaW5nIGFtb3VudCBvZiB3b3JrICovCisgICAgICBvcGVud29yayAtPSBjaHVua3NpemVzW2ldOworICAgIH0KKyAgfQorICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZCgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZjQ2YTU0NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljLmMKQEAgLTAsMCArMSwxNTQgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FIDAuMDEKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDA1CisjZW5kaWYKKworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisKKyAgY2h1bmtfc2l6ZSA9IDc7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxjb3VudGVyKQorICB7ICAvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCk7CisgICAgfSAgLyogZW5kIG9mIHNpbmdsZSAqLworICB9ICAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpIHsKKyAgICBvbXBfc2V0X251bV90aHJlYWRzKDIpOworICAgIHRocmVhZHMgPSAyOworICB9CisgIGZwcmludGYgKHN0ZGVyciwiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgJWRcblVzaW5nIGEgc3BlY2lmaWVkIgorICAgICIgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgIHRpZHNbQ0ZTTUFYX1NJWkVdID0gLTE7ICAvKiBzZXR0aW5nIGVuZGZsYWcgKi8KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgIHsgLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICBkb3VibGUgY291bnQ7CisgICAgaW50IHRpZDsKKyAgICBpbnQgajsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworICAgICNwcmFnbWEgb21wIGZvciBub3dhaXQgc2NoZWR1bGUoc3RhdGljLGNodW5rX3NpemUpCisgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikgeworICAgICAgY291bnQgPSAwLjsKKyAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIpCisgICAgICBpZiAoaiA+IG1heGl0ZXIpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIG1heGl0ZXIgPSBqOworICAgICAgICB9CisgICAgICB9CisgICAgICAvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworICAgICAgd2hpbGUgKG5vdG91dCAmJiAoY291bnQgPCBNQVhfVElNRSkgJiYgKG1heGl0ZXIgPT0gaikpIHsKKyAgICAgICAgI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgIG15X3NsZWVwIChTTEVFUFRJTUUpOworICAgICAgICBjb3VudCArPSBTTEVFUFRJTUU7CisgICAgICAgIHByaW50ZigiLiIpOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgYXdha2VcbiIsIHRpZCk7Ki8KKyAgICAgIHRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorICAgICAgcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICBub3RvdXQgPSAwOworICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgbGFzdHRpZCA9IHRpZHNbMF07CisgIHRtcF9jb3VudCA9IDA7CisKKyAgZm9yIChpID0gMDsgaSA8IENGU01BWF9TSVpFICsgMTsgKytpKSB7CisgICAgLyogSWYgdGhlIHdvcmsgIHdhcyBkb25lIGJ5IHRoZSBzYW1lIHRocmVhZCBpbmNyZWFzZSB0bXBfY291bnQgYnkgb25lLiAqLworICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKyAgICAgIHRtcF9jb3VudCsrOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nCisgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKHRpZHNbaV0gPT0gKGxhc3R0aWQgKyAxKSAlIHRocmVhZHMgfHwgdGlkc1tpXSA9PSAtMSkgeworICAgICAgLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisgICAgICBpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKyAgICAgICAgdG1wX2NvdW50ID0gMTsKKyAgICAgICAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPS1xuIik7CisjZW5kaWYKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworICAgICAgICBpZiAodGlkc1tpXSA9PSAtMSkgeworICAgICAgICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJMYXN0IHRocmVhZCBoYWQgY2h1bmsgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgdG1wX2NvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIgorICAgICAgICAgICAgICAiIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCIKKyAgICAgICAgICAgICIgd2FzICVkKVxuIiwgdG1wX2NvdW50LCBjaHVua19zaXplKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIgorICAgICAgICAiIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgIH0KKworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjkyMmYyN2EKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKQEAgLTAsMCArMSwyMDIgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworI2RlZmluZSBDRlNNQVhfU0laRSAxMDAwCisjZGVmaW5lIE1BWF9USU1FIDAuMDEKKworI2lmZGVmIFNMRUVQVElNRQorI3VuZGVmIFNMRUVQVElNRQorI2RlZmluZSBTTEVFUFRJTUUgMC4wMDA1CisjZW5kaWYKKworI2RlZmluZSBWRVJCT1NFIDAKKworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMygpCit7CisgIGludCB0aHJlYWRzOworICBpbnQgaSxsYXN0dGlkOworCisgIGludCAqIHRpZHM7CisgIGludCAqIHRpZHMyOworICBpbnQgbm90b3V0OworICBpbnQgbWF4aXRlcjsKKyAgaW50IGNodW5rX3NpemU7CisKKyAgaW50IGNvdW50ZXIgPSAwOworICBpbnQgdG1wX2NvdW50PTE7CisgIGludCBsYXN0dGhyZWFkc3N0YXJ0dGlkID0gLTE7CisgIGludCByZXN1bHQgPSAxOworICBjaHVua19zaXplID0gNzsKKworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKyAgbm90b3V0ID0gMTsKKyAgbWF4aXRlciA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgeyAgLyogYmVnaW4gb2YgcGFyYWxsZWwqLworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIHRocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0gIC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgLyogRW5zdXJlIHRoYXQgYXQgbGVhc3QgdHdvIHRocmVhZHMgYXJlIGNyZWF0ZWQgKi8KKyAgaWYgKHRocmVhZHMgPCAyKSB7CisgICAgb21wX3NldF9udW1fdGhyZWFkcygyKTsKKyAgICB0aHJlYWRzID0gMjsKKyAgfQorICBmcHJpbnRmIChzdGRlcnIsIlVzaW5nIGFuIGludGVybmFsIGNvdW50IG9mICVkXG5Vc2luZyBhIgorICAgICIgc3BlY2lmaWVkIGNodW5rc2l6ZSBvZiAlZFxuIiwgQ0ZTTUFYX1NJWkUsIGNodW5rX3NpemUpOworICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOyAgLyogc2V0dGluZyBlbmRmbGFnICovCisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMpCisgIHsgIC8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgZG91YmxlIGNvdW50OworICAgIGludCB0aWQ7CisgICAgaW50IGo7CisKKyAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKyAgICAjcHJhZ21hIG9tcCBmb3Igbm93YWl0IHNjaGVkdWxlKHN0YXRpYyxjaHVua19zaXplKQorICAgIGZvcihqID0gMDsgaiA8IENGU01BWF9TSVpFOyArK2opIHsKKyAgICAgIGNvdW50ID0gMC47CisgICAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorICAgICAgaWYgKGogPiBtYXhpdGVyKSB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBtYXhpdGVyID0gajsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKyAgICAgIHdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKSB7CisgICAgICAgICNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKyAgICAgICAgY291bnQgKz0gU0xFRVBUSU1FOworICAgICAgICBwcmludGYoIi4iKTsKKyAgICAgIH0KKyNpZmRlZiBWRVJCT1NFCisgICAgICBpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKyAgICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisgICAgICB0aWRzW2pdID0gdGlkOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIHByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgfSAvKiBlbmQgb2Ygb21wIHBhcmFsbGVsIGZvciAqLworCisgICAgbm90b3V0ID0gMDsKKyAgICAjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAvKioqKiBhbmFseXNpbmcgdGhlIGRhdGEgaW4gYXJyYXkgdGlkcyAqKioqLworCisgIGxhc3R0aWQgPSB0aWRzWzBdOworICB0bXBfY291bnQgPSAwOworCisgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkgeworICAgIC8qIElmIHRoZSB3b3JrICB3YXMgZG9uZSBieSB0aGUgc2FtZSB0aHJlYWQKKyAgICAgICBpbmNyZWFzZSB0bXBfY291bnQgYnkgb25lLiAqLworICAgIGlmICh0aWRzW2ldID09IGxhc3R0aWQpIHsKKyAgICAgIHRtcF9jb3VudCsrOworI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKHN0ZGVyciwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgICAgICBjb250aW51ZTsKKyAgICB9CisKKyAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4KKyAgICAgKiBXaGVuIGZpbmRpbmcgdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuCisgICAgICovCisgICAgaWYgKHRpZHNbaV0gPT0gKGxhc3R0aWQgKyAxKSAlIHRocmVhZHMgfHwgdGlkc1tpXSA9PSAtMSkgeworICAgICAgLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisgICAgICBpZiAodG1wX2NvdW50ID09IGNodW5rX3NpemUpIHsKKyAgICAgICAgdG1wX2NvdW50ID0gMTsKKyAgICAgICAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJPS1xuIik7CisjZW5kaWYKKyAgICAgIH0gZWxzZSB7CisgICAgICAgIC8qIElmIHRoZSBjaHVuayBzaXplIHdhcyB3cm9uZywgY2hlY2sgaWYgdGhlIGVuZCB3YXMgcmVhY2hlZCAqLworICAgICAgICBpZiAodGlkc1tpXSA9PSAtMSkgeworICAgICAgICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJMYXN0IHRocmVhZCBoYWQgY2h1bmsgc2l6ZSAlZFxuIiwKKyAgICAgICAgICAgICAgdG1wX2NvdW50KTsKKyAgICAgICAgICAgIGJyZWFrOworICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIgorICAgICAgICAgICAgICAiIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisgICAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICAgIH0KKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICBmcHJpbnRmIChzdGRlcnIsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCIKKyAgICAgICAgICAgICIgd2FzICVkKVxuIiwgdG1wX2NvdW50LCBjaHVua19zaXplKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgICB9CisgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgIGZwcmludGYoc3RkZXJyLCAiRVJST1I6IEZvdW5kIHRocmVhZCB3aXRoIG51bWJlciAlZCAoc2hvdWxkIGJlIgorICAgICAgICAiIGluYmV0d2VlbiAwIGFuZCAlZCkuIiwgdGlkc1tpXSwgdGhyZWFkcyAtIDEpOworICAgICAgcmVzdWx0ID0gMDsKKyAgICB9CisjaWZkZWYgVkVSQk9TRQorICAgIGZwcmludGYgKHN0ZGVyciwgIiVkOiAlZCBcbiIsIGksIHRpZHNbaV0pOworI2VuZGlmCisgIH0KKworICAvKiBOb3cgd2UgY2hlY2sgaWYgc2V2ZXJhbCBsb29wIHJlZ2lvbnMgaW4gb25lIHBhcmFsbGVsIHJlZ2lvbiBoYXZlIHRoZQorICAgKiBzYW1lIGxvZ2ljYWwgYXNzaWduZW1lbnQgb2YgY2h1bmtzIHRvIHRocmVhZHMuIFdlIHVzZSB0aGUgbm93YWl0CisgICAqIGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgIGZyZWUgKHRpZHMpOworICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisgIHRpZHMyID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIExPT1BDT1VOVCk7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgIHsKKyAgICAgIGludCBuOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspIHsKKyAgICAgICAgaWYgKExPT1BDT1VOVCA9PSBuICsgMSApCisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKworICAgICAgICB0aWRzW25dID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICB9CisgICAgfQorICAgIHsKKyAgICAgIGludCBtOworICAgICAgI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgbm93YWl0CisgICAgICBmb3IgKG0gPSAxOyBtIDw9IExPT1BDT1VOVDsgbSsrKSB7CisgICAgICAgIHRpZHMyW20tMV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgIGlmICh0aWRzW2ldICE9IHRpZHMyW2ldKSB7CisgICAgZnByaW50ZiAoc3RkZXJyLCAiQ2h1bmsgbm8uICVkIHdhcyBhc3NpZ25lZCBvbmNlIHRvIHRocmVhZCAlZCBhbmQiCisgICAgICAiIGxhdGVyIHRvIHRocmVhZCAlZC5cbiIsIGksIHRpZHNbaV0sdGlkczJbaV0pOworICAgIHJlc3VsdCA9IDA7CisgIH0KKworICBmcmVlICh0aWRzKTsKKyAgZnJlZSAodGlkczIpOworICByZXR1cm4gcmVzdWx0OworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvciAoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWNfMygpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IzYmY3ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW0gOworICBpbnQgaTI7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bT0wOworICBpMj0zOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgZmlyc3Rwcml2YXRlKGkyKQorICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKSB7CisgICAgc3VtID0gc3VtICsgKGkgKyBpMik7CisgIH0KKworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgKyBpMiAqIExPT1BDT1VOVDsKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9maXN0cHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9pZi5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9pZi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU3ZmU0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSw0MiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZigpCit7CisgIGludCBrbm93bl9zdW07CisgIGludCBudW1fdGhyZWFkczsKKyAgaW50IHN1bSwgc3VtMjsKKyAgaW50IGk7CisgIGludCBjb250cm9sOworCisgIGNvbnRyb2wgPSAwOworICBudW1fdGhyZWFkcz0wOworICBzdW0gPSAwOworICBzdW0yID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZShpKSBpZiAoY29udHJvbD09MSkKKyAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKyAgICBzdW0gPSBzdW0gKyBpOworICB9CisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICBmcHJpbnRmKHN0ZGVyciwgIk51bWJlciBvZiB0aHJlYWRzIGRldGVybWluZWQgYnkiCisgICAgIiBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0gJiYgbnVtX3RocmVhZHMgPT0gMSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX2lmKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTUzY2ZiMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDM3IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgaTsKKyAgaW50IGkwOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9MDsKKyAgaTAgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBcCisgICAgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgbGFzdHByaXZhdGUoaTApCisgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspIHsKKyAgICBzdW0gPSBzdW0gKyBpOworICAgIGkwID0gaTsKKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgZm9yICovCisKKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41ZmVmNDYwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKK2ludCBpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpKQorCisvKiBWYXJpYWJsZSBpaSBpcyB1c2VkIHRvIGF2b2lkIHByb2JsZW1zIHdpdGggYSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlIHVzZWQgYXMgYSBsb29wCisgKiBpbmRleC4gU2VlIHRlc3Qgb21wX3RocmVhZHByaXZhdGVfZm9yLgorICovCitzdGF0aWMgaW50IGlpOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShpaSkKKworLyohCisgIFV0aWxpdHkgZnVuY3Rpb246IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGxhcmdlciB0aGFuCisgIHRoZSBhcmd1bWVudCBvZiB0aGUgbGFzdCBjYWxsIG9mIHRoaXMgZnVuY3Rpb24uCisgKi8KK3N0YXRpYyBpbnQgY2hlY2tfaV9pc2xhcmdlcjIoaW50IGkpCit7CisgIGludCBpc2xhcmdlcjsKKyAgaXNsYXJnZXIgPSAoaSA+IGxhc3RfaSk7CisgIGxhc3RfaSA9IGk7CisgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoKQoreworICBpbnQgc3VtOworICBpbnQgaXNfbGFyZ2VyOworICBpbnQga25vd25fc3VtOworICBpbnQgaTsKKworICBzdW0gPSAwOworICBpc19sYXJnZXIgPSAxOworICBsYXN0X2kgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgb3JkZXJlZAorICBmb3IgKGkgPSAxOyBpIDwgMTAwOyBpKyspIHsKKyAgICBpaSA9IGk7CisgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorICAgIHsKKyAgICAgIGlzX2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIyIChpaSkgJiYgaXNfbGFyZ2VyOworICAgICAgc3VtICA9IHN1bSArIGlpOworICAgIH0KKyAgfQorICBrbm93bl9zdW0gPSAoOTkgKiAxMDApIC8gMjsKKyAgZnByaW50ZiAoc3RkZXJyLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgZnByaW50ZiAoc3RkZXJyLCIgaXNfbGFyZ2VyID0gJWRcbiIsIGlzX2xhcmdlcik7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTIzMWQzNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvZm9yL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTAgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCkKK3sKKyAgaW50IGk7CisgIGRvdWJsZSBzdW0gPSAwOworICBmb3IoaSA9IDA7IGkgPCAxMDAwOyBpKyspeworICAgIHN1bSArPSBzcXJ0IChpKTsKKyAgfQorfQorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgaTsKKyAgaW50IGkyOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9MDsKKyAgaTI9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uKCs6c3VtKSBzY2hlZHVsZShzdGF0aWMsMSkgcHJpdmF0ZShpKSBwcml2YXRlKGkyKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorICB7CisgICAgaTIgPSBpOworICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgZG9fc29tZV93b3JrICgpOworICAgICNwcmFnbWEgb21wIGZsdXNoCisgICAgc3VtID0gc3VtICsgaTI7CisgIH0gLyplbmQgb2YgZm9yKi8KKyAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX3ByaXZhdGUgKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL2Zvci9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbi5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xMThkNzMwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9mb3Ivb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwICAgIC8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAgIC8qIDEwISAqLworCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkc3VtOworICBkb3VibGUgZGtub3duX3N1bTsKKyAgZG91YmxlIGR0PTAuNTsgIC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IHByb2R1Y3Q7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgbG9naWNfYW5kOworICBpbnQgbG9naWNfb3I7CisgIGludCBiaXRfYW5kOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgbG9naWNzW0xPT1BDT1VOVF07CisgIGludCBpOworICBkb3VibGUgZHB0OworICBpbnQgcmVzdWx0OworCisgIHN1bSA9MDsKKyAgZHN1bT0wOworICBkdCA9IDEuLzMuOworICByZXN1bHQgPSAwOworICBwcm9kdWN0ID0gMTsKKyAgbG9naWNfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9hbmQ9MTsKKyAgYml0X29yPTA7CisgIGV4Y2x1c2l2X2JpdF9vcj0wOworCisgIC8qIFRlc3RzIGZvciBpbnRlZ2VycyAqLworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKSB7CisgICAgc3VtPXN1bStpOworICB9CisgIGlmKGtub3duX3N1bSE9c3VtKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIgorICAgICAgIiBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOworICB9CisKKyAgZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkaWZmKQorICBmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKSB7CisgICAgZGlmZj1kaWZmLWk7CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBkb3VibGVzICovCisgIGRzdW09MDsKKyAgZHB0PTE7CisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKzpkc3VtKQorICBmb3IgKGk9MDtpPERPVUJMRV9ESUdJVFM7KytpKSB7CisgICAgZHN1bSArPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIgorICAgICAgIiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICBkc3VtLCBka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworICB9CisKKyAgZHB0PTE7CisKKyAgZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkgeworICAgIGRwdCo9ZHQ7CisgIH0KKyAgZnByaW50ZihzdGRlcnIsIlxuIik7CisgIGRkaWZmID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGRpZmYpCisgIGZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpIHsKKyAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBpbnRlZ2VycyAqLworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgIGZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspIHsKKyAgICBwcm9kdWN0ICo9IGk7CisgIH0KKyAga25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGxvZ2ljIEFORCAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxLlxuIik7CisgIH0KKworICBsb2dpY19hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgJiYgbG9naWNzW2ldOworICB9CisgIGlmKGxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgbG9naWMgT1IgKi8KKyAgZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8fDpsb2dpY19vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKyAgfQorICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24ofHw6bG9naWNfb3IpCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWxvZ2ljX29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworICB9CisKKyAgLyogVGVzdHMgZm9yIGJpdHdpc2UgQU5EICovCisgIGZvcihpPTA7aTxMT09QQ09VTlQ7KytpKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIFwKKyAgICByZWR1Y3Rpb24oJjpiaXRfYW5kKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDEuXG4iKTsKKyAgfQorCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgfQorICBpZihiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyLlxuIik7CisgIH0KKworICAvKiBUZXN0cyBmb3IgYml0d2lzZSBPUiAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKHw6Yml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgfQorICBpZihiaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKyAgYml0X29yID0gMDsKKyAgbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgXAorICAgIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpIHsKKyAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgIH0KKyAgaWYoIWJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8qIFRlc3RzIGZvciBiaXR3aXNlIFhPUiAqLworICBmb3IoaT0wO2k8TE9PUENPVU5UO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgfQorICBpZihleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSBcCisgICAgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICBmb3IoaT0wO2k8TE9PUENPVU5UOysraSkgeworICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgfQorICBpZighZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xNzgwZmFiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw1NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBrbm93bl9zdW07CisKKyAgc3VtID03OworICBzdW0wPTExOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZShzdW0wKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgIH0KKworICBrbm93bl9zdW09MTEqMys3OworICByZXR1cm4gKGtub3duX3N1bT09c3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI3NzVlYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3MSBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoKQoreworICBpbnQgc3VtOworICBpbnQgc3VtMDsKKyAgaW50IGk7CisgIGludCBpMDsKKyAgaW50IGtub3duX3N1bTsKKyAgc3VtID0wOworICBzdW0wID0gMDsKKyAgaTAgPSAtMTsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGksc3VtMCkgbGFzdHByaXZhdGUoaTApCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yIChpPTE7aTw0MDA7aSsrKSB7CisgICAgICAgIHN1bTA9c3VtMCtpOworICAgICAgICBpMD1pOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyAgICAgICAgc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIHN1bTA9MDsKKyAgICAgIGZvcihpPTQwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAgIGkwPWk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2RhYjI5NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY0IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19wcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDc7CisgIHN1bTA9MDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKHN1bTAsIGkpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgc3VtMD0wOworICAgICAgZm9yIChpPTE7aTw0MDA7aSsrKQorICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IoaT00MDA7aTw3MDA7aSsrKQorICAgICAgICBzdW0wPXN1bTAraTsKKyAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisgICAgICAgIHN1bT0gc3VtK3N1bTA7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBzdW0wPTA7CisgICAgICBmb3IoaT03MDA7aTwxMDAwO2krKykKKyAgICAgICAgc3VtMD1zdW0wK2k7CisgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworICAgICAgICBzdW09IHN1bStzdW0wOworICAgICAgfQorICAgIH0KKyAgfQorCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzIrNzsKKyAgcmV0dXJuIChrbm93bl9zdW09PXN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wZDQ5ODY1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSw1MDggQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oKQoreworICBpbnQgc3VtOworICBpbnQga25vd25fc3VtOworICBkb3VibGUgZHB0OworICBkb3VibGUgZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkdD0wLjU7IC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtNTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IHByb2R1Y3Q7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgbG9naWNfYW5kOworICBpbnQgYml0X2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgbG9naWNzWzEwMDBdOworICBpbnQgaTsKKyAgaW50IHJlc3VsdDsKKworICBzdW0gPSA3OworICBkc3VtPTA7CisgIHByb2R1Y3QgPTE7CisgIGRwdCA9IDE7CisgIGxvZ2ljX2FuZD0xOworICBiaXRfYW5kPTE7CisgIGxvZ2ljX29yPTA7CisgIGJpdF9vcj0wOworICBleGNsdXNpdl9iaXRfb3I9MDsKKyAgcmVzdWx0ID0wOworICAvKiAgaW50IG15X2lzbGFyZ2VyOyovCisgIC8qaW50IGlzX2xhcmdlcj0xOyovCisKKyAgLy8gVGVzdCBzdW1tYXRpb24gb2YgaW50ZWdlcnMKKyAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6c3VtKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBzdW09c3VtK2k7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICBzdW09c3VtK2k7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgc3VtPXN1bStpOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihrbm93bl9zdW0hPXN1bSkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZC5cbiIsc3VtLCBrbm93bl9zdW0pOworICB9CisKKyAgLy8gVGVzdCBkaWZmZXJlbmNlcyBvZiBpbnRlZ2VycworICBkaWZmID0gKDk5OSoxMDAwKS8yOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRpZmYpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGRpZmYgIT0gMCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisgIH0KKworICAvLyBUZXN0IHN1bW1hdGlvbiBvZiBkb3VibGVzCisgIGZvciAoaT0wO2k8MjA7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCs6ZHN1bSkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MDtpPDY7KytpKSB7CisgICAgICAgIGRzdW0gKz0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiIKKyAgICAgICIgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLAorICAgICAgZHN1bSwgZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKyAgfQorCisgIC8vIFRlc3QgZGlmZmVyZW5jZXMgb2YgZG91YmxlcworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICBkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigtOmRkaWZmKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgIGRkaWZmIC09IHBvdyhkdCxpKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUiCisgICAgICAiIGluc3RlYWQgb2YgMC4wXG4iLGRkaWZmKTsKKyAgfQorCisgIC8vIFRlc3QgcHJvZHVjdCBvZiBpbnRlZ2VycworICBrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oKjpwcm9kdWN0KQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTE7aTwzO2krKykgeworICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0zO2k8NztpKyspIHsKKyAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NztpPDExO2krKykgeworICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgfQorCisgIC8vIFRlc3QgbG9naWNhbCBBTkQKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFsb2dpY19hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMVxuIik7CisgIH0KKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzWzUwMV0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYobG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIiKTsKKyAgfQorCisgIC8vIFRlc3QgbG9naWNhbCBPUgorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfb3IgPSAwOworICBsb2dpY3NbNTAxXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICBsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworICAgICAgfQorICAgIH0KKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIC8vIFRlc3QgYml0d2lzZSBBTkQKKyAgZm9yKGk9MDtpPDEwMDA7KytpKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmOmJpdF9hbmQpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgICAgICB9CisgICAgfQorICB9CisgIGlmKCFiaXRfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgfQorCisgIGJpdF9hbmQgPSAxOworICBsb2dpY3NbNTAxXT0wOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMiIpOworICB9CisKKyAgLy8gVGVzdCBiaXR3aXNlIE9SCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24ofDpiaXRfb3IpCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGJpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorICBiaXRfb3IgPSAwOworICBsb2dpY3NbNTAxXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLy8gVGVzdCBiaXR3aXNlIFhPUgorICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZihleGNsdXNpdl9iaXRfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBleGNsdXNpdl9iaXRfb3IgPSAwOworICBsb2dpY3NbNTAxXT0xOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgfQorICAgIH0KKyAgfQorICBpZighZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcmVkdWN0aW9uKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NTI2NDc1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU1IEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCB0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZSgpCit7CisgIGludCBzdW07CisgIGludCBzdW0wOworICBpbnQga25vd25fc3VtOworCisgIHN1bTAgPSAxMTsKKyAgc3VtID0gNzsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wICBzZWN0aW9ucyBmaXJzdHByaXZhdGUoc3VtMCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgICNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICAgIHsKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGtub3duX3N1bSA9IDExICogMyArIDc7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX2ZpcnN0cHJpdmF0ZSovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjBkYmJlYTkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw3NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZSgpCit7CisgIGludCBpMCA9IC0xOworICBpbnQgc3VtID0gMDsKKyAgaW50IGk7CisgIGludCBzdW0wID0gMDsKKyAgaW50IGtub3duX3N1bTsKKworICBpMCA9IC0xOworICBzdW0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBsYXN0cHJpdmF0ZShpMCkgcHJpdmF0ZShpLHN1bTApCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAgIGkwID0gaTsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorICAgICAgICB7CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAgIGkwID0gaTsKKyAgICAgICAgfQorICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfSAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKyAgICAgICAgeworICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgICBpMCA9IGk7CisgICAgICAgIH0KKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0gLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfSAvKiBlbmQgb2Ygc2VjdGlvbiAqLworICAgIH0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyOworICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiAoaTAgPT0gOTk5KSApOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9wcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iZjJhMzBkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zZWN0aW9ucy9vbXBfc2VjdGlvbl9wcml2YXRlLmMKQEAgLTAsMCArMSw2NiBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKCkKK3sKKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQga25vd25fc3VtOworCisgIHN1bSA9IDc7CisgIHN1bTAgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKHN1bTAsaSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHN1bTAgPSAwOworICAgICAgICBmb3IgKGkgPSAxOyBpIDwgNDAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpOworICAgICAgICAjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgICB7CisgICAgICAgICAgc3VtID0gc3VtICsgc3VtMDsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBzdW0wID0gMDsKKyAgICAgICAgZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaTsKKyAgICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgeworICAgICAgICAgIHN1bSA9IHN1bSArIHN1bTA7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDc7CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9IC8qIGVuZCBvZiBjaGVja19zZWN0aW9uX3ByaXZhdGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbl9wcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19ub3dhaXQuYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX25vd2FpdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNhZmYyNTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19ub3dhaXQuYwpAQCAtMCwwICsxLDEwNCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKgorICogVGhpcyB0ZXN0IHdpbGwgaGFuZyBpZiB0aGUgbm93YWl0IGlzIG5vdCB3b3JraW5nIHByb3Blcmx5CisgKgorICogSXQgcmVsaWVzIG9uIGEgdGhyZWFkIHNraXBwaW5nIHRvIHRoZSBzZWNvbmQgc2VjdGlvbnMgY29uc3RydWN0IHRvCisgKiByZWxlYXNlIHRoZSB0aHJlYWRzIGluIHRoZSBmaXJzdCBzZWN0aW9ucyBjb25zdHJ1Y3QKKyAqCisgKiBBbHNvLCBzaW5jZSBzY2hlZHVsaW5nIG9mIHNlY3Rpb25zIGlzIGltcGxlbWVudGF0aW9uIGRlZmluZWQsIGl0IGlzCisgKiBuZWNlc3NhcnkgdG8gaGF2ZSBhbGwgZm91ciBzZWN0aW9ucyBpbiB0aGUgc2Vjb25kIHNlY3Rpb25zIGNvbnN0cnVjdAorICogcmVsZWFzZSB0aGUgdGhyZWFkcyBzaW5jZSB3ZSBjYW4ndCBndWFyYW50ZWUgd2hpY2ggc2VjdGlvbiBhIHNpbmdsZSB0aHJlYWQKKyAqIHdpbGwgZXhlY3V0ZS4KKyAqLwordm9sYXRpbGUgaW50IHJlbGVhc2U7Cit2b2xhdGlsZSBpbnQgY291bnQ7CisKK3ZvaWQgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb24iCisgICAgIiBhbmQgd2FpdHMuXG4iLCByYW5rKTsKKyAgd2hpbGUgKHJlbGVhc2UgPT0gMCk7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCit2b2lkIHJlbGVhc2VfYW5kX2luY3JlbWVudChpbnQgcmFuaykKK3sKKyAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgc2V0cyByZWxlYXNlIHRvIDFcbiIsIHJhbmspOworICByZWxlYXNlID0gMTsKKyAgI3ByYWdtYSBvbXAgZmx1c2gocmVsZWFzZSkKKyAgI3ByYWdtYSBvbXAgYXRvbWljCisgIGNvdW50Kys7Cit9CisKK2ludCB0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoKQoreworICByZWxlYXNlID0gMDsKKyAgY291bnQgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIG51bV90aHJlYWRzKDQpCisgIHsKKyAgICBpbnQgcmFuazsKKyAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIG5vd2FpdAorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZnByaW50ZihzdGRlcnIsICJUaHJlYWQgbnIgJWQgZW50ZXJzIGZpcnN0IHNlY3Rpb25zIGFuZCBnb2VzICIKKyAgICAgICAgICAiaW1tZWRpYXRlbHkgdG8gbmV4dCBzZWN0aW9ucyBjb25zdHJ1Y3QgdG8gcmVsZWFzZS5cbiIsIHJhbmspOworICAgICAgICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgICAgICAgY291bnQrKzsKKyAgICAgIH0KKyAgICB9CisgICAgLyogQmVnaW4gb2Ygc2Vjb25kIHNlY3Rpb25zIGVudmlyb25tZW50ICovCisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgcmVsZWFzZV9hbmRfaW5jcmVtZW50KHJhbmspOworICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICByZWxlYXNlX2FuZF9pbmNyZW1lbnQocmFuayk7CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIHJlbGVhc2VfYW5kX2luY3JlbWVudChyYW5rKTsKKyAgICAgIH0KKyAgICB9CisgIH0KKyAgLy8gQ2hlY2sgdG8gbWFrZSBzdXJlIGFsbCBlaWdodCBzZWN0aW9ucyB3ZXJlIGV4ZWN1dGVkCisgIHJldHVybiAoY291bnQ9PTgpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2VjdGlvbnNfbm93YWl0KCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2VjdGlvbnMvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFmZGI1ZWMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NlY3Rpb25zL29tcF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDU0MyBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbigpCit7CisgIGludCBzdW07CisgIGludCBrbm93bl9zdW07CisgIGRvdWJsZSBkcHQsZHN1bTsKKyAgZG91YmxlIGRrbm93bl9zdW07CisgIGRvdWJsZSBkdD0wLjU7IC8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKyAgZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyAgaW50IGRpZmY7CisgIGRvdWJsZSBkZGlmZjsKKyAgaW50IHByb2R1Y3Q7CisgIGludCBrbm93bl9wcm9kdWN0OworICBpbnQgbG9naWNfYW5kOworICBpbnQgYml0X2FuZDsKKyAgaW50IGxvZ2ljX29yOworICBpbnQgYml0X29yOworICBpbnQgZXhjbHVzaXZfYml0X29yOworICBpbnQgbG9naWNzWzEwMDBdOworICBpbnQgaTsKKyAgaW50IHJlc3VsdDsKKyAgLyogaW50IG15X2lzbGFyZ2VyOyAqLworICAvKmludCBpc19sYXJnZXI9MTsqLworICBzdW0gPTc7CisgIGRwdCA9MTsKKyAgZHN1bT0wOworICBwcm9kdWN0ID0xOworICBsb2dpY19hbmQ9MTsKKyAgYml0X2FuZD0xOworICBsb2dpY19vcj0wOworICBiaXRfb3I9MDsKKyAgZXhjbHVzaXZfYml0X29yPTA7CisgIHJlc3VsdCA9IDA7CisgIGR0ID0gMS4vMy47CisKKyAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yKzc7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigrOnN1bSkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIHN1bT1zdW0raTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIHN1bT1zdW0raTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9NzAwO2k8MTAwMDtpKyspIHsKKyAgICAgICAgICBzdW09c3VtK2k7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fc3VtIT1zdW0pIHsKKyAgICArK3Jlc3VsdDsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQiCisgICAgICAiIGluc3RlYWQgb2YgJWRcbiIsIHN1bSxrbm93bl9zdW0pOworICB9CisKKyAgZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKC06ZGlmZikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0xO2k8MzAwO2krKykgeworICAgICAgICAgIGRpZmY9ZGlmZi1pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgZGlmZj1kaWZmLWk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoZGlmZiAhPSAwKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKyAgfQorCisgIGZvciAoaT0wO2k8MjA7KytpKSB7CisgICAgZHB0Kj1kdDsKKyAgfQorICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigrOmRzdW0pCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MDtpPDY7KytpKSB7CisgICAgICAgICAgZHN1bSArPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTI7aTwyMDsrK2kpIHsKKyAgICAgICAgICBkc3VtICs9IHBvdyhkdCxpKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYiCisgICAgICAiIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIiwKKyAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgIH0KKworICBkcHQ9MTsKKyAgZm9yIChpPTA7aTwyMDsrK2kpIHsKKyAgICBkcHQqPWR0OworICB9CisgIGZwcmludGYoc3RkZXJyLCJcbiIpOworICBkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oLTpkZGlmZikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0wO2k8NjsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTY7aTwxMjsrK2kpIHsKKyAgICAgICAgICBkZGlmZiAtPSBwb3coZHQsaSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTEyO2k8MjA7KytpKSB7CisgICAgICAgICAgZGRpZmYgLT0gcG93KGR0LGkpOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisKKyAgaWYoZmFicyhkZGlmZikgPiByb3VuZGluZ19lcnJvcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSIKKyAgICAgICIgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworICB9CisKKyAga25vd25fcHJvZHVjdCA9IDM2Mjg4MDA7CisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigqOnByb2R1Y3QpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0xO2k8MztpKyspIHsKKyAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MztpPDc7aSsrKSB7CisgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTc7aTwxMTtpKyspIHsKKyAgICAgICAgICBwcm9kdWN0ICo9IGk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCIKKyAgICAgICIgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTE7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oJiY6bG9naWNfYW5kKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT0zMDA7aTw3MDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvciAoaT03MDA7aTwxMDAwO2krKykgeworICAgICAgICAgIGxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighbG9naWNfYW5kKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgbG9naWNfYW5kID0gMTsKKyAgbG9naWNzWzUwMV0gPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbigmJjpsb2dpY19hbmQpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MTtpPDMwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTMwMDtpPDcwMDtpKyspIHsKKyAgICAgICAgICBsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGxvZ2ljX2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwO2krKykgeworICAgIGxvZ2ljc1tpXT0wOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZihsb2dpY19vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJcbkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMVxuIik7CisgIH0KKworICBsb2dpY19vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHx8OmxvZ2ljX29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTE7aTwzMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IgKGk9MzAwO2k8NzAwO2krKykgeworICAgICAgICAgIGxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yIChpPTcwMDtpPDEwMDA7aSsrKSB7CisgICAgICAgICAgbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighbG9naWNfb3IpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKyAgfQorCisgIGZvcihpPTA7aTwxMDAwOysraSkgeworICAgIGxvZ2ljc1tpXT0xOworICB9CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoIWJpdF9hbmQpIHsKKyAgICByZXN1bHQrKzsKKyAgICBmcHJpbnRmKHN0ZGVyciwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICB9CisKKyAgYml0X2FuZCA9IDE7CisgIGxvZ2ljc1s1MDFdPTA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKCY6Yml0X2FuZCkKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X2FuZCkgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMlxuIik7CisgIH0KKworICBmb3IoaT0wO2k8MTAwMDtpKyspIHsKKyAgICBsb2dpY3NbaV09MDsKKyAgfQorCisgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgIHsKKyAgICAjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIHJlZHVjdGlvbih8OmJpdF9vcikKKyAgICB7CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTA7aTwzMDA7KytpKSB7CisgICAgICAgICAgYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTMwMDtpPDcwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9NzAwO2k8MTAwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICB9CisgIH0KKyAgaWYoYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworICB9CisgIGJpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKHw6Yml0X29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBiaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgZm9yKGk9MDtpPDEwMDA7aSsrKSB7CisgICAgbG9naWNzW2ldPTA7CisgIH0KKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSByZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0wO2k8MzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT0zMDA7aTw3MDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgICAjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgICB7CisgICAgICAgIGZvcihpPTcwMDtpPDEwMDA7KytpKSB7CisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworICAgICAgICB9CisgICAgICB9CisgICAgfQorICB9CisgIGlmKGV4Y2x1c2l2X2JpdF9vcikgeworICAgIHJlc3VsdCsrOworICAgIGZwcmludGYoc3RkZXJyLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgfQorCisgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgIGxvZ2ljc1s1MDFdPTE7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgcmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKQorICAgIHsKKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MDtpPDMwMDsrK2kpIHsKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisgICAgICAgIH0KKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICAgIHsKKyAgICAgICAgZm9yKGk9MzAwO2k8NzAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgICAgeworICAgICAgICBmb3IoaT03MDA7aTwxMDAwOysraSkgeworICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKyAgICAgICAgfQorICAgICAgfQorICAgIH0KKyAgfQorICBpZighZXhjbHVzaXZfYml0X29yKSB7CisgICAgcmVzdWx0Kys7CisgICAgZnByaW50ZihzdGRlcnIsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICB9CisKKyAgLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQoraW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NlY3Rpb25zX3JlZHVjdGlvbigpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ5NjM1NzkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0NCBAQAorLy8gUlVOOiAlbGlib21wLWNvbXBpbGUtYW5kLXJ1bgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgdGVzdF9vbXBfc2luZ2xlKCkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworICBpbnQgcmVzdWx0OworICBpbnQgbnJfaXRlcmF0aW9uczsKKyAgaW50IGk7CisKKyAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICByZXN1bHQgPSAwOworICBucl9pdGVyYXRpb25zID0gMDsKKworICAjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgIHsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgeworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBucl9pdGVyYXRpb25zKys7CisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworICAgICAgfQorICAgIH0KKyAgfQorICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUqLworCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2luZ2xlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMgYi9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZWY1Y2Q5NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfY29weXByaXZhdGUuYwpAQCAtMCwwICsxLDYwIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisjZGVmaW5lIERFQlVHX1RFU1QgMAorCitpbnQgajsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaikKKworaW50IHRlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZSgpCit7CisgIGludCByZXN1bHQ7CisgIGludCBucl9pdGVyYXRpb25zOworCisgIHJlc3VsdCA9IDA7CisgIG5yX2l0ZXJhdGlvbnMgPSAwOworICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICB7CisgICAgaW50IGk7CisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKyNpZiBERUJVR19URVNUCisgICAgICAgICBpbnQgdGhyZWFkOworICAgICAgICAgdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworI2VuZGlmCisgICAgICAjcHJhZ21hIG9tcCBzaW5nbGUgY29weXByaXZhdGUoaikKKyAgICAgIHsKKyAgICAgICAgbnJfaXRlcmF0aW9ucysrOworICAgICAgICBqID0gaTsKKyNpZiBERUJVR19URVNUCisgICAgICAgIHByaW50ZiAoInRocmVhZCAlZCBhc3NpZ25zLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsKKyNlbmRpZgorICAgICAgfQorI2lmIERFQlVHX1RFU1QKKyAgICAgICNwcmFnbWEgb21wIGJhcnJpZXIKKyNlbmRpZgorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKyNpZiBERUJVR19URVNUCisgICAgICAgIHByaW50ZiAoInRocmVhZCA9ICVkLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsKKyNlbmRpZgorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBqIC0gaTsKKyAgICAgIH0KKyAgICAgICNwcmFnbWEgb21wIGJhcnJpZXIKKyAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorCitpbnQgbWFpbigpCit7CisgIGludCBpOworICBpbnQgbnVtX2ZhaWxlZD0wOworCisgIGZvcihpID0gMDsgaSA8IFJFUEVUSVRJT05TOyBpKyspIHsKKyAgICBpZighdGVzdF9vbXBfc2luZ2xlX2NvcHlwcml2YXRlKCkpIHsKKyAgICAgIG51bV9mYWlsZWQrKzsKKyAgICB9CisgIH0KKyAgcmV0dXJuIG51bV9mYWlsZWQ7Cit9CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90ZXN0L3dvcmtzaGFyaW5nL3NpbmdsZS9vbXBfc2luZ2xlX25vd2FpdC5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yMmY4OTMwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9ub3dhaXQuYwpAQCAtMCwwICsxLDczIEBACisvLyBSVU46ICVsaWJvbXAtY29tcGlsZS1hbmQtcnVuCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qCisgKiBUaGlzIHRlc3Qgd2lsbCBoYW5nIGlmIHRoZSBub3dhaXQgaXMgbm90IHdvcmtpbmcgcHJvcGVybHkKKyAqCisgKiBJdCByZWxpZXMgb24gYSBvbmUgdGhyZWFkIHNraXBwaW5nIHRvIHRoZSBsYXN0IHNpbmdsZSBjb25zdHJ1Y3QgdG8KKyAqIHJlbGVhc2UgdGhlIHRocmVhZHMgaW4gdGhlIGZpcnN0IHRocmVlIHNpbmdsZSBjb25zdHJ1Y3RzCisgKi8KK3ZvbGF0aWxlIGludCByZWxlYXNlOwordm9sYXRpbGUgaW50IGNvdW50OworCit2b2lkIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIGVudGVycyBmaXJzdCBzZWN0aW9uIgorICAgICIgYW5kIHdhaXRzLlxuIiwgcmFuayk7CisgIHdoaWxlIChyZWxlYXNlID09IDApOworICAjcHJhZ21hIG9tcCBhdG9taWMKKyAgY291bnQrKzsKK30KKwordm9pZCByZWxlYXNlX2FuZF9pbmNyZW1lbnQoaW50IHJhbmspCit7CisgIGZwcmludGYoc3RkZXJyLCAiVGhyZWFkIG5yICVkIHNldHMgcmVsZWFzZSB0byAxXG4iLCByYW5rKTsKKyAgcmVsZWFzZSA9IDE7CisgICNwcmFnbWEgb21wIGF0b21pYworICBjb3VudCsrOworfQorCitpbnQgdGVzdF9vbXBfc2luZ2xlX25vd2FpdCgpCit7CisgIHJlbGVhc2UgPSAwOworICBjb3VudCA9IDA7CisKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHMoNCkKKyAgeworICAgIGludCByYW5rOworICAgIHJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlIG5vd2FpdAorICAgIHsKKyAgICAgIHdhaXRfZm9yX3JlbGVhc2VfdGhlbl9pbmNyZW1lbnQocmFuayk7CisgICAgfQorICAgICNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQKKyAgICB7CisgICAgICB3YWl0X2Zvcl9yZWxlYXNlX3RoZW5faW5jcmVtZW50KHJhbmspOworICAgIH0KKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0CisgICAgeworICAgICAgd2FpdF9mb3JfcmVsZWFzZV90aGVuX2luY3JlbWVudChyYW5rKTsKKyAgICB9CisKKyAgICAjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICByZWxlYXNlX2FuZF9pbmNyZW1lbnQocmFuayk7CisgICAgfQorICB9CisgIC8vIENoZWNrIHRvIG1ha2Ugc3VyZSBhbGwgZm91ciBzaW5nbGVzIHdlcmUgZXhlY3V0ZWQKKyAgcmV0dXJuIChjb3VudD09NCk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGVfbm93YWl0Ki8KKworaW50IG1haW4oKQoreworICBpbnQgaTsKKyAgaW50IG51bV9mYWlsZWQ9MDsKKworICBmb3IoaSA9IDA7IGkgPCBSRVBFVElUSU9OUzsgaSsrKSB7CisgICAgaWYoIXRlc3Rfb21wX3NpbmdsZV9ub3dhaXQoKSkgeworICAgICAgbnVtX2ZhaWxlZCsrOworICAgIH0KKyAgfQorICByZXR1cm4gbnVtX2ZhaWxlZDsKK30KZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfcHJpdmF0ZS5jIGIvcmMzL3J1bnRpbWUvdGVzdC93b3Jrc2hhcmluZy9zaW5nbGUvb21wX3NpbmdsZV9wcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTI3ZjhkZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rlc3Qvd29ya3NoYXJpbmcvc2luZ2xlL29tcF9zaW5nbGVfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTcgQEAKKy8vIFJVTjogJWxpYm9tcC1jb21waWxlLWFuZC1ydW4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15aXQgPSAwOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShteWl0KQoraW50IG15cmVzdWx0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlyZXN1bHQpCisKK2ludCB0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZSgpCit7CisgIGludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgaW50IHJlc3VsdDsKKyAgaW50IG5yX2l0ZXJhdGlvbnM7CisgIGludCBpOworCisgIG15aXQgPSAwOworICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgIG5yX2l0ZXJhdGlvbnMgPSAwOworICByZXN1bHQgPSAwOworCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgeworICAgIG15cmVzdWx0ID0gMDsKKyAgICBteWl0ID0gMDsKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspIHsKKyAgICAgICNwcmFnbWEgb21wIHNpbmdsZSBwcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKSBub3dhaXQKKyAgICAgIHsKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworICAgICAgICAjcHJhZ21hIG9tcCBmbHVzaAorICAgICAgICBteWl0Kys7CisgICAgICAgIG15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKyAgICAgIH0KKyAgICB9CisgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICB7CisgICAgICByZXN1bHQgKz0gbnJfdGhyZWFkc19pbl9zaW5nbGU7CisgICAgICBucl9pdGVyYXRpb25zICs9IG15aXQ7CisgICAgfQorICB9CisgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSBwcml2YXRlICovCisKK2ludCBtYWluKCkKK3sKKyAgaW50IGk7CisgIGludCBudW1fZmFpbGVkPTA7CisKKyAgZm9yKGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKykgeworICAgIGlmKCF0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZSgpKSB7CisgICAgICBudW1fZmFpbGVkKys7CisgICAgfQorICB9CisgIHJldHVybiBudW1fZmFpbGVkOworfQpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2stZGVwZW5kcy5wbCBiL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uNDdlN2U1YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWRlcGVuZHMucGwKQEAgLTAsMCArMSw1MDYgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgRmluZEJpbjsKK3VzZSBsaWIgIiRGaW5kQmluOjpCaW4vbGliIjsKKwordXNlIHRvb2xzOworCitvdXIgJFZFUlNJT04gPSAiMC4wMDUiOworbXkgJHRhcmdldF9vczsKK215ICR0YXJnZXRfYXJjaDsKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorIyBPdXB1dCBwYXJzZSBlcnJvci4KKyMgICAgICR0b29sIC0tIE5hbWUgb2YgdG9vbC4KKyMgICAgIEBidWxrIC0tIE91dHB1dCBvZiB0aGUgdG9vbC4KKyMgICAgICRuICAgIC0tIE51bWJlciBvZiBsaW5lIGNhdXNlZCBwYXJzZSBlcnJvci4KK3N1YiBwYXJzZV9lcnJvcigkXEAkKSB7CisgICAgbXkgKCAkdG9vbCwgJGJ1bGssICRuICkgPSBAXzsKKyAgICBteSBAYnVsazsKKyAgICBmb3IgKCBteSAkaSA9IDA7ICRpIDwgQCRidWxrOyArKyAkaSApIHsKKyAgICAgICAgcHVzaCggQGJ1bGssICggJGkgPT0gJG4gPyAiPj4+ICIgOiAiICAgICIgKSAuICRidWxrLT5bICRpIF0gKTsKKyAgICB9OyAjIGZvciAkaQorICAgIHJ1bnRpbWVfZXJyb3IoICJGYWlsIHRvIHBhcnNlICR0b29sIG91dHB1dDoiLCBAYnVsaywgIihlb2YpIiApOworfTsgIyBzdWIgcGFyc2VfZXJyb3IKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIExpbnV4KiBPUyB2ZXJzaW9uIG9mIGdldF9kZXBzKCkgcGFyc2VzIG91dHB1dCBvZiBsZGQ6CisjCisjICQgbGRkIGxpYm5hbWUuc28KKyMgICBsaWJjLnNvLjYgPT4gL2xpYjY0L2xpYmMuc28uNiAoMHgwMDAwMmI2MGZlZGQ4MDAwKQorIyAgIGxpYmRsLnNvLjIgPT4gL2xpYjY0L2xpYmRsLnNvLjIgKDB4MDAwMDJiNjBmZjEyYjAwMCkKKyMgICBsaWJwdGhyZWFkLnNvLjAgPT4gL2xpYjY0L2xpYnB0aHJlYWQuc28uMCAoMHgwMDAwMmI2MGZmMzJmMDAwKQorIyAgIC9saWI2NC9sZC1saW51eC14ODYtNjQuc28uMiAoMHgwMDAwMDAzODc5NDAwMDAwKQorIworIyBOb3RlOiBsZGQgcHJpbnRkIGFsbCB0aGUgZGVwZW5kZW5jaWVzLCBkaXJlY3QgYW5kIGluZGlyZWN0LiAoRm9yIGV4YW1wbGUsIGlmIHNwZWNpZmllZCBsaWJyYXJ5CisjIHJlcXVpcmVzIGxpYmRsLnNvLCBhbmQgbGliZGwuc28gcmVxdWlyZXMgL2xpYi9sZC1saW51eC5zbywgbGRkIHByaW50cyBib3RoIGxpYmRsLnNvIGFuZAorIyAvbGliL2xkLWxpbnV4LnNvKS4gSWYgeW91IGRvIG5vdCB3YW50IGluZGlyZWN0IGRlcGVuZGVuY2llcywgbG9vayBhdCByZWFkZWxmIHRvb2wuCisjCitzdWIgZ2V0X2RlcHNfbGRkKCQpIHsKKworICAgIG15ICRsaWIgPSBzaGlmdCAoIEBfICk7CisgICAgbXkgJHRvb2wgPSAibGRkIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICRsaWIgXSwgLXN0ZG91dCA9PiBcQGJ1bGsgKTsKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIGZvcmVhY2ggbXkgJGkgKCAwIC4uIEBidWxrIC0gMSApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBte15ccyooPzooW19hLXowLTkuKy0vXSopXHMrPT5ccyspPyhbX2EtejAtOS4rLS9dKilccytcKDB4WzAtOWEtel0qXCkkfWkgKSB7CisgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIG15ICRkZXAgPSAoIGRlZmluZWQoICQxICkgPyAkMSA6ICQyICk7CisgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgfTsgIyBmb3JlYWNoICRpCisKKyAgICByZXR1cm4gQGRlcHM7CisKK307ICMgc3ViIGdldF9kZXBzX2xkZAorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgQW5vdGhlciBMaW51eCogT1MgdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2YgcmVhZGVsZjoKKyMKKyMgJCByZWFkZWxmIC1kIGV4cG9ydHMvbGluXzMyZS9saWIvbGlib21wLnNvCisjCisjIER5bmFtaWMgc2VnbWVudCBhdCBvZmZzZXQgMHg4NzAwOCBjb250YWlucyAyNCBlbnRyaWVzOgorIyAgIFRhZyAgICAgICAgVHlwZSAgICAgICAgICAgICAgICAgICAgICAgICBOYW1lL1ZhbHVlCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJjLnNvLjZdCisjICAweDAwMDAwMDAwMDAwMDAwMDEgKE5FRURFRCkgICAgICAgICAgICAgU2hhcmVkIGxpYnJhcnk6IFtsaWJkbC5zby4yXQorIyAgMHgwMDAwMDAwMDAwMDAwMDAxIChORUVERUQpICAgICAgICAgICAgIFNoYXJlZCBsaWJyYXJ5OiBbbGlicHRocmVhZC5zby4wXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBlIChTT05BTUUpICAgICAgICAgICAgIExpYnJhcnkgc29uYW1lOiBbbGlib21wLnNvXQorIyAgMHgwMDAwMDAwMDAwMDAwMDBkIChGSU5JKSAgICAgICAgICAgICAgIDB4NTFjYWEKKyMgIDB4MDAwMDAwMDAwMDAwMDAwNCAoSEFTSCkgICAgICAgICAgICAgICAweDE1OAorIyAgMHgwMDAwMDAwMDAwMDAwMDA1IChTVFJUQUIpICAgICAgICAgICAgIDB4OTM1MAorIyAgLi4uCisjCisjIE5vdGU6IEluIGNvbnRyYXN0IHRvIGxkZCwgcmVhZGxlZiBzaG93cyBvbmx5IGRpcmVjdCBkZXBlbmRlbmNpZXMuCisjCitzdWIgZ2V0X2RlcHNfcmVhZGVsZigkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkdG9vbDsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmKCR0YXJnZXRfYXJjaCBlcSAibWljIikgeworICAgICAgICAkdG9vbCA9ICJ4ODZfNjQtazFvbS1saW51eC1yZWFkZWxmIjsKKyAgICB9IGVsc2UgeworICAgICAgICAkdG9vbCA9ICJyZWFkZWxmIjsKKyAgICB9CisKKyAgICAjIEZvcmNlIHRoZSByZWFkZWxmIGNhbGwgdG8gYmUgaW4gRW5nbGlzaC4gRm9yIGV4YW1wbGUsIHdoZW4gcmVhZGVsZgorICAgICMgaXMgY2FsbGVkIG9uIGEgZnJlbmNoIGxvY2FsaXphdGlvbiwgaXQgd2lsbCBmaW5kICJMaWJyYWlyaWUgcGFydGFnZWVzIgorICAgICMgaW5zdGVhZCBvZiBzaGFyZWQgbGlicmFyeQorICAgICRFTlZ7IExBTkcgfSA9ICJDIjsKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSBoZWFkZXIuCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15ccyokfSApCisgICAgICAgIG9yIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgKysgJGk7CisgICAgaWYgKCAkaSA9PSBAYnVsayAtIDEgYW5kICRidWxrWyAkaSBdID1+IG17XlRoZXJlIGlzIG5vIGR5bmFtaWMgc2VjdGlvbiBpbiB0aGlzIGZpbGVcLlxzKiR9ICkgeworICAgICAgICAjIFRoaXMgaXMgbm90IGR5bmFtaWMgZXhlY3V0YWJsZSA9PiBubyBkZXBlbmRlbmNpZXMuCisgICAgICAgIHJldHVybiBAZGVwczsKKyAgICB9OyAjIGlmCisgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte15EeW5hbWljICg/OnNlZ21lbnR8c2VjdGlvbikgYXQgb2Zmc2V0IDB4WzAtOWEtZl0rIGNvbnRhaW5zIFxkKyBlbnRyaWVzOlxzKiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKlRhZ1xzK1R5cGVccytOYW1lL1ZhbHVlXHMqJH0gKQorICAgICAgICBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICsrICRpOworICAgICMgUGFyc2UgYm9keS4KKyAgICB3aGlsZSAoICRpIDwgQGJ1bGsgKSB7CisgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgIGlmICggJGxpbmUgIX4gbXteXHMqMHhbMC05YS1mXStccytcKChbX0EtWjAtOV0rKVwpXHMrKC4qKVxzKiR9aSApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkdHlwZSwgJHZhbHVlICkgPSAoICQxLCAkMiApOworICAgICAgICBpZiAoICR0eXBlIGVxICJORUVERUQiICkgeworICAgICAgICAgICAgaWYgKCAkdmFsdWUgIX4gbXtcQVNoYXJlZCBsaWJyYXJ5OiBcWyguKilcXVx6fSApIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgbXkgJGRlcCA9ICQxOworICAgICAgICAgICAgcHVzaCggQGRlcHMsICRkZXAgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICArKyAkaTsKKyAgICB9OyAjIGZvcmVhY2ggJGkKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfcmVhZGVsZgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgT1MgWCogdmVyc2lvbiBvZiBnZXRfZGVwcygpIHBhcnNlcyBvdXRwdXQgb2Ygb3Rvb2w6CisjCisjICQgb3Rvb2wgLUwgbGlibmFtZS5keWxpYgorIyBleHBvcnRzL21hY18zMi9saWIudGhpbi9saWJvbXAuZHlsaWI6CisjICAgICAgICBsaWJvbXAuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiA1LjAuMCwgY3VycmVudCB2ZXJzaW9uIDUuMC4wKQorIyAgICAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIgKGNvbXBhdGliaWxpdHkgdmVyc2lvbiAxLjAuMCwgY3VycmVudCB2ZXJzaW9uIDg4LjEuMykKKyMKK3N1YiBnZXRfZGVwc19vdG9vbCgkKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0ICggQF8gKTsKKyAgICBteSAkbmFtZSA9IGdldF9maWxlKCAkZmlsZSApOworICAgIG15ICR0b29sID0gIm90b29sIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIGlmICggJHRhcmdldF9hcmNoIGVxICIzMmUiICkgeworICAgICAgICAjIE9uIG9sZGVyIChUaWdlcikgc3lzdGVtcyBvdG9vbCBkb2VzIG5vdCByZWNvZ25pemUgNjQtYml0IGJpbmFyaWVzLCBzbyB0cnkgdG8gbG9jYXRlCisgICAgICAgICMgb3Rvb2w2NC4KKyAgICAgICAgbXkgJHBhdGggPSB3aGljaCggIm90b29sNjQiICk7CisgICAgICAgIGlmICggZGVmaW5lZCAoICRwYXRoICkgKSB7CisgICAgICAgICAgICAkdG9vbCA9ICJvdG9vbDY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgJHRvb2wsICItTCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisgICAgZGVidWcoIEBidWxrLCAiKGVvZikiICk7CisKKyAgICBteSAkaSA9IDA7CisgICAgIyBQYXJzZSB0aGUgZmlyc3Qgb25lIG9yIHR3byBsaW5lcyBzZXBhcmF0ZWx5LgorICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXFEkZmlsZVxFOiR9ICkKKyAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICArKyAkaTsKKyAgICBpZiAoICRuYW1lID1+IG17XC5keWxpYlx6fSApIHsKKyAgICAgICAgIyBBZGRlZCAiQHJwYXRoLyIgZW5hYmxlcyBkeW5hbWljIGxvYWQgb2YgdGhlIGxpYnJhcnkgZGVzaWduYXRlZCBhdCBsaW5rIHRpbWUuCisgICAgICAgICRuYW1lID0gJ0BycGF0aC8nIC4gJG5hbWU7CisgICAgICAgICMgSW4gY2FzZSBvZiBkeW5hbWljIGxpYnJhcnkgb3Rvb2wgcHJpbnQgdGhlIGxpYnJhcnkgaXRzZWxmIGFzIGEgZGVwZW5kZW50IGxpYnJhcnkuCisgICAgICAgICggJGkgPCBAYnVsayBhbmQgJGJ1bGtbICRpIF0gPX4gbXteXHMrXFEkbmFtZVxFXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb24uKlwpJH0gKQorICAgICAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgKysgJGk7CisgICAgfTsgIyBpZgorCisgICAgIyBUaGVuIHBhcnNlIHRoZSByZXN0LgorICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgbXkgJGxpbmUgPSAkYnVsa1sgJGkgXTsKKyAgICAgICAgaWYgKCAkbGluZSAhfiBtL15ccyooLiopXHMrXChjb21wYXRpYmlsaXR5IHZlcnNpb25ccy4qXCkkLyApIHsKKyAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgbXkgKCAkZGVwICkgPSAoICQxICk7CisgICAgICAgIHB1c2goIEBkZXBzLCAkZGVwICk7CisgICAgICAgICsrICRpOworICAgIH07ICMgd2hpbGUKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfb3Rvb2wKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFdpbmRvd3MqIE9TIHZlcnNpb24gb2YgZ2V0X2RlcHMoKSBwYXJzZXMgb3V0cHV0IG9mIGxpbms6CisjCisjID4gbGluayAtZHVtcCAtZGVwZW5kZW50cyBsaWJuYW1lLmRsbAorIyBNaWNyb3NvZnQgKFIpIENPRkYvUEUgRHVtcGVyIFZlcnNpb24gOC4wMC40MDMxMC4zOQorIyBDb3B5cmlnaHQgKEMpIE1pY3Jvc29mdCBDb3Jwb3JhdGlvbi4gIEFsbCByaWdodHMgcmVzZXJ2ZWQuCisjIER1bXAgb2YgZmlsZSBTOlxQcm9qZWN0cy5PTVBcdXNlcnNcb21hbHlzaGVcb21wXGxpYm9tcFxleHBvcnRzXHdpbl82NFxsaWJcbGlib21wbWQuZGxsCisjIEZpbGUgVHlwZTogRExMCisjICAgSW1hZ2UgaGFzIHRoZSBmb2xsb3dpbmcgZGVwZW5kZW5jaWVzOgorIyAgICAgS0VSTkVMMzIuZGxsCisjICAgU3VtbWFyeQorIyAgICAgICAgIEMwMDAgLmRhdGEKKyMgICAgICAgICA2MDAwIC5wZGF0YQorIyAgICAgICAgMTgwMDAgLnJkYXRhCisjICAgICAgICAuLi4KKyMKKyMgPiBsaW5rIC1kdW1wIC1kaXJlY3RpdmVzIGxpYm5hbWUubGliCisjIE1pY3Jvc29mdCAoUikgQ09GRi9QRSBEdW1wZXIgVmVyc2lvbiA4LjAwLjQwMzEwLjM5CisjIENvcHlyaWdodCAoQykgTWljcm9zb2Z0IENvcnBvcmF0aW9uLiAgQWxsIHJpZ2h0cyByZXNlcnZlZC4KKyMgRHVtcCBvZiBmaWxlIFM6XFByb2plY3RzLk9NUFx1c2Vyc1xvbWFseXNoZVxvbXBcbGlib21wXGV4cG9ydHNcd2luXzMyZVxsaWJcbGliaW1wNW10LmxpYgorIyBGaWxlIFR5cGU6IExJQlJBUlkKKyMgICBMaW5rZXIgRGlyZWN0aXZlcworIyAgIC0tLS0tLS0tLS0tLS0tLS0tCisjICAgLWRlZmF1bHRsaWI6InV1aWQubGliIgorIyAgIC1kZWZhdWx0bGliOiJ1dWlkLmxpYiIKKyMgICAuLi4uLgorIyAgIFN1bW1hcnkKKyMgICAgICAgMzI1MCAuYnNzCisjICAgICAgIDNGQkMgLmRhdGEKKyMgICAgICAgICAzNCAuZGF0YTEKKyMgICAgICAgLi4uLgorc3ViIGdldF9kZXBzX2xpbmsoJCkgeworCisgICAgbXkgKCAkbGliICkgPSBAXzsKKyAgICBteSAkdG9vbCA9ICJsaW5rIjsKKyAgICBteSBAYnVsazsKKyAgICBteSBAZGVwczsKKworICAgIG15ICRleHQgPSBsYyggZ2V0X2V4dCggJGxpYiApICk7CisgICAgaWYgKCAkZXh0ICF+IG17XEFcLig/OmxpYnxkbGx8ZXhlKVx6fWkgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJJbmNvcnJlY3QgZmlsZSBpcyBzcGVjaWZpZWQ6IGAkbGliJzsgb25seSBgbGliJywgYGRsbCcgb3IgYGV4ZScgZmlsZSBleHBlY3RlZCIgKTsKKyAgICB9OyAjIGlmCisKKyAgICBleGVjdXRlKAorICAgICAgICBbICR0b29sLCAiL2R1bXAiLCAoICRleHQgZXEgIi5saWIiID8gIi9kaXJlY3RpdmVzIiA6ICIvZGVwZW5kZW50cyIgKSwgJGxpYiBdLAorICAgICAgICAtc3Rkb3V0ID0+IFxAYnVsaworICAgICk7CisKKyAgICBkZWJ1ZyggQGJ1bGssICIoZW9mKSIgKTsKKworICAgIG15ICRpID0gMDsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17Xk1pY3Jvc29mdCBcKFJcKSBDT0ZGXC9QRSBEdW1wZXIgVmVyc2lvbi4qJH0gKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkNvcHlyaWdodCBcKENcKSBNaWNyb3NvZnQgQ29ycG9yYXRpb25cLi4qJH0gKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkR1bXAgb2YgZmlsZVxzXFEkbGliXEUkfSAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XkZpbGUgVHlwZTpccyguKikkfSAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKyAgICAoICRpIDwgQGJ1bGsgYW5kICRidWxrWyAkaSBdID1+IG17XlxzKiR9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKSBvciBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOyArKyAkaTsKKworICAgIGlmICggJGV4dCBlcSAiLmxpYiIgKSB7CisKKyAgICAgICAgbXkgJWRlcHM7CisgICAgICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqWy0vXWRlZmF1bHRsaWJcOiguKilccyokfWkgKSB7CisgICAgICAgICAgICAgICAgbXkgJGRlcCA9ICQxOworICAgICAgICAgICAgICAgICMgTm9ybWFsaXplIGxpYnJhcnkgbmFtZToKKyAgICAgICAgICAgICAgICAkZGVwID0gbGMoICQxICk7ICAgICAgICAgICAgICAjIENvbnZlcnQgdG8gbG93ZXIgY2FzZS4KKyAgICAgICAgICAgICAgICAkZGVwID1+IHN7XEEiKC4qKSJcen17JDF9OyAgICAjIERyb3Agc3Vycm91bmRpbmcgcXVvdGVzIChpZiBhbnkpLgorICAgICAgICAgICAgICAgICRkZXAgPX4gc3tcLmxpYlx6fXt9OyAgICAgICAgICMgRHJvcCAubGliIHN1ZmZpeCAoaWYgYW55KS4KKyAgICAgICAgICAgICAgICAkZGVwc3sgJGRlcCB9ID0gMTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccypMaW5rZXIgRGlyZWN0aXZlc1xzKiR9ICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKi0rXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqL2FsdGVybmF0ZW5hbWVcOi4qJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqL0ZBSUxJRk1JU01BVENIXDouKiR9ICkgeworICAgICAgICAgICAgICAgICMgVGhpcyBkaXJlY3RpdmUgaXMgcHJvZHVjZWQgb25seSBieSBfTVNDX1ZFUj0xNjAwCisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqU3VtbWFyeVxzKiR9ICkgeworICAgICAgICAgICAgICAgIGxhc3Q7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHBhcnNlX2Vycm9yKCAkdG9vbCwgQGJ1bGssICRpICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICArKyAkaTsKKyAgICAgICAgfSAjIHdoaWxlCisgICAgICAgIEBkZXBzID0ga2V5cyggJWRlcHMgKTsKKworICAgIH0gZWxzZSB7CisKKyAgICAgICAgKCAkaSA8IEBidWxrIGFuZCAkYnVsa1sgJGkgXSA9fiBte1xzKkltYWdlIGhhcyB0aGUgZm9sbG93aW5nIGRlcGVuZGVuY2llc1w6JH0gKQorICAgICAgICAgICAgb3IgcGFyc2VfZXJyb3IoICR0b29sLCBAYnVsaywgJGkgKTsKKyAgICAgICAgKysgJGk7CisgICAgICAgIHdoaWxlICggJGkgPCBAYnVsayApIHsKKyAgICAgICAgICAgIG15ICRsaW5lID0gJGJ1bGtbICRpIF07CisgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqJH0gKSB7CisgICAgICAgICAgICAgICAgIyBJZ25vcmUgZW1wdHkgbGluZXMuCisgICAgICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKC4qXC5kbGwpJH1pICkgeworICAgICAgICAgICAgICAgIG15ICRkZXAgPSBsYyggJDEgKTsKKyAgICAgICAgICAgICAgICBwdXNoKCBAZGVwcywgJGRlcCApOworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKlN1bW1hcnkkfSApIHsKKyAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBwYXJzZV9lcnJvciggJHRvb2wsIEBidWxrLCAkaSApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgKysgJGk7CisgICAgICAgIH07ICMgd2hpbGUKKworICAgIH07ICMgaWYKKworICAgIHJldHVybiBAZGVwczsKKworfTsgIyBzdWIgZ2V0X2RlcHNfbGluaworCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgTWFpbi4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBQYXJzZSBjb21tYW5kIGxpbmUuCitteSAkZXhwZWN0ZWQ7CitteSAkYmFyZTsKK0dldG9wdDo6TG9uZzo6Q29uZmlndXJlKCAicGVybXV0ZSIgKTsKK2dldF9vcHRpb25zKAorICAgICJvcz1zIiAgICAgICA9PiBcJHRhcmdldF9vcywKKyAgICAiYXJjaD1zIiAgICAgPT4gXCR0YXJnZXRfYXJjaCwKKyAgICAiYmFyZSIgICAgICAgPT4gXCRiYXJlLAorICAgICJleHBlY3RlZD1zIiA9PiBcJGV4cGVjdGVkLAorKTsKK215IEBleHBlY3RlZDsKK2lmICggZGVmaW5lZCggJGV4cGVjdGVkICkgKSB7CisgICAgaWYgKCAkZXhwZWN0ZWQgbmUgIm5vbmUiICkgeworICAgICAgICBAZXhwZWN0ZWQgPSBzb3J0KCBzcGxpdCggIiwiLCAkZXhwZWN0ZWQgKSApOworICAgICAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICAgICBAZXhwZWN0ZWQgPSBtYXAoIGxjKCAkXyApLCBAZXhwZWN0ZWQgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKK2lmICggQEFSR1YgPCAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJTcGVjaWZ5IGEgbGlicmFyeSBuYW1lIHRvIGNoZWNrIGZvciBkZXBlbmRlbmNpZXMiICk7Cit9OyAjIGlmCitpZiAoIEBBUkdWID4gMSApIHsKKyAgICBjbWRsaW5lX2Vycm9yKCAiVG9vIG1hbnkgYXJndW1lbnRzIiApOworfTsgIyBpZgorbXkgJGxpYiA9IHNoaWZ0KCBAQVJHViApOworaWYgKCBub3QgLWUgJGxpYiApeworICAgIHJ1bnRpbWVfZXJyb3IoICJTcGVjaWZpZWQgZmlsZSBkb2VzIG5vdCBleGlzdDogXCIkbGliXCIiICk7Cit9OyAjIGlmCisKKyMgU2VsZWN0IGFwcHJvcHJpYXRlIGdldF9kZXBzIGltcGxlbWVudGF0aW9uLgoraWYgKCAwICkgeworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgImxpbiIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19yZWFkZWxmOworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIm1hYyIgKSB7CisgICAgKmdldF9kZXBzID0gXCpnZXRfZGVwc19vdG9vbDsKK30gZWxzaWYgKCAkdGFyZ2V0X29zIGVxICJ3aW4iICkgeworICAgICpnZXRfZGVwcyA9IFwqZ2V0X2RlcHNfbGluazsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9TIFwiJHRhcmdldF9vc1wiIG5vdCBzdXBwb3J0ZWQiICk7Cit9OyAjIGlmCisKKyMgRG8gdGhlIHdvcmsuCitteSBAZGVwcyA9IHNvcnQoIGdldF9kZXBzKCAkbGliICkgKTsKK2lmICggJGJhcmUgKSB7CisgICAgcHJpbnQoIG1hcCggIiRfXG4iLCBAZGVwcyApICk7Cit9IGVsc2UgeworICAgIGluZm8oICJEZXBlbmRlbmNpZXM6IiwgQGRlcHMgPyBtYXAoICIgICAgJF8iLCBAZGVwcyApIDogIihub25lKSIgKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJGV4cGVjdGVkICkgKSB7CisgICAgbXkgJWRlcHMgPSBtYXAoICggJF8gPT4gMSApLCBAZGVwcyApOworICAgIGZvcmVhY2ggbXkgJGRlcCAoIEBleHBlY3RlZCApIHsKKyAgICAgICAgZGVsZXRlKCAkZGVwc3sgJGRlcCB9ICk7CisgICAgfTsgIyBmb3JlYWNoCisgICAgbXkgQHVuZXhwZWN0ZWQgPSBzb3J0KCBrZXlzKCAlZGVwcyApICk7CisgICAgaWYgKCBAdW5leHBlY3RlZCApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIlVuZXhwZWN0ZWQgZGVwZW5kZW5jaWVzOiIsIG1hcCggIiAgICAkXyIsIEB1bmV4cGVjdGVkICkgKTsKKyAgICB9OyAjIGlmCit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8Y2hlY2stZGVwZW5kcy5wbD4gLS0gQ2hlY2sgZGVwZW5kZW5jaWVzIGZvciBhIHNwZWNpZmllZCBsaWJyYXJ5LgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxjaGVjay1kZXBlbmRzLnBsPiBJPE9QVElPTlM+Li4uIEk8bGlicmFyeT4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0M8Y2hlY2stZGVwZW5kcy5wbD4gZmluZHMgZGlyZWN0IGRlcGVuZGVuY2llcyBmb3IgYSBzcGVjaWZpZWQgbGlicmFyeS4gTGlzdCBvZiBhY3R1YWwgZGVwZW5kZW5jaWVzCitpcyBzb3J0ZWQgYWxwaGFiZXRpY2FsbHkgYW5kIHByaW50ZWQuIElmIGxpc3Qgb2YgZXhwZWN0ZWQgZGVwZW5kZW5jaWVzIGlzIHNwZWNpZmllZCwgdGhlIHNjcmlwdHMKK2NoZWNrcyB0aGUgbGlicmFyeSBoYXMgb25seSBhbGxvd2VkIGRlcGVuZGVuY2llcy4gSW4gY2FzZSBvZiBub3QgZXhwZWN0ZWQgZGVwbmRlbmNpZXMgdGhlIHNjcmlwdAoraXNzdWVzIGVycm9yIG1lc3NhZ2UgYW5kIGV4aXRzIHdpdGggbm9uLXplcm8gY29kZS4KKworTGludXgqIE9TIGFuZCBPUyBYKjogVGhlIHNjcmlwdCBmaW5kcyBkZXBlbmRlbmNpZXMgb25seSBmb3IgZHltYW1pYyBsaWJyYXJpZXMuIFdpbmRvd3MqIE9TOiBUaGUgc2NyaXB0CitmaW5kcyBkZXBlbmRlbmNpZXMgZm9yIGVpdGhlciBzdGF0aWMgb3IgZHltYW1pYyBsaWJyYXJpZXMuCisKK1RoZSBzY3JpcHQgdXNlcyBleHRlcm5hbCB0b29scy4gT24gTGludXgqIE9TLCBpdCBydW5zIEY8cmVhZGVsZj4sIG9uIE9TIFgqIC0tIEY8b3Rvb2w+IChvciBGPG90b29sNjQ+KSwKK29uIFdpbmRvd3MqIE9TIC0tIEY8bGluaz4uCisKK09uIFdpbmRvd3MqIE9TIGRlcGVuZGVuY2llcyBhcmUgcHJpbnRlZCBpbiBsb3dlciBjYXNlLCBjYXNlIG9mIGV4cGVjdGVkIGRlcGVuZGVuY2llcyBpZ25vcmVkLgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tYmFyZT4KKworRG8gbm90IHVzZSBmYW5jeSBmb3JtYXR0aW5nOyBwcm9kdWNlIHBsYWluLCBiYXJlIG91dHB1dDoganVzdCBhIGxpc3Qgb2YgbGlicmFyaWVzLAorYSBsaWJyYXJ5IHBlciBsaW5lLgorCis9aXRlbSBCPC0tZXhwZWN0ZWQ9Pkk8bGlzdD4KKworSTxsaXN0PiBpcyBjb21tYS1zZXBhcmF0ZWQgbGlzdCBvZiBleHBlY3RlZCBkZXBlbmRlbmNpZXMgKG9yIEM8bm9uZT4pLgorSWYgQzwtLWV4cGVjdGVkPiBvcHRpb24gc3BlY2lmaWVkLCBDPGNoZWNrLWRlcGVuZHMucGw+IGNoZWNrcyB0aGUgc3BlY2lmaWVkIGxpYnJhcnkKK2hhcyBvbmx5IGV4cGVjdGVkIGRlcGVuZGVuY2llcy4KKworPWl0ZW0gQjwtLW9zPT5JPHN0cj4KKworU3BlY2lmeSB0YXJnZXQgT1MgKHRvb2wgdG8gdXNlKSBtYW51YWxseS4KK1VzZWZ1bCBmb3IgY3Jvc3MtYnVpbGQsIHdoZW4gaG9zdCBPUyBpcyBub3QgdGhlIHNhbWUgYXMgdGFyZ2V0IE9TLgorSTxzdHI+IHNob3VsZCBiZSBlaXRoZXIgQzxsaW4+LCBDPG1hYz4sIG9yIEM8d2luPi4KKworPWJhY2sKKworPWhlYWQyIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBkb2N1bWVudGF0aW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK0RvIG5vdCBvdXRwdXQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gYW5kIGV4aXQuCisKKz1iYWNrCisKKz1oZWFkMSBBUkdVTUVOVFMKKworPW92ZXIKKworPWl0ZW0gSTxsaWJyYXJ5PgorCitBIG5hbWUgb2YgbGlicmFyeSB0byBmaW5kIG9yIGNoZWNrIGRlcGVuZGVuY2llcy4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0p1c3QgcHJpbnQgbGlicmFyeSBkZXBlbmRlbmNpZXMgKFdpbmRvd3MqIE9TKToKKworICAgID4gY2hlY2stZGVwZW5kcy5wbCBleHBvcnRzL3dpbl8zMi9saWIvbGlib21wbWQuZGxsCisgICAgY2hlY2stZGVwZW5kcy5wbDogKGkpIERlcGVuZGVuY2llczoKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgICAgIGtlcm5lbDMyLmRsbAorCitQcmludCBsaWJyYXJ5IGRlcGVuZGVuY2llcywgdXNlIGJhcmUgb3V0cHV0IChMaW51eCogT1MpOgorCisgICAgJCBjaGVjay1kZXBlbmRzLnBsIC0tYmFyZSBleHBvcnRzL2xpbl8zMmUvbGliL2xpYm9tcF9kYi5zbworICAgIGxpYmMuc28uNgorICAgIGxpYmRsLnNvLjIKKyAgICBsaWJwdGhyZWFkLnNvLjAKKworQ2hlY2sgdGhlIGxpYnJhcnkgZG9lcyBub3QgaGF2ZSBhbnkgZGVwZW5kZW5jaWVzIChPUyBYKik6CisKKyAgICAkIGNoZWNrLWRlcGVuZHMucGwgLS1leHBlY3RlZD1ub25lIGV4cG9ydHMvbWFjXzMyL2xpYi9saWJvbXAuZHlsaWIKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoaSkgRGVwZW5kZW5jaWVzOgorICAgIGNoZWNrLWRlcGVuZHMucGw6IChpKSAgICAgL3Vzci9saWIvbGliU3lzdGVtLkIuZHlsaWIKKyAgICBjaGVjay1kZXBlbmRzLnBsOiAoeCkgVW5leHBlY3RlZCBkZXBlbmRlbmNpZXM6CisgICAgY2hlY2stZGVwZW5kcy5wbDogKHgpICAgICAvdXNyL2xpYi9saWJTeXN0ZW0uQi5keWxpYgorICAgICQgZWNobyAkPworICAgIDIKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsIGIvcmMzL3J1bnRpbWUvdG9vbHMvY2hlY2stZXhlY3N0YWNrLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLmNmMjQ3NDIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90b29scy9jaGVjay1leGVjc3RhY2sucGwKQEAgLTAsMCArMSwxNDYgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaW5kQmluOwordXNlIGxpYiAiJEZpbmRCaW46OkJpbi9saWIiOworCit1c2UgdG9vbHM7CisKK291ciAkVkVSU0lPTiA9ICIwLjAwMiI7CitteSAkdGFyZ2V0X2FyY2g7CisKK3N1YiBleGVjc3RhY2soJCkgeworICAgIG15ICggJGZpbGUgKSA9IEBfOworICAgIG15IEBvdXRwdXQ7CisgICAgbXkgQHN0YWNrOworICAgIG15ICR0b29sOworICAgIGlmKCR0YXJnZXRfYXJjaCBlcSAibWljIikgeworICAgICAgICAkdG9vbCA9ICJ4ODZfNjQtazFvbS1saW51eC1yZWFkZWxmIjsKKyAgICB9IGVsc2UgeworICAgICAgICAkdG9vbCA9ICJyZWFkZWxmIjsKKyAgICB9CisgICAgZXhlY3V0ZSggWyAkdG9vbCwgIi1sIiwgIi1XIiwgJGZpbGUgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCApOworICAgIEBzdGFjayA9IGdyZXAoICRfID1+IG17XEFccyooPzpHTlVfKT9TVEFDS1xzK30sIEBvdXRwdXQgKTsKKyAgICBpZiAoIG5vdCBAc3RhY2sgKSB7CisgICAgICAgICMgSW50ZXJwcmV0IG1pc3NlZCAiU1RBQ0siIGxpbmUgYXMgZXJyb3IuCisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkZmlsZTogTm8gc3RhY2sgc2VnbWVudCBmb3VuZDsgbG9va3MgbGlrZSBzdGFjayB3b3VsZCBiZSBleGVjdXRhYmxlLiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAc3RhY2sgPiAxICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IE1vcmUgdGhhbiBvbmUgc3RhY2sgc2VnbWVudCBmb3VuZC4iLCAicmVhZGVsZiBvdXRwdXQ6IiwgQG91dHB1dCwgIihlb2YpIiApOworICAgIH07ICMgaWYKKyAgICAjIFR5cGljYWwgc3RhY2sgbGluZXMgYXJlOgorICAgICMgTGludXgqIE9TIElBLTMyIGFyY2hpdGVjdHVyZToKKyAgICAjICAgIEdOVV9TVEFDSyAgICAgIDB4MDAwMDAwIDB4MDAwMDAwMDAgMHgwMDAwMDAwMCAweDAwMDAwIDB4MDAwMDAgUldFIDB4NAorICAgICMgTGludXgqIE9TIEludGVsKFIpIDY0OgorICAgICMgICAgR05VX1NUQUNLICAgICAgMHgwMDAwMDAgMHgwMDAwMDAwMDAwMDAwMDAwIDB4MDAwMDAwMDAwMDAwMDAwMCAweDAwMDAwMCAweDAwMDAwMCBSV0UgMHg4CisgICAgaWYgKCAkc3RhY2tbIDAgXSAhfiBte1xBXHMqKD86R05VXyk/U1RBQ0soPzpccysweFswLTlhLWZdKyl7NX1ccysoW1IgXVtXIF1bRSBdKVxzKzB4WzAtOWEtZl0rXHMqXHp9ICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJGZpbGU6IENhbm5vdCBwYXJzZSBzdGFjayBzZWdtZW50IGxpbmU6IiwgIj4+PiAkc3RhY2tbIDAgXSIgKTsKKyAgICB9OyAjIGlmCisgICAgbXkgJGF0dHJzID0gJDE7CisgICAgaWYgKCAkYXR0cnMgPX4gbXtFfSApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRmaWxlOiBTdGFjayBpcyBleGVjdXRhYmxlIiApOworICAgIH07ICMgaWYKK307ICMgc3ViIGV4ZWNzdGFjaworCitnZXRfb3B0aW9ucygKKyAgICAiYXJjaD1zIiA9PiBcJHRhcmdldF9hcmNoLAorKTsKKworZm9yZWFjaCBteSAkZmlsZSAoIEBBUkdWICkgeworICAgIGV4ZWNzdGFjayggJGZpbGUgKTsKK307ICMgZm9yZWFjaCAkZmlsZQorCitleGl0KCAwICk7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGNoZWNrLWV4ZWNzdGFjay5wbD4gLS0gQ2hlY2sgd2hldGhlciBzdGFjayBpcyBleGVjdXRhYmxlLCBpc3N1ZSBhbiBlcnJvciBpZiBzby4KKworPWhlYWQxIFNZTk9QU0lTCisKK0I8Y2hlY2stZXhlY3N0YWNrLnBsPiBJPG9wdGlpb24+Li4uIEk8ZmlsZT4uLi4KKworPWhlYWQxIERFU0NSSVBUSU9OCisKK1RoZSBzY3JpcHQgY2hlY2tzIHdoZXRoZXIgc3RhY2sgb2Ygc3BlY2lmaWVkIGV4ZWN1dGFibGUgZmlsZSwgYW5kIGlzc3VlcyBlcnJvciBpZiBzdGFjayBpcworZXhlY3V0YWJsZS4gSWYgc3RhY2sgaXMgbm90IGV4ZWN1dGFibGUsIHRoZSBzY3JpcHQgZXhpdHMgc2lsZW50bHkgd2l0aCB6ZXJvIGV4aXQgY29kZS4KKworVGhlIHNjcmlwdCBydW5zIEM8cmVhZGVsZj4gdXRpbGl0eSB0byBnZXQgaW5mb3JtYXRpb24gYWJvdXQgc3BlY2lmaWVkIGV4ZWN1dGFibGUgZmlsZS4gU28sIHRoZQorc2NyaXB0IGZhaWxzIGlmIEM8cmVhZGVsZj4gaXMgbm90IGF2YWlsYWJsZS4gRWZmZWN0aXZlbHkgaXQgbWVhbnMgdGhlIHNjcmlwdCB3b3JrcyBvbmx5IG9uIExpbnV4KiBPUworKGFuZCwgcHJvYmFibHksIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSkuCisKKz1oZWFkMSBPUFRJT05TCisKKz1vdmVyCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGZpbGU+CisKK0EgbmFtZSBvZiBleGVjdXRhYmxlIG9yIHNoYXJlZCBvYmplY3QgdG8gY2hlY2suIE11bHRpcGxlIGZpbGVzIG1heSBiZSBzcGVjaWZpZWQuCisKKz1iYWNrCisKKz1oZWFkMSBFWEFNUExFUworCitDaGVjayBsaWJvbXAuc28gbGlicmFyeToKKworICAgICQgY2hlY2stZXhlY3N0YWNrLnBsIGxpYm9tcC5zbworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwgYi9yYzMvcnVudGltZS90b29scy9jaGVjay1pbnN0cnVjdGlvbi1zZXQucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uYjUwNWU0OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2NoZWNrLWluc3RydWN0aW9uLXNldC5wbApAQCAtMCwwICsxLDMyMSBAQAorIyEvdXNyL2Jpbi9wZXJsCisKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKK215ICR0YXJnZXRfb3M7CitteSAkdGFyZ2V0X2FyY2g7CitteSAkdGFyZ2V0X21pY19hcmNoOworCitteSAkaGV4ID0gcXJ7WzAtOWEtZl19aTsgICAgIyBoZXggZGlnaXQuCisKKyMgbWljLXNwZWNpZmljIGRldGFpbHMuCisKK3N1YiBiYWRfbWljX2ZtdCgkKSB7CisgICAgIyBCZWZvcmUgd2UgYWxsb3dlZCBib3RoIGVsZjY0LXg4Ni02NC1mcmVlYnNkIGFuZCBlbGYtbDFvbS1mcmVlYnNkLgorICAgICMgTm93IHRoZSBmaXJzdCBvbmUgaXMgb2Jzb2xldGUsIG9ubHkgZWxmNjQtbDFvbS1mcmVlYnNkIGlzIGFsbG93ZWQuCisgICAgbXkgKCAkZm10ICkgPSBAXzsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICIkdGFyZ2V0X21pY19hcmNoIiBlcSAia25mIiApIHsKKwkgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjY0LWwxb20/XHp9OworICAgIH0gZWxzaWYgKCAiJHRhcmdldF9taWNfYXJjaCIgZXEgImtuYyIgKSB7CisJICAgIHJldHVybiAkZm10ICF+IG17XEFlbGY2NC1rMW9tP1x6fTsKKwl9IGVsc2UgeworCSAgICByZXR1cm4gMTsKKwl9OworfTsgIyBzdWIgYmFkX21pY19mbXQKKworIyBVbmRlc2lyZWQgaW5zdHJ1Y3Rpb25zIGZvciBtaWM6IGFsbCB4ODcgYW5kIHNvbWUgb3RoZXIuCisjIEFDOiBTaW5jZSBjb21waWxlciAyMDEwLTA2LTMwIHg4NyBpbnN0cnVjdGlvbnMgYXJlIHN1cHBvcnRlZCwgcmVtb3ZlZCB0aGUgY2hlY2sgb2YgeDg3LgorbXkgJG1pY19iYWRfcmU7CitzdWIgYmFkX21pY19pbnN0cigkJCkgeworICAgIG15ICggJGluc3RyLCAkYXJncyApID0gQF87CisgICAgaWYgKCAiJHRhcmdldF9taWNfYXJjaCIgZXEgImtuYyIgKSB7CisJIyB3b3JrYXJvdW5kIG9mIGJhZCBjb2RlIGdlbmVyYXRpb24gb24gS05GIExpbnV4KiBPUzoKKwlyZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRtaWNfYmFkX3JlICk7CisgICAgfSBlbHNlIHsKKwlyZXR1cm4gKCBkZWZpbmVkKCAkaW5zdHIgKSBhbmQgJGluc3RyID1+ICRtaWNfYmFkX3JlIG9yIGRlZmluZWQoICRhcmdzICkgYW5kICRhcmdzID1+IG17eG1tfWkgKTsKKyAgICB9Cit9OyAjIHN1YiBiYWRfbWljX2luc3RyCisKKyMgbGluXzMyLXNwZWNpZmljIGRldGFpbHMuCisKK3N1YiBiYWRfaWEzMl9mbXQoJCkgeworICAgIG15ICggJGZtdCApID0gQF87CisgICAgcmV0dXJuICRmbXQgIX4gbXtcQWVsZjMyLWkzODZcen07Cit9OyAjIHN1YiBiYWRfaWEzMl9mbXQKKworbXkgQHNzZTIgPQorICAgIHF3eworICAgICAgICBtb3ZhcGQgbW92dXBkIG1vdmhwZCBtb3ZscGQgbW92bXNrcGQgbW92c2QKKyAgICAgICAgYWRkcGQgYWRkc2Qgc3VicGQgc3Vic2QgbXVscGQgbXVsc2QgZGl2cGQgZGl2c2Qgc3FydHBkIHNxcnRzZCBtYXhwZCBtYXhzZCBtaW5wZCBtaW5zZAorICAgICAgICBhbmRwZCBhbmRucGQgb3JwZCB4b3JwZAorICAgICAgICBjbXBwZCBjbXBzZCBjb21pc2QgdWNvbWlzZAorICAgICAgICBzaHVmcGQgdW5wY2tocGQgdW5wY2tscGQKKyAgICAgICAgY3Z0cGQycGkgY3Z0dHBkMnBpIGN2dHBpMnBkIGN2dHBkMmRxIGN2dHRwZDJkcSBjdnRkcTJwZCBjdnRwczJwZCBjdnRwZDJwcyBjdnRzczJzZCBjdnRzZDJzcworICAgICAgICBjdnRzZDJzaSBjdnR0c2Qyc2kgY3Z0c2kyc2QgY3Z0ZHEycHMgY3Z0cHMyZHEgY3Z0dHBzMmRxIG1vdmRxYSBtb3ZkcXUgbW92cTJkcSBtb3ZkcTJxCisgICAgICAgIHBtdWx1ZHEgcGFkZHEgcHN1YnEgcHNodWZsdyBwc2h1Zmh3IHBzaHVmZCBwc2xsZHEgcHNybGRxIHB1bnBja2hxZHEgcHVucGNrbHFkcSBjbGZsdXNoCisgICAgICAgIGxmZW5jZSBtZmVuY2UgbWFza21vdmRxdSBtb3ZudHBkIG1vdm50ZHEgbW92bnRpCisgICAgfTsKK215IEBzc2UzID0KKyAgICBxd3sKKyAgICAgICAgZmlzdHRwIGxkZHF1IGFkZHN1YnBzIGFkZHN1YnBkIGhhZGRwcyBoc3VicHMgaGFkZHBkIGhzdWJwZCBtb3ZzaGR1cCBtb3ZzbGR1cCBtb3ZkZHVwIG1vbml0b3IKKyAgICAgICAgbXdhaXQKKyAgICB9OworbXkgQHNzc2UzID0KKyAgICBxd3sKKyAgICAgICAgcGhhZGR3IHBoYWRkc3cgcGhhZGRkIHBoc3VidyBwaHN1YnN3IHBoc3ViZCBwYWJzYiBwYWJzdyBwYWJzZCBwbWFkZHVic3cgcG11bGhyc3cgcHNodWZiCisgICAgICAgIHBzaWduYiBwc2lnbncgcHNpZ25kIHBhbGlnbnIKKyAgICB9OworbXkgQHNzZTQgPQorICAgICgKKyAgICAgICAgIyBTU0U0LjEKKyAgICAgICAgcXd7CisgICAgICAgICAgICBwbXVsbGQgcG11bGRxIGRwcGQgZHBwcyBtb3ZudGRxYSBibGVuZHBkIGJsZW5kcHMgYmxlbmR2cGQgYmxlbmR2cHMgcGJsZW5kdmIgcGJsZW5kdyBwbWludXcKKyAgICAgICAgICAgIHBtaW51ZCBwbWluc2IgcG1pbnNkIHBtYXh1dyBwbWF4dWQgcG1heHNiIHBtYXhzZCByb3VuZHBzIHJvdW5kcGQgcm91bmRzcyByb3VuZHNkIGV4dHJhY3RwcworICAgICAgICAgICAgaW5zZXJ0cHMgcGluc3JiIHBpbnNyZCBwaW5zcnEgcGV4dHJiIHBleHRydyBwZXh0cmQgcGV4dHJxIHBtb3ZzeGJ3IHBtb3Z6eGJ3IHBtb3ZzeGJkCisgICAgICAgICAgICBwbW92enhiZCBwbW92c3h3ZCBwbW92enh3ZCBwbW92c3hicSBwbW92enhicSBwbW92c3h3cSBwbW92enh3cSBwbW92c3hkcSBwbW92enhkcSBtcHNhZGJ3CisgICAgICAgICAgICBwaG1pbnBvc3V3IHB0ZXN0IHBjbXBlcXEgcGFja3VzZHcKKyAgICAgICAgfSwKKyAgICAgICAgIyBTU0U0LjIKKyAgICAgICAgcXd7CisgICAgICAgICAgICBwY21wZXN0cmkgcGNtcGVzdHJtIHBjbXBpc3RyaSBwY21waXN0cm0gcGNtcGd0cSBjcmMzMiBwb3BjbnQKKyAgICAgICAgfQorICAgICk7CisKKyMgVW5kZXNpcmVkIGluc3RydWN0aW9ucyBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlOiBQZW50aXVtIDQgKFNTRTIpIGFuZCBuZXdlci4KKyMgVE9ETzogSXQgd291bGQgYmUgbXVjaCBtb3JlIHJlbGlhYmxlIHRvIGxpc3QgKmFsbG93ZWQqIGluc3RydWN0aW9ucyByYXRoZXIgdGhhbiBsaXN0IHVuZGVzaXJlZAorIyBpbnN0cnVjdGlvbnMuIEluIHN1Y2ggYSBjYXNlIHRoZSBsaXN0IHdpbGwgYmUgc3RhYmxlIGFuZCBub3QgcmVxdWlyZSB1cGRhdGUgd2hlbiBTU0U1IGlzIHJlbGVhc2VkLgorbXkgQGlhMzJfYmFkX2xpc3QgPSAoIEBzc2UyLCBAc3NlMywgQHNzc2UzLCBAc3NlNCApOworCitteSAkaWEzMl9iYWRfcmUgPSBxcntAe1sgIl4oPzoiIC4gam9pbiggInwiLCBAaWEzMl9iYWRfbGlzdCApIC4gIikiIF19fWk7CisKK3N1YiBiYWRfaWEzMl9pbnN0cigkJCkgeworICAgIG15ICggJGluc3RyLCAkYXJncyApID0gQF87CisgICAgcmV0dXJuICggZGVmaW5lZCggJGluc3RyICkgYW5kICRpbnN0ciA9fiAkaWEzMl9iYWRfcmUgKTsKK307ICMgc3ViIGJhZF9pYTMyX2luc3RyCisKK3N1YiBjaGVja19maWxlKCQ7JCQpIHsKKworICAgIG15ICggJGZpbGUsICRzaG93X2luc3RydWN0aW9ucywgJG1heF9pbnN0cnVjdGlvbnMgKSA9IEBfOworICAgIG15IEBidWxrOworCisgICAgaWYgKCBub3QgZGVmaW5lZCggJG1heF9pbnN0cnVjdGlvbnMgKSApIHsKKyAgICAgICAgJG1heF9pbnN0cnVjdGlvbnMgPSAxMDA7CisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAieDg2XzY0LWsxb20tbGludXgtb2JqZHVtcCIsICItZCIsICRmaWxlIF0sIC1zdGRvdXQgPT4gXEBidWxrICk7CisKKyAgICBteSAkbiA9IDA7CisgICAgbXkgJGVycm9ycyA9IDA7CisgICAgbXkgJGN1cnJlbnRfZnVuYyAgPSAiIjsgICAgIyBOYW1lIG9mIGN1cnJlbnQgZnVjdGlvbi4KKyAgICBteSAkcmVwb3J0ZWRfZnVuYyA9ICIiOyAgICAjIG5hbWUgb2YgbGFzdCByZXBvcnRlZCBmdW5jdGlvbi4KKyAgICBmb3JlYWNoIG15ICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyokfSApIHsKKyAgICAgICAgICAgICMgRW1wdHkgbGluZS4KKyAgICAgICAgICAgICMgSWdub3JlLgorICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteSW4gYXJjaGl2ZSAoLio/KTpccyokfSApIHsKKyAgICAgICAgICAgICMgSW4gYXJjaGl2ZSBsaWJvbXAuYToKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17Xig/Oi4qPyk6XHMqZmlsZSBmb3JtYXQgKC4qPylccyokfSApIHsKKyAgICAgICAgICAgICMgbGlib21wLnNvOiAgICAgZmlsZSBmb3JtYXQgZWxmNjQteDg2LTY0LWZyZWVic2QKKyAgICAgICAgICAgICMga21wX2Z0bl9jZGVjbC5vOiAgICAgZmlsZSBmb3JtYXQgZWxmNjQteDg2LTY0CisgICAgICAgICAgICBteSAkZm10ID0gJDE7CisgICAgICAgICAgICBpZiAoIGJhZF9mbXQoICRmbXQgKSApIHsKKyAgICAgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiSW52YWxpZCBmaWxlIGZvcm1hdDogJGZtdC4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15EaXNhc3NlbWJseSBvZiBzZWN0aW9uICguKj8pOlxzKiR9ICkgeworICAgICAgICAgICAgIyBEaXNhc3NlbWJseSBvZiBzZWN0aW9uIC5wbHQ6CisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte14kaGV4KyA8KFtePl0rKT46XHMqJH0gKSB7CisgICAgICAgICAgICAjIDAwMDAwMDAwMDAwMTdlOTggPF9fa21wX3N0cl9mb3JtYXRAcGx0LTB4MTA+OgorICAgICAgICAgICAgJGN1cnJlbnRfZnVuYyA9ICQxOworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqXC57M31ccyokfSApIHsKKyAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKigkaGV4Kyk6XHMrKCRoZXgkaGV4KD86ICRoZXgkaGV4KSopXHMrKD86bG9ja1xzK3xyZXhbLmEtel0qXHMrKT8oW14gXSspKD86XHMrKFteI10rPykpP1xzKig/OiN8JCl9ICkgeworICAgICAgICAgICAgIyAgIDE3ZTk4OiAgICAgICBmZiAzNSBmYSA3ZCAyNiAwMCAgICAgICBwdXNocSAgMHgyNjdkZmEoJXJpcCkgICAgICAgICMgMjdmYzk4IDxfR0xPQkFMX09GRlNFVF9UQUJMRT4KKyAgICAgICAgICAgIG15ICggJGFkZHIsICRkdW1wLCAkaW5zdHIsICRhcmdzICkgPSAoICQxLCAkMiwgJDMsICQ0ICk7CisgICAgICAgICAgICAjIENoZWNrIHRoaXMgaXMgbm90IGEgYmFkIGluc3RydWN0aW9uIGFuZCB4bW0gcmVnaXN0ZXJzIGFyZSBub3QgdXNlZC4KKyAgICAgICAgICAgIGlmICggYmFkX2luc3RyKCAkaW5zdHIsICRhcmdzICkgKSB7CisgICAgICAgICAgICAgICAgaWYgKCAkZXJyb3JzID09IDAgKSB7CisgICAgICAgICAgICAgICAgICAgIHdhcm5pbmcoICJJbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZCBpbiBgJGZpbGUnOiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgaWYgKCAkY3VycmVudF9mdW5jIG5lICRyZXBvcnRlZF9mdW5jICkgeworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiICAgICRjdXJyZW50X2Z1bmMiICk7CisgICAgICAgICAgICAgICAgICAgICRyZXBvcnRlZF9mdW5jID0gJGN1cnJlbnRfZnVuYzsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgKysgJGVycm9yczsKKyAgICAgICAgICAgICAgICBpZiAoICRzaG93X2luc3RydWN0aW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIiAgICAgICAgJGxpbmUiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggJGVycm9ycyA+PSAkbWF4X2luc3RydWN0aW9ucyApIHsKKyAgICAgICAgICAgICAgICAgICAgaW5mbyggIiRlcnJvcnMgaW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQ7IHNjYW5uaW5nIHN0b3BwZWQuIiApOworICAgICAgICAgICAgICAgICAgICBsYXN0OworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICJFcnJvciBwYXJzaW5nIG9iamR1bXAgb3V0cHV0IGxpbmUgJG46XG4+Pj4+ICRsaW5lXG4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGxpbmUKKworICAgIHJldHVybiAkZXJyb3JzOworCit9OyAjIHN1YiBjaGVja19maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBQYXJzZSBjb21tYW5kIGxpbmUuCitteSAkbWF4X2luc3RydWN0aW9uczsKK215ICRzaG93X2luc3RydWN0aW9uczsKK2dldF9vcHRpb25zKAorICAgICJvcz1zIiAgICAgICAgICAgICAgID0+IFwkdGFyZ2V0X29zLAorICAgICJhcmNoPXMiICAgICAgICAgICAgID0+IFwkdGFyZ2V0X2FyY2gsCisgICAgIm1pYy1hcmNoPXMiICAgICAgICAgPT4gXCR0YXJnZXRfbWljX2FyY2gsCisgICAgIm1heC1pbnN0cnVjdGlvbnM9aSIgPT4gXCRtYXhfaW5zdHJ1Y3Rpb25zLAorICAgICJzaG93LWluc3RydWN0aW9ucyEiID0+IFwkc2hvd19pbnN0cnVjdGlvbnMsCispOworbXkgJHRhcmdldF9wbGF0Zm9ybSA9ICR0YXJnZXRfb3MgLiAiXyIgLiAkdGFyZ2V0X2FyY2g7CitpZiAoICIkdGFyZ2V0X29zIiBlcSAibGluIiBhbmQgIiR0YXJnZXRfbWljX2FyY2giIGVxICJrbmYiICkgeworICAgICRtaWNfYmFkX3JlID0gcXJ7Xig/OnBhdXNlfFtzbG1dZmVuY2V8c2NhdHRlcnxnYXRoZXJ8Y21weGNoZzE2YnxjbGV2aWN0WzEyXSl9aTsKK30gZWxzZSB7CisgICAgJG1pY19iYWRfcmUgPSBxcnteKD86cGF1c2V8W3NsbV1mZW5jZXxzY2F0dGVyfGdhdGhlcnxjbW92fGNtcHhjaGcxNmJ8Y2xldmljdFsxMl0pfWk7Cit9OworaWYgKCAwICkgeworfSBlbHNpZiAoICR0YXJnZXRfcGxhdGZvcm0gZXEgImxpbl9taWMiICkgeworICAgICpiYWRfaW5zdHIgPSBcKmJhZF9taWNfaW5zdHI7CisgICAgKmJhZF9mbXQgICA9IFwqYmFkX21pY19mbXQ7Cit9IGVsc2lmICggJHRhcmdldF9wbGF0Zm9ybSBlcSAibGluXzMyIiApIHsKKyAgICAqYmFkX2luc3RyID0gXCpiYWRfaWEzMl9pbnN0cjsKKyAgICAqYmFkX2ZtdCAgID0gXCpiYWRfaWEzMl9mbXQ7Cit9IGVsc2UgeworICAgIHJ1bnRpbWVfZXJyb3IoICJPbmx5IHdvcmtzIG9uIGxpbl8zMiBhbmQgbGluX21pYyBwbGF0Zm9ybXMuIiApOworfTsgIyBpZgorCisjIERvIHRoZSB3b3JrLgorbXkgJHJjID0gMDsKK2lmICggbm90IEBBUkdWICkgeworICAgIGluZm8oICJObyBhcmd1bWVudHMgc3BlY2lmaWVkIC0tIG5vdGhpbmcgdG8gZG8uIiApOworfSBlbHNlIHsKKyAgICBmb3JlYWNoIG15ICRhcmcgKCBAQVJHViApIHsKKyAgICAgICAgbXkgJGVycnMgPSBjaGVja19maWxlKCAkYXJnLCAkc2hvd19pbnN0cnVjdGlvbnMsICRtYXhfaW5zdHJ1Y3Rpb25zICk7CisgICAgICAgIGlmICggJGVycnMgPiAwICkgeworICAgICAgICAgICAgJHJjID0gMzsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkYXJnCit9OyAjIGlmCisKK2V4aXQoICRyYyApOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxjaGVjay1pbnN0cnVjdGlvbi1zZXQucGw+IC0tIE1ha2Ugc3VyZSBiaW5hcnkgZmlsZSBkb2VzIG5vdCBjb250YWluIHVuZGVzaXJlZCBpbnN0cnVjdGlvbnMuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGNoZWNrLWluc3RydWN0aW9ucy5wbD4gSTxvcHRpb24+Li4uIEk8ZmlsZT4uLi4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWFyY2hpdGVjdHVyZT0+STxhcmNoPgorCitTcGVjaWZ5IHRhcmdldCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8LS1tYXgtaW5zdHJ1Y3Rpb25zPT5JPG51bWJlcj4KKworU3RvcCBzY2FubmluZyBpZiBJPG51bWJlcj4gaW52YWxpZCBpbnN0cnVjdGlvbnMgZm91bmQuIDEwMCBieSBkZWZhdWx0LgorCis9aXRlbSBCPC0tb3M9Pkk8b3M+CisKK1NwZWNpZnkgdGFyZ2V0IE9TLgorCis9aXRlbSBCPC0tPltCPG5vLT5dQjxzaG93LWluc3RydWN0aW9ucz4KKworU2hvdyBpbnZhbGlkIGluc3RydWN0aW9ucyBmb3VuZCBpbiB0aGUgZmlsZS4gQnUgZGVmYXVsdCwgaW5zdHJ1Y3Rpb25zIGFyZSBub3Qgc2hvd24uCisKKz1pdGVtIFN0YW5kYXJkIE9wdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRvYz4KKworPWl0ZW0gQjwtLW1hbnVhbD4KKworUHJpbnQgZnVsbCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS1oZWxwPgorCitQcmludCBzaG9ydCBoZWxwIG1lc3NhZ2UgYW5kIGV4aXQuCisKKz1pdGVtIEI8LS11c2FnZT4KKworUHJpbnQgdmVyeSBzaG9ydCB1c2FnZSBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdmVyYm9zZT4KKworRG8gcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHByb2dyYW0gdmVyc2lvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXF1aWV0PgorCitXb3JrIHF1aWV0LCBkbyBub3QgcHJpbnQgaW5mb3JtYXRpb25hbCBtZXNzYWdlcy4KKworPWJhY2sKKworPWJhY2sKKworPWhlYWQxIEFSR1VNRU5UUworCis9b3ZlcgorCis9aXRlbSBJPGZpbGU+CisKK0ZpbGUgKG9iamVjdCBmaWxlIG9yIGxpYnJhcnksIGVpdGhlciBzdGF0aWMgb3IgZHluYW1pYykgdG8gY2hlY2suCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IHJ1bnMgRjxvYmpkdW1wPiB1dGlsaXR5IHRvIGdldCBkaXNhc3NlbWJsZXIgbGlzdGluZyBhbmQgY2hlY2tzIHRoZSBmaWxlIGRvZXMgbm90IGNvbnRhaW4KK3Vud2FudGVkIGluc3RydWN0aW9ucy4KKworQ3VycmVudGx5IHRoZSBzY3JpcHQgd29ya3Mgb25seSBmb3I6CisKKz1vdmVyCisKKz1pdGVtIEM8bGluX21pYz4KKworSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlIHRhcmdldCBPUy4gVW5kZXNpcmVkIHVuc3RydWN0aW9ucyBhcmU6IGFsbCB4ODcgaW5zdHJ1Y3Rpb25zIGFuZCBzb21lIG90aGVycy4KKworPWl0ZW0gQzxsaW5fMzI+CisKK1VuZGVzaXJlZCBpbnN0cnVjdGlvbnMgYXJlIGluc3RydWN0aW9ucyBub3QgdmFsaWQgZm9yIFBlbnRpdW0gMyBwcm9jZXNzb3IgKFNTRTIgYW5kIG5ld2VyKS4KKworPWJhY2sKKworPWN1dAorCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwgYi9yYzMvcnVudGltZS90b29scy9nZW5lcmF0ZS1kZWYucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uN2MyYjBmMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2dlbmVyYXRlLWRlZi5wbApAQCAtMCwwICsxLDMyMSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKKyMgU29tZSBwcmFnbWFzLgordXNlIHN0cmljdDsgICAgICAgICAgIyBSZXN0cmljdCB1bnNhZmUgY29uc3RydWN0cy4KK3VzZSB3YXJuaW5nczsgICAgICAgICMgRW5hYmxlIGFsbCB3YXJuaW5ncy4KKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDA0IjsKKworIworIyBTdWJyb3V0aW5lcy4KKyMKKworc3ViIHBhcnNlX2lucHV0KCRcJSkgeworCisgICAgbXkgKCAkaW5wdXQsICRkZWZzICkgPSBAXzsKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggJGlucHV0ICk7CisgICAgbXkgJWVudHJpZXM7CisgICAgbXkgJW9yZGluYWxzOworICAgIG15IEBkaXJzOworICAgIG15ICR2YWx1ZSA9IDE7CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbXNnLCAkbCwgJGxpbmUgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyBmaWxlIFwiJGlucHV0XCIgbGluZSAkbDpcbiIgLgorICAgICAgICAgICAgICAgICIgICAgJGxpbmUiIC4KKyAgICAgICAgICAgICAgICAoICRtc2cgPyAkbXNnIC4gIlxuIiA6ICgpICkKKyAgICAgICAgICAgICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBteSAkbiA9IDA7ICAgICMgTGluZSBudW1iZXIuCisgICAgZm9yZWFjaCBteSAkbGluZSAoIEBidWxrICkgeworICAgICAgICArKyAkbjsKKyAgICAgICAgaWYgKCAwICkgeworICAgICAgICB9IGVsc2lmICggJGxpbmUgPX4gbXteXHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgIyBFbXB0eSBsaW5lIG9yIGNvbW1lbnQuIFNraXAgaXQuCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolfSApIHsKKyAgICAgICAgICAgICMgQSBkaXJlY3RpdmUuCisgICAgICAgICAgICBpZiAoIDAgICkgeworICAgICAgICAgICAgfSBlbHNpZiAoICRsaW5lID1+IG17XlxzKiVccyppZihuKT9kZWZccysoW0EtWmEtejAtOV9dKylccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgbXkgKCAkbmVnYXRpb24sICRuYW1lICkgPSAoICQxLCAkMiApOworICAgICAgICAgICAgICAgIG15ICRkaXIgPSB7IG4gPT4gJG4sIGxpbmUgPT4gJGxpbmUsIG5hbWUgPT4gJG5hbWUsIHZhbHVlID0+ICR2YWx1ZSB9OworICAgICAgICAgICAgICAgIHB1c2goIEBkaXJzLCAkZGlyICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gKCAkdmFsdWUgYW5kICggJG5lZ2F0aW9uIHhvciAkZGVmcy0+eyAkbmFtZSB9ICkgKTsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyolXHMqZW5kaWZccyooPzojfFxuKX0gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgQGRpcnMgKSB7CisgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JwaGFuICVlbmRpZiBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIG15ICRkaXIgPSBwb3AoIEBkaXJzICk7CisgICAgICAgICAgICAgICAgJHZhbHVlID0gJGRpci0+eyB2YWx1ZSB9OworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkJhZCBkaXJlY3RpdmUuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzaWYgKCAkbGluZSA9fiBte15ccyooLSk/XHMqKFtBLVphLXowLTlfXSspKD86XHMrKFxkK3xEQVRBKSk/XHMqKD86I3xcbil9ICkgeworICAgICAgICAgICAgbXkgKCAkb2Jzb2xldGUsICRlbnRyeSwgJG9yZGluYWwgKSA9ICggJDEsICQyLCAkMyApOworICAgICAgICAgICAgaWYgKCAkdmFsdWUgKSB7CisgICAgICAgICAgICAgICAgaWYgKCBleGlzdHMoICRlbnRyaWVzeyAkZW50cnkgfSApICkgeworICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIkVudHJ5IFwiJGVudHJ5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQuIiwgJG4sICRsaW5lICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRlbnRyaWVzeyAkZW50cnkgfSA9IHsgb3JkaW5hbCA9PiAkb3JkaW5hbCwgb2Jzb2xldGUgPT4gZGVmaW5lZCggJG9ic29sZXRlICkgfTsKKyAgICAgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcmRpbmFsICkgYW5kICRvcmRpbmFsIG5lICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkb3JkaW5hbCA+PSAxMDAwIGFuZCAkZW50cnkgPX4gbXtcQVtva11tcF99ICkgeworICAgICAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICJPcmRpbmFsIG9mIHVzZXItY2FsbGFibGUgZW50cnkgbXVzdCBiZSA8IDEwMDAiLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsID49IDEwMDAgYW5kICRvcmRpbmFsIDwgMjAwMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICRlcnJvci0+KCAiT3JkaW5hbHMgYmV0d2VlbiAxMDAwIGFuZCAxOTk5IGFyZSByZXNlcnZlZC4iLCAkbiwgJGxpbmUgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICBpZiAoIGV4aXN0cyggJG9yZGluYWxzeyAkb3JkaW5hbCB9ICkgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9yZGluYWwgJG9yZGluYWwgaGFzIGFscmVhZHkgYmVlbiB1c2VkLiIsICRuLCAkbGluZSApOworICAgICAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAgICAgICAgICRvcmRpbmFsc3sgJG9yZGluYWwgfSA9ICRlbnRyeTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIiIsICRuLCAkbGluZSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisKKyAgICBpZiAoIEBkaXJzICkgeworICAgICAgICBteSAkZGlyID0gcG9wKCBAZGlycyApOworICAgICAgICAkZXJyb3ItPiggIlVudGVybWluYXRlZCAlaWYgZGlyZWNpdmUuIiwgJGRpci0+eyBuIH0sICRkaXItPnsgbGluZSB9ICk7CisgICAgfTsgIyB3aGlsZQorCisgICAgcmV0dXJuICVlbnRyaWVzOworCit9OyAjIHN1YiBwYXJzZV9pbnB1dAorCitzdWIgcHJvY2VzcyhcJSkgeworCisgICAgbXkgKCAkZW50cmllcyApID0gQF87CisKKyAgICBmb3JlYWNoIG15ICRlbnRyeSAoIGtleXMoICUkZW50cmllcyApICkgeworICAgICAgICBpZiAoIG5vdCAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvYnNvbGV0ZSB9ICkgeworICAgICAgICAgICAgbXkgJG9yZGluYWwgPSAkZW50cmllcy0+eyAkZW50cnkgfS0+eyBvcmRpbmFsIH07CisgICAgICAgICAgICBpZiAoICRlbnRyeSA9fiBte1xBW29rXW1wX30gKSB7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJG9yZGluYWwgKSBvciAkb3JkaW5hbCBlcSAiREFUQSIgKSB7CisgICAgICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoCisgICAgICAgICAgICAgICAgICAgICAgICAiQmFkIGVudHJ5IFwiJGVudHJ5XCI6IG9yZGluYWwgbnVtYmVyIGlzIG5vdCBzcGVjaWZpZWQuIgorICAgICAgICAgICAgICAgICAgICApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICAkZW50cmllcy0+eyB1YyggJGVudHJ5ICkgfSA9IHsgb3JkaW5hbCA9PiAxMDAwICsgJG9yZGluYWwgfTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaAorCisgICAgcmV0dXJuICUkZW50cmllczsKKworfTsgIyBzdWIgcHJvY2VzcworCitzdWIgZ2VuZXJhdGVfb3V0cHV0KFwlJCkgeworCisgICAgbXkgKCAkZW50cmllcywgJG91dHB1dCApID0gQF87CisgICAgbXkgJGJ1bGs7CisKKyAgICAkYnVsayA9ICJFWFBPUlRTXG4iOworICAgIGZvcmVhY2ggbXkgJGVudHJ5ICggc29ydCgga2V5cyggJSRlbnRyaWVzICkgKSApIHsKKyAgICAgICAgaWYgKCBub3QgJGVudHJpZXMtPnsgJGVudHJ5IH0tPnsgb2Jzb2xldGUgfSApIHsKKyAgICAgICAgICAgICRidWxrIC49IHNwcmludGYoICIgICAgJS00MHMgIiwgJGVudHJ5ICk7CisgICAgICAgICAgICBteSAkb3JkaW5hbCA9ICRlbnRyaWVzLT57ICRlbnRyeSB9LT57IG9yZGluYWwgfTsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9yZGluYWwgKSApIHsKKyAgICAgICAgICAgICAgICBpZiAoICRvcmRpbmFsIGVxICJEQVRBIiApIHsKKyAgICAgICAgICAgICAgICAgICAgJGJ1bGsgLj0gIkRBVEEiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgICRidWxrIC49ICJcQCIgLiAkb3JkaW5hbDsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkYnVsayAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoCisgICAgaWYgKCBkZWZpbmVkKCAkb3V0cHV0ICkgKSB7CisgICAgICAgIHdyaXRlX2ZpbGUoICRvdXRwdXQsIFwkYnVsayApOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50KCAkYnVsayApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgZ2VuZXJhdGVfb3VwdXQKKworIworIyBQYXJzZSBjb21tYW5kIGxpbmUuCisjCisKK215ICRpbnB1dDsgICAjIFRoZSBuYW1lIG9mIGlucHV0IGZpbGUuCitteSAkb3V0cHV0OyAgIyBUaGUgbmFtZSBvZiBvdXRwdXQgZmlsZS4KK215ICVkZWZzOworCitnZXRfb3B0aW9ucygKKyAgICAib3V0cHV0PXMiICAgID0+IFwkb3V0cHV0LAorICAgICJEfGRlZmluZT1zIiAgPT4KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICggJG9wdF9uYW1lLCAkb3B0X3ZhbHVlICkgPSBAXzsKKyAgICAgICAgICAgIG15ICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICk7CisgICAgICAgICAgICBpZiAoICRvcHRfdmFsdWUgPX4gbXtcQSguKj8pPSguKilcen0gKSB7CisgICAgICAgICAgICAgICAgKCAkZGVmX25hbWUsICRkZWZfdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICggJGRlZl9uYW1lLCAkZGVmX3ZhbHVlICkgPSAoICRvcHRfdmFsdWUsIDEgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICRkZWZzeyAkZGVmX25hbWUgfSA9ICRkZWZfdmFsdWU7CisgICAgICAgIH0sCispOworCitpZiAoIEBBUkdWID09IDAgKSB7CisgICAgY21kbGluZV9lcnJvciggIk5vdCBlbm91Z2ggYXJndW1lbnRzLiIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBhcmd1bWVudHMuIiApOworfTsgIyBpZgorJGlucHV0ID0gc2hpZnQoIEBBUkdWICk7CisKKyMKKyMgV29yay4KKyMKKworbXkgJWRhdGEgPSBwYXJzZV9pbnB1dCggJGlucHV0LCAlZGVmcyApOworJWRhdGEgPSBwcm9jZXNzKCAlZGF0YSApOworZ2VuZXJhdGVfb3V0cHV0KCAlZGF0YSwgJG91dHB1dCApOworZXhpdCggMCApOworCitfX0VORF9fCisKKyMKKyMgRW1iZWRkZWQgZG9jdW1lbnRhdGlvbi4KKyMKKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPGdlbmVyYXRlLWRlZi5wbD4gLS0gR2VuZXJhdGUgZGVmIGZpbGUgZm9yIE9wZW5NUCBSVEwuCisKKz1oZWFkMSBTWU5PUFNJUworCitCPGdlbmVyYXRlLWRlZi5wbD4gSTxPUFRJT04+Li4uIEk8ZmlsZT4KKworPWhlYWQxIE9QVElPTlMKKworPW92ZXIKKworPWl0ZW0gQjwtLWRlZmluZT0+STxuYW1lPls9STx2YWx1ZT5dCisKKz1pdGVtIEI8LUQ+IEk8bmFtZT5bPUk8dmFsdWU+XQorCitEZWZpbmUgc3BlY2lmaWVkIG5hbWUuIElmIEk8dmFsdWU+IGlzIG9taXR0ZWQsIEk8bmFtZT4gaXMgZGVmaW5lZCB0byAxLiBJZiBJPHZhbHVlPiBpcyAwIG9yIGVtcHR5LAorbmFtZSBpcyBCPG5vdD4gZGVmaW5lZC4KKworPWl0ZW0gQjwtLW91dHB1dD0+STxmaWxlPgorCis9aXRlbSBCPC1vPiBJPGZpbGU+CisKK1NwZWNpZnkgb3V0cHV0IGZpbGUgbmFtZS4gSWYgb3B0aW9uIGlzIG5vdCBwcmVzZW50LCByZXN1bHQgaXMgcHJpbnRlZCB0byBzdGRvdXQuCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0taGVscD4KKworUHJpbnQgc2hvcnQgaGVscCBtZXNzYWdlIGFuZCBleGl0LgorCis9aXRlbSBCPC0tdXNhZ2U+CisKK1ByaW50IHZlcnkgc2hvcnQgdXNhZ2UgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcmJvc2U+CisKK0RvIHByaW50IGluZm9ybWF0aW9uYWwgbWVzc2FnZXMuCisKKz1pdGVtIEI8LS12ZXJzaW9uPgorCitQcmludCB2ZXJzaW9uIGFuZCBleGl0LgorCis9aXRlbSBCPC0tcXVpZXQ+CisKK1dvcmsgcXVpZXQsIGRvIG5vdCBwcmludCBpbmZvcm1hdGlvbmFsIG1lc3NhZ2VzLgorCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGlucHV0IGZpbGUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCitUaGUgc2NyaXB0IHJlYWRzIGlucHV0IGZpbGUsIHByb2Nlc3MgY29uZGl0aW9uYWwgZGlyZWN0aXZlcywgY2hlY2tzIGNvbnRlbnQgZm9yIGNvbnNpc3RlbmN5LCBhbmQKK2dlbmVyYXRlcyBvdXB0cHV0IGZpbGUgc3VpdGFibGUgZm9yIGxpbmtlci4KKworPWhlYWQyIElucHV0IEZpbGUgRm9ybWF0CisKKz1vdmVyCisKKz1pdGVtIENvbW1lbnRzCisKKyAgICAjIEl0J3MgYSBjb21tZW50LgorCitDb21tZW50cyBzdGFydCB3aXRoIEM8Iz4gc3ltYm9sIGFuZCBjb250aW51ZSB0byB0aGUgZW5kIG9mIGxpbmUuCisKKz1pdGVtIENvbmRpdGlvbmFsIERpcmVjdGl2ZXMKKworICAgICVpZmRlZiBuYW1lCisgICAgJWlmbmRlZiBuYW1lCisgICAgJWVuZGlmCisKK0EgcGFydCBvZiBmaWxlIHN1cnJvdW5kZWQgYnkgQzwlaWZkZWYgSTxuYW1lPj4gYW5kIEM8JWVuZGlmPiBkaXJlY3RpdmVzIGlzIGEgY29uZGl0aW9uYWwgcGFydCAtLSBpdAoraGFzIGVmZmVjdCBvbmx5IGlmIEk8bmFtZT4gaXMgZGVmaW5lZCBpbiB0aGUgY29tbWFuIGxpbmUgYnkgQjwtLWRlZmluZT4gb3B0aW9uLiBDPCVpZm5kZWY+IGlzIGEKK25lZ2F0ZWQgdmVyc2lvbiBvZiBDPCVpZmRlZj4gLS0gY29uZGl0aW9uYWwgcGFydCBoYXMgYW4gZWZmZWN0IG9ubHkgaWYgSTxuYW1lPiBpcyBCPG5vdD4gZGVmaW5lZC4KKworQ29uZGl0aW9uYWwgcGFydHMgbWF5IGJlIG5lc3RlZC4KKworPWl0ZW0gRXhwb3J0IERlZmluaXRpb25zCisKKyAgICBzeW1ib2wKKyAgICBzeW1ib2wgb3JkaW5hbAorICAgIHN5bWJvbCBEQVRBCisKK1N5bWJvbHMgc3RhcnRpbmcgd2l0aCBDPG9tcF8+IG9yIEM8a21wXz4gbXVzdCBoYXZlIG9yZGluYWwgc3BlY2lmaWVkLiBUaGV5IGFyZSBzdWJqZWN0cyBmb3Igc3BlY2lhbAorcHJvY2Vzc2luZzogZWFjaCBzeW1ib2wgZ2VuZXJhdGVzIHR3byBvdXRwdXQgbGluZXM6IG9yaWdpbmFsIG9uZSBhbmQgdXBwZXIgY2FzZSB2ZXJzaW9uLiBUaGUgb3JkaW5hbAorbnVtYmVyIG9mIHRoZSBzZWNvbmQgaXMgb3JpZ2luYWwgb3JkaW5hbCBpbmNyZWFzZWQgYnkgMTAwMC4KKworPWl0ZW0gT2Jzb2xldGUgU3ltYm9scworCisgICAgLSBzeW1ib2wKKyAgICAtIHN5bWJvbCBvcmRpbmFsCisgICAgLSBzeW1ib2wgREFUQQorCitPYnNvbGV0ZSBzeW1ib2xzIGxvb2sgbGlrZSBleHBvcnQgZGVmaW5pdGlvbnMgcHJlZml4ZWQgd2l0aCBtaW51cyBzaWduLiBPYnNvbGV0ZSBzeW1ib2xzIGRvIG5vdAorYWZmZWN0IHRoZSBvdXRwdXQsIGJ1dCBvYnNvbGV0ZSBzeW1ib2xzIGFuZCB0aGVpciBvcmRpbmFscyBjYW5ub3QgYmUgKHJlKXVzZWQgaW4gZXhwb3J0IGRlZmluaXRpb25zLgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgICQgZ2VuZXJhdGUtZGVmLnBsIC1EIHN0dWIgLUQgVVNFX1RDSEVDSz0wIC1vIGxpYmd1aWRlLmRlZiBkbGxleHBvcnQKKworPWN1dAorCisjIGVuZCBvZiBmaWxlICMKKwpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL0J1aWxkLnBtCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNmNjcxNTYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvcnVudGltZS90b29scy9saWIvQnVpbGQucG0KQEAgLTAsMCArMSwyNjQgQEAKKyMKKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIy8vCisjLy8gICAgICAgICAgICAgICAgICAgICBUaGUgTExWTSBDb21waWxlciBJbmZyYXN0cnVjdHVyZQorIy8vCisjLy8gVGhpcyBmaWxlIGlzIGR1YWwgbGljZW5zZWQgdW5kZXIgdGhlIE1JVCBhbmQgdGhlIFVuaXZlcnNpdHkgb2YgSWxsaW5vaXMgT3BlbgorIy8vIFNvdXJjZSBMaWNlbnNlcy4gU2VlIExJQ0VOU0UudHh0IGZvciBkZXRhaWxzLgorIy8vCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMKK3BhY2thZ2UgQnVpbGQ7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBDd2QgcXd7fTsKKwordXNlIExpYk9NUDsKK3VzZSB0b29sczsKK3VzZSBVbmFtZTsKK3VzZSBQbGF0Zm9ybSAiOnZhcnMiOworCitteSAkaG9zdCA9IFVuYW1lOjpob3N0X25hbWUoKTsKK215ICRyb290ID0gJEVOVnsgTElCT01QX1dPUksgICAgfTsKK215ICR0bXAgID0gJEVOVnsgTElCT01QX1RNUCAgICAgfTsKK215ICRvdXQgID0gJEVOVnsgTElCT01QX0VYUE9SVFMgfTsKKworbXkgQGpvYnM7CitvdXIgJHN0YXJ0ID0gdGltZSgpOworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIEhlbHBlciBmdW5jdGlvbnMuCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKyMgdHN0ciAtLSBUaW1lIHN0cmluZy4gUmV0dXJucyBzdHJpbmcgInl5eXktZGQtbW0gaGg6bW06c3MgVVRDIi4KK3N1YiB0c3RyKDskKSB7CisgICAgbXkgKCAkdGltZSApID0gQF87CisgICAgaWYgKCBub3QgZGVmaW5lZCggJHRpbWUgKSApIHsKKyAgICAgICAgJHRpbWUgPSB0aW1lKCk7CisgICAgfTsgIyBpZgorICAgIG15ICggJHNlYywgJG1pbiwgJGhvdXIsICRkYXksICRtb250aCwgJHllYXIgKSA9IGdtdGltZSggJHRpbWUgKTsKKyAgICAkbW9udGggKz0gMTsKKyAgICAkeWVhciAgKz0gMTkwMDsKKyAgICBteSAkc3RyID0gc3ByaW50ZiggIiUwNGQtJTAyZC0lMDJkICUwMmQ6JTAyZDolMDJkIFVUQyIsICR5ZWFyLCAkbW9udGgsICRkYXksICRob3VyLCAkbWluLCAkc2VjICk7CisgICAgcmV0dXJuICRzdHI7Cit9OyAjIHN1YiB0c3RyCisKKyMgZHN0ciAtLSBEdXJhdGlvbiBzdHJpbmcuIFJldHVybnMgc3RyaW5nICJoaDptbTpzcyIuCitzdWIgZHN0cigkKSB7CisgICAgIyBHZXQgdGltZSBpbiBzZWNvbmRzIGFuZCBmb3JtYXQgaXQgYXMgdGltZSBpbiBob3VycywgbWludXRlcywgc2Vjb25kcy4KKyAgICBteSAoICRzZWMgKSA9IEBfOworICAgIG15ICggJGgsICRtLCAkcyApOworICAgICRoICAgPSBpbnQoICRzZWMgLyAzNjAwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkaCAqIDM2MDA7CisgICAgJG0gICA9IGludCggJHNlYyAvIDYwICk7CisgICAgJHNlYyA9ICRzZWMgLSAkbSAqIDYwOworICAgICRzICAgPSBpbnQoICRzZWMgKTsKKyAgICAkc2VjID0gJHNlYyAtICRzOworICAgIHJldHVybiBzcHJpbnRmKCAiJTAyZDolMDJkOiUwMmQiLCAkaCwgJG0sICRzICk7Cit9OyAjIHN1YiBkc3RyCisKKyMgcnN0ciAtLSBSZXN1bHQgc3RyaW5nLgorc3ViIHJzdHIoJCkgeworICAgIG15ICggJHJjICkgPSBAXzsKKyAgICByZXR1cm4gKCAkcmMgPT0gMCA/ICIrKysgU3VjY2VzcyArKysiIDogIi0tLSBGYWlsdXJlIC0tLSIgKTsKK307ICMgc3ViIHJzdHIKKworc3ViIHNob3J0ZXIoJDskKSB7CisgICAgIyBSZXR1cm4gc2hvcnRlciB2YXJpYW50IG9mIHBhdGggLS0gZWl0aGVyIGFic29sdXRlIG9yIHJlbGF0aXZlLgorICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICBteSAkYWJzID0gYWJzX3BhdGgoICRwYXRoICk7CisgICAgbXkgJHJlbCA9IHJlbF9wYXRoKCAkcGF0aCwgJGJhc2UgKTsKKyAgICBpZiAoICRyZWwgZXEgIiIgKSB7CisgICAgICAgICRyZWwgPSAiLiI7CisgICAgfTsgIyBpZgorICAgICRwYXRoID0gKCBsZW5ndGgoICRyZWwgKSA8IGxlbmd0aCggJGFicyApID8gJHJlbCA6ICRhYnMgKTsKKyAgICBpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgICAgICRwYXRoID1+IHN7XFx9ey99ZzsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRwYXRoOworfTsgIyBzdWIgc2hvcnRlcgorCitzdWIgdGVlKCQkKSB7CisKKyAgICBteSAoICRhY3Rpb24sICRmaWxlICkgPSBAXzsKKyAgICBteSAkcGlkID0gMDsKKworICAgIG15ICRzYXZlX3N0ZG91dCA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisgICAgbXkgJHNhdmVfc3RkZXJyID0gU3ltYm9sOjpnZW5zeW0oKTsKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZG91dCAtLS0KKyAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZG91dCBpbiAkc2F2ZV9zdGRvdXQuCisgICAgb3BlbiggJHNhdmVfc3Rkb3V0LCAiPiYiIC4gU1RET1VULT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRvdXQgdG8gdGVlIG9yIHRvIGZpbGUuCisgICAgaWYgKCAkdG9vbHM6OnZlcmJvc2UgKSB7CisgICAgICAgICRwaWQgPSBvcGVuKCBTVERPVVQsICJ8IHRlZSAtYSBcIiRmaWxlXCIiICkKKyAgICAgICAgICAgIG9yIGRpZSAiQ2Fubm90IG9wZW4gcGlwZSB0byBcInRlZVwiOiAkITsgc3RvcHBlZCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgb3BlbiggU1RET1VULCAiPj4kZmlsZSIgKQorICAgICAgICAgICAgb3IgZGllICJDYW5ub3Qgb3BlbiBmaWxlIFwiJGZpbGVcIiBmb3Igd3JpdGluZzogJCE7IHN0b3BwZWQiOworICAgIH07ICMgaWYKKworICAgICMgLS0tIHJlZGlyZWN0IHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBTYXZlIHN0ZGVyciBpbiAkc2F2ZV9zdGRlcnIuCisgICAgb3BlbiggJHNhdmVfc3RkZXJyLCAiPiYiIC4gU1RERVJSLT5maWxlbm8oKSApCisgICAgICAgIG9yIGRpZSggIkNhbm5vdCBkdXAgZmlsZWhhbmRsZTogJCE7IHN0b3BwZWQiICk7CisgICAgIyBSZWRpcmVjdCBzdGRlcnIgdG8gc3Rkb3V0LgorICAgIG9wZW4oIFNUREVSUiwgIj4mIiAuIFNURE9VVC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBQZXJmb3JtIGFjdGlvbnMuCisgICAgJGFjdGlvbi0+KCk7CisKKyAgICAjIC0tLSByZXN0b3JlIHN0ZGVyciAtLS0KKyAgICBTVERFUlItPmZsdXNoKCk7CisgICAgIyBSZXN0b3JlIHN0ZGVyciBmcm9tICRzYXZlX3N0ZGVyci4KKyAgICBvcGVuKCBTVERFUlIsICI+JiIgLiAkc2F2ZV9zdGRlcnItPmZpbGVubygpICkKKyAgICAgICAgb3IgZGllKCAiQ2Fubm90IGR1cCBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKyAgICAjIENsb3NlICRzYXZlX3N0ZGVyci4KKyAgICAkc2F2ZV9zdGRlcnItPmNsb3NlKCkgb3IgZGllICggIkNhbm5vdCBjbG9zZSBmaWxlaGFuZGxlOiAkITsgc3RvcHBlZCIgKTsKKworICAgICMgLS0tIHJlc3RvcmUgc3Rkb3V0IC0tLQorICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICAjIFJlc3RvcmUgc3Rkb3V0IGZyb20gJHNhdmVfc3Rkb3V0LgorICAgIG9wZW4oIFNURE9VVCwgIj4mIiAuICRzYXZlX3N0ZG91dC0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworICAgICMgQ2xvc2UgJHNhdmVfc3Rkb3V0LgorICAgICRzYXZlX3N0ZG91dC0+Y2xvc2UoKSBvciBkaWUgKCAiQ2Fubm90IGNsb3NlIGZpbGVoYW5kbGU6ICQhOyBzdG9wcGVkIiApOworCisgICAgIyBXYWl0IGZvciB0aGUgY2hpbGQgdGVlIHByb2Nlc3MsIG90aGVyd2lzZSBvdXRwdXQgb2YgbWFrZSBhbmQgYnVpbGQucGwgaW50ZXJsZWF2ZXMuCisgICAgaWYgKCAkcGlkICE9IDAgKSB7CisgICAgICAgIHdhaXRwaWQoICRwaWQsIDAgKTsKKyAgICB9OyAjIGlmCisKK307ICMgc3ViIHRlZQorCitzdWIgbG9nX2l0KCQkQCkgeworICAgIG15ICggJHRpdGxlLCAkZm9ybWF0LCBAYXJncyApID0gQF87CisgICAgbXkgJG1lc3NhZ2UgID0gc3ByaW50ZiggJGZvcm1hdCwgQGFyZ3MgKTsKKyAgICBteSAkcHJvZ3Jlc3MgPSBjYXRfZmlsZSggJHRtcCwgc3ByaW50ZiggIiVzLSVzLmxvZyIsICR0YXJnZXRfcGxhdGZvcm0sIFVuYW1lOjpob3N0X25hbWUoKSApICk7CisgICAgaWYgKCAkdGl0bGUgbmUgIiIgYW5kICRtZXNzYWdlIG5lICIiICkgeworICAgICAgICBteSAkbGluZSA9IHNwcmludGYoICIlLTE1cyA6ICVzXG4iLCAkdGl0bGUsICRtZXNzYWdlICk7CisgICAgICAgIGluZm8oICRsaW5lICk7CisgICAgICAgIHdyaXRlX2ZpbGUoICRwcm9ncmVzcywgdHN0cigpIC4gIjogIiAuICRsaW5lLCAtYXBwZW5kID0+IDEgKTsKKyAgICB9IGVsc2UgeworICAgICAgICB3cml0ZV9maWxlKCAkcHJvZ3Jlc3MsICJcbiIsIC1hcHBlbmQgPT4gMSApOworICAgIH07ICMgaWYKK307ICMgc3ViIGxvZ19pdAorCitzdWIgcHJvZ3Jlc3MoJCRAKSB7CisgICAgbXkgKCAkdGl0bGUsICRmb3JtYXQsIEBhcmdzICkgPSBAXzsKKyAgICBsb2dfaXQoICR0aXRsZSwgJGZvcm1hdCwgQGFyZ3MgKTsKK307ICMgc3ViIHByb2dyZXNzCisKK3N1YiBzdW1tYXJ5KCkgeworICAgIG15ICR0b3RhbCAgID0gQGpvYnM7CisgICAgbXkgJHN1Y2Nlc3MgPSAwOworICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgZm9yZWFjaCBteSAkam9iICggQGpvYnMgKSB7CisgICAgICAgIG15ICggJGJ1aWxkX2RpciwgJHJjICkgPSAoICRqb2ItPnsgYnVpbGRfZGlyIH0sICRqb2ItPnsgcmMgfSApOworICAgICAgICBwcm9ncmVzcyggcnN0ciggJHJjICksICIlcyIsICRidWlsZF9kaXIgKTsKKyAgICAgICAgaWYgKCAkcmMgPT0gMCApIHsKKyAgICAgICAgICAgICsrICRzdWNjZXNzOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRqb2IKKyAgICBteSAkZmFpbHVyZSA9ICR0b3RhbCAtICRzdWNjZXNzOworICAgIHByb2dyZXNzKCAiU3VjY2Vzc2VzIiwgICAgICAiJTNkIG9mICUzZCIsICRzdWNjZXNzLCAkdG90YWwgKTsKKyAgICBwcm9ncmVzcyggIkZhaWx1cmVzIiwgICAgICAgIiUzZCBvZiAlM2QiLCAkZmFpbHVyZSwgJHRvdGFsICk7CisgICAgcHJvZ3Jlc3MoICJUaW1lIGVsYXBzZWQiLCAgICIgICVzIiwgZHN0ciggJGZpbmlzaCAtICRzdGFydCApICk7CisgICAgcHJvZ3Jlc3MoICJPdmVyYWxsIHJlc3VsdCIsICIlcyIsIHJzdHIoICRmYWlsdXJlICkgKTsKKyAgICByZXR1cm4gJGZhaWx1cmU7Cit9OyAjIHN1YiBzdW1tYXJ5CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyMgV29ya2VyIGZ1bmN0aW9ucy4KKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIGluaXQoKSB7CisgICAgbWFrZV9kaXIoICR0bXAgKTsKK307ICMgc3ViIGluaXQKKworc3ViIGNsZWFuKEApIHsKKyAgICAjIENsZWFuIGRpcmVjdG9yaWVzLgorICAgIG15ICggQGRpcnMgKSA9IEBfOworICAgIG15ICRleGl0ID0gMDsKKyAgICAjIE1pbWlzYyBtYWtlZmlsZSAtLSBwcmludCBhIGNvbW1hbmQuCisgICAgcHJpbnQoICJybSAtZiAtciAiIC4gam9pbiggIiAiLCBtYXAoIHNob3J0ZXIoICRfICkgLiAiLyoiLCBAZGlycyApICkgLiAiXG4iICk7CisgICAgJGV4aXQgPQorICAgICAgICBleGVjdXRlKAorICAgICAgICAgICAgWyAkXlgsIGNhdF9maWxlKCAkRU5WeyBMSUJPTVBfV09SSyB9LCAidG9vbHMiLCAiY2xlYW4tZGlyLnBsIiApLCBAZGlycyBdLAorICAgICAgICAgICAgLWlnbm9yZV9zdGF0dXMgPT4gMSwKKyAgICAgICAgICAgICggJHRvb2xzOjp2ZXJib3NlID8gKCkgOiAoIC1zdGRvdXQgPT4gdW5kZWYsIC1zdGRlcnIgPT4gIiIgKSApLAorICAgICAgICApOworICAgIHJldHVybiAkZXhpdDsKK307ICMgc3ViIGNsZWFuCisKK3N1YiBtYWtlKCQkJCkgeworICAgICMgQ2hhbmdlIGRpciB0byBidWlsZCBvbmUgYW5kIHJ1biBtYWtlLgorICAgIG15ICggJGpvYiwgJGNsZWFuLCAkbWFya2VyICkgPSBAXzsKKyAgICBteSAkZGlyICAgICAgPSAkam9iLT57IGJ1aWxkX2RpciB9OworICAgIG15ICRtYWtlZmlsZSA9ICRqb2ItPnsgbWFrZWZpbGUgfTsKKyAgICBteSAkYXJncyAgICAgPSAkam9iLT57IG1ha2VfYXJncyB9OworICAgIG15ICRjd2QgICAgICA9IEN3ZDo6Y3dkKCk7CisgICAgbXkgJHdpZHRoICAgID0gLTEwOworCisgICAgbXkgJGV4aXQ7CisgICAgJGRpciA9IGNhdF9kaXIoICR0bXAsICRkaXIgKTsKKyAgICBtYWtlX2RpciggJGRpciApOworICAgIGNoYW5nZV9kaXIoICRkaXIgKTsKKworICAgIG15ICRhY3Rpb25zID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRzdGFydCA9IHRpbWUoKTsKKyAgICAgICAgICAgICRtYWtlZmlsZSA9IHNob3J0ZXIoICRtYWtlZmlsZSApOworICAgICAgICAgICAgcHJpbnQoICItIiB4IDc5LCAiXG4iICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlN0YXJ0ZWQiLCAgIHRzdHIoICRzdGFydCApICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIlJvb3QgZGlyIiwgICRyb290ICk7CisgICAgICAgICAgICBwcmludGYoICIlJHt3aWR0aH1zOiAlc1xuIiwgIkJ1aWxkIGRpciIsIHNob3J0ZXIoICRkaXIsICRyb290ICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiTWFrZWZpbGUiLCAgJG1ha2VmaWxlICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAjIFVzZSBzaG9ydGVyIExJQk9NUF9XT1JLIHRvIGhhdmUgc2hvcnRlciBjb21tYW5kIGxpbmVzLgorICAgICAgICAgICAgICAgICMgTm90ZTogU29tZSB0b29scyBtYXkgbm90IHdvcmsgaWYgY3VycmVudCBkaXIgaXMgY2hhbmdlZC4KKyAgICAgICAgICAgICAgICBsb2NhbCAkRU5WeyBMSUJPTVBfV09SSyB9ID0gc2hvcnRlciggJEVOVnsgTElCT01QX1dPUksgfSApOworICAgICAgICAgICAgICAgICRleGl0ID0KKyAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZSgKKyAgICAgICAgICAgICAgICAgICAgICAgIFsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFrZSIsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgIi1yIiwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAiLWYiLCAkbWFrZWZpbGUsCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgImFyY2g9IiAuICR0YXJnZXRfYXJjaCwKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAibWFya2VyPSRtYXJrZXIiLAorICAgICAgICAgICAgICAgICAgICAgICAgICAgIEAkYXJncworICAgICAgICAgICAgICAgICAgICAgICAgXSwKKyAgICAgICAgICAgICAgICAgICAgICAgIC1pZ25vcmVfc3RhdHVzID0+IDEKKyAgICAgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgICAgICBpZiAoICRjbGVhbiBhbmQgJGV4aXQgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgJGV4aXQgPSBjbGVhbiggJGRpciApOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIH0KKyAgICAgICAgICAgIG15ICRmaW5pc2ggPSB0aW1lKCk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRmluaXNoZWQiLCB0c3RyKCAkZmluaXNoICkgKTsKKyAgICAgICAgICAgIHByaW50ZiggIiUke3dpZHRofXM6ICVzXG4iLCAiRWxhcHNlZCIsIGRzdHIoICRmaW5pc2ggLSAkc3RhcnQgKSApOworICAgICAgICAgICAgcHJpbnRmKCAiJSR7d2lkdGh9czogJXNcbiIsICJSZXN1bHQiLCByc3RyKCAkZXhpdCApICk7CisgICAgICAgICAgICBwcmludCggIi0iIHggNzksICJcbiIgKTsKKyAgICAgICAgICAgIHByaW50KCAiXG4iICk7CisgICAgICAgIH07ICMgc3ViCisgICAgdGVlKCAkYWN0aW9ucywgImJ1aWxkLmxvZyIgKTsKKworICAgIGNoYW5nZV9kaXIoICRjd2QgKTsKKworICAgICMgU2F2ZSBjb21wbGV0ZWQgam9iIHRvIGJlIGFibGUgcHJpbnQgc3VtbWFyeSBsYXRlci4KKyAgICAkam9iLT57IHJjIH0gPSAkZXhpdDsKKyAgICBwdXNoKCBAam9icywgJGpvYiApOworCisgICAgcmV0dXJuICRleGl0OworCit9OyAjIHN1YiBtYWtlCisKKzE7CmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9saWIvTGliT01QLnBtIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMTI3NjdlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL0xpYk9NUC5wbQpAQCAtMCwwICsxLDg1IEBACisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCitwYWNrYWdlIExpYk9NUDsKKwordXNlIHN0cmljdDsKK3VzZSB3YXJuaW5nczsKKwordXNlIHRvb2xzOworCitzdWIgZW1wdHkoJCkgeworICAgIG15ICggJHZhciApID0gQF87CisgICAgcmV0dXJuIChub3QgZXhpc3RzKCRFTlZ7JHZhcn0pKSBvciAobm90IGRlZmluZWQoJEVOVnskdmFyfSkpIG9yICgkRU5WeyR2YXJ9IGVxICIiKTsKK307ICMgc3ViIGVtcHR5CisKK215ICggJGJhc2UsICRvdXQsICR0bXAgKTsKK2lmICggZW1wdHkoICJMSUJPTVBfV09SSyIgKSApIHsKKyAgICAjICRGaW5kQmluOjpCaW4gaXMgbm90IHVzZWQgaW50ZW50aW9uYWxseSBiZWNhdXNlIGl0IGdpdmVzIHJlYWwgcGF0aC4gSSB3YW50IHRvIHVzZSBhYnNvbHV0ZSwKKyAgICAjIGJ1dCBub3QgcmVhbCBvbmUgKHJlYWwgcGF0aCBkb2VzIG5vdCBjb250YWluIHN5bWxpbmtzIHdoaWxlIGFic29sdXRlIHBhdGggbWF5IGNvbnRhaW4KKyAgICAjIHN5bWxpbmtzKS4KKyAgICAkYmFzZSA9IGdldF9kaXIoIGdldF9kaXIoIGFic19wYXRoKCAkMCApICkgKTsKK30gZWxzZSB7CisgICAgJGJhc2UgPSBhYnNfcGF0aCggJEVOVnsgTElCT01QX1dPUksgfSApOworfTsgIyBpZgorCitpZiAoIGVtcHR5KCAiTElCT01QX0VYUE9SVFMiICkgKSB7CisgICAgJG91dCA9IGNhdF9kaXIoICRiYXNlLCAiZXhwb3J0cyIgKTsKK30gZWxzZSB7CisgICAgJG91dCA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfRVhQT1JUUyB9ICk7Cit9OyAjIGlmCisKK2lmICggZW1wdHkoICJMSUJPTVBfVE1QIiApICkgeworICAgICR0bXAgPSBjYXRfZGlyKCAkYmFzZSwgInRtcCIgKTsKK30gZWxzZSB7CisgICAgJHRtcCA9IGFic19wYXRoKCAkRU5WeyBMSUJPTVBfVE1QIH0gKTsKK307ICMgaWYKKworJEVOVnsgTElCT01QX1dPUksgICAgfSA9ICRiYXNlOworJEVOVnsgTElCT01QX0VYUE9SVFMgfSA9ICRvdXQ7CiskRU5WeyBMSUJPTVBfVE1QICAgICB9ID0gJHRtcDsKKworcmV0dXJuIDE7CisKK19fRU5EX18KKworPXBvZAorCis9aGVhZDEgTkFNRQorCitCPExpYk9NUC5wbT4gLS0KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgRmluZEJpbjsKKyAgICB1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisgICAgdXNlIExpYk9NUDsKKworICAgICRFTlZ7IExJQk9NUF9XT1JLICAgIH0KKyAgICAkRU5WeyBMSUJPTVBfVE1QICAgICB9CisgICAgJEVOVnsgTElCT01QX0VYUE9SVFMgfQorCis9aGVhZDEgREVTQ1JJUFRJT04KKworVGhlIG1vZHVsZSBjaGVja3MgQzxMSUJPTVBfV09SSz4sIEM8TElCT01QX0VYUE9SVFM+LCBhbmQgQzxMSUJPTVBfVE1QPiBlbnZpcm9ubWVudHMgdmFyaWFibGVzLgorSWYgYSB2YXJpYWJsZSBzZXQsIHRoZSBtb2R1bGUgbWFrZXMgc3VyZSBpdCBpcyBhYnNvbHV0ZS4gSWYgYSB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdGhlIG1vZHVsZQorc2V0cyBpdCB0byBkZWZhdWx0IHZhbHVlLgorCitEZWZhdWx0IHZhbHVlIGZvciBDPExJQk9NUF9FWFBPUlRTPiBpcyBDPCRMSUJPTVBfV09SSy9leHBvcnRzPiwgZm9yIEM8TElCT01QX1RNUD4gLS0KK0M8JExJQk9NUF9XT1JLL3RtcD4uCisKK1ZhbHVlIGZvciBDPExJQk9NUF9XT1JLPiBpcyBndWVzc2VkLiBUaGUgbW9kdWxlIGFzc3VtZXMgdGhlIHNjcmlwdCAod2hpY2ggdXNlcyB0aGUgbW9kdWxlKSBpcworbG9jYXRlZCBpbiBDPHRvb2xzLz4gZGlyZWN0b3J5IG9mIGxpYm9tcCBkaXJlY3RvcnkgdHJlZSwgYW5kIHVzZXMgcGF0aCBvZiB0aGUgc2NyaXB0IHRvIGNhbGN1bGF0ZQorQzxMSUJPTVBfV09SSz4sCisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbSBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9QbGF0Zm9ybS5wbQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42YTJiM2I2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvbGliL1BsYXRmb3JtLnBtCkBAIC0wLDAgKzEsNDczIEBACisjCisjIFRoaXMgaXMgbm90IGEgcnVubmFibGUgc2NyaXB0LCBpdCBpcyBhIFBlcmwgbW9kdWxlLCBhIGNvbGxlY3Rpb24gb2YgdmFyaWFibGVzLCBzdWJyb3V0aW5lcywgZXRjLgorIyB0byBiZSB1c2VkIGluIFBlcmwgc2NyaXB0cy4KKyMKKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFBsYXRmb3JtLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBpbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgUGxhdGZvcm07CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBiYXNlICJFeHBvcnRlciI7CisKK3VzZSBVbmFtZTsKKworbXkgQHZhcnM7CisKK0JFR0lOIHsKKyAgICBAdmFycyA9IHF3eyAkaG9zdF9hcmNoICRob3N0X29zICRob3N0X3BsYXRmb3JtICR0YXJnZXRfYXJjaCAkdGFyZ2V0X21pY19hcmNoICR0YXJnZXRfb3MgJHRhcmdldF9wbGF0Zm9ybSB9OworfQorCitvdXIgJFZFUlNJT04gICAgID0gIjAuMDE0IjsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggcXd7IGNhbm9uX2FyY2ggY2Fub25fb3MgY2Fub25fbWljX2FyY2ggbGVnYWxfYXJjaCBhcmNoX29wdCB9LCBAdmFycyApOworb3VyICVFWFBPUlRfVEFHUyA9ICggYWxsID0+IFsgQEVYUE9SVF9PSyBdLCB2YXJzID0+IFxAdmFycyApOworCisjIENhbm9uaXplIGFyY2hpdGVjdHVyZSBuYW1lLgorc3ViIGNhbm9uX2FyY2goJCkgeworICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgaWYgKCAkYXJjaCA9fiBte1xBXHMqKD86MzJ8SUEtPzMyfElBLT8zMiBhcmNoaXRlY3R1cmV8aVszNDU2XTg2fHg4Nilccypcen1pICkgeworICAgICAgICAgICAgJGFyY2ggPSAiMzIiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQVxzKig/OjQ4fCg/OmlhKT8zMmV8SW50ZWxccyo2NHxJbnRlbFwoUlwpXHMqNjR8eDg2W18tXTY0fHg2NHxBTUQ2NClccypcen1pICkgeworICAgICAgICAgICAgJGFyY2ggPSAiMzJlIjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFhcm0oPzp2N1xEKik/XHp9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAiYXJtIjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFwcGM2NGxlfSApIHsKKwkJCSRhcmNoID0gInBwYzY0bGUiOworICAgICAgICB9IGVsc2lmICggJGFyY2ggPX4gbXtcQXBwYzY0fSApIHsKKyAgICAgICAgCSRhcmNoID0gInBwYzY0IjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFhYXJjaDY0fSApIHsKKyAgICAgICAgICAgICAgICAkYXJjaCA9ICJhYXJjaDY0IjsKKyAgICAgICAgfSBlbHNpZiAoICRhcmNoID1+IG17XEFtaWN9ICkgeworICAgICAgICAgICAgJGFyY2ggPSAibWljIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRhcmNoID0gdW5kZWY7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRhcmNoOworfTsgIyBzdWIgY2Fub25fYXJjaAorCisjIENhbm9uaXplIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSBuYW1lLgorc3ViIGNhbm9uX21pY19hcmNoKCQpIHsKKyAgICBteSAoICRtaWNfYXJjaCApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtuZn0gKSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSAia25mIjsKKyAgICAgICAgfSBlbHNpZiAoICRtaWNfYXJjaCA9fiBte1xBa25jfSkgeworICAgICAgICAgICAgJG1pY19hcmNoID0gImtuYyI7CisgICAgICAgIH0gZWxzaWYgKCAkbWljX2FyY2ggPX4gbXtcQWtubH0gKSB7CisgICAgICAgICAgICAkbWljX2FyY2ggPSAia25sIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRtaWNfYXJjaCA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbWljX2FyY2g7Cit9OyAjIHN1YiBjYW5vbl9taWNfYXJjaAorCit7ICAjIFJldHVybiBsZWdhbCBhcHByb3ZlZCBhcmNoaXRlY3R1cmUgbmFtZS4KKyAgICBteSAlbGVnYWwgPSAoCisgICAgICAgICIzMiIgID0+ICJJQS0zMiBhcmNoaXRlY3R1cmUiLAorICAgICAgICAiMzJlIiA9PiAiSW50ZWwoUikgNjQiLAorICAgICAgICAiYXJtIiA9PiAiQVJNIiwKKyAgICAgICAgImFhcmNoNjQiID0+ICJBQXJjaDY0IiwKKyAgICAgICAgIm1pYyIgPT4gIkludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZSIsCisgICAgKTsKKworICAgIHN1YiBsZWdhbF9hcmNoKCQpIHsKKyAgICAgICAgbXkgKCAkYXJjaCApID0gQF87CisgICAgICAgICRhcmNoID0gY2Fub25fYXJjaCggJGFyY2ggKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYXJjaCApICkgeworICAgICAgICAgICAgJGFyY2ggPSAkbGVnYWx7ICRhcmNoIH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgcmV0dXJuICRhcmNoOworICAgIH07ICMgc3ViIGxlZ2FsX2FyY2gKK30KKworeyAgIyBSZXR1cm4gYXJjaGl0ZWN0dXJlIG5hbWUgc3VpdGFibGUgZm9yIEludGVsIGNvbXBpbGVyIHNldHVwIHNjcmlwdHMuCisgICAgbXkgJW9wdGlvbiA9ICgKKyAgICAgICAgIjMyIiAgPT4gImlhMzIiLAorICAgICAgICAiMzJlIiA9PiAiaW50ZWw2NCIsCisgICAgICAgICI2NCIgID0+ICJpYTY0IiwKKyAgICAgICAgImFybSIgPT4gImFybSIsCisgICAgICAgICJhYXJjaDY0IiA9PiAiYWFyY2giLAorICAgICAgICAibWljIiA9PiAiaW50ZWw2NCIsCisgICAgKTsKKworICAgIHN1YiBhcmNoX29wdCgkKSB7CisgICAgICAgIG15ICggJGFyY2ggKSA9IEBfOworICAgICAgICAkYXJjaCA9IGNhbm9uX2FyY2goICRhcmNoICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgICAgICRhcmNoID0gJG9wdGlvbnsgJGFyY2ggfTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGFyY2g7CisgICAgfTsgIyBzdWIgYXJjaF9vcHQKK30KKworIyBDYW5vbml6ZSBPUyBuYW1lLgorc3ViIGNhbm9uX29zKCQpIHsKKyAgICBteSAoICRvcyApID0gQF87CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgaWYgKCAkb3MgPX4gbXtcQVxzKig/OkxpbnV4fGxpbnxsKVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAibGluIjsKKyAgICAgICAgfSBlbHNpZiAoICRvcyA9fiBte1xBXHMqKD86TWFjKD86XHMqT1MoPzpccypYKT8pP3xtYWN8bXxEYXJ3aW4pXHMqXHp9aSApIHsKKyAgICAgICAgICAgICRvcyA9ICJtYWMiOworICAgICAgICB9IGVsc2lmICggJG9zID1+IG17XEFccyooPzpXaW4oPzpkb3dzKT8oPzooPzpffFxzKik/KD86TlR8WFB8OTV8OTh8MjAwMykpP3x3KVxzKlx6fWkgKSB7CisgICAgICAgICAgICAkb3MgPSAid2luIjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRvcyA9IHVuZGVmOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorICAgIHJldHVybiAkb3M7Cit9OyAjIHN1YiBjYW5vbl9vcworCitteSAoICRfaG9zdF9vcywgJF9ob3N0X2FyY2gsICRfdGFyZ2V0X29zLCAkX3RhcmdldF9hcmNoLCAkX3RhcmdldF9taWNfYXJjaCwgJF9kZWZhdWx0X21pY19hcmNoKTsKKworIyBTZXQgdGhlIGRlZmF1bHQgbWljLWFyY2ggdmFsdWUuCiskX2RlZmF1bHRfbWljX2FyY2ggPSAia25jIjsKKworc3ViIHNldF90YXJnZXRfYXJjaCgkKSB7CisgICAgbXkgKCAkYXJjaCApID0gY2Fub25fYXJjaCggJF9bIDAgXSApOworICAgIGlmICggZGVmaW5lZCggJGFyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfYXJjaCAgICAgICA9ICRhcmNoOworICAgICAgICAkRU5WeyBMSUJPTVBfQVJDSCB9ID0gJGFyY2g7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkYXJjaDsKK307ICMgc3ViIHNldF90YXJnZXRfYXJjaAorCitzdWIgc2V0X3RhcmdldF9taWNfYXJjaCgkKSB7CisgICAgbXkgKCAkbWljX2FyY2ggKSA9IGNhbm9uX21pY19hcmNoKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkbWljX2FyY2ggKSApIHsKKyAgICAgICAgJF90YXJnZXRfbWljX2FyY2ggICAgICAgPSAkbWljX2FyY2g7CisgICAgICAgICRFTlZ7IExJQk9NUF9NSUNfQVJDSCB9ID0gJG1pY19hcmNoOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG1pY19hcmNoOworfTsgIyBzdWIgc2V0X3RhcmdldF9taWNfYXJjaAorCitzdWIgc2V0X3RhcmdldF9vcygkKSB7CisgICAgbXkgKCAkb3MgKSA9IGNhbm9uX29zKCAkX1sgMCBdICk7CisgICAgaWYgKCBkZWZpbmVkKCAkb3MgKSApIHsKKyAgICAgICAgJF90YXJnZXRfb3MgICAgICAgPSAkb3M7CisgICAgICAgICRFTlZ7IExJQk9NUF9PUyB9ID0gJG9zOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJG9zOworfTsgIyBzdWIgc2V0X3RhcmdldF9vcworCitzdWIgdGFyZ2V0X29wdGlvbnMoKSB7CisgICAgbXkgQG9wdGlvbnMgPSAoCisgICAgICAgICJ0YXJnZXQtb3N8b3M9cyIgPT4KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgc2V0X3RhcmdldF9vcyggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW9zIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgICB9LAorICAgICAgICAidGFyZ2V0LWFyY2hpdGVjdHVyZXx0YXJnZXJ0LWFyY2h8YXJjaGl0ZWN0dXJlfGFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfYXJjaCggJF9bIDEgXSApIG9yCisgICAgICAgICAgICAgICAgICAgZGllICJCYWQgdmFsdWUgb2YgLS10YXJnZXQtYXJjaGl0ZWN0dXJlIG9wdGlvbjogXCIkX1sgMSBdXCJcbiI7CisgICAgICAgICAgIH0sCisgICAgICAgICJ0YXJnZXQtbWljLWFyY2hpdGVjdHVyZXx0YXJnZXJ0LW1pYy1hcmNofG1pYy1hcmNoaXRlY3R1cmV8bWljLWFyY2g9cyIgPT4KKyAgICAgICAgICAgc3ViIHsKKyAgICAgICAgICAgICAgIHNldF90YXJnZXRfbWljX2FyY2goICRfWyAxIF0gKSBvcgorICAgICAgICAgICAgICAgICAgIGRpZSAiQmFkIHZhbHVlIG9mIC0tdGFyZ2V0LW1pYy1hcmNoaXRlY3R1cmUgb3B0aW9uOiBcIiRfWyAxIF1cIlxuIjsKKyAgICAgICAgICAgfSwKKyAgICApOworICAgIHJldHVybiBAb3B0aW9uczsKK307ICMgc3ViIHRhcmdldF9vcHRpb25zCisKKyMgRGV0ZWN0IGhvc3QgYXJjaC4KK3sKKyAgICBteSAkaGFyZHdhcmVfcGxhdGZvcm0gPSBVbmFtZTo6aGFyZHdhcmVfcGxhdGZvcm0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiaTM4NiIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJpYTY0IiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiNjQiOworICAgIH0gZWxzaWYgKCAkaGFyZHdhcmVfcGxhdGZvcm0gZXEgIng4Nl82NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gIjMyZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYXJtIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAiYXJtIjsKKyAgICB9IGVsc2lmICggJGhhcmR3YXJlX3BsYXRmb3JtIGVxICJwcGM2NGxlIiApIHsKKyAgICAgICAgJF9ob3N0X2FyY2ggPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAicHBjNjQiICkgeworICAgICAgICAkX2hvc3RfYXJjaCA9ICJwcGM2NCI7CisgICAgfSBlbHNpZiAoICRoYXJkd2FyZV9wbGF0Zm9ybSBlcSAiYWFyY2g2NCIgKSB7CisgICAgICAgICRfaG9zdF9hcmNoID0gImFhcmNoNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgaG9zdCBoYXJkd2FyZSBwbGF0Zm9ybTogXCIkaGFyZHdhcmVfcGxhdGZvcm1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCBob3N0IE9TLgoreworICAgIG15ICRvcGVyYXRpbmdfc3lzdGVtID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW0oKTsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJHTlUvTGludXgiICkgeworICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIkZyZWVCU0QiICkgeworICAgICAgICAjIEhvc3QgT1MgcmVzZW1ibGVzIExpbnV4LgorICAgICAgICAkX2hvc3Rfb3MgPSAibGluIjsKKyAgICB9IGVsc2lmICggJG9wZXJhdGluZ19zeXN0ZW0gZXEgIk5ldEJTRCIgKSB7CisgICAgICAgICMgSG9zdCBPUyByZXNlbWJsZXMgTGludXguCisgICAgICAgICRfaG9zdF9vcyA9ICJsaW4iOworICAgIH0gZWxzaWYgKCAkb3BlcmF0aW5nX3N5c3RlbSBlcSAiRGFyd2luIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIm1hYyI7CisgICAgfSBlbHNpZiAoICRvcGVyYXRpbmdfc3lzdGVtIGVxICJNUyBXaW5kb3dzIiApIHsKKyAgICAgICAgJF9ob3N0X29zID0gIndpbiI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBob3N0IG9wZXJhdGluZyBzeXN0ZW06IFwiJG9wZXJhdGluZ19zeXN0ZW1cIjsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfQorCisjIERldGVjdCB0YXJnZXQgYXJjaC4KK2lmICggZGVmaW5lZCggJEVOVnsgTElCT01QX0FSQ0ggfSApICkgeworICAgICMgVXNlIGFyY2ggc3BlY2lmaWVkIGluIExJQk9NUF9BUkNILgorICAgICRfdGFyZ2V0X2FyY2ggPSBjYW5vbl9hcmNoKCAkRU5WeyBMSUJPTVBfQVJDSCB9ICk7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJF90YXJnZXRfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfQVJDSCBlbnZpcm9ubWVudCB2YXJpYWJsZTogXCIkRU5WeyBMSUJPTVBfQVJDSCB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgYXJjaGl0ZWN0dXJlLgorICAgICRfdGFyZ2V0X2FyY2ggPSAkX2hvc3RfYXJjaDsKK307ICMgaWYKKyRFTlZ7IExJQk9NUF9BUkNIIH0gPSAkX3RhcmdldF9hcmNoOworCisjIERldGVjdCB0YXJnZXQgSW50ZWwoUikgTWFueSBJbnRlZ3JhdGVkIENvcmUgQXJjaGl0ZWN0dXJlLgoraWYgKCBkZWZpbmVkKCAkRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSApICkgeworICAgICMgVXNlIG1pYyBhcmNoIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0guCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSBjYW5vbl9taWNfYXJjaCggJEVOVnsgTElCT01QX01JQ19BUkNIIH0gKTsKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkX3RhcmdldF9taWNfYXJjaCApICkgeworICAgICAgICBkaWUgIlVua25vd24gYXJjaGl0ZWN0dXJlIHNwZWNpZmllZCBpbiBMSUJPTVBfTUlDX0FSQ0ggZW52aXJvbm1lbnQgdmFyaWFibGU6IFwiJEVOVnsgTElCT01QX01JQ19BUkNIIH1cIiI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICAjIE90aGVyd2lzZSB1c2UgZGVmYXVsdCBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUuCisgICAgJF90YXJnZXRfbWljX2FyY2ggPSAkX2RlZmF1bHRfbWljX2FyY2g7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfTUlDX0FSQ0ggfSA9ICRfdGFyZ2V0X21pY19hcmNoOworCisjIERldGVjdCB0YXJnZXQgT1MuCitpZiAoIGRlZmluZWQoICRFTlZ7IExJQk9NUF9PUyB9ICkgKSB7CisgICAgIyBVc2UgT1Mgc3BlY2lmaWVkIGluIExJQk9NUF9PUy4KKyAgICAkX3RhcmdldF9vcyA9IGNhbm9uX29zKCAkRU5WeyBMSUJPTVBfT1MgfSApOworICAgIGlmICggbm90IGRlZmluZWQoICRfdGFyZ2V0X29zICkgKSB7CisgICAgICAgIGRpZSAiVW5rbm93biBPUyBzcGVjaWZpZWQgaW4gTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlOiBcIiRFTlZ7IExJQk9NUF9PUyB9XCIiOworICAgIH07ICMgaWYKK30gZWxzZSB7CisgICAgIyBPdGhlcndpc2UgdXNlIGhvc3QgT1MuCisgICAgJF90YXJnZXRfb3MgPSAkX2hvc3Rfb3M7Cit9OyAjIGlmCiskRU5WeyBMSUJPTVBfT1MgfSA9ICRfdGFyZ2V0X29zOworCit1c2UgdmFycyBAdmFyczsKKwordGllKCAkaG9zdF9hcmNoLCAgICAgICAiUGxhdGZvcm06Omhvc3RfYXJjaCIgKTsKK3RpZSggJGhvc3Rfb3MsICAgICAgICAgIlBsYXRmb3JtOjpob3N0X29zIiApOwordGllKCAkaG9zdF9wbGF0Zm9ybSwgICAiUGxhdGZvcm06Omhvc3RfcGxhdGZvcm0iICk7Cit0aWUoICR0YXJnZXRfYXJjaCwgICAgICJQbGF0Zm9ybTo6dGFyZ2V0X2FyY2giICk7Cit0aWUoICR0YXJnZXRfbWljX2FyY2gsICJQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoIiApOwordGllKCAkdGFyZ2V0X29zLCAgICAgICAiUGxhdGZvcm06OnRhcmdldF9vcyIgKTsKK3RpZSggJHRhcmdldF9wbGF0Zm9ybSwgIlBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0iICk7CisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6YmFzZTsKKworICAgIHVzZSBDYXJwOworCisgICAgdXNlIFRpZTo6U2NhbGFyOworICAgIHVzZSBiYXNlICJUaWU6OlN0ZFNjYWxhciI7CisKKyAgICBzdWIgU1RPUkUgeworICAgICAgICBteSAkc2VsZiA9IHNoaWZ0KCBAXyApOworICAgICAgICBjcm9hayggIk1vZGlmeWluZyBcJCIgLiByZWYoICRzZWxmICkgLiAiIGlzIG5vdCBhbGxvd2VkOyBzdG9wcGVkIiApOworICAgIH07ICMgc3ViIFNUT1JFCisKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpiYXNlCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfaG9zdF9hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9vczsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAkX2hvc3Rfb3M7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6aG9zdF9wbGF0Zm9ybTsKKyAgICB1c2UgYmFzZSAiUGxhdGZvcm06OmJhc2UiOworICAgIHN1YiBGRVRDSCB7CisgICAgICAgIHJldHVybiAiJHtfaG9zdF9vc31fJHtfaG9zdF9hcmNofSI7CisgICAgfTsgIyBzdWIgRkVUQ0gKK30gIyBwYWNrYWdlIFBsYXRmb3JtOjpob3N0X3BsYXRmb3JtCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X2FyY2g7CisgICAgdXNlIGJhc2UgIlBsYXRmb3JtOjpiYXNlIjsKKyAgICBzdWIgRkVUQ0ggeworICAgICAgICByZXR1cm4gJF90YXJnZXRfYXJjaDsKKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X21pY19hcmNoOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X21pY19hcmNoCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgcmV0dXJuICRfdGFyZ2V0X29zOworICAgIH07ICMgc3ViIEZFVENICit9ICMgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X29zCisKK3sgcGFja2FnZSBQbGF0Zm9ybTo6dGFyZ2V0X3BsYXRmb3JtOworICAgIHVzZSBiYXNlICJQbGF0Zm9ybTo6YmFzZSI7CisgICAgc3ViIEZFVENIIHsKKyAgICAgICAgaWYgKCRfdGFyZ2V0X2FyY2ggZXEgIm1pYyIpIHsKKyAgICAgICAgICAgIHJldHVybiAiJHtfdGFyZ2V0X29zfV8ke190YXJnZXRfbWljX2FyY2h9IjsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgcmV0dXJuICIke190YXJnZXRfb3N9XyR7X3RhcmdldF9hcmNofSI7CisgICAgICAgIH0KKyAgICB9OyAjIHN1YiBGRVRDSAorfSAjIHBhY2thZ2UgUGxhdGZvcm06OnRhcmdldF9wbGF0Zm9ybQorCisKK3JldHVybiAxOworCitfX0VORF9fCisKKz1wb2QKKworPWhlYWQxIE5BTUUKKworQjxQbGF0Zm9ybS5wbT4gLS0gRmV3IHN1YnJvdXRpbmVzIHRvIGdldCBPUywgYXJjaGl0ZWN0dXJlIGFuZCBwbGF0Zm9ybSBuYW1lIGluIGZvcm0gc3VpdGFibGUgZm9yCituYW1pbmcgZmlsZXMsIGRpcmVjdG9yaWVzLCBtYWNyb3MsIGV0Yy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgUGxhdGZvcm0gIjphbGwiOworICAgIHVzZSB0b29sczsKKworICAgIG15ICRhcmNoICAgPSBjYW5vbl9hcmNoKCAiZW02NFQiICk7ICAgICAgICAjIFJldHVybnMgIjMyZSIuCisgICAgbXkgJGxlZ2FsICA9IGxlZ2FsX2FyY2goICJlbTY0dCIgKTsgICAgICAgICMgUmV0dXJucyAiSW50ZWwoUikgNjQiLgorICAgIG15ICRvcHRpb24gPSBhcmNoX29wdCggImVtNjR0IiApOyAgICAgICAgICAjIFJldHVybnMgImludGVsNjQiLgorICAgIG15ICRvcyAgICAgPSBjYW5vbl9vcyggIldpbmRvd3MgTlQiICk7ICAgICAjIFJldHVybnMgIndpbiIuCisKKyAgICBwcmludCggJGhvc3RfYXJjaCwgJGhvc3Rfb3MsICRob3N0X3BsYXRmb3JtICk7CisgICAgcHJpbnQoICR0YXJlZ3RfYXJjaCwgJHRhcmdldF9vcywgJHRhcmdldF9wbGF0Zm9ybSApOworCisgICAgdG9vbHM6OmdldF9vcHRpb25zKAorICAgICAgICBQbGF0Zm9ybTo6dGFyZ2V0X29wdGlvbnMoKSwKKyAgICAgICAgLi4uCisgICAgKTsKKworCis9aGVhZDEgREVTQ1JJUFRJT04KKworRW52aXJvbm1lbnQgdmFyaWFibGUgTElCT01QX09TIHNwZWNpZmllcyB0YXJnZXQgT1MgdG8gcmVwb3J0LiBJZiBMSUJPTVBfT1MgaWQgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBPUyBpcyB0YXJnZXQgT1MuCisKK0Vudmlyb25tZW50IHZhcmlhYmxlIExJQk9NUF9BUkNIIHNwZWNpZmllcyB0YXJnZXQgYXJjaGl0ZWN0dXJlIHRvIHJlcG9ydC4gSWYgTElCT01QX0FSQ0ggaXMgbm90IGRlZmluZWQsCit0aGUgc2NyaXB0IGFzc3VtZXMgaG9zdCBhcmNoaXRlY3R1cmUgaXMgdGFyZ2V0IG9uZS4KKworPWhlYWQyIEZ1bmN0aW9ucy4KKworPW92ZXIKKworPWl0ZW0gQjxjYW5vbl9hcmNoKCAkYXJjaCApPgorCitJbnB1dCBzdHJpbmcgaXMgYW4gYXJjaGl0ZWN0dXJlIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOgorQzwzMmU+LCBDPEludGVsNjQ+LCBDPEludGVsKFIpIDY0PiwgZXRjLiBSZXR1cm5lZCBzdHJpbmcgaXMgYSBjYW5vbm9uaXplZCBhcmNoaXRlY3R1cmUgbmFtZSwKK29uZSBvZjogQzwzMj4sIEM8MzJlPiwgQzw2ND4sIEM8YXJtPiwgQzxwcGM2NGxlPiwgQzxwcGM2ND4sIEM8bWljPiwgb3IgQzx1bmRlZj4gaXMgaW5wdXQgc3RyaW5nIGlzIG5vdCByZWNvZ25pemVkLgorCis9aXRlbSBCPGxlZ2FsX2FyY2goICRhcmNoICk+CisKK0lucHV0IHN0cmluZyBpcyBhcmNoaXRlY3R1cmUgbmFtZS4gVGhlIGZ1bmN0aW9uIHJlY29nbml6ZXMgdGhlIHNhbWUgdmFyaWFudHMgYXMgQzxhcmNoX2Nhbm9uKCk+IGRvZXMuCitSZXR1cm5lZCBzdHJpbmcgaXMgYSBuYW1lIGFwcHJvdmVkIGJ5IEludGVsIExlZ2FsLCBvbmUgb2Y6IEM8SUEtMzIgYXJjaGl0ZWN0dXJlPiwgQzxJbnRlbChSKSA2ND4KK29yIEM8dW5kZWY+IGlmIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjxhcmNoX29wdCggJGFyY2ggKT4KKworSW5wdXQgc3RyaW5nIGlzIGFyY2hpdGVjdHVyZSBuYW1lLiBUaGUgZnVuY3Rpb24gcmVjb2duaXplcyB0aGUgc2FtZSB2YXJpYW50cyBhcyBDPGFyY2hfY2Fub24oKT4gZG9lcy4KK1JldHVybmVkIHN0cmluZyBpcyBhbiBhcmNoaXRlY3R1cmUgbmFtZSBzdWl0YWJsZSBmb3IgcGFzc2luZyB0byBjb21waWxlciBzZXR1cCBzY3JpcHRzCisoZS4gZy4gQzxpY2N2YXJzLnNoPiksIG9uZSBvZjogQzxJQS0zMiBhcmNoaXRlY3R1cmU+LCBDPEludGVsKFIpIDY0PiBvciBDPHVuZGVmPiBpZiBpbnB1dCBzdHJpbmcgaXMgbm90CityZWNvZ25pemVkLgorCis9aXRlbSBCPGNhbm9uX29zKCAkb3MgKT4KKworSW5wdXQgc3RyaW5nIGlzIE9TIG5hbWUgdG8gY2Fub25pemUuIFRoZSBmdW5jdGlvbiByZWNvZ25pemVzIG1hbnkgdmFyaWFudHMsIGZvciBleGFtcGxlOiBDPG1hYz4sIEM8T1MgWD4sIGV0Yy4gUmV0dXJuZWQgc3RyaW5nIGlzIGEgY2Fub25pemVkIE9TIG5hbWUsIG9uZSBvZjogQzxsaW4+LAorQzxtYWM+LCBDPHdpbj4sIG9yIEM8dW5kZWY+IGlzIGlucHV0IHN0cmluZyBpcyBub3QgcmVjb2duaXplZC4KKworPWl0ZW0gQjx0YXJnZXRfb3B0aW9ucygpPgorCitSZXR1cm5zIGFycmF5IHN1aXRhYmxlIGZvciBwYXNzaW5nIHRvIEM8dG9vbHM6OmdldF9vcHRpb25zKCk+IHRvIGxldCBhIHNjcmlwdCByZWNvZ25pemUKK0M8LS10YXJnZXQtYXJjaGl0ZWN0dXJlPUk8c3RyPj4gYW5kIEM8LS10YXJnZXQtb3M9STxzdHI+PiBvcHRpb25zLiBUeXBpY2FsIHVzYWdlIGlzOgorCisgICAgdXNlIHRvb2xzOworICAgIHVzZSBQbGF0Zm9ybTsKKworICAgIG15ICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICk7ICAgICMgR2xvYmFsIHZhcmlhYmxlcywgbm90IGluaXRpYWxpemVkLgorCisgICAgLi4uCisKKyAgICBnZXRfb3B0aW9ucygKKyAgICAgICAgUGxhdGZvcm06OnRhcmdldF9vcHRpb25zKCksICAjIExldCBzY3JpcHQgcmVjb2duaXplIC0tdGFyZ2V0LW9zIGFuZCAtLXRhcmdldC1hcmNoIG9wdGlvbnMuCisgICAgICAgIC4uLgorICAgICk7CisgICAgIyBJbml0aWFsaXplIHZhcmlhYmxzIGFmdGVyIHBhcnNpbmcgY29tbWFuZCBsaW5lLgorICAgICggJG9zLCAkYXJjaCwgJHBsYXRmb3JtICkgPSAoIFBsYXRmb3JtOjp0YXJnZXRfb3MoKSwgUGxhdGZvcm06OnRhcmdldF9hcmNoKCksIFBsYXRmb3JtOjp0YXJnZXRfcGxhdGZvcm0oKSApOworCis9YmFjaworCis9aGVhZDIgVmFyaWFibGVzCisKKz1pdGVtIEI8JGhvc3RfYXJjaD4KKworQ2Fub25pemVkIG5hbWUgb2YgaG9zdCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JGhvc3Rfb3M+CisKK0Nhbm9uaXplZCBuYW1lIG9mIGhvc3QgT1MuCisKKz1pdGVtIEI8JGhvc3RfcGxhdGZvcm0+CisKK0hvc3QgcGxhdGZvcm0gbmFtZSAoY29uY2F0ZW5hdGVkIGNhbm9uaXplZCBPUyBuYW1lLCB1bmRlcnNjb3JlLCBhbmQgY2Fub25pemVkIGFyY2hpdGVjdHVyZSBuYW1lKS4KKworPWl0ZW0gQjwkdGFyZ2V0X2FyY2g+CisKK0Nhbm9uaXplZCBuYW1lIG9mIHRhcmdldCBhcmNoaXRlY3R1cmUuCisKKz1pdGVtIEI8JHRhcmdldF9vcz4KKworQ2Fub25pemVkIG5hbWUgb2YgdGFyZ2V0IE9TLgorCis9aXRlbSBCPCR0YXJnZXRfcGxhdGZvcm0+CisKK1RhcmdldCBwbGF0Zm9ybSBuYW1lIChjb25jYXRlbmF0ZWQgY2Fub25pemVkIE9TIG5hbWUsIHVuZGVyc2NvcmUsIGFuZCBjYW5vbml6ZWQgYXJjaGl0ZWN0dXJlIG5hbWUpLgorCis9YmFjaworCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9saWIvVW5hbWUucG0gYi9yYzMvcnVudGltZS90b29scy9saWIvVW5hbWUucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDE1MDcwYgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi9VbmFtZS5wbQpAQCAtMCwwICsxLDYzNSBAQAorIworIyBUaGlzIGlzIG5vdCBhIHJ1bm5hYmxlIHNjcmlwdCwgaXQgaXMgYSBQZXJsIG1vZHVsZSwgYSBjb2xsZWN0aW9uIG9mIHZhcmlhYmxlcywgc3Vicm91dGluZXMsIGV0Yy4KKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgZXhlY3V0ZSB0aGUgZm9sbG93aW5nIGNvbW1hbmQ6CisjCisjICAgICBwZXJsZG9jIFVuYW1lLnBtCisjCisjIG9yIHNlZSBQT0QgKFBsYWluIE9sZCBEb2N1bWVudGF0aW9uKSBlbWJlZGRlZCB0byB0aGUgc291cmNlLi4uCisjCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3BhY2thZ2UgVW5hbWU7CisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7Cit1c2Ugd2FybmluZ3M6OnJlZ2lzdGVyOwordXNlIEV4cG9ydGVyOworCit1c2UgUE9TSVg7Cit1c2UgRmlsZTo6R2xvYiAiOmdsb2IiOwordXNlIE5ldDo6RG9tYWluIHF3e307CisKKyMgRm9sbG93aW5nIGNvZGUgZG9lcyBub3Qgd29yayB3aXRoIFBlcmwgNS42IG9uIExpbnV4KiBPUyBhbmQgV2luZG93cyogT1M6CisjCisjICAgICB1c2UgaWYgJF5PIGVxICJkYXJ3aW4iLCB0b29scyA9PiBxd3t9OworIworIyBUaGUgd29ya2Fyb3VuZCBmb3IgUGVybCA1LjY6CisjCitCRUdJTiB7CisgICAgaWYgKCAkXk8gZXEgImRhcndpbiIgb3IgJF5PIGVxICJsaW51eCIgKSB7CisJcmVxdWlyZSB0b29sczsKKyAgICAgICAgaW1wb3J0IHRvb2xzOworICAgIH07ICMgaWYKKyAgICBpZiAoICReTyBlcSAiTVNXaW4zMiIgKSB7CisgICAgICAgIHJlcXVpcmUgV2luMzI7CisgICAgfTsgIyBpZgorfTsgIyBCRUdJTgorCitteSAkbXN3aW4gPSBxcntcQSg/Ok1TV2luMzJ8V2luZG93c19OVClcen07CisKK215IEBwb3NpeCA9IHF3eyBrZXJuZWxfbmFtZSBmcWRuIGtlcm5lbF9yZWxlYXNlIGtlcm5lbF92ZXJzaW9uIG1hY2hpbmUgfTsKKyAgICAjIFByb3BlcnRpZXMgc3VwcG9ydGVkIGJ5IFBPU0lYOjp1bmFtZSgpLgorbXkgQGxpbnV4ID0KKyAgICBxd3sgcHJvY2Vzc29yIGhhcmR3YXJlX3BsYXRmb3JtIG9wZXJhdGluZ19zeXN0ZW0gfTsKKyAgICAjIFByb3BlcnRpZXMgcmVwb3J0ZWQgYnkgdW5hbWUgaW4gTGludXgqIE9TLgorbXkgQGJhc2UgPSAoIEBwb3NpeCwgQGxpbnV4ICk7CisgICAgIyBCYXNlIHByb3BlcnRpZXMuCitteSBAYXV4ID0KKyAgICAoCisgICAgICAgIHF3eyBob3N0X25hbWUgZG9tYWluX25hbWUgfSwKKyAgICAgICAgbWFwKCAib3BlcmF0aW5nX3N5c3RlbV8kXyIsIHF3eyBuYW1lIHJlbGVhc2UgY29kZW5hbWUgZGVzY3JpcHRpb24gfSApCisgICAgKTsKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0aWVzLgorbXkgQGFsbCA9ICggQGJhc2UsIEBhdXggKTsKKyAgICAjIEFsbCB0aGUgcHJvcGVydGllcy4KK215IEBtZXRhID0gcXd7IGJhc2VfbmFtZXMgYWxsX25hbWVzIHZhbHVlIH07CisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKworb3VyICRWRVJTSU9OICAgICA9ICIwLjA3IjsKK291ciBASVNBICAgICAgICAgPSBxd3sgRXhwb3J0ZXIgfTsKK291ciBARVhQT1JUICAgICAgPSBxd3t9Oworb3VyIEBFWFBPUlRfT0sgICA9ICggQGFsbCwgQG1ldGEgKTsKK291ciAlRVhQT1JUX1RBR1MgPQorICAgICgKKyAgICAgICAgYmFzZSA9PiBbIEBiYXNlIF0sCisgICAgICAgIGFsbCAgPT4gWyBAYWxsICBdLAorICAgICAgICBtZXRhID0+IFsgQG1ldGEgXSwKKyAgICApOworCitteSAldmFsdWVzOworICAgICMgSGFzaCBvZiB2YWx1ZXMuIFNvbWUgdmFsdWVzIGFyZSBzdHJpbmdzLCBzb21lIG1heSBiZSByZWZlcmVuY2VzIHRvIGNvZGUgd2hpY2ggc2hvdWxkIGJlCisgICAgIyBldmFsdWF0ZWQgdG8gZ2V0IHJlYWwgdmFsdWUuIFRoaXMgdHJpY2sgaXMgaW1wbGVtZW50ZWQgYmVjYXVzZSBjYWxsIHRvIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpCisgICAgIyBpcyByZWxhdGl2ZWx5IHNsb3cuCisKKyMgR2V0IHZhbHVlcyBmcm9tIFBPU0lYOjp1bmFtZSgpLgorQHZhbHVlc3sgQHBvc2l4IH0gPSBQT1NJWDo6dW5hbWUoKTsKKworIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgcmV0dXJucyAic2hvcnQiIG5vZGUgbmFtZSAod2l0aG91dCBkb21haW4gbmFtZSkuIFRvIGJlIGNvbnNpc3RlbnQKKyMgb24gYWxsIHN5c3RlbXMsIHdlIHdpbGwgZ2V0IG5vZGUgbmFtZSBmcm9tIGFsdGVybmF0aXZlIHNvdXJjZS4KK2lmICggJF5PID1+IG0vY3lnd2luL2kgKSB7CisgICAgIyBGdW5jdGlvbiBmcm9tIE5ldDo6RG9tYWluIG1vZHVsZSB3b3JrcyB3ZWxsLCBidXQgb24gQ3lnd2luIGl0IHByaW50cyB0bworICAgICMgc3RkZXJyICJkb21haW5uYW1lOiBub3QgZm91bmQiLiBTbyB3ZSB3aWxsIHVzZSBlbnZpcm9ubWVudCB2YXJpYWJsZXMgZm9yIG5vdy4KKyAgICAkdmFsdWVzeyBmcWRuIH0gPSBsYyggJEVOVnsgQ09NUFVURVJOQU1FIH0gLiAiLiIgLiAkRU5WeyBVU0VSRE5TRE9NQUlOIH0gKTsKK30gZWxzZSB7CisgICAgIyBPbiBzeXN0ZW1zIG90aGVyIHRoYW4gQ3lnd2luLCBsZXQgdXMgdXNlIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpLCBidXQgZG8gaXQgb25seSBub2RlIG5hbWUKKyAgICAjIGlzIHJlYWxseSByZXF1ZXN0ZWQuCisgICAgJHZhbHVlc3sgZnFkbiB9ID0KKyAgICAgICAgc3ViIHsKKyAgICAgICAgICAgIG15ICRmcWRuID0gTmV0OjpEb21haW46Omhvc3RmcWRuKCk7ICMgImZxZG4iIHN0YW5kcyBmb3IgImZ1bGx5IHF1YWxpZmllZCBkb2FtYWluIG5hbWUiLgorICAgICAgICAgICAgIyBPbiBzb21lIHN5c3RlbXMgUE9TSVg6OnVuYW1lKCkgYW5kIE5ldDo6RG9tYWluOjpob3N0ZnFkbigpIHJlcG9ydHMgZGlmZmVyZW50IG5hbWVzLgorICAgICAgICAgICAgIyBMZXQgdXMgaXNzdWUgYSB3YXJuaW5nIGlmIHRoZXkgc2lnbmlmaWNhbnRseSBkaWZmZXJlbnQuIE5hbWVzIGFyZSBpbnNpZ25pZmljYW50bHkKKyAgICAgICAgICAgICMgZGlmZmVyZW50IGlmIFBPU0lYOjp1bmFtZSgpIG1hdGNoZXMgdGhlIGJlZ2lubmluZyBvZiBOZXQ6OkRvbWFpbjo6aG9zdGZxZG4oKS4KKyAgICAgICAgICAgIGlmICgKKyAgICAgICAgICAgICAgICAkZnFkbiBlcSBzdWJzdHIoICRmcWRuLCAwLCBsZW5ndGgoICRmcWRuICkgKQorICAgICAgICAgICAgICAgICYmCisgICAgICAgICAgICAgICAgKAorICAgICAgICAgICAgICAgICAgICBsZW5ndGgoICRmcWRuICkgPT0gbGVuZ3RoKCAkZnFkbiApCisgICAgICAgICAgICAgICAgICAgIHx8CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGZxZG4sIGxlbmd0aCggJGZxZG4gKSwgMSApIGVxICIuIgorICAgICAgICAgICAgICAgICkKKyAgICAgICAgICAgICkgeworICAgICAgICAgICAgICAgICMgT2suCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHdhcm5pbmdzOjp3YXJuaWYoCisgICAgICAgICAgICAgICAgICAgICJQT1NJWDo6dW5hbWUoKSBhbmQgTmV0OjpEb21haW46Omhvc3RmcWRuKCkgcmVwb3J0ZWQgZGlmZmVyZW50IG5hbWVzOiAiIC4KKyAgICAgICAgICAgICAgICAgICAgICAgICJcIiR2YWx1ZXN7IGZxZG4gfVwiIGFuZCBcIiRmcWRuXCIgcmVzcGVjdGl2ZWx5XG4iCisgICAgICAgICAgICAgICAgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIHJldHVybiAkZnFkbjsKKyAgICAgICAgfTsgIyBzdWIKK307ICMgaWYKKworaWYgKCAkXk8gPX4gJG1zd2luICkgeworICAgIGlmICgKKyAgICAgICAgJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEEoPzp4ODZ8WzU2XTg2KVx6fQorICAgICAgICBhbmQKKyAgICAgICAgZXhpc3RzKCAkRU5WeyBQUk9DRVNTT1JfQVJDSElURUNUVVJFIH0gKSBhbmQgJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVDVFVSRSB9IGVxICJ4ODYiCisgICAgICAgIGFuZAorICAgICAgICBleGlzdHMoICRFTlZ7IFBST0NFU1NPUl9BUkNISVRFVzY0MzIgfSApCisgICAgKSB7CisgICAgICAgIGlmICggJEVOVnsgUFJPQ0VTU09SX0FSQ0hJVEVXNjQzMiB9IGVxICJBTUQ2NCIgKSB7CisgICAgICAgICAgICAkdmFsdWVzeyBtYWNoaW5lIH0gPSAieDg2XzY0IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKK307ICMgaWYKKworIyBTb21lIHZhbHVlcyBhcmUgbm90IHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpLCBsZXQgdXMgY29tcHV0ZSB0aGVtLgorCisjIHByb2Nlc3Nvci4KKyR2YWx1ZXN7IHByb2Nlc3NvciB9ID0gJHZhbHVlc3sgbWFjaGluZSB9OworCisjIGhhcmR3YXJlX3BsYXRmb3JtLgoraWYgKCAwICkgeworfSBlbHNpZiAoICReTyBlcSAibGludXgiIG9yICReTyBlcSAiZnJlZWJzZCIgb3IgJF5PIGVxICJuZXRic2QiICkgeworICAgIGlmICggMCApIHsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFpWzM0NTZdODZcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiaTM4NiI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBKHg4Nl82NHxhbWQ2NClcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAieDg2XzY0IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9ID1+IG17XEFhcm12N1xEKlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJhcm0iOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQXBwYzY0bGVcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjRsZSI7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSA9fiBte1xBcHBjNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAicHBjNjQiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWFhcmNoNjRcen0gKSB7CisgICAgICAgICR2YWx1ZXN7IGhhcmR3YXJlX3BsYXRmb3JtIH0gPSAiYWFyY2g2NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyBlcSAiZGFyd2luIiApIHsKKyAgICBpZiAoIDAgKSB7CisgICAgfSBlbHNpZiAoICR2YWx1ZXN7IG1hY2hpbmUgfSBlcSAieDg2IiBvciAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgImkzODYiICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0KKyAgICAgICAgICAgIHN1YiB7CisgICAgICAgICAgICAgICAgbXkgJHBsYXRmb3JtID0gImkzODYiOworICAgICAgICAgICAgICAgICMgU29tZSBPU2VzIG9uIEludGVsKFIpIDY0IHN0aWxsIHJlcG9ydHMgImkzODYiIG1hY2hpbmUuIFZlcmlmeSBpdCBieSB1c2luZworICAgICAgICAgICAgICAgICMgdGhlIHZhbHVlIHJldHVybmVkIGJ5ICdzeXNjdGwgLW4gaHcub3B0aW9uYWwueDg2XzY0Jy4gT24gSW50ZWwoUikgNjQtYml0IHN5c3RlbXMgdGhlCisgICAgICAgICAgICAgICAgIyB2YWx1ZSA9PSAxOyBvbiAzMi1iaXQgc3lzdGVtcyB0aGUgJ2h3Lm9wdGlvbmFsLng4Nl82NCcgcHJvcGVydHkgZWl0aGVyIGRvZXMgbm90IGV4aXN0CisgICAgICAgICAgICAgICAgIyBvciB0aGUgdmFsdWUgPT0gMC4gVGhlIHBhdGggdmFyaWFibGUgZG9lcyBub3QgY29udGFpbiBhIHBhdGggdG8gc3lzY3RsIHdoZW4KKyAgICAgICAgICAgICAgICAjIHN0YXJ0ZWQgYnkgY3JvbnRhYi4KKyAgICAgICAgICAgICAgICBteSAkc3lzY3RsID0gKCB3aGljaCggInN5c2N0bCIgKSBvciAiL3Vzci9zYmluL3N5c2N0bCIgKTsKKyAgICAgICAgICAgICAgICBteSAkb3V0cHV0OworICAgICAgICAgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nICRzeXNjdGwuLi4iICk7CisgICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAkc3lzY3RsLCAiLW4iLCAiaHcub3B0aW9uYWwueDg2XzY0IiBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICAgICAgICAgY2hvbXAoICRvdXRwdXQgKTsKKyAgICAgICAgICAgICAgICBpZiAoIDAgKSB7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoICIkb3V0cHV0IiBlcSAiIiBvciAiJG91dHB1dCIgZXEgIjAiICkgeworICAgICAgICAgICAgICAgICAgICAkcGxhdGZvcm0gPSAiaTM4NiI7CisgICAgICAgICAgICAgICAgfSBlbHNpZiAoICIkb3V0cHV0IiBlcSAiMSIgKSB7CisgICAgICAgICAgICAgICAgICAgICRwbGF0Zm9ybSA9ICJ4ODZfNjQiOworICAgICAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgdmFsdWUgKFwiJG91dHB1dFwiKSByZXR1cm5lZCBieSBcIiRzeXNjdGwgLW4gaHcub3B0aW9uYWwueDg2XzY0XCI7IHN0b3BwZWQiOworICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICByZXR1cm4gJHBsYXRmb3JtOworICAgICAgICAgICAgfTsgIyBzdWIgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgKSB7CisJIyBTb21lIE9TIFgqIHZlcnNpb25zIHJlcG9ydCAieDg2XzY0Ii4KKwkkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNpZiAoICReTyA9fiAkbXN3aW4gKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQSg/Ong4NnxbNTZdODYpXHp9ICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gImkzODYiOworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gZXEgIng4Nl82NCIgb3IgJHZhbHVlc3sgbWFjaGluZSB9IGVxICJhbWQ2NCIgKSB7CisgICAgICAgICMgQWN0aXZlUGVybCBmb3IgSUEtMzIgYXJjaGl0ZWN0dXJlIHJldHVybnMgIng4Nl82NCIsIHdoaWxlIEFjdGl2ZVBlcmwgZm9yIEludGVsKFIpIDY0IHJldHVybnMgImFtZDY0Ii4KKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJ4ODZfNjQiOworICAgIH0gZWxzZSB7CisgICAgICAgIGRpZSAiVW5zdXBwb3J0ZWQgbWFjaGluZSAoXCIkdmFsdWVzeyBtYWNoaW5lIH1cIikgcmV0dXJuZWQgYnkgUE9TSVg6OnVuYW1lKCk7IHN0b3BwZWQiOworICAgIH07ICMgaWYKK30gZWxzaWYgKCAkXk8gZXEgImN5Z3dpbiIgKSB7CisgICAgaWYgKCAwICkgeworICAgIH0gZWxzaWYgKCAkdmFsdWVzeyBtYWNoaW5lIH0gPX4gbXtcQWlbMzQ1Nl04Nlx6fSApIHsKKyAgICAgICAgJHZhbHVlc3sgaGFyZHdhcmVfcGxhdGZvcm0gfSA9ICJpMzg2IjsKKyAgICB9IGVsc2lmICggJHZhbHVlc3sgbWFjaGluZSB9IGVxICJ4ODZfNjQiICkgeworICAgICAgICAkdmFsdWVzeyBoYXJkd2FyZV9wbGF0Zm9ybSB9ID0gIng4Nl82NCI7CisgICAgfSBlbHNlIHsKKyAgICAgICAgZGllICJVbnN1cHBvcnRlZCBtYWNoaW5lIChcIiR2YWx1ZXN7IG1hY2hpbmUgfVwiKSByZXR1cm5lZCBieSBQT1NJWDo6dW5hbWUoKTsgc3RvcHBlZCI7CisgICAgfTsgIyBpZgorfSBlbHNlIHsKKyAgICBkaWUgIlVuc3VwcG9ydGVkIE9TIChcIiReT1wiKTsgc3RvcHBlZCI7Cit9OyAjIGlmCisKKyMgb3BlcmF0aW5nX3N5c3RlbS4KK2lmICggMCApIHsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9IGVxICJMaW51eCIgKSB7CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSB9ID0gIkdOVS9MaW51eCI7CisgICAgbXkgJHJlbGVhc2U7ICAgICMgTmFtZSBvZiBjaG9zZW4gIiotcmVsZWFzZSIgZmlsZS4KKyAgICBteSAkYnVsazsgICAgICAgIyBDb250ZW50IG9mIHJlbGVhc2UgZmlsZS4KKyAgICAjIE9uIFVidW50dSwgbHNiLXJlbGVhc2UgaXMgcXVpdGUgaW5mb3JtYXRpdmUsIGUuIGcuOgorICAgICMgICAgIERJU1RSSUJfSUQ9VWJ1bnR1CisgICAgIyAgICAgRElTVFJJQl9SRUxFQVNFPTkuMDQKKyAgICAjICAgICBESVNUUklCX0NPREVOQU1FPWphdW50eQorICAgICMgICAgIERJU1RSSUJfREVTQ1JJUFRJT049IlVidW50dSA5LjA0IgorICAgICMgVHJ5IGxzYi1yZWxlYXNlIGZpcnN0LiBCdXQgb24gc29tZSBvbGRlciBzeXN0ZW1zIGxzYi1yZWxlYXNlIGlzIG5vdCBpbmZvcm1hdGl2ZS4KKyAgICAjIEl0IG1heSBjb250YWluIGp1c3Qgb25lIGxpbmU6CisgICAgIyAgICAgTFNCX1ZFUlNJT049IjEuMyIKKyAgICAkcmVsZWFzZSA9ICIvZXRjL2xzYi1yZWxlYXNlIjsKKyAgICBpZiAoIC1lICRyZWxlYXNlICkgeworICAgICAgICAkYnVsayA9IHJlYWRfZmlsZSggJHJlbGVhc2UgKTsKKyAgICB9IGVsc2UgeworICAgICAgICAkYnVsayA9ICIiOworICAgIH07ICMgaWYKKyAgICBpZiAoICRidWxrID1+IG17XkRJU1RSSUJffSApIHsKKyAgICAgICAgIyBPaywgdGhpcyBsc2ItcmVsZWFzZSBpcyBpbmZvcm1hdGl2ZS4KKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9JRFxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0lEOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSB9ID0gJDE7CisgICAgICAgICRidWxrID1+IG17XkRJU1RSSUJfUkVMRUFTRVxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX1JFTEVBU0U6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkMTsKKyAgICAgICAgJGJ1bGsgPX4gbXteRElTVFJJQl9DT0RFTkFNRVxzKj1ccyooLio/KVxzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0NPREVOQU1FOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUgfSA9ICQxOworICAgICAgICAkYnVsayA9fiBte15ESVNUUklCX0RFU0NSSVBUSU9OXHMqPSI/XHMqKC4qPykiP1xzKiR9bQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBESVNUUklCX0RFU0NSSVBUSU9OOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICQxOworICAgIH0gZWxzZSB7CisgICAgICAgICMgT29wcy4gbHNiLXJlbGVhc2UgaXMgbWlzc2VkIG9yIG5vdCBpbmZvcm1hdGl2ZS4gVHJ5IG90aGVyICotcmVsZWFzZSBmaWxlcy4KKyAgICAgICAgJHJlbGVhc2UgPSAiL2V0Yy9zeXN0ZW0tcmVsZWFzZSI7CisgICAgICAgIGlmICggbm90IC1lICRyZWxlYXNlICkgeyAgICAjIFVzZSAvZXRjL3N5c3RlbS1yZWxlYXNlIiBpZiBzdWNoIGZpbGUgZXhpc3RzLgorICAgICAgICAgICAgIyBPdGhlcndpc2UgdHJ5IG90aGVyICIvZXRjLyotcmVsZWFzZSIgZmlsZXMsIGJ1dCBpZ25vcmUgIi9ldGMvbHNiLXJlbGVhc2UiLgorICAgICAgICAgICAgbXkgQHJlbGVhc2VzID0gZ3JlcCggJF8gbmUgIi9ldGMvbHNiLXJlbGVhc2UiLCBic2RfZ2xvYiggIi9ldGMvKi1yZWxlYXNlIiApICk7CisgICAgICAgICAgICAjIE9uIHNvbWUgRmVkb3JhIHN5c3RlbXMgdGhlcmUgYXJlIHR3byBmaWxlczogZmVkb3JhLXJlbGVhc2UgYW5kIHJlZGhhdC1yZWxlYXNlCisgICAgICAgICAgICAjIHdpdGggaWRlbnRpY2FsIGNvbnRlbnQuIElmIGZlZG9yYS1yZWxlYXNlIHByZXNlbnQsIGlnbm9yZSByZWRqYXQtcmVsZWFzZS4KKyAgICAgICAgICAgIGlmICggZ3JlcCggJF8gZXEgIi9ldGMvZmVkb3JhLXJlbGVhc2UiLCBAcmVsZWFzZXMgKSApIHsKKyAgICAgICAgICAgICAgICBAcmVsZWFzZXMgPSBncmVwKCAkXyBuZSAiL2V0Yy9yZWRoYXQtcmVsZWFzZSIsIEByZWxlYXNlcyApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBAcmVsZWFzZXMgPT0gMSApIHsKKyAgICAgICAgICAgICAgICAkcmVsZWFzZSA9ICRyZWxlYXNlc1sgMCBdOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBpZiAoIEByZWxlYXNlcyA9PSAwICkgeworICAgICAgICAgICAgICAgICAgICAjIE5vICotcmVsZWFzZSBmaWxlcyBmb3VuZCwgdHJ5IGRlYmlhbl92ZXJzaW9uLgorICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9ICIvZXRjL2RlYmlhbl92ZXJzaW9uIjsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCBub3QgLWUgJHJlbGVhc2UgKSB7CisgICAgICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9IHVuZGVmOworICAgICAgICAgICAgICAgICAgICAgICAgd2FybmluZyggIk5vIHJlbGVhc2UgZmlsZXMgZm91bmQgaW4gXCIvZXRjL1wiIGRpcmVjdG9yeS4iICk7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICAgICAkcmVsZWFzZSA9IHVuZGVmOworICAgICAgICAgICAgICAgICAgICB3YXJuaW5nKCAiTW9yZSB0aGFuIG9uZSByZWxlYXNlIGZpbGVzIGZvdW5kIGluIFwiL2V0Yy9cIiBkaXJlY3Rvcnk6IiwgQHJlbGVhc2VzICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggZGVmaW5lZCggJHJlbGVhc2UgKSApIHsKKyAgICAgICAgICAgICRidWxrID0gcmVhZF9maWxlKCAkcmVsZWFzZSApOworICAgICAgICAgICAgaWYgKCAkcmVsZWFzZSA9fiBte3N5c3RlbXxyZWRoYXR8ZmVkb3JhfSApIHsKKyAgICAgICAgICAgICAgICAjIFJlZCBIYXQgb3IgRmVkb3JhLiBQYXJzZSB0aGUgZmlyc3QgbGluZSBvZiBmaWxlLgorICAgICAgICAgICAgICAgICMgVHlwaWNhbCB2YWx1ZXMgb2YgKi1yZWxlYXNlIChvbmUgb2YpOgorICAgICAgICAgICAgICAgICMgICAgIFJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgU2VydmVyIHJlbGVhc2UgNS4yIChUaWthbmdhKQorICAgICAgICAgICAgICAgICMgICAgIFJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgQVMgcmVsZWFzZSAzIChUYXJvb24gVXBkYXRlIDQpCisgICAgICAgICAgICAgICAgIyAgICAgRmVkb3JhIHJlbGVhc2UgMTAgKENhbWJyaWRnZSkKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJGZpcnN0X2xpbmUgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2Rlc2NyaXB0aW9uIH0gPSAkZmlyc3RfbGluZTsKKyAgICAgICAgICAgICAgICAkZmlyc3RfbGluZSA9fiBte1xBKC4qPylccytyZWxlYXNlXHMrKC4qPykoPzpccytcKCguKj8pKD86XHMrVXBkYXRlXHMrKC4qPykpP1wpKT9ccyokfQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6MTogQ2Fubm90IHBhcnNlIGxpbmU6IiwgJGZpcnN0X2xpbmUgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgfSAgPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgfSAgPSAkMiAuICggZGVmaW5lZCggJDQgKSA/ICIuJDQiIDogIiIgKTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIH0gPSAkMzsKKyAgICAgICAgICAgIH0gZWxzaWYgKCAkcmVsZWFzZSA9fiBte1N1U0V9ICkgeworICAgICAgICAgICAgICAgICMgVHlwaWNhbCBTdVNFLXJlbGVhc2U6CisgICAgICAgICAgICAgICAgIyAgICAgU1VTRSBMaW51eCogT1MgRW50ZXJwcmlzZSBTZXJ2ZXIgMTAgKHg4Nl82NCkKKyAgICAgICAgICAgICAgICAjICAgICBWRVJTSU9OID0gMTAKKyAgICAgICAgICAgICAgICAjICAgICBQQVRDSExFVkVMID0gMgorICAgICAgICAgICAgICAgICRidWxrID1+IG17XEEoLiopJH1tCisgICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcmVsZWFzZTogQ2Fubm90IGZpbmQgdGhlIGZpcnN0IGxpbmU6IiwgJGJ1bGssICIoZW9mKSIgKTsKKyAgICAgICAgICAgICAgICBteSAkZmlyc3RfbGluZSA9ICQxOworICAgICAgICAgICAgICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9ICRmaXJzdF9saW5lOworICAgICAgICAgICAgICAgICRmaXJzdF9saW5lID1+IG17XiguKj8pXHMqKFxkKylccypcKC4qP1wpXHMqJH0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOjE6IENhbm5vdCBwYXJzZSBsaW5lOiIsICRmaXJzdF9saW5lICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAkMTsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte15WRVJTSU9OXHMqPVxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggIiRyZWxlYXNlOiBUaGVyZSBpcyBubyBWRVJTSU9OOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkMTsKKyAgICAgICAgICAgICAgICBpZiAoICRidWxrID1+IG17XlBBVENITEVWRUxccyo9XHMqKC4qKVxzKiR9bSApIHsKKyAgICAgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gLj0gIi4kMSI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfSBlbHNpZiAoICRyZWxlYXNlID1+IG17ZGViaWFuX3ZlcnNpb259ICkgeworICAgICAgICAgICAgICAgICMgRGViaWFuLiBUaGUgZmlsZSBkZWJpYW5fdmVyc2lvbiBjb250YWlucyBqdXN0IHZlcnNpb24gbnVtYmVyLCBub3RoaW5nIG1vcmU6CisgICAgICAgICAgICAgICAgIyAgICAgNC4wCisgICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAiRGViaWFuIjsKKyAgICAgICAgICAgICAgICAkYnVsayA9fiBte1xBKC4qKSR9bQorICAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHJlbGVhc2U6IENhbm5vdCBmaW5kIHRoZSBmaXJzdCBsaW5lOiIsICRidWxrLCAiKGVvZikiICk7CisgICAgICAgICAgICAgICAgbXkgJHZlcnNpb24gPSAkMTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX25hbWUgICAgICAgIH0gPSAkbmFtZTsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSAkdmVyc2lvbjsKKyAgICAgICAgICAgICAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSAidW5rbm93biI7CisgICAgICAgICAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiB9ID0gc3ByaW50ZiggIiVzICVzIiwgJG5hbWUsICR2ZXJzaW9uICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gKSApIHsKKyAgICAgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9uYW1lIH0gPSAiR05VL0xpbnV4IjsKKyAgICB9OyAjIGlmCit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSBlcSAiRGFyd2luIiApIHsKKyAgICBteSAlY29kZW5hbWVzID0gKAorICAgICAgICAxMC40ID0+ICJUaWdlciIsCisgICAgICAgIDEwLjUgPT4gIkxlb3BhcmQiLAorICAgICAgICAxMC42ID0+ICJTbm93IExlb3BhcmQiLAorICAgICk7CisgICBteSAkZGFyd2luOworICAgbXkgJGdldF9vc19pbmZvID0KKyAgICAgICBzdWIgeworICAgICAgICAgICBteSAoICRuYW1lICkgPSBAXzsKKyAgICAgICAgICAgaWYgKCBub3QgZGVmaW5lZCAkZGFyd2luICkgeworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiRGFyd2luIjsKKyAgICAgICAgICAgICAgICMgc3dfdmVycyBwcmludHMgT1MgWCogdmVyc2lvbiB0byBzdGRvdXQ6CisgICAgICAgICAgICAgICAjICAgICBQcm9kdWN0TmFtZTogICAgICAgT1MgWCoKKyAgICAgICAgICAgICAgICMgICAgIFByb2R1Y3RWZXJzaW9uOiAgICAxMC40LjExCisgICAgICAgICAgICAgICAjICAgICBCdWlsZFZlcnNpb246ICAgICAgOFMyMTY3CisgICAgICAgICAgICAgICAjIEl0IGRvZXMgbm90IHByaW50IGNvZGVuYW1lLCBzbyB3ZSBjb2RlIE9TIFgqIGNvZGVuYW1lcyBoZXJlLgorICAgICAgICAgICAgICAgbXkgJHN3X3ZlcnMgPSB3aGljaCggInN3X3ZlcnMiICkgfHwgIi91c3IvYmluL3N3X3ZlcnMiOworICAgICAgICAgICAgICAgbXkgJG91dHB1dDsKKyAgICAgICAgICAgICAgIGRlYnVnKCAiRXhlY3V0aW5nICRzd192ZXJzLi4uIiApOworICAgICAgICAgICAgICAgZXhlY3V0ZSggWyAkc3dfdmVycyBdLCAtc3Rkb3V0ID0+IFwkb3V0cHV0LCAtc3RkZXJyID0+IHVuZGVmICk7CisgICAgICAgICAgICAgICAkb3V0cHV0ID1+IG17XlByb2R1Y3ROYW1lOlxzKiguKilccyokfW0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiVGhlcmUgaXMgbm8gUHJvZHVjdE5hbWUgaW4gc3dfdmVycyBvdXRwdXQ6IiwgJG91dHB1dCwgIihlb2YpIiApOworICAgICAgICAgICAgICAgbXkgJG5hbWUgPSAkMTsKKyAgICAgICAgICAgICAgICRvdXRwdXQgPX4gbXteUHJvZHVjdFZlcnNpb246XHMqKC4qKVxzKiR9bQorICAgICAgICAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICJUaGVyZSBpcyBubyBQcm9kdWN0VmVyc2lvbiBpbiBzd192ZXJzIG91dHB1dDoiLCAkb3V0cHV0LCAiKGVvZikiICk7CisgICAgICAgICAgICAgICBteSAkcmVsZWFzZSA9ICQxOworICAgICAgICAgICAgICAgIyBTb21ldGltZXMgcmVsZWFzZSByZXBvcnRlZCBhcyAiMTAuNC4xMSIgKDMgY29tcG9uZW50ZXMpLCBzb21ldGltZXMgYXMgIjEwLjYiLgorICAgICAgICAgICAgICAgIyBIYW5kbGUgYm90aCB2YXJpYW50cy4KKyAgICAgICAgICAgICAgICRyZWxlYXNlID1+IG17XihcZCsuXGQrKSg/OlwuXGQrKT8oPz1cc3wkKX0KKyAgICAgICAgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiQ2Fubm90IHBhcnNlIE9TIFgqIHZlcnNpb246ICRyZWxlYXNlIiApOworICAgICAgICAgICAgICAgbXkgJHZlcnNpb24gPSAkMTsKKyAgICAgICAgICAgICAgIG15ICRjb2RlbmFtZSA9ICggJGNvZGVuYW1lc3sgJHZlcnNpb24gfSBvciAidW5rbm93biIgKTsKKyAgICAgICAgICAgICAgICRkYXJ3aW4tPnsgb3BlcmF0aW5nX3N5c3RlbV9uYW1lICAgICAgICB9ID0gJG5hbWU7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSAgICAgfSA9ICRyZWxlYXNlOworICAgICAgICAgICAgICAgJGRhcndpbi0+eyBvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lICAgIH0gPSAkY29kZW5hbWU7CisgICAgICAgICAgICAgICAkZGFyd2luLT57IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHNwcmludGYoICIlcyAlcyAoJXMpIiwgJG5hbWUsICRyZWxlYXNlLCAkY29kZW5hbWUgKTsKKyAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICByZXR1cm4gJGRhcndpbi0+eyAkbmFtZSB9OworICAgICAgIH07ICMgc3ViCisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbSAgICAgICAgICAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtIiAgICAgICAgICAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fbmFtZSAgICAgICAgfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9uYW1lIiAgICAgICAgKTsgfTsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2UgICAgIH0gPSBzdWIgeyAkZ2V0X29zX2luZm8tPiggIm9wZXJhdGluZ19zeXN0ZW1fcmVsZWFzZSIgICAgICk7IH07CisgICAgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9jb2RlbmFtZSAgICB9ID0gc3ViIHsgJGdldF9vc19pbmZvLT4oICJvcGVyYXRpbmdfc3lzdGVtX2NvZGVuYW1lIiAgICApOyB9OworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW1fZGVzY3JpcHRpb24gfSA9IHN1YiB7ICRnZXRfb3NfaW5mby0+KCAib3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbiIgKTsgfTsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFXaW5kb3dzWyBfXU5UXHp9ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJNUyBXaW5kb3dzIjsKKyAgICAjIG15IEBvc19uYW1lID0gV2luMzI6OkdldE9TTmFtZSgpOworICAgICMgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlIH0gPSAkb3NfbmFtZVsgMCBdOworICAgICMgJHZhbHVlc3sgb3BlcmF0aW5nX3N5c3RlbV91cGRhdGUgIH0gPSAkb3NfbmFtZVsgMSBdOworfSBlbHNpZiAoICR2YWx1ZXN7IGtlcm5lbF9uYW1lIH0gPX4gbXtcQUNZR1dJTl9OVC19ICkgeworICAgICR2YWx1ZXN7IG9wZXJhdGluZ19zeXN0ZW0gfSA9ICJNUyBXaW5kb3dzIjsKK30gZWxzaWYgKCAkdmFsdWVzeyBrZXJuZWxfbmFtZSB9ID1+IG17XEFGcmVlQlNEfSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiRnJlZUJTRCI7Cit9IGVsc2lmICggJHZhbHVlc3sga2VybmVsX25hbWUgfSA9fiBte1xBTmV0QlNEfSApIHsKKyAgICAkdmFsdWVzeyBvcGVyYXRpbmdfc3lzdGVtIH0gPSAiTmV0QlNEIjsKK30gZWxzZSB7CisgICAgZGllICJVbnN1cHBvcnRlZCBrZXJuZWxfbmFtZSAoXCIkdmFsdWVzeyBrZXJuZWxfbmFtZSB9XCIpIHJldHVybmVkIGJ5IFBPU0lYOjp1bmFtZSgpOyBzdG9wcGVkIjsKK307ICMgaWYKKworIyBob3N0X25hbWUgYW5kIGRvbWFpbl9uYW1lCiskdmFsdWVzeyBob3N0X25hbWUgfSA9CisgICAgc3ViIHsKKyAgICAgICAgbXkgJGZxZG4gPSB2YWx1ZSggImZxZG4iICk7CisgICAgICAgICRmcWRuID1+IG17XEEoW14uXSopKD86XC4oLiopKT9cen07CisgICAgICAgIG15ICRob3N0X25hbWUgPSAkMTsKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGhvc3RfbmFtZSApIG9yICRob3N0X25hbWUgZXEgIiIgKSB7CisgICAgICAgICAgICBkaWUgIlVuZXhwZWN0ZWQgZXJyb3I6IHVuZGVmaW5lZCBvciBlbXB0eSBob3N0IG5hbWU7IHN0b3BwZWQiOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHJldHVybiAkaG9zdF9uYW1lOworICAgIH07CiskdmFsdWVzeyBkb21haW5fbmFtZSB9ID0KKyAgICBzdWIgeworICAgICAgICBteSAkZnFkbiA9IHZhbHVlKCAiZnFkbiIgKTsKKyAgICAgICAgJGZxZG4gPX4gbXtcQShbXi5dKikoPzpcLiguKikpP1x6fTsKKyAgICAgICAgbXkgJGRvbWFpbl9uYW1lID0gJDI7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRkb21haW5fbmFtZSApIG9yICRkb21haW5fbmFtZSBlcSAiIiApIHsKKyAgICAgICAgICAgIGRpZSAiVW5leHBlY3RlZCBlcnJvcjogdW5kZWZpbmVkIG9yIGVtcHR5IGRvbWFpbiBuYW1lOyBzdG9wcGVkIjsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICByZXR1cm4gJGRvbWFpbl9uYW1lOworICAgIH07CisKKyMgUmVwbGFjZSB1bmRlZmluZWQgdmFsdWVzIHdpdGggInVua25vd24iLgorZm9yZWFjaCBteSAkbmFtZSAoIEBhbGwgKSB7CisgICAgaWYgKCBub3QgZGVmaW5lZCggJHZhbHVlc3sgJG5hbWUgfSApICkgeworICAgICAgICAkdmFsdWVzeyAkbmFtZSB9ID0gInVua25vd24iOworICAgIH07ICMgaWYKK307ICMgZm9yZWFjaCAkbmFtZQorCisjIEV4cG9ydCBmdW5jdGlvbnMgcmVwb3J0aW5nIHByb3BlcnRpZXMuCitmb3JlYWNoIG15ICRuYW1lICggQGFsbCApIHsKKyAgICBubyBzdHJpY3QgInJlZnMiOworICAgICokbmFtZSA9IHN1YiB7IHJldHVybiB2YWx1ZSggJG5hbWUgKTsgfTsKK307ICMgZm9yZWFjaCAkbmFtZQorCisjIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBiYXNlIG5hbWVzLgorc3ViIGJhc2VfbmFtZXMgeworICAgIHJldHVybiBAYmFzZTsKK307ICMgc3ViIGJhc2VfbmFtZXMKKworIyBUaGlzIGZ1bmN0aW9uIHJldHVybnMgYWxsIHRoZSBuYW1lcy4KK3N1YiBhbGxfbmFtZXMgeworICAgIHJldHVybiBAYWxsOworfTsgIyBzdWIgYWxsX25hbWVzCisKKyMgVGhpcyBmdW5jdGlvbiByZXR1cm5zIHZhbHVlIGJ5IHRoZSBzcGVjaWZpZWQgbmFtZS4KK3N1YiB2YWx1ZSgkKSB7CisgICAgbXkgJG5hbWUgPSBzaGlmdCggQF8gKTsKKyAgICBpZiAoIHJlZiggJHZhbHVlc3sgJG5hbWUgfSApICkgeworICAgICAgICBteSAkdmFsdWUgPSAkdmFsdWVzeyAkbmFtZSB9LT4oKTsKKyAgICAgICAgJHZhbHVlc3sgJG5hbWUgfSA9ICR2YWx1ZTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICR2YWx1ZXN7ICRuYW1lIH07Cit9OyAjIHN1YiB2YWx1ZQorCityZXR1cm4gMTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8VW5hbWUucG0+IC0tIEEgZmV3IHN1YnJvdXRpbmVzIHRvIGdldCBzeXN0ZW0gaW5mb3JtYXRpb24gdXN1YWxseSBwcm92aWRlZCBieQorQzwvYmluL3VuYW1lPiBhbmQgQzxQT1NJWDo6dW5hbWUoKT4uCisKKz1oZWFkMSBTWU5PUFNJUworCisgICAgdXNlIFVuYW1lOworCisgICAgIyBCYXNlIHByb3BlcnR5IGZ1bmN0aW9ucy4KKyAgICAka2VybmVsX25hbWUgICAgICAgPSBVbmFtZTo6a2VybmVsX25hbWUoKTsKKyAgICAkZnFkbiAgICAgICAgICAgICAgPSBVbmFtZTo6ZnFkbigpOworICAgICRrZXJuZWxfcmVsZWFzZSAgICA9IFVuYW1lOjprZXJuZWxfcmVsZWFzZSgpOworICAgICRrZXJuZWxfdmVyc2lvbiAgICA9IFVuYW1lOjprZXJuZWxfdmVyc2lvbigpOworICAgICRtYWNoaW5lICAgICAgICAgICA9IFVuYW1lOjptYWNoaW5lKCk7CisgICAgJHByb2Nlc3NvciAgICAgICAgID0gVW5hbWU6OnByb2Nlc3NvcigpOworICAgICRoYXJkd2FyZV9wbGF0Zm9ybSA9IFVuYW1lOjpoYXJkd2FyZV9wbGF0Zm9ybSgpOworICAgICRvcGVyYXRpbmdfc3lzdGVtICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtKCk7CisKKyAgICAjIEF1eGlsaWFyeSBwcm9wZXJ0eSBmdW5jdGlvbnMuCisgICAgJGhvc3RfbmFtZSAgICAgICAgID0gVW5hbWU6Omhvc3RfbmFtZSgpOworICAgICRkb21haW5fbmFtZSAgICAgICA9IFVuYW1lOjpkb21haW5fbmFtZSgpOworICAgICRvc19uYW1lICAgICAgICAgICA9IFVuYW1lOjpvcGVyYXRpbmdfc3lzdGVtX25hbWUoKTsKKyAgICAkb3NfcmVsZWFzZSAgICAgICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9yZWxlYXNlKCk7CisgICAgJG9zX2NvZGVuYW1lICAgICAgID0gVW5hbWU6Om9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWUoKTsKKyAgICAkb3NfZGVzY3JpcHRpb24gICAgPSBVbmFtZTo6b3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbigpOworCisgICAgIyBNZXRhIGZ1bmN0aW9ucy4KKyAgICBAYmFzZV9uYW1lcyAgPSBVbmFtZTo6YmFzZV9uYW1lcygpOworICAgIEBhbGxfbmFtZXMgICA9IFVuYW1lOjphbGxfbmFtZXMoKTsKKyAgICAka2VybmVsX25hbWUgPSBVbmFtZTo6dmFsdWUoICJrZXJuZWxfbmFtZSIgKTsKKworPWhlYWQxIERFU0NSSVBUSU9OCisKK0I8VW5hbWUucG0+IHJlc2VtYmxlcyBmdW5jdGlvbmFsaXR5IGZvdW5kIGluIEM8UE9TSVg6OnVuYW1lKCk+IGZ1bmN0aW9uIG9yIGluIEM8dW5hbWU+IHByb2dyYW0uCitIb3dldmVyLCBib3RoIEM8UE9TSVg6OnVuYW1lKCk+IGFuZCBDPC9iaW4vdW5hbWU+IGhhdmUgc29tZSBkaXNhZHZhbnRhZ2VzOgorCis9b3ZlcgorCis9aXRlbSAqCisKK0M8dW5hbWU+IG1heSBiZSBub3QgYXZhaWxhYmxlIGluIHNvbWUgZW52aXJvbm1lbnRzLCBmb3IgZXhhbXBsZSwgaW4gV2luZG93cyogT1MKKyhDPHVuYW1lPiBtYXkgYmUgZm91bmQgaW4gc29tZSB0aGlyZC1wYXJ0eSBzb2Z0d2FyZSBwYWNrYWdlcywgbGlrZSBNS1MgVG9vbGtpdCBvciBDeWd3aW4sIGJ1dCBpdCBpcworbm90IGEgcGFydCBvZiBPUykuCisKKz1pdGVtICoKKworVGhlcmUgYXJlIG1hbnkgZGlmZmVyZW50IHZlcnNpb25zIG9mIEM8dW5hbWU+LiBGb3IgZXhhbXBsZSwgQzx1bmFtZT4gb24gT1MgWCogZG9lcyBub3QKK3JlY29nbml6ZSBvcHRpb25zIEM8LWk+LCBDPC1vPiwgYW5kIGFueSBsb25nIG9wdGlvbnMuCisKKz1pdGVtICoKKworRGlmZmVyZW50IHZlcnNpb25zIG9mIEM8dW5hbWU+IG1heSByZXBvcnQgdGhlIHNhbWUgcHJvcGVydHkgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLAorQzx1bmFtZT4gb24gTGludXgqIE9TIHJlcG9ydHMgbWFjaGluZSBhcyBDPGk2ODY+LCB3aGlsZSBDPHVuYW1lPiBvbiBPUyBYKiByZXBvcnRzIHRoZSBzYW1lIG1hY2hpbmUgYXMKK0M8eDg2Pi4KKworPWl0ZW0gKgorCitDPFBPU0lYOjp1bmFtZSgpPiByZXR1cm5zIGxpc3Qgb2YgdmFsdWVzLiBJIGNhbm5vdCByZWNhbGwgd2hhdCBpcyB0aGUgZm91cnRoIGVsZW1lbnQgb2YgdGhlIGxpc3QuCisKKz1iYWNrCisKKz1oZWFkMiBCYXNlIEZ1bmN0aW9ucworCitCYXNlIHByb3BlcnR5IGZ1bmN0aW9ucyBwcm92aWRlIHRoZSBpbmZvcm1hdGlvbiBhcyBDPHVuYW1lPiBwcm9ncmFtLgorCis9b3ZlcgorCis9aXRlbSBCPGtlcm5lbF9uYW1lKCk+CisKK1JldHVybnMgdGhlIGtlcm5lbCBuYW1lLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4KKworPWl0ZW0gQjxmcWRuKCk+CisKK1JldHVybnMgdGhlIEZRRE4sIGZ1bGx5IHF1YWxpZmllZCBkb21haW4gbmFtZS4gT24gc29tZSBzeXN0ZW1zIEM8UE9TSVg6OnVuYW1lKCk+IHJlcG9ydHMgc2hvcnQgbm9kZQorbmFtZSAod2l0aCBubyBkb21haW4gbmFtZSksIG9uIG90aGVycyBDPFBPU0lYOjp1bmFtZSgpPiByZXBvcnRzIGZ1bGwgbm9kZSBuYW1lLiBUaGlzCitmdW5jdGlvbiBzdHJpdmUgdG8gcmV0dXJuIEZRRE4gYWx3YXlzIChieSByZWZpbmluZyBDPFBPU0lYOjp1bmFtZSgpPiB3aXRoCitDPE5ldDo6RG9tYWluOjpob3N0ZnFkbigpPikuCisKKz1pdGVtIEI8a2VybmVsX3JlbGVhc2UoKT4KKworUmV0dXJucyB0aGUga2VybmVsIHJlbGVhc2Ugc3RyaW5nLCBhcyByZXBvcnRlZCBieSBDPFBPU0lYOjp1bmFtZSgpPi4gVXN1YWxseSB0aGUgc3RyaW5nIGNvbnNpc3RzIG9mCitzZXZlcmFsIG51bWJlcnMsIHNlcGFyYXRlZCBieSBkb3RzIGFuZCBkYXNoZXMsIGJ1dCBtYXkgYWxzbyBpbmNsdWRlIHNvbWUgbm9uLW51bWVyaWMgc3Vic3RyaW5ncyBsaWtlCisic21wIi4KKworPWl0ZW0gQjxrZXJuZWxfdmVyc2lvbigpPgorCitSZXR1cm5zIHRoZSBrZXJuZWwgdmVyc2lvbiBzdHJpbmcsIGFzIHJlcG9ydGVkIGJ5IEM8UE9TSVg6OnVuYW1lKCk+LiBJdCBpcyBCPG5vdD4gc2V2ZXJhbAorZG90LXNlcGFyYXRlZCBudW1iZXJzIGJ1dCBtdWNoIGxvbmdlciBzdHJpbmcgZGVzY3JpYmluZyB0aGUga2VybmVsLgorRm9yIGV4YW1wbGUsIG9uIExpbnV4KiBPUyBpdCBpbmNsdWRlcyBidWlsZCBkYXRlLgorSWYgeW91IGxvb2sgZm9yIHNvbWV0aGluZyBpZGVudGlmeWluZyB0aGUga2VybmVsLCBsb29rIGF0IEw8a2VybmVsX3JlbGVhc2U+LgorCis9aXRlbSBCPG1hY2hpbmUoKT4KKworUmV0dXJucyB0aGUgbWFjaGluZSBoYXJkd2FyZSBuYW1lLCBhcyByZXBvcnRlZCBieSBQT1NJWDo6dW5hbWUoKS4gTm90IHJlbGlhYmxlLiBEaWZmZXJlbnQgT1NlcyBtYXkKK3JlcG9ydCB0aGUgc2FtZSBtYWNoaW5lIGhhcmR3YXJlIG5hbWUgZGlmZmVyZW50bHkuIEZvciBleGFtcGxlLCBMaW51eCogT1MgcmVwb3J0cyBDPGk2ODY+LCB3aGlsZSBPUyBYKgorcmVwb3J0cyBDPHg4Nj4gb24gdGhlIHNhbWUgbWFjaGluZS4KKworPWl0ZW0gQjxwcm9jZXNzb3IoKT4KKworUmV0dXJucyB0aGUgcHJvY2Vzc29yIHR5cGUuIE5vdCByZWxpYWJsZS4gVXN1YWxseSB0aGUgc2FtZSBhcyBDPG1hY2hpbmU+LgorCis9aXRlbSBCPGhhcmR3YXJlX3BsYXRmb3JtKCk+CisKK09uZSBvZjogQzxpMzg2PiBvciBDPHg4Nl82ND4uCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbSgpPgorCitPbmUgb2Y6IEM8R05VL0xpbnV4PiwgQzxPUyBYKj4sIG9yIEM8TVMgV2luZG93cz4uCisKKz1iYWNrCisKKz1oZWFkMiBBdXhpbGlhcnkgRnVuY3Rpb25zCisKK0F1eGlsaWFyeSBmdW5jdGlvbnMgZXh0ZW5kcyBiYXNlIGZ1bmN0aW9ucyB3aXRoIGluZm9ybWF0aW9uIG5vdCByZXBvcnRlZCBieSBDPHVuYW1lPiBwcm9ncmFtLgorCitBdXhpbGlhcnkgZnVuY3Rpb25zIGNvbGxlY3QgaW5mb3JtYXRpb24gZnJvbSBkaWZmZXJlbnQgc291cmNlcy4gRm9yIGV4YW1wbGUsIG9uIE9TIFgqLCB0aGV5IG1heQorY2FsbCBDPHN3X3ZlcnM+IHByb2dyYW0gdG8gZmluZCBvdXQgT1MgcmVsZWFzZTsgb24gTGludXgqIE9TIHRoZXkgbWF5IHBhcnNlIEM8L2V0Yy9yZWRoYXQtcmVsZWFzZT4gZmlsZSwKK2V0Yy4KKworPW92ZXIKKworPWl0ZW0gQjxob3N0X25hbWUoKT4KKworUmV0dXJucyBob3N0IG5hbWUgKEZRRE4gd2l0aCBkcm9wcGVkIGRvbWFpbiBwYXJ0KS4KKworPWl0ZW0gQjxkb21haW5fbmFtZSgpPgorCitSZXR1cm5zIGRvbWFpbiBuYW1lIChGUUROIHdpdGggZHJvcHBlZCBob3N0IHBhcnQpLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fbmFtZT4KKworTmFtZSBvZiBvcGVyYXRpbmcgc3lzdGVtIG9yIG5hbWUgb2YgTGludXgqIE9TIGRpc3RyaWJ1dGlvbiwgbGlrZSAiRmVkb3JhIiBvcgorIlJlZCBIYXQgRW50ZXJwcmlzZSBMaW51eCogT1MgU2VydmVyIi4KKworPWl0ZW0gQjxvcGVyYXRpbmdfc3lzdGVtX3JlbGVhc2U+CisKK1JlbGVhc2UgKHZlcnNpb24pIG9mIG9wZXJhdGluZyBzeXN0ZW0gb3IgTGludXgqIE9TIGRpc3RyaWJ1dGlvbi4gVXN1YWxseSBpdCBpcyBhIHNlcmllcyBvZgorZG90LXNlcGFyYXRlZCBudW1iZXJzLgorCis9aXRlbSBCPG9wZXJhdGluZ19zeXN0ZW1fY29kZW5hbWU+CisKK0NvZGVuYW1lIG9mIG9wZXJhdGluZyBzeXN0ZW0gcmVsZWFzZSBvciBMaW51eCogT1MgZGlzdHJpYnV0aW9uLiBGb3IgZXhhbXBsZSwgRmVkb3JhIDEwIGlzICJDYW1icmlkZ2UiCit3aGlsZSBPUyBYKiAxMC40IGlzICJUaWdlciIuCisKKz1pdGVtIEI8b3BlcmF0aW5nX3N5c3RlbV9kZXNjcmlwdGlvbj4KKworTG9uZ2VyIHN0cmluZy4gVXN1YWxseSBpdCBpbmNsdWRlcyBhbGwgdGhlIG9wZXJhdGluZyBzeXN0ZW0gcHJvcGVydGluZyBtZW50aW9uZWQgYWJvdmUgLS0gbmFtZSwKK3JlbGVhc2UsIGNvZGVuYW1lIGluIHBhcmVudGhlc2VzLgorCis9YmFjaworCis9aGVhZDIgTWV0YSBGdW5jdGlvbnMKKworPW92ZXIKKworPWl0ZW0gQjxiYXNlX25hbWVzKCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgbGlzdCBvZiBiYXNlIHByb3BlcnR5IG5hbWVzLgorCis9aXRlbSBCPGFsbF9uYW1lcygpPgorCitUaGlzIGZ1bmN0aW9uIHJldHVybnMgdGhlIGxpc3Qgb2YgYWxsIHByb3BlcnR5IG5hbWVzLgorCis9aXRlbSBCPHZhbHVlKD4gSTxuYW1lPiBCPCk+CisKK1RoaXMgZnVuY3Rpb24gcmV0dXJucyB0aGUgdmFsdWUgb2YgdGhlIHByb3BlcnR5IHNwZWNpZmllZCBieSBJPG5hbWU+LgorCis9YmFjaworCis9aGVhZDEgRVhBTVBMRVMKKworICAgIHVzZSBVbmFtZTsKKworICAgIHByaW50KCBVbmFtZTo6c3RyaW5nKCksICJcbiIgKTsKKworICAgIGZvcmVhY2ggbXkgJG5hbWUgKCBVbmFtZTo6YWxsX25hbWVzKCkgKSB7CisgICAgICAgIHByaW50KCAiJG5hbWU9XCIiIC4gVW5hbWU6OnZhbHVlKCAkbmFtZSApIC4gIlwiXG4iICk7CisgICAgfTsgIyBmb3JlYWNoICRuYW1lCisKKz1oZWFkMSBTRUUgQUxTTworCitMPFBPU0lYOjp1bmFtZT4sIEw8dW5hbWU+LgorCis9Y3V0CisKKyMgZW5kIG9mIGZpbGUgIworCmRpZmYgLS1naXQgYS9yYzMvcnVudGltZS90b29scy9saWIvdG9vbHMucG0gYi9yYzMvcnVudGltZS90b29scy9saWIvdG9vbHMucG0KbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2U1Y2Y0NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy9ydW50aW1lL3Rvb2xzL2xpYi90b29scy5wbQpAQCAtMCwwICsxLDE5ODEgQEAKKyMKKyMgVGhpcyBpcyBub3QgYSBydW5uYWJsZSBzY3JpcHQsIGl0IGlzIGEgUGVybCBtb2R1bGUsIGEgY29sbGVjdGlvbiBvZiB2YXJpYWJsZXMsIHN1YnJvdXRpbmVzLCBldGMuCisjIHRvIGJlIHVzZWQgaW4gb3RoZXIgc2NyaXB0cy4KKyMKKyMgVG8gZ2V0IGhlbHAgYWJvdXQgZXhwb3J0ZWQgdmFyaWFibGVzIGFuZCBzdWJyb3V0aW5lcywgcGxlYXNlIGV4ZWN1dGUgdGhlIGZvbGxvd2luZyBjb21tYW5kOgorIworIyAgICAgcGVybGRvYyB0b29scy5wbQorIworIyBvciBzZWUgUE9EIChQbGFpbiBPbGQgRG9jdW1lbnRhdGlvbikgaW1iZWRkZWQgdG8gdGhlIHNvdXJjZS4uLgorIworIworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjLy8KKyMvLyAgICAgICAgICAgICAgICAgICAgIFRoZSBMTFZNIENvbXBpbGVyIEluZnJhc3RydWN0dXJlCisjLy8KKyMvLyBUaGlzIGZpbGUgaXMgZHVhbCBsaWNlbnNlZCB1bmRlciB0aGUgTUlUIGFuZCB0aGUgVW5pdmVyc2l0eSBvZiBJbGxpbm9pcyBPcGVuCisjLy8gU291cmNlIExpY2Vuc2VzLiBTZWUgTElDRU5TRS50eHQgZm9yIGRldGFpbHMuCisjLy8KKyMvLz09PS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS09PT0vLworIworCis9aGVhZDEgTkFNRQorCitCPHRvb2xzLnBtPiAtLSBBIGNvbGxlY3Rpb24gb2Ygc3Vicm91dGluZXMgd2hpY2ggYXJlIHdpZGVseSB1c2VkIGluIFBlcmwgc2NyaXB0cy4KKworPWhlYWQxIFNZTk9QU0lTCisKKyAgICB1c2UgRmluZEJpbjsKKyAgICB1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisgICAgdXNlIHRvb2xzOworCis9aGVhZDEgREVTQ1JJUFRJT04KKworQjxOb3RlOj4gQmVjYXVzZSB0aGlzIGNvbGxlY3Rpb24gaXMgc21hbGwgYW5kIGludGVuZGVkIGZvciB3aWRlbHkgdXNpbmcgaW4gcGFydGljdWxhciBwcm9qZWN0LAorYWxsIHZhcmlhYmxlcyBhbmQgZnVuY3Rpb25zIGFyZSBleHBvcnRlZCBieSBkZWZhdWx0LgorCitCPE5vdGU6PiBJIGhhdmUgc29tZSBpZGVhcyBob3cgdG8gaW1wcm92ZSB0aGlzIGNvbGxlY3Rpb24sIGJ1dCBpdCBpcyBpbiBteSBsb25nLXRlcm0gcGxhbnMuCitDdXJyZW50IHNoYXBlIGlzIG5vdCBpZGVhbCwgYnV0IGdvb2QgZW5vdWdoIHRvIHVzZS4KKworPWN1dAorCitwYWNrYWdlIHRvb2xzOworCit1c2Ugc3RyaWN0OwordXNlIHdhcm5pbmdzOworCit1c2UgdmFycyBxdyggQElTQSBARVhQT1JUIEBFWFBPUlRfT0sgJUVYUE9SVF9UQUdTICk7CityZXF1aXJlIEV4cG9ydGVyOworQElTQSA9IHF3KCBFeHBvcnRlciApOworCitteSBAdmFycyAgID0gcXcoICR0b29sICk7CitteSBAdXRpbHMgID0gcXcoIGNoZWNrX29wdHMgdmFsaWRhdGUgKTsKK215IEBvcHRzICAgPSBxdyggZ2V0X29wdGlvbnMgKTsKK215IEBwcmludCAgPSBxdyggZGVidWcgaW5mbyB3YXJuaW5nIGNtZGxpbmVfZXJyb3IgcnVudGltZV9lcnJvciBxdWVzdGlvbiApOworbXkgQG5hbWUgICA9IHF3KCBnZXRfdm9sIGdldF9kaXIgZ2V0X2ZpbGUgZ2V0X25hbWUgZ2V0X2V4dCBjYXRfZmlsZSBjYXRfZGlyICk7CitteSBAZmlsZSAgID0gcXcoIHdoaWNoIGFic19wYXRoIHJlbF9wYXRoIHJlYWxfcGF0aCBtYWtlX2RpciBjbGVhbl9kaXIgY29weV9kaXIgbW92ZV9kaXIgZGVsX2RpciBjaGFuZ2VfZGlyIGNvcHlfZmlsZSBtb3ZlX2ZpbGUgZGVsX2ZpbGUgKTsKK215IEBpbyAgICAgPSBxdyggcmVhZF9maWxlIHdyaXRlX2ZpbGUgKTsKK215IEBleGVjICAgPSBxdyggZXhlY3V0ZSBiYWNrdGlja3MgKTsKK215IEBzdHJpbmcgPSBxd3sgcGFkIH07CitARVhQT1JUID0gKCBAdXRpbHMsIEBvcHRzLCBAdmFycywgQHByaW50LCBAbmFtZSwgQGZpbGUsIEBpbywgQGV4ZWMsIEBzdHJpbmcgKTsKKwordXNlIFVOSVZFUlNBTCAgICAoKTsKKwordXNlIEZpbmRCaW47Cit1c2UgSU86OkhhbmRsZTsKK3VzZSBJTzo6RmlsZTsKK3VzZSBJTzo6RGlyOworIyBOb3QgYXZhaWxhYmxlIG9uIHNvbWUgbWFjaGluZXM6IHVzZSBJTzo6WmxpYjsKKwordXNlIEdldG9wdDo6TG9uZyAoKTsKK3VzZSBQb2Q6OlVzYWdlICAgKCk7Cit1c2UgQ2FycCAgICAgICAgICgpOwordXNlIEZpbGU6OkNvcHkgICAoKTsKK3VzZSBGaWxlOjpQYXRoICAgKCk7Cit1c2UgRmlsZTo6VGVtcCAgICgpOwordXNlIEZpbGU6OlNwZWMgICAoKTsKK3VzZSBQT1NJWCAgICAgICAgcXd7IDpmY250bF9oIDplcnJub19oIH07Cit1c2UgQ3dkICAgICAgICAgICgpOwordXNlIFN5bWJvbCAgICAgICAoKTsKKwordXNlIERhdGE6OkR1bXBlcjsKKwordXNlIHZhcnMgcXcoICR0b29sICR2ZXJib3NlICR0aW1lc3RhbXBzICk7CiskdG9vbCA9ICRGaW5kQmluOjpTY3JpcHQ7CisKK215IEB3YXJuaW5nID0gKCBzdWIge30sIFwmd2FybmluZywgXCZydW50aW1lX2Vycm9yICk7CisKKworc3ViIGNoZWNrX29wdHMoXCUkOyQpIHsKKworICAgIG15ICRvcHRzID0gc2hpZnQoIEBfICk7ICAjIFJlZmVyZW5zZSB0byBoYXNoIGNvbnRhaW5pbmcgcmVhbCBvcHRpb25zIGFuZCB0aGVpciB2YWx1ZXMuCisgICAgbXkgJGdvb2QgPSBzaGlmdCggQF8gKTsgICMgUmVmZXJlbmNlIHRvIGFuIGFycmF5IGNvbnRhaW5pbmcgYWxsIGtub3duIG9wdGlvbiBuYW1lcy4KKyAgICBteSAkbXNnICA9IHNoaWZ0KCBAXyApOyAgIyBPcHRpb25hbCAobm9uLW1hbmRhdG9yeSkgbWVzc2FnZS4KKworICAgIGlmICggbm90IGRlZmluZWQoICRtc2cgKSApIHsKKyAgICAgICAgJG1zZyA9ICJ1bmtub3duIG9wdGlvbihzKSBwYXNzZWQiOyAgICMgRGVmYXVsdCB2YWx1ZSBmb3IgJG1zZy4KKyAgICB9OyAjIGlmCisKKyAgICAjIEknbGwgdXNlIHRoZXNlIGhhc2hlcyBhcyBzZXRzIG9mIG9wdGlvbnMuCisgICAgbXkgJWdvb2QgPSBtYXAoICggJF8gPT4gMSApLCBAJGdvb2QgKTsgICAjICVnb29kIG5vdyBpcyBmaWxsZWQgd2l0aCBhbGwga25vd24gb3B0aW9ucy4KKyAgICBteSAlYmFkOyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgJWJhZCBpcyBlbXB0eS4KKworICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkb3B0cyApICkgeyAgICAgIyBGb3IgZWFjaCByZWFsIG9wdGlvbi4uLgorICAgICAgICBpZiAoIG5vdCBleGlzdHMoICRnb29keyAkb3B0IH0gKSApIHsgIyBMb29rIGl0cyBuYW1lIGluIHRoZSBzZXQgb2Yga25vd24gb3B0aW9ucy4uLgorICAgICAgICAgICAgJGJhZHsgJG9wdCB9ID0gMTsgICAgICAgICAgICAgICAgIyBBZGQgdW5rbm93biBvcHRpb24gdG8gJWJhZCBzZXQuCisgICAgICAgICAgICBkZWxldGUoICRvcHRzLT57ICRvcHQgfSApOyAgICAgICAjIEFuZCBkZWxldGUgb3JpZ2luYWwgb3B0aW9uLgorICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBmb3JlYWNoICRvcHQKKyAgICBpZiAoICViYWQgKSB7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICMgSWYgJWJhZCBzZXQgaXMgbm90IGVtcHR5Li4uCisgICAgICAgIG15IEBjYWxsZXIgPSBjYWxsZXIoIDEgKTsgICAgICAgICAgICAjIElzc3VlIGEgd2FybmluZy4KKyAgICAgICAgbG9jYWwgJENhcnA6OkNhcnBMZXZlbCA9IDI7CisgICAgICAgIENhcnA6OmNsdWNrKCAkY2FsbGVyWyAzIF0gLiAiOiAiIC4gJG1zZyAuICI6ICIgLiBqb2luKCAiLCAiLCBzb3J0KCBrZXlzKCAlYmFkICkgKSApICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuIDE7CisKK307ICMgc3ViIGNoZWNrX29wdHMKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisjIFB1cnBvc2U6CisjICAgICBDaGVjayBzdWJyb3V0aW5lIGFyZ3VtZW50cy4KKyMgU3lub3BzaXM6CisjICAgICBteSAlb3B0cyA9IHZhbGlkYXRlKCBwYXJhbXMgPT4gXEBfLCBzcGVjID0+IHsgLi4uIH0sIGNhbGxlciA9PiBuICk7CisjIEFyZ3VtZW50czoKKyMgICAgIHBhcmFtcyAtLSBBIHJlZmVyZW5jZSB0byBzdWJyb3V0aW5lJ3MgYWN0dWFsIGFyZ3VtZW50cy4KKyMgICAgIHNwZWMgICAtLSBTcGVjaWZpY2F0aW9uIG9mIGV4cGVjdGVkIGFyZ3VtZW50cy4KKyMgICAgIGNhbGxlciAtLSAuLi4KKyMgUmV0dXJuIHZhbHVlOgorIyAgICAgQSBoYXNoIG9mIHZhbGlkYXRlZCBvcHRpb25zLgorIyBEZXNjcmlwdGlvbjoKKyMgICAgIEkgd291bGQgbGlrZSB0byB1c2UgUGFyYW1zOjpWYWxpZGF0ZSBtb2R1bGUsIGJ1dCBpdCBpcyBub3QgYSBwYXJ0IG9mIGRlZmF1bHQgUGVybAorIyAgICAgZGlzdHJpYnV0aW9uLCBzbyBJIGNhbm5vdCByZWx5IG9uIGl0LiBUaGlzIHN1YnJvdXRpbmUgcmVzZW1ibGVzIHRvIHNvbWUgZXh0ZW50IHRvCisjICAgICBQYXJhbXM6OlZhbGlkYXRlOjp2YWxpZGF0ZV93aXRoKCkuCisjICAgICBTcGVjaWZpY2F0aW9uIG9mIGV4cGVjdGVkIGFyZ3VtZW50czoKKyMgICAgICAgIHsgJG9wdCA9PiB7IHR5cGUgPT4gJHR5cGUsIGRlZmF1bHQgPT4gJGRlZmF1bHQgfSwgLi4uIH0KKyMgICAgICAgICRvcHQgICAgIC0tIFN0cmluZywgb3B0aW9uIG5hbWUuCisjICAgICAgICAkdHlwZSAgICAtLSBTdHJpbmcsIGV4cGVjdGVkIHR5cGUocykuIEFsbG93ZWQgdmFsdWVzIGFyZSAiU0NBTEFSIiwgIlVOREVGIiwgIkJPT0xFQU4iLAorIyAgICAgICAgICAgICAgICAgICAgIkFSUkFZUkVGIiwgIkhBU0hSRUYiLCAiQ09ERVJFRiIuIE11bHRpcGxlIHR5cGVzIG1heSBsaXN0ZWQgdXNpbmcgYmFyOgorIyAgICAgICAgICAgICAgICAgICAgIlNDQUxBUnxBUlJBWVJFRiIuIFRoZSB0eXBlIHN0cmluZyBpcyBjYXNlLWluc2Vuc2l0aXZlLgorIyAgICAgICAgJGRlZmF1bHQgLS0gRGVmYXVsdCB2YWx1ZSBmb3IgYW4gb3B0aW9uLiBXaWxsIGJlIHVzZWQgaWYgb3B0aW9uIGlzIG5vdCBzcGVjaWZpZWQgb3IKKyMgICAgICAgICAgICAgICAgICAgIHVuZGVmaW5lZC4KKyMKK3N1YiB2YWxpZGF0ZShAKSB7CisKKyAgICBteSAlb3B0cyA9IEBfOyAgICAjIFRlbXBvcmFyeSB1c2UgJW9wdHMgZm9yIHBhcmFtZXRlcnMgb2YgYHZhbGlkYXRlJyBzdWJyb3V0aW5lLgorICAgIG15ICRwYXJhbXMgPSAkb3B0c3sgcGFyYW1zIH07CisgICAgbXkgJGNhbGxlciA9ICggJG9wdHN7IGNhbGxlciB9IG9yIDAgKSArIDE7CisgICAgbXkgJHNwZWMgICA9ICRvcHRzeyBzcGVjIH07CisgICAgdW5kZWYoICVvcHRzICk7ICAgIyBPaywgQ2xlYW4gJW9wdHMsIG5vdyB3ZSB3aWxsIGNvbGxlY3QgcmVzdWx0IG9mIHRoZSBzdWJyb3V0aW5lLgorCisgICAgIyBGaW5kIG91dCBjYWxsZXIgcGFja2FnZSwgZmlsZW5hbWUsIGxpbmUsIGFuZCBzdWJyb3V0aW5lIG5hbWUuCisgICAgbXkgKCAkcGtnLCAkZmlsZSwgJGxpbmUsICRzdWJyICkgPSBjYWxsZXIoICRjYWxsZXIgKTsKKyAgICBteSBAZXJyb3JzOyAgICAjIFdlIHdpbGwgY29sbGVjdCBlcnJvcnMgaW4gYXJyYXkgbm90IHRvIHN0b3Agb24gdGhlIGZpcnN0IGZvdW5kIGVycm9yLgorICAgIG15ICRlcnJvciA9CisgICAgICAgIHN1YiAoJCkgeworICAgICAgICAgICAgbXkgJG1zZyA9IHNoaWZ0KCBAXyApOworICAgICAgICAgICAgcHVzaCggQGVycm9ycywgIiRtc2cgYXQgJGZpbGUgbGluZSAkbGluZS5cbiIgKTsKKyAgICAgICAgfTsgIyBzdWIKKworICAgICMgQ2hlY2sgb3B0aW9ucy4KKyAgICB3aGlsZSAoIEAkcGFyYW1zICkgeworICAgICAgICAjIENoZWNrIG9wdGlvbiBuYW1lLgorICAgICAgICBteSAkb3B0ID0gc2hpZnQoIEAkcGFyYW1zICk7CisgICAgICAgIGlmICggbm90IGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9ICkgKSB7CisgICAgICAgICAgICAkZXJyb3ItPiggIkludmFsaWQgb3B0aW9uIGAkb3B0JyIgKTsKKyAgICAgICAgICAgIHNoaWZ0KCBAJHBhcmFtcyApOyAjIFNraXAgdmFsdWUgb2YgdW5rbm93IG9wdGlvbi4KKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBDaGVjayBvcHRpb24gdmFsdWUgZXhpc3RzLgorICAgICAgICBpZiAoIG5vdCBAJHBhcmFtcyApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAiT3B0aW9uIGAkb3B0JyBkb2VzIG5vdCBoYXZlIGEgdmFsdWUiICk7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgIG15ICR2YWwgPSBzaGlmdCggQCRwYXJhbXMgKTsKKyAgICAgICAgIyBDaGVjayBvcHRpb24gdmFsdWUgdHlwZS4KKyAgICAgICAgaWYgKCBleGlzdHMoICRzcGVjLT57ICRvcHQgfS0+eyB0eXBlIH0gKSApIHsKKyAgICAgICAgICAgICMgVHlwZSBzcGVjaWZpY2F0aW9uIGV4aXN0cy4gQ2hlY2sgb3B0aW9uIHZhbHVlIHR5cGUuCisgICAgICAgICAgICBteSAkYWN0dWFsX3R5cGU7CisgICAgICAgICAgICBpZiAoIHJlZiggJHZhbCApIG5lICIiICkgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9IHJlZiggJHZhbCApIC4gIlJFRiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgICRhY3R1YWxfdHlwZSA9ICggZGVmaW5lZCggJHZhbCApID8gIlNDQUxBUiIgOiAiVU5ERUYiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBteSBAd2FudGVkX3R5cGVzID0gc3BsaXQoIG17XHx9LCBsYyggJHNwZWMtPnsgJG9wdCB9LT57IHR5cGUgfSApICk7CisgICAgICAgICAgICBteSAkd2FudGVkX3R5cGVzID0gam9pbiggInwiLCBtYXAoICRfIGVxICJib29sZWFuIiA/ICJzY2FsYXJ8dW5kZWYiIDogcXVvdGVtZXRhKCAkXyApLCBAd2FudGVkX3R5cGVzICkgKTsKKyAgICAgICAgICAgIGlmICggJGFjdHVhbF90eXBlICF+IG17XEEoPzokd2FudGVkX3R5cGVzKVx6fWkgKSB7CisgICAgICAgICAgICAgICAgJGFjdHVhbF90eXBlID0gbGMoICRhY3R1YWxfdHlwZSApOworICAgICAgICAgICAgICAgICR3YW50ZWRfdHlwZXMgPSBsYyggam9pbiggIiBvciAiLCBtYXAoICJgJF8nIiwgQHdhbnRlZF90eXBlcyApICkgKTsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgdmFsdWUgdHlwZSBpcyBgJGFjdHVhbF90eXBlJyBidXQgZXhwZWN0ZWQgdG8gYmUgJHdhbnRlZF90eXBlcyIgKTsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggZXhpc3RzKCAkc3BlYy0+eyAkb3B0IH0tPnsgdmFsdWVzIH0gKSAgKSB7CisgICAgICAgICAgICBteSAkdmFsdWVzID0gJHNwZWMtPnsgJG9wdCB9LT57IHZhbHVlcyB9OworICAgICAgICAgICAgaWYgKCBub3QgZ3JlcCggJF8gZXEgJHZhbCwgQCR2YWx1ZXMgKSApIHsKKyAgICAgICAgICAgICAgICAkdmFsdWVzID0gam9pbiggIiwgIiwgbWFwKCAiYCRfJyIsIEAkdmFsdWVzICkgKTsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggIk9wdGlvbiBgJG9wdCcgdmFsdWUgaXMgYCR2YWwnIGJ1dCBleHBlY3RlZCB0byBiZSBvbmUgb2YgJHZhbHVlcyIgKTsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgICRvcHRzeyAkb3B0IH0gPSAkdmFsOworICAgIH07ICMgd2hpbGUKKworICAgICMgQXNzaWduIGRlZmF1bHQgdmFsdWVzLgorICAgIGZvcmVhY2ggbXkgJG9wdCAoIGtleXMoICUkc3BlYyApICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3B0c3sgJG9wdCB9ICkgYW5kIGV4aXN0cyggJHNwZWMtPnsgJG9wdCB9LT57IGRlZmF1bHQgfSApICkgeworICAgICAgICAgICAgJG9wdHN7ICRvcHQgfSA9ICRzcGVjLT57ICRvcHQgfS0+eyBkZWZhdWx0IH07CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJG9wdAorCisgICAgIyBJZiB3ZSBmb3VuZCBhbnkgZXJyb3JzLCByYWlzZSB0aGVtLgorICAgIGlmICggQGVycm9ycyApIHsKKyAgICAgICAgZGllIGpvaW4oICIiLCBAZXJyb3JzICk7CisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICVvcHRzOworCit9OyAjIHN1YiB2YWxpZGF0ZQorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgR2V0IG9wdGlvbiBoZWxwZXJzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1oZWFkMiBHZXQgb3B0aW9uIGhlbHBlcnMuCisKKz1jdXQKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBnZXRfb3B0aW9ucworCitCPFN5bm9wc2lzOj4KKworICAgIGdldF9vcHRpb25zKCBAYXJndW1lbnRzICkKKworQjxEZXNjcmlwdGlvbjo+CisKK0l0IGlzIHZlcnkgc2ltcGxlIHdyYXBwZXIgYXJvdW5mIEdldG9wdDo6TG9uZzo6R2V0T3B0aW9ucy4gSXQgcGFzc2VzIGFsbCBhcmd1bWVudHMgdG8gR2V0T3B0aW9ucywKK2FuZCBhZGQgZGVmaW5pdGlvbnMgZm9yIHN0YW5kYXJkIGhlbHAgb3B0aW9uczogLS1oZWxwLCAtLWRvYywgLS12ZXJib3NlLCBhbmQgLS1xdWlldC4KK1doZW4gR2V0T3B0aW9ucyBmaW5paGVzLCB0aGlzIHN1YnJvdXRpbmUgY2hlY2tzIGV4aXQgY29kZSwgaWYgaXQgaXMgbm9uLXplcm8sIHN0YW5kYXJkIGVycm9yCittZXNzYWdlIGlzIGlzc3VlZCBhbmQgc2NyaXB0IHRlcm1pbmF0ZWQuCisKK0lmIC0tdmVyYm9zZSBvciAtLXF1aWV0IG9wdGlvbiBpcyBzcGVjaWZpZWQsIEM8dG9vbHMucG1fdmVyYm9zZT4gZW52aXJvbm1lbnQgdmFyaWFibGUgaXMgc2V0LgorSXQgaXMgdGhlIHdheSB0byBwcm9wYWdhdGUgdmVyYm9zZS9xdWlldCBtb2RlIHRvIGNhbGxlZSBQZXJsIHNjcmlwdHMuCisKKz1jdXQKKworc3ViIGdldF9vcHRpb25zIHsKKworICAgIEdldG9wdDo6TG9uZzo6Q29uZmlndXJlKCAibm9faWdub3JlX2Nhc2UiICk7CisgICAgR2V0b3B0OjpMb25nOjpHZXRPcHRpb25zKAorICAgICAgICAiaDB8dXNhZ2UiICAgICAgICA9PiBzdWIgeyBQb2Q6OlVzYWdlOjpwb2QydXNhZ2UoIC1leGl0dmFsID0+IDAsIC12ZXJib3NlID0+IDAgKTsgfSwKKyAgICAgICAgImgxfGh8aGVscCIgICAgICAgPT4gc3ViIHsgUG9kOjpVc2FnZTo6cG9kMnVzYWdlKCAtZXhpdHZhbCA9PiAwLCAtdmVyYm9zZSA9PiAxICk7IH0sCisgICAgICAgICJoMnxkb2N8bWFudWFsIiAgID0+IHN1YiB7IFBvZDo6VXNhZ2U6OnBvZDJ1c2FnZSggLWV4aXR2YWwgPT4gMCwgLXZlcmJvc2UgPT4gMiApOyB9LAorICAgICAgICAidmVyc2lvbiIgICAgICAgICA9PiBzdWIgeyBwcmludCggIiR0b29sIHZlcnNpb24gJG1haW46OlZFUlNJT05cbiIgKTsgZXhpdCggMCApOyB9LAorICAgICAgICAidnx2ZXJib3NlIiAgICAgICA9PiBzdWIgeyArKyAkdmVyYm9zZTsgICAgICRFTlZ7ICJ0b29scy5wbV92ZXJib3NlIiAgICB9ID0gJHZlcmJvc2U7ICAgIH0sCisgICAgICAgICJxdWlldCIgICAgICAgICAgID0+IHN1YiB7IC0tICR2ZXJib3NlOyAgICAgJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiICAgIH0gPSAkdmVyYm9zZTsgICAgfSwKKyAgICAgICAgIndpdGgtdGltZXN0YW1wcyIgPT4gc3ViIHsgJHRpbWVzdGFtcHMgPSAxOyAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSA9ICR0aW1lc3RhbXBzOyB9LAorICAgICAgICBAXywgIyBDYWxsZXIgYXJndW1ldHNhIGFyZSBhdCB0aGUgZW5kIHNvIGNhbGxlciBvcHRpb25zIG92ZXJyaWRlcyBzdGFuZGFyZC4KKyAgICApIG9yIGNtZGxpbmVfZXJyb3IoKTsKKworfTsgIyBzdWIgZ2V0X29wdGlvbnMKKworCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgUHJpbnQgdXRpbGl0aWVzLgorIyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKz1wb2QKKworPWhlYWQyIFByaW50IHV0aWxpdGllcy4KKworRWFjaCBvZiB0aGUgcHJpbnQgc3Vicm91dGluZXMgcHJlcGVuZHMgZWFjaCBsaW5lIG9mIGl0cyBvdXRwdXQgd2l0aCB0aGUgbmFtZSBvZiBjdXJyZW50IHNjcmlwdCBhbmQKK3RoZSB0eXBlIG9mIGluZm9ybWF0aW9uLCBmb3IgZXhhbXBsZToKKworICAgIGluZm8oICJXcml0aW5nIGZpbGUuLi4iICk7CisKK3dpbGwgcHJpbnQKKworICAgIDxzY3JpcHQ+OiAoaSk6IFdyaXRpbmcgZmlsZS4uLgorCit3aGlsZQorCisgICAgd2FybmluZyggIkZpbGUgZG9lcyBub3QgZXhpc3QhIiApOworCit3aWxsIHByaW50CisKKyAgICA8c2NyaXB0PjogKCEpOiBGaWxlIGRvZXMgbm90IGV4aXN0IQorCitIZXJlIGFyZSBleHBvcnRlZCBpdGVtczoKKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIF9mb3JtYXRfbWVzc2FnZSgkXEA7JCkgeworCisgICAgbXkgJHByZWZpeCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYXJncyAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRub19lb2wgID0gc2hpZnQoIEBfICk7ICAjIERvIG5vdCBhcHBlbmQgIlxuIiB0byB0aGUgbGFzdCBsaW5lLgorICAgIG15ICRtZXNzYWdlID0gIiI7CisKKyAgICBteSAkdHMgPSAiIjsKKyAgICBpZiAoICR0aW1lc3RhbXBzICkgeworICAgICAgICBteSAoICRzZWMsICRtaW4sICRob3VyLCAkZGF5LCAkbW9udGgsICR5ZWFyICkgPSBnbXRpbWUoKTsKKyAgICAgICAgJG1vbnRoICs9IDE7CisgICAgICAgICR5ZWFyICArPSAxOTAwOworICAgICAgICAkdHMgPSBzcHJpbnRmKCAiJTA0ZC0lMDJkLSUwMmQgJTAyZDolMDJkOiUwMmQgVVRDOiAiLCAkeWVhciwgJG1vbnRoLCAkZGF5LCAkaG91ciwgJG1pbiwgJHNlYyApOworICAgIH07ICMgaWYKKyAgICBmb3IgbXkgJGkgKCAxIC4uIEAkYXJncyApIHsKKyAgICAgICAgbXkgQGxpbmVzID0gc3BsaXQoICJcbiIsICRhcmdzLT5bICRpIC0gMSBdICk7CisgICAgICAgIGZvciBteSAkaiAoIDEgLi4gQGxpbmVzICkgeworICAgICAgICAgICAgbXkgJGxpbmUgPSAkbGluZXNbICRqIC0gMSBdOworICAgICAgICAgICAgbXkgJGxhc3RfbGluZSA9ICggKCAkaSA9PSBAJGFyZ3MgKSBhbmQgKCAkaiA9PSBAbGluZXMgKSApOworICAgICAgICAgICAgbXkgJGVvbCA9ICggKCBzdWJzdHIoICRsaW5lLCAtMSApIGVxICJcbiIgKSBvciBkZWZpbmVkKCAkbm9fZW9sICkgPyAiIiA6ICJcbiIgKTsKKyAgICAgICAgICAgICRtZXNzYWdlIC49ICIkdHMkdG9vbDogKCRwcmVmaXgpICIgLiAkbGluZSAuICRlb2w7CisgICAgICAgIH07ICMgZm9yZWFjaCAkagorICAgIH07ICMgZm9yZWFjaCAkaQorICAgIHJldHVybiAkbWVzc2FnZTsKKworfTsgIyBzdWIgX2Zvcm1hdF9tZXNzYWdlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyAkdmVyYm9zZQorCitCPFN5bm9wc2lzOj4KKworICAgICR2ZXJib3NlCisKK0I8RGVzY3JpcHRpb246PgorCitQYWNrYWdlIHZhcmlhYmxlLiBJdCBkZXRlcm1pbmVzIHZlcmJvc2l0eSBsZXZlbCwgd2hpY2ggYWZmZWN0cyBDPHdhcm5pbmcoKT4sIEM8aW5mbygpPiwgYW5kCitDPGRlYnVnKCk+IHN1YnJvdXRuZXMgLgorCitUaGUgdmFyaWFibGUgZ2V0cyBpbml0aWFsIHZhbHVlIGZyb20gQzx0b29scy5wbV92ZXJib3NlPiBlbnZpcm9ubWVudCB2YXJpYWJsZSBpZiBpdCBpcyBleGlzdHMuCitJZiB0aGUgZW52aXJvbm1lbnQgdmFyaWFibGUgZG9lcyBub3QgZXhpc3QsIHZhcmlhYmxlIGlzIHNldCB0byAyLgorCitJbml0aWFsIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyIGRpcmVjdGx5IG9yIGJ5IEM8Z2V0X29wdGlvbnM+IGZ1bmN0aW9uLgorCis9Y3V0CisKKyR2ZXJib3NlID0gZXhpc3RzKCAkRU5WeyAidG9vbHMucG1fdmVyYm9zZSIgfSApID8gJEVOVnsgInRvb2xzLnBtX3ZlcmJvc2UiIH0gOiAyOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgJHRpbWVzdGFtcHMKKworQjxTeW5vcHNpczo+CisKKyAgICAkdGltZXN0YW1wcworCitCPERlc2NyaXB0aW9uOj4KKworUGFja2FnZSB2YXJpYWJsZS4gSXQgZGV0ZXJtaW5lcyB3aGV0aGVyIEM8ZGVidWcoKT4sIEM8aW5mbygpPiwgQzx3YXJuaW5nKCk+LCBDPHJ1bnRpbWVfZXJyb3IoKT4KK3N1YnJvdXRuZXMgcHJpbnQgdGltZXN0YW1wcyBvciBub3QuCisKK1RoZSB2YXJpYWJsZSBnZXRzIGluaXRpYWwgdmFsdWUgZnJvbSBDPHRvb2xzLnBtX3RpbWVzdGFtcHM+IGVudmlyb25tZW50IHZhcmlhYmxlIGlmIGl0IGlzIGV4aXN0cy4KK0lmIHRoZSBlbnZpcm9ubWVudCB2YXJpYWJsZSBkb2VzIG5vdCBleGlzdCwgdmFyaWFibGUgaXMgc2V0IHRvIGZhbHNlLgorCitJbml0aWFsIHZhbHVlIG1heSBiZSBvdmVycmlkZGVuIGxhdGVyIGRpcmVjdGx5IG9yIGJ5IEM8Z2V0X29wdGlvbnMoKT4gZnVuY3Rpb24uCisKKz1jdXQKKworJHRpbWVzdGFtcHMgPSBleGlzdHMoICRFTlZ7ICJ0b29scy5wbV90aW1lc3RhbXBzIiB9ICkgPyAkRU5WeyAidG9vbHMucG1fdGltZXN0YW1wcyIgfSA6IDA7CisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9cG9kCisKKz1oZWFkMyBkZWJ1ZworCitCPFN5bm9wc2lzOj4KKworICAgIGRlYnVnKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDMgb3IgaGlnaGVyLCBwcmludCBkZWJ1ZyBpbmZvcm1hdGlvbiB0byB0aGUgc3RkZXJyLCBwcmVwZW5kaW5nIGl0IHdpdGggIigjKSIKK3ByZWZpeC4KKworPWN1dAorCitzdWIgZGVidWcoQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAzICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggIiMiLCBAXyApICk7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAxOworCit9OyAjIHN1YiBkZWJ1ZworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPXBvZAorCis9aGVhZDMgaW5mbworCitCPFN5bm9wc2lzOj4KKworICAgIGluZm8oIEBtZXNzYWdlcyApCisKK0I8RGVzY3JpcHRpb246PgorCitJZiB2ZXJib3NpdHkgbGV2ZWwgaXMgMiBvciBoaWdoZXIsIHByaW50IGluZm9ybWF0aW9uIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAiKGkpIiBwcmVmaXguCisKKz1jdXQKKworc3ViIGluZm8oQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAyICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggImkiLCBAXyAgKSApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgaW5mbworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIHdhcm5pbmcKKworQjxTeW5vcHNpczo+CisKKyAgICB3YXJuaW5nKCBAbWVzc2FnZXMgKQorCitCPERlc2NyaXB0aW9uOj4KKworSWYgdmVyYm9zaXR5IGxldmVsIGlzIDEgb3IgaGlnaGVyLCBpc3N1ZSBhIHdhcm5pbmcsIHByZXBlbmRpbmcgaXQgd2l0aCAiKCEpIiBwcmVmaXguCisKKz1jdXQKKworc3ViIHdhcm5pbmcoQCkgeworCisgICAgaWYgKCAkdmVyYm9zZSA+PSAxICkgeworICAgICAgICBTVERPVVQtPmZsdXNoKCk7CisgICAgICAgIHdhcm4oIF9mb3JtYXRfbWVzc2FnZSggIiEiLCBAXyAgKSApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgd2FybmluZworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWhlYWQzIGNtZGxpbmVfZXJyb3IKKworQjxTeW5vcHNpczo+CisKKyAgICBjbWRsaW5lX2Vycm9yKCBAbWVzc2FnZSApCisKK0I8RGVzY3JpcHRpb246PgorCitQcmludCBlcnJvciBtZXNzYWdlIGFuZCBleGl0IHRoZSBwcm9ncmFtIHdpdGggc3RhdHVzIDIuCisKK1RoaXMgZnVuY3Rpb24gaXMgaW50ZW5kZWQgdG8gY29tcGxhaW4gb24gY29tbWFuZCBsaW5lIGVycm9ycywgZS4gZy4gdW5rbm93bgorb3B0aW9ucywgaW52YWxpZCBhcmd1bWVudHMsIGV0Yy4KKworPWN1dAorCitzdWIgY21kbGluZV9lcnJvcig7JCkgeworCisgICAgbXkgJG1lc3NhZ2UgPSBzaGlmdCggQF8gKTsKKworICAgIGlmICggZGVmaW5lZCggJG1lc3NhZ2UgKSApIHsKKyAgICAgICAgaWYgKCBzdWJzdHIoICRtZXNzYWdlLCAtMSwgMSApIG5lICJcbiIgKSB7CisgICAgICAgICAgICAkbWVzc2FnZSAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgJG1lc3NhZ2UgPSAiIjsKKyAgICB9OyAjIGlmCisgICAgU1RET1VULT5mbHVzaCgpOworICAgIGRpZSAkbWVzc2FnZSAuICJUcnkgLS1oZWxwIG9wdGlvbiBmb3IgbW9yZSBpbmZvcm1hdGlvbi5cbiI7CisKK307ICMgc3ViIGNtZGxpbmVfZXJyb3IKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBydW50aW1lX2Vycm9yCisKK0I8U3lub3BzaXM6PgorCisgICAgcnVudGltZV9lcnJvciggQG1lc3NhZ2UgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgdGhlIHByb2dyYW0gd2l0aCBzdGF0dXMgMy4KKworVGhpcyBmdW5jdGlvbiBpcyBpbnRlbmRlZCB0byBjb21wbGFpbiBvbiBydW50aW1lIGVycm9ycywgZS4gZy4KK2RpcmVjdG9yaWVzIHdoaWNoIGFyZSBub3QgZm91bmQsIG5vbi13cml0YWJsZSBmaWxlcywgZXRjLgorCis9Y3V0CisKK3N1YiBydW50aW1lX2Vycm9yKEApIHsKKworICAgIFNURE9VVC0+Zmx1c2goKTsKKyAgICBkaWUgX2Zvcm1hdF9tZXNzYWdlKCAieCIsIEBfICk7CisKK307ICMgc3ViIHJ1bnRpbWVfZXJyb3IKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyBxdWVzdGlvbgorCitCPFN5bm9wc2lzOj4KKworICAgIHF1ZXN0aW9uKCAkcHJvbXB0OyAkYW5zd2VyLCAkY2hvaWNlcyAgKQorCitCPERlc2NyaXB0aW9uOj4KKworUHJpbnQgJHByb21wIHRvIHRoZSBzdGRlcnIsIHByZXBlbmRpbmcgaXQgd2l0aCAicXVlc3Rpb246IiBwcmVmaXguIFJlYWQgYSBsaW5lIGZyb20gc3RkaW4sIGNob3AKKyJcbiIgZnJvbSB0aGUgZW5kLCBpdCBpcyBhbnN3ZXIuCisKK0lmICRhbnN3ZXIgaXMgZGVmaW5lZCwgaXQgaXMgdHJlYXRlZCBhcyBmaXJzdCB1c2VyIGlucHV0LgorCitJZiAkY2hvaWNlcyBpcyBzcGVjaWZpZWQsIGl0IGNvdWxkIGJlIGEgcmVnZXhwIGZvciB2YWxpZGF0aW5nIHVzZXIgaW5wdXQsIG9yIGEgc3RyaW5nLiBJbiBsYXR0ZXIKK2Nhc2UgaXQgaW50ZXJwcmV0ZWQgYXMgbGlzdCBvZiBjaGFyYWN0ZXJzLCBhY2NlcHRhYmxlIChjYXNlLWluc2Vuc2l0aXZlKSBjaG9pY2VzLiBJZiB1c2VyIGVudGVycworbm9uLWFjY2VwdGFibGUgYW5zd2VyLCBxdWVzdGlvbiBjb250aW51ZSBhc2tpbmcgdW50aWwgYW5zd2VyIGlzIGFjY2VwdGFibGUuCitJZiAkY2hvaWNlcyBpcyBub3Qgc3BlY2lmaWVkLCBhbnkgYW5zd2VyIGlzIGFjY2VwdGFibGUuCisKK0luIGNhc2Ugb2YgZW5kLW9mLWZpbGUgKG9yIEN0cmwrRCBwcmVzc2VkIGJ5IHVzZXIpLCAkYW5zd2VyIGlzIEM8dW5kZWY+LgorCitCPEV4YW1wbGVzOj4KKworICAgIG15ICRhbnN3ZXI7CisgICAgcXVlc3Rpb24oICJTYXZlIGZpbGUgW3luXT8gIiwgJGFuc3dlciwgInluIiApOworICAgICAgICAjIFdlIGFjY2VwdHMgb25seSAieSIsICJZIiwgIm4iLCBvciAiTiIuCisgICAgcXVlc3Rpb24oICJQcmVzcyBlbnRlciB0byBjb250aW51ZSBvciBDdHJsK0MgdG8gYWJvcnQuLi4iICk7CisgICAgICAgICMgV2UgYXJlIG5vdCBpbnRlcmVzdGVkIGluIGFuc3dlciB2YWx1ZSAtLSBpbiBjYXNlIG9mIEN0cmwrQyB0aGUgc2NyaXB0IHdpbGwgYmUgdGVybWluYXRlZCwKKyAgICAgICAgIyBvdGhlcndpc2Ugd2UgY29udGludWUgZXhlY3V0aW9uLgorICAgIHF1ZXN0aW9uKCAiRmlsZSBuYW1lPyAiLCAkYW5zd2VyICk7CisgICAgICAgICMgQW55IGFuc3dlciBpcyBhY2NlcHRhYmxlLgorCis9Y3V0CisKK3N1YiBxdWVzdGlvbigkO1wkJCkgeworCisgICAgbXkgJHByb21wdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkYW5zd2VyICA9IHNoaWZ0KCBAXyApOworICAgIG15ICRjaG9pY2VzID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGEgICAgICAgPSAoIGRlZmluZWQoICRhbnN3ZXIgKSA/ICQkYW5zd2VyIDogdW5kZWYgKTsKKworICAgIGlmICggcmVmKCAkY2hvaWNlcyApIGVxICJSZWdleHAiICkgeworICAgICAgICAjIEl0IGlzIGFscmVhZHkgYSByZWd1bGFyIGV4cHJlc3Npb24sIGRvIG5vdGhpbmcuCisgICAgfSBlbHNpZiAoIGRlZmluZWQoICRjaG9pY2VzICkgKSB7CisgICAgICAgICMgQ29udmVydCBzdHJpbmcgdG8gYSByZWd1bGFyIGV4cHJlc3Npb24uCisgICAgICAgICRjaG9pY2VzID0gcXIvW0B7IFsgcXVvdGVtZXRhKCAkY2hvaWNlcyApIF0gfV0vaTsKKyAgICB9OyAjIGlmCisKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIFNUREVSUi0+cHJpbnQoIF9mb3JtYXRfbWVzc2FnZSggIj8iLCBAeyBbICRwcm9tcHQgXSB9LCAibm9fZW9sIiApICk7CisgICAgICAgIFNUREVSUi0+Zmx1c2goKTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkYSApICkgeworICAgICAgICAgICAgU1RET1VULT5wcmludCggJGEgLiAiXG4iICk7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkYSA9IDxTVERJTj47CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGEgKSApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgY2hvbXAoICRhICk7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRjaG9pY2VzICkgb3IgKCAkYSA9fiBtL14kY2hvaWNlcyQvICkgKSB7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICRhID0gdW5kZWY7CisgICAgfTsgIyBmb3JldmVyCisgICAgaWYgKCBkZWZpbmVkKCAkYW5zd2VyICkgKSB7CisgICAgICAgICQkYW5zd2VyID0gJGE7CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiBxdWVzdGlvbgorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworIyBSZXR1cm5zIHZvbHVtZSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X3ZvbCgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggJHZvbCwgdW5kZWYsIHVuZGVmICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgcmV0dXJuICR2b2w7CisKK307ICMgc3ViIGdldF92b2wKKworIyBSZXR1cm5zIGRpcmVjdG9yeSBwYXJ0IG9mIHBhdGguCitzdWIgZ2V0X2RpcigkKSB7CisKKyAgICBteSAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhbm9ucGF0aCggc2hpZnQoIEBfICkgKTsKKyAgICBteSAoICR2b2wsICRkaXIsIHVuZGVmICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgbXkgQGRpcnMgPSBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpciApOworICAgIHBvcCggQGRpcnMgKTsKKyAgICAkZGlyID0gRmlsZTo6U3BlYy0+Y2F0ZGlyKCBAZGlycyApOworICAgICRkaXIgPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlyLCB1bmRlZiApOworICAgIHJldHVybiAkZGlyOworCit9OyAjIHN1YiBnZXRfZGlyCisKKyMgUmV0dXJucyBmaWxlIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZmlsZSgkKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICggdW5kZWYsIHVuZGVmLCAkZmlsZSApID0gRmlsZTo6U3BlYy0+c3BsaXRwYXRoKCAkcGF0aCApOworICAgIHJldHVybiAkZmlsZTsKKworfTsgIyBzdWIgZ2V0X2ZpbGUKKworIyBSZXR1cm5zIGZpbGUgcGFydCBvZiBwYXRoIHdpdGhvdXQgbGFzdCBzdWZmaXguCitzdWIgZ2V0X25hbWUoJCkgeworCisgICAgbXkgJHBhdGggPSBzaGlmdCggQF8gKTsKKyAgICBteSAoIHVuZGVmLCB1bmRlZiwgJGZpbGUgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGggKTsKKyAgICAkZmlsZSA9fiBze1wuW14uXSpcen17fTsKKyAgICByZXR1cm4gJGZpbGU7CisKK307ICMgc3ViIGdldF9uYW1lCisKKyMgUmV0dXJucyBsYXN0IHN1ZmZpeCBvZiBmaWxlIHBhcnQgb2YgcGF0aC4KK3N1YiBnZXRfZXh0KCQpIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgKCB1bmRlZiwgdW5kZWYsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgbXkgJGV4dCA9ICIiOworICAgIGlmICggJGZpbGUgPX4gbXsoXC5bXi5dKilcen0gKSB7CisgICAgICAgICRleHQgPSAkMTsKKyAgICB9OyAjIGlmCisgICAgcmV0dXJuICRleHQ7CisKK307ICMgc3ViIGdldF9leHQKKworc3ViIGNhdF9maWxlKEApIHsKKworICAgIG15ICRwYXRoID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGZpbGUgPSBwb3AoIEBfICk7CisgICAgbXkgQGRpcnMgPSBAXzsKKworICAgIG15ICggJHZvbCwgJGRpcnMgKSA9IEZpbGU6OlNwZWMtPnNwbGl0cGF0aCggJHBhdGgsICJub19maWxlIiApOworICAgIEBkaXJzID0gKCBGaWxlOjpTcGVjLT5zcGxpdGRpciggJGRpcnMgKSwgQGRpcnMgKTsKKyAgICAkZGlycyA9IEZpbGU6OlNwZWMtPmNhdGRpciggQGRpcnMgKTsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXJzLCAkZmlsZSApOworCisgICAgcmV0dXJuICRwYXRoOworCit9OyAjIHN1YiBjYXRfZmlsZQorCitzdWIgY2F0X2RpcihAKSB7CisKKyAgICBteSAkcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15IEBkaXJzID0gQF87CisKKyAgICBteSAoICR2b2wsICRkaXJzICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoLCAibm9fZmlsZSIgKTsKKyAgICBAZGlycyA9ICggRmlsZTo6U3BlYy0+c3BsaXRkaXIoICRkaXJzICksIEBkaXJzICk7CisgICAgJGRpcnMgPSBGaWxlOjpTcGVjLT5jYXRkaXIoIEBkaXJzICk7CisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRwYXRoKCAkdm9sLCAkZGlycywgIiIgKTsKKworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgY2F0X2RpcgorCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKyMgRmlsZSBhbmQgZGlyZWN0b3J5IG1hbmlwdWxhdGlvbiBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRmlsZSBhbmQgZGlyZWN0b3J5IG1hbmlwdWxhdGlvbiBzdWJyb3V0aW5lcy4KKworPW92ZXIKKworPWN1dAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzx3aGljaCggJGZpbGUsIEBvcHRpb25zICk+CisKK1NlYXJjaGVzIGZvciBzcGVjaWZpZWQgZXhlY3V0YWJsZSBmaWxlIGluIHRoZSAoc3BlY2lmaWVkKSBkaXJlY3Rvcmllcy4KK1JhaXNlcyBhIHJ1bnRpbWUgZXJvcm9yIGlmIG5vIGV4ZWN1dGFibGUgZmlsZSBmb3VuZC4gUmV0dXJucyBhIGZ1bGwgcGF0aCBvZiBmb3VuZCBleGVjdXRhYmxlKHMpLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1hbGw+ID1FPGd0PiBJPGJvb2w+CisKK0RvIG5vdCBzdG9wIG9uIHRoZSBmaXJzdCBmb3VuZCBmaWxlLiBOb3RlLCB0aGF0IGxpc3Qgb2YgZnVsbCBwYXRocyBpcyByZXR1cm5lZCBpbiB0aGlzIGNhc2UuCisKKz1pdGVtIEM8LWRpcnM+ID1FPGd0PiBJPHJlZl90b19hcnJheT4KKworU3BlY2lmeSBkaXJlY3RvcnkgbGlzdCB0byBzZWFyY2ggdGhyb3VnaC4gSWYgb3B0aW9uIGlzIG5vdCBwYXNzZWQsIFBBVEggZW52aXJvbm1lbnQgdmFyaWFibGUKK2lzIHVzZWQgZm9yIGRpcmVjdG9yeSBsaXN0LgorCis9aXRlbSBDPC1leGVjPiA9RTxndD4gSTxib29sPgorCitXaGV0aGVyIGNoZWNrIGZvciBleGVjdXRhYmxlIGZpbGVzIG9yIG5vdC4gQnkgZGVmYXVsdCwgQzx3aGljaD4gc2VhcmNoZXMgZXhlY3V0YWJsZSBmaWxlcy4KK0hvd2V2ZXIsIG9uIEN5Z3dpbiBleGVjdXRhYmxlIGNoZWNrIG5ldmVyIHBlcmZvcm1lZC4KKworPWJhY2sKKworRXhhbXBsZXM6CisKK0xvb2sgZm9yICJlY2hvIiBpbiB0aGUgZGlyZWN0b3JpZXMgc3BlY2lmaWVkIGluIFBBVEg6CisKKyAgICBteSAkZWNobyA9IHdoaWNoKCAiZWNobyIgKTsKKworTG9vayBmb3IgYWxsIG9jY3VyZW5zZXMgb2YgImNwIiBpbiB0aGUgUEFUSDoKKworICAgIG15IEBjcHMgPSB3aGljaCggImNwIiwgLWFsbCA9PiAxICk7CisKK0xvb2sgZm9yIHRoZSBmaXJzdCBvY2N1cnJlbmNlIG9mICJpY2MiIGluIHRoZSBzcGVjaWZpZWQgZGlyZWN0b3JpZXM6CisKKyAgICBteSAkaWNjID0gd2hpY2goICJpY2MiLCAtZGlycyA9PiBbICIuIiwgIi91c3IvbG9jYWwvYmluIiwgIi91c3IvYmluIiwgIi9iaW4iIF0gKTsKKworTG9vayBmb3IgdGhlIHRoZSBDPG9tcF9saWIuZj4gZmlsZToKKworICAgIG15IEBvbXBfbGliID0gd2hpY2goICJvbXBfbGliLmYiLCAtYWxsID0+IDEsIC1leGVjID0+IDAsIC1kaXJzID0+IFsgQGluY2x1ZGUgXSApOworCis9Y3V0CisKK3N1YiB3aGljaCgkQCkgeworCisgICAgbXkgJGZpbGUgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgcXcoIC1hbGwgLWRpcnMgLWV4ZWMgKSBdICk7CisgICAgaWYgKCAkb3B0c3sgLWFsbCB9IGFuZCBub3Qgd2FudGFycmF5KCkgKSB7CisgICAgICAgIGxvY2FsICRDYXJwOjpDYXJwTGV2ZWwgPSAxOworICAgICAgICBDYXJwOjpjbHVjayggImAtYWxsJyBvcHRpb24gcGFzc2VkIHRvIGB3aGljaCcgYnV0IGxpc3QgaXMgbm90IGV4cGVjdGVkIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBkZWZpbmVkKCAkb3B0c3sgLWV4ZWMgfSApICkgeworICAgICAgICAkb3B0c3sgLWV4ZWMgfSA9IDE7CisgICAgfTsgIyBpZgorCisgICAgbXkgJGRpcnMgPSAoIGV4aXN0cyggJG9wdHN7IC1kaXJzIH0gKSA/ICRvcHRzeyAtZGlycyB9IDogWyBGaWxlOjpTcGVjLT5wYXRoKCkgXSApOworICAgIG15IEBmb3VuZDsKKworICAgIG15IEBleHRzID0gKCAiIiApOworICAgIGlmICggJF5PIGVxICJNU1dpbjMyIiBhbmQgJG9wdHN7IC1leGVjIH0gKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJEVOVnsgUEFUSEVYVCB9ICkgKSB7CisgICAgICAgICAgICBwdXNoKCBAZXh0cywgc3BsaXQoICI7IiwgJEVOVnsgUEFUSEVYVCB9ICkgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICMgSWYgUEFUSEVYVCBkb2VzIG5vdCBleGlzdCwgdXNlIGRlZmF1bHQgdmFsdWUuCisgICAgICAgICAgICBwdXNoKCBAZXh0cywgcXd7IC5DT00gLkVYRSAuQkFUIC5DTUQgfSApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgbG9vcDoKKyAgICBmb3JlYWNoIG15ICRkaXIgKCBAJGRpcnMgKSB7CisgICAgICAgIGZvcmVhY2ggbXkgJGV4dCAoIEBleHRzICkgeworICAgICAgICAgICAgbXkgJHBhdGggPSBGaWxlOjpTcGVjLT5jYXRmaWxlKCAkZGlyLCAkZmlsZSAuICRleHQgKTsKKyAgICAgICAgICAgIGlmICggLWUgJHBhdGggKSB7CisgICAgICAgICAgICAgICAgIyBFeGVjdXRhYmxlIGJpdCBpcyBub3QgcmVsaWFibGUgb24gQ3lnd2luLCBkbyBub3QgY2hlY2sgaXQuCisgICAgICAgICAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1leGVjIH0gb3IgLXggJHBhdGggb3IgJF5PIGVxICJjeWd3aW4iICkgeworICAgICAgICAgICAgICAgICAgICBwdXNoKCBAZm91bmQsICRwYXRoICk7CisgICAgICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYWxsIH0gKSB7CisgICAgICAgICAgICAgICAgICAgICAgICBsYXN0IGxvb3A7CisgICAgICAgICAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgZm9yZWFjaCAkZXh0CisgICAgfTsgIyBmb3JlYWNoICRkaXIKKworICAgIGlmICggbm90IEBmb3VuZCApIHsKKyAgICAgICAgIyBUQkQ6IFdlIG5lZWQgdG8gaW50cm9kdWNlIGFuIG9wdGlvbiBmb3IgY29uZGl0aW9uYWwgZW5hYmxpbmcgdGhpcyBlcnJvci4KKyAgICAgICAgIyBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGZpbmQgXCIkZmlsZVwiIGV4ZWN1dGFibGUgZmlsZSBpbiBQQVRILiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBAZm91bmQgPiAxICkgeworICAgICAgICAjIFRCRDogSXNzdWUgYSB3YXJuaW5nPworICAgIH07ICMgaWYKKworICAgIGlmICggJG9wdHN7IC1hbGwgfSApIHsKKyAgICAgICAgcmV0dXJuIEBmb3VuZDsKKyAgICB9IGVsc2UgeworICAgICAgICByZXR1cm4gJGZvdW5kWyAwIF07CisgICAgfTsgIyBpZgorCit9OyAjIHN1YiB3aGljaAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxhYnNfcGF0aCggJHBhdGgsICRiYXNlICk+CisKK1JldHVybiBhYnNvbHV0ZSBwYXRoIGZvciBhbiBhcmd1bWVudC4KKworTW9zdCBvZiB0aGUgd29yayBpcyBkb25lIGJ5IEM8RmlsZTo6U3BlYy0+cmVsMmFicygpPi4gQzxhYnNfcGF0aCgpPiBhZGRpdGlvbmFsbHkgY29sbGFwc2VzCitDPGRpcjEvLi4vZGlyMj4gdG8gQzxkaXIyPi4KKworSXQgaXMgbm90IHNvIG5haXZlIGFuZCBtYWRlIGludGVudGlvbmFsbHkuIEZvciBleGFtcGxlIG9uIExpbnV4KiBPUyBpbiBCYXNoIGlmIEY8bGluay8+IGlzIGEgc3ltYm9saWMKK2xpbmsgdG8gZGlyZWN0b3J5IEY8c29tZV9kaXIvPgorCisgICAgJCBjZCBsaW5rCisgICAgJCBjZCAuLgorCiticmluZ3MgeW91IGJhY2sgdG8gRjxsaW5rLz4ncyBwYXJlbnQsIG5vdCB0byBwYXJlbnQgb2YgRjxzb21lX2Rpci8+LAorCis9Y3V0CisKK3N1YiBhYnNfcGF0aCgkOyQpIHsKKworICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPnJlbDJhYnMoICRwYXRoLCAoIGRlZmluZWQoICRiYXNlICkgPyAkYmFzZSA6ICRFTlZ7IFBXRCB9ICkgKTsKKyAgICBteSAoICR2b2wsICRkaXIsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoICRwYXRoICk7CisgICAgd2hpbGUgKCAkZGlyID1+IHN7Lyg/IVwuXC4pW14vXSovXC5cLig/Oi98XHopfXsvfSApIHsKKyAgICB9OyAjIHdoaWxlCisgICAgJHBhdGggPSBGaWxlOjpTcGVjLT5jYW5vbnBhdGgoIEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIsICRmaWxlICkgKTsKKyAgICByZXR1cm4gJHBhdGg7CisKK307ICMgc3ViIGFic19wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPHJlbF9wYXRoKCAkcGF0aCwgJGJhc2UgKT4KKworUmV0dXJuIHJlbGF0aXZlIHBhdGggZm9yIGFuIGFyZ3VtZW50LgorCis9Y3V0CisKK3N1YiByZWxfcGF0aCgkOyQpIHsKKworICAgIG15ICggJHBhdGgsICRiYXNlICkgPSBAXzsKKyAgICAkcGF0aCA9IEZpbGU6OlNwZWMtPmFiczJyZWwoIGFic19wYXRoKCAkcGF0aCApLCAkYmFzZSApOworICAgIHJldHVybiAkcGF0aDsKKworfTsgIyBzdWIgcmVsX3BhdGgKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8cmVhbF9wYXRoKCAkZGlyICk+CisKK1JldHVybiByZWFsIGFic29sdXRlIHBhdGggZm9yIGFuIGFyZ3VtZW50LiBJbiB0aGUgcmVzdWx0IGFsbCByZWxhdGl2ZSBjb21wb25lbnRzIChGPC4+IGFuZCBGPC4uPikKK2FuZCBVPHN5bWJvbGljIGxpbmtzIGFyZSByZXNvbHZlZD4uCisKK0luIG1vc3QgY2FzZXMgaXQgaXMgbm90IHdoYXQgeW91IHdhbnQuIENvbnNpZGVyIHVzaW5nIEM8YWJzX3BhdGg+IGZpcnN0LgorCitDPGFic19wYXRoPiBmdW5jdGlvbiBmcm9tIEI8Q3dkPiBtb2R1bGUgd29ya3Mgd2l0aCBkaXJlY3RvcmllcyBvbmx5LiBUaGlzIGZ1bmN0aW9uIHdvcmtzIHdpdGggZmlsZXMKK2FzIHdlbGwuIEJ1dCwgaWYgZmlsZSBpcyBhIHN5bWJvbGljIGxpbmssIGZ1bmN0aW9uIGRvZXMgbm90IHJlc29sdmUgaXQgKHlldCkuCisKK1RoZSBmdW5jdGlvbiB1c2VzIEM8cnVudGltZV9lcnJvcj4gdG8gcmFpc2UgYW4gZXJyb3IgaWYgc29tZXRoaW5nIHdyb25nLgorCis9Y3V0CisKK3N1YiByZWFsX3BhdGgoJCkgeworCisgICAgbXkgJG9yaWdfcGF0aCA9IHNoaWZ0KCBAXyApOworICAgIG15ICRyZWFsX3BhdGg7CisgICAgbXkgJG1lc3NhZ2UgPSAiIjsKKyAgICBpZiAoIG5vdCAtZSAkb3JpZ19wYXRoICkgeworICAgICAgICAkbWVzc2FnZSA9ICJcIiRvcmlnX3BhdGhcIiBkb2VzIG5vdCBleGlzdHMiOworICAgIH0gZWxzZSB7CisgICAgICAgICMgQ3dkOjphYnNfcGF0aCBkb2VzIG5vdCB3b3JrIHdpdGggZmlsZXMsIHNvIGluIHRoaXMgY2FzZSB3ZSBzaG91bGQgaGFuZGxlIGZpbGUgc2VwYXJhdGVseS4KKyAgICAgICAgbXkgJGZpbGU7CisgICAgICAgIGlmICggbm90IC1kICRvcmlnX3BhdGggKSB7CisgICAgICAgICAgICAoIG15ICR2b2wsIG15ICRkaXIsICRmaWxlICkgPSBGaWxlOjpTcGVjLT5zcGxpdHBhdGgoIEZpbGU6OlNwZWMtPnJlbDJhYnMoICRvcmlnX3BhdGggKSApOworICAgICAgICAgICAgJG9yaWdfcGF0aCA9IEZpbGU6OlNwZWMtPmNhdHBhdGgoICR2b2wsICRkaXIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICB7CisgICAgICAgICAgICBsb2NhbCAkU0lHeyBfX1dBUk5fXyB9ID0gc3ViIHsgJG1lc3NhZ2UgPSAkX1sgMCBdOyB9OworICAgICAgICAgICAgJHJlYWxfcGF0aCA9IEN3ZDo6YWJzX3BhdGgoICRvcmlnX3BhdGggKTsKKyAgICAgICAgfTsKKyAgICAgICAgaWYgKCBkZWZpbmVkKCAkZmlsZSApICkgeworICAgICAgICAgICAgJHJlYWxfcGF0aCA9IEZpbGU6OlNwZWMtPmNhdGZpbGUoICRyZWFsX3BhdGgsICRmaWxlICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgZGVmaW5lZCggJHJlYWxfcGF0aCApIG9yICRtZXNzYWdlIG5lICIiICkgeworICAgICAgICAkbWVzc2FnZSA9fiBzL15zdGF0XCguKlwpOiAoLiopXHMrYXQgLio/IGxpbmUgXGQrXHMqXHovJDEvOworICAgICAgICBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGZpbmQgcmVhbCBwYXRoIGZvciBcIiRvcmlnX3BhdGhcIiIgLiAoICRtZXNzYWdlIG5lICIiID8gIjogJG1lc3NhZ2UiIDogIiIgKSApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHJlYWxfcGF0aDsKKworfTsgIyBzdWIgcmVhbF9wYXRoCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPG1ha2VfZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitNYWtlIGEgZGlyZWN0b3J5LgorCitUaGlzIGZ1bmN0aW9uIG1ha2VzIGEgZGlyZWN0b3J5LiBJZiBuZWNlc3NhcnksIG1vcmUgdGhhbiBvbmUgbGV2ZWwgY2FuIGJlIGNyZWF0ZWQuCitJZiBkaXJlY3RvcnkgZXhpc3RzLCB3YXJuaW5nIGlzc3VlcyAodGhlIHNjcmlwdCBiZWhhdmlvciBkZXBlbmRzIG9uIHZhbHVlIG9mCitDPC13YXJuaW5nX2xldmVsPiBvcHRpb24pLiBJZiBkaXJlY3RvcnkgY3JlYXRpb24gZmFpbHMgb3IgQzwkZGlyPiBleGlzdHMgYnV0IGl0IGlzIG5vdCBhCitkaXJlY3RvcnksIGVycm9yIGlzc3N1ZXMuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW1vZGU+CisKK1RoZSBudW1lcmljIG1vZGUgZm9yIG5ldyBkaXJlY3RvcmllcywgMDc1MCAocnd4ci14LS0tKSBieSBkZWZhdWx0LgorCis9YmFjaworCis9Y3V0CisKK3N1YiBtYWtlX2RpcigkQCkgeworCisgICAgbXkgJGRpciAgICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzICAgPQorICAgICAgICB2YWxpZGF0ZSgKKyAgICAgICAgICAgIHBhcmFtcyA9PiBcQF8sCisgICAgICAgICAgICBzcGVjID0+IHsKKyAgICAgICAgICAgICAgICBwYXJlbnRzID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIsIGRlZmF1bHQgPT4gMSAgICB9LAorICAgICAgICAgICAgICAgIG1vZGUgICAgPT4geyB0eXBlID0+ICJzY2FsYXIiLCAgZGVmYXVsdCA9PiAwNzc3IH0sCisgICAgICAgICAgICB9LAorICAgICAgICApOworCisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY3JlYXRlIGRpcmVjdG9yeSBcIiRkaXJcIiI7CisKKyAgICBpZiAoIC1lICRkaXIgKSB7CisgICAgICAgIGlmICggLWQgJGRpciApIHsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBpdCBleGlzdHMsIGJ1dCBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNlIHsKKyAgICAgICAgZXZhbCB7CisgICAgICAgICAgICBGaWxlOjpQYXRoOjpta3BhdGgoICRkaXIsIDAsICRvcHRzeyBtb2RlIH0gKTsKKyAgICAgICAgfTsgIyBldmFsCisgICAgICAgIGlmICggJEAgKSB7CisgICAgICAgICAgICAkQCA9fiBze1xzK2F0ICg/OlthLXpBLVowLTkgL18uXSovKT90b29sc1wucG0gbGluZSBcZCtccyp9e307CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogJEAiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgLWQgJGRpciApIHsgIyBKdXN0IGluIGNhc2UsIGNoZWNrIGl0IG9uZSBtb3JlIHRpbWUuLi4KKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworfTsgIyBzdWIgbWFrZV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8Y29weV9kaXIoICRzcmNfZGlyLCAkZHN0X2RpciwgQG9wdGlvbnMgKT4KKworQ29weSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCisKK1RoaXMgZnVuY3Rpb24gY29waWVzIGEgZGlyZWN0b3J5IHJlY3Vyc2l2ZWx5LgorSWYgc291cmNlIGRpcmVjdG9yeSBkb2VzIG5vdCBleGlzdCBvciBub3QgYSBkaXJlY3RvcnksIGVycm9yIGlzc3Vlcy4KKworT3B0aW9uczoKKworPW92ZXIKKworPWl0ZW0gQzwtb3ZlcndyaXRlPgorCitPdmVyd3JpdGUgZGVzdGluYXRpb24gZGlyZWN0b3J5LCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGNvcHlfZGlyKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgY29weSBkaXJlY3RvcnkgXCIkc3JjXCIgdG8gXCIkZHN0XCIiOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWQgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGRpcmVjdG9yeS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZCAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9kaXIoICRkc3QgKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJGRzdFwiIGFscmVhZHkgZXhpc3RzLiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgZXhlY3V0ZSggWyAiY3AiLCAiLVIiLCAkc3JjLCAkZHN0IF0gKTsKKworfTsgIyBzdWIgY29weV9kaXIKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1pdGVtIEM8bW92ZV9kaXIoICRzcmNfZGlyLCAkZHN0X2RpciwgQG9wdGlvbnMgKT4KKworTW92ZSBkaXJlY3RvcnkuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LW92ZXJ3cml0ZT4KKworT3ZlcndyaXRlIGRlc3RpbmF0aW9uIGRpcmVjdG9yeSwgaWYgaXQgZXhpc3RzLgorCis9YmFjaworCis9Y3V0CisKK3N1YiBtb3ZlX2RpcigkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZGlyZWN0b3J5IFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGlmICggbm90IC1lICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBkb2VzIG5vdCBleGlzdC4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IC1kICRzcmMgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRzcmNcIiBpcyBub3QgYSBkaXJlY3RvcnkuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWQgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICBkZWxfZGlyKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworICAgIGV4ZWN1dGUoIFsgIm12IiwgJHNyYywgJGRzdCBdICk7CisKK307ICMgc3ViIG1vdmVfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNsZWFuX2RpciggJGRpciwgQG9wdGlvbnMgKT4KKworQ2xlYW4gYSBkaXJlY3Rvcnk6IGRlbGV0ZSBhbGwgdGhlIGVudHJpZXMgKHJlY3Vyc2l2ZWx5KSwgYnV0IGxlYXZlIHRoZSBkaXJlY3RvcnkuCisKK09wdGlvbnM6CisKKz1vdmVyCisKKz1pdGVtIEM8LWZvcmNlPiA9PiBib29sCisKK0lmIGEgZGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZSwgdHJ5IHRvIGNoYW5nZSBwZXJtaXNzaW9ucyBmaXJzdCwgdGhlbiBjbGVhbiBpdC4KKworPWl0ZW0gQzwtc2tpcD4gPT4gcmVnZXhwCisKK1JlZ2V4cC4gSWYgYSBkaXJlY3RvcnkgZW50cnkgbWFjaGVkIHRoZSByZWdleHAsIGl0IGlzIHNraXBwZWQsIG5vdCBkZWxldGVkLiAoQXMgYSBzdWJzZXF1ZW5jZSwKK2EgZGlyZWN0b3J5IGNvbnRhaW5pbmcgc2tpcHBlZCBlbnRyaWVzIGlzIG5vdCBkZWxldGVkLikKKworPWJhY2sKKworPWN1dAorCitzdWIgX2NsZWFuX2RpcigkKTsKKworc3ViIF9jbGVhbl9kaXIoJCkgeworICAgIG91ciAlX2NsZWFuX2Rpcl9vcHRzOworICAgIG15ICggJGRpciApID0gQF87CisgICAgbXkgJHNraXAgICAgPSAkX2NsZWFuX2Rpcl9vcHRzeyBza2lwIH07ICAgICMgUmVnZXhwLgorICAgIG15ICRza2lwcGVkID0gMDsgICAgICAgICAgICAgICAgICAgICAgICAgICAjIE51bWJlciBvZiBza2lwcGVkIGZpbGVzLgorICAgIG15ICRwcmVmaXggID0gIkNsZWFuaW5nIGAkZGlyJyBmYWlsZWQ6IjsKKyAgICBteSBAc3RhdCAgICA9IHN0YXQoICRkaXIgKTsKKyAgICBteSAkbW9kZSAgICA9ICRzdGF0WyAyIF07CisgICAgaWYgKCBub3QgQHN0YXQgKSB7CisgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3Qgc3RhdCBgJGRpcic6ICQhIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCBfICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiSXQgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLXcgXyApIHsgICAgICAgICMgRGlyZWN0b3J5IGlzIG5vdCB3cml0YWJsZS4KKyAgICAgICAgaWYgKCBub3QgLW8gXyBvciBub3QgJF9jbGVhbl9kaXJfb3B0c3sgZm9yY2UgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJEaXJlY3RvcnkgaXMgbm90IHdyaXRhYmxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAjIERpcmVjdG9yeSBpcyBub3Qgd3JpdGFibGUgYnV0IG1pbmUuIFRyeSB0byBjaGFuZ2UgcGVybWlzc2lvbnMuCisgICAgICAgIGNobW9kKCAkbW9kZSB8IFNfSVdVU1IsICRkaXIgKQorICAgICAgICAgICAgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCBtYWtlIGRpcmVjdG9yeSB3cml0YWJsZTogJCEiICk7CisgICAgfTsgIyBpZgorICAgIG15ICRoYW5kbGUgICA9IElPOjpEaXItPm5ldyggJGRpciApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgcmVhZCBkaXJlY3Rvcnk6ICQhIiApOworICAgIG15IEBlbnRyaWVzICA9IEZpbGU6OlNwZWMtPm5vX3Vwd2FyZHMoICRoYW5kbGUtPnJlYWQoKSApOworICAgICRoYW5kbGUtPmNsb3NlKCkgb3IgcnVudGltZV9lcnJvciggJHByZWZpeCwgIkNhbm5vdCByZWFkIGRpcmVjdG9yeTogJCEiICk7CisgICAgZm9yZWFjaCBteSAkZW50cnkgKCBAZW50cmllcyApIHsKKyAgICAgICAgbXkgJHBhdGggPSBjYXRfZmlsZSggJGRpciwgJGVudHJ5ICk7CisgICAgICAgIGlmICggZGVmaW5lZCggJHNraXAgKSBhbmQgJGVudHJ5ID1+ICRza2lwICkgeworICAgICAgICAgICAgKysgJHNraXBwZWQ7CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBpZiAoIC1sICRwYXRoICkgeworICAgICAgICAgICAgICAgIHVubGluayggJHBhdGggKSBvciBydW50aW1lX2Vycm9yKCAkcHJlZml4LCAiQ2Fubm90IGRlbGV0ZSBzeW1saW5rIGAkcGF0aCc6ICQhIiApOworICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICBzdGF0KCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3Qgc3RhdCBgJHBhdGgnOiAkISAiICk7CisgICAgICAgICAgICAgICAgaWYgKCAtZiBfICkgeworICAgICAgICAgICAgICAgICAgICBkZWxfZmlsZSggJHBhdGggKTsKKyAgICAgICAgICAgICAgICB9IGVsc2lmICggLWQgXyApIHsKKyAgICAgICAgICAgICAgICAgICAgbXkgJHJjID0gX2NsZWFuX2RpciggJHBhdGggKTsKKyAgICAgICAgICAgICAgICAgICAgaWYgKCAkcmMgPT0gMCApIHsKKyAgICAgICAgICAgICAgICAgICAgICAgIHJtZGlyKCAkcGF0aCApIG9yIHJ1bnRpbWVfZXJyb3IoICRwcmVmaXgsICJDYW5ub3QgZGVsZXRlIGRpcmVjdG9yeSBgJHBhdGgnOiAkISIgKTsKKyAgICAgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICAgICAkc2tpcHBlZCArPSAkcmM7CisgICAgICAgICAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICAgICAgICAgcnVudGltZV9lcnJvciggJHByZWZpeCwgImAkcGF0aCcgaXMgbmVpdGhlciBhIGZpbGUgbm9yIGEgZGlyZWN0b3J5LiIgKTsKKyAgICAgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2gKKyAgICByZXR1cm4gJHNraXBwZWQ7Cit9OyAjIHN1YiBfY2xlYW5fZGlyCisKKworc3ViIGNsZWFuX2RpcigkQCkgeworICAgIG15ICRkaXIgID0gc2hpZnQoIEBfICk7CisgICAgb3VyICVfY2xlYW5fZGlyX29wdHM7CisgICAgbG9jYWwgJV9jbGVhbl9kaXJfb3B0cyA9CisgICAgICAgIHZhbGlkYXRlKAorICAgICAgICAgICAgcGFyYW1zID0+IFxAXywKKyAgICAgICAgICAgIHNwZWMgPT4geworICAgICAgICAgICAgICAgIHNraXAgID0+IHsgdHlwZSA9PiAicmVnZXhwcmVmIiB9LAorICAgICAgICAgICAgICAgIGZvcmNlID0+IHsgdHlwZSA9PiAiYm9vbGVhbiIgICB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKyAgICBteSAkc2tpcHBlZCA9IF9jbGVhbl9kaXIoICRkaXIgKTsKKyAgICByZXR1cm4gJHNraXBwZWQ7Cit9OyAjIHN1YiBjbGVhbl9kaXIKKworCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxkZWxfZGlyKCAkZGlyLCBAb3B0aW9ucyApPgorCitEZWxldGUgYSBkaXJlY3RvcnkgcmVjdXJzaXZlbHkuCisKK1RoaXMgZnVuY3Rpb24gZGVsZXRlcyBhIGRpcmVjdG9yeS4gSWYgZGlyZWN0b3J5IGNhbiBub3QgYmUgZGVsZXRlZCBvciBpdCBpcyBub3QgYSBkaXJlY3RvcnksIGVycm9yCittZXNzYWdlIGlzc3VlcyAoYW5kIHNjcmlwdCBleGlzdHMpLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9YmFjaworCis9Y3V0CisKK3N1YiBkZWxfZGlyKCRAKSB7CisKKyAgICBteSAkZGlyICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJEZWxldGluZyBkaXJlY3RvcnkgXCIkZGlyXCIgZmFpbGVkIjsKKyAgICBvdXIgJV9jbGVhbl9kaXJfb3B0czsKKyAgICBsb2NhbCAlX2NsZWFuX2Rpcl9vcHRzID0KKyAgICAgICAgdmFsaWRhdGUoCisgICAgICAgICAgICBwYXJhbXMgPT4gXEBfLAorICAgICAgICAgICAgc3BlYyA9PiB7CisgICAgICAgICAgICAgICAgZm9yY2UgPT4geyB0eXBlID0+ICJib29sZWFuIiB9LAorICAgICAgICAgICAgfSwKKyAgICAgICAgKTsKKworICAgIGlmICggbm90IC1lICRkaXIgKSB7CisgICAgICAgICMgTm90aGluZyB0byBkby4KKyAgICAgICAgcmV0dXJuOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZCAkZGlyICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogaXQgaXMgbm90IGEgZGlyZWN0b3J5LiIgKTsKKyAgICB9OyAjIGlmCisgICAgX2NsZWFuX2RpciggJGRpciApOworICAgIHJtZGlyKCAkZGlyICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXguIiApOworCit9OyAjIHN1YiBkZWxfZGlyCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNoYW5nZV9kaXIoICRkaXIgKT4KKworQ2hhbmdlIGN1cnJlbnQgZGlyZWN0b3J5LgorCitJZiBhbnkgZXJyb3Igb2NjdXJyZWQsIGVycm9yIGlzc3VlcyBhbmQgc2NyaXB0IGV4aXRzLgorCis9Y3V0CisKK3N1YiBjaGFuZ2VfZGlyKCQpIHsKKworICAgIG15ICRkaXIgPSBzaGlmdCggQF8gKTsKKworICAgIEN3ZDo6Y2hkaXIoICRkaXIgKQorICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiQ291bGQgbm90IGNoZGlyIHRvIFwiJGRpclwiOiAkISIgKTsKKworfTsgIyBzdWIgY2hhbmdlX2RpcgorCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGNvcHlfZmlsZSggJHNyY19maWxlLCAkZHN0X2ZpbGUsIEBvcHRpb25zICk+CisKK0NvcHkgZmlsZS4KKworVGhpcyBmdW5jdGlvbiBjb3BpZXMgYSBmaWxlLiBJZiBzb3VyY2UgZG9lcyBub3QgZXhpc3Qgb3IgaXMgbm90IGEgZmlsZSwgZXJyb3IgaXNzdWVzLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1vdmVyd3JpdGU+CisKK092ZXJ3cml0ZSBkZXN0aW5hdGlvbiBmaWxlLCBpZiBpdCBleGlzdHMuCisKKz1iYWNrCisKKz1jdXQKKworc3ViIGNvcHlfZmlsZSgkJEApIHsKKworICAgIG15ICRzcmMgID0gc2hpZnQoIEBfICk7CisgICAgbXkgJGRzdCAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyA9IEBfOworICAgIG15ICRwcmVmaXggPSAiQ291bGQgbm90IGNvcHkgZmlsZSBcIiRzcmNcIiB0byBcIiRkc3RcIiI7CisKKyAgICBpZiAoIG5vdCAtZSAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgZG9lcyBub3QgZXhpc3QuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCAtZiAkc3JjICkgeworICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkc3JjXCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgfTsgIyBpZgorICAgIGlmICggLWUgJGRzdCApIHsKKyAgICAgICAgaWYgKCAtZiAkZHN0ICkgeworICAgICAgICAgICAgaWYgKCAkb3B0c3sgLW92ZXJ3cml0ZSB9ICkgeworICAgICAgICAgICAgICAgIGRlbF9maWxlKCAkZHN0ICk7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBGaWxlOjpDb3B5Ojpjb3B5KCAkc3JjLCAkZHN0ICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICQhIiApOworICAgICMgT24gV2luZG93cyogT1MgRmlsZTo6Q29weSBwcmVzZXJ2ZXMgZmlsZSBhdHRyaWJ1dGVzLCBidXQgb24gTGludXgqIE9TIGl0IGRvZXNuJ3QuCisgICAgIyBTbyB3ZSBzaG91bGQgZG8gaXQgbWFudWFsbHkuLi4KKyAgICBpZiAoICReTyA9fiBtL15saW51eFx6LyApIHsKKyAgICAgICAgbXkgJG1vZGUgPSAoIHN0YXQoICRzcmMgKSApWyAyIF0KKyAgICAgICAgICAgIG9yIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBjYW5ub3QgZ2V0IHN0YXR1cyBpbmZvIGZvciBzb3VyY2UgZmlsZS4iICk7CisgICAgICAgIGNobW9kKCAkbW9kZSwgJGRzdCApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogY2Fubm90IGNoYW5nZSBtb2RlIG9mIGRlc3RpbmF0aW9uIGZpbGUuIiApOworICAgIH07ICMgaWYKKworfTsgIyBzdWIgY29weV9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgbW92ZV9maWxlKCQkQCkgeworCisgICAgbXkgJHNyYyAgPSBzaGlmdCggQF8gKTsKKyAgICBteSAkZHN0ICA9IHNoaWZ0KCBAXyApOworICAgIG15ICVvcHRzID0gQF87CisgICAgbXkgJHByZWZpeCA9ICJDb3VsZCBub3QgbW92ZSBmaWxlIFwiJHNyY1wiIHRvIFwiJGRzdFwiIjsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtb3ZlcndyaXRlICkgXSApOworCisgICAgaWYgKCBub3QgLWUgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGRvZXMgbm90IGV4aXN0LiIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCBub3QgLWYgJHNyYyApIHsKKyAgICAgICAgcnVudGltZV9lcnJvciggIiRwcmVmaXg6IFwiJHNyY1wiIGlzIG5vdCBhIGZpbGUuIiApOworICAgIH07ICMgaWYKKyAgICBpZiAoIC1lICRkc3QgKSB7CisgICAgICAgIGlmICggLWYgJGRzdCApIHsKKyAgICAgICAgICAgIGlmICggJG9wdHN7IC1vdmVyd3JpdGUgfSApIHsKKyAgICAgICAgICAgICAgICAjCisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICIkcHJlZml4OiBcIiRkc3RcIiBhbHJlYWR5IGV4aXN0cy4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiJHByZWZpeDogXCIkZHN0XCIgaXMgbm90IGEgZmlsZS4iICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisKKyAgICBGaWxlOjpDb3B5Ojptb3ZlKCAkc3JjLCAkZHN0ICkgb3IgcnVudGltZV9lcnJvciggIiRwcmVmaXg6ICQhIiApOworCit9OyAjIHN1YiBtb3ZlX2ZpbGUKKworIyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3N1YiBkZWxfZmlsZSgkKSB7CisgICAgbXkgJGZpbGVzID0gc2hpZnQoIEBfICk7CisgICAgaWYgKCByZWYoICRmaWxlcyApIGVxICIiICkgeworICAgICAgICAkZmlsZXMgPSBbICRmaWxlcyBdOworICAgIH07ICMgaWYKKyAgICBmb3JlYWNoIG15ICRmaWxlICggQCRmaWxlcyApIHsKKyAgICAgICAgZGVidWcoICJEZWxldGluZyBmaWxlIGAkZmlsZScuLi4iICk7CisgICAgICAgIG15ICRyYyA9IHVubGluayggJGZpbGUgKTsKKyAgICAgICAgaWYgKCAkcmMgPT0gMCAmJiAkISAhPSBFTk9FTlQgKSB7CisgICAgICAgICAgICAjIFJlcG9ybiBhbiBlcnJvciwgYnV0IGlnbm9yZSBFTk9FTlQsIGJlY2F1c2UgdGhlIGdvYWwgaXMgYWNoaWV2ZWQuCisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAiRGVsZXRpbmcgZmlsZSBgJGZpbGUnIGZhaWxlZDogJCEiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJGZpbGUKK307ICMgc3ViIGRlbF9maWxlCisKKyMgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9YmFjaworCis9Y3V0CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBGaWxlIEkvTyBzdWJyb3V0aW5lcy4KKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCis9aGVhZDIgRmlsZSBJL08gc3Vicm91dGluZXMuCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1oZWFkMyByZWFkX2ZpbGUKKworQjxTeW5vcHNpczo+CisKKyAgICByZWFkX2ZpbGUoICRmaWxlLCBAb3B0aW9ucyApCisKK0I8RGVzY3JpcHRpb246PgorCitSZWFkIGZpbGUgYW5kIHJldHVybiBpdHMgY29udGVudC4gSW4gc2NhbGFyIGNvbnRleHQgZnVuY3Rpb24gcmV0dXJucyBhIHNjYWxhciwgaW4gbGlzdCBjb250ZXh0CitmdW5jdGlvbiByZXR1cm5zIGxpc3Qgb2YgbGluZXMuCisKK05vdGU6IElmIHRoZSBsYXN0IG9mIGZpbGUgZG9lcyBub3QgdGVybWluYXRlIHdpdGggbmV3bGluZSwgZnVuY3Rpb24gd2lsbCBhcHBlbmQgaXQuCisKK0I8QXJndW1lbnRzOj4KKworPW92ZXIKKworPWl0ZW0gQjwkZmlsZT4KKworQSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHJlYWQgZnJvbS4KKworPWJhY2sKKworQjxPcHRpb25zOj4KKworPW92ZXIKKworPWl0ZW0gQjwtYmluYXJ5PgorCitJZiB0cnVlLCBmaWxlIHRyZWF0cyBhcyBhIGJpbmFyeSBmaWxlOiBubyBuZXdsaW5lIGNvbnZlcnNpb24sIG5vIHRydW5jYXRpbmcgdHJhaWxpbmcgc3BhY2UsIG5vCituZXdsaW5lIHJlbW92aW5nIHBlcmZvcm1lZC4gRW50aXJlIGZpbGUgcmV0dXJuZWQgYXMgYSBzY2FsYXIuCisKKz1pdGVtIEI8LWJ1bGs+CisKK1RoaXMgb3B0aW9uIGlzIGFsbG93ZWQgb25seSBpbiBiaW5hcnkgbW9kZS4gT3B0aW9uJ3MgdmFsdWUgc2hvdWxkIGJlIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyLgorSWYgb3B0aW9uIHByZXNlbnQsIGZpbGUgY29udGVudCBwbGFjZWQgdG8gcG9pbnRlZSBzY2FsYXIgYW5kIGZ1bmN0aW9uIHJldHVybnMgdHJ1ZSAoMSkuCisKKz1pdGVtIEI8LWNob21wPgorCitJZiB0cnVlLCBuZXdsaW5lIGNoYXJhY3RlcnMgYXJlIHJlbW92ZWQgZnJvbSBmaWxlIGNvbnRlbnQuIEJ5IGRlZmF1bHQgbmV3bGluZSBjaGFyYWN0ZXJzIHJlbWFpbi4KK1RoaXMgb3B0aW9uIGlzIG5vdCBhcHBsaWNhYmxlIGluIGJpbmFyeSBtb2RlLgorCis9aXRlbSBCPC1rZWVwX3RyYWlsaW5nX3NwYWNlPgorCitJZiB0cnVlLCB0cmFpbmxpbmcgc3BhY2UgcmVtYWluIGF0IHRoZSBlbmRzIG9mIGxpbmVzLiBCeSBkZWZhdWx0IGFsbCB0cmFpbGluZyBzcGFjZXMgYXJlIHJlbW92ZWQuCitUaGlzIG9wdGlvbiBpcyBub3QgYXBwbGljYWJsZSBpbiBiaW5hcnkgbW9kZS4KKworPWJhY2sKKworQjxFeGFtcGxlczo+CisKK1JldHVybiBmaWxlIGFzIHNpbmdsZSBsaW5lLCByZW1vdmUgdHJhaWxpbmcgc3BhY2VzLgorCisgICAgbXkgJGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIgKTsKKworUmV0dXJuIGZpbGUgYXMgbGlzdCBvZiBsaW5lcyB3aXRoIHJlbW92ZWQgdHJhaWxpbmcgc3BhY2UgYW5kCituZXdsaW5lIGNoYXJhY3RlcnMuCisKKyAgICBteSBAYnVsayA9IHJlYWRfZmlsZSggIm1lc3NhZ2UudHh0IiwgLWNob21wID0+IDEgKTsKKworUmVhZCBhIGJpbmFyeSBmaWxlOgorCisgICAgbXkgJGJ1bGsgPSByZWFkX2ZpbGUoICJtZXNzYWdlLnR4dCIsIC1iaW5hcnkgPT4gMSApOworCitSZWFkIGEgYmlnIGJpbmFyeSBmaWxlOgorCisgICAgbXkgJGJ1bGs7CisgICAgcmVhZF9maWxlKCAiYmlnX2JpbmFyeV9maWxlIiwgLWJpbmFyeSA9PiAxLCAtYnVsayA9PiBcJGJ1bGsgKTsKKworUmVhZCBmcm9tIHN0YW5kYXJkIGlucHV0OgorCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoIFwqU1RESU4gKTsKKworPWN1dAorCitzdWIgcmVhZF9maWxlKCRAKSB7CisKKyAgICBteSAkZmlsZSA9IHNoaWZ0KCBAXyApOyAgIyBUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byByZWFkIGZyb20uCisgICAgbXkgJW9wdHMgPSBAXzsgICAgICAgICAgICMgT3B0aW9ucy4KKworICAgIG15ICRuYW1lOworICAgIG15ICRoYW5kbGU7CisgICAgbXkgQGJ1bGs7CisgICAgbXkgJGVycm9yID0gXCZydW50aW1lX2Vycm9yOworCisgICAgbXkgQGJpbm9wdHMgPSBxdyggLWJpbmFyeSAtZXJyb3IgLWJ1bGsgKTsgICAgICAgICAgICAgICAgICAgICAgICMgT3B0aW9ucyBhdmFpbGFibGUgaW4gYmluYXJ5IG1vZGUuCisgICAgbXkgQHR4dG9wdHMgPSBxdyggLWJpbmFyeSAtZXJyb3IgLWtlZXBfdHJhaWxpbmdfc3BhY2UgLWNob21wIC1sYXllciApOyAjIE9wdGlvbnMgYXZhaWxhYmxlIGluIHRleHQgKG5vbi1iaW5hcnkpIG1vZGUuCisgICAgY2hlY2tfb3B0cyggJW9wdHMsIFsgQGJpbm9wdHMsIEB0eHRvcHRzIF0gKTsKKyAgICBpZiAoICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIEBiaW5vcHRzIF0sICJ0aGVzZSBvcHRpb25zIGNhbm5vdCBiZSB1c2VkIHdpdGggLWJpbmFyeSIgKTsKKyAgICB9IGVsc2UgeworICAgICAgICBjaGVja19vcHRzKCAlb3B0cywgWyBAdHh0b3B0cyBdLCAidGhlc2Ugb3B0aW9ucyBjYW5ub3QgYmUgdXNlZCB3aXRob3V0IC1iaW5hcnkiICk7CisgICAgfTsgIyBpZgorICAgIGlmICggbm90IGV4aXN0cyggJG9wdHN7IC1lcnJvciB9ICkgKSB7CisgICAgICAgICRvcHRzeyAtZXJyb3IgfSA9ICJlcnJvciI7CisgICAgfTsgIyBpZgorICAgIGlmICggJG9wdHN7IC1lcnJvciB9IGVxICJ3YXJuaW5nIiApIHsKKyAgICAgICAgJGVycm9yID0gXCZ3YXJuaW5nOworICAgIH0gZWxzaWYoICRvcHRzeyAtZXJyb3IgfSBlcSAiaWdub3JlIiApIHsKKyAgICAgICAgJGVycm9yID0gc3ViIHt9OworICAgIH0gZWxzaWYgKCByZWYoICRvcHRzeyAtZXJyb3IgfSApIGVxICJBUlJBWSIgKSB7CisgICAgICAgICRlcnJvciA9IHN1YiB7IHB1c2goIEB7ICRvcHRzeyAtZXJyb3IgfSB9LCAkX1sgMCBdICk7IH07CisgICAgfTsgIyBpZgorCisgICAgaWYgKCAoIHJlZiggJGZpbGUgKSBlcSAiR0xPQiIgKSBvciBVTklWRVJTQUw6OmlzYSggJGZpbGUsICJJTzo6SGFuZGxlIiApICkgeworICAgICAgICAkbmFtZSA9ICJ1bmtub3duIjsKKyAgICAgICAgJGhhbmRsZSA9ICRmaWxlOworICAgIH0gZWxzZSB7CisgICAgICAgICRuYW1lID0gJGZpbGU7CisgICAgICAgIGlmICggZ2V0X2V4dCggJGZpbGUgKSBlcSAiLmd6IiBhbmQgbm90ICRvcHRzeyAtYmluYXJ5IH0gKSB7CisgICAgICAgICAgICAkaGFuZGxlID0gSU86OlpsaWItPm5ldyggJG5hbWUsICJyYiIgKTsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgICRoYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkbmFtZSwgInIiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJGhhbmRsZSApICkgeworICAgICAgICAgICAgJGVycm9yLT4oICJGaWxlIFwiJG5hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciBpbnB1dDogJCEiICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCBkZWZpbmVkKCAkaGFuZGxlICkgKSB7CisgICAgICAgIGlmICggJG9wdHN7IC1iaW5hcnkgfSApIHsKKyAgICAgICAgICAgIGJpbm1vZGUoICRoYW5kbGUgKTsKKyAgICAgICAgICAgIGxvY2FsICQvID0gdW5kZWY7ICAgIyBTZXQgaW5wdXQgcmVjb3JkIHNlcGFyYXRvciB0byB1bmRlZiB0byByZWFkIGVudGlyZSBmaWxlIGFzIG9uZSBsaW5lLgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICAgICAgJHsgJG9wdHN7IC1idWxrIH0gfSA9ICRoYW5kbGUtPmdldGxpbmUoKTsKKyAgICAgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAgICAgJGJ1bGtbIDAgXSA9ICRoYW5kbGUtPmdldGxpbmUoKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIGlmICggZGVmaW5lZCggJG9wdHN7IC1sYXllciB9ICkgKSB7CisgICAgICAgICAgICAgICAgYmlubW9kZSggJGhhbmRsZSwgJG9wdHN7IC1sYXllciB9ICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICBAYnVsayA9ICRoYW5kbGUtPmdldGxpbmVzKCk7CisgICAgICAgICAgICAjIFNwZWNpYWwgdHJpY2sgZm9yIFVURi04IGZpbGVzOiBEZWxldGUgQk9NLCBpZiBhbnkuCisgICAgICAgICAgICBpZiAoIGRlZmluZWQoICRvcHRzeyAtbGF5ZXIgfSApIGFuZCAkb3B0c3sgLWxheWVyIH0gZXEgIjp1dGY4IiApIHsKKyAgICAgICAgICAgICAgICBpZiAoIHN1YnN0ciggJGJ1bGtbIDAgXSwgMCwgMSApIGVxICJceHtGRUZGfSIgKSB7CisgICAgICAgICAgICAgICAgICAgIHN1YnN0ciggJGJ1bGtbIDAgXSwgMCwgMSApID0gIiI7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgICAgIG9yICRlcnJvci0+KCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIGNsb3NlZCBhZnRlciBpbnB1dDogJCEiICk7CisgICAgfSBlbHNlIHsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9IGFuZCBleGlzdHMoICRvcHRzeyAtYnVsayB9ICkgKSB7CisgICAgICAgICAgICAkeyAkb3B0c3sgLWJ1bGsgfSB9ID0gIiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJG9wdHN7IC1idWxrIH0gKSApIHsKKyAgICAgICAgICAgIHJldHVybiAxOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgcmV0dXJuICRidWxrWyAwIF07CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICBpZiAoICggQGJ1bGsgPiAwICkgYW5kICggc3Vic3RyKCAkYnVsa1sgLTEgXSwgLTEsIDEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAkYnVsa1sgLTEgXSAuPSAiXG4iOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggbm90ICRvcHRzeyAta2VlcF90cmFpbGluZ19zcGFjZSB9ICkgeworICAgICAgICAgICAgbWFwKCAkXyA9fiBzL1xzK1xuXHovXG4vLCBAYnVsayApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggJG9wdHN7IC1jaG9tcCB9ICkgeworICAgICAgICAgICAgY2hvbXAoIEBidWxrICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCB3YW50YXJyYXkoKSApIHsKKyAgICAgICAgICAgIHJldHVybiBAYnVsazsKKyAgICAgICAgfSBlbHNlIHsKKyAgICAgICAgICAgIHJldHVybiBqb2luKCAiIiwgQGJ1bGsgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKworfTsgIyBzdWIgcmVhZF9maWxlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aGVhZDMgd3JpdGVfZmlsZQorCitCPFN5bm9wc2lzOj4KKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCAkYnVsaywgQG9wdGlvbnMgKQorCitCPERlc2NyaXB0aW9uOj4KKworV3JpdGUgZmlsZS4KKworQjxBcmd1bWVudHM6PgorCis9b3ZlcgorCis9aXRlbSBCPCRmaWxlPgorCitUaGUgbmFtZSBvciBoYW5kbGUgb2YgZmlsZSB0byB3cml0dGUgdG8uCisKKz1pdGVtIEI8JGJ1bGs+CisKK0J1bGsgdG8gd3JpdGUgdG8gYSBmaWxlLiBDYW4gYmUgYSBzY2FsYXIsIG9yIGEgcmVmZXJlbmNlIHRvIHNjYWxhciBvciBhbiBhcnJheS4KKworPWJhY2sKKworQjxPcHRpb25zOj4KKworPW92ZXIKKworPWl0ZW0gQjwtYmFja3VwPgorCitJZiB0cnVlLCBjcmVhdGUgYSBiYWNrdXAgY29weSBvZiBmaWxlIG92ZXJ3cml0dGVuLiBCYWNrdXAgY29weSBpcyBwbGFjZWQgaW50byB0aGUgc2FtZSBkaXJlY3RvcnkuCitUaGUgbmFtZSBvZiBiYWNrdXAgY29weSBpcyB0aGUgc2FtZSBhcyB0aGUgbmFtZSBvZiBmaWxlIHdpdGggYH4nIGFwcGVuZGVkLiBCeSBkZWZhdWx0IGJhY2t1cCBjb3B5CitpcyBub3QgY3JlYXRlZC4KKworPWl0ZW0gQjwtYXBwZW5kPgorCitJZiB0cnVlLCB0aGUgdGV4dCB3aWxsIGJlIGFkZGVkIHRvIGV4aXN0aW5nIGZpbGUuCisKKz1iYWNrCisKK0I8RXhhbXBsZXM6PgorCisgICAgd3JpdGVfZmlsZSggIm1lc3NhZ2UudHh0IiwgXCRidWxrICk7CisgICAgICAgICMgV3JpdGUgZmlsZSwgdGFrZSBjb250ZW50IGZyb20gYSBzY2FsYXIuCisKKyAgICB3cml0ZV9maWxlKCAibWVzc2FnZS50eHQiLCBcQGJ1bGssIC1iYWNrdXAgPT4gMSApOworICAgICAgICAjIFdyaXRlIGZpbGUsIHRha2UgY29udGVudCBmcm9tIGFuIGFycmF5LCBjcmVhdGUgYSBiYWNrdXAgY29weS4KKworPWN1dAorCitzdWIgd3JpdGVfZmlsZSgkJEApIHsKKworICAgIG15ICRmaWxlID0gc2hpZnQoIEBfICk7ICAjIFRoZSBuYW1lIG9yIGhhbmRsZSBvZiBmaWxlIHRvIHdyaXRlIHRvLgorICAgIG15ICRidWxrID0gc2hpZnQoIEBfICk7ICAjIFRoZSB0ZXh0IHRvIHdyaXRlLiBDYW4gYmUgcmVmZXJlbmNlIHRvIGFycmF5IG9yIHNjYWxhci4KKyAgICBteSAlb3B0cyA9IEBfOyAgICAgICAgICAgIyBPcHRpb25zLgorCisgICAgbXkgJG5hbWU7CisgICAgbXkgJGhhbmRsZTsKKworICAgIGNoZWNrX29wdHMoICVvcHRzLCBbIHF3KCAtYXBwZW5kIC1iYWNrdXAgLWJpbmFyeSAtbGF5ZXIgKSBdICk7CisKKyAgICBteSAkbW9kZSA9ICRvcHRzeyAtYXBwZW5kIH0gPyAiYSI6ICJ3IjsKKyAgICBpZiAoICggcmVmKCAkZmlsZSApIGVxICJHTE9CIiApIG9yIFVOSVZFUlNBTDo6aXNhKCAkZmlsZSwgIklPOjpIYW5kbGUiICkgKSB7CisgICAgICAgICRuYW1lID0gInVua25vd24iOworICAgICAgICAkaGFuZGxlID0gJGZpbGU7CisgICAgfSBlbHNlIHsKKyAgICAgICAgJG5hbWUgPSAkZmlsZTsKKyAgICAgICAgaWYgKCAkb3B0c3sgLWJhY2t1cCB9IGFuZCAoIC1mICRuYW1lICkgKSB7CisgICAgICAgICAgICBjb3B5X2ZpbGUoICRuYW1lLCAkbmFtZSAuICJ+IiwgLW92ZXJ3cml0ZSA9PiAxICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgJGhhbmRsZSA9IElPOjpGaWxlLT5uZXcoICRuYW1lLCAkbW9kZSApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIG9wZW5lZCBmb3Igb3V0cHV0OiAkISIgKTsKKyAgICB9OyAjIGlmCisgICAgaWYgKCAkb3B0c3sgLWJpbmFyeSB9ICkgeworICAgICAgICBiaW5tb2RlKCAkaGFuZGxlICk7CisgICAgfSBlbHNpZiAoICRvcHRzeyAtbGF5ZXIgfSApIHsKKyAgICAgICAgYmlubW9kZSggJGhhbmRsZSwgJG9wdHN7IC1sYXllciB9ICk7CisgICAgfTsgIyBpZgorICAgIGlmICggcmVmKCAkYnVsayApIGVxICIiICkgeworICAgICAgICBpZiAoIGRlZmluZWQoICRidWxrICkgKSB7CisgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJGJ1bGsgKTsKKyAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkYnVsaywgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgJGhhbmRsZS0+cHJpbnQoICJcbiIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgfTsgIyBpZgorICAgIH0gZWxzaWYgKCByZWYoICRidWxrICkgZXEgIlNDQUxBUiIgKSB7CisgICAgICAgIGlmICggZGVmaW5lZCggJCRidWxrICkgKSB7CisgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggJCRidWxrICk7CisgICAgICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWJpbmFyeSB9IGFuZCAoIHN1YnN0ciggJCRidWxrLCAtMSApIG5lICJcbiIgKSApIHsKKyAgICAgICAgICAgICAgICAkaGFuZGxlLT5wcmludCggIlxuIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoIHJlZiggJGJ1bGsgKSBlcSAiQVJSQVkiICkgeworICAgICAgICBmb3JlYWNoIG15ICRsaW5lICggQCRidWxrICkgeworICAgICAgICAgICAgaWYgKCBkZWZpbmVkKCAkbGluZSApICkgeworICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAkbGluZSApOworICAgICAgICAgICAgICAgIGlmICggbm90ICRvcHRzeyAtYmluYXJ5IH0gYW5kICggc3Vic3RyKCAkbGluZSwgLTEgKSBuZSAiXG4iICkgKSB7CisgICAgICAgICAgICAgICAgICAgICRoYW5kbGUtPnByaW50KCAiXG4iICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICB9IGVsc2UgeworICAgICAgICBDYXJwOjpjcm9hayggIndyaXRlX2ZpbGU6IFwkYnVsayBtdXN0IGJlIGEgc2NhbGFyIG9yIHJlZmVyZW5jZSB0byAoc2NhbGFyIG9yIGFycmF5KSIgKTsKKyAgICB9OyAjIGlmCisgICAgJGhhbmRsZS0+Y2xvc2UoKQorICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiRmlsZSBcIiRuYW1lXCIgY291bGQgbm90IGJlIGNsb3NlZCBhZnRlciBvdXRwdXQ6ICQhIiApOworCit9OyAjIHN1YiB3cml0ZV9maWxlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9Y3V0CisKKyMgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorIyBFeGVjdXRpb24gc3Vicm91dGluZXMuCisjID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworPWhlYWQyIEV4ZWN1dGlvbiBzdWJyb3V0aW5lcy4KKworPW92ZXIKKworPWN1dAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworc3ViIF9wcmUgeworCisgICAgbXkgJGFyZyA9IHNoaWZ0KCBAXyApOworCisgICAgIyBJZiByZWRpcmVjdGlvbiBpcyBub3QgcmVxdWlyZWQsIGV4aXQuCisgICAgaWYgKCBub3QgZXhpc3RzKCAkYXJnLT57IHJlZGlyIH0gKSApIHsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfTsgIyBpZgorCisgICAgIyBJbnB1dCBwYXJhbWV0ZXJzLgorICAgIG15ICRtb2RlICAgPSAkYXJnLT57IG1vZGUgICB9OyAjIE1vZGUsICI8IiAoaW5wdXQgKSBvciAiPiIgKG91dHB1dCkuCisgICAgbXkgJGhhbmRsZSA9ICRhcmctPnsgaGFuZGxlIH07ICMgSGFuZGxlIHRvIG1hbmlwdWxhdGUuCisgICAgbXkgJHJlZGlyICA9ICRhcmctPnsgcmVkaXIgIH07ICMgRGF0YSwgYSBmaWxlIG5hbWUgaWYgYSBzY2FsYXIsIG9yIGZpbGUgY29udGVudHMsIGlmIGEgcmVmZXJlbmNlLgorCisgICAgIyBPdXRwdXQgcGFyYW1ldGVycy4KKyAgICBteSAkc2F2ZV9oYW5kbGU7CisgICAgbXkgJHRlbXBfaGFuZGxlOworICAgIG15ICR0ZW1wX25hbWU7CisKKyAgICAjIFNhdmUgb3JpZ2luYWwgaGFuZGxlIChieSBkdXBpbmcgaXQpLgorICAgICRzYXZlX2hhbmRsZSA9IFN5bWJvbDo6Z2Vuc3ltKCk7CisgICAgJGhhbmRsZS0+Zmx1c2goKTsKKyAgICBvcGVuKCAkc2F2ZV9oYW5kbGUsICRtb2RlIC4gIiYiIC4gJGhhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBQcmVwYXJlIGEgZmlsZSB0byBJTy4KKyAgICBpZiAoIFVOSVZFUlNBTDo6aXNhKCAkcmVkaXIsICJJTzo6SGFuZGxlIiApIG9yICggcmVmKCAkcmVkaXIgKSBlcSAiR0xPQiIgKSApIHsKKyAgICAgICAgIyAkcmVkaXIgaXMgcmVmZXJlbmNlIHRvIGFuIG9iamVjdCBvZiBJTzo6SGFuZGxlIGNsYXNzIChvciBpdHMgZGVjZWRhbnQpLgorICAgICAgICAkdGVtcF9oYW5kbGUgPSAkcmVkaXI7CisgICAgfSBlbHNpZiAoIHJlZiggJHJlZGlyICkgKSB7CisgICAgICAgICMgJHJlZGlyIGlzIGEgcmVmZXJlbmNlIHRvIGNvbnRlbnQgdG8gYmUgcmVhZC93cml0dGVuLgorICAgICAgICAjIFByZXBhcmUgdGVtcCBmaWxlLgorICAgICAgICAoICR0ZW1wX2hhbmRsZSwgJHRlbXBfbmFtZSApID0KKyAgICAgICAgICAgIEZpbGU6OlRlbXA6OnRlbXBmaWxlKAorICAgICAgICAgICAgICAgICIkdG9vbC5YWFhYWFhYWCIsCisgICAgICAgICAgICAgICAgRElSICAgID0+IEZpbGU6OlNwZWMtPnRtcGRpcigpLAorICAgICAgICAgICAgICAgIFNVRkZJWCA9PiAiLnRtcCIsCisgICAgICAgICAgICAgICAgVU5MSU5LID0+IDEKKyAgICAgICAgICAgICk7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICR0ZW1wX2hhbmRsZSApICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkNvdWxkIG5vdCBjcmVhdGUgdGVtcCBmaWxlLiIgKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICBpZiAoICRtb2RlIGVxICI8IiApIHsKKyAgICAgICAgICAgICMgSXQgaXMgYSBmaWxlIHRvIGJlIHJlYWQgYnkgY2hpbGQsIHByZXBhcmUgZmlsZSBjb250ZW50IHRvIGJlIHJlYWQuCisgICAgICAgICAgICAkdGVtcF9oYW5kbGUtPnByaW50KCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiID8gJHsgJHJlZGlyIH0gOiBAeyAkcmVkaXIgfSApOworICAgICAgICAgICAgJHRlbXBfaGFuZGxlLT5mbHVzaCgpOworICAgICAgICAgICAgc2VlayggJHRlbXBfaGFuZGxlLCAwLCAwICk7CisgICAgICAgICAgICAgICAgIyBVbmZvcnR1bmF0ZWxseSwgSSBjb3VsZCBub3QgdXNlIE9PIGludGVyZmFjZSB0byBzZWVrLgorICAgICAgICAgICAgICAgICMgQWN0aXZlUGVybCA1LjYuMSBjb21wbGFpbnMgb24gYm90aCBmb3JtczoKKyAgICAgICAgICAgICAgICAjICAgICR0ZW1wX2hhbmRsZS0+c2VlayggMCApOyAgICAjIEFzIGRlY2xhcmVkIGluIElPOjpTZWVrYWJsZS4KKyAgICAgICAgICAgICAgICAjICAgICR0ZW1wX2hhbmRsZS0+c2V0cG9zKCAwICk7ICAjIEFzIGRlc2NyaWJlZCBpbiBkb2N1bWVudGF0aW9uLgorICAgICAgICB9IGVsc2lmICggJG1vZGUgZXEgIj4iICkgeworICAgICAgICAgICAgIyBJdCBpcyBhIGZpbGUgZm9yIG91dHB1dC4gQ2xlYXIgb3V0cHV0IHZhcmlhYmxlLgorICAgICAgICAgICAgaWYgKCByZWYoICRyZWRpciApIGVxICJTQ0FMQVIiICkgeworICAgICAgICAgICAgICAgICR7ICRyZWRpciB9ID0gIiI7CisgICAgICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgICAgIEB7ICRyZWRpciB9ID0gKCk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2UgeworICAgICAgICAjICRyZWRpciBpcyBhIG5hbWUgb2YgZmlsZSB0byBiZSByZWFkL3dyaXR0ZW4uCisgICAgICAgICMgSnVzdCBvcGVuIGZpbGUuCisgICAgICAgIGlmICggZGVmaW5lZCggJHJlZGlyICkgKSB7CisgICAgICAgICAgICAkdGVtcF9uYW1lID0gJHJlZGlyOworICAgICAgICB9IGVsc2UgeworICAgICAgICAgICAgJHRlbXBfbmFtZSA9IEZpbGU6OlNwZWMtPmRldm51bGwoKTsKKyAgICAgICAgfTsgIyBpZgorICAgICAgICAkdGVtcF9oYW5kbGUgPSBJTzo6RmlsZS0+bmV3KCAkdGVtcF9uYW1lLCAkbW9kZSApCisgICAgICAgICAgICBvciBydW50aW1lX2Vycm9yKCAiZmlsZSBcIiR0ZW1wX25hbWVcIiBjb3VsZCBub3QgYmUgb3BlbmVkIGZvciAiIC4gKCAkbW9kZSBlcSAiPCIgPyAiaW5wdXQiIDogIm91dHB1dCIgKSAuICI6ICQhIiApOworICAgIH07ICMgaWYKKworICAgICMgUmVkaXJlY3QgaGFuZGxlIHRvIHRlbXAgZmlsZS4KKyAgICBvcGVuKCAkaGFuZGxlLCAkbW9kZSAuICImIiAuICR0ZW1wX2hhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBTYXZlIG91dHB1dCBwYXJhbWV0ZXJzLgorICAgICRhcmctPnsgc2F2ZV9oYW5kbGUgfSA9ICRzYXZlX2hhbmRsZTsKKyAgICAkYXJnLT57IHRlbXBfaGFuZGxlIH0gPSAkdGVtcF9oYW5kbGU7CisgICAgJGFyZy0+eyB0ZW1wX25hbWUgICB9ID0gJHRlbXBfbmFtZTsKKworfTsgIyBzdWIgX3ByZQorCisKK3N1YiBfcG9zdCB7CisKKyAgICBteSAkYXJnID0gc2hpZnQoIEBfICk7CisKKyAgICAjIElucHV0IHBhcmFtZXRlcnMuCisgICAgbXkgJG1vZGUgICA9ICRhcmctPnsgbW9kZSAgIH07ICMgTW9kZSwgIjwiIG9yICI+Ii4KKyAgICBteSAkaGFuZGxlID0gJGFyZy0+eyBoYW5kbGUgfTsgIyBIYW5kbGUgdG8gc2F2ZSBhbmQgc2V0LgorICAgIG15ICRyZWRpciAgPSAkYXJnLT57IHJlZGlyICB9OyAjIERhdGEsIGEgZmlsZSBuYW1lIGlmIGEgc2NhbGFyLCBvciBmaWxlIGNvbnRlbnRzLCBpZiBhIHJlZmVyZW5jZS4KKworICAgICMgUGFyYW1ldGVycyBzYXZlZCBkdXJpbmcgcHJlcHJvY2Vzc2luZy4KKyAgICBteSAkc2F2ZV9oYW5kbGUgPSAkYXJnLT57IHNhdmVfaGFuZGxlIH07CisgICAgbXkgJHRlbXBfaGFuZGxlID0gJGFyZy0+eyB0ZW1wX2hhbmRsZSB9OworICAgIG15ICR0ZW1wX25hbWUgICA9ICRhcmctPnsgdGVtcF9uYW1lICAgfTsKKworICAgICMgSWYgbm8gaGFuZGxlIHdhcyBzYXZlZCwgZXhpdC4KKyAgICBpZiAoIG5vdCAkc2F2ZV9oYW5kbGUgKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH07ICMgaWYKKworICAgICMgQ2xvc2UgaGFuZGxlLgorICAgICRoYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgZGllKCAiJCEiICk7CisKKyAgICAjIFJlYWQgdGhlIGNvbnRlbnQgb2YgdGVtcCBmaWxlLCBpZiBuZWNlc3NhcnksIGFuZCBjbG9zZSB0ZW1wIGZpbGUuCisgICAgaWYgKCAoICRtb2RlIG5lICI8IiApIGFuZCByZWYoICRyZWRpciApICkgeworICAgICAgICAkdGVtcF9oYW5kbGUtPmZsdXNoKCk7CisgICAgICAgIHNlZWsoICR0ZW1wX2hhbmRsZSwgMCwgMCApOworICAgICAgICBpZiAoICReTyA9fiBtL01TV2luLyApIHsKKyAgICAgICAgICAgIGJpbm1vZGUoICR0ZW1wX2hhbmRsZSwgIjpjcmxmIiApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIGlmICggcmVmKCAkcmVkaXIgKSBlcSAiU0NBTEFSIiApIHsKKyAgICAgICAgICAgICR7ICRyZWRpciB9IC49IGpvaW4oICIiLCAkdGVtcF9oYW5kbGUtPmdldGxpbmVzKCkgKTsKKyAgICAgICAgfSBlbHNpZiAoIHJlZiggJHJlZGlyICkgZXEgIkFSUkFZIiApIHsKKyAgICAgICAgICAgIHB1c2goIEB7ICRyZWRpciB9LCAkdGVtcF9oYW5kbGUtPmdldGxpbmVzKCkgKTsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgaWYKKyAgICBpZiAoIG5vdCBVTklWRVJTQUw6OmlzYSggJHJlZGlyLCAiSU86OkhhbmRsZSIgKSApIHsKKyAgICAgICAgJHRlbXBfaGFuZGxlLT5jbG9zZSgpCisgICAgICAgICAgICBvciBkaWUoICIkISIgKTsKKyAgICB9OyAjIGlmCisKKyAgICAjIFJlc3RvcmUgaGFuZGxlIHRvIG9yaWdpbmFsIHZhbHVlLgorICAgICRzYXZlX2hhbmRsZS0+Zmx1c2goKTsKKyAgICBvcGVuKCAkaGFuZGxlLCAkbW9kZSAuICImIiAuICRzYXZlX2hhbmRsZS0+ZmlsZW5vKCkgKQorICAgICAgICBvciBkaWUoICJDYW5ub3QgZHVwIGZpbGVoYW5kbGU6ICQhIiApOworCisgICAgIyBDbG9zZSBzYXZlIGhhbmRsZS4KKyAgICAkc2F2ZV9oYW5kbGUtPmNsb3NlKCkKKyAgICAgICAgb3IgZGllKCAiJCEiICk7CisKKyAgICAjIERlbGV0ZSBwYXJhbWV0ZXJzIHNhdmVkIGR1cmluZyBwcmVwcm9jZXNzaW5nLgorICAgIGRlbGV0ZSggJGFyZy0+eyBzYXZlX2hhbmRsZSB9ICk7CisgICAgZGVsZXRlKCAkYXJnLT57IHRlbXBfaGFuZGxlIH0gKTsKKyAgICBkZWxldGUoICRhcmctPnsgdGVtcF9uYW1lICAgfSApOworCit9OyAjIHN1YiBfcG9zdAorCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWl0ZW0gQzxleGVjdXRlKCBbIEBjb21tYW5kIF0sIEBvcHRpb25zICk+CisKK0V4ZWN1dGUgc3BlY2lmaWVkIHByb2dyYW0gb3Igc2hlbGwgY29tbWFuZC4KKworUHJvZ3JhbSBpcyBzcGVjaWZpZWQgYnkgcmVmZXJlbmNlIHRvIGFuIGFycmF5LCB0aGF0IGFycmF5IGlzIHBhc3NlZCB0byBDPHN5c3RlbSgpPiBmdW5jdGlvbiB3aGljaAorZXhlY3V0ZXMgdGhlIGNvbW1hbmQuIFNlZSBMPHBlcmxmdW5jPiBmb3IgZGV0YWlscyBob3cgQzxzeXN0ZW0oKT4gaW50ZXJwcmV0cyB2YXJpb3VzIGZvcm1zIG9mCitDPEBjb21tYW5kPi4KKworQnkgZGVmYXVsdCwgaW4gY2FzZSBvZiBhbnkgZXJyb3IgZXJyb3IgbWVzc2FnZSBpcyBpc3N1ZWQgYW5kIHNjcmlwdCB0ZXJtaW5hdGVkIChieSBydW50aW1lX2Vycm9yKCkpLgorRnVuY3Rpb24gcmV0dXJucyBhbiBleGl0IGNvZGUgb2YgcHJvZ3JhbS4KKworQWx0ZXJuYXRpdmVseSwgaGUgZnVuY3Rpb24gbWF5IHJldHVybiBleGl0IHN0YXR1cyBvZiB0aGUgcHJvZ3JhbSAoc2VlIEM8LWlnbm9yZV9zdGF0dXM+KSBvciBzaWduYWwKKyhzZWUgQzwtaWdub3JlX3NpZ25hbD4pIHNvIGNhbGxlciBtYXkgYW5hbHl6ZSBpdCBhbmQgY29udGludWUgZXhlY3V0aW9uLgorCitPcHRpb25zOgorCis9b3ZlcgorCis9aXRlbSBDPC1zdGRpbj4KKworUmVkaXJlY3Qgc3RkaW4gb2YgcHJvZ3JhbS4gVGhlIHZhbHVlIG9mIG9wdGlvbiBjYW4gYmU6CisKKz1vdmVyCisKKz1pdGVtIEM8dW5kZWY+CisKK1N0ZGluIG9mIGNoaWxkIGlzIGF0dGFjaGVkIHRvIG51bGwgZGV2aWNlLgorCis9aXRlbSBhIHN0cmluZworCitTdGRpbiBvZiBjaGlsZCBpcyBhdHRhY2hlZCB0byBhIGZpbGUgd2l0aCBuYW1lIHNwZWNpZmllZCBieSBvcHRpb24uCisKKz1pdGVtIGEgcmVmZXJlbmNlIHRvIGEgc2NhbGFyCisKK0EgZGVyZWZlcmVuY2VkIHNjYWxhciBpcyB3cml0dGVuIHRvIGEgdGVtcCBmaWxlLCBhbmQgY2hpbGQncyBzdGRpbiBpcyBhdHRhY2hlZCB0byB0aGF0IGZpbGUuCisKKz1pdGVtIGEgcmVmZXJlbmNlIHRvIGFuIGFycmF5CisKK0EgZGVyZWZlcmVuY2VkIGFycmF5IGlzIHdyaXR0ZW4gdG8gYSB0ZW1wIGZpbGUsIGFuZCBjaGlsZCdzIHN0ZGluIGlzIGF0dGFjaGVkIHRvIHRoYXQgZmlsZS4KKworPWJhY2sKKworPWl0ZW0gQzwtc3Rkb3V0PgorCitSZWRpcmVjdCBzdGRvdXQuIFBvc3NpYmxlIHZhbHVlcyBhcmUgdGhlIHNhbWUgYXMgZm9yIEM8LXN0ZGluPiBvcHRpb24uIFRoZSBvbmx5IGRpZmZlcmVuY2UgaXMKK3JlZmVyZW5jZSBzcGVjaWZpZXMgYSB2YXJpYWJsZSByZWNlaXZpbmcgcHJvZ3JhbSdzIG91dHB1dC4KKworPWl0ZW0gQzwtc3RkZXJyPgorCitJdCBzaW1pbGFyIHRvIEM8LXN0ZG91dD4sIGJ1dCByZWRpcmVjdHMgc3RkZXJyLiBUaGVyZSBpcyBvbmx5IG9uZSBhZGRpdGlvbmFsIHZhbHVlOgorCis9b3ZlcgorCis9aXRlbSBhbiBlbXB0eSBzdHJpbmcKKworbWVhbnMgdGhhdCBzdGRlcnIgc2hvdWxkIGJlIHJlZGlyZWN0ZWQgdG8gdGhlIHNhbWUgcGxhY2Ugd2hlcmUgc3Rkb3V0IGlzIHJlZGlyZWN0ZWQgdG8uCisKKz1iYWNrCisKKz1pdGVtIEM8LWFwcGVuZD4KKworUmVkaXJlY3RlZCBzdHJlYW0gd2lsbCBub3Qgb3ZlcndyaXRlIHByZXZpb3VzIGNvbnRlbnQgb2YgZmlsZSAob3IgdmFyaWFibGUpLgorTm90ZSwgdGhhdCBvcHRpb24gYWZmZWN0cyBib3RoIHN0ZG91dCBhbmQgc3RkZXJyLgorCis9aXRlbSBDPC1pZ25vcmVfc3RhdHVzPgorCitCeSBkZWZhdWx0LCBzdWJyb3V0aW5lIHJhaXNlcyBhbiBlcnJvciBhbmQgZXhpdHMgdGhlIHNjcmlwdCBpZiBwcm9ncmFtIHJldHVybnMgbm9uLWV4aXQgc3RhdHVzLiBJZgordGhpcyBvcHRpb25zIGlzIHRydWUsIG5vIGVycm9yIGlzIHJhaXNlZC4gSW5zdGVhZCwgc3RhdHVzIGlzIHJldHVybmVkIGFzIGZ1bmN0aW9uIHJlc3VsdCAoYW5kICRAIGlzCitzZXQgdG8gZXJyb3IgbWVzc2FnZSkuCisKKz1pdGVtIEM8LWlnbm9yZV9zaWduYWw+CisKK0J5IGRlZmF1bHQsIHN1YnJvdXRpbmUgcmFpc2VzIGFuIGVycm9yIGFuZCBleGl0cyB0aGUgc2NyaXB0IGlmIHByb2dyYW0gZGllIHdpdGggc2lnbmFsLiBJZgordGhpcyBvcHRpb25zIGlzIHRydWUsIG5vIGVycm9yIGlzIHJhaXNlZCBpbiBzdWNoIGEgY2FzZS4gSW5zdGVhZCwgc2lnbmFsIG51bWJlciBpcyByZXR1cm5lZCAoYXMKK25lZ2F0aXZlIHZhbHVlKSwgZXJyb3IgbWVzc2FnZSBpcyBwbGFjZWQgdG8gQzwkQD4gdmFyaWFibGUuCisKK0lmIGNvbW1hbmQgaXMgbm90IGV2ZW4gc3RhcnRlZCwgLTI1NiBpcyByZXR1cm5lZC4KKworPWJhY2sKKworRXhhbXBsZXM6CisKKyAgICBleGVjdXRlKCBbICJjbWQuZXhlIiwgIi9jIiwgImRpciIgXSApOworICAgICAgICAjIEV4ZWN1dGUgTlQgc2hlbGwgd2l0aCBzcGVjaWZpZWQgb3B0aW9ucywgbm8gcmVkaXJlY3Rpb25zIGFyZQorICAgICAgICAjIG1hZGUuCisKKyAgICBteSAkb3V0cHV0OworICAgIGV4ZWN1dGUoIFsgImN2cyIsICItbiIsICItcSIsICJ1cGRhdGUiLCAiLiIgXSwgLXN0ZG91dCA9PiBcJG91dHB1dCApOworICAgICAgICAjIEV4ZWN1dGUgImN2cyAtbiAtcSB1cGRhdGUgLiIgY29tbWFuZCwgb3V0cHV0IGlzIHNhdmVkCisgICAgICAgICMgaW4gJG91dHB1dCB2YXJpYWJsZS4KKworICAgIG15IEBvdXRwdXQ7CisgICAgZXhlY3V0ZSggWyBxdyggY3ZzIC1uIC1xIHVwZGF0ZSAuICkgXSwgLXN0ZG91dCA9PiBcQG91dHB1dCwgLXN0ZGVyciA9PiB1bmRlZiApOworICAgICAgICAjIEV4ZWN1dGUgc3BlY2lmaWVkIGNvbW1hbmQsICBvdXRwdXQgaXMgc2F2ZWQgaW4gQG91dHB1dAorICAgICAgICAjIHZhcmlhYmxlLCBzdGRlcnIgc3RyZWFtIGlzIHJlZGlyZWN0ZWQgdG8gbnVsbCBkZXZpY2UKKyAgICAgICAgIyAoL2Rldi9udWxsIGluIExpbnV4KiBPUyBhbiBudWwgaW4gV2luZG93cyogT1MpLgorCis9Y3V0CisKK3N1YiBleGVjdXRlKCRAKSB7CisKKyAgICAjICEhISBBZGQgc29tZXRoaW5nIHRvIGNvbXBsYWluIG9uIHVua25vd24gb3B0aW9ucy4uLgorCisgICAgbXkgJGNvbW1hbmQgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgICA9IEBfOworICAgIG15ICRwcmVmaXggID0gIkNvdWxkIG5vdCBleGVjdXRlICRjb21tYW5kLT5bIDAgXSI7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLXN0ZGluIC1zdGRvdXQgLXN0ZGVyciAtYXBwZW5kIC1pZ25vcmVfc3RhdHVzIC1pZ25vcmVfc2lnbmFsICkgXSApOworCisgICAgaWYgKCByZWYoICRjb21tYW5kICkgbmUgIkFSUkFZIiApIHsKKyAgICAgICAgQ2FycDo6Y3JvYWsoICJleGVjdXRlOiAkY29tbWFuZCBtdXN0IGJlIGEgcmVmZXJlbmNlIHRvIGFycmF5IiApOworICAgIH07ICMgaWYKKworICAgIG15ICRzdGRpbiAgPSB7IGhhbmRsZSA9PiBcKlNURElOLCAgbW9kZSA9PiAiPCIgfTsKKyAgICBteSAkc3Rkb3V0ID0geyBoYW5kbGUgPT4gXCpTVERPVVQsIG1vZGUgPT4gIj4iIH07CisgICAgbXkgJHN0ZGVyciA9IHsgaGFuZGxlID0+IFwqU1RERVJSLCBtb2RlID0+ICI+IiB9OworICAgIG15ICRzdHJlYW1zID0geworICAgICAgICBzdGRpbiAgPT4gJHN0ZGluLAorICAgICAgICBzdGRvdXQgPT4gJHN0ZG91dCwKKyAgICAgICAgc3RkZXJyID0+ICRzdGRlcnIKKyAgICB9OyAjICRzdHJlYW1zCisKKyAgICBmb3IgbXkgJHN0cmVhbSAoIHF3KCBzdGRpbiBzdGRvdXQgc3RkZXJyICkgKSB7CisgICAgICAgIGlmICggZXhpc3RzKCAkb3B0c3sgIi0kc3RyZWFtIiB9ICkgKSB7CisgICAgICAgICAgICBpZiAoIHJlZiggJG9wdHN7ICItJHN0cmVhbSIgfSApICF+IG0vXEEofFNDQUxBUnxBUlJBWSlcei8gKSB7CisgICAgICAgICAgICAgICAgQ2FycDo6Y3JvYWsoICJleGVjdXRlOiAtJHN0cmVhbSBvcHRpb246IG11c3QgaGF2ZSB2YWx1ZSBvZiBzY2FsYXIsIG9yIHJlZmVyZW5jZSB0byAoc2NhbGFyIG9yIGFycmF5KS4iICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgcmVkaXIgfSA9ICRvcHRzeyAiLSRzdHJlYW0iIH07CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCAkb3B0c3sgLWFwcGVuZCB9IGFuZCAoICRzdHJlYW1zLT57ICRzdHJlYW0gfS0+eyBtb2RlIH0gKSBlcSAiPiIgKSB7CisgICAgICAgICAgICAkc3RyZWFtcy0+eyAkc3RyZWFtIH0tPnsgbW9kZSB9ID0gIj4+IjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yZWFjaCAkc3RyZWFtCisKKyAgICBfcHJlKCAkc3RkaW4gICk7CisgICAgX3ByZSggJHN0ZG91dCApOworICAgIGlmICggZGVmaW5lZCggJHN0ZGVyci0+eyByZWRpciB9ICkgYW5kIG5vdCByZWYoICRzdGRlcnItPnsgcmVkaXIgfSApIGFuZCAoICRzdGRlcnItPnsgcmVkaXIgfSBlcSAiIiApICkgeworICAgICAgICBpZiAoIGV4aXN0cyggJHN0ZG91dC0+eyByZWRpciB9ICkgKSB7CisgICAgICAgICAgICAkc3RkZXJyLT57IHJlZGlyIH0gPSAkc3Rkb3V0LT57IHRlbXBfaGFuZGxlIH07CisgICAgICAgIH0gZWxzZSB7CisgICAgICAgICAgICAkc3RkZXJyLT57IHJlZGlyIH0gPSAkeyAkc3Rkb3V0LT57IGhhbmRsZSB9IH07CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGlmCisgICAgX3ByZSggJHN0ZGVyciApOworICAgIG15ICRyYyA9IHN5c3RlbSggQCRjb21tYW5kICk7CisgICAgbXkgJGVycm5vID0gJCE7CisgICAgbXkgJGNoaWxkID0gJD87CisgICAgX3Bvc3QoICRzdGRlcnIgKTsKKyAgICBfcG9zdCggJHN0ZG91dCApOworICAgIF9wb3N0KCAkc3RkaW4gICk7CisKKyAgICBteSAkZXhpdCA9IDA7CisgICAgbXkgJHNpZ25hbF9udW0gID0gJGNoaWxkICYgMTI3OworICAgIG15ICRleGl0X3N0YXR1cyA9ICRjaGlsZCA+PiA4OworICAgICRAID0gIiI7CisKKyAgICBpZiAoICRyYyA9PSAtMSApIHsKKyAgICAgICAgJEAgPSAiXCIkY29tbWFuZC0+WyAwIF1cIiBmYWlsZWQ6ICRlcnJubyI7CisgICAgICAgICRleGl0ID0gLTI1NjsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc2lnbmFsIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfSBlbHNpZiAoICRzaWduYWxfbnVtICE9IDAgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgZmFpbGVkIGR1ZSB0byBzaWduYWwgJHNpZ25hbF9udW0uIjsKKyAgICAgICAgJGV4aXQgPSAtICRzaWduYWxfbnVtOworICAgICAgICBpZiAoIG5vdCAkb3B0c3sgLWlnbm9yZV9zaWduYWwgfSApIHsKKyAgICAgICAgICAgIHJ1bnRpbWVfZXJyb3IoICRAICk7CisgICAgICAgIH07ICMgaWYKKyAgICB9IGVsc2lmICggJGV4aXRfc3RhdHVzICE9IDAgKSB7CisgICAgICAgICRAID0gIlwiJGNvbW1hbmQtPlsgMCBdXCIgcmV0dXJuZWQgbm9uLXplcm8gc3RhdHVzICRleGl0X3N0YXR1cy4iOworICAgICAgICAkZXhpdCA9ICRleGl0X3N0YXR1czsKKyAgICAgICAgaWYgKCBub3QgJG9wdHN7IC1pZ25vcmVfc3RhdHVzIH0gKSB7CisgICAgICAgICAgICBydW50aW1lX2Vycm9yKCAkQCApOworICAgICAgICB9OyAjIGlmCisgICAgfTsgIyBpZgorCisgICAgcmV0dXJuICRleGl0OworCit9OyAjIHN1YiBleGVjdXRlCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCis9aXRlbSBDPGJhY2t0aWNrcyggWyBAY29tbWFuZCBdLCBAb3B0aW9ucyApPgorCitSdW4gc3BlY2lmaWVkIHByb2dyYW0gb3Igc2hlbGwgY29tbWFuZCBhbmQgcmV0dXJuIG91dHB1dC4KKworSW4gc2NhbGFyIGNvbnRleHQgZW50aXJlIG91dHB1dCBpcyByZXR1cm5lZCBpbiBhIHNpbmdsZSBzdHJpbmcuIEluIGxpc3QgY29udGV4dCBsaXN0IG9mIHN0cmluZ3MKK2lzIHJldHVybmVkLiBGdW5jdGlvbiBpc3N1ZXMgYW4gZXJyb3IgYW5kIGV4aXRzIHNjcmlwdCBpZiBhbnkgZXJyb3Igb2NjdXJzLgorCis9Y3V0CisKKworc3ViIGJhY2t0aWNrcygkQCkgeworCisgICAgbXkgJGNvbW1hbmQgPSBzaGlmdCggQF8gKTsKKyAgICBteSAlb3B0cyAgICA9IEBfOworICAgIG15IEBvdXRwdXQ7CisKKyAgICBjaGVja19vcHRzKCAlb3B0cywgWyBxdyggLWNob21wICkgXSApOworCisgICAgZXhlY3V0ZSggJGNvbW1hbmQsIC1zdGRvdXQgPT4gXEBvdXRwdXQgKTsKKworICAgIGlmICggJG9wdHN7IC1jaG9tcCB9ICkgeworICAgICAgICBjaG9tcCggQG91dHB1dCApOworICAgIH07ICMgaWYKKworICAgIHJldHVybiAoIHdhbnRhcnJheSgpID8gQG91dHB1dCA6IGpvaW4oICIiLCBAb3V0cHV0ICkgKTsKKworfTsgIyBzdWIgYmFja3RpY2tzCisKKyMtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitzdWIgcGFkKCQkJCkgeworICAgIG15ICggJHN0ciwgJGxlbmd0aCwgJHBhZCApID0gQF87CisgICAgbXkgJGxzdHIgPSBsZW5ndGgoICRzdHIgKTsgICAgIyBMZW5ndGggb2Ygc291cmNlIHN0cmluZy4KKyAgICBpZiAoICRsc3RyIDwgJGxlbmd0aCApIHsKKyAgICAgICAgbXkgJGxwYWQgID0gbGVuZ3RoKCAkcGFkICk7ICAgICAgICAgICAgICAgICAgICAgICAgICMgTGVuZ3RoIG9mIHBhZC4KKyAgICAgICAgbXkgJGNvdW50ID0gaW50KCAoICRsZW5ndGggLSAkbHN0ciApIC8gJGxwYWQgKTsgICAgICMgTnVtYmVyIG9mIHBhZCByZXBldGl0aW9ucy4KKyAgICAgICAgbXkgJHRhaWwgID0gJGxlbmd0aCAtICggJGxzdHIgKyAkbHBhZCAqICRjb3VudCApOworICAgICAgICAkc3RyID0gJHN0ciAuICggJHBhZCB4ICRjb3VudCApIC4gc3Vic3RyKCAkcGFkLCAwLCAkdGFpbCApOworICAgIH07ICMgaWYKKyAgICByZXR1cm4gJHN0cjsKK307ICMgc3ViIHBhZAorCisjIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKz1iYWNrCisKKz1jdXQKKworIy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK3JldHVybiAxOworCisjLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworPWN1dAorCisjIEVuZCBvZiBmaWxlLgpkaWZmIC0tZ2l0IGEvcmMzL3J1bnRpbWUvdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwgYi9yYzMvcnVudGltZS90b29scy9tZXNzYWdlLWNvbnZlcnRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5lMjJjOTI4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3J1bnRpbWUvdG9vbHMvbWVzc2FnZS1jb252ZXJ0ZXIucGwKQEAgLTAsMCArMSw3NzUgQEAKKyMhL3Vzci9iaW4vcGVybAorCisjCisjLy89PT0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tPT09Ly8KKyMvLworIy8vICAgICAgICAgICAgICAgICAgICAgVGhlIExMVk0gQ29tcGlsZXIgSW5mcmFzdHJ1Y3R1cmUKKyMvLworIy8vIFRoaXMgZmlsZSBpcyBkdWFsIGxpY2Vuc2VkIHVuZGVyIHRoZSBNSVQgYW5kIHRoZSBVbml2ZXJzaXR5IG9mIElsbGlub2lzIE9wZW4KKyMvLyBTb3VyY2UgTGljZW5zZXMuIFNlZSBMSUNFTlNFLnR4dCBmb3IgZGV0YWlscy4KKyMvLworIy8vPT09LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLT09PS8vCisjCisKK3VzZSBzdHJpY3Q7Cit1c2Ugd2FybmluZ3M7CisKK3VzZSBGaWxlOjpHbG9iICI6Z2xvYiI7Cit1c2UgRW5jb2RlIHF3eyBlbmNvZGUgfTsKKwordXNlIEZpbmRCaW47Cit1c2UgbGliICIkRmluZEJpbjo6QmluL2xpYiI7CisKK3VzZSB0b29sczsKKworb3VyICRWRVJTSU9OID0gIjAuMDQiOworbXkgJGVzY2FwZSAgICAgID0gcXJ7JX07CitteSAkcGxhY2Vob2xkZXIgPSBxcnsoXGQpXCQoc3xsP1tkdV0pfTsKK215ICR0YXJnZXRfb3M7CisKK215ICRzZWN0aW9ucyA9CisgICAgeworICAgICAgICBtZXRhICAgICA9PiB7IHNob3J0ID0+ICJwcnAiIH0sICMgInBycCIgc3RhbmRzIGZvciAicHJvcGVydHkiLgorICAgICAgICBzdHJpbmdzICA9PiB7IHNob3J0ID0+ICJzdHIiIH0sCisgICAgICAgIGZvcm1hdHMgID0+IHsgc2hvcnQgPT4gImZtdCIgfSwKKyAgICAgICAgbWVzc2FnZXMgPT4geyBzaG9ydCA9PiAibXNnIiB9LAorICAgICAgICBoaW50cyAgICA9PiB7IHNob3J0ID0+ICJobnQiIH0sCisgICAgfTsKK215IEBzZWN0aW9ucyA9IHF3eyBtZXRhIHN0cmluZ3MgZm9ybWF0cyBtZXNzYWdlcyBoaW50cyB9OworIyBBc3NpZ24gc2VjdGlvbiBwcm9wZXJ0aWVzOiBsb25nIG5hbWUsIHNldCBudW1iZXIsIGJhc2UgbnVtYmVyLgorbWFwKCAkc2VjdGlvbnMtPnsgJHNlY3Rpb25zWyAkXyBdIH0tPnsgbG9uZyB9ID0gJHNlY3Rpb25zWyAkXyBdLCAgICAgICggMCAuLiBAc2VjdGlvbnMgLSAxICkgKTsKK21hcCggJHNlY3Rpb25zLT57ICRzZWN0aW9uc1sgJF8gXSB9LT57IHNldCAgfSA9ICggJF8gKyAxICksICAgICAgICAgICAoIDAgLi4gQHNlY3Rpb25zIC0gMSApICk7CittYXAoICRzZWN0aW9ucy0+eyAkc2VjdGlvbnNbICRfIF0gfS0+eyBiYXNlIH0gPSAoICggJF8gKyAxICkgPDwgMTYgKSwgKCAwIC4uIEBzZWN0aW9ucyAtIDEgKSApOworCisjIFByb3BlcnRpZXMgb2YgTWV0YSBzZWN0aW9uLgorbXkgQHByb3BlcnRpZXMgPSBxd3sgTGFuZ3VhZ2UgQ291bnRyeSBMYW5nSWQgVmVyc2lvbiBSZXZpc2lvbiB9OworCisKK3N1YiBfZ2VuZXJhdGVfY29tbWVudCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRvcGVuLCAkY2xvc2UgKSA9IEBfOworICAgIG15ICRidWxrID0KKyAgICAgICAgJG9wZW4gLiAiIERvIG5vdCBlZGl0IHRoaXMgZmlsZSEgIiAuICRjbG9zZSAuICJcbiIgLgorICAgICAgICAkb3BlbiAuICIgVGhlIGZpbGUgd2FzIGdlbmVyYXRlZCBmcm9tICIgLiBnZXRfZmlsZSggJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ICkgLgorICAgICAgICAgICAgIiBieSAiIC4gJHRvb2wgLiAiIG9uICIgLiBsb2NhbHRpbWUoKSAuICIuICIgLiAkY2xvc2UgLiAiXG4iOworICAgIHJldHVybiAkYnVsazsKKworfTsgIyBzdWIgX2dlbmVyYXRlX2NvbW1lbnQKKworCitzdWIgbXNnMnNnbigkKSB7CisKKyAgICAjIENvbnZlcnQgbWVzc2FnZSBzdHJpbmcgdG8gc2lnbmF0dXJlLiBTaWduYXR1cmUgaXMgYSBsaXN0IG9mIHBsYWNlaG9sZGVycyBpbiBzb3J0ZWQgb3JkZXIuCisgICAgIyBGb3IgZXhhbXBsZSwgc2lnbmF0dXJlIG9mICIlMSRzIHZhbHVlIFwiJTIkc1wiIGlzIGludmFsaWQuIiBpcyAiJTEkcyAlMiRzIi4KKworICAgIG15ICggJG1zZyApID0gQF87CisgICAgbXkgQHBsYWNlaG9sZGVyczsKKyAgICBwb3MoICRtc2cgKSA9IDA7CisgICAgd2hpbGUgKCAkbXNnID1+IG17XEcuKj8kZXNjYXBlJHBsYWNlaG9sZGVyfWcgKSB7CisgICAgICAgICRwbGFjZWhvbGRlcnNbICQxIC0gMSBdID0gIiUkMVwkJDIiOworICAgIH07ICMgd2hpbGUKKyAgICBmb3IgKCBteSAkaSA9IDE7ICRpIDw9IEBwbGFjZWhvbGRlcnM7ICsrICRpICkgeworICAgICAgICBpZiAoIG5vdCBkZWZpbmVkKCAkcGxhY2Vob2xkZXJzWyAkaSAtIDEgXSApICkgeworICAgICAgICAgICAgJHBsYWNlaG9sZGVyc1sgJGkgLSAxIF0gPSAiJSRpXCQtIjsKKyAgICAgICAgfTsgIyBpZgorICAgIH07ICMgZm9yICRpCisgICAgcmV0dXJuIGpvaW4oICIgIiwgQHBsYWNlaG9sZGVycyApOworCit9OyAjIHN1YiBtc2cyc2duCisKKworc3ViIG1zZzJzcmMoJCkgeworCisgICAgIyBDb252ZXJ0IG1lc3NhZ2Ugc3RyaW5nIHRvIGEgQyBzdHJpbmcgY29uc3RhbnQuCisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIGlmICggJHRhcmdldF9vcyBlcSAid2luIiApIHsKKyAgICAgICAgJG1zZyA9fiBzeyRlc2NhcGUkcGxhY2Vob2xkZXJ9e1wlJDEhJDIhfWc7CisgICAgfTsgIyBpZgorICAgIHJldHVybiAkbXNnOworCit9OyAjIHN1YiBtc2cyc3JjCisKKworbXkgJHNwZWNpYWwgPQorICAgIHsKKyAgICAgICAgIm4iID0+ICJcbiIsCisgICAgICAgICJ0IiA9PiAiXHQiLAorICAgIH07CisKK3N1YiBtc2cybWMoJCkgeworICAgIG15ICggJG1zZyApID0gQF87CisgICAgJG1zZyA9IG1zZzJzcmMoICRtc2cgKTsgIyBHZXQgd2luZG93cyBzdHlsZSBwbGFjZWhvbGRlcnMuCisgICAgJG1zZyA9fiBze1xcKC4pfXsgZXhpc3RzKCAkc3BlY2lhbC0+eyAkMSB9ICkgPyAkc3BlY2lhbC0+eyAkMSB9IDogJDEgfWdlOworICAgIHJldHVybiAkbXNnOworfTsgIyBzdWIgbXNnMm1jCisKKworCitzdWIgcGFyc2VfbWVzc2FnZSgkKSB7CisKKyAgICBteSAoICRtc2cgKSA9IEBfOworICAgIHBvcyggJG1zZyApID0gMDsKKyAgICBmb3IgKCA7IDsgKSB7CisgICAgICAgIGlmICggJG1zZyAhfiBte1xHLio/JGVzY2FwZX1nYyApIHsKKyAgICAgICAgICAgIGxhc3Q7CisgICAgICAgIH0KKyAgICAgICAgaWYgKCAkbXNnICF+IG17XEckcGxhY2Vob2xkZXJ9Z2MgKSB7CisgICAgICAgICAgICByZXR1cm4gIkJhZCAlLXNlcXVlbmNlIG5lYXIgXCIlIiAuIHN1YnN0ciggJG1zZywgcG9zKCAkbXNnICksIDcgKSAuICJcIiI7CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmV2ZXIKKyAgICByZXR1cm4gdW5kZWY7CisKK307ICMgc3ViIHBhcnNlX21lc3NhZ2UKKworCitzdWIgcGFyc2Vfc291cmNlKCQpIHsKKworICAgIG15ICggJG5hbWUgKSA9IEBfOworCisgICAgbXkgQGJ1bGsgPSByZWFkX2ZpbGUoICRuYW1lLCAtbGF5ZXIgPT4gIjp1dGY4IiApOworICAgIG15ICRkYXRhID0ge307CisKKyAgICBteSAkbGluZTsKKyAgICBteSAkbiA9IDA7ICAgICAgICAgIyBMaW5lIG51bWJlci4KKyAgICBteSAkb2Jzb2xldGUgPSAwOyAgIyBDb3VudGVyIG9mIG9ic29sZXRlIGVudHJpZXMuCisgICAgbXkgJGxhc3RfaWR4OworICAgIG15ICVpZGVudHM7CisgICAgbXkgJHNlY3Rpb247CisKKyAgICBteSAkZXJyb3IgPQorICAgICAgICBzdWIgeworICAgICAgICAgICAgbXkgKCAkbiwgJGxpbmUsICRtc2cgKSA9IEBfOworICAgICAgICAgICAgcnVudGltZV9lcnJvciggIkVycm9yIHBhcnNpbmcgJG5hbWUgbGluZSAkbjogIiAuICIkbXNnOlxuIiAuICIgICAgJGxpbmUiICk7CisgICAgICAgIH07ICMgc3ViCisKKyAgICBmb3JlYWNoICRsaW5lICggQGJ1bGsgKSB7CisgICAgICAgICsrICRuOworICAgICAgICAjIFNraXAgZW1wdHkgbGluZXMgYW5kIGNvbW1lbnRzLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEFccyooXG58Iyl9ICkgeworICAgICAgICAgICAgJGxhc3RfaWR4ID0gdW5kZWY7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICMgUGFyc2Ugc2VjdGlvbiBoZWFkZXIuCisgICAgICAgIGlmICggJGxpbmUgPX4gbXtcQS1cKi1ccyooW0EtWl9dKilccyotXCotXHMqXG5cen1pICkgeworICAgICAgICAgICAgJHNlY3Rpb24gPSAoIGxjKCAkMSApICk7CisgICAgICAgICAgICBpZiAoIG5vdCBncmVwKCAkc2VjdGlvbiBlcSAkXywgQHNlY3Rpb25zICkgKSB7CisgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gc2VjdGlvbiBcIiRzZWN0aW9uXCIgc3BlY2lmaWVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgaWYgKCBleGlzdHMoICRkYXRhLT57ICRzZWN0aW9uIH0gKSApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiTXVsdGlwbGUgc2VjdGlvbnMgb2YgdGhlIHNhbWUgdHlwZSBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAlaWRlbnRzID0gKCk7ICAgICAjIENsZWFuIGxpc3Qgb2Yga25vd24gbWVzc2FnZSBpZGVudGlmaWVycy4KKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgaWYgKCBub3QgZGVmaW5lZCggJHNlY3Rpb24gKSApIHsKKyAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJTZWN0aW9uIGhlYWRpbmcgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBzZWN0aW9uIGJvZHkuCisgICAgICAgIGlmICggJHNlY3Rpb24gZXEgIm1ldGEiICkgeworICAgICAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBKFtBLVpfXVtBLVpfMC05XSopXHMrIiguKikiXHMqP1xuP1x6fWkgKSB7CisgICAgICAgICAgICAgICAgIyBQYXJzZSBtZXRhIHByb3BlcnRpZXMgKHN1Y2ggYXMgTGFuZ3VhZ2UsIENvdW50cnksIGFuZCBMYW5nSWQpLgorICAgICAgICAgICAgICAgIG15ICggJHByb3BlcnR5LCAkdmFsdWUgKSA9ICggJDEsICQyICk7CisgICAgICAgICAgICAgICAgaWYgKCBub3QgZ3JlcCggJF8gZXEgJHByb3BlcnR5ICwgQHByb3BlcnRpZXMgKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlVua25vd24gcHJvcGVydHkgXCIkcHJvcGVydHlcIiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgIGlmICggZXhpc3RzKCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgJHByb3BlcnR5IH0gKSApIHsKKyAgICAgICAgICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IFwiJHByb3BlcnR5XCIgaGFzIGFscmVhZHkgYmVlbiBzcGVjaWZpZWQiICk7CisgICAgICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgICAgICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSA9ICR2YWx1ZTsKKyAgICAgICAgICAgICAgICAkbGFzdF9pZHggPSB1bmRlZjsKKyAgICAgICAgICAgICAgICBuZXh0OworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgJGVycm9yLT4oICRuLCAkbGluZSwgIlByb3BlcnR5IGxpbmUgZXhwZWN0ZWQiICk7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBtZXNzYWdlLgorICAgICAgICBpZiAoICRsaW5lID1+IG17XEEoW0EtWl9dW0EtWl8wLTldKilccysiKC4qKSJccyo/XG4/XHp9aSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbWVzc2FnZSApID0gKCAkMSwgJDIgKTsKKyAgICAgICAgICAgIGlmICggJGlkZW50IGVxICJPQlNPTEVURSIgKSB7CisgICAgICAgICAgICAgICAgIyBJZiBpZCBpcyAiT0JTT0xFVEUiLCBhZGQgYSB1bmlxdWUgc3VmZml4LiBJdCBwcm92aWRlcyBjb252ZW5pZW50IHdheSB0byBtYXJrCisgICAgICAgICAgICAgICAgIyBvYnNvbGV0ZSBtZXNzYWdlcy4KKyAgICAgICAgICAgICAgICArKyAkb2Jzb2xldGU7CisgICAgICAgICAgICAgICAgJGlkZW50IC49ICRvYnNvbGV0ZTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgIGlmICggZXhpc3RzKCAkaWRlbnRzeyAkaWRlbnQgfSApICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJJZGVudGlmaWVyIFwiJGlkZW50XCIgaXMgcmVkZWZpbmVkIiApOworICAgICAgICAgICAgfTsgIyBpZgorICAgICAgICAgICAgIyBDaGVjayAlLXNlcXVlbmNlcy4KKyAgICAgICAgICAgIG15ICRlcnIgPSBwYXJzZV9tZXNzYWdlKCAkbWVzc2FnZSApOworICAgICAgICAgICAgaWYgKCAkZXJyICkgeworICAgICAgICAgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICRlcnIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgU2F2ZSBtZXNzYWdlLgorICAgICAgICAgICAgcHVzaCggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9LCBbICRpZGVudCwgJG1lc3NhZ2UgXSApOworICAgICAgICAgICAgJGlkZW50c3sgJGlkZW50IH0gPSAxOworICAgICAgICAgICAgJGxhc3RfaWR4ID0gQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9IC0gMTsKKyAgICAgICAgICAgIG5leHQ7CisgICAgICAgIH07ICMgaWYKKyAgICAgICAgIyBQYXJzZSBjb250aW51YXRpb24gbGluZS4KKyAgICAgICAgaWYgKCAkbGluZSA9fiBte1xBXHMqIiguKikiXHMqXHp9ICkgeworICAgICAgICAgICAgbXkgJG1lc3NhZ2UgPSAkMTsKKyAgICAgICAgICAgIGlmICggbm90IGRlZmluZWQoICRsYXN0X2lkeCApICApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAiVW5leHBlY3RlZCBjb250aW51YXRpb24gbGluZSIgKTsKKyAgICAgICAgICAgIH07ICMgaWYKKyAgICAgICAgICAgICMgQ2hlY2sgJS1zZXF1ZW5jZXMuCisgICAgICAgICAgICBteSAkZXJyID0gcGFyc2VfbWVzc2FnZSggJG1lc3NhZ2UgKTsKKyAgICAgICAgICAgIGlmICggJGVyciApIHsKKyAgICAgICAgICAgICAgICAkZXJyb3ItPiggJG4sICRsaW5lLCAkZXJyICk7CisgICAgICAgICAgICB9OyAjIGlmCisgICAgICAgICAgICAjIFNhdmUgY29udGludWF0aW9uLgorICAgICAgICAgICAgJGRhdGEtPnsgJHNlY3Rpb24gfS0+WyAkbGFzdF9pZHggXS0+WyAxIF0gLj0gJG1lc3NhZ2U7CisgICAgICAgICAgICBuZXh0OworICAgICAgICB9OyAjIGlmCisgICAgICAgICRlcnJvci0+KCAkbiwgJGxpbmUsICJNZXNzYWdlIGRlZmluaXRpb24gZXhwZWN0ZWQiICk7CisgICAgfTsgIyBmb3JlYWNoCisgICAgJGRhdGEtPnsgIiVtZXRhIiB9LT57IHNvdXJjZSB9ID0gJG5hbWU7CisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgaWYgKCBub3QgZXhpc3RzKCAkZGF0YS0+eyAkc2VjdGlvbiB9ICkgKSB7CisgICAgICAgICAgICAkZGF0YS0+eyAkc2VjdGlvbiB9ID0gW107CisgICAgICAgIH07ICMgaWYKKyAgICB9OyAjIGZvcmVhY2ggJHNlY3Rpb24KKworICAgIGZvcmVhY2ggbXkgJHByb3BlcnR5ICggQHByb3BlcnRpZXMgKSB7CisgICAgICAgIGlmICggbm90IGRlZmluZWQoICRkYXRhLT57ICIlbWV0YSIgfS0+eyAkcHJvcGVydHkgfSApICkgeworICAgICAgICAgICAgcnVudGltZV9lcnJvcigKKyAgICAgICAgICAgICAgICAiRXJyb3IgcGFyc2luZyAkbmFtZTogIiAuCisgICAgICAgICAgICAgICAgICAgICJSZXF1aXJlZCBcIiRwcm9wZXJ0eVwiIHByb3BlcnR5IGlzIG5vdCBzcGVjaWZpZWQiCisgICAgICAgICAgICApOworICAgICAgICB9OyAjIGlmCisgICAgICAgIHB1c2goIEB7ICRkYXRhLT57IG1ldGEgfSB9LCBbICRwcm9wZXJ0eSwgJGRhdGEtPnsgIiVtZXRhIiB9LT57ICRwcm9wZXJ0eSB9IF0gKTsKKyAgICB9OyAjIGZvcmVhY2gKKworICAgIHJldHVybiAkZGF0YTsKKworfTsgIyBzdWIgcGFyc2Vfc291cmNlCisKKworc3ViIGdlbmVyYXRlX2VudW0oJCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSwgJHByZWZpeCApID0gQF87CisgICAgbXkgJGJ1bGsgPSAiIjsKKworICAgICRidWxrID0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgImVudW0gJHtwcmVmaXh9X2lkIHtcblxuIiAuCisgICAgICAgICIgICAgLy8gQSBzcGVjaWFsIGlkIGZvciBhYnNlbmNlIG9mIG1lc3NhZ2UuXG4iIC4KKyAgICAgICAgIiAgICAke3ByZWZpeH1fbnVsbCA9IDAsXG5cbiI7CisKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgIG15ICRzaG9ydCA9ICRwcm9wcy0+eyBzaG9ydCB9OyAgICAgICAgICAjIFNob3J0IHNlY3Rpb24gbmFtZSwgZnJlcXVlbnRseSB1c2VkLgorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAvLyBTZXQgIyRwcm9wcy0+eyBzZXQgfSwgJHByb3BzLT57IGxvbmcgfS5cbiIgLgorICAgICAgICAgICAgIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fZmlyc3QgPSAkcHJvcHMtPnsgYmFzZSB9LFxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCB1bmRlZiApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fJHtpZGVudH0sXG4iOworICAgICAgICB9OyAjIGZvcmVhY2gKKyAgICAgICAgJGJ1bGsgLj0gIiAgICAke3ByZWZpeH1fJHtzaG9ydH1fbGFzdCxcblxuIjsKKyAgICB9OyAjIGZvcmVhY2ggJHR5cGUKKyAgICAkYnVsayAuPSAiICAgICR7cHJlZml4fV94eHhfbGFzdGVzdFxuXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIn07IC8vIGVudW0gJHtwcmVmaXh9X2lkXG4iIC4KKyAgICAgICAgIlxuIiAuCisgICAgICAgICJ0eXBlZGVmIGVudW0gJHtwcmVmaXh9X2lkICAke3ByZWZpeH1faWRfdDtcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIlxuIiAuCisgICAgICAgICIvLyBlbmQgb2YgZmlsZSAvL1xuIjsKKworICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGsgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfZW51bQorCisKK3N1YiBnZW5lcmF0ZV9zaWduYXR1cmUoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0gIi8vIG1lc3NhZ2UgY2F0YWxvZyBzaWduYXR1cmUgZmlsZSAvL1xuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgbXkgJHByb3BzID0gJHNlY3Rpb25zLT57ICRzZWN0aW9uIH07ICAgICMgU2VjdGlvbiBwcm9wZXJ0aWVzLgorICAgICAgICBteSAkc2hvcnQgPSAkcHJvcHMtPnsgc2hvcnQgfTsgICAgICAgICAgIyBTaG9ydCBzZWN0aW9uIG5hbWUsIGZyZXF1ZW50bHkgdXNlZC4KKyAgICAgICAgJGJ1bGsgLj0gIi0qLSAiIC4gdWMoICRwcm9wcy0+eyBsb25nIH0gKSAuICItKi1cblxuIjsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggJGlkZW50LCAkbXNnICkgPSBAJGl0ZW07CisgICAgICAgICAgICAkYnVsayAuPSBzcHJpbnRmKCAiJS00MHMgJXNcbiIsICRpZGVudCwgbXNnMnNnbiggJG1zZyApICk7CisgICAgICAgIH07ICMgZm9yZWFjaAorICAgICAgICAkYnVsayAuPSAiXG4iOworICAgIH07ICMgZm9yZWFjaCAkdHlwZQorCisgICAgJGJ1bGsgLj0gIi8vIGVuZCBvZiBmaWxlIC8vXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsayApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9zaWduYXR1cmUKKworCitzdWIgZ2VuZXJhdGVfZGVmYXVsdCgkJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlLCAkcHJlZml4ICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgX2dlbmVyYXRlX2NvbW1lbnQoICRkYXRhLCAiLy8iLCAiLy8iICkgLgorICAgICAgICAiXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJzdGF0aWMgY2hhciBjb25zdCAqXG4iIC4KKyAgICAgICAgICAgICJfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0iIC4gIltdID1cbiIgLgorICAgICAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgICAgICIgICAgICAgIE5VTEwsXG4iOworICAgICAgICBmb3JlYWNoIG15ICRpdGVtICggQHsgJGRhdGEtPnsgJHNlY3Rpb24gfSB9ICkgeworICAgICAgICAgICAgbXkgKCB1bmRlZiwgJG1zZyApID0gQCRpdGVtOworICAgICAgICAgICAgJGJ1bGsgLj0gIiAgICAgICAgXCIiIC4gbXNnMnNyYyggJG1zZyApIC4gIlwiLFxuIjsKKyAgICAgICAgfTsgIyB3aGlsZQorICAgICAgICAkYnVsayAuPQorICAgICAgICAgICAgIiAgICAgICAgTlVMTFxuIiAuCisgICAgICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAic3RydWN0IGttcF9pMThuX3NlY3Rpb24ge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICBzaXplO1xuIiAuCisgICAgICAgICIgICAgY2hhciBjb25zdCAqKiBzdHI7XG4iIC4KKyAgICAgICAgIn07IC8vIHN0cnVjdCBrbXBfaTE4bl9zZWN0aW9uXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3NlY3Rpb24gIGttcF9pMThuX3NlY3Rpb25fdDtcbiIgLgorICAgICAgICAiXG4iIC4KKyAgICAgICAgInN0YXRpYyBrbXBfaTE4bl9zZWN0aW9uX3RcbiIgLgorICAgICAgICAiX18ke3ByZWZpeH1fc2VjdGlvbnNbXSA9XG4iIC4KKyAgICAgICAgIiAgICB7XG4iIC4KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH0sXG4iOworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICAgICAgICB7ICIgLiBAeyAkZGF0YS0+eyAkc2VjdGlvbiB9IH0gLiAiLCBfXyR7cHJlZml4fV9kZWZhdWx0XyR7c2VjdGlvbn0gfSxcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIiAgICAgICAgeyAwLCBOVUxMIH1cbiIgLgorICAgICAgICAiICAgIH07XG4iIC4KKyAgICAgICAgIlxuIjsKKworICAgICRidWxrIC49CisgICAgICAgICJzdHJ1Y3Qga21wX2kxOG5fdGFibGUge1xuIiAuCisgICAgICAgICIgICAgaW50ICAgICAgICAgICAgICAgICAgIHNpemU7XG4iIC4KKyAgICAgICAgIiAgICBrbXBfaTE4bl9zZWN0aW9uX3QgKiAgc2VjdDtcbiIgLgorICAgICAgICAifTsgLy8gc3RydWN0IGttcF9pMThuX3RhYmxlXG4iIC4KKyAgICAgICAgInR5cGVkZWYgc3RydWN0IGttcF9pMThuX3RhYmxlICBrbXBfaTE4bl90YWJsZV90O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAic3RhdGljIGttcF9pMThuX3RhYmxlX3QgX19rbXBfaTE4bl9kZWZhdWx0X3RhYmxlID1cbiIgLgorICAgICAgICAiICAgIHtcbiIgLgorICAgICAgICAiICAgICAgICAiIC4gQHNlY3Rpb25zIC4gIixcbiIgLgorICAgICAgICAiICAgICAgICBfX2ttcF9pMThuX3NlY3Rpb25zXG4iIC4KKyAgICAgICAgIiAgICB9O1xuIiAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiLy8gZW5kIG9mIGZpbGUgLy9cbiI7CisKKyAgICB3cml0ZV9maWxlKCAkZmlsZSwgXCRidWxrICk7CisKK307ICMgc3ViIGdlbmVyYXRlX2RlZmF1bHQKKworCitzdWIgZ2VuZXJhdGVfbWVzc2FnZV91bml4KCQkKSB7CisKKyAgICBteSAoICRkYXRhLCAkZmlsZSApID0gQF87CisgICAgbXkgJGJ1bGsgICAgID0gIiI7CisKKyAgICAkYnVsayAuPQorICAgICAgICBfZ2VuZXJhdGVfY29tbWVudCggJGRhdGEsICJcJCIsICJcJCIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiXCRxdW90ZSBcIlxuXG4iOworCisgICAgZm9yZWFjaCBteSAkc2VjdGlvbiAoIEBzZWN0aW9ucyApIHsKKyAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICJcJCAiIC4gKCAiLSIgeCA3OCApIC4gIlxuXCQgJHNlY3Rpb25cblwkICIgLiAoICItIiB4IDc4ICkgLiAiXG5cbiIgLgorICAgICAgICAgICAgIlwkc2V0ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNldCB9XG4iIC4KKyAgICAgICAgICAgICJcbiI7CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0gIiRuIFwiIiAuIG1zZzJzcmMoICRtc2cgKSAuICJcIlxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoCisgICAgICAgICRidWxrIC49ICJcbiI7CisgICAgfTsgIyBmb3JlYWNoICR0eXBlCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIlwkIGVuZCBvZiBmaWxlIFwkXG4iOworCisgICAgd3JpdGVfZmlsZSggJGZpbGUsIFwkYnVsaywgLWxheWVyID0+ICI6dXRmOCIgKTsKKworfTsgIyBzdWIgZ2VuZXJhdGVfbWVzc2FnZV9saW51eAorCisKK3N1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MoJCQpIHsKKworICAgIG15ICggJGRhdGEsICRmaWxlICkgPSBAXzsKKyAgICBteSAkYnVsayA9ICIiOworICAgIG15ICRsYW5ndWFnZSA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5ndWFnZSB9OworICAgIG15ICRsYW5naWQgICA9ICRkYXRhLT57ICIlbWV0YSIgfS0+eyBMYW5nSWQgfTsKKworICAgICRidWxrIC49CisgICAgICAgIF9nZW5lcmF0ZV9jb21tZW50KCAkZGF0YSwgIjsiLCAiOyIgKSAuCisgICAgICAgICJcbiIgLgorICAgICAgICAiTGFuZ3VhZ2VOYW1lcyA9ICgkbGFuZ3VhZ2U9JGxhbmdpZDptc2dfJGxhbmdpZClcbiIgLgorICAgICAgICAiXG4iOworCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIkZhY2lsaXR5TmFtZXM9KFxuIjsKKyAgICBmb3JlYWNoIG15ICRzZWN0aW9uICggQHNlY3Rpb25zICkgeworICAgICAgICBteSAkcHJvcHMgPSAkc2VjdGlvbnMtPnsgJHNlY3Rpb24gfTsgICAgIyBTZWN0aW9uIHByb3BlcnRpZXMuCisgICAgICAgICRidWxrIC49CisgICAgICAgICAgICAiICRwcm9wcy0+eyBzaG9ydCB9PSIgLiAkcHJvcHMtPnsgc2V0IH0gLiJcbiI7CisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisgICAgJGJ1bGsgLj0KKyAgICAgICAgIilcblxuIjsKKworICAgIGZvcmVhY2ggbXkgJHNlY3Rpb24gKCBAc2VjdGlvbnMgKSB7CisgICAgICAgIG15ICRzaG9ydCA9ICRzZWN0aW9ucy0+eyAkc2VjdGlvbiB9LT57IHNob3J0IH07CisgICAgICAgIG15ICRuID0gMDsKKyAgICAgICAgZm9yZWFjaCBteSAkaXRlbSAoIEB7ICRkYXRhLT57ICRzZWN0aW9uIH0gfSApIHsKKyAgICAgICAgICAgIG15ICggdW5kZWYsICRtc2cgKSA9IEAkaXRlbTsKKyAgICAgICAgICAgICsrICRuOworICAgICAgICAgICAgJGJ1bGsgLj0KKyAgICAgICAgICAgICAgICAiTWVzc2FnZUlkPSRuXG4iIC4KKyAgICAgICAgICAgICAgICAiRmFjaWxpdHk9JHNob3J0XG4iIC4KKyAgICAgICAgICAgICAgICAiTGFuZ3VhZ2U9JGxhbmd1YWdlXG4iIC4KKyAgICAgICAgICAgICAgICBtc2cybWMoICRtc2cgKSAuICJcbi5cblxuIjsKKyAgICAgICAgfTsgIyBmb3JlYWNoICRpdGVtCisgICAgfTsgIyBmb3JlYWNoICRzZWN0aW9uCisKKyAgICAkYnVsayAuPQorICAgICAgICAiXG4iIC4KKyAgICAgICAgIjsgZW5kIG9mIGZpbGUgO1xuIjsKKworICAgICRidWxrID0gZW5jb2RlKCAiVVRGLTE2TEUiLCAkYnVsayApOyAjIENvbnZlcnQgdGV4dCB0byBVVEYtMTZMRSB1c2VkIGluIFdpbmRvd3MqIE9TLgorICAgIHdyaXRlX2ZpbGUoICRmaWxlLCBcJGJ1bGssIC1iaW5hcnkgPT4gMSApOworCit9OyAjIHN1YiBnZW5lcmF0ZV9tZXNzYWdlX3dpbmRvd3MKKworCisjCisjIFBhcnNlIGNvbW1hbmQgbGluZS4KKyMKKworbXkgJGlucHV0X2ZpbGU7CitteSAkZW51bV9maWxlOworbXkgJHNpZ25hdHVyZV9maWxlOworbXkgJGRlZmF1bHRfZmlsZTsKK215ICRtZXNzYWdlX2ZpbGU7CitteSAkaWQ7CitteSAkcHJlZml4ID0gIiI7CitnZXRfb3B0aW9ucygKKyAgICAib3M9cyIgICAgICAgICAgICAgPT4gXCR0YXJnZXRfb3MsCisgICAgImVudW0tZmlsZT1zIiAgICAgID0+IFwkZW51bV9maWxlLAorICAgICJzaWduYXR1cmUtZmlsZT1zIiA9PiBcJHNpZ25hdHVyZV9maWxlLAorICAgICJkZWZhdWx0LWZpbGU9cyIgICA9PiBcJGRlZmF1bHRfZmlsZSwKKyAgICAibWVzc2FnZS1maWxlPXMiICAgPT4gXCRtZXNzYWdlX2ZpbGUsCisgICAgImlkfGxhbmctaWQiICAgICAgID0+IFwkaWQsCisgICAgInByZWZpeD1zIgkgICAgICAgPT4gXCRwcmVmaXgsCispOworaWYgKCBAQVJHViA9PSAwICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJObyBzb3VyY2UgZmlsZSBzcGVjaWZpZWQgLS0gbm90aGluZyB0byBkbyIgKTsKK307ICMgaWYKK2lmICggQEFSR1YgPiAxICkgeworICAgIGNtZGxpbmVfZXJyb3IoICJUb28gbWFueSBzb3VyY2UgZmlsZXMgc3BlY2lmaWVkIiApOworfTsgIyBpZgorJGlucHV0X2ZpbGUgPSAkQVJHVlsgMCBdOworCisKK215ICRnZW5lcmF0ZV9tZXNzYWdlOworaWYgKCAkdGFyZ2V0X29zID1+IG17XEEoPzpsaW58bWFjKVx6fSApIHsKKyAgICAkZ2VuZXJhdGVfbWVzc2FnZSA9IFwmZ2VuZXJhdGVfbWVzc2FnZV91bml4OworfSBlbHNpZiAoICR0YXJnZXRfb3MgZXEgIndpbiIgKSB7CisgICAgJGdlbmVyYXRlX21lc3NhZ2UgPSBcJmdlbmVyYXRlX21lc3NhZ2Vfd2luZG93czsKK30gZWxzZSB7CisgICAgcnVudGltZV9lcnJvciggIk9TIFwiJHRhcmdldF9vc1wiIGlzIG5vdCBzdXBwb3J0ZWQiICk7Cit9OyAjIGlmCisKKworIworIyBEbyB0aGUgd29yay4KKyMKKworbXkgJGRhdGEgPSBwYXJzZV9zb3VyY2UoICRpbnB1dF9maWxlICk7CitpZiAoIGRlZmluZWQoICRpZCApICkgeworICAgIHByaW50KCAkZGF0YS0+eyAiJW1ldGEiIH0tPnsgTGFuZ0lkIH0sICJcbiIgKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJGVudW1fZmlsZSApICkgeworICAgIGdlbmVyYXRlX2VudW0oICRkYXRhLCAkZW51bV9maWxlLCAkcHJlZml4ICk7Cit9OyAjIGlmCitpZiAoIGRlZmluZWQoICRzaWduYXR1cmVfZmlsZSApICkgeworICAgIGdlbmVyYXRlX3NpZ25hdHVyZSggJGRhdGEsICRzaWduYXR1cmVfZmlsZSApOworfTsgIyBpZgoraWYgKCBkZWZpbmVkKCAkZGVmYXVsdF9maWxlICkgKSB7CisgICAgZ2VuZXJhdGVfZGVmYXVsdCggJGRhdGEsICRkZWZhdWx0X2ZpbGUsICRwcmVmaXggKTsKK307ICMgaWYKK2lmICggZGVmaW5lZCggJG1lc3NhZ2VfZmlsZSApICkgeworICAgICRnZW5lcmF0ZV9tZXNzYWdlLT4oICRkYXRhLCAkbWVzc2FnZV9maWxlICk7Cit9OyAjIGlmCisKK2V4aXQoIDAgKTsKKworX19FTkRfXworCis9cG9kCisKKz1oZWFkMSBOQU1FCisKK0I8bWVzc2FnZS1jb252ZXJ0ZXIucGw+IC0tIENvbnZlcnQgbWVzc2FnZSBjYXRhbG9nIHNvdXJjZSBmaWxlIGludG8gYW5vdGhlciB0ZXh0IGZvcm1zLgorCis9aGVhZDEgU1lOT1BTSVMKKworQjxtZXNzYWdlLWNvbnZlcnRlci5wbD4gSTxvcHRpb24+Li4uIDxmaWxlPgorCis9aGVhZDEgT1BUSU9OUworCis9b3ZlcgorCis9aXRlbSBCPC0tZW51bS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIGVudW0gZmlsZSBuYW1lZCBJPGZpbGU+LgorCis9aXRlbSBCPC0tZGVmYXVsdC1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIGRlZmF1bHQgbWVzc2FnZXMgZmlsZSBuYW1lZCBJPGZpbGU+LgorCis9aXRlbSBCPC0tbGFuZy1pZD4KKworUHJpbnQgbGFuZ3VhZ2UgaWRlbnRpZmllciBvZiB0aGUgbWVzc2FnZSBjYXRhbG9nIHNvdXJjZSBmaWxlLgorCis9aXRlbSBCPC0tbWVzc2FnZS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIG1lc3NhZ2UgZmlsZS4KKworPWl0ZW0gQjwtLXNpZ25hdHVyZS1maWxlPT5JPGZpbGU+CisKK0dlbmVyYXRlIHNpZ25hdHVyZSBmaWxlLgorCitTaWduYXR1cmVzIGFyZSB1c2VkIGZvciBjaGVja2luZyBjb21wYXRpYmlsaXR5LiBGb3IgZXhhbXBsZSwgdG8gY2hlY2sgYSBwcmltYXJ5CitjYXRhbG9nIGFuZCBpdHMgdHJhbnNsYXRpb24gdG8gYW5vdGhlciBsYW5ndWFnZSwgc2lnbmF0dXJlcyBvZiBib3RoIGNhdGFsb2dzIHNob3VsZCBiZSBnZW5lcmF0ZWQKK2FuZCBjb21wYXJlZC4gSWYgc2lnbmF0dXJlcyBhcmUgaWRlbnRpY2FsLCBjYXRhbG9ncyBhcmUgY29tcGF0aWJsZS4KKworPWl0ZW0gQjwtLXByZWZpeD0+STxwcmVmaXg+CisKK1ByZWZpeCB0byBiZSB1c2VkIGZvciBhbGwgQyBpZGVudGlmaWVycyAodHlwZSBhbmQgdmFyaWFibGUgbmFtZXMpIGluIGVudW0gYW5kIGRlZmF1bHQgbWVzc2FnZXMKK2ZpbGVzLgorCis9aXRlbSBCPC0tb3M9Pkk8c3RyPgorCitTcGVjaWZ5IE9TIG5hbWUgdGhlIG1lc3NhZ2UgZm9ybWF0cyB0byBiZSBjb252ZXJ0ZWQgZm9yLiBJZiBub3Qgc3BlY2lmaWVkIGV4cG9saWNpdGx5LCB2YWx1ZSBvZgorTElCT01QX09TIGVudmlyb25tZW50IHZhcmlhYmxlIGlzIHVzZWQuIElmIExJQk9NUF9PUyBpcyBub3QgZGVmaW5lZCwgaG9zdCBPUyBpcyBkZXRlY3RlZC4KKworRGVwZW5kaW5nIG9uIE9TLCBCPG1lc3NhZ2UtY29udmVydGVyLnBsPiBjb252ZXJ0cyBtZXNzYWdlIGZvcm1hdHMgdG8gR05VIHN0eWxlIG9yIE1TIHN0eWxlLgorCis9aXRlbSBTdGFuZGFyZCBPcHRpb25zCisKKz1vdmVyCisKKz1pdGVtIEI8LS1kb2M+CisKKz1pdGVtIEI8LS1tYW51YWw+CisKK1ByaW50IGZ1bGwgZG9jdW1lbnRhdGlvbiBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLWhlbHA+CisKK1ByaW50IHNob3J0IGhlbHAgbWVzc2FnZSBhbmQgZXhpdC4KKworPWl0ZW0gQjwtLXZlcnNpb24+CisKK1ByaW50IHZlcnNpb24gc3RyaW5nIGFuZCBleGl0LgorCis9YmFjaworCis9YmFjaworCis9aGVhZDEgQVJHVU1FTlRTCisKKz1vdmVyCisKKz1pdGVtIEk8ZmlsZT4KKworQSBuYW1lIG9mIGlucHV0IGZpbGUuCisKKz1iYWNrCisKKz1oZWFkMSBERVNDUklQVElPTgorCis9aGVhZDIgTWVzc2FnZSBDYXRhbG9nIEZpbGUgRm9ybWF0CisKK0l0IGlzIHBsYWluIHRleHQgZmlsZSBpbiBVVEYtOCBlbmNvZGluZy4gRW1wdHkgbGluZXMgYW5kIGxpbmVzIGJlZ2lubmluZyB3aXRoIHNoYXJwIHNpZ24gKEM8Iz4pIGFyZQoraWdub3JlZC4gRUJORiBzeW50YXggb2YgY29udGVudDoKKworICAgIGNhdGFsb2cgICAgPSB7IHNlY3Rpb24gfTsKKyAgICBzZWN0aW9uICAgID0gaGVhZGVyIGJvZHk7CisgICAgaGVhZGVyICAgICA9ICItKi0gIiBzZWN0aW9uLWlkICIgLSotIiAiXG4iOworICAgIGJvZHkgICAgICAgPSB7IG1lc3NhZ2UgfTsKKyAgICBtZXNzYWdlICAgID0gbWVzc2FnZS1pZCBzdHJpbmcgIlxuIiB7IHN0cmluZyAiXG4iIH07CisgICAgc2VjdGlvbi1pZCA9IGlkZW50aWZpZXI7CisgICAgbWVzc2FnZS1pZCA9ICJPQlNPTEVURSIgfCBpZGVudGlmaWVyOworICAgIGlkZW50aWZpZXIgPSBsZXR0ZXIgeyBsZXR0ZXIgfCBkaWdpdCB8ICJfIiB9OworICAgIHN0cmluZyAgICAgPSAiIiIgeyBjaGFyYWN0ZXIgfSAiIiI7CisKK0lkZW50aWZpZXIgc3RhcnRzIHdpdGggbGV0dGVyLCB3aXRoIGZvbGxvd2luZyBsZXR0ZXJzLCBkaWdpdHMsIGFuZCB1bmRlcnNjb3Jlcy4gSWRlbnRpZmllcnMgYXJlCitjYXNlLXNlbnNpdGl2ZS4gU2V0aW9uIGlkZW50aWZpZXJzIGFyZSBmaXhlZDogQzxNRVRBPiwgQzxTVFJJTkdTPiwgQzxGT1JNQVRTPiwgQzxNRVNTQUdFUz4gYW5kCitDPEhJTlRTPi4gTWVzc2FnZSBpZGVudGlmaWVycyBtdXN0IGJlIHVuaXF1ZSB3aXRoaW4gc2VjdGlvbi4gU3BlY2lhbCBDPE9CU09MRVRFPiBwc2V1ZG8taWRlbnRpZmllcgorbWF5IGJlIHVzZWQgbWFueSB0aW1lcy4KKworU3RyaW5nIGlzIGEgQyBzdHJpbmcgbGl0ZXJhbCB3aGljaCBtdXN0IG5vdCBjcm9zcyBsaW5lIGJvdW5kYXJpZXMuCitMb25nIG1lc3NhZ2VzIG1heSBvY2N1cHkgbXVsdGlwbGUgbGluZXMsIGEgc3RyaW5nIHBlciBsaW5lLgorCitNZXNzYWdlIG1heSBpbmNsdWRlIHByaW50Zi1saWtlIEdOVS1zdHlsZSBwbGFjZWhvbGRlcnMgZm9yIGFyZ3VtZW50czogQzwlSTxuPiRJPHQ+PiwKK3doZXJlIEk8bj4gaXMgYXJndW1lbnQgbnVtYmVyIChDPDE+LCBDPDI+LCAuLi4pLAorSTx0PiAtLSBhcmd1bWVudCB0eXBlLCBDPHM+IChzdHJpbmcpIG9yIEM8ZD4gKDMyLWJpdCBpbnRlZ2VyKS4KKworU2VlIGFsc28gY29tbWVudHMgaW4gRjxpMThuL2VuX1VTLnR4dD4uCisKKz1oZWFkMiBPdXRwdXQgRmlsZXMKKworVGhpcyBzY3JpcHQgY2FuIGdlbmVyYXRlIDMgZGlmZmVyZW50IHRleHQgZmlsZXMgZnJvbSBzaW5nbGUgc291cmNlOgorCis9b3ZlcgorCis9aXRlbSBFbnVtIGZpbGUuCisKK0VudW0gZmlsZSBpcyBhIEMgaW5jbHVkZSBmaWxlLCBjb250YWluaW5nIGRlZmluaXRpb25zIG9mIG1lc3NhZ2UgaWRlbnRpZmllcnMsIGUuIGcuOgorCisgICAgZW51bSBrbXBfaTE4bl9pZCB7CisKKyAgICAgICAgLy8gU2V0ICMxLCBtZXRhLgorICAgICAgICBrbXBfaTE4bl9wcnBfZmlyc3QgPSA2NTUzNiwKKyAgICAgICAga21wX2kxOG5fcHJwX0xhbmd1YWdlLAorICAgICAgICBrbXBfaTE4bl9wcnBfQ291bnRyeSwKKyAgICAgICAga21wX2kxOG5fcHJwX0xhbmdJZCwKKyAgICAgICAga21wX2kxOG5fcHJwX1ZlcnNpb24sCisgICAgICAgIGttcF9pMThuX3BycF9SZXZpc2lvbiwKKyAgICAgICAga21wX2kxOG5fcHJwX2xhc3QsCisKKyAgICAgICAgLy8gU2V0ICMyLCBzdHJpbmdzLgorICAgICAgICBrbXBfaTE4bl9zdHJfZmlyc3QgPSAxMzEwNzIsCisgICAgICAgIGttcF9pMThuX3N0cl9FcnJvciwKKyAgICAgICAga21wX2kxOG5fc3RyX1Vua25vd25GaWxlLAorICAgICAgICBrbXBfaTE4bl9zdHJfTm90QU51bWJlciwKKyAgICAgICAgLi4uCisKKyAgICAgICAgLy8gU2V0ICMzLCBmb3RybWF0cy4KKyAgICAgICAgLi4uCisKKyAgICAgICAga21wX2kxOG5feHh4X2xhc3Rlc3QKKworICAgIH07IC8vIGVudW0ga21wX2kxOG5faWQKKworICAgIHR5cGVkZWYgZW51bSBrbXBfaTE4bl9pZCAga21wX2kxOG5faWRfdDsKKworPWl0ZW0gRGVmYXVsdCBtZXNzYWdlcyBmaWxlLgorCitEZWZhdWx0IG1lc3NhZ2VzIGZpbGUgaXMgYSBDIGluY2x1ZGUgZmlsZSBjb250YWluaW5nIGRlZmF1bHQgbWVzc2FnZXMgdG8gYmUgZW1iZWRkZWQgaW50bworYXBwbGljYXRpb24gKGFuZCB1c2VkIGlmIGV4dGVybmFsIG1lc3NhZ2UgY2F0YWxvZyBkb2VzIG5vdCBleGlzdCBvciBjb3VsZCBub3QgYmUgb3Blbik6CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqCisgICAgX19rbXBfaTE4bl9kZWZhdWx0X21ldGFbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgIE5VTEwsCisgICAgICAgICAgICAiRW5nbGlzaCIsCisgICAgICAgICAgICAiVVNBIiwKKyAgICAgICAgICAgICIxMDMzIiwKKyAgICAgICAgICAgICIyIiwKKyAgICAgICAgICAgICIyMDA5MDgwNiIsCisgICAgICAgICAgICBOVUxMCisgICAgICAgIH07CisKKyAgICBzdGF0aWMgY2hhciBjb25zdCAqCisgICAgX19rbXBfaTE4bl9kZWZhdWx0X3N0cmluZ3NbXSA9CisgICAgICAgIHsKKyAgICAgICAgICAgICJFcnJvciIsCisgICAgICAgICAgICAiKHVua25vd24gZmlsZSkiLAorICAgICAgICAgICAgIm5vdCBhIG51bWJlciIsCisgICAgICAgICAgICAuLi4KKyAgICAgICAgICAgIE5VTEwKKyAgICAgICAgfTsKKworICAgIC4uLgorCis9aXRlbSBNZXNzYWdlIGZpbGUuCisKK01lc3NhZ2UgZmlsZSBpcyBhbiBpbnB1dCBmb3IgbWVzc2FnZSBjb21waWxlciwgRjxnZW5jYXQ+IG9uIExpbnV4KiBPUyBhbmQgT1MgWCosIG9yIEY8bWMuZXhlPiBvbgorV2luZG93cyogT1MuCisKK0hlcmUgaXMgdGhlIGV4YW1wbGUgb2YgTGludXgqIE9TIG1lc3NhZ2UgZmlsZToKKworICAgICRxdW90ZSAiCisgICAgMSAiSmFwYW5lc2UiCisgICAgMiAiSmFwYW4iCisgICAgMyAiMTA0MSIKKyAgICA0ICIyIgorICAgIDUgIkJhc2VkIG9uIEVubGlzaCBtZXNzYWdlIGNhdGFsb2cgcmV2aXNpb24gMjAwOTA4MDYiCisgICAgLi4uCisKK0V4YW1wbGUgb2YgV2luZG93cyogT1MgbWVzc2FnZSBmaWxlOgorCisgICAgTGFuZ3VhZ2VOYW1lcyA9IChKYXBhbmVzZT0xMDA0MTptc2dfMTA0MSkKKworICAgIEZhY2lsaXR5TmFtZXMgPSAoCisgICAgIHBycD0xCisgICAgIHN0cj0yCisgICAgIGZtdD0zCisgICAgIC4uLgorICAgICkKKworICAgIE1lc3NhZ2VJZD0xCisgICAgRmFjaWxpdHk9cHJwCisgICAgTGFuZ3VhZ2U9SmFwYW5lc2UKKyAgICBKYXBhbmVzZQorICAgIC4KKworICAgIC4uLgorCis9aXRlbSBTaWduYXR1cmUuCisKK1NpZ25hdHVyZSBpcyBhIHByb2Nlc3NlZCBzb3VyY2UgZmlsZTogY29tbWVudHMgc3RyaXBwZWQsIHN0cmluZ3MgZGVsZXRlZCwgYnV0IHBsYWNlaG9sZGVycyBrZXB0IGFuZAorc29ydGVkLgorCisgICAgLSotIEZPUk1BVFMtKi0KKworICAgIEluZm8gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgV2FybmluZyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSRkICUyJHMKKyAgICBGYXRhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJGQgJTIkcworICAgIFN5c0VyciAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgJTEkZCAlMiRzCisgICAgSGludCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAlMSQtICUyJHMKKyAgICBQcmFnbWEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICUxJHMgJTIkcyAlMyRzICU0JHMKKworVGhlIHB1cnBvc2Ugb2Ygc2lnbmF0dXJlcyAtLSBjb21wYXJlIHR3byBtZXNzYWdlIHNvdXJjZSBmaWxlcyBmb3IgY29tcGF0aWJpbGl0eS4gSWYgc2lnbmF0dXJlcyBvZgordHdvIG1lc3NhZ2Ugc291cmNlcyBhcmUgdGhlIHNhbWUsIGJpbmFyeSBtZXNzYWdlIGNhdGFsb2dzIHdpbGwgYmUgY29tcGF0aWJsZS4KKworPWJhY2sKKworPWhlYWQxIEVYQU1QTEVTCisKK0dlbmVyYXRlIGluY2x1ZGUgZmlsZSBjb250YWluaW5nIG1lc3NhZ2UgaWRlbnRpZmllcnM6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tZW51bS1maWxlPWttcF9pMThuX2lkLmluYyBlbl9VUy50eHQKKworR2VuZXJhdGUgaW5jbHVkZSBmaWxlIGNvbnRhdGluZyBkZWZhdWx0IG1lc3NhZ2VzOgorCisgICAgJCBtZXNzYWdlLWNvbnZlcnRlci5wbCAtLWRlZmF1bHQtZmlsZT1rbXBfaTE4bl9kZWZhdWx0LmluYyBlbl9VUy50eHQKKworR2VuZXJhdGUgaW5wdXQgZmlsZSBmb3IgbWVzc2FnZSBjb21waWxlciwgTGludXgqIE9TIGV4YW1wbGU6CisKKyAgICAkIG1lc3NhZ2UtY29udmVydGVyLnBsIC0tbWVzc2FnZS1maWxlPXJ1X1JVLlVURi04Lm1zZyBydV9SVS50eHQKKworR2VuZXJhdGUgaW5wdXQgZmlsZSBmb3IgbWVzc2FnZSBjb21waWxlciwgV2luZG93cyogT1MgZXhhbXBsZToKKworICAgID4gbWVzc2FnZS1jb252ZXJ0ZXIucGwgLS1tZXNzYWdlLWZpbGU9cnVfUlUuVVRGLTgubWMgcnVfUlUudHh0CisKKz1jdXQKKworIyBlbmQgb2YgZmlsZSAjCisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvTElDRU5TRSBiL3JjMy90ZXN0c3VpdGUvTElDRU5TRQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMTlmYjAxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9MSUNFTlNFCkBAIC0wLDAgKzEsMzQgQEAKKyAgQ29weXJpZ2h0IChjKSAyMDExLCAyMDEyIAorICBVbml2ZXJzaXR5IG9mIEhvdXN0b24gU3lzdGVtCisgIAorICBBbGwgcmlnaHRzIHJlc2VydmVkLgorICAKKyAgUmVkaXN0cmlidXRpb24gYW5kIHVzZSBpbiBzb3VyY2UgYW5kIGJpbmFyeSBmb3Jtcywgd2l0aCBvciB3aXRob3V0CisgIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1pdHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICBhcmUgbWV0OgorICAKKyAgbyBSZWRpc3RyaWJ1dGlvbnMgb2Ygc291cmNlIGNvZGUgbXVzdCByZXRhaW4gdGhlIGFib3ZlIGNvcHlyaWdodCBub3RpY2UsCisgICAgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xhaW1lci4KKyAgCisgIG8gUmVkaXN0cmlidXRpb25zIGluIGJpbmFyeSBmb3JtIG11c3QgcmVwcm9kdWNlIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAgICBub3RpY2UsIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4gdGhlCisgICAgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJpYWxzIHByb3ZpZGVkIHdpdGggdGhlIGRpc3RyaWJ1dGlvbi4KKyAgCisgIG8gTmVpdGhlciB0aGUgbmFtZSBvZiB0aGUgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIFN5c3RlbSBub3IgdGhlIG5hbWVzIG9mIGl0cworICBjb250cmlidXRvcnMgbWF5IGJlIHVzZWQgdG8KKyAgICBlbmRvcnNlIG9yIHByb21vdGUgcHJvZHVjdHMgZGVyaXZlZCBmcm9tIHRoaXMgc29mdHdhcmUgd2l0aG91dCBzcGVjaWZpYworICAgIHByaW9yIHdyaXR0ZW4gcGVybWlzc2lvbi4KKyAgCisgIFRISVMgU09GVFdBUkUgSVMgUFJPVklERUQgQlkgVEhFIENPUFlSSUdIVCBIT0xERVJTIEFORCBDT05UUklCVVRPUlMKKyAgIkFTIElTIiBBTkQgQU5ZIEVYUFJFU1MgT1IgSU1QTElFRCBXQVJSQU5USUVTLCBJTkNMVURJTkcsIEJVVCBOT1QKKyAgTElNSVRFRCBUTywgVEhFIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFCSUxJVFkgQU5EIEZJVE5FU1MgRk9SCisgIEEgUEFSVElDVUxBUiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiBJTiBOTyBFVkVOVCBTSEFMTCBUSEUgQ09QWVJJR0hUCisgIEhPTERFUiBPUiBDT05UUklCVVRPUlMgQkUgTElBQkxFIEZPUiBBTlkgRElSRUNULCBJTkRJUkVDVCwgSU5DSURFTlRBTCwKKyAgU1BFQ0lBTCwgRVhFTVBMQVJZLCBPUiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBMSU1JVEVECisgIFRPLCBQUk9DVVJFTUVOVCBPRiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwgT1IKKyAgUFJPRklUUzsgT1IgQlVTSU5FU1MgSU5URVJSVVBUSU9OKSBIT1dFVkVSIENBVVNFRCBBTkQgT04gQU5ZIFRIRU9SWSBPRgorICBMSUFCSUxJVFksIFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElORworICBORUdMSUdFTkNFIE9SIE9USEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMKKyAgU09GVFdBUkUsIEVWRU4gSUYgQURWSVNFRCBPRiBUSEUgUE9TU0lCSUxJVFkgT0YgU1VDSCBEQU1BR0UuCisgCisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQuY2ZnIGIvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQuY2ZnCkBAIC0wLDAgKzEsNzggQEAKKyMgLSotIFB5dGhvbiAtKi0KKworIyBDb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSAnbGl0JyB0ZXN0IHJ1bm5lci4KKworaW1wb3J0IG9zCitpbXBvcnQgc3lzCitpbXBvcnQgcmUKK2ltcG9ydCBwbGF0Zm9ybQorCit0cnk6CisgICBpbXBvcnQgbGl0LnV0aWwKKyAgIGltcG9ydCBsaXQuZm9ybWF0cworZXhjZXB0IEltcG9ydEVycm9yOgorICAgcGFzcworCisjIG5hbWU6IFRoZSBuYW1lIG9mIHRoaXMgdGVzdCBzdWl0ZS4KK2NvbmZpZy5uYW1lID0gJ09wZW5NUFZhbGlkYXRpb25TdWl0ZScKKworIyB0ZXN0Rm9ybWF0OiBUaGUgdGVzdCBmb3JtYXQgdG8gdXNlIHRvIGludGVycHJldCB0ZXN0cy4KK2NvbmZpZy50ZXN0X2Zvcm1hdCA9IGxpdC5mb3JtYXRzLlNoVGVzdChleGVjdXRlX2V4dGVybmFsPUZhbHNlKQorCisjIHN1ZmZpeGVzOiBBIGxpc3Qgb2YgZmlsZSBleHRlbnNpb25zIHRvIHRyZWF0IGFzIHRlc3QgZmlsZXMKKyMgTm90ZSB0aGlzIGNhbiBiZSBvdmVycmlkZGVuIGJ5IGxpdC5sb2NhbC5jZmcgZmlsZXMKK2NvbmZpZy5zdWZmaXhlcyA9IFsnLmxsJ10KKworIyB0ZXN0X3NvdXJjZV9yb290OiBUaGUgcm9vdCBwYXRoIHdoZXJlIHRlc3RzIGFyZSBsb2NhdGVkLgorI2NvbmZpZy50ZXN0X3NvdXJjZV9yb290ID0gIi9ob21lL2ljaG95angvaW5zdGFsbC9vcGVubXAvdGVzdHN1aXRlL2JpbiIKKyNvcy5wYXRoLmRpcm5hbWUoX19maWxlX18pCisKKyMgdGVzdF9leGVjX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgc2hvdWxkIGJlIHJ1bi4KKyNtcHZzX29ial9yb290ID0gZ2V0YXR0cihjb25maWcsICdtcHZzX29ial9yb290JywgTm9uZSkKKyNpZiBtcHZzX29ial9yb290IGlzIG5vdCBOb25lOgorY29uZmlnLnRlc3RfZXhlY19yb290ID0gIi4vIgorI29zLnBhdGguam9pbihtcHZzX29ial9yb290LCAnc3JjJykKKworIyBEaXNjb3ZlciB0aGUgJ2NsYW5nJyBhbmQgJ2NsYW5nY2MnIHRvIHVzZS4KKworaW1wb3J0IG9zCisKK2RlZiBpbmZlckNsYW5nKFBBVEgpOgorICAgICMgRGV0ZXJtaW5lIHdoaWNoIGNsYW5nIHRvIHVzZS4KKyAgICBjbGFuZyA9IG9zLmdldGVudignQ0xBTkcnKQorCisgICAgIyBJZiB0aGUgdXNlciBzZXQgY2xhbmcgaW4gdGhlIGVudmlyb25tZW50LCBkZWZpbml0ZWx5IHVzZSB0aGF0IGFuZCBkb24ndAorICAgICMgdHJ5IHRvIHZhbGlkYXRlLgorICAgIGlmIGNsYW5nOgorICAgICAgICByZXR1cm4gY2xhbmcKKworICAgICMgT3RoZXJ3aXNlIGxvb2sgaW4gdGhlIHBhdGguCisgICAgY2xhbmcgPSBsaXQudXRpbC53aGljaCgnY2xhbmcnLCBQQVRIKQorCisgICAgaWYgbm90IGNsYW5nOgorICAgICAgICBsaXRfY29uZmlnLmZhdGFsKCJjb3VsZG4ndCBmaW5kICdjbGFuZycgcHJvZ3JhbSwgdHJ5IHNldHRpbmcgIgorICAgICAgICAgICAgICAgICAgICAgICAgICJDTEFORyBpbiB5b3VyIGVudmlyb25tZW50IikKKworICAgIHJldHVybiBjbGFuZworCitjb25maWcuY2xhbmcgPSBpbmZlckNsYW5nKGNvbmZpZy5lbnZpcm9ubWVudFsnUEFUSCddKS5yZXBsYWNlKCdcXCcsICcvJykKK2NvbmZpZy5zdWJzdGl0dXRpb25zLmFwcGVuZCggKCclY2xhbmcnLCAnICcgKyBjb25maWcuY2xhbmcgKyAnICcpICkKKworIyBQcm9wb2dhdGUgc29tZSBlbnZpcm9ubWVudCB2YXJpYWJsZSB0byB0ZXN0IGVudmlyb25tZW50LgorZGVmIGFkZEVudihuYW1lKToKKyAgICBpZiBuYW1lIGluIG9zLmVudmlyb246CisgICAgICAgIGNvbmZpZy5lbnZpcm9ubWVudFtuYW1lXSA9IG9zLmVudmlyb25bbmFtZV0KKworYWRkRW52KCdIT01FJykKK2FkZEVudignUFdEJykKKworCithZGRFbnYoJ0NfSU5DTFVERV9QQVRIJykKK2FkZEVudignQ1BMVVNfSU5DTFVERV9QQVRIJykKK2FkZEVudignTElCUkFSWV9QQVRIJykKK2FkZEVudignTERfTElCUkFSWV9QQVRIJykKK2FkZEVudignRFlMRF9MSUJSQVJZX1BBVEgnKQorCisjIENoZWNrIHRoYXQgdGhlIG9iamVjdCByb290IGlzIGtub3duLgoraWYgY29uZmlnLnRlc3RfZXhlY19yb290IGlzIE5vbmU6CisgICAgbGl0LmZhdGFsKCd0ZXN0IGV4ZWN1dGlvbiByb290IG5vdCBzZXQhJykKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvTExWTS1JUi9saXQuc2l0ZS5jZmcuaW4gYi9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnNpdGUuY2ZnLmluCkBAIC0wLDAgKzEsMzAgQEAKKyMjIEF1dG9nZW5lcmF0ZWQgYnkgTExWTS9DbGFuZyBjb25maWd1cmF0aW9uLgorI2NvbmZpZy5tcHZzX3NyY19yb290ID0gIi9ob21lL2ljaG95angvaW5zdGFsbC9vcGVubXAvdGVzdHN1aXRlL2Jpbi9jIgorY29uZmlnLm1wdnNfb2JqX3Jvb3QgPSAiL3RtcCIKK2NvbmZpZy5sbHZtX3Rvb2xzX2RpciA9ICJATExWTV9UT09MU19ESVJAIgorCisKKyMgTmVlZGVkIHRvIGNoZWNrIGlmIGEgaGFjayBuZWVkcyB0byBiZSBhcHBsaWVkCitjb25maWcubGx2bV92ZXJzaW9uX21ham9yID0gIkBMTFZNX1ZFUlNJT05fTUFKT1JAIgorCisjIENvbXBpbGVycworIyBGSVhNRTogdXNlIGxsdm1jYyBub3QgbGx2bWdjYworY29uZmlnLmxsdm1jbGFuZyA9ICJjbGFuZyIKKworIyBGZWF0dXJlcworY29uZmlnLmVuYWJsZV91Y2xpYmMgPSBUcnVlIGlmIEBFTkFCTEVfVUNMSUJDQCA9PSAxIGVsc2UgRmFsc2UKK2NvbmZpZy5lbmFibGVfcG9zaXhfcnVudGltZSA9IFRydWUgaWYgQEVOQUJMRV9QT1NJWF9SVU5USU1FQCA9PSAxIGVsc2UgRmFsc2UKK2NvbmZpZy5oYXZlX3NlbGludXggPSBUcnVlIGlmIEBIQVZFX1NFTElOVVhAID09IDEgZWxzZSBGYWxzZQorCisjIEN1cnJlbnQgdGFyZ2V0Citjb25maWcudGFyZ2V0X3RyaXBsZSA9ICJAVEFSR0VUX1RSSVBMRUAiCisKKyMgTGV0IHRoZSBtYWluIGNvbmZpZyBkbyB0aGUgcmVhbCB3b3JrLgordHJ5OgorICBsaXQKK2V4Y2VwdCBOYW1lRXJyb3I6CisgICMgVXNlIGxpdF9jb25maWcgY2xhc3MKKyAgbGl0X2NvbmZpZy5sb2FkX2NvbmZpZyhjb25maWcsICJATVBWU19TT1VSQ0VfRElSQC9saXQuY2ZnIikKK2Vsc2U6CisgICMgVXNlIG9sZCBsaXQgY2xhc3MKKyAgbGl0LmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC50bXAgYi9yYzMvdGVzdHN1aXRlL0xMVk0tSVIvbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9MTFZNLUlSL2xpdC50bXAKQEAgLTAsMCArMSBAQAorLi4vTExWTS1JUi9saW5fMzJlLwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9NYWtlZmlsZSBiL3JjMy90ZXN0c3VpdGUvTWFrZWZpbGUKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2RiYzNkYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvTWFrZWZpbGUKQEAgLTAsMCArMSwyNTQgQEAKKyMgR2VuZXJhbCBNYWtlZmlsZSBjb250YWluaW5nIGFsbCB0aGUgbmVjZXNzYXJ5IGNvbXBpbGVyIGZsYWdzIGZvciB0aGUgdGVzdHMKKworIyBtb2RpZnkgQ0MgYW5kIENGTEFHUyBmb3IgT3Blbk1QIEMgY29tcGlsZXJzCisjIG1vZGlmeSBGQyBhbmQgRkZMQUdTIGZvciBPcGVuTVAgRm9ydHJhbiBjb21waWxlcnMKKworCisjIENvbnRlbnQ6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyAxLiBCYXNpYyB1c2FnZQorIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyAzLiBDb21waWxlciBzZWxlY3Rpb24gYW5kIEZsYWdzCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAxLiBCYXNpYyB1c2FnZQorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIAltYWtlIGN0ZXN0CQlnZW5lcmF0ZSBjIHRlc3QgImN0ZXN0IgorIyAJbWFrZSBmdGVzdAkJZ2VuZXJhdGUgZm9ydHJhbiB0ZXN0ICJmdGVzdCIKKyMJbWFrZSBjbGVhbgkJcmVtb3ZlcyBhbGwgc291cmNlcyBhbmQgYmluYXJpZXMKKyMgCW1ha2UgY2xlYW5hbGwJcmVtb3ZlcyBzb3VyY2VzLGJpbmFyaWVzIGFuZCBsb2dmaWxlcworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyAyLiBHZW5lcmFsIHRlc3RzdWl0ZSBzZXR0aW5ncworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgRm9yIGdlbmVyYWwgdGVzdHN1aXRlIHNldHRpbmdzIHNlZSB0aGUgY29uZmlndXJhdGlvbiBmaWxlCisjIG9tcHRzLmNvbmYKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIDMuIENvbXBpbGVyIHNlbGVjdGlvbiBhbmQgRmxhZ3MKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIENMQU5HIENvbXBpbGVyCitDQyAgICAgPSBjbGFuZworQ0ZMQUdTID0gLWZvcGVubXAgLVMgLWVtaXQtbGx2bQorRkMgICAgID0gZ2ZvcnRyYW4KK0ZGTEFHUyA9IC1mb3Blbm1wIC1sbQorRkZMQUdTID0gLWZvcGVubXAgLWxtIC1PMworCisjIEdOVSBDb21waWxlcgorIyBDQyAgICAgPSBnY2MKKyMgQ0ZMQUdTID0gLWZvcGVubXAgLWxtIC1PMworIyBGQyAgICAgPSBnZm9ydHJhbiAKKyMgRkZMQUdTID0gLWZvcGVubXAgLWxtCisjIEZGTEFHUyA9IC1mb3Blbm1wIC1sbSAtTzMKKworIyBGdWppdHN1IENvbXBpbGVyczoKKyNDQyA9IGZjYworI0NGTEFHUyA9IC1LT01QLGZhc3RfR1AyPTIKKyNGQz1mcnQKKyNGRkxBR1M9LUtPTVAsZmFzdF9HUDI9MiAtdyAtQW0gLVg5IC1GaXhlZAorCisKKyMgUEdJIGNvbXBpbGVycworI0NDID0gcGdjYworI0NGTEFHUyA9IC1tcAorI0NGTEFHUyA9IC1tcCAtRFZFUkJPU0UKKyNDRkxBR1MgPSAtZmFzdCAtbXAKKworI0ZDID0gcGdmOTAKKyNGRkxBR1MgPSAtZmFzdCAtbXAKKyNGRkxBR1MgPSAtbXAgLWcKKworCisjIEludGVsIGNvbXBpbGVyczoKKyNDQyA9IGljYworI0NGTEFHUyA9IC1PMyAtaXAgLW9wZW5tcAorI0NGTEFHUyA9IC1XYWxsIC1PMCAtb3Blbm1wCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtCisjQ0ZMQUdTID0gIC1vcGVubXAgLWxtIC1EVkVSQk9TRQorCisjRkMgPSBpZm9ydAorI0ZGTEFHUyA9IC1vcGVubXAgLWxtIC1mcHAKKworIyBPbW5pIGNvbXBpbGVyczoKKyNDQyA9IG9tcGNjCisjQ0ZMQUdTID0gLU8zIC1sbQorCisKKyMgQXNzdXJlIGNvbXBpbGVyczoKKyNDQyA9IGFzc3VyZWMKKyNDRkxBR1MgPSAtTzMgLVdBcG5hbWU9cHJvamVjdCAtRFVTRV9BU1NVUkU9MQorI0ZDID0KKyNGRkxBR1MgPQorCisjIE5FQzoKKyNDQyA9IGMrKworI0NDID0gc3hjKysKKyNDRkxBR1MgPSAtUG9wZW5tcAorCisjRkM9c3hmOTAKKyNGRkxBR1M9IC1Qb3Blbm1wCisKKworIyBIaXRhY2hpOgorI0NDID0geGNjCisjQ0ZMQUdTID0gLU80IC1wdmVjICtPcCAtcGFyYWxsZWwgLW9tcAorI0ZDID0KKyNGRkxBR1MgPQorCisKKyMgU0dJOgorI0NDID0gY2MKKyNDRkxBR1MgPSAtbXAgLWxtCisjRkMgPQorI0ZGTEFHUyA9CisKKworIyBJQk0gY29tcGlsZXJzOgorI0NDID0geGxjX3IKKyNDRkxBR1MgPSAtcXNtcD1vbXAgLWxtCisKKworI0ZDPXhsZjkwX3IKKyNGRkxBR1M9LXFzbXA9b21wIC1xZml4ZWQ9MTMyIC1xbGFuZ2x2bD1leHRlbmRlZAorCisKKyMgU1VOIGNvbXBpbGVycworI0NDID0gY2MKKyNDRkxBR1MgPSAtZmFzdCAteG9wZW5tcCAtbG0KKworI0ZDID1mOTAKKyNGRkxBR1MgPSAteG9wZW5tcCAtZmFzdCAtbG0KKworCisjIG9wZW42NCBjb21waWxlcnMKKyMgcmVtYXJrOiAtSS4gd2FzIGEgd29ya2Fyb3VuZCBiZWNhdXNlIHRoZSBpbnN0YWxsYXRpb24gY2FtZSB3aXRob3V0IG9tcC5oIGZpbGUKKyNDQyA9IG9wZW5jYworI0NGTEFHUyA9IC1PMCAtb3Blbm1wIC1sbSAtSS4gLWxvbXAgLWxwdGhyZWFkCisjQ0ZMQUdTID0gLU8wIC1vcGVubXAgLWxtIC1JIC9ob21lL21hdHRoZXcvb3B0L3Vzci9pbmNsdWRlIC1scHRocmVhZAorI0NGTEFHUyA9IC1vcGVubXAgLWxtCisKKyNGQyA9IG9wZW5mOTAKKyNGRkxBR1MgPSAtTzAgLW9wZW5tcCAtbG0gIC1sb21wIC1scHRocmVhZAorCisKKyNQYXRoc2NhbGUgQ29tcGlsZXIKKyNDQyA9IHBhdGhjYworI0NGTEFHUyA9IC1tcCAtT2Zhc3QgLWxtCisKKyNGQz1wYXRoZjkwCisjRkZMQUdTPSAtbXAgLU9mYXN0IC1sbQorCisKKyNPcGVuVUggQ29tcGlsZXIKKyNDQyA9IHVoY2MKKyNDRkxBR1MgPSAtbXAKKworI0ZDID0gdWhmOTAKKyNGRkxBR1MgPSAtbXAKKworIyBDaGVjayBwYXRoCitGSUxFPUxMVk0tSVIvbGl0LnRtcAorQ0hFQ0tfUEFUSD1gY2F0ICQoRklMRSlgCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworaGVscDoKKwlAZWNobyAiT3Blbk1QIFZhbGlkYXRpb24gU3VpdGUsIHYzLjAiCisJQGVjaG8gIihDKSBVbml2ZXJzaXR5IG9mIFN0dXR0Z2FydCwgVW5pdmVyc2l0eSBvZiBIb3VzdG9uIgorCUBlY2hvICIiCisJQGVjaG8gIkRvIG1ha2UgW3J1bGVdLCB3aGVyZSBydWxlIG1heSBiZSBvbmUgb2Y6IgorCUBlY2hvICIgIGN0ZXN0IgorCUBlY2hvICIgICAgQnVpbGQgYW5kIHJ1biB0aGUgT3Blbk1QL0MgdmFsaWRhdGlvbiB0ZXN0cy4iCisJQGVjaG8gIiAgZnRlc3QiCisJQGVjaG8gIiAgICBCdWlsZCBhbmQgcnVuIHRoZSBPcGVuTVAvRm9ydHJhbiB2YWxpZGF0aW9uIHRlc3RzLiIKKwlAZWNobyAiICBwcmludF9jb21waWxlX29wdGlvbnMiCisJQGVjaG8gIiAgICBEaXNwbGF5IHRoZSBkZWZhdWx0IGNvbXBpbGVyIGFuZCBjb21waWxlciBvcHRpb25zIGJlaW5nIHRlc3RlZCIKKwlAZWNobyAiICBjbGVhbnNyY3MiCisJQGVjaG8gIiAgICBSZW1vdmUgc291cmNlcyBnZW5lcmF0ZWQgZnJvbSB0aGUgdGVtcGxhdGVzIgorCUBlY2hvICIgIGNsZWFuYmlucyIKKwlAZWNobyAiICAgIFJlbW92ZSBleGVjdXRhYmxlcyBmcm9tIGJpbi8gZGlyZWN0b3J5IgorCUBlY2hvICIgIGNsZWFub3V0cyIKKwlAZWNobyAiICAgIFJlbW92ZSBhbGwgKi5vdXQgZmlsZXMgZnJvbSBiaW4vIGRpcmVjdG9yeSIKKwlAZWNobyAiICBjbGVhbmxvZ3MiCisJQGVjaG8gIiAgICBSZW1vdmUgYWxsICoubG9nIGZpbGVzIGZyb20gYmluLyBkaXJlY3RvcnkiCisJQGVjaG8gIiAgY2xlYW4iCisJQGVjaG8gIiAgICBDbGVhbiBvdXQgYW5kIGxvZyBmaWxlcyIKKwlAZWNobyAiICBkaXN0Y2xlYW4iCisJQGVjaG8gIiAgICBDbGVhbiBhcmNoIHRlc3QgZGlyZWN0b3J5IHdpdGggY2xlYW4iCisJQGVjaG8gIiAgdmVyeWNsZWFuIgorCUBlY2hvICIgICAgUmVtb3ZlIHRoZSBlbnRpcmUgYmluL2MgZGlyZWN0b3J5IHdpdGggZGlzdGNsZWFuIgorCitvbXBfbXlfc2xlZXA6CisJbWtkaXIgLXAgYmluL2MKKwljcCBvbXBfbXlfc2xlZXAuaCBiaW4vYy8KK29tcF90ZXN0c3VpdGU6IG9tcF90ZXN0c3VpdGUuaAorCW1rZGlyIC1wIGJpbi9jCisJY3Agb21wX3Rlc3RzdWl0ZS5oIGJpbi9jLworb21wX3Rlc3RzdWl0ZS5oOiBvbXB0cy1jLmNvbmYgYy8qCisJLi9vbXB0c19tYWtlSGVhZGVyLnBsIC1mPW9tcHRzLWMuY29uZiAtdD1jCisuYy5vOiBvbXBfdGVzdHN1aXRlIG9tcF9teV9zbGVlcAorCSQoQ0MpICQoQ0ZMQUdTKSAtYyAkPAorCitjdGVzdDogb21wX215X3NsZWVwIG9tcF90ZXN0c3VpdGUKKwkuL3J1bnRlc3QucGwgLS1sYW5nPWMgdGVzdGxpc3QtYy50eHQKKwljZCBiaW4vOyBtYWtlIC1qCisKK2Z0ZXN0OgorCW1rZGlyIC1wIGJpbi9mb3J0cmFuCisJY3Agb21wX3Rlc3RzdWl0ZS5mIGJpbi9mb3J0cmFuCisJY3Agb21wX215X3NsZWVwLmYgYmluL2ZvcnRyYW4KKwkuL3J1bnRlc3QucGwgLS1sYW5nPWZvcnRyYW4gdGVzdGxpc3QtZi50eHQKKworcHJpbnRfY29tcGlsZV9vcHRpb25zOgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJDIGNvbXBpbGVyIgorCUBlY2hvICItLS0tLS0tLS0tLS0tLS0tLS0tIgorCUBlY2hvICJjb21waWxhdGlvbjogJChDQykgJChDRkxBR1MpIgorCUAkKENDKSAtLXZlcnNpb24KKwlAZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlAZWNobyAiRm9ydHJhbiBjb21waWxlciIKKwlAZWNobyAiLS0tLS0tLS0tLS0tLS0tLS0tLSIKKwlAZWNobyAiY29tcGlsYXRpb246ICQoRkMpICQoRkZMQUdTKSIKKwlAJChGQykgLS12ZXJzaW9uCisKKworCitwYXRoX3RvX2FyY2g9JChzaGVsbCAuLi9ydW50aW1lL3Rvb2xzL2NoZWNrLW9wZW5tcC10ZXN0LnBsKQorCitjbGVhbnNyY3M6CisJZmluZCBiaW4vIC1pbmFtZSAiKi5bY2ZdIiAtZXhlYyBybSAtcmYge30gXDsKK2NsZWFuYmluczoKKwlmaW5kIGJpbi9jIC1wZXJtIC9hK3ggLXR5cGUgZiAtZXhlYyBybSAtcmYge30gXDsKKwlmaW5kIC4vYmluL2MgLW5vdCAtbmFtZSAiKi5jIiAtYSAtbm90IC1uYW1lICIqLmxsIiAtdHlwZSBmIC1leGVjIHJtIC1yZiB7fSBcOworY2xlYW5vdXRzOgorCWZpbmQgYmluLyAtaW5hbWUgIioub3V0IiAtZXhlYyBybSAtcmYge30gXDsKK2NsZWFubG9nczoKKwlmaW5kIGJpbi8gLWluYW1lICIqLmxvZyIgLWV4ZWMgcm0gLXJmIHt9IFw7CisJcm0gLXJmIC4vJChwYXRoX3RvX2FyY2gpCisKK2NsZWFuOiBjbGVhbm91dHMgY2xlYW5sb2dzIGNsZWFuYmlucyBjbGVhbnNyY3MKKworZGlzdGNsZWFuOiBjbGVhbgorCXJtIC1yZiBiaW4vYy8qCisJcm0gLXJmIExMVk0tSVIvJChDSEVDS19QQVRIKQorCit2ZXJ5Y2xlYW46IGRpc3RjbGVhbgorCXJtIC1yZiBiaW4vYy8KKwlybSAtcmYgYmluL2ZvcnRyYW4vCisKKworY2xlYW5hbGw6IAorCXJtIC1yZiAuL2Jpbi9jLworCXJtIC1yZiAuL2Jpbi9mb3J0cmFuLworCXJtIC1yZiAuL0xMVk0tSVIvJChwYXRoX3RvX2FyY2gpCisJcm0gLXJmIC4vJChwYXRoX3RvX2FyY2gpCisJcm0gLXJmIC4vKi5sb2cKKworCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL1JFQURNRV9MTFZNX09QRU5NUCBiL3JjMy90ZXN0c3VpdGUvUkVBRE1FX0xMVk1fT1BFTk1QCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjEwOGNhZGEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL1JFQURNRV9MTFZNX09QRU5NUApAQCAtMCwwICsxLDQ2IEBACisgPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorfCAgICAgICAgICAgICAgVG8gdXNlIHRoZSBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSBmb3IgdGVzdGluZyAgICAgICAgICAgICAgICB8IAorfCAJCQlMTFZNIE9wZW5NUCBJbXBsZW1lbnRhdGlvbiAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgCSAgIEhpZ2ggUGVyZm9ybWFuY2UgQ29tcHV0aW5nIGFuZCBUb29scywgICAgICAgICAgICAgICAgICAgICB8IAorfAkJCVVuaXZlcnNpdHkgb2YgSG91c3RvbiAgICAgICAgICAJCQkgICAgIHwKK3wgICAgICAgICAgICAgICAgICAgICAgICAgICAgIEphbi4gMjAxNSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfAorID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVHdvIG5ldyBmaWxlcyBoYXZlIGJlZW4gYWRkZWQgdG8gb3Blbm1wL3J1bnRpbWU6IGNoZWNrLW9wZW5tcC5wbCBhbmQgY2hlY2stb3Blbm1wLXRlc3QucGwgCitHbyB0byAvb3Blbm1wL3J1bnRpbWUsIHJ1bjoKK21ha2UgdGVzdCBjb21waWxlcj1jbGFuZworbWFrZSB0ZXN0LWNsZWFuICAKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCitGb3IgdGhlIE9wZW5NUC1MTFZNIFByb2plY3QsIGZvbGxvd2luZyBhcmUgdGhlIEZpbGVzIGFuZCBEaXJlY3RvcmllcyB0byBrbm93IGFib3V0OiAKKworCisgIGMgICAgICAgICAgICAgICAgICAgICAgICAgCSBEaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgYyB0ZXN0cworICBmb3J0cmFuICAgICAgICAgICAgICAgICAgIAkgRGlyZWN0b3J5IGNvbnRhaW5pbmcgdGhlIHRlbXBsYXRlcyBmb3IgdGhlIEZvcnRyYW4KKyAgTWFrZWZpbGUgICAgICAgICAgICAgICAgICAJIE1ha2VmaWxlIGNvbnRhaW5pbmcgb3B0aW9ucyBmb3IgY29tcGlsYXRpb24KKyAgUkVBRE1FX0xMVk1fT1BFTk1QICAgICAgICAgICAgIFJFQURNRSBmaWxlIGZvciB0byB1c2UgdGhlIE9wZW5NUCB0ZXN0LXN1aXRlIAorICBSRUFETUVfT3Blbk1QX1ZhbGlkYXRpb25fU3VpdGUgUkVBRE1FIGZpbGUgb24gdGhlIFZhbGlkYXRpb24gU3VpdGUsIHRlbXBsYXRlcywgZXRjLiwgCisJCQkJIGFzIGEgYmFzaXMgZm9yIHRlc3RpbmcgdGhlIExMVk0gT3Blbk1QIGltcGxlbWVudGF0aW9uLiAKKyAgTExWTV9JUgkJCSBEaXJlY3RvcnkgY29udGFpbmluZyB0YXJnZXQtc3BlY2lmaWMgSVIgZmlsZXMKKyAgYmluL2xpdCBmaWxlcwkJICAgICAgICAgSW4gdGhlIGxpdCBtb2RlbCwgZXZlcnkgdGVzdCBtdXN0IGV4aXN0IGluc2lkZSBzb21lIHRlc3Qgc3VpdGUuIAorCQkJCSBsaXQgcmVzb2x2ZXMgdGhlIGlucHV0cyBzcGVjaWZpZWQgb24gdGhlIGNvbW1hbmQgbGluZSB0byAKKwkJCQkgdGVzdCBzdWl0ZXMgYnkgc2VhcmNoaW5nIHVwd2FyZHMgZnJvbSB0aGUgaW5wdXQgcGF0aCAKKwkJCQkgdW50aWwgaXQgZmluZHMgYSBsaXQuY2ZnIG9yIGxpdC5zaXRlLmNmZyBmaWxlLiAKKwkJCQkgVGhlc2UgZmlsZXMgc2VydmUgYXMgYm90aCBhIG1hcmtlciBvZiB0ZXN0IHN1aXRlcyBhbmQgCisJCQkJIGFzIGNvbmZpZ3VyYXRpb24gZmlsZXMgd2hpY2ggbGl0IGxvYWRzIGluIG9yZGVyIHRvIAorCQkJCSB1bmRlcnN0YW5kIGhvdyB0byBmaW5kIGFuZCBydW4gdGhlIHRlc3RzIGluc2lkZSB0aGUgdGVzdCBzdWl0ZS4JCisgIGJpbi9oZWFkZXIJCQkgSGVhZGVyIGZvciB0aGUgdGVzdHMsIGNhbGxzIGNsYW5nIGRyaXZlciBmb3IgdGhlIHRlc3QsIAorCQkJCSBhbmQgZXhlY3V0ZXMgdGhlIHJlc3VsdGluZyBleGVjdXRhYmxlCQkJCisgIGJpbi9NYWtlZmlsZSAJCQkgVG8gZ2VuZXJhdGUgTExWTV9JUiBmaWxlcyAKKyAgYmluL2Rpc3RyaWJ1dGUuc2ggCQkgR2VuZXJhdGVzIExMVk1fSVIgZmlsZXMsIGZpbmRzIHRoZSBhcmNoaXRlY3R1cmUgYW5kIE9TLCBtb3ZlcyAKKwkJCQkgdGhlIGdlbmVyYXRlZCBJUiBmaWxlcyB0byB0aGUgY29ycmVzcG9uZGluZyBmb2xkZXIgCisgIHJ1bnRpbWUvdG9vbHMvY2hlY2stb3Blbm1wLnBsICBSZXRyaWV2aW5nIHRoZSByaWdodCBwYXRoIAorICBydW50aW1lL3Rvb2xzLworICBjaGVjay1vcGVubXAtdGVzdC5wbAkJIFJldHVybnMgdGhlIGFyY2hpdGVjdHVyZSBhbmQgT1MsIGUuZy4gbGluXzMyZQorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0NvbnRhY3QgYW5kIFN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250YWN0OiBodHRwOi8vd3d3LmNzLnVoLmVkdS9+aHBjdG9vbHMvCitFbWFpbDogc3VuaXRhQGNzLnVoLmVkdQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9SRUFETUVfT3Blbk1QX1ZhbGlkYXRpb25fU3VpdGUgYi9yYzMvdGVzdHN1aXRlL1JFQURNRV9PcGVuTVBfVmFsaWRhdGlvbl9TdWl0ZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44Y2E3YzYxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9SRUFETUVfT3Blbk1QX1ZhbGlkYXRpb25fU3VpdGUKQEAgLTAsMCArMSwzMzQgQEAKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Cit8ICAgICAgICAgICAgICAgICAgIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlICBWIDMuMCAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKK3wgICAgICAgICAgICAgIEhpZ2ggUGVyZm9ybWFuY2UgQ29tcHV0aW5nIENlbnRlciwgU3R1dHRnYXJ0ICAgICAgICAgICAgICAgICAgfAorfCAgICAgICBIaWdoIFBlcmZvcm1hbmNlIENvbXB1dGluZyBhbmQgVG9vbHMsIFVuaXZlcnNpdHkgb2YgSG91c3RvbiAgICAgICAgICB8Cit8ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgSmFuLiAyMDEyICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHwKKyA9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKKworVEFCTEUgT0YgQ09OVEVOVFMKKworSSAgICAJSU5UUk9EVUNUSU9OCitJLjEuCSAgQWltcyBhbmQgZ2VuZXJhbCBmdW5jdGlvbgorSS4yLiAJICBGaWxlcyBhbmQgZGlyZWN0b3JpZXMKKworSUkJCVVTQUdFCitJSS4xLgkgIEZpcnN0IHJ1biB3aXRoIG1ha2UKK0lJLjIJICBXaGVyZSB0byBzZWFyY2ggZm9yIHJlc3VsdHMKK0lJLjMuCSAgVXNpbmcgdGhlIHJ1bnRlc3Qgc2NyaXB0CisKK0lJSQkJQWRkaW5nIGFuZCBtb2RpZnlpbmcgdGVzdHMKK0lJSS4xLgkgIFRoZSB0ZW1wbGF0ZSBzdHJ1Y3R1cmUKKworSVYJCUtub3duIElzc3VlcyBhbmQgV29ya2Fyb3VuZAorCitWICAgICAgIENvbnRhY3QgYW5kIFN1cHBvcnQKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0kuICBJTlRST0RVQ1RJT04KKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitJLjEuICBBaW1zIGFuZCBnZW5lcmFsIGZ1bmN0aW9uCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgT3Blbk1QIHZhbGlkYXRpb24gc3VpdGUgaXMgZGVzaWduZWQgdG8gdmVyaWZ5IHRoZSBjb3JyZWN0IGltcGxlbWVudGF0aW9uCitvZiBPcGVuTVAgaW4gY29tcGlsZXJzLiBJdCBpcyBjYXBhYmxlIG9mIGNoZWNraW5nIEZvcnRyYW4gYXMgd2VsbCBhcyBjCitjb21waWxlci4KKworVGVzdGluZyB0aGUgaW1wbGVtZW50YXRpb24gaXMgYmFzZWQgb24gc3RhdGlzdGljcy4gRWFjaCBkaXJlY3RpdmUgaXMgdGVzdGVkCitieSBjb21wdXRpbmcgYW5kIHZlcmlmeWluZyB0aGUgcmVzdWx0IHdpdGggdGhlIGFscmVhZHkga25vd24gdmFsdWUuIEluIG1vc3QKK2Nhc2VzIGEgd3JvbmcgaW1wbGVtZW50YXRpb24gY2FuIHJlc3VsdCBpbiB0aGUgcmlnaHQgdmFsdWVzLiBTbyB0aGUgdGVzdHMgYXJlCitydW4gc2V2ZXJhbCB0aW1lcy4KKworQWRkaXRpb25hbGx5LCB0aGUgdmFsaWRhdGlvbiBzdWl0ZSBjcmVhdGVzIHNvIGNhbGxlZCBjcm9zc3Rlc3RzIGZvciBlYWNoCitkaXJlY3RpdmUuIFRoZXNlIGFyZSB0ZXN0cyBpbiB3aGljaCBlaXRoZXIgdGhlIGRpcmVjdGl2ZSBpcyBtaXNzaW5nIG9yIHVzZWQKK3dpdGggZGlmZmVyZW50IGFyZ3VtZW50cy4gSWYgdGhpcyBzbyBjYWxsZWQgY3Jvc3N0ZXN0IGZhaWxzLCB0aGlzIGluZGljYXRlcworc3Ryb25nbHkgdGhhdCB0aGUgcHJldmlvdXMgdGVzdCBpcyBjYXBhYmxlIG9mIHRlc3RpbmcgdGhlIGRpcmVjdGl2ZS4KKworTGFzdGx5LCBhbiBvcnBoYW5lZCB0ZXN0IGlzIGFsc28gcnVuIHRvIGRldGVybWluZSBpZiB0aGUgZGlyZWN0aXZlIGJlaW5nCit0ZXN0ZWQgaXMgYWJsZSB0byBjb3JyZWN0bHkgcnVuIHdoZW4gJ29ycGhhbmVkJyBmcm9tIHRoZSBtYWluIGZ1bmN0aW9uLgorRXNzZW50aWFsbHksIHRoZSBkaXJlY3RpdmUncyBjb2RlIGlzIHBsYWNlZCBpbnRvIGl0cyBvd24gZnVuY3Rpb24gd2hpY2ggaXMKK2NhbGxlZCBkdXJpbmcgZXhlY3V0aW9uIG9mIHRoZSBtYWluIGZ1bmN0aW9uIGFuZCBvZnRlbiBpbnNpZGUgYSBwYXJhbGxlbAorcmVnaW9uLgorCisKK0kuMi4gIEZpbGVzIGFuZCBkaXJlY3RvcmllcworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK2QgYyAgICAgICAgICAgICAgICAgICAgICAgICBkaXJlY3RvcnkgY29udGFpbmluZyB0aGUgdGVtcGxhdGVzIGZvciB0aGUgYyB0ZXN0cworZCBmb3J0cmFuICAgICAgICAgICAgICAgICAgIGRpcmVjdG9yeSBjb250YWluaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBGb3J0cmFuCisgICAgICAgICAgICAgICAgICAgICAgICAgICAgdGVzdHMKKyAgTWFrZWZpbGUgICAgICAgICAgICAgICAgICBNYWtlZmlsZSBjb250YWluaW5nIG9wdGlvbnMgZm9yIGNvbXBpbGF0aW9uCisgIGNvbW1vbl91dGlsaXR5LmYKKyAgb21wX215X3NsZWVwLmggICAgICAgICAgICB0aHJlYWQgc2F2ZSBzbGVlcCBmdW5jdGlvbgorICBvbXBfdGVzdHN1aXRlLmYgICAgICAgICAgIEZvcnRyYW4gaGVhZGVyIGZpbGUKKyAgb21wX3Rlc3RzdWl0ZS5oICAgICAgICAgICBhdXRvZ2VuZXJhdGVkIGMtaGVhZGVyIGZpbGUKKyAgb21wdHMtYy5jb25mICAgICAgICAgICAgICBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSBjIHRlc3RzIGFib3V0IGhvdyBvZnRlbgorICAgICAgICAgICAgICAgICAgICAgICAgICAgIHRoZSB0ZXN0cyBzaGFsbCBiZSBleGVjdXRlZCBvciBob3cgbGFyZ2UgdGhlIGxvb3Agc2l6ZQorICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlzCisgIG9tcHRzX21ha2VIZWFkZXIucGwJICAgIHBlcmwgbW9kdWxlIGZvciBhdXRvbWF0aWNhbGx5IGdlbmVyYXRpb24gb2YgYW4gdXAKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0byBkYXRlIGhlYWRlciBmaWxlCisgIG9tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQlwZXJsIG1vZHVsZSBjb250YWluaW5nIGdlbmVyYWwgZnVuY3Rpb25zIGZvcgorCQkJCSAgICAgICAgICAgIHRoZSBwYXJzZXIucGwgc2NyaXB0CisgIG9tcHRzX3BhcnNlci5wbAkgICAgICAgIHNjcmlwdCBmb3IgZ2VuZXJhdGluZyB0aGUgc291cmNlIGNvZGUgb3V0IG9mIHRoZSB0ZW1wbGF0ZXMKKyAgb21wdHNfc3RhbmRhbG9uZVByb2MuYwlmcmFtZXdvcmsgZm9yIHRoZSBjIHRlc3RzCisgIG9tcHRzX3N0YW5kYWxvbmVQcm9jLmYJZnJhbWV3b3JrIGZvciB0aGUgRm9ydHJhbiB0ZXN0cworICBSRUFETUUJCSAgICAgICAgICAgIHRoZSBSRUFETUUgZmlsZSB5b3UndmUgYWxyZWFkeSBmb3VuZCA7LSkKKyAgTElDRU5TRSAgICAgICAgICAgICAgICAgICBjb250YWlucyBsaWNlbnNlIGluZm9ybWF0aW9uCisgIHJ1bnRlc3QucGwJCSAgICAgICAgdGhlIGZyYW1lIHByb2dyYW0gb2YgdGhlIHRlc3Qgc3VpdGUKKyAgdGVzdGxpc3QtZi50eHQJICAgICAgICB0ZXN0IGxpc3QgY29udGFpbmluZyB0aGUgYXZhaWxhYmxlIHRlc3RzIGZvciBGb3J0cmFuCisgIHRlc3RsaXN0LWMudHh0CSAgICAgICAgdGVzdCBsaXN0IGNvbnRhaW5pbmcgdGhlIGF2YWlsYWJsZSB0ZXN0cyBmb3IgYworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitJSS4gIFVTQUdFCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworCitJSS4xLiBGaXJzdCBydW4gd2l0aCBtYWtlCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1lvdSBjYW4gZG8gYSBmaXJzdCBzaW1wbGUgcnVuIG9mIHRoZSB0ZXN0c3VpdGUgb25seSBhZnRlciBvbmUgc3RlcCBvZgorY29uZmlndXJhdGlvbjoKKworMSkgTW9kaWZ5IHRoZSBvbXB0cy5jb25mIGFuZCBvbXB0cy1jLmNvbmYgZmlsZSwgY2hhbmdlIHRoZSBudW1iZXIgb2YgdGhyZWFkcworYW5kIG51bWJlciBvZiByZXBldGl0aW9ucyBvZiBlYWNoIHRlc3QuCisKKzIpIE1vZGlmeSB0aGUgTWFrZWZpbGUsIHVuY29tbWVudGluZyB0aGUgQ0MvRkMgYW5kIENGTEFHUy9GRkxBR1MgdmFyaWFibGVzIGZvcgordGhlIGNvbXBpbGVyIG9mIHlvdXIgY2hvaWNlLgorCitBbmQgbm93IHlvdSBjYW4gcnVuIHRoZSB0ZXN0c3VpdGUgZWl0aGVyIGZvciBhIEMgY29tcGlsZXIgd2l0aDoKKworPgltYWtlIGN0ZXN0CisKK29yIGZvciBhIEZvcnRyYW4gY29tcGlsZXIgd2l0aDoKKworPgltYWtlIGZ0ZXN0CisKKworSUkuMi4gUnVubmluZyBjdXN0b20gdGVzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworSW4gb3JkZXIgdG8gcnVuIHNpbmdsZSB0ZXN0cyBvciBjdXN0b20gZ3JvdXBzIG9mIHRlc3RzLCB0d28gbWFrZSBjb21tbWFuZHMKK2FyZSBkZWZpbmVkOiBtYWtlIHN0ZXN0IGFuZCBtYWtlIGZzdGVzdC4gVGhlc2UgdHdvIGNvbW1hbmQgcmVmZXJlbmNlIHRoZSBmaWxlCitjdXN0b210ZXN0LnR4dCB3aGVuIGxvb2tpbmcgZm9yIGEgdGVzdGxpc3QgdG8gdXNlLiBTaW1wbHkgZWRpdCBjdXN0b210ZXN0LnR4dAordG8gaW5jbHVkZSB0aGUgZGVzaXJlZCB0ZXN0IG9yIHRlc3RzLiBJZiBjdXN0b210ZXN0LnR4dCBjb250YWlucyBjIHRlc3RzLAorCis+ICAgICAgbWFrZSBzdGVzdAorCitvciBmb3IgZm9ydHJhbiB0ZXN0cworCis+ICAgICAgbWFrZSBmc3Rlc3QKKworSW4gb3JkZXIgdG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyB1c2VkIGluIHRoZSB0ZXN0cywgc2ltcGx5IGVkaXQgdGhlCitNYWtlZmlsZSB2YXJpYWJsZXMgTUlOVEhSRUFEUyBhbmQgTUFYVEhSRUFEUy4gQnkgZGVmYXVsdCwgdGhleSBhcmUgY29uZmlndXJlZAordG8gdXNlIDIgdGhyZWFkcy4gVG8gY2hhbmdlIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0IGlzIHJ1biwgZm9yIGMgdGVzdHMKK2VkaXQgdGhlIFJFUEVUSVRJT05TIHZhcmlhYmxlIGluIHRoZSBmaWxlIG9tcHRzLWMuY29uZi4gVGhlIExPT1BDT1VOVCBhbmQKK1NMRUVQVElNRSB2YXJpYWJsZXMgY2FuIGFsc28gYmUgY2hhbmdlZCBoZXJlLiBGb3IgZm9ydHJhbiB0ZXN0cywgZWRpdCB0aGUgZmlsZQorb21wX3Rlc3RzdWl0ZS5mIHRvIGNoYW5nZSBib3RoIHRoZSBMT09QQ09VTlQgYW5kIHRoZSBudW1iZXIgb2YgdGltZXMgZWFjaCB0ZXN0CitpcyBydW4uCisKKworCitJSS4zLiBVbmRlcnN0YW5kaW5nIHRoZSByZXN1bHRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCitXaGVuIHJ1bm5pbmcgdGhlIHRlc3RzdWl0ZSB0aGUgcmVzdWx0cyB3aWxsIGJlIHNob3duIG9uIHRoZSBzY3JlZW4uCisKK0lmIHlvdSBuZWVkIHRoZSByZXN1bHRzIGZvciBmdXJ0aGVyIHB1cnBvc2UgeW91IGNhbiB1c2UgdGhlIHJlc3VsdHMudHh0LCB3aGljaAoraXMgYSBzaW1wbGUgbGlzdCBjb250YWluaW5nIHRoZSByZXN1bHRzIGZvciBlYWNoIGRpcmVjdGl2ZQoraW4gYSBzaW5nbGUgbGluZS4gRWFjaCBsaW5lIHN0YXJ0cyB3aXRoIHRoZSBuYW1lIG9mIHRoZSBkaXJlY3RpdmUuIFRoZW4gZm9sbG93cwordGhlIHJlc3VsdCBvZiB0aGUgdGVzdCBnaXZlbiBpbiB0aGUgcGVyY2VudGFnZSBvZiB0aGUgcGFzc2VkIHRlc3RzLiBJZiAxMDAlIG9mCit0aGUgdGVzdHMgcGFzc2VkIHN1Y2Nlc3NmdWxseSwgdGhlIHNlY29uZCBudW1iZXIgZ2l2ZXMgdGhlIHJlc3VsdCBvZiB0aGUKK2NvcnJlc3BvbmRpbmcgY3Jvc3N0ZXN0LiBDcm9zc3Rlc3RzIHdpbGwgb25seSBiZSBydW4gaWYgdGhlIG5vcm1hbCB0ZXN0IHBhc3Nlcword2l0aCAxMDAlIGFjY3VyYWN5LiBJZiBhIGNyb3NzdGVzdCB3YXMgbm90IHJ1biBvciBhIHRlc3QgZG9lcyBub3QgZXhpc3QsIGl0IGlzCitkZW5vdGF0ZWQgYnkgYSAiLSIuCitBZnRlciB0aGUgcmVzdWx0cyBvZiB0aGUgbm9ybWFsIHRlc3RzLCB0aGVyZSBmb2xsb3cgYSBzZXJpZXMgb2YgdGVzdHMgaW4gdGhlCitvcnBoYW5lZCBtb2RlLiBJZiB0aGVyZSB3ZXJlIG5vIG9ycGhhbmVkIHRlc3RzIGF2YWlsYWJsZSB0aGlzIGlzIHNob3duIGJ5IGEgIi0iLgorCitJZiB5b3UgcnVuIHRoZSB0ZXN0c3VpdGUgd2l0aCBkaWZmZXJlbnQgbnVtYmVycyBvZiB0aHJlYWRzIChlLmcuIHVzaW5nIHRoZQorcnVudGVzdC5wbCBzY3JpcHQpIHRoZSByZXN1bHRzIGFyZSBzaG93biBpbiBibG9ja3Mgb2YgNCBjb2x1bW5zIGZvciBlYWNoIG51bWJlcgorb2YgdGhyZWFkcy4KKworSWYgYSB0ZXN0IGZhaWxzIHlvdSBjYW4gZmluZCBtb3JlIGRldGFpbGVkIGluZm9ybWF0aW9uIGluIHRoZSBvbXB0cy5sb2csCitiaW4vYy8qLm91dCBhbmQgKi5sb2cgZmlsZXMuIFdoaWxlIHRoZSBvbXB0cy5sb2cgZmlsZSBjb250YWlucyBhbGwgY29tcGlsZXIKK2Vycm9yIG1lc3NhZ2VzIGZvciBhbGwgdGVzdHMsIHRoZSAqLm91dCBhbmQgKi5sb2cgZmlsZXMgY29udGFpbiBkZXRhaWxlZCBpbmZvcmFtdGlvbgorb24gdGhlIGV4ZWN1dGlvbiBwcm9jZXNzIG9mIHRoZSBzaW5nbGUgdGVzdHMuCitJbiB0aGUgKi5vdXQgZmlsZXMgdGhlcmUgYXJlIGxpc3RlZCBhbGwgdGhlIHJlc3VsdHMgb2YgdGhlIHNpbmdsZSBleGVjdXRpb25zIG9mCit0aGUgdGVzdHMuIEluIHRoZSAqLmxvZyBmaWxlcyB0aGVyZSBhcmUgZXJyb3IgbWVzc2FnZXMgb2YgdGhlIHRlc3RzIGl0c2VsZi4KKworCitJSS40LiBDbGVhbmluZyBVcAorLS0tLS0tLS0tLS0tLS0tLS0KKworCitCZWNhdXNlIG1hbnkgZmlsZXMgYXJlIGdlbmVyYXRlZCBmb3IgZWFjaCB0ZXN0ZWQgZGlyZWN0aXZlLCBpdCBpcyBvZnRlbiBuZWNlc3NhcnkKK3RvIGNsZWFuIHRoZSBtYWluIGRpcmVjdG9yeSBhZnRlciBhIGJhdHRlcnkgb2YgdGVzdHMuIFRvIGNsZWFuIGFsbCBnZW5lcmF0ZWQgZmlsZXMKK2luIHRoZSBtYWluIGRpcmVjdG9yeSBpbmNsdWRpbmcgdGhlIHJlc3VsdHMgYW5kIGxvZyBmaWxlcywKKworPiAgICAgbWFrZSBjbGVhbgorCisKK1RvIGNsZWFuIG9ubHkgdGhlIGxvZ3MgYW5kIG91dCBmaWxlcywKKworPiAgICAgbWFrZSBjbGVhbmxvZ3MKKworVG8gY2xlYW4gb25seSB0aGUgcmVzdWx0cywKKworPiAgICAgbWFrZSBjbGVhbnJlc3VsdHMKKworCisKK0lJLjQuIFVzaW5nIHRoZSBydW50ZXN0IHNjcmlwdAorLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCisKK1NvIGZvciBzcGVjaWFsIHB1cnBvc2UgeW91IGNhbiB1c2UgdGhlIHJ1bnRlc3QucGwgc2NyaXB0LCB3aGljaCBhbGxvd3MgYSBsb3QKK21vcmUgb3B0aW9ucyBmb3IgdGhlIGV4ZWN1dGlvbiBwcm9jZXNzIHRoYW4gdGhlIGV4ZWN1dGlvbiB3aXRoIG1ha2UuCisKK1VzaW5nIHRoZSBydW50ZXN0LnBsIHNjcmlwdCBpcyByYXRoZXIgZWFzeS4gWW91IGNhbiB1c2UgdGhlIHRoZSB0ZXN0IHN1aXRlIG9ubHkKK2FmdGVyIHR3byBzdGVwcyBvZiBtb2RpZmljYXRpb25zOgorCisxLikgTW9kaWZ5IHRoZSBNYWtlZmlsZSB0byB5b3VyIHdpc2hlcyBjaG9vc2luZyB5b3VyIGNvbXBpbGVyIGFuZCB0aGUgbmVjZXNzYXJ5CisgICAgY29tcGlsZXIgZmxhZ3MuCisyLikgSWYgbmVjZXNzYXJ5IGVkaXQgb25lIG9mIHRoZSB0ZXN0IGxpc3RzICh0ZXN0bGlzdC1jLnR4dCkgYW5kIGNvbW1lbnQgb3V0IHRoZQorICAgIHRlc3RzIHlvdSBkbyBub3Qgd2FudCB0byBydW4gdXNpbmcgIyBhdCB0aGUgYmVnaW5uaW5nIG9mIGEgbGluZS4gVGVzdGxpc3RzIGZvciBGb3J0cmFuIGVuZAorICAgIHdpdGggLWYudHh0IHdoaWxlIHRlc3QgbGlzdHMgZm9yIGMgd2l0aCAtYy50eHQuCisKK0FuZCBub3cgeW91IGNhbiBydW4gdGhlIHRlc3Qgc3VpdGUgZWl0aGVyIGZvciBGb3J0cmFuIHVzaW5nCisJIwk+ICAuL3J1bnRlc3QucGwgLWxhbmc9Zm9ydHJhbiAtZD1mb3J0cmFuIHRlc3RsaXN0LWYudHh0CitvciBmb3IgYworCSMJPiAgLi9ydW50ZXN0LnBsIC1sYW5nPWMgLWQ9YyB0ZXN0bGlzdC1jLnR4dAorCitXaXRoIHRoZSAtLWhlbHAgb3B0aW9uIHlvdSBjYW4gc2hvdyB0aGUgY29tcGxldGUgbGlzdCBvZiBvcHRpb25zIGFuZCB0aGVpcgorZXhwbGFuYXRpb25zLgorCitUaGUgdGVzdCByZXN1bHRzIGFyZSBzdW1tYXJpemVkIGluIGNyZXN1bHRzIG9yIGZyZXN1bHRzLnR4dCB3aGlsZSAqLmxvZyBrZWVwCitkZXRhaWxzIGZvciBpbmRpdmlkdWFsIHRlc3RzLiBUaGVyZSBpcyBhbHNvIGEgZmlsZSAob21wdHMubG9nKSBrZWVwaW5nCitjb21waWxhdGlvbiBpbmZvcm1hdGlvbi4gKHNlZSBzZWN0aW9uIElJLjIgKQorCitJZiB5b3UgZG9uJ3Qgd2FudCB0byB0ZXN0IHRoZSBkaXJlY3RpdmVzIGluIG9ycGhhbmVkIG1vZGUgeW91IGNhbiB1c2UgdGhlCistbm9ycGhhbiBvcHRpb24uIFlvdSBhbHNvIGNhbiB1c2UgdGhlIHJ1bnRlc3QucGwgc2NyaXB0IGVpdGhlciB0byBjb21waWxlIGFsbAordGVzdHMgb3IgcnVuIGNvbXBpbGVkIHRlc3RzIGUuZy4gZm9yIGNyb3NzIGNvbXBpbGF0aW9uIG9uIG90aGVyIHBsYXRmb3Jtcy4gRm9yCit0aGlzIHRoZXJlIGFyZSB0aGUgb3B0aW9ucyAtbm9ydW4gYW5kIC1ub2NvbXBpbGUuCisKK0hhcHB5IHRlc3RpbmchCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0lJSS4JSG93IHRvIGFkZCBuZXcgdGVzdHMgLyBUaGUgc3RydWN0dXJlIG9mIHRlc3QgdGVtcGxhdGVzCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworSUlJLjEgIFRoZSB0ZW1wbGF0ZSBzdHJ1Y3R1cmUKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitUaGUgdGVzdCBzdWl0ZSBpcyBiYXNlZCBvbiB0ZW1wbGF0ZXMgc28gdGhhdCB5b3Ugb25seSBoYXZlIG9uZSBmaWxlIGZvciB0ZXN0LAorY3Jvc3N0ZXN0IGFuZCB0aGUgb3JwaGFuZWQgdmVyc2lvbnMgb2YgdGhlbS4KKworCUEpIERlc2NyaXB0aW9uIG9mIHRoZSB0ZW1wbGF0ZSBzdHJ1Y3R1cmUKKworVGhlIHN5bnRheCBvZiB0aGUgdGVtcGxhdGVzIGlzIG11Y2ggbGlrZSB4bWwuIFNvIGVhY2ggdGVzdCBiZWdpbnMgd2l0aAorJzxvbXB0czp0ZXN0PicgYW5kIGVuZHMgd2l0aCAnPC9vbXB0czp0ZXN0PicuCisKK0luIGJldHdlZW4gdGhlcmUgYXJlIHNldmVyYWwgb3RoZXIgYmxvY2tzIGhvbGRpbmcgaW5mb3JtYXRpb246CisKKy0gPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+IEluIGJldHdlZW4gdGhpcyB0YWcgeW91IGNhbgorICBnaXZlIGEgZGVzY3JpcHRpb24gb24gd2hhdCB0aGUgdGVzdCBjaGVja3MgYW5kIGhvdyBpdCB3b3Jrcy4KKworLSA8b21wdHM6b21wdmVyc2lvbj4gPC9vbXB0czp2ZXJzaW9uPiBUaGlzIHRhZyBpcyB1c2VkIHRvIHNwZWNpZnkgdGhlCisgIE9wZW5NUC12ZXJzaW9uIHdoaWNoIGluY2x1ZGVzIHRoZSB0ZXN0ZWQgZGlyZWN0aXZlLgorCistIDxvbXB0czpkaXJlY3RpdmU+IDwvb21wdHM6ZGlyZWN0aXZlPiBVc2VkIHRvIHNwZWNpZnkgdGhlIGRpcmVjdGl2ZSBob3cgaXQgaXMKKyAgY2FsbGVkIGluIHRoZSBwcm9ncmFtbWluZyBsYW5ndWFnZS4KKworLSA8b21wdHM6ZGVwZW5kZW5jZXM+IDwvb21wdHM6ZGVwZW5kZW5jZXM+IFdpdGggdGhpcyB0YWcgeW91IGNhbiBzcGVjaWZ5IG90aGVyCisgIG9tcCBkaXJlY3RpdmVzIHdoaWNoIGFyZSBuZWNlc3NhcnkgZm9yIHRoZSBjb3JyZWN0IGV4ZWN1dGlvbiBvZiB5b3VyIHRlc3QuCitUaGUgZGlyZWN0aXZlcyBoYXZlIHRvIGJlIGxpc3RlZCBieSB0aGVpciBkaXJlY3RpdmUgbmFtZXMgYXMgaXQgaXMgY2FsbGVkIGluCit0aGUgcHJvZ3JhbW1pbmcgbGFuZ3VhZ2UuIE11bHRpcGxlIGRpcmVjdGl2ZXMgYXJlIHNlcGFyYXRlZCBieSAnLCcuCisKKy0gPG9tcHRzOnRlc3Rjb2RlPiA8L29tcHRzOnRlc3Rjb2RlPiBJbiB0aGlzIHRhZyBzdGFuZHMgdGhlIHdob2xlIHNvdXJjZSBjb2RlCitmb3IgdGhlIHRlc3QgLyBjcm9zc3Rlc3QuICBFYWNoIHRlc3QgaGFzIHRvIGJlIHdyaXR0ZW4gYXMgYSBmdW5jdGlvbi4gVGhlCitzeW50YXggb2YgdGhlIGZ1bmN0aW9ucyBkaWZmZXJzIGJldHdlZW4gQyBhbmQgRm9ydHJhbjogSW4gQyBpdCBoYXMgdG8gdGFrZSBhCitmaWxlIHBvaW50ZXIgJ0ZJTEUgKiBsb2dGaWxlJyBhbmQgcmV0dXJuIGFuIGludC4gSWYgdGhlIHRlc3QgaGFzIGJlZW4gcGFzc2VkCitzdWNjZXNzZnVsIGl0IGhhcyB0byByZXR1cm4gYSB2YWx1ZSB1bmVxdWFsIHRvIDAuIFRoZSBmaWxlIHBvaW50ZXIgY2FuIGJlIHVzZWQKK3RvIHdyaXRlIGluZm9ybWF0aW9uIGludG8gYSBsb2cgZmlsZS4gIEluIEZvcnRyYW4gdGhlIGZ1bmN0aW9uIHRha2VzIG5vCithcmd1bWVudCBhbmQgdGhlIGZ1bmN0aW9uIG5hbWUgbXVzdCBub3QgZXhjZWVkIFhYIGNoYXJhY3RlcnMuICBUaGUgcmV0dXJuIHZhbHVlCitoYXMgdG8gYmUgc3BlY2lmaWVkIHVzaW5nIHRoZSAnPHRlc3RmdW5jdGlvbm5hbWU+JyB0YWdzLiBJdCBoYXMgdG8gYmUgMSBpZiB0aGUKK3Rlc3Qgc3VjY2VlZGVkIGFuZCAwIGlmIHRoZSB0ZXN0IGZhaWxlZC4gRm9yIGRldGFpbHMgc2VlIHRoZSBleGFtcGxlLgorCitUbyB0ZWxsIHRoZSB0ZXN0IHN1aXRlIHRoZSBuYW1lIG9mIHlvdXIgdGVzdCBmdW5jdGlvbiB5b3UgaGF2ZSB0byBlbmNsb3NlIGl0CitpbnRvIHRoZSAnPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+JyB0YWcuCisKK0lmIHRoZXJlIGFyZSBkaWZmZXJlbmNlcyBiZXR3ZWVuIHRlc3QgYW5kIGNyb3NzdGVzdCB5b3UgY2FuIHVzZSB0aGUKKzxvbXB0czpjaGVjaz4gPC9vbXB0czpjaGVjaz4gYW5kIDxvbXB0czpjcm9zc2NoZWNrPiA8L29tcHRzOmNyb3NzY2hlY2s+IHRhZy4KK1doZW4gZ2VuZXJhdGluZyB0aGUgdGVzdCB0aGUgcGFyc2VyIHdpbGwgdXNlIHRoZSBjb2RlIGVuY2xvc2VkIGluCis8b21wdHM6Y2hlY2s+IHRhZ3MgYW5kIGN1dCBvdXQgdGhlIGNvZGUgd3JpdHRlbiBpbiA8b21wdHM6Y3Jvc3NjaGVjaz4gdGFncy4gU28KK3lvdSBoYXZlIHR3byBwb3NzaWJpbGl0aWVzIHRvIHdyaXRlIHlvdXIgdGVtcGxhdGUgZm9yIHRlc3QgYW5kIGNyb3NzdGVzdDogVGhlCitmaXJzdCB3YXkgeW91IGNhbiB3cml0ZSB0aGUgY29tcGxldGUgY29kZSBpcyB0byB3cml0ZSB0aGUgdGVzdCBpbiBvbmUKKzxvbXB0czpjaGVjaz4gdGFnIGFuZCBsYXRlciB0aGUgY3Jvc3N0ZXN0IGluIG9uZSA8b21wdHM6Y3Jvc3NjaGVjaz4gdGFnLiAgVGhlCitzZWNvbmQgd2F5IGlzIHRvIHdyaXRlIGJvdGggdGVzdHMgb25seSBieSBlbmNsb3NpbmcgZGlmZmVyaW5nIHBhcnRzIGluCitjb3JyZXNwb25kaW5nIHRhZ3MuCisKK1RoZSBmaXJzdCBtZXRob2Qgc2hvdWxkIGJlIHByZWZlcnJlZCBpZiB0ZXN0IGFuZCBjcm9zc3Rlc3QgZGlmZmVyIG11Y2ggZnJvbQorZWFjaCBvdGhlci4gVGhlIHNlY29uZCBlLmcuIGlmIHlvdSBvbmx5IHdhbnQgdG8gY2hhbmdlIGEgZmV3IG9wdGlvbnMgbGlrZQorcmVwbGFjaW5nIGFuIG9tcCBzaW5nbGVwcml2YXRlIGNsYXVzZSBieSBhbiBvbXAgcHJpdmF0ZSBjbGF1c2Ugb3IgdG8gY3V0IG91dAorYSBkaXJlY3RpdmUgbGlrZSBvbXAgZmx1c2guICBXaGVuIHlvdSB1c2UgdGhlIGZpcnN0IHdheSB5b3UgaGF2ZSB0byB0YWtlIGNhcmUKK29mIHRoZSBmdW5jdGlvbiBuYW1lISBZb3UgaGF2ZSB0byBkZWNsYXJlIGl0IHR3aWNlIHdpdGgKKzxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IQorCistIDxvbXB0czpvcnBoYW4+IDwvb21wdHM6b3JwaGFuPiBUaGlzIHRhZyBjYW4gYmUgdXNlZCBpZiB5b3Ugd2FudCB0byBlbmFibGUKKyAgeW91ciB0ZXN0IHRvIGNoZWNrIHRoZSBkaXJlY3RpdmUgaW4gb3JwaGFuIHJlZ2lvbnMsIHRvby4gIFRoZSBjb2RlIGVuY2xvc2VkCitpbiB0aGlzIHBhcnQgd2lsbCBiZSB3cml0dGVuIHRvIGEgc2VwYXJhdGUgZnVuY3Rpb24gd2hpY2ggd2lsbCBiZSBjYWxsZWQKK2luc3RlYWQuICBJZiB5b3UgaGF2ZSB2YXJpYWJsZXMgd2hpY2ggYXJlIHVzZWQgb3V0c2lkZSB0aGlzIHJlZ2lvbiB5b3UgaGF2ZSB0bworZGVjbGFyZSB0aGVtIGFzIGdsb2JhbCB2YXJpYWJsZXMgZW5jbG9zZWQgaW4gYW4gPG9tcHRzOm9ycGhhbjp2YXJzPiB0YWcuIEZvcgorZnVydGhlciBpbmZvcm1hdGlvbiBzZWUgdGhlIGRlc2NyaXB0aW9uIG9mIHRoZSA8b21wdHM6b3JwaGFuOnZhcnM+IHRhZy4KKworLSA8b21wdHM6b3JwaGFuOnZhcnM+IDwvb21wdHM6b3JwaGFuOnZhcnM+IFRoaXMgdGFnIGlzIHVzZWQgdG8gc3BlY2lmeSBnbG9iYWwKKyAgdmFyaWFibGVzIGZvciBhbiBvcnBoYW4gcmVnaW9uIHdoaWNoIGFsbG93IHRoZSBleGNoYW5nZSBvZiB2YWx1ZXMgYmV0d2VlbgordGhlIG1haW4gcHJvZ3JhbSBhbmQgdGhlIG9ycGhhbmVkIGZ1bmN0aW9ucy4gVGhlIHVzYWdlIGRpZmZlcnMgYmV0d2VlbiBDIGFuZAorRm9ydHJhbi4gIEluIEMgeW91IGhhdmUgdG8gdXNlIGEgc2luZ2xlIGRlY2xhcmF0aW9uIGZvciBlYWNoIHZhcmlhYmxlLiBZb3UgY2FuCitlaXRoZXIgZGVjbGFyZSBhbGwgdmFyaWFibGVzIGluIG9uZSBzaW5nbGUgb3IgaW4gc2V2ZXJhbCBkaWZmZXJlbnQgcmVnaW9ucy4gWW91CittdXN0IG5vdCBpbml0aWFsaXplIHRoZSB2YXJpYWJsZXMgaW5zaWRlISAgSW4gRm9ydHJhbiB5b3UgaGF2ZSB0byBwdXQgYWxsCitkZWNsYXJhdGlvbnMgaW4gb25lIHNpbmdsZSB0YWcuIEJlY2F1c2UgdGhlcmUgZXhpc3Qgbm8gZ2xvYmFsIHZhcmlhYmxlcyBhcyBpbgorQyB5b3UgaGF2ZSB0byB1c2UgY29tbW9uIGJsb2Nrcy4gRm9yIGZ1cnRoZXIgaW5mb3JtYXRpb24gc2VlIHRoZSBleGFtcGxlcy4KKworSUlJLjIuICBBZGRpbmcgdGVzdHMgdG8gdGhlIHRlc3QgbGlzdHMKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKK0FmdGVyIHlvdSBoYXZlIGNyZWF0ZWQgYSBuZXcgdGVzdCB5b3UgaGF2ZSB0byBhZGQgdGhlbSB0byBhIHRlc3RsaXN0LiBTaW1wbHkKK2FkZCB0aGUgZnVuY3Rpb24gbmFtZSBpbiBhIG5ldyBMaW5lIGludG8gYSBmaWxlLgorCisKKworLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisKKworSVYuICAgS25vd24gSXNzdWVzIGFuZCBXb3JrYXJvdW5kCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KKworVGhlIFN1biBPUyBoYXMgYSBwcm9ibGVtIHdpdGggdGhlIC1tYXhkZXB0aCBvcHRpb24gb24gdGhlICdtYWtlIGNsZWFuYWxsJworY29tbWFuZC4gVGhpcyBwcmV2ZW50cyB0aGUgdGVzdHMgZnJvbSBiZWluZyByZW1vdmVkIGZyb20gdGhlIHdvcmtpbmcgZGlyZWN0b3J5CithbmQgY2FuIGNhdXNlIHByb2JsZW1zIHdpdGggZnV0dXJlIHRlc3RzLiBUbyByZW1lZHksIGVkaXQgdGhlIG1ha2VmaWxlIGxpbmUKK3VuZGVyIHRoZSBjbGVhbiBjb21tYW5kOgorCisgICAgIC1ybSBbY2ZddGVzdCouW2NmXSBbY2ZdY3Jvc3N0ZXN0Ki5bY2ZdIFtjZl1jdGVzdCouW2NmXSBbY2Zdb3JwaGFuKi5bY2ZdCisKK0NoYW5nZSB0bzoKKworICAgICAtcm0gW2NmXXRlc3QqIFtjZl1jcm9zc3Rlc3QqIFtjZl1jdGVzdCogW2NmXW9ycGhhbioKKworCisKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitWLiAgIENvbnRhY3QgYW5kIFN1cHBvcnQKKz09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitDb250YWN0OiBodHRwOi8vd3d3LmNzLnVoLmVkdS9+aHBjdG9vbHMKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weSBiL3JjMy90ZXN0c3VpdGUvYWRkaW5nX3hmYWlscy5weQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4yYWQ0OGQ5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9hZGRpbmdfeGZhaWxzLnB5CkBAIC0wLDAgKzEsMzIgQEAKKworaW1wb3J0IG9zCitpbXBvcnQgY29tbWFuZHMKKworcGVybCA9ICIvdXNyL2Jpbi9wZXJsIgorTExWTSA9ICIuL0xMVk0tSVIvIgordGVtcF9maWxlbmFtZSA9ICJ0ZW1wIgorWEZBSUxfdGV4dCA9ICI7IFhGQUlMOiAqXG4iCisKKworYXJjaF9maWxlX2xpc3QgPSBkaWN0KCkKK2FyY2hfZmlsZV9saXN0WydsaW5fMzJlJ10gPSBbJ3Rlc3Rfb21wX3Rhc2tfZmluYWwubGwnLCAndGVzdF9vbXBfdGFza191bnRpZWQubGwnXQorCisKK2FyY2hfc2NyaXB0ID0gIi4uL3J1bnRpbWUvdG9vbHMvY2hlY2stb3Blbm1wLXRlc3QucGwiCithcmNoX2NtZCA9IHBlcmwgKyAiICIgKyBhcmNoX3NjcmlwdAorYXJjaCA9IGNvbW1hbmRzLmdldG91dHB1dChhcmNoX2NtZCkKK2FyY2ggPSBhcmNoWzpsZW4oYXJjaCktMV0KKworcHJpbnQgIkFkZGluZyBYRkFJTFMgLi4uIgorCitmb3IgZiBpbiBhcmNoX2ZpbGVfbGlzdFthcmNoXToKKwlmaWxlbmFtZSA9IExMVk0gKyBhcmNoICsgIi8iICsgZgorCWxpbmVzID0gb3BlbihmaWxlbmFtZSkucmVhZGxpbmVzKCkKKwlsaW5lcy5pbnNlcnQoMSwgWEZBSUxfdGV4dCkKKwlmMiA9IG9wZW4odGVtcF9maWxlbmFtZSwgInciKQorCWZvciBsIGluIGxpbmVzOgorCQlmMi53cml0ZShsKQorCWYyLmNsb3NlKCkKKworCW9zLnN5c3RlbSgibXYgIiArIHRlbXBfZmlsZW5hbWUgKyAiICIgKyBmaWxlbmFtZSkKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9iaW4vTWFrZWZpbGUgYi9yYzMvdGVzdHN1aXRlL2Jpbi9NYWtlZmlsZQpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZGJkM2JhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vTWFrZWZpbGUKQEAgLTAsMCArMSwyMyBAQAorQ0MgICAgID0gY2xhbmcKK0NGTEFHUyA9IC1mb3Blbm1wIC1TIC1lbWl0LWxsdm0KK0lOQ0wgPQorTElCUyA9CisKK0JJTiA9CitTUkNfRElSID0gLi9jCitTUkNfRklMRVMgOj0gJChmb3JlYWNoIERJUiwgJChTUkNfRElSKSwgJCh3aWxkY2FyZCAkKFNSQ19ESVIpLyouYykpCitPQkpTIDo9ICQocGF0c3Vic3QgJS5jLCAlLm8sICQoU1JDX0ZJTEVTKSkKK1RBUkdFVExJU1QgOj0gJChwYXRzdWJzdCAlLmMsICUsICQoU1JDX0ZJTEVTKSkKKworYWxsOiQoVEFSR0VUTElTVCkKKwkuL2Rpc3RyaWJ1dGUuc2gKKwlAIGVjaG8gYWxsIGRvbmUKKworLlBIT05ZOiBjbGVhbgorCiskKFRBUkdFVExJU1QpOiAkKFNSQ19GSUxFUykKKwkkKENDKSAkKENGTEFHUykgJChMSUJTKSAkKElOQ0wpICRALmMgLW8gJEAubGwKKworY2xlYW46CisJQCBybSAtcmYgYy8qCisJQCBlY2hvIGNsZWFuIGJpbiBkb25lCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9kaXN0cmlidXRlLnNoIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi5kYmIwZjVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vZGlzdHJpYnV0ZS5zaApAQCAtMCwwICsxLDEyNSBAQAorIyEvYmluL2Jhc2gKKworIyBhZGQgaGVhZGVyIGZvciAubGwgZmlsZXMKKworIyBnZXQgdG1wIGhlYWRlcgorY3AgaGVhZGVyIC90bXAvdG1wLmhlYWRlcgorZWNobyA+PiAvdG1wL3RtcC5oZWFkZXIKKworIyBjcmVhdGUgdGVtcG9yYXJ5IHRlc3QgcGFja2FnZQorbWtkaXIgYy0kTUFDSFRZUEUkT1NUWVBFCitgY3AgYy8qLmxsIGMtJE1BQ0hUWVBFJE9TVFlQRS9gCisKKyMgYWRkIG5ldyBoZWFkZXIgaW50byAubGwgZmlsZXMKK2ZvciBmaWxlIGluIGMtJE1BQ0hUWVBFJE9TVFlQRS8qCitkbworICAgIGNwICRmaWxlIC90bXAvdG1wLmxsLmJmCisgICAgY2F0IC90bXAvdG1wLmhlYWRlciAvdG1wL3RtcC5sbC5iZiA+IC90bXAvdG1wLmxsCisgICAgbXYgL3RtcC90bXAubGwgJGZpbGUKK2RvbmUKKworCisjIGluIGJpbi8sIHRhcmdldCBpcyAuLi9MTFZNLUlSL0FSQ0gvT1MKK0xFVkVMPS4uL0xMVk0tSVIvCitBUkNIX1BBVEg9Li4vTExWTS1JUi8KK09TX1BBVEg9Li4vTExWTS1JUi8KKworIyBmb3IgbGludXggc3lzdGVtLCBhZGQgeW91ciBhcmNoIGFuZCBvcyBoZXJlCitkZWNsYXJlIC1hIEFSQ0hlcz0oeDg2IHg4Nl82NCBwb3dlcnBjIGFybSBtaXBzIGRhcndpbikKK2RlY2xhcmUgLWEgT1Nlcz0obGludXggbWFjb3N4IHdpbmRvd3MgZGFyd2luKQorCitkZWNsYXJlIGxvd2VyQVJDSAorZGVjbGFyZSBsb3dlck9TCisKKyMgdGFyZ2V0IGRpcmVjdG9yeSBuYW1lCitkZWNsYXJlIHVwcGVyQVJDSAorZGVjbGFyZSB1cHBlck9TCisKK2xvd2VyQVJDSD0kKGVjaG8gIiRNQUNIVFlQRSIgfCB0ciAnWzp1cHBlcjpdJyAnWzpsb3dlcjpdJykKK2xvd2VyT1M9JChlY2hvICIkT1NUWVBFIiB8IHRyICdbOnVwcGVyOl0nICdbOmxvd2VyOl0nKQorCisjIEFSQ0gKK2ZvciBpIGluICR7QVJDSGVzW0BdfQorZG8KKyAgICByZXN1bHQ9JChlY2hvICIke2xvd2VyQVJDSH0iIHwgZ3JlcCAkaSkKKyAgICBpZiBbWyAiJHJlc3VsdCIgIT0gIiIgXV0KKyAgICB0aGVuCisgICAgICAgICMgdXBwZXJBUkNIPSRpCisJCXVwcGVyQVJDSD0kKGVjaG8gIiRpIiB8IHRyICdbOmxvd2VyOl0nICdbOnVwcGVyOl0nKQorICAgIGZpCitkb25lCisKK2lmIFtbICIkdXBwZXJBUkNIIiA9PSAiIiBdXQordGhlbgorICAgIGVjaG8gIk5vdCBmb3VuZCAke2xvd2VyQVJDSH0gaW4gdGhlIFske0FSQ0hlc1tAXX1dISIKKyAgICBleGl0CitmaQorCisjIE9TCitmb3IgaSBpbiAke09TZXNbQF19CitkbworICAgIHJlc3VsdD0kKGVjaG8gIiR7bG93ZXJPU30iIHwgZ3JlcCAkaSkKKyAgICBpZiBbWyAiJHJlc3VsdCIgIT0gIiIgXV0KKyAgICB0aGVuCisgICAgICAgICMgdXBwZXJPUz0kaQorCQl1cHBlck9TPSQoZWNobyAiJGkiIHwgdHIgJ1s6bG93ZXI6XScgJ1s6dXBwZXI6XScpCisgICAgZmkKK2RvbmUKKworaWYgW1sgIiR1cHBlck9TIiA9PSAiIiBdXQordGhlbgorICAgIGVjaG8gIk5vdCBmb3VuZCAke2xvd2VyT1N9IGluIHRoZSBbJHtPU2VzW0BdfV0hIgorICAgIGV4aXQKK2ZpCisKKyMgc3Vydml2ZWQsIGFzc2VtYmxlIHRoZSBwYXRoCisjIEFSQ0hfUEFUSCs9JHVwcGVyQVJDSC8KKyMgT1NfUEFUSCs9JHVwcGVyQVJDSC8kdXBwZXJPUy8KK0FSQ0hfbmV3Rm9ybWF0PS4KK2lmIFsgJHVwcGVyQVJDSCA9ICJYODYiIF07IHRoZW4KKyAgICBBUkNIX25ld0Zvcm1hdD0zMgorZWxzZQorICAgIEFSQ0hfbmV3Rm9ybWF0PTMyZQorZmkKK09TX25ld0Zvcm1hdD0uCitpZiBbICR1cHBlck9TID0gIkxJTlVYIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PWxpbgorZWxpZiBbICR1cHBlck9TID0gIk1BQ09TWCIgXTsgdGhlbgorICAgIE9TX25ld0Zvcm1hdD1tYWMKK2VsaWYgWyAkdXBwZXJPUyA9ICJXSU5ET1dTIiBdOyB0aGVuCisgICAgT1NfbmV3Rm9ybWF0PXdpbgorZWxpZiBbICR1cHBlck9TID0gIkRBUldJTiIgXTsgdGhlbgorICAgIE9TX25ld0Zvcm1hdD1kYXIKK2Vsc2UKKyAgICBPU19uZXdGb3JtYXQ9dW5rbm93bgorZmkKK09TX1BBVEgrPSRPU19uZXdGb3JtYXQiXyIkQVJDSF9uZXdGb3JtYXQKKworIyB0ZXN0IGFuZCBjcmVhdGUgZGlyZWN0b3J5CitpZiBbICEgLWQgIiRMRVZFTCIgXTsgdGhlbgorICAgIG1rZGlyICRMRVZFTAorICAgIG1rZGlyICRPU19QQVRICitlbHNlCisgICAgaWYgWyAhIC1kICIkT1NfUEFUSCIgXTsgdGhlbgorICAgICAgICBta2RpciAkT1NfUEFUSAorICAgIGZpCitmaQorCisjIHJlc2VydmUgdGhlIHRtcCBwYXRoIHRvIExMVk0tSVIvQVJDSC9PUworZWNobyAkT1NfUEFUSCIvIiA+IGxpdC50bXAKKworIyBPU19BUkNIPSRPU19uZXdGb3JtYXQiXyIkQVJDSF9uZXdGb3JtYXQKKyMgZWNobyAtZSAiaWYgbm90ICckT1NfQVJDSCcgaW4gY29uZmlnLnJvb3QudGFyZ2V0czoiID4gJE9TX1BBVEgnLydsaXQubG9jYWwuY2ZnCisjIGVjaG8gLWUgIlx0Y29uZmlnLnVuc3VwcG9ydGVkID0gVHJ1ZSIgPj4gJE9TX1BBVEgnLydsaXQubG9jYWwuY2ZnCisKKyMgY29weSAqLmxsIGZpbGVzIHRvIEFSQ0gvT1MKK2BjcCBsaXQuKiAkTEVWRUxgCisKKyMgb21pdCBvcnBoIHRlc3QKK2BybSBjLSRNQUNIVFlQRSRPU1RZUEUvY3Rlc3RfKi5sbGAKK2BybSBjLSRNQUNIVFlQRSRPU1RZUEUvb3JwaF9jdGVzdF8qLmxsYAorYGNwIGMtJE1BQ0hUWVBFJE9TVFlQRS8qLmxsICRPU19QQVRIYAorCisjIGNsZWFuCitgcm0gL3RtcC90bXAuKmAKK3JtIC1yZiBjLSRNQUNIVFlQRSRPU1RZUEUvCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9oZWFkZXIgYi9yYzMvdGVzdHN1aXRlL2Jpbi9oZWFkZXIKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzc0MWU2MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYmluL2hlYWRlcgpAQCAtMCwwICsxLDYgQEAKKzsgUlVOOiAlY2xhbmcgLWxvbXAgLWxtICVzIC1vICV0ICYmICV0IDI+JjEgfCBGaWxlQ2hlY2sgJXMKKzsgQ0hFQ0stTk9UOiBUZXN0IGZhaWxlZAorOyBDSEVDSzogRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycworCisKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LmNmZyBiL3JjMy90ZXN0c3VpdGUvYmluL2xpdC5jZmcKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMTk1NzgxOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYmluL2xpdC5jZmcKQEAgLTAsMCArMSw3OCBAQAorIyAtKi0gUHl0aG9uIC0qLQorCisjIENvbmZpZ3VyYXRpb24gZmlsZSBmb3IgdGhlICdsaXQnIHRlc3QgcnVubmVyLgorCitpbXBvcnQgb3MKK2ltcG9ydCBzeXMKK2ltcG9ydCByZQoraW1wb3J0IHBsYXRmb3JtCisKK3RyeToKKyAgIGltcG9ydCBsaXQudXRpbAorICAgaW1wb3J0IGxpdC5mb3JtYXRzCitleGNlcHQgSW1wb3J0RXJyb3I6CisgICBwYXNzCisKKyMgbmFtZTogVGhlIG5hbWUgb2YgdGhpcyB0ZXN0IHN1aXRlLgorY29uZmlnLm5hbWUgPSAnT3Blbk1QVmFsaWRhdGlvblN1aXRlJworCisjIHRlc3RGb3JtYXQ6IFRoZSB0ZXN0IGZvcm1hdCB0byB1c2UgdG8gaW50ZXJwcmV0IHRlc3RzLgorY29uZmlnLnRlc3RfZm9ybWF0ID0gbGl0LmZvcm1hdHMuU2hUZXN0KGV4ZWN1dGVfZXh0ZXJuYWw9RmFsc2UpCisKKyMgc3VmZml4ZXM6IEEgbGlzdCBvZiBmaWxlIGV4dGVuc2lvbnMgdG8gdHJlYXQgYXMgdGVzdCBmaWxlcworIyBOb3RlIHRoaXMgY2FuIGJlIG92ZXJyaWRkZW4gYnkgbGl0LmxvY2FsLmNmZyBmaWxlcworY29uZmlnLnN1ZmZpeGVzID0gWycubGwnXQorCisjIHRlc3Rfc291cmNlX3Jvb3Q6IFRoZSByb290IHBhdGggd2hlcmUgdGVzdHMgYXJlIGxvY2F0ZWQuCisjY29uZmlnLnRlc3Rfc291cmNlX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluIgorI29zLnBhdGguZGlybmFtZShfX2ZpbGVfXykKKworIyB0ZXN0X2V4ZWNfcm9vdDogVGhlIHJvb3QgcGF0aCB3aGVyZSB0ZXN0cyBzaG91bGQgYmUgcnVuLgorI21wdnNfb2JqX3Jvb3QgPSBnZXRhdHRyKGNvbmZpZywgJ21wdnNfb2JqX3Jvb3QnLCBOb25lKQorI2lmIG1wdnNfb2JqX3Jvb3QgaXMgbm90IE5vbmU6Citjb25maWcudGVzdF9leGVjX3Jvb3QgPSAiLi8iCisjb3MucGF0aC5qb2luKG1wdnNfb2JqX3Jvb3QsICdzcmMnKQorCisjIERpc2NvdmVyIHRoZSAnY2xhbmcnIGFuZCAnY2xhbmdjYycgdG8gdXNlLgorCitpbXBvcnQgb3MKKworZGVmIGluZmVyQ2xhbmcoUEFUSCk6CisgICAgIyBEZXRlcm1pbmUgd2hpY2ggY2xhbmcgdG8gdXNlLgorICAgIGNsYW5nID0gb3MuZ2V0ZW52KCdDTEFORycpCisKKyAgICAjIElmIHRoZSB1c2VyIHNldCBjbGFuZyBpbiB0aGUgZW52aXJvbm1lbnQsIGRlZmluaXRlbHkgdXNlIHRoYXQgYW5kIGRvbid0CisgICAgIyB0cnkgdG8gdmFsaWRhdGUuCisgICAgaWYgY2xhbmc6CisgICAgICAgIHJldHVybiBjbGFuZworCisgICAgIyBPdGhlcndpc2UgbG9vayBpbiB0aGUgcGF0aC4KKyAgICBjbGFuZyA9IGxpdC51dGlsLndoaWNoKCdjbGFuZycsIFBBVEgpCisKKyAgICBpZiBub3QgY2xhbmc6CisgICAgICAgIGxpdF9jb25maWcuZmF0YWwoImNvdWxkbid0IGZpbmQgJ2NsYW5nJyBwcm9ncmFtLCB0cnkgc2V0dGluZyAiCisgICAgICAgICAgICAgICAgICAgICAgICAgIkNMQU5HIGluIHlvdXIgZW52aXJvbm1lbnQiKQorCisgICAgcmV0dXJuIGNsYW5nCisKK2NvbmZpZy5jbGFuZyA9IGluZmVyQ2xhbmcoY29uZmlnLmVudmlyb25tZW50WydQQVRIJ10pLnJlcGxhY2UoJ1xcJywgJy8nKQorY29uZmlnLnN1YnN0aXR1dGlvbnMuYXBwZW5kKCAoJyVjbGFuZycsICcgJyArIGNvbmZpZy5jbGFuZyArICcgJykgKQorCisjIFByb3BvZ2F0ZSBzb21lIGVudmlyb25tZW50IHZhcmlhYmxlIHRvIHRlc3QgZW52aXJvbm1lbnQuCitkZWYgYWRkRW52KG5hbWUpOgorICAgIGlmIG5hbWUgaW4gb3MuZW52aXJvbjoKKyAgICAgICAgY29uZmlnLmVudmlyb25tZW50W25hbWVdID0gb3MuZW52aXJvbltuYW1lXQorCithZGRFbnYoJ0hPTUUnKQorYWRkRW52KCdQV0QnKQorCisKK2FkZEVudignQ19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdDUExVU19JTkNMVURFX1BBVEgnKQorYWRkRW52KCdMSUJSQVJZX1BBVEgnKQorYWRkRW52KCdMRF9MSUJSQVJZX1BBVEgnKQorYWRkRW52KCdEWUxEX0xJQlJBUllfUEFUSCcpCisKKyMgQ2hlY2sgdGhhdCB0aGUgb2JqZWN0IHJvb3QgaXMga25vd24uCitpZiBjb25maWcudGVzdF9leGVjX3Jvb3QgaXMgTm9uZToKKyAgICBsaXQuZmF0YWwoJ3Rlc3QgZXhlY3V0aW9uIHJvb3Qgbm90IHNldCEnKQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LnNpdGUuY2ZnLmluCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjExODY2ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Jpbi9saXQuc2l0ZS5jZmcuaW4KQEAgLTAsMCArMSwzMCBAQAorIyMgQXV0b2dlbmVyYXRlZCBieSBMTFZNL0NsYW5nIGNvbmZpZ3VyYXRpb24uCisjY29uZmlnLm1wdnNfc3JjX3Jvb3QgPSAiL2hvbWUvaWNob3lqeC9pbnN0YWxsL29wZW5tcC90ZXN0c3VpdGUvYmluL2MiCitjb25maWcubXB2c19vYmpfcm9vdCA9ICIvdG1wIgorY29uZmlnLmxsdm1fdG9vbHNfZGlyID0gIkBMTFZNX1RPT0xTX0RJUkAiCisKKworIyBOZWVkZWQgdG8gY2hlY2sgaWYgYSBoYWNrIG5lZWRzIHRvIGJlIGFwcGxpZWQKK2NvbmZpZy5sbHZtX3ZlcnNpb25fbWFqb3IgPSAiQExMVk1fVkVSU0lPTl9NQUpPUkAiCisKKyMgQ29tcGlsZXJzCisjIEZJWE1FOiB1c2UgbGx2bWNjIG5vdCBsbHZtZ2NjCitjb25maWcubGx2bWNsYW5nID0gImNsYW5nIgorCisjIEZlYXR1cmVzCitjb25maWcuZW5hYmxlX3VjbGliYyA9IFRydWUgaWYgQEVOQUJMRV9VQ0xJQkNAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmVuYWJsZV9wb3NpeF9ydW50aW1lID0gVHJ1ZSBpZiBARU5BQkxFX1BPU0lYX1JVTlRJTUVAID09IDEgZWxzZSBGYWxzZQorY29uZmlnLmhhdmVfc2VsaW51eCA9IFRydWUgaWYgQEhBVkVfU0VMSU5VWEAgPT0gMSBlbHNlIEZhbHNlCisKKyMgQ3VycmVudCB0YXJnZXQKK2NvbmZpZy50YXJnZXRfdHJpcGxlID0gIkBUQVJHRVRfVFJJUExFQCIKKworIyBMZXQgdGhlIG1haW4gY29uZmlnIGRvIHRoZSByZWFsIHdvcmsuCit0cnk6CisgIGxpdAorZXhjZXB0IE5hbWVFcnJvcjoKKyAgIyBVc2UgbGl0X2NvbmZpZyBjbGFzcworICBsaXRfY29uZmlnLmxvYWRfY29uZmlnKGNvbmZpZywgIkBNUFZTX1NPVVJDRV9ESVJAL2xpdC5jZmciKQorZWxzZToKKyAgIyBVc2Ugb2xkIGxpdCBjbGFzcworICBsaXQubG9hZF9jb25maWcoY29uZmlnLCAiQE1QVlNfU09VUkNFX0RJUkAvbGl0LmNmZyIpCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Jpbi9saXQudG1wIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcApuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44MWQzMGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9iaW4vbGl0LnRtcApAQCAtMCwwICsxIEBACisuLi9MTFZNLUlSL2xpbl8zMmUvCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2MvaGFzX29wZW5tcC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45ODNhOTczCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL2hhc19vcGVubXAuYwpAQCAtMCwwICsxLDMwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIE9wZW5NcCBzdXBwb3J0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5fT1BFTk1QPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+aGFzX29wZW5tcDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBydmFsdWUgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICA8b21wdHM6b3JwaGFuPgorICAgIDxvbXB0czpjaGVjaz4KKyNpZmRlZiBfT1BFTk1QCisJcnZhbHVlID0gMTsKKyNlbmRpZgorICAgIDwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisjaWYgMAorCXJ2YWx1ZSA9IDE7CisjZW5kaWYKKyAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgICA8L29tcHRzOm9ycGhhbj4KKwlyZXR1cm4gKHJ2YWx1ZSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9hdG9taWMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmMyZDFhYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfYXRvbWljLmMKQEAgLTAsMCArMSw0MzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGF0b21pYyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBsb29wIHdpdGggYW4gYXRvbWljIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGF0b21pYzwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYXRvbWljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bTsKKyAgICAgICAgaW50IGRpZmY7CisgICAgICAgIGRvdWJsZSBkc3VtID0gMDsKKyAgICAgICAgZG91YmxlIGR0ID0gMC41OwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgICAgIGRvdWJsZSBkZGlmZjsKKyAgICAgICAgaW50IHByb2R1Y3Q7CisgICAgICAgIGludCB4OworICAgICAgICBpbnQgKmxvZ2ljczsKKyAgICAgICAgaW50IGJpdF9hbmQgPSAxOworICAgICAgICBpbnQgYml0X29yID0gMDsKKyAgICAgICAgaW50IGV4Y2x1c2l2X2JpdF9vciA9IDA7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCS8qIGR0XkRPVUJMRV9ESUdJVFMgKi8KKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisgICAgaW50IGo7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fZGlmZjsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNfYW5kID0gMTsKKyAgICBpbnQgbG9naWNfb3IgPSAwOworICAgIGRvdWJsZSBka25vd25fc3VtOworICAgIGRvdWJsZSByb3VuZGluZ19lcnJvciA9IDEuRS05OworICAgIGRvdWJsZSBkcHQsIGRpdjsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKyAgICBsb2dpY3MgPSBsb2dpY3NBcnJheTsKKyAgICAKKyAgICBzdW0gPSAwOworICAgIGRpZmYgPSAwOworICAgIHByb2R1Y3QgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorCSAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorCQlzdW0gKz0gaTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgaWYgKGtub3duX3N1bSAhPSBzdW0pCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAKKyAgICAgICAgICAgICAgICAgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCAKKyAgICAgICAgICAgICAgICAgc3VtLCBrbm93bl9zdW0pOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gICAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBkaWZmIC09IGk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBrbm93bl9kaWZmID0gKChMT09QQ09VTlQgLSAxKSAqIExPT1BDT1VOVCkgLyAyICogLTE7CisgICAgaWYgKGRpZmYgIT0ga25vd25fZGlmZikKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIiwKKyAgICAgICAgICAgICAgIGRpZmYpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICAvKiBUZXN0cyBmb3IgZG91YmxlcyAqLworICAgIGRzdW0gPSAwOworICAgIGRwdCA9IDE7CisKKyAgICBmb3IgKGogPSAwOyBqIDwgRE9VQkxFX0RJR0lUUzsgKytqKQorICAgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgICB9CisgICAgZGtub3duX3N1bSA9ICgxIC0gZHB0KSAvICgxIC1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRzdW0gKz0gcG93IChkdCwgaSk7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkc3VtICE9IGRrbm93bl9zdW0gJiYgKGZhYnMgKGRzdW0gLSBka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yKSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsCisgICAgICAgICAgICAgICAgIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0gLSBka25vd25fc3VtKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisgICAgZHB0ID0gMTsKKworICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisgICAgeworICAgICAgICBkcHQgKj0gZHQ7CisgICAgfQorICAgIGRkaWZmID0gKDEgLSBkcHQpIC8gKDEgLSBkdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgeworICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRkaWZmIC09IHBvdyAoZHQsIGkpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfSAKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsCisgICAgICAgICAgICAgICAgIGRkaWZmKTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyBpKyspCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAqPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIAorICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmIChrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisgICAgeworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gcHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIsCisgICAgICAgICAgICAgICAgIHByb2R1Y3QsIGtub3duX3Byb2R1Y3QpOworICAgICAgICByZXN1bHQrKzsKKyAgICB9CisKKyAgICBwcm9kdWN0ID0gS05PV05fUFJPRFVDVDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMTsgaSA8PSBNQVhfRkFDVE9SOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgcHJvZHVjdCAvPSBpOworICAgICAgICAgICAgfQorICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHByb2R1Y3QgIT0gMSkKKyAgICB7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsCisgICAgICAgICAgICAgICAgICJFcnJvciBpbiBwcm9kdWN0IGRpdmlzaW9uIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAxXG4iLAorICAgICAgICAgICAgICAgICBwcm9kdWN0KTsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgfQorICAgIAorICAgIGRpdiA9IDUuMEUrNTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDE7IGkgPD0gTUFYX0ZBQ1RPUjsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGRpdiAvPSBpOworICAgICAgICAgICAgfQorICAgIH0KKworICAgIGlmIChmYWJzKGRpdi0wLjEzNzc4NykgPj0gMS4wRS00ICkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLAorICAgICAgICAgICAgICAgICAiRXJyb3IgaW4gZGl2aXNpb24gd2l0aCBkb3VibGU6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAwLjEzNzc4N1xuIiwgZGl2KTsKKyAgICB9CisKKyAgICB4ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgrKzsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IExPT1BDT1VOVCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gKytcbiIpOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHgtLTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKHggIT0gMCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gLS1cbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDE7CisgICAgfQorICAgIGJpdF9hbmQgPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICghYml0X2FuZCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGJpdF9hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7ICsraSkKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICBiaXRfYW5kICY9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9hbmQpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyBqKyspCisgICAgeworICAgICAgICBsb2dpY3Nbal0gPSAwOworICAgIH0KKyAgICBiaXRfb3IgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIGF0b21pYzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgYml0X29yIHw9IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisgICAgfQorICAgIGJpdF9vciA9IDA7CisgICAgbG9naWNzW0xPT1BDT1VOVCAvIDJdID0gMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIGJpdF9vciB8PSBsb2dpY3NbaV07CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCisgICAgaWYgKCFiaXRfb3IpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7IGorKykKKyAgICB7CisgICAgICAgIGxvZ2ljc1tqXSA9IDA7CisgICAgfQorICAgIGV4Y2x1c2l2X2JpdF9vciA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgIGludCBpOworI3ByYWdtYSBvbXAgZm9yCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgXj0gbG9naWNzW2ldOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorICAgIGlmIChleGNsdXNpdl9iaXRfb3IpIAorICAgIHsKKyAgICAgICAgcmVzdWx0Kys7CisgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisgICAgCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4gCisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYXRvbWljPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yIF49IGxvZ2ljc1tpXTsKKyAgICAgICAgICAgIH0KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworICAgIHggPSAxOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICBpbnQgaTsKKyNwcmFnbWEgb21wIGZvcgorICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IDEwOyArK2kpCisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICB4IDw8PSAxOworICAgICAgICAgICAgfQorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoIHggIT0gMTAyNCkKKyAgICB7CisgICAgICAgIHJlc3VsdCsrOworICAgICAgICBmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gPDxcbiIpOworICAgICAgICB4ID0gMTAyNDsKKyAgICB9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCAxMDsgKytpKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBhdG9taWM8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIHggPj49IDE7CisgICAgICAgICAgICB9CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmICh4ICE9IDEpCisgICAgeworICAgICAgICByZXN1bHQrKzsKKyAgICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluID4+XG4iKTsKKyAgICB9CisKKyAgICByZXR1cm4gKHJlc3VsdCA9PSAwKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfYmFycmllci5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRmNjY5ZTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2JhcnJpZXIuYwpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBiYXJyaWVyIGRpcmVjdGl2ZS4gVGhlIHRlc3QgY3JlYXRlcyBzZXZlcmFsIHRocmVhZHMgYW5kIHNlbmRzIG9uZSBvZiB0aGVtIHNsZWVwaW5nIGJlZm9yZSBzZXR0aW5nIGEgZmxhZy4gQWZ0ZXIgdGhlIGJhcnJpZXIgdGhlIG90aGVyIG9uZXMgZG8gc29tZSBsaXR0bGUgd29yayBkZXBlbmRpbmcgb24gdGhlIGZsYWcuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBiYXJyaWVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2JhcnJpZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0MTsKKwlpbnQgcmVzdWx0MjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgcmVzdWx0MSA9IDA7CisgICAgcmVzdWx0MiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgIDxvbXB0czpvcnBoYW4+CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwlpZiAocmFuayA9PTEpIHsKKyAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FX0xPTkcpOworICAgICAgICByZXN1bHQyID0gMzsKKwl9Cis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgYmFycmllcjwvb21wdHM6Y2hlY2s+CisJaWYgKHJhbmsgPT0gMikgeworCSAgICByZXN1bHQxID0gcmVzdWx0MjsKKwl9CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQorICAgIHByaW50ZigicmVzdWx0MT0lZFxuIixyZXN1bHQxKTsKKyAgICByZXR1cm4gKHJlc3VsdDEgPT0gMyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9jcml0aWNhbC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmNiM2YyNjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2NyaXRpY2FsLmMKQEAgLTAsMCArMSw0MiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgY3JpdGljYWwgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgY3JpdGljYWw8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY3JpdGljYWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtPTA7CisgICAgaW50IGtub3duX3N1bTsKKwkgIAorICAgIDxvbXB0czpvcnBoYW4+CisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisgICAgICBpbnQgbXlzdW09MDsKKyAgICAgIGludCBpOworICAgICAgCisgICAgICAjcHJhZ21hIG9tcCBmb3IKKwkgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykKKwkgICAgICBteXN1bSA9IG15c3VtICsgaTsKKworICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBjcml0aWNhbDwvb21wdHM6Y2hlY2s+CisJICAgIHN1bSA9IG15c3VtICtzdW07CisgICAgICAgIAorICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsICovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAgcHJpbnRmKCJzdW09JWRcbiIsc3VtKTsKKyAgICBrbm93bl9zdW0gPSA5OTkgKiAxMDAwIC8gMjsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mbHVzaC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNmYWJmOGUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2ZsdXNoLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZmx1c2ggZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmx1c2g8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgYmFycmllcjwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2ZsdXNoPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHJlc3VsdDE7CisJaW50IHJlc3VsdDI7CisJaW50IGR1bW15OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKwlyZXN1bHQxID0gMDsKKwlyZXN1bHQyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJaW50IHJhbms7CisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgYmFycmllcgorCWlmIChyYW5rID09IDEpIHsKKwkgICAgcmVzdWx0MiA9IDM7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBmbHVzaCAocmVzdWx0Mik8L29tcHRzOmNoZWNrPgorCQlkdW1teSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKworCWlmIChyYW5rID09IDApIHsKKwkgICAgPG9tcHRzOmNoZWNrPm15X3NsZWVwKFNMRUVQVElNRV9MT05HKTs8L29tcHRzOmNoZWNrPgorCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgZmx1c2ggKHJlc3VsdDIpPC9vbXB0czpjaGVjaz4KKwkJcmVzdWx0MSA9IHJlc3VsdDI7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuICgocmVzdWx0MSA9PSByZXN1bHQyKSAmJiAocmVzdWx0MiA9PSBkdW1teSkgJiYgKHJlc3VsdDIgPT0gMykpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2NvbGxhcHNlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjcyMTZmNDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9jb2xsYXBzZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdpdGggb21wIGZvciBjb2xsYXBzZSBjbGF1c2UuIEJpbmQgd2l0aCB0d28gbG9vcHMuIFdpdGhvdXQgdGhlIGNvbGxhcHNlIGNsYXVzZSwgdGhlIGZpcnN0IGxvb3Agd2lsbCBub3QgYmUgb3JkZXJlZDwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGNvbGxhcHNlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIHN0YXRpYyBpbnQgbGFzdF9pOworICAgIGludCBpc2xhcmdlcjsKKyAgICBpZiAoaT09MSkKKyAgICAgIGxhc3RfaT0wOworICAgIGlzbGFyZ2VyID0gKChpID49IGxhc3RfaSkmJihpIC0gbGFzdF9pPD0xKSk7CisgICAgbGFzdF9pID0gaTsKKyAgICByZXR1cm4gKGlzbGFyZ2VyKTsKK30KKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9jb2xsYXBzZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgaW50IGksajsKKwkgIGludCBteV9pc2xhcmdlciA9IDE7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgcHJpdmF0ZShpLGopIHNjaGVkdWxlKHN0YXRpYywxKSA8b21wdHM6Y2hlY2s+Y29sbGFwc2UoMik8L29tcHRzOmNoZWNrPiBvcmRlcmVkCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKyl7CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+bXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpJiYgbXlfaXNsYXJnZXI7PC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIGZvciAoaiA9MTsgaiA8MTAwOyBqKyspCisgICAgICAgICAgeworICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorCQkgICAgI3ByYWdtYSBvbXAgb3JkZXJlZAorCQkgICAgICBteV9pc2xhcmdlciA9IGNoZWNrX2lfaXNsYXJnZXIoaSkmJm15X2lzbGFyZ2VyOworICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyAgICAgICAgfQorICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIHJldHVybiAoaXNfbGFyZ2VyKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX2ZpcnN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjIyNzIwMTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgZmlyc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgZmlyc3Rwcml2YXRlLiBGaXJzdCBpdCBzdG9yZXMgdGhlIHJlc3VsdCBvZiBpdHMgbGFzdCBpdGVyYXRpb24gaW4gdmFyaWFibGUgKDIpLiBUaGVuIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgZmlyc3Rwcml2YXRlIHZhcmlhYmxlICgxKS4gQXQgdGhlIGVuZCBhbGwgZmlyc3Rwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgc3VtMTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9sYXN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jMjA4MGEyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgbGFzdHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgc2F2ZXMgdGhlIG5leHQgc3VtbWFuZCBpbiBhIGxhc3Rwcml2YXRlIHZhcmlhYmxlIGkwLiBBdCB0aGUgZW5kIGkwIGlzIGNvbXBhcmVkIHRvIHRoZSB2YWx1ZSBvZiB0aGUgZXhwZWN0ZWQgbGFzdCBzdW1tYW5kLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUsb21wIHNjaGVkdWxlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IHN1bTA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTApCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorCSAgICBpbnQgaTA7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWkwID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworCSAgICBzdW0wID0gMDsKKwkgICAgewkvKiBCZWdpbiBvZiBvcnBoYW5lZCBibG9jayAqLworCSAgICA8b21wdHM6b3JwaGFuPgorCQlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShzdGF0aWMsNykgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKwkJICAgIGkwID0gaTsKKwkJfQkvKiBlbmQgb2YgZm9yICovCisJICAgIDwvb21wdHM6b3JwaGFuPgorCSAgICB9CS8qIGVuZCBvZiBvcnBoYW5lZCBibG9jayAqLworCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgICB7CisJCXN1bSA9IHN1bSArIHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovCisJfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8gICAgCisKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisJZnByaW50Zihsb2dGaWxlLCIga25vd25fc3VtID0gJWQgLCBzdW0gPSAlZCBcbiIsa25vd25fc3VtLHN1bSk7CisJZnByaW50Zihsb2dGaWxlLCIgTE9PUENPVU5UID0gJWQgLCBpMCA9ICVkIFxuIixMT09QQ09VTlQsaTApOworCXJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpICk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hM2VjNDBiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfbm93YWl0LmMKQEAgLTAsMCArMSw1NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBub3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp2ZXJzaW9uPjEuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZm9yLCBvbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCWludCBteWFycmF5W0xPT1BDT1VOVF07CisKKwlyZXN1bHQgPSAwOworCWNvdW50ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworCTxvbXB0czpvcnBoYW4+CisJCWludCByYW5rOworCQlpbnQgaTsKKworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+bm93YWl0PC9vbXB0czpjaGVjaz4gCisJCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykgeworCQkJaWYgKGkgPT0gMCkgeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZW50ZXJpbmcgZm9yIGxvb3AgYW5kIGdvaW5nIHRvIHNsZWVwLlxuIiwgcmFuayk7CisJCQkJbXlfc2xlZXAoU0xFRVBUSU1FKTsKKwkJCQljb3VudCA9IDE7CisjcHJhZ21hIG9tcCBmbHVzaChjb3VudCkKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIHdva2UgdXAgYW5kIHNldCBjb3VudCA9IDEuXG4iLCByYW5rKTsKKwkJCX0KKwkJfQorCQkKKwkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGl0ZWQgZmlyc3QgZm9yIGxvb3AgYW5kIGVudGVycyB0aGUgc2Vjb25kLlxuIiwgcmFuayk7CisjcHJhZ21hIG9tcCBmb3IKKwkJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKSAKKwkJeworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQlpZiAoY291bnQgPT0gMCkKKwkJCQlyZXN1bHQgPSAxOworCQl9CisJPC9vbXB0czpvcnBoYW4+CisJfQorCQorCXJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfb3JkZXJlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjYyOTdkMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9vcmRlcmVkLmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgb3JkZXJlZCBkaXJlY3RpdmUgYnkgY291bnRpbmcgdXAgYW4gdmFyaWFibGUgaW4gYW4gcGFyYWxsZWxpemVkIGxvb3AgYW5kIHdhdGNoaW5nIGVhY2ggaXRlcmF0aW9uIGlmIHRoZSBzdW1hbmQgaXMgbGFyZ2VyIGFzIHRoZSBsYXN0IG9uZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmb3Igc2NoZWR1bGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitzdGF0aWMgaW50IGxhc3RfaSA9IDA7CisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gdG8gY2hlY2sgdGhhdCBpIGlzIGluY3JlYXNpbmcgbW9ub3RvbmljYWxseSAKKyAgIHdpdGggZWFjaCBjYWxsICovCitzdGF0aWMgaW50IGNoZWNrX2lfaXNsYXJnZXIgKGludCBpKQoreworICAgIGludCBpc2xhcmdlcjsKKyAgICBpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKyAgICBsYXN0X2kgPSBpOworICAgIHJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXIgPSAxOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGxhc3RfaSA9IDA7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisJICAgIGludCBteV9pc2xhcmdlciA9IDE7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIG9yZGVyZWQKKwkgICAgZm9yIChpID0gMTsgaSA8IDEwMDsgaSsrKQorCSAgICB7CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBvcmRlcmVkPC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXNsYXJnZXIgPSBjaGVja19pX2lzbGFyZ2VyKGkpICYmIG15X2lzbGFyZ2VyOworCQkgICAgc3VtID0gc3VtICsgaTsKKwkJfQkvKiBlbmQgb2Ygb3JkZXJlZCAqLworCSAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJICAgIHsKKwkJaXNfbGFyZ2VyID0gaXNfbGFyZ2VyICYmIG15X2lzbGFyZ2VyOworCSAgICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3N1bT0oOTkgKiAxMDApIC8gMjsKKyAgICByZXR1cm4gKChrbm93bl9zdW0gPT0gc3VtKSAmJiBpc19sYXJnZXIpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44YTY1MTEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNjQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGZvciBwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIHByaXZhdGUgdmFyaWFibGUgKDEpIGFuZCBhIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgcHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiB0aGlzIHRocmVhZCB3YWl0cyBzb21lIHRpbWUgYmVmb3JlIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgcHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiAoMSkgaXMgYXNzaWduZWQgdG8gKDIpLiBBdCB0aGUgZW5kIGFsbCBwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworc3RhdGljIHZvaWQgZG9fc29tZV93b3JrICgpeworICAgIGludCBpOworICAgIGRvdWJsZSBzdW0gPSAwOworICAgIGZvcihpID0gMDsgaSA8IDEwMDA7IGkrKyl7CisJc3VtICs9IHNxcnQgKChkb3VibGUpIGkpOworICAgIH0KK30KKworaW50IHN1bTE7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKHN1bTEpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3JfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgaW50IHN1bSA9IDA7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtMCA9IDA7CS8qIHNldHRpbmcgKGdsb2JhbCkgc3VtMCA9IDAgKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJc3VtMSA9IDA7CS8qIHNldHRpbmcgc3VtMSBpbiBlYWNoIHRocmVhZCB0byAwICovCisKKwl7CS8qIGJlZ2luIG9mIG9ycGhhbmVkIGJsb2NrICovCisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPiBzY2hlZHVsZShzdGF0aWMsMSkKKwkgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwkgICAgeworCQlzdW0wID0gc3VtMTsKKyNwcmFnbWEgb21wIGZsdXNoCisJCXN1bTAgPSBzdW0wICsgaTsKKwkJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJc3VtMSA9IHN1bTA7CisJICAgIH0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorCX0JLyogZW5kIG9mIG9ycGhhbmVkIGJsb2NrICovCisKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJeworCSAgICBzdW0gPSBzdW0gKyBzdW0xOworCX0JLyplbmQgb2YgY3JpdGljYWwqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3JfcmVkdWN0aW9uLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNmRkMTkxNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNDI5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmb3IgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aWNoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPG1hdGguaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBkdDsKKwlpbnQgc3VtOworCWludCBkaWZmOworCWludCBwcm9kdWN0ID0gMTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZGRpZmY7CisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCAqbG9naWNzOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkvKiBkdF5ET1VCTEVfRElHSVRTICovCisjZGVmaW5lIE1BWF9GQUNUT1IgMTAKKyNkZWZpbmUgS05PV05fUFJPRFVDVCAzNjI4ODAwCS8qIDEwISAqLworCisgICAgaW50IGk7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQga25vd25fcHJvZHVjdDsKKyAgICBkb3VibGUgcm91bmRpbmdfZXJyb3IgPSAxLkUtOTsJLyogb3ZlciBhbGwgcm91bmRpbmcgZXJyb3IgdG8gYmUgaWdub3JlZCBpbiB0aGUgZG91YmxlIHRlc3RzICovCisgICAgZG91YmxlIGRwdDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgbG9naWNzQXJyYXlbTE9PUENPVU5UXTsKKworICAgIC8qIFZhcmlhYmxlcyBmb3IgaW50ZWdlciB0ZXN0cyAqLworICAgIHN1bSA9IDA7CisgICAgcHJvZHVjdCA9IDE7CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIC8qIHZhcmlhYmVscyBmb3IgZG91YmxlIHRlc3RzICovCisgICAgZHQgPSAxLiAvIDMuOwkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisgICAgZHN1bSA9IDAuOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGxvZ2ljICB0ZXN0cyAqLworICAgIGxvZ2ljcyA9IGxvZ2ljc0FycmF5OworICAgIGxvZ2ljX2FuZCA9IDE7CisgICAgbG9naWNfb3IgPSAwOworICAgIC8qIFZhcmlhYmVsZXMgZm9yIGJpdCBvcGVyYXRvcnMgdGVzdHMgKi8KKyAgICBiaXRfYW5kID0gMTsKKyAgICBiaXRfb3IgPSAwOworICAgIC8qIFZhcmlhYmxlcyBmb3IgZXhjbHVzaXYgYml0IG9yICovCisgICAgZXhjbHVzaXZfYml0X29yID0gMDsKKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgaW50ZWdlcnMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBpbnRlZ2VyIGFkZGl0aW9uICoqKiovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTE9PUENPVU5UOyBqKyspCisJICAgIHsKKwkJc3VtID0gc3VtICsgajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLCBzdW0sIGtub3duX3N1bSk7IAorICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgc3VidHJhY3RvbiAqKioqLworCisgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAxOyBqIDw9IExPT1BDT1VOVDsgaisrKQorCSAgICB7CisJCWRpZmYgPSBkaWZmIC0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChkaWZmICE9IDApIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsIGRpZmYpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGludGVnZXIgbXVsdGlwbGljYXRpb24gKioqKi8KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJICAgIGZvciAoaiA9IDE7IGogPD0gTUFYX0ZBQ1RPUjsgaisrKQorCSAgICB7CisJCXByb2R1Y3QgKj0gajsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworICAgIGlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKyAgICB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGRvdWJsZXMgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgZG91YmxlIGFkZGl0aW9uICoqKiovCisKKyAgICBkc3VtID0gMC47CisgICAgZHB0ID0gMS47CisKKyAgICBmb3IgKGkgPSAwOyBpIDwgRE9VQkxFX0RJR0lUUzsgKytpKQorICAgIHsKKwlkcHQgKj0gZHQ7CisgICAgfQorICAgIGRrbm93bl9zdW0gPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IERPVUJMRV9ESUdJVFM7IGorKykKKwkgICAgewkKKwkJZHN1bSArPSBwb3cgKGR0LCBqKTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChmYWJzIChkc3VtIC0gZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvcikgeworCXJlc3VsdCsrOyAKKwlmcHJpbnRmIChsb2dGaWxlLCAiXG5FcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2Y6ICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsIGRzdW0sIGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisgICAgfQorCisjaWYgMAorICAgIGRwdCA9IDEuOworICAgIGZvciAoaSA9IDA7IGkgPCBET1VCTEVfRElHSVRTOyArK2kpCisgICAgeworCWRwdCAqPSBkdDsKKyAgICB9CisjZW5kaWYKKworCisvKioqKiBUZXN0aW5nIGRvdWJsZSBzdWJ0cmFjdGlvbiAqKioqLworCisgICAgZGRpZmYgPSAoMSAtIGRwdCkgLyAoMSAtIGR0KTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBET1VCTEVfRElHSVRTOyArK2opCisJICAgIHsKKwkJZGRpZmYgLT0gcG93IChkdCwgaik7CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisKKyAgICBpZiAoZmFicyAoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsIGRkaWZmKTsKKyAgICB9CisKKworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisvKiogVGVzdHMgZm9yIGxvZ2ljYWwgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqKi8KKy8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCisKKy8qKioqIFRlc3RpbmcgbG9naWMgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYoIWxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBsb2dpY19hbmQgPSAxOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKGxvZ2ljX2FuZCkgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBsb2dpYyBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcikgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmIChsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworICAgIH0KKworICAgIGxvZ2ljX29yID0gMDsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAxOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKworICAgIGlmKCFsb2dpY19vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKy8qKiBUZXN0cyBmb3IgYml0IHZhbHVlcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisKKworLyoqKiogVGVzdGluZyBiaXQgYW5kICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyArK2kpCisgICAgeworCWxvZ2ljc1tpXSA9IDE7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCkgIDwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3Nbal0pOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKCFiaXRfYW5kKSB7CisJcmVzdWx0Kys7CisJZnByaW50ZiAobG9nRmlsZSwgIkVycm9yIGluIEJJVCBBTkQgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfYW5kID0gMTsKKyAgICBsb2dpY3NbTE9PUENPVU5UIC8gMl0gPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGJpdF9hbmQpIHsKKwlyZXN1bHQrKzsKKwlmcHJpbnRmIChsb2dGaWxlLCAiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDJcbiIpOworICAgIH0KKworCisvKioqKiBUZXN0aW5nIGJpdCBvciAqKioqLworCisgICAgZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlsb2dpY3NbaV0gPSAwOworICAgIH0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIGludCBqOworI3ByYWdtYSBvbXAgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPgorCSAgICBmb3IgKGogPSAwOyBqIDwgTE9PUENPVU5UOyArK2opCisJICAgIHsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2pdOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisgICAgfQorCisgICAgaWYgKGJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBiaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWJpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKworLyoqKiogVGVzdGluZyBleGNsdXNpdmUgYml0IG9yICoqKiovCisKKyAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgeworCWxvZ2ljc1tpXSA9IDA7CisgICAgfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGo7CisjcHJhZ21hIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+CisJICAgIGZvciAoaiA9IDA7IGogPCBMT09QQ09VTlQ7ICsraikKKwkgICAgeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3Nbal07CisJICAgIH0KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9CisgICAgaWYgKGV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAxXG4iKTsKKyAgICB9CisKKyAgICBleGNsdXNpdl9iaXRfb3IgPSAwOworICAgIGxvZ2ljc1tMT09QQ09VTlQgLyAyXSA9IDE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICBpbnQgajsKKyNwcmFnbWEgb21wIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKwkgICAgZm9yIChqID0gMDsgaiA8IExPT1BDT1VOVDsgKytqKQorCSAgICB7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tqXTsKKwkgICAgfQorCTwvb21wdHM6b3JwaGFuPgorICAgIH0KKyAgICBpZiAoIWV4Y2x1c2l2X2JpdF9vcikgeworCXJlc3VsdCsrOworCWZwcmludGYgKGxvZ0ZpbGUsICJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKyAgICB9CisKKyAgICAvKmZwcmludGYgKCJcblJlc3VsdDolZFxuIiwgcmVzdWx0KTsqLworICAgIHJldHVybiAocmVzdWx0ID09IDApOworCisgICAgZnJlZSAobG9naWNzKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9hdXRvLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTYxYTFjNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2F1dG8uYwpAQCAtMCwwICsxLDU1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3Igc2NoZWR1bGUgYXV0bzwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIGF1dG88L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBzdW0xOworI3ByYWdtYSBvbXAgdGhyZWFkcHJpdmF0ZShzdW0xKQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfZm9yX2F1dG88L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBzdW07CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0wOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBpbnQga25vd25fc3VtOworICAgIGludCB0aHJlYWRzbnVtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0wID0gMTIzNDU7CisgICAgc3VtMSA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIHRocmVhZHNudW09b21wX2dldF9udW1fdGhyZWFkcygpOworICAgICAgICB9CisJLyogc3VtMCA9IDA7ICovCisJPG9tcHRzOm9ycGhhbj4KKwlpbnQgaTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApIHNjaGVkdWxlKGF1dG8pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJeworCSAgICBzdW0wID0gc3VtMCArIGk7CisJICAgIHN1bTEgPSBzdW0wOworCX0JLyogZW5kIG9mIGZvciAqLworCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKworICAgIGtub3duX3N1bSA9IDEyMzQ1KiB0aHJlYWRzbnVtKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDJjZGE1NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2R5bmFtaWMuYwpAQCAtMCwwICsxLDExMSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBkeW5hbWljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmU8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShkeW5hbWljKTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaCxvbXAgZm9yIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKy8qCisqIFRlc3QgZm9yIGR5bmFtaWMgc2NoZWR1bGluZyB3aXRoIGNodW5rIHNpemUKKyogTWV0aG9kOiBjYWN1bGF0ZSBob3cgbWFueSB0aW1lcyB0aGUgaXRlcmF0aW9uIHNwYWNlIGlzIGRpc3BhdGNoZWQKKyogICAgICAgICBhbmQganVkZ2UgaWYgZWFjaCBkaXNwYXRjaCBoYXMgdGhlIHJlcXVlc3RlZCBjaHVuayBzaXplCisqICAgICAgICAgdW5sZXNzIGl0IGlzIHRoZSBsYXN0IG9uZS4KKyogSXQgaXMgcG9zc2libGUgZm9yIHR3byBhZGphY2VudCBjaHVua3MgYXJlIGFzc2lnbmVkIHRvIHRoZSBzYW1lIHRocmVhZAorKiBNb2RpZnlpZWQgYnkgQ2h1bmh1YSBMaWFvCisqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKyNkZWZpbmUgQ0ZETUFYX1NJWkUgMTAwCitjb25zdCBpbnQgY2h1bmtfc2l6ZSA9IDc7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZHluYW1pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgIGludCB0aWQ7Cis8b21wdHM6b3JwaGFuOnZhcnM+ICAKKyAgaW50ICp0aWRzOworICBpbnQgaTsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgaW50IHRpZHNBcnJheVtDRkRNQVhfU0laRV07CisgIGludCBjb3VudCA9IDA7CisgIGludCB0bXBfY291bnQgPSAwOyAvKmRpc3BhdGNoIHRpbWVzKi8KKyAgaW50ICp0bXA7ICAvKnN0b3JlIGNodW5rIHNpemUgZm9yIGVhY2ggZGlzcGF0Y2gqLworICBpbnQgcmVzdWx0ID0gMDsKKyAgCisgIHRpZHMgPSB0aWRzQXJyYXk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgewkJCQkvKiBiZWdpbiBvZiBwYXJhbGxlbCAqLworICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgaW50IHRpZDsKKworICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFOyBpKyspCisgICAgICB7CisJdGlkc1tpXSA9IHRpZDsKKyAgICAgIH0KKyAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0JCQkJLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgZm9yIChpID0gMDsgaSA8IENGRE1BWF9TSVpFIC0gMTsgKytpKQorICAgIHsKKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIGNvdW50Kys7CisJfQorICAgIH0KKworICB0bXAgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKGNvdW50ICsgMSkpOworICB0bXBbMF0gPSAxOworCisgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRSAtIDE7ICsraSkKKyAgICB7CisgICAgICBpZiAodG1wX2NvdW50ID4gY291bnQpCisJeworCSAgcHJpbnRmICgiLS0tLS0tLS0tLS0tLS0tLS0tLS1cblRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gc21hbGwhISFcbi0tLS0tLS0tLS0tLS0tLS0tLS0tXG4iKTsJLyogRXJyb3IgaGFuZGxpbmcgKi8KKwkgIGJyZWFrOworCX0KKyAgICAgIGlmICh0aWRzW2ldICE9IHRpZHNbaSArIDFdKQorCXsKKwkgIHRtcF9jb3VudCsrOworCSAgdG1wW3RtcF9jb3VudF0gPSAxOworCX0KKyAgICAgIGVsc2UKKwl7CisJICB0bXBbdG1wX2NvdW50XSsrOworCX0KKyAgICB9CisvKgorcHJpbnRmKCJkZWJ1Zy0tLS1cbiIpOworICAgIGZvciAoaSA9IDA7IGkgPCBDRkRNQVhfU0laRTsgKytpKQorCXByaW50ZigiJWQgIix0aWRzW2ldKTsKK3ByaW50ZigiZGVidWctLS0tXG4iKTsKKyovCisvKiBpcyBkeW5hbWljIHN0YXRlbWVudCB3b3JraW5nPyAqLworICBmb3IgKGkgPSAwOyBpIDwgY291bnQ7IGkrKykKKyAgICB7CisgICAgICBpZiAoKHRtcFtpXSVjaHVua19zaXplKSE9MCkgCisvKml0IGlzIHBvc3NpYmxlIGZvciAyIGFkamFjZW50IGNodW5rcyBhc3NpZ25lZCB0byBhIHNhbWUgdGhyZWFkKi8KKwl7CisgICAgICAgICByZXN1bHQrKzsKKyAgZnByaW50Zihsb2dGaWxlLCJUaGUgaW50ZXJtZWRpYXRlIGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKwkgIC8qcmVzdWx0ICs9ICgodG1wW2ldIC8gY2h1bmtfc2l6ZSkgLSAxKTsqLworCX0KKyAgICB9CisgIGlmICgodG1wW2NvdW50XSVjaHVua19zaXplKSE9KENGRE1BWF9TSVpFJWNodW5rX3NpemUpKQorICAgeyAKKyAgIHJlc3VsdCsrOworICBmcHJpbnRmKGxvZ0ZpbGUsInRoZSBsYXN0IGRpc3BhdGNoIGhhcyB3cm9uZyBjaHVua3NpemUuXG4iKTsKKyAgIH0KKyAgLyogZm9yIChpbnQgaT0wO2k8Y291bnQrMTsrK2kpIHByaW50ZigiJWRcdDo9XHQlZFxuIixpKzEsdG1wW2ldKTsgKi8KKyAgcmV0dXJuIChyZXN1bHQ9PTApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODM1NjRhNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX2d1aWRlZC5jCkBAIC0wLDAgKzEsMjI1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGd1aWRlZCBvcHRpb24gb2YgdGhlIG9tcCBmb3Igc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZm9yIHNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGZvciBub3dhaXQsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyogVGVzdCBmb3IgZ3VpZGVkIHNjaGVkdWxpbmcKKyAqIEVuc3VyZSB0aHJlYWRzIGdldCBjaHVua3MgaW50ZXJsZWF2ZWx5IGZpcnN0CisgKiBUaGVuIGp1ZGdlIHRoZSBjaHVuayBzaXplcyBhcmUgZGVjcmVhc2luZyB0byBhIHN0YWJsZSB2YWx1ZQorICogTW9kaWZpZWQgYnkgQ2h1bmh1YSBMaWFvCisgKiBGb3IgZXhhbXBsZSwgMTAwIGl0ZXJhdGlvbiBvbiAyIHRocmVhZHMsIGNodW5rc2l6ZSA3CisgKiBvbmUgbGluZSBmb3IgZWFjaCBkaXNwYXRjaCwgMC8xIG1lYW5zIHRocmVhZCBpZAorICogMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgIDI0CisgKiAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgMTgKKyAqIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAxNAorICogMSAxIDEgMSAxIDEgMSAxIDEgMSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEwCisgKiAwIDAgMCAwIDAgMCAwIDAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDgKKyAqIDEgMSAxIDEgMSAxIDEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNworICogMCAwIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3CisgKiAxIDEgMSAxIDEgMSAxICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDcKKyAqIDAgMCAwIDAgMCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgNQorKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgIDAuMDA1CisKKyNpZmRlZiBTTEVFUFRJTUUKKyN1bmRlZiBTTEVFUFRJTUUKKyNkZWZpbmUgU0xFRVBUSU1FIDAuMDAwMQorI2VuZGlmCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50ICogdGlkczsKKwlpbnQgKiBjaHVua3NpemVzOworCWludCBub3RvdXQ7CisJaW50IG1heGl0ZXI7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIGludCB0aHJlYWRzOworICAgIGludCBpOworICAgIGludCByZXN1bHQ7CisKKyAgICB0aWRzID0gKGludCAqKSBtYWxsb2MgKHNpemVvZiAoaW50KSAqIChDRlNNQVhfU0laRSArIDEpKTsKKwltYXhpdGVyID0gMDsKKyAgICByZXN1bHQgPSAxOworICAgIG5vdG91dCA9IDE7CisKKy8qIFRlc3RpbmcgaWYgZW5vdWdodCB0aHJlYWRzIGFyZSBhdmFpbGFibGUgZm9yIHRoaXMgY2hlY2suICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyNwcmFnbWEgb21wIHNpbmdsZQorCSAgeworCQl0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKwkgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKwlpZiAodGhyZWFkcyA8IDIpIHsKKwkgIHByaW50ZiAoIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMgLlxuIik7CisJICBmcHJpbnRmIChsb2dGaWxlLCAiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcy4gQXZhaWxhYmxlIHdlcmUgb25seSAlZCB0aHJlYWQocykuXG4iLCB0aHJlYWRzKTsKKwkgIHJldHVybiAoMCk7CisJfSAvKiBlbmQgaWYgKi8KKworCisgICAgLyogTm93IHRoZSByZWFsIHBhcmFsbGVsIHdvcms6ICAKKyAgICAgKgorCSAqIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAgICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcyxtYXhpdGVyKQorICAgIHsJLyogYmVnaW4gb2YgcGFyYWxsZWwgKi8KKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICBkb3VibGUgY291bnQ7CisgICAgICBpbnQgdGlkOworICAgICAgaW50IGo7CisKKyAgICAgIHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKworI3ByYWdtYSBvbXAgZm9yIG5vd2FpdCA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZ3VpZGVkKTwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaiA9IDA7IGogPCBDRlNNQVhfU0laRTsgKytqKQorICAgICAgeworCWNvdW50ID0gMC47CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyKQorCWlmIChqID4gbWF4aXRlcikKKwl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCSAgeworCSAgICBtYXhpdGVyID0gajsKKwkgIH0JLyogZW5kIG9mIGNyaXRpY2FsICovIAorCX0KKwkvKnByaW50ZiAoInRocmVhZCAlZCBzbGVlcGluZ1xuIiwgdGlkKTsqLworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCQorCXdoaWxlIChub3RvdXQgJiYgKGNvdW50IDwgTUFYX1RJTUUpICYmIChtYXhpdGVyID09IGopKQorCXsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorCSAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisJICBjb3VudCArPSBTTEVFUFRJTUU7CisjaWZkZWYgVkVSQk9TRQorCSAgcHJpbnRmKCIuIik7CisjZW5kaWYKKwl9CisjaWZkZWYgVkVSQk9TRQorCWlmIChjb3VudCA+IDAuKSBwcmludGYoIiB3YWl0ZWQgJWxmIHNcbiIsIGNvdW50KTsKKyNlbmRpZgorCS8qcHJpbnRmICgidGhyZWFkICVkIGF3YWtlXG4iLCB0aWQpOyovCisJdGlkc1tqXSA9IHRpZDsKKyNpZmRlZiBWRVJCT1NFCisJcHJpbnRmKCIlZCBmaW5pc2hlZCBieSAlZFxuIixqLHRpZCk7CisjZW5kaWYKKyAgICAgIH0JLyogZW5kIG9mIGZvciAqLworCisgICAgICBub3RvdXQgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICB9CS8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogZXZhbHVhdGlvbiBvZiB0aGUgdmFsdWVzICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCXsKKwkgIGludCBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBpbnQgbGFzdF90aHJlYWRuciA9IHRpZHNbMF07CisJICBpbnQgZ2xvYmFsX2NodW5rbnIgPSAwOworCSAgaW50IGxvY2FsX2NodW5rbnJbTlVNQkVSX09GX1RIUkVBRFNdOworCSAgaW50IG9wZW53b3JrID0gQ0ZTTUFYX1NJWkU7CisJICBpbnQgZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIGRvdWJsZSBjID0gMTsKKworCSAgZm9yIChpID0gMDsgaSA8IE5VTUJFUl9PRl9USFJFQURTOyBpKyspCisJCWxvY2FsX2NodW5rbnJbaV0gPSAwOworCisJICB0aWRzW0NGU01BWF9TSVpFXSA9IC0xOworCisgICAgICAvKgorCSAgICogZGV0ZXJtaW5lIHRoZSBudW1iZXIgb2YgZ2xvYmFsIGNodW5rcworCSAgICovCisJICAvKmZwcmludGYobG9nRmlsZSwiIyBnbG9iYWxfY2h1bmtuciB0aHJlYWQgbG9jYWxfY2h1bmtuciBjaHVua3NpemVcbiIpOyAqLworCSAgZm9yKGkgPSAxOyBpIDw9IENGU01BWF9TSVpFOyArK2kpCisJICB7CisJCWlmIChsYXN0X3RocmVhZG5yPT10aWRzW2ldKSB7IAorCQkgIGRldGVybWluZWRfY2h1bmtzaXplKys7IAorCQl9CisJCWVsc2UKKwkJeworCQkgIC8qIGZwcmludGYgKGxvZ0ZpbGUsICIlZFx0JWRcdCVkXHQlZFxuIiwgZ2xvYmFsX2NodW5rbnIsbGFzdF90aHJlYWRuciwgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSwgbSk7ICovCisJCSAgZ2xvYmFsX2NodW5rbnIrKzsKKwkJICBsb2NhbF9jaHVua25yW2xhc3RfdGhyZWFkbnJdKys7CisJCSAgbGFzdF90aHJlYWRuciA9IHRpZHNbaV07CisJCSAgZGV0ZXJtaW5lZF9jaHVua3NpemUgPSAxOworCQl9CisJICB9CisJICAvKiBub3cgYWxsb2NhdGUgdGhlIG1lbW9yeSBmb3Igc2F2aW5nIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcyAqLworCSAgY2h1bmtzaXplcyA9IChpbnQqKW1hbGxvYyhnbG9iYWxfY2h1bmtuciAqIHNpemVvZihpbnQpKTsKKworICAgICAgLyoKKwkgICAqIEV2YWx1YXRlIHRoZSBzaXplcyBvZiB0aGUgZ2xvYmFsIGNodW5rcworCSAgICovCisJICBnbG9iYWxfY2h1bmtuciA9IDA7CisJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSA9IDE7CisJICBsYXN0X3RocmVhZG5yID0gdGlkc1swXTsJICAgIAorCSAgZm9yIChpID0gMTsgaSA8PSBDRlNNQVhfU0laRTsgKytpKQorCSAgeworCQkvKiBJZiB0aGUgdGhyZWFkbnVtYmVyIHdhcyB0aGUgc2FtZSBhcyBiZWZvcmUgaW5jcmVhc2UgdGhlIGRldGVjdGVkIGNodW5rc2l6ZSBmb3IgdGhpcyBjaHVuaworCQkgKiBvdGhlcndpc2Ugc2V0IHRoZSBkZXRlY3RlZCBjaHVua3NpemUgYWdhaW4gdG8gb25lIGFuZCBzYXZlIHRoZSBudW1iZXIgb2YgdGhlIG5leHQgdGhyZWFkIGluIGxhc3RfdGhyZWFkbnIuIAorCQkgKi8KKwkJaWYgKGxhc3RfdGhyZWFkbnIgPT0gdGlkc1tpXSkgeyAKKwkJICBkZXRlcm1pbmVkX2NodW5rc2l6ZSsrOyAKKwkJfQorCQllbHNlIHsKKwkJICBjaHVua3NpemVzW2dsb2JhbF9jaHVua25yXSA9IGRldGVybWluZWRfY2h1bmtzaXplOworCQkgIGdsb2JhbF9jaHVua25yKys7CisJCSAgbG9jYWxfY2h1bmtucltsYXN0X3RocmVhZG5yXSsrOworCQkgIGxhc3RfdGhyZWFkbnIgPSB0aWRzW2ldOworCQkgIGRldGVybWluZWRfY2h1bmtzaXplID0gMTsKKwkJfQorCSAgfQorCisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgImZvdW5kXHRleHBlY3RlZFx0Y29uc3RhbnRcbiIpOworI2VuZGlmCisKKwkgIC8qIGlkZW50aWZ5IHRoZSBjb25zdGFudCBjIGZvciB0aGUgZXhwb25lbnRpYWwgZGVjcmVhc2Ugb2YgdGhlIGNodW5rc2l6ZSAqLworCSAgZXhwZWN0ZWRfY2h1bmtfc2l6ZSA9IG9wZW53b3JrIC8gdGhyZWFkczsKKwkgIGMgPSAoZG91YmxlKSBjaHVua3NpemVzWzBdIC8gZXhwZWN0ZWRfY2h1bmtfc2l6ZTsKKwkgIAorCSAgZm9yIChpID0gMDsgaSA8IGdsb2JhbF9jaHVua25yOyBpKyspCisJICB7CisJCS8qIGNhbGN1bGF0ZSB0aGUgbmV3IGV4cGVjdGVkIGNodW5rc2l6ZSAqLworCQlpZiAoZXhwZWN0ZWRfY2h1bmtfc2l6ZSA+IDEpIAorCQkgIGV4cGVjdGVkX2NodW5rX3NpemUgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzOworCQkKKyNpZmRlZiBWRVJCT1NFCisJCWZwcmludGYgKGxvZ0ZpbGUsICIlOGRcdCU4ZFx0JWxmXG4iLCBjaHVua3NpemVzW2ldLCBleHBlY3RlZF9jaHVua19zaXplLCBjICogY2h1bmtzaXplc1tpXS9leHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCQkKKwkJLyogY2hlY2sgaWYgY2h1bmtzaXplIGlzIGluc2lkZSB0aGUgcm91bmRpbmcgZXJyb3JzICovCisJCWlmIChhYnMgKGNodW5rc2l6ZXNbaV0gLSBleHBlY3RlZF9jaHVua19zaXplKSA+PSAyKSB7CisJCSAgcmVzdWx0ID0gMDsKKyNpZm5kZWYgVkVSQk9TRQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCB2YWx1ZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSwgZXhwZWN0ZWRfY2h1bmtfc2l6ZSk7CisJCSAgcmV0dXJuIDA7CisjZW5kaWYKKwkJfSAvKiBlbmQgaWYgKi8KKworI2lmbmRlZiBWRVJCT1NFCisJCWlmIChleHBlY3RlZF9jaHVua19zaXplIC0gY2h1bmtzaXplc1tpXSA8IDAgKQorCQkgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVua3NpemUgZGlkIG5vdCBkZWNyZWFzZTogJWQgaW5zdGVhZCBvZiAlZFxuIiwgY2h1bmtzaXplc1tpXSxleHBlY3RlZF9jaHVua19zaXplKTsKKyNlbmRpZgorCisJCS8qIGNhbGN1bGF0aW5nIHRoZSByZW1haW5pbmcgYW1vdW50IG9mIHdvcmsgKi8KKwkJb3BlbndvcmsgLT0gY2h1bmtzaXplc1tpXTsKKwkgIH0JCisJfQorICAgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgorCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYy5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ3MWQ3ZDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMuYwpAQCAtMCwwICsxLDE2NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBzdGF0aWMgb3B0aW9uIG9mIHRoZSBvbXAgZm9yIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IHRocmVhZHM7CisgIGludCBpLGxhc3R0aWQ7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50ICogdGlkczsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTI4NjY3ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zLmMKQEAgLTAsMCArMSwyMTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgc3RhdGljIG9wdGlvbiBvZiB0aGUgb21wIGZvciBzY2hlZHVsZSBkaXJlY3RpdmUgY29uc2lkZXJpbmcgdGhlIHNwZWNpZmljYXRpb25zIGZvciB0aGUgY2h1bmsgZGlzdHJpYnV0aW9uIG9mIHNldmVyYWwgbG9vcCByZWdpb25zIGlzIHRoZSBzYW1lIGFzIHNwZWNpZmllZCBpbiB0aGUgT3BlbiBNUCBzdGFuZGFyZCB2ZXJzaW9uIDMuMC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGZvciBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZvciBub3dhaXQsb21wIGZsdXNoLG9tcCBjcml0aWNhbCxvbXAgc2luZ2xlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisjZGVmaW5lIE5VTUJFUl9PRl9USFJFQURTIDEwCisjZGVmaW5lIENGU01BWF9TSVpFIDEwMDAKKyNkZWZpbmUgTUFYX1RJTUUgMC4wMQorCisjaWZkZWYgU0xFRVBUSU1FCisjdW5kZWYgU0xFRVBUSU1FCisjZGVmaW5lIFNMRUVQVElNRSAwLjAwMDUKKyNlbmRpZgorCisjZGVmaW5lIFZFUkJPU0UgMAorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mb3Jfc2NoZWR1bGVfc3RhdGljXzM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICBpbnQgdGhyZWFkczsKKyAgaW50IGksbGFzdHRpZDsKKyAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgKiB0aWRzOworICBpbnQgKiB0aWRzMjsKKyAgaW50IG5vdG91dDsKKyAgaW50IG1heGl0ZXI7CisgIGludCBjaHVua19zaXplOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgY291bnRlciA9IDA7CisgIGludCB0bXBfY291bnQ9MTsKKyAgaW50IGxhc3R0aHJlYWRzc3RhcnR0aWQgPSAtMTsKKyAgaW50IHJlc3VsdCA9IDE7CisgIGNodW5rX3NpemUgPSA3OworCisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogKENGU01BWF9TSVpFICsgMSkpOworICBub3RvdXQgPSAxOworICBtYXhpdGVyID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKHRpZHMsY291bnRlcikKKyAgewkvKiBiZWdpbiBvZiBwYXJhbGxlbCovCisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTsKKyAgICB9CS8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBpZiAodGhyZWFkcyA8IDIpCisgIHsKKyAgICBwcmludGYgKCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIik7CisgICAgZnByaW50ZiAobG9nRmlsZSwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIpOworICAgIHJldHVybiAwOworICB9CisgIGVsc2UgCisgIHsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCJVc2luZyBhbiBpbnRlcm5hbCBjb3VudCBvZiAlZFxuVXNpbmcgYSBzcGVjaWZpZWQgY2h1bmtzaXplIG9mICVkXG4iLCBDRlNNQVhfU0laRSwgY2h1bmtfc2l6ZSk7CisgICAgdGlkc1tDRlNNQVhfU0laRV0gPSAtMTsJLyogc2V0dGluZyBlbmRmbGFnICovCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzaGFyZWQodGlkcykKKyAgICB7CS8qIGJlZ2luIG9mIHBhcmFsbGVsICovCisgICAgICA8b21wdHM6b3JwaGFuPgorCWRvdWJsZSBjb3VudDsKKyAgICAgIGludCB0aWQ7CisgICAgICBpbnQgajsKKworICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisjcHJhZ21hIG9tcCBmb3Igbm93YWl0IDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGogPSAwOyBqIDwgQ0ZTTUFYX1NJWkU7ICsraikKKyAgICAgIHsKKwljb3VudCA9IDAuOworI3ByYWdtYSBvbXAgZmx1c2gobWF4aXRlcikKKwlpZiAoaiA+IG1heGl0ZXIpCisJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgbWF4aXRlciA9IGo7CisJICB9CS8qIGVuZCBvZiBjcml0aWNhbCAqLyAKKwl9CisJLypwcmludGYgKCJ0aHJlYWQgJWQgc2xlZXBpbmdcbiIsIHRpZCk7Ki8KKwl3aGlsZSAobm90b3V0ICYmIChjb3VudCA8IE1BWF9USU1FKSAmJiAobWF4aXRlciA9PSBqKSkKKwl7CisjcHJhZ21hIG9tcCBmbHVzaChtYXhpdGVyLG5vdG91dCkKKwkgIG15X3NsZWVwIChTTEVFUFRJTUUpOworCSAgY291bnQgKz0gU0xFRVBUSU1FOworCSAgcHJpbnRmKCIuIik7CisJfQorI2lmZGVmIFZFUkJPU0UKKwlpZiAoY291bnQgPiAwLikgcHJpbnRmKCIgd2FpdGVkICVsZiBzXG4iLCBjb3VudCk7CisjZW5kaWYKKwkvKnByaW50ZiAoInRocmVhZCAlZCBhd2FrZVxuIiwgdGlkKTsqLworCXRpZHNbal0gPSB0aWQ7CisjaWZkZWYgVkVSQk9TRQorCXByaW50ZigiJWQgZmluaXNoZWQgYnkgJWRcbiIsaix0aWQpOworI2VuZGlmCisgICAgICB9CS8qIGVuZCBvZiBmb3IgKi8KKworICAgICAgbm90b3V0ID0gMDsKKyNwcmFnbWEgb21wIGZsdXNoKG1heGl0ZXIsbm90b3V0KQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICAgIC8qKioqIGFuYWx5c2luZyB0aGUgZGF0YSBpbiBhcnJheSB0aWRzICoqKiovCisKKyAgICBsYXN0dGlkID0gdGlkc1swXTsKKyAgICB0bXBfY291bnQgPSAwOyAKKworICAgIGZvciAoaSA9IDA7IGkgPCBDRlNNQVhfU0laRSArIDE7ICsraSkKKyAgICB7CisgICAgICAvKiBJZiB0aGUgd29yayAgd2FzIGRvbmUgYnkgdGhlIHNhbWUgdGhyZWFkIGluY3JlYXNlIHRtcF9jb3VudCBieSBvbmUuICovCisgICAgICBpZiAodGlkc1tpXSA9PSBsYXN0dGlkKSB7CisJdG1wX2NvdW50Kys7CisjaWZkZWYgVkVSQk9TRQorCWZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorCWNvbnRpbnVlOworICAgICAgfQorCisgICAgICAvKiBDaGVjayBpZiB0aGUgbmV4dCB0aHJlYWQgaGFkIGhhcyB0aGUgcmlnaHQgdGhyZWFkIG51bWJlci4gV2hlbiBmaW5kaW5nIAorICAgICAgICogdGhyZWFkbnVtYmVyIC0xIHRoZSBlbmQgc2hvdWxkIGJlIHJlYWNoZWQuIAorICAgICAgICovCSAgCisgICAgICBpZiAodGlkc1tpXSA9PSAobGFzdHRpZCArIDEpICUgdGhyZWFkcyB8fCB0aWRzW2ldID09IC0xKSB7CisJLyogY2hlY2tpbmcgZm9yIHRoZSByaWdodCBjaHVuayBzaXplICovCisJaWYgKHRtcF9jb3VudCA9PSBjaHVua19zaXplKSB7CisJICB0bXBfY291bnQgPSAxOworCSAgbGFzdHRpZCA9IHRpZHNbaV07CisjaWZkZWYgVkVSQk9TRQorCSAgZnByaW50ZiAobG9nRmlsZSwgIk9LXG4iKTsKKyNlbmRpZgorCX0KKwkvKiBJZiB0aGUgY2h1bmsgc2l6ZSB3YXMgd3JvbmcsIGNoZWNrIGlmIHRoZSBlbmQgd2FzIHJlYWNoZWQgKi8KKwllbHNlIHsKKwkgIGlmICh0aWRzW2ldID09IC0xKSB7CisJICAgIGlmIChpID09IENGU01BWF9TSVpFKSB7CisJICAgICAgZnByaW50ZiAobG9nRmlsZSwgIkxhc3QgdGhyZWFkIGhhZCBjaHVuayBzaXplICVkXG4iLCB0bXBfY291bnQpOworCSAgICAgIGJyZWFrOworCSAgICB9CisJICAgIGVsc2UgeworCSAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogTGFzdCB0aHJlYWQgKHRocmVhZCB3aXRoIG51bWJlciAtMSkgd2FzIGZvdW5kIGJlZm9yZSB0aGUgZW5kLlxuIik7CisJICAgICAgcmVzdWx0ID0gMDsKKwkgICAgfQorCSAgfQorCSAgZWxzZSB7CisJICAgIGZwcmludGYgKGxvZ0ZpbGUsICJFUlJPUjogY2h1bmsgc2l6ZSB3YXMgJWQuIChhc3NpZ25lZCB3YXMgJWQpXG4iLCB0bXBfY291bnQsIGNodW5rX3NpemUpOworCSAgICByZXN1bHQgPSAwOworCSAgfQorCX0KKyAgICAgIH0KKyAgICAgIGVsc2UgeworCWZwcmludGYobG9nRmlsZSwgIkVSUk9SOiBGb3VuZCB0aHJlYWQgd2l0aCBudW1iZXIgJWQgKHNob3VsZCBiZSBpbmJldHdlZW4gMCBhbmQgJWQpLiIsIHRpZHNbaV0sIHRocmVhZHMgLSAxKTsKKwlyZXN1bHQgPSAwOworICAgICAgfQorI2lmZGVmIFZFUkJPU0UKKyAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICIlZDogJWQgXG4iLCBpLCB0aWRzW2ldKTsKKyNlbmRpZgorICAgIH0KKyAgfQorCisgIC8qIE5vdyB3ZSBjaGVjayBpZiBzZXZlcmFsIGxvb3AgcmVnaW9ucyBpbiBvbmUgcGFyYWxsZWwgcmVnaW9uIGhhdmUgdGhlIHNhbWUgCisgICAqIGxvZ2ljYWwgYXNzaWduZW1lbnQgb2YgY2h1bmtzIHRvIHRocmVhZHMuCisgICAqIFdlIHVzZSB0aGUgbm93YWl0IGNsYXVzZSB0byBpbmNyZWFzZSB0aGUgcHJvYmFiaWxpdHkgdG8gZ2V0IGFuIGVycm9yLiAqLworCisgIC8qIEZpcnN0IHdlIGFsbG9jYXRlIHNvbWUgbW9yZSBtZW1tb3J5ICovCisgZnJlZSAodGlkcyk7CisgIHRpZHMgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKyAgdGlkczIgPSAoaW50ICopIG1hbGxvYyAoc2l6ZW9mIChpbnQpICogTE9PUENPVU5UKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgIHsKKyAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICB7CisgICAgICAgICAgaW50IG47CisjcHJhZ21hIG9tcCBmb3IgPG9tcHRzOmNoZWNrPnNjaGVkdWxlKHN0YXRpYyk8L29tcHRzOmNoZWNrPiBub3dhaXQKKyAgICAgICAgICBmb3IgKG4gPSAwOyBuIDwgTE9PUENPVU5UOyBuKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICBpZiAoTE9PUENPVU5UID09IG4gKyAxICkKKyAgICAgICAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgdGlkc1tuXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgIH0KKyAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgIHsKKyAgICAgICAgICBpbnQgbTsKKyNwcmFnbWEgb21wIGZvciA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoc3RhdGljKTwvb21wdHM6Y2hlY2s+IG5vd2FpdAorICAgICAgICAgIGZvciAobSA9IDE7IG0gPD0gTE9PUENPVU5UOyBtKyspCisgICAgICAgICAgeworICAgICAgICAgICAgICB0aWRzMlttLTFdID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgfQorICAgICAgfQorICAgICAgPC9vbXB0czpvcnBoYW4+CisgIH0KKworICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisgICAgICBpZiAodGlkc1tpXSAhPSB0aWRzMltpXSkgeworICAgICAgICAgIGZwcmludGYgKGxvZ0ZpbGUsICJDaHVuayBuby4gJWQgd2FzIGFzc2lnbmVkIG9uY2UgdG8gdGhyZWFkICVkIGFuZCBsYXRlciB0byB0aHJlYWQgJWQuXG4iLCBpLCB0aWRzW2ldLHRpZHMyW2ldKTsKKyAgICAgICAgICByZXN1bHQgPSAwOworICAgICAgfQorCisgIGZyZWUgKHRpZHMpOworICBmcmVlICh0aWRzMik7CisgIHJldHVybiByZXN1bHQ7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfbnVtX3RocmVhZHMuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGIwOTJiYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZ2V0X251bV90aHJlYWRzLmMKQEAgLTAsMCArMSwzOSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoYXQgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgcmV0dXJucyB0aGUgY29ycmVjdCBudW1iZXIgb2YgdGhyZWFkcy4gVGhlcmVmb3IgaXQgY291bnRzIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgc2VjdGlvbiBhbmQgY29tcGFycyB0aGlzIHZhbHVlIHdpdGggdGhlIHJlc3VsdCBvZiB0aGUgb21wX2dldF9udW1fdGhyZWFkcyBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF9udW1fdGhyZWFkczwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIC8qIGNoZWNrcyB0aGF0IG9tcF9nZXRfbnVtX3RocmVhZHMgaXMgZXF1YWwgdG8gdGhlIG51bWJlciBvZgorICAgICAgIHRocmVhZHMgKi8KKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG50aHJlYWRzX2xpYjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBudGhyZWFkcyA9IDA7CisKKyAgICBudGhyZWFkc19saWIgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIG50aHJlYWRzKys7CisJfQkvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyNwcmFnbWEgb21wIHNpbmdsZQorCXsgCis8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+bnRocmVhZHNfbGliID0gb21wX2dldF9udW1fdGhyZWFkcyAoKTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisJfQkvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfQkvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworCWZwcmludGYgKGxvZ0ZpbGUsICJDb3VudGVkICVkIHRocmVhZHMuIGdldF9udW1fdGhyZWFkcyByZXR1cm5lZCAlZC5cbiIsIG50aHJlYWRzLCBudGhyZWFkc19saWIpOworICAgIHJldHVybiAobnRocmVhZHMgPT0gbnRocmVhZHNfbGliKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX2dldF93dGljay5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODJiNTdmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpY2suYwpAQCAtMCwwICsxLDI0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9nZXRfd3RpY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSB0aWNrOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgdGljayA9IC0xLjsKKworICAgIDxvbXB0czpvcnBoYW4+CisJPG9tcHRzOmNoZWNrPnRpY2sgPSBvbXBfZ2V0X3d0aWNrICgpOzwvb21wdHM6Y2hlY2s+CisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgZnByaW50ZiAobG9nRmlsZSwgIldvcmsgdG9vayAlbGYgc2VjLiB0aW1lLlxuIiwgdGljayk7CisgICAgcmV0dXJuICgodGljayA+IDAuMCkgJiYgKHRpY2sgPCAwLjAxKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9nZXRfd3RpbWUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWYwMjI2ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfZ2V0X3d0aW1lLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aW1lIGZ1bmN0aW9uLiBJdCBjb21wYXJlcyB0aGUgdGltZSB3aXRoIHdoaWNoIGlzIGNhbGxlZCBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggdGhlIHRpbWUgaXQgdG9vayBieSBtZXNzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FsbCBvZiB0aGUgc2xlZXAgZnVuY3Rpb24gYW5kIGl0cyBlbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpbWU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlPHN0ZGlvLmg+CisjaW5jbHVkZTxzdGRsaWIuaD4KKyNpbmNsdWRlPHVuaXN0ZC5oPgorCisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpbWU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWRvdWJsZSBzdGFydDsKKwlkb3VibGUgZW5kOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgZG91YmxlIG1lYXN1cmVkX3RpbWU7CisgICAgaW50IHdhaXRfdGltZSA9IDE7IAorCisgICAgc3RhcnQgPSAwOworICAgIGVuZCA9IDA7CisKKyAgICA8b21wdHM6b3JwaGFuPgorCTxvbXB0czpjaGVjaz5zdGFydCA9IG9tcF9nZXRfd3RpbWUgKCk7PC9vbXB0czpjaGVjaz4KKyAgICA8L29tcHRzOm9ycGhhbj4KKwlteV9zbGVlcCAod2FpdF90aW1lKTsgCisgICAgPG9tcHRzOm9ycGhhbj4KKwk8b21wdHM6Y2hlY2s+ZW5kID0gb21wX2dldF93dGltZSAoKTs8L29tcHRzOmNoZWNrPgorICAgIDwvb21wdHM6b3JwaGFuPgorCW1lYXN1cmVkX3RpbWUgPSBlbmQtc3RhcnQ7CisgICAgZnByaW50Zihsb2dGaWxlLCAiV29yayB0b29rICVsZiBzZWMuIHRpbWUuXG4iLCBtZWFzdXJlZF90aW1lKTsKKyAgICByZXR1cm4gKChtZWFzdXJlZF90aW1lID4gMC45OSAqIHdhaXRfdGltZSkgJiYgKG1lYXN1cmVkX3RpbWUgPCAxLjAxICogd2FpdF90aW1lKSkgOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfaW5fcGFyYWxsZWwuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wOWI2MTExCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9pbl9wYXJhbGxlbC5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IG9tcF9pbl9wYXJhbGxlbCByZXR1cm5zIGZhbHNlIHdoZW4gY2FsbGVkIGZyb20gYSBzZXJpYWwgcmVnaW9uIGFuZCB0cnVlIHdoZW4gY2FsbGVkIHdpdGhpbiBhIHBhcmFsbGVsIHJlZ2lvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2luX3BhcmFsbGVsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogQ2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCisgKiBhbmQgdHJ1ZSBpcyByZXR1cm5lZCB3aGVuIGNhbGxlZCB3aXRoaW4gcGFyYWxsZWwgcmVnaW9uLiAKKyAqLworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfaW5fcGFyYWxsZWw8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc2VyaWFsOworCWludCBpc3BhcmFsbGVsOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBzZXJpYWwgPSAxOworICAgIGlzcGFyYWxsZWwgPSAwOworCisgICAgPG9tcHRzOmNoZWNrPgorCTxvbXB0czpvcnBoYW4+CisJICAgIHNlcmlhbCA9IG9tcF9pbl9wYXJhbGxlbCAoKTsKKwk8L29tcHRzOm9ycGhhbj4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCWlzcGFyYWxsZWwgPSBvbXBfaW5fcGFyYWxsZWwgKCk7CisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0KKyAgICB9CisgICAgPC9vbXB0czpjaGVjaz4KKworICAgIDxvbXB0czpjcm9zc2NoZWNrPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzaW5nbGUKKwkgICAgeworCisJICAgIH0KKwl9CisgICAgPC9vbXB0czpjcm9zc2NoZWNrPgorCisJcmV0dXJuICghKHNlcmlhbCkgJiYgaXNwYXJhbGxlbCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNTI5YzA3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9sb2NrLmMKQEAgLTAsMCArMSw0NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X2xvY2sgIGFuZCB0aGUgb21wX3Vuc2V0X2xvY2sgZnVuY3Rpb24gYnkgY291bnRpbmcgdGhlIHRocmVhZHMgZW50ZXJpbmcgYW5kIGV4aXRpbmcgYSBzaW5nbGUgcmVnaW9uIHdpdGggbG9ja3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX2xvY2tfdCBsY2s7CisgICAgCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgaW50IHJlc3VsdCA9IDA7CisgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgaW50IGk7CisgIG9tcF9pbml0X2xvY2sgKCZsY2spOworICAKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spCisgIHsKKyAgICAjcHJhZ21hIG9tcCBmb3IKKyAgICBmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKyAgICAgIHsKKwk8b21wdHM6b3JwaGFuPgorCSAgICA8b21wdHM6Y2hlY2s+b21wX3NldF9sb2NrICgmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgZmx1c2gKKwlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCW5yX2l0ZXJhdGlvbnMrKzsKKwlucl90aHJlYWRzX2luX3NpbmdsZS0tOworCXJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jaygmbGNrKTs8L29tcHRzOmNoZWNrPgorCTwvb21wdHM6b3JwaGFuPgorICAgICAgfQorICB9CisgIG9tcF9kZXN0cm95X2xvY2sgKCZsY2spOworICAKKyAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworICAKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX21hc3Rlci5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jZGIyZjFlCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9tYXN0ZXIuYwpAQCAtMCwwICsxLDM3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfbWFzdGVyPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG50aHJlYWRzID0gMDsKKyAgICBleGVjdXRpbmdfdGhyZWFkID0gLTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisJICAgIDxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBtYXN0ZXIgPC9vbXB0czpjaGVjaz4KKwkgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgbnRocmVhZHMrKzsKKwkJfQorCQlleGVjdXRpbmdfdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCisJICAgIH0gLyogZW5kIG9mIG1hc3RlciovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLworICAgIHJldHVybiAoKG50aHJlYWRzID09IDEpICYmIChleGVjdXRpbmdfdGhyZWFkID09IDApKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX21hc3Rlcl8zLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOGU5ODEyOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfbWFzdGVyXzMuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uIEl0IGFsc28gY2hlY2tzIHRoYXQgdGhlIG1hc3RlciB0aHJlYWQgaGFzIHRoZSB0aHJlYWQgbnVtYmVyIDAgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuIE1QIHN0YW5kYXJkIHZlcnNpb24gMy4wLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgbWFzdGVyPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX21hc3Rlcl8zPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnRocmVhZHM7CisJaW50IGV4ZWN1dGluZ190aHJlYWQ7CisgICAgICAgIGludCB0aWRfcmVzdWx0ID0gMDsgLyogY291bnRzIHVwIHRoZSBudW1iZXIgb2Ygd3JvbmcgdGhyZWFkIG5vLiBmb3IKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB0aGUgbWFzdGVyIHRocmVhZC4gKE11c3QgYmUgMCkgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgbnRocmVhZHMgPSAwOworICAgIGV4ZWN1dGluZ190aHJlYWQgPSAtMTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG1hc3RlciA8L29tcHRzOmNoZWNrPgorCSAgICB7CisgICAgICAgICAgICAgICAgaW50IHRpZCA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgICAgIGlmICh0aWQgIT0gMCkgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICAgICAgeyB0aWRfcmVzdWx0Kys7IH0KKyAgICAgICAgICAgICAgICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBudGhyZWFkcysrOworCQl9CisJCWV4ZWN1dGluZ190aHJlYWQgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisKKwkgICAgfSAvKiBlbmQgb2YgbWFzdGVyKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovCisgICAgcmV0dXJuICgobnRocmVhZHMgPT0gMSkgJiYgKGV4ZWN1dGluZ190aHJlYWQgPT0gMCkgJiYgKHRpZF9yZXN1bHQgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdF9sb2NrLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhZGUzODkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX25lc3RfbG9jay5jCkBAIC0wLDAgKzEsNDUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9uZXN0X2xvY2sgYW5kIHRoZSBvbXBfdW5zZXRfbmVzdF9sb2NrIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RfbG9jazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworICAgIGludCByZXN1bHQgPSAwOworICAgIGludCBucl9pdGVyYXRpb25zID0gMDsKKyAgICBpbnQgaTsKKworICAgIG9tcF9pbml0X25lc3RfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisjcHJhZ21hIG9tcCBmb3IKKwlmb3IoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz5vbXBfc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCQlucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfQorICAgIH0KKyAgICBvbXBfZGVzdHJveV9uZXN0X2xvY2sgKCZsY2spOworCisgICAgcmV0dXJuICgocmVzdWx0ID09IDApICYmIChucl9pdGVyYXRpb25zID09IExPT1BDT1VOVCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfbmVzdGVkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjk2NTdiYzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX25lc3RlZC5jCkBAIC0wLDAgKzEsNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX25lc3RlZCBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX25lc3RlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisvKgorICogVGVzdCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydHMgbmVzdGVkIHBhcmFsbGVsaXNtCisgKiBCeSBDaHVuaHVhIExpYW8sIFVuaXZlcnNpdHkgb2YgSG91c3RvbgorICogT2N0LiAyMDA1CisgKi8KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX25lc3RlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW50IGNvdW50ZXIgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyNpZmRlZiBfT1BFTk1QCisgICAgPG9tcHRzOmNoZWNrPm9tcF9zZXRfbmVzdGVkKDEpOzwvb21wdHM6Y2hlY2s+CisgICAgPG9tcHRzOmNyb3NzY2hlY2s+b21wX3NldF9uZXN0ZWQoMCk7PC9vbXB0czpjcm9zc2NoZWNrPgorI2VuZGlmCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChjb3VudGVyKQoreworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgY291bnRlciArKzsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgICAgY291bnRlciAtLTsKKyAgICB9Cis8L29tcHRzOm9ycGhhbj4KK30KKyAgICByZXR1cm4gKGNvdW50ZXIgIT0gMCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9jb3B5aW4uYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzgyYmZhMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfY29weWluLmMKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgY29weWluIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGNvcHlpbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgc3VtMSA9IDc4OTsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMSkKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2NvcHlpbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHM7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xID0gNzsKKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5jb3B5aW4oc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZGVmYXVsdC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjZjODczNzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2RlZmF1bHQuYwpAQCAtMCwwICsxLDQ0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGRlZmF1bHQgb3B0aW9uIG9mIHRoZSBwYXJhbGxlbCBjb25zdHJ1Y3QuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBkZWZhdWx0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKworI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2RlZmF1bHQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICBpbnQgbXlzdW07CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIAorICBpbnQga25vd25fc3VtOworICBzdW0gPTA7CisgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMiA7CisKKyAgPG9tcHRzOm9ycGhhbj4KKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmRlZmF1bHQoc2hhcmVkKTwvb21wdHM6Y2hlY2s+IHByaXZhdGUoaSkgcHJpdmF0ZShteXN1bTxvbXB0czpjcm9zc2NoZWNrPixzdW08L29tcHRzOmNyb3NzY2hlY2s+KQorICB7CisJbXlzdW0gPSAwOworICAjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgIG15c3VtID0gbXlzdW0gKyBpOworCX0gCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bSA9IHN1bSArIG15c3VtOworCX0gICAvKiBlbmQgb2YgY3JpdGljYWwgKi8KKyAgfSAgIC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICA8L29tcHRzOm9ycGhhbj4KKyAgaWYgKGtub3duX3N1bSAhPSBzdW0pIHsKKyAgCWZwcmludGYobG9nRmlsZSwgIktOT1dOX1NVTSA9ICVkOyBTVU0gPSAlZFxuIiwga25vd25fc3VtLCBzdW0pOworICB9CisgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9maXJzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjQxNWI0YwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSw0OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmb3Igb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworLy9zdGF0aWMgaW50IHN1bTEgPSA3ODk7CisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBzdW0sIG51bV90aHJlYWRzLHN1bTE7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworCisgICAgc3VtID0gMDsKKyAgICBzdW0xPTc7CisgICAgbnVtX3RocmVhZHMgPSAwOworCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgeworCisJLypwcmludGYoInN1bTE9JWRcbiIsc3VtMSk7Ki8KKwk8b21wdHM6b3JwaGFuPgorCWludCBpOworI3ByYWdtYSBvbXAgZm9yIAorCSAgICBmb3IgKGkgPSAxOyBpIDwgMTAwMDsgaSsrKQorCSAgICB7CisJCXN1bTEgPSBzdW0xICsgaTsKKwkgICAgfSAvKmVuZCBvZiBmb3IqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHN1bSA9IHN1bSArIHN1bTE7CisgICAgICAgICAgICBudW1fdGhyZWFkcysrOworCX0gLyplbmQgb2YgY3JpdGljYWwqLworCTwvb21wdHM6b3JwaGFuPgorICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAga25vd25fc3VtID0gKDk5OSAqIDEwMDApIC8gMiArIDcgKiBudW1fdGhyZWFkczsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41Y2I0OTI2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfZmlyc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW0gOworICAgIGludCBpMjsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bT0wOworICAgIGkyPTM7CisgICAgaW50IGtub3duX3N1bTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24oKzpzdW0pIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKyAgICB7CisJICBzdW0gPSBzdW0gKyAoaSArIGkyKTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAgCisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyICsgaTIgKiBMT09QQ09VTlQ7CisgICAgCisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKKworfSAvKiBlbmQgb2YgY2hlY2tfcGFyYWxsZWxfZm9yX2Zpc3Rwcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfaWYuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTI4ODZiYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2lmLmMKQEAgLTAsMCArMSwzOCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGlmIGRpcmVjdGl2ZS4gTmVlZHMgYXQgbGVhc3QgdHdvIHRocmVhZHMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBmb3IgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz48L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX2Zvcl9pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgaW50IGtub3duX3N1bTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IG51bV90aHJlYWRzOworICAgIGludCBzdW0sIHN1bTI7CisgICAgaW50IGk7CisgICAgaW50IGNvbnRyb2w7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICBjb250cm9sID0gMDsKKyAgICBudW1fdGhyZWFkcz0wOworICAgIHN1bSA9IDA7CisgICAgc3VtMiA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5pZiAoY29udHJvbD09MSk8L29tcHRzOmNoZWNrPgorICAgIDxvbXB0czpvcnBoYW4+CisgICAgZm9yIChpPTA7IGkgPD0gTE9PUENPVU5UOyBpKyspCisgICAgeworICAgICAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKTsKKwlzdW0gPSBzdW0gKyBpOworICAgIH0gLyplbmQgb2YgZm9yKi8KKworICAgIDwvb21wdHM6b3JwaGFuPgorICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKyAgICBmcHJpbnRmIChsb2dGaWxlLCAiTnVtYmVyIG9mIHRocmVhZHMgZGV0ZXJtaW5lZCBieSBvbXBfZ2V0X251bV90aHJlYWRzOiAlZFxuIiwgbnVtX3RocmVhZHMpOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSAmJiBudW1fdGhyZWFkcyA9PSAxKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOTA5ZGViYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX2xhc3Rwcml2YXRlLmMKQEAgLTAsMCArMSwzNCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uLG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMDsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgc3VtID0wOworICAgIGkwID0gLTE7CisgICAgaW50IGtub3duX3N1bTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDcpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorICAgIHsKKwlzdW0gPSBzdW0gKyBpOworCWkwID0gaTsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgLyogZW5kIG9mIHBhcmFsbGVsKi8gICAgCisgICAgPC9vbXB0czpvcnBoYW4+CisgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyOworICAgIHJldHVybiAoKGtub3duX3N1bSA9PSBzdW0pICYmIChpMCA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMWE0YmM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3Jfb3JkZXJlZC5jCkBAIC0wLDAgKzEsNjIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBvcmRlcmVkIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgc2NoZWR1bGUoc3RhdGljKTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK3N0YXRpYyBpbnQgbGFzdF9pID0gMDsKK2ludCBpOworCisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGkpCisKKy8qIFZhcmlhYmxlIGlpIGlzIHVzZWQgdG8gYXZvaWQgcHJvYmxlbXMgd2l0aCBhIHRocmVhZHByaXZhdGUgdmFyaWFibGUgdXNlZCBhcyBhIGxvb3AKKyAqIGluZGV4LiBTZWUgdGVzdCBvbXBfdGhyZWFkcHJpdmF0ZV9mb3IuCisgKi8KK3N0YXRpYyBpbnQgaWk7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKGlpKQorCisvKiEgCisgIFV0aWxpdHkgZnVuY3Rpb246IHJldHVybnMgdHJ1ZSBpZiB0aGUgcGFzc2VkIGFyZ3VtZW50IGlzIGxhcmdlciB0aGFuIAorICB0aGUgYXJndW1lbnQgb2YgdGhlIGxhc3QgY2FsbCBvZiB0aGlzIGZ1bmN0aW9uLgorICAqLworc3RhdGljIGludCBjaGVja19pX2lzbGFyZ2VyMiAoaW50IGkpeworCWludCBpc2xhcmdlcjsKKwlpc2xhcmdlciA9IChpID4gbGFzdF9pKTsKKwlsYXN0X2kgPSBpOworCXJldHVybiAoaXNsYXJnZXIpOworfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBpc19sYXJnZXI7CisJPC9vbXB0czpvcnBoYW46dmFycz4KKworCWludCBrbm93bl9zdW07CisJaW50IGk7CisJCisJc3VtID0gMDsKKwlpc19sYXJnZXIgPSAxOworCWxhc3RfaSA9IDA7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPm9yZGVyZWQ8L29tcHRzOmNoZWNrPgorCWZvciAoaSA9IDE7IGkgPCAxMDA7IGkrKykKKwl7CisJCWlpID0gaTsKKwk8b21wdHM6b3JwaGFuPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIG9yZGVyZWQ8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworCQkJaXNfbGFyZ2VyID0gY2hlY2tfaV9pc2xhcmdlcjIgKGlpKSAmJiBpc19sYXJnZXI7CisJCQlzdW0gID0gc3VtICsgaWk7CisJCX0KKwk8L29tcHRzOm9ycGhhbj4KKwl9CisJa25vd25fc3VtID0gKDk5ICogMTAwKSAvIDI7CisJZnByaW50ZiAobG9nRmlsZSwiIGtub3duX3N1bSA9ICVkICwgc3VtID0gJWQgXG4iLCBrbm93bl9zdW0sIHN1bSk7CisJZnByaW50ZiAobG9nRmlsZSwiIGlzX2xhcmdlciA9ICVkXG4iLCBpc19sYXJnZXIpOworCXJldHVybiAoa25vd25fc3VtID09IHN1bSkgJiYgaXNfbGFyZ2VyOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MDI4MGNjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNDggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24sb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8qISBVdGlsaXR5IGZ1bmN0aW9uIHRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK3N0YXRpYyB2b2lkIGRvX3NvbWVfd29yayAodm9pZCl7CisgICAgaW50IGk7CisgICAgZG91YmxlIHN1bSA9IDA7CisgICAgZm9yKGkgPSAwOyBpIDwgMTAwMDsgaSsrKXsKKwlzdW0gKz0gc3FydCAoaSk7CisgICAgfQorfQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworICAgIGludCBpOworICAgIGludCBpMjsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIAorICAgIHN1bSA9MDsKKyAgICBpMj0wOworICAgIGludCBrbm93bl9zdW07CisgIAorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz4KKyAgICA8b21wdHM6b3JwaGFuPgorICAgIAorICAgIGZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisgICAgeworCWkyID0gaTsKKyNwcmFnbWEgb21wIGZsdXNoCisJZG9fc29tZV93b3JrICgpOworI3ByYWdtYSBvbXAgZmx1c2gKKwlzdW0gPSBzdW0gKyBpMjsKKyAgICB9IC8qZW5kIG9mIGZvciovCisgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisgICAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30gLyogZW5kIG9mIGNoZWNrX3BhcmFsbGVsX2Zvcl9wcml2YXRlICovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2Zvcl9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42Yzk5MWY3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uLmMKQEAgLTAsMCArMSwyODAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZm9yIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfZm9yX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBzdW07CisJaW50IGtub3duX3N1bTsKKwlkb3VibGUgZHN1bTsKKwlkb3VibGUgZGtub3duX3N1bTsKKwlkb3VibGUgZHQ9MC41OwkJCQkvKiBiYXNlIG9mIGdlb21ldHJpYyByb3cgZm9yICsgYW5kIC0gdGVzdCovCisJZG91YmxlIHJvdW5kaW5nX2Vycm9yPSAxLkUtOTsKKyNkZWZpbmUgRE9VQkxFX0RJR0lUUyAyMAkJLyogZHReRE9VQkxFX0RJR0lUUyAqLworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKyNkZWZpbmUgTUFYX0ZBQ1RPUiAxMAorI2RlZmluZSBLTk9XTl9QUk9EVUNUIDM2Mjg4MDAJLyogMTAhICovCisJaW50IGxvZ2ljX2FuZDsKKwlpbnQgbG9naWNfb3I7CisJaW50IGJpdF9hbmQ7CisJaW50IGJpdF9vcjsKKwlpbnQgZXhjbHVzaXZfYml0X29yOworCWludCBsb2dpY3NbTE9PUENPVU5UXTsKKwlpbnQgaTsKKwlkb3VibGUgZHB0OworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIHN1bSA9MDsKKyAgICBkc3VtPTA7CisJZHQgPSAxLi8zLjsKKyAgICByZXN1bHQgPSAwOworICAgIHByb2R1Y3QgPSAxOworCWxvZ2ljX2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X2FuZD0xOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworCisJa25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7aSsrKQorCXsKKwkJc3VtPXN1bStpOworCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixzdW0sa25vd25fc3VtKTsgCisJfQorCisJZGlmZiA9IChMT09QQ09VTlQqKExPT1BDT1VOVCsxKSkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTE7aTw9TE9PUENPVU5UOysraSkKKwl7CisJCWRpZmY9ZGlmZi1pOworCX0KKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKworCS8qIFRlc3RzIGZvciBkb3VibGVzICovCisJZHN1bT0wOworCWRwdD0xOworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCk7CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpkc3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkc3VtICs9IHBvdyhkdCxpKTsKKwl9CisKKwlpZiggZmFicyhkc3VtLWRrbm93bl9zdW0pID4gcm91bmRpbmdfZXJyb3IgKQorCXsKKwkJcmVzdWx0Kys7IAorCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJWYgaW5zdGVhZCBvZiAlZiAoRGlmZmVyZW5jZTogJUUpXG4iLGRzdW0sZGtub3duX3N1bSwgZHN1bS1ka25vd25fc3VtKTsKKwl9CisKKwlkcHQ9MTsKKworCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkcHQqPWR0OworCX0KKwlmcHJpbnRmKGxvZ0ZpbGUsIlxuIik7CisJZGRpZmYgPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkaWZmKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0wO2k8RE9VQkxFX0RJR0lUUzsrK2kpCisJeworCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJfQorCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0xO2k8PU1BWF9GQUNUT1I7aSsrKQorCXsKKwkJcHJvZHVjdCAqPSBpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSBLTk9XTl9QUk9EVUNUOworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG5cbiIscHJvZHVjdCxrbm93bl9wcm9kdWN0KTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEuXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxLlxuIik7CisJfQorCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8fDpsb2dpY19vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWxvZ2ljX29yID0gbG9naWNfb3IgfHwgbG9naWNzW2ldOworCX0KKwlpZighbG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIuXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCX0KKwlpZihiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDIuXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8TE9PUENPVU5UO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwl9CisJaWYoIWJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDNmNDViMQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfaWYuYwpAQCAtMCwwICsxLDQwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIG9wdGlvbiBvZiB0aGUgcGFyYWxsZWwgY29uc3RydWN0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPHVuaXN0ZC5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworPG9tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQgaTsKKyAgaW50IHN1bTsKKyAgaW50IGtub3duX3N1bTsKKyAgaW50IG15c3VtOworICBpbnQgY29udHJvbD0xOworPC9vbXB0czpvcnBoYW46dmFycz4KKyAgc3VtID0wOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+aWYoY29udHJvbD09MCk8L29tcHRzOmNoZWNrPgorICB7CisJPG9tcHRzOm9ycGhhbj4KKyAgICBteXN1bSA9IDA7CisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCisgIDwvb21wdHM6b3JwaGFuPgorICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyAgcmV0dXJuIChrbm93bl9zdW0gPT0gc3VtKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX251bV90aHJlYWRzLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uODk3ZmVkMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMuYwpAQCAtMCwwICsxLDQ2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF9wYXJhbGxlbF9udW1fdGhyZWFkcyBkaXJlY3RpdmUgYnkgY291bnRpbmcgdGhlIHRocmVhZHMgaW4gYSBwYXJhbGxlbCByZWdpb24gd2hpY2ggd2FzIHN0YXJ0ZWQgd2l0aCBhbiBleHBsaWNpdGx5IHN0YXRlZCBudW1iZXIgb2YgdGhyZWFkcy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmVsbGVsIG51bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIG1hc3RlcixvbXAgcGFyYWxsZWwgcmVkdWN0aW9uLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgZmFpbGVkOworCWludCB0aHJlYWRzOworCWludCBudGhyZWFkczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IG1heF90aHJlYWRzID0gMDsKKworICAgIGZhaWxlZCA9IDA7CisKKyAgICAvKiBmaXJzdCB3ZSBjaGVjayBob3cgbWFueSB0aHJlYWRzIGFyZSBhdmFpbGFibGUgKi8KKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgbWFzdGVyCisJbWF4X3RocmVhZHMgPSBvbXBfZ2V0X251bV90aHJlYWRzICgpOworICAgIH0KKworICAgIC8qIHdlIGluY3JlYXNlIHRoZSBudW1iZXIgb2YgdGhyZWFkcyBmcm9tIG9uZSB0byBtYXhpbXVtOiovCisgICAgZm9yICh0aHJlYWRzID0gMTsgdGhyZWFkcyA8PSBtYXhfdGhyZWFkczsgdGhyZWFkcysrKQorICAgIHsKKwludGhyZWFkcyA9IDA7CisKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKSA8b21wdHM6Y2hlY2s+bnVtX3RocmVhZHModGhyZWFkcyk8L29tcHRzOmNoZWNrPgorCSAgICB7CisJCWZhaWxlZCA9IGZhaWxlZCArICEodGhyZWFkcyA9PSBvbXBfZ2V0X251bV90aHJlYWRzICgpKTsKKyNwcmFnbWEgb21wIGF0b21pYworCSAgICBudGhyZWFkcyArPSAxOworCSAgICB9CisJPC9vbXB0czpvcnBoYW4+CisJZmFpbGVkID0gZmFpbGVkICsgIShudGhyZWFkcyA9PSB0aHJlYWRzKTsKKyAgICB9CisgICAgcmV0dXJuICghZmFpbGVkKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkY2NjMDkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3ByaXZhdGUuYwpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZm9yIG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKy8vc3RhdGljIGludCBzdW0xID0gNzg5OworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IHN1bSwgbnVtX3RocmVhZHMsc3VtMTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBrbm93bl9zdW07CisKKyAgICBzdW0gPSAwOworICAgIDxvbXB0czpjcm9zc2NoZWNrPiBzdW0xPTA7IDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICBudW1fdGhyZWFkcyA9IDA7CisKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMSk8L29tcHRzOmNoZWNrPgorICAgIHsKKwk8b21wdHM6Y2hlY2s+CisJc3VtMSA9IDc7CisJPC9vbXB0czpjaGVjaz4KKwkvKnByaW50Zigic3VtMT0lZFxuIixzdW0xKTsqLworCTxvbXB0czpvcnBoYW4+CisJaW50IGk7CisjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPCAxMDAwOyBpKyspCisJICAgIHsKKwkJc3VtMSA9IHN1bTEgKyBpOworCSAgICB9IC8qZW5kIG9mIGZvciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgICAgc3VtID0gc3VtICsgc3VtMTsKKyAgICAgICAgICAgIG51bV90aHJlYWRzKys7CisJfSAvKmVuZCBvZiBjcml0aWNhbCovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwqLyAgICAKKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNyAqIG51bV90aHJlYWRzOworICAgIHJldHVybiAoa25vd25fc3VtID09IHN1bSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3JlZHVjdGlvbi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45NmY4Mzk0Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDI3OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9ucy48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfcmVkdWN0aW9uPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bTsKKwlpbnQga25vd25fc3VtOworCWRvdWJsZSBkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworI2RlZmluZSBET1VCTEVfRElHSVRTIDIwCQkvKiBkdF5ET1VCTEVfRElHSVRTICovCisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworI2RlZmluZSBNQVhfRkFDVE9SIDEwCisjZGVmaW5lIEtOT1dOX1BST0RVQ1QgMzYyODgwMAkvKiAxMCEgKi8KKwlpbnQgbG9naWNfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X2FuZDsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1tMT09QQ09VTlRdOworCWludCBpOworCWRvdWJsZSBkcHQ7CisJaW50IHJlc3VsdDsKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgc3VtID0wOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0PTE7CisJbG9naWNfYW5kPTE7CisJbG9naWNfb3I9MDsKKwliaXRfYW5kPTE7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0PTA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzI7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvciAoaT0xO2k8PUxPT1BDT1VOVDtpKyspCisJeworCQlzdW09c3VtK2k7CisJfQorCisJaWYoa25vd25fc3VtIT1zdW0pCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHN1bSxrbm93bl9zdW0pOyAKKwl9CisKKwlkaWZmID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IgKGk9MTtpPD1MT09QQ09VTlQ7KytpKQorCXsKKwkJZGlmZj1kaWZmLWk7CisJfQorCisJaWYoZGlmZiAhPSAwKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gZGlmZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgMC5cbiIsZGlmZik7CisJfQorCisJLyogVGVzdHMgZm9yIGRvdWJsZXMgKi8KKwlkc3VtPTA7CisJZHB0PTE7CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRzdW0gKz0gcG93KGR0LGkpOworCX0KKworCWlmKCBmYWJzKGRzdW0tZGtub3duX3N1bSkgPiByb3VuZGluZ19lcnJvciApCisJeworCQlyZXN1bHQrKzsgCisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlZiBpbnN0ZWFkIG9mICVmIChEaWZmZXJlbmNlOiAlRSlcbiIsZHN1bSxka25vd25fc3VtLCBkc3VtLWRrbm93bl9zdW0pOworCX0KKworCWRwdD0xOworCisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yIChpPTA7aTxET1VCTEVfRElHSVRTOysraSkKKwl7CisJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwl9CisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTE7aTw9TUFYX0ZBQ1RPUjtpKyspCisJeworCQlwcm9kdWN0ICo9IGk7CisJfQorCisJa25vd25fcHJvZHVjdCA9IEtOT1dOX1BST0RVQ1Q7CisJaWYoa25vd25fcHJvZHVjdCAhPSBwcm9kdWN0KQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWRcblxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCX0KKwlpZighbG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMS5cbiIpOworCX0KKworCWxvZ2ljX2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfYW5kID0gbG9naWNfYW5kICYmIGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY19vciA9IGxvZ2ljX29yIHx8IGxvZ2ljc1tpXTsKKwl9CisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEuXG4iKTsKKwl9CisJbG9naWNfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJbG9naWNfb3IgPSBsb2dpY19vciB8fCBsb2dpY3NbaV07CisJfQorCWlmKCFsb2dpY19vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMi5cbiIpOworCX0KKworCisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCX0KKwlpZighYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAxLlxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzW0xPT1BDT1VOVC8yXT0wOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJjpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMi5cbiIpOworCX0KKworCWZvcihpPTA7aTxMT09QQ09VTlQ7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBmb3Igc2NoZWR1bGUoZHluYW1pYywxKSBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJZm9yKGk9MDtpPExPT1BDT1VOVDsrK2kpCisJeworCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJfQorCWlmKGJpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKwliaXRfb3IgPSAwOworCWxvZ2ljc1tMT09QQ09VTlQvMl09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgZm9yIHNjaGVkdWxlKGR5bmFtaWMsMSkgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCWZvcihpPTA7aTxMT09QQ09VTlQ7KytpKQorCXsKKwkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPExPT1BDT1VOVDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbTE9PUENPVU5ULzJdPTE7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIGZvciBzY2hlZHVsZShkeW5hbWljLDEpIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwlmb3IoaT0wO2k8TE9PUENPVU5UOysraSkKKwl7CisJCWV4Y2x1c2l2X2JpdF9vciA9IGV4Y2x1c2l2X2JpdF9vciBeIGxvZ2ljc1tpXTsKKwl9CisJaWYoIWV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDJcbiIpOworCX0KKyAgICA8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4yOTMzODM5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9NzsKKyAgc3VtMD0xMTsKKworPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0gICAgCisjcHJhZ21hIG9tcCBzZWN0aW9uCisgICAgeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICAgIH0gICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0xMSozKzc7CityZXR1cm4gKGtub3duX3N1bT09c3VtKTsgCit9ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX2xhc3Rwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTVhZTVmMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDcwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICBpbnQgaTA7CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBrbm93bl9zdW07CisgIHN1bSA9MDsKKyAgc3VtMCA9IDA7CisgIGkwID0gLTE7CisgIAorICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpLHN1bTApIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IgKGk9MTtpPDQwMDtpKyspCisJICB7CisJICAgIHN1bTA9c3VtMCtpOworCSAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfS8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT00MDA7aTw3MDA7aSsrKQorCSAgeworCSAgICBzdW0wPXN1bTAraTsgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGZvciovCisJICAgIGkwPWk7CisJICB9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCXsKKwkgIHN1bT0gc3VtK3N1bTA7CisJfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCovCisgICAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorICAgICAgeworCXN1bTA9MDsKKwlmb3IoaT03MDA7aTwxMDAwO2krKykKKwkgIHsKKwkgICAgc3VtMD1zdW0wK2k7CisgICAgICBpMD1pOworCSAgfQorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW09IHN1bStzdW0wOworCX0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwqLworICAgICAgfQorICAgIH0vKiBlbmQgb2YgcGFyYWxsZWwgc2VjdGlvbnMqLworICA8L29tcHRzOm9ycGhhbj4gCisgIGtub3duX3N1bT0oOTk5KjEwMDApLzI7CisgIHJldHVybiAoKGtub3duX3N1bT09c3VtKSAmJiAoaTA9PTk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM1ZmU0MTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfcGFyYWxsZWxfc2VjdGlvbnNfcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IHN1bTsKKyAgaW50IHN1bTA7CisgIGludCBpOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBpbnQga25vd25fc3VtOworICBzdW0gPSA3OworICBzdW0wPTA7CisKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKDxvbXB0czpjaGVjaz5zdW0wLDwvb21wdHM6Y2hlY2s+IGkpCisgIHsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisgICAgeworICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgc3VtMD0wOworICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgIGZvciAoaT0xO2k8NDAwO2krKykKKwlzdW0wPXN1bTAraTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisgICAgICB7CisJc3VtPSBzdW0rc3VtMDsKKyAgICAgIH0gICAgICAgICAgICAgICAgICAgICAgICAgLyplbmQgb2YgY3JpdGljYWwgKi8KKyAgICB9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorICAgIHsKKyAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgIHN1bTA9MDsKKyAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICBmb3IoaT00MDA7aTw3MDA7aSsrKQorCXN1bTA9c3VtMCtpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKyAgICAgIHsKKwlzdW09IHN1bStzdW0wOworICAgICAgfSAgICAgICAgICAgICAgICAgICAgICAgICAvKmVuZCBvZiBjcml0aWNhbCAqLworICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKyAgICB7CisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICBzdW0wPTA7CisgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgZm9yKGk9NzAwO2k8MTAwMDtpKyspCisJc3VtMD1zdW0wK2k7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorICAgICAgeworCXN1bT0gc3VtK3N1bTA7CisgICAgICB9ICAgICAgICAgICAgICAgICAgICAgICAgIC8qZW5kIG9mIGNyaXRpY2FsICovCisgICAgfSAgICAgICAgICAgICAgIAorICB9ICAgICAgICAvKmVuZCBvZiBwYXJhbGxlbCBzZWN0aW9ucyovCis8L29tcHRzOm9ycGhhbj4KK2tub3duX3N1bT0oOTk5KjEwMDApLzIrNzsKK3JldHVybiAoa25vd25fc3VtPT1zdW0pOyAKK30gICAgICAgICAgICAgICAgICAgICAgICAgICAgICAvKiBlbmQgb2YgY2hlY2tfc2VjdGlvbl9wcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5jYWRlYTZhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24uYwpAQCAtMCwwICsxLDU2OCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uIGRpcmVjdGl2ZSB3aXRoIGFsbCBpdHMgb3B0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CQorCWRvdWJsZSBkcHQ7CisgICAgZG91YmxlIGRzdW07CisJZG91YmxlIGRrbm93bl9zdW07CisJZG91YmxlIGR0PTAuNTsJCQkJLyogYmFzZSBvZiBnZW9tZXRyaWMgcm93IGZvciArIGFuZCAtIHRlc3QqLworCWRvdWJsZSByb3VuZGluZ19lcnJvcj0gMS5FLTU7CisJaW50IGRpZmY7CisJZG91YmxlIGRkaWZmOworCWludCBwcm9kdWN0OworCWludCBrbm93bl9wcm9kdWN0OworCWludCBsb2dpY19hbmQ7CisJaW50IGJpdF9hbmQ7CisJaW50IGxvZ2ljX29yOworCWludCBiaXRfb3I7CisJaW50IGV4Y2x1c2l2X2JpdF9vcjsKKwlpbnQgbG9naWNzWzEwMDBdOworCWludCBpOworCWludCByZXN1bHQ7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAKKyAgICBzdW0gPSA3OworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworICAgIGRwdCA9IDE7CisJbG9naWNfYW5kPTE7CisJYml0X2FuZD0xOworCWxvZ2ljX29yPTA7CisJYml0X29yPTA7CisJZXhjbHVzaXZfYml0X29yPTA7CisgICAgcmVzdWx0ID0wOworCS8qICBpbnQgbXlfaXNsYXJnZXI7Ki8KKwkvKmludCBpc19sYXJnZXI9MTsqLworCWtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3OworCisgICAgPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJc3VtPXN1bStpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlzdW09c3VtK2k7CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9zdW0hPXN1bSkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICVkIGluc3RlYWQgb2YgJWQuXG4iLHN1bSwga25vd25fc3VtKTsKKwl9CisKKwlkaWZmID0gKDk5OSoxMDAwKS8yOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlkaWZmPWRpZmYtaTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQl7CisJCQkJZGlmZj1kaWZmLWk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGRpZmYgIT0gMCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIERpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mIDAuXG4iLGRpZmYpOworCX0KKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJeworCQkJCWRzdW0gKz0gcG93KGR0LGkpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xMjtpPDIwOysraSkKKwkJCXsKKwkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MDtpPDY7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9NjtpPDEyOysraSkKKwkJCXsKKwkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJeworCQkJCWRkaWZmIC09IHBvdyhkdCxpKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCBmYWJzKGRkaWZmKSA+IHJvdW5kaW5nX2Vycm9yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgJUUgaW5zdGVhZCBvZiAwLjBcbiIsZGRpZmYpOworCX0KKworCWtub3duX3Byb2R1Y3QgPSAzNjI4ODAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0xO2k8MztpKyspCisJCQl7CisJCQkJcHJvZHVjdCAqPSBpOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTM7aTw3O2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NztpPDExO2krKykKKwkJCXsKKwkJCQlwcm9kdWN0ICo9IGk7CisJCQl9CisJCX0KKwl9CisKKworCWlmKGtub3duX3Byb2R1Y3QgIT0gcHJvZHVjdCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAlZCBpbnN0ZWFkIG9mICVkXG4iLHByb2R1Y3Qsa25vd25fcHJvZHVjdCk7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTE7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJeworCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCYmOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQl7CisJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19hbmQgPSAobG9naWNfYW5kICYmIGxvZ2ljc1tpXSk7CisJCQl9CisJCX0KKwl9CisKKwlpZihsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAyIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYobG9naWNfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQl7CisJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCXsKKwkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDsrK2kpCisJeworCQlsb2dpY3NbaV09MTsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CQorCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gKGJpdF9hbmQgJiBsb2dpY3NbaV0pOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfYW5kKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIEFORCBwYXJ0IDFcbiIpOworCX0KKworCWJpdF9hbmQgPSAxOworCWxvZ2ljc1s1MDFdPTA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigmOmJpdF9hbmQpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9hbmQgPSBiaXRfYW5kICYgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKGJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsKKwkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJeworCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCX0KKwkJfQorCX0KKwlpZihiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAxXG4iKTsKKwl9CisJYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofDpiaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFiaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgT1IgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiheOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJewkKKwkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCXsJCisJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKwl9CisJaWYoZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMVxuIik7CisJfQorCisJZXhjbHVzaXZfYml0X29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQl7CisJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9MzAwO2k8NzAwOysraSkKKwkJCXsKKwkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQl9CisJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJeworCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQl7CisJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJfQorCQl9CisJfQorCWlmKCFleGNsdXNpdl9iaXRfb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBFWENMVVNJViBCSVQgT1IgcGFydCAyXG4iKTsKKwl9Cis8L29tcHRzOm9ycGhhbj4KKwkvKnByaW50ZigiXG5SZXN1bHQ6JWRcbiIscmVzdWx0KTsqLworCXJldHVybiAocmVzdWx0PT0wKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3BhcmFsbGVsX3NoYXJlZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xZjI4ZTM4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9wYXJhbGxlbF9zaGFyZWQuYwpAQCAtMCwwICsxLDQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHNoYXJlZCBvcHRpb24gb2YgdGhlIHBhcmFsbGVsIGNvbnN0cnVjdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNoYXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8dW5pc3RkLmg+CisKKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9wYXJhbGxlbF9zaGFyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgc3VtOworICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICBzdW0gPSAwOworICBpbnQga25vd25fc3VtOworICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIgOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5zaGFyZWQoc3VtKTwvb21wdHM6Y2hlY2s+IDxvbXB0czpjcm9zc2NoZWNrPmZpcnN0cHJpdmF0ZShzdW0pPC9vbXB0czpjcm9zc2NoZWNrPgorICB7CisgICAgPG9tcHRzOm9ycGhhbj4KKyAgICBpbnQgbXlzdW0gPSAwOworI3ByYWdtYSBvbXAgZm9yCisJZm9yIChpID0gMTsgaSA8PSBMT09QQ09VTlQ7IGkrKykKKwl7CisJICBteXN1bSA9IG15c3VtICsgaTsKKwl9IAorI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICBzdW0gPSBzdW0gKyBteXN1bTsKKwl9ICAgLyogZW5kIG9mIGNyaXRpY2FsICovCis8L29tcHRzOm9ycGhhbj4KKworICB9ICAgLyogZW5kIG9mIHBhcmFsbGVsICovCisgIGlmIChrbm93bl9zdW0gIT0gc3VtKSB7CisgIAlmcHJpbnRmKGxvZ0ZpbGUsICJLTk9XTl9TVU0gPSAlZDsgU1VNID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKyAgfQorICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hMDM1ZDEwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZSBieSBhZGRpbmcgYSB2YXJpYWJsZSB3aGljaCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NlY3Rpb25fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJICAgIGludCBzdW07CisJICAgIGludCBzdW0wOworCTwvb21wdHM6b3JwaGFuOnZhcnM+CisJaW50IGtub3duX3N1bTsKKworCXN1bTAgPSAxMTsKKwlzdW0gPSA3OworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7Cis8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoc3VtMCk8L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24gCisJCQl7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQkJCXsKKwkJCQkJc3VtID0gc3VtICsgc3VtMDsKKwkJCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJCQl9ICAgIAorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJCQl7CisJCQkJCXN1bSA9IHN1bSArIHN1bTA7CisJCQkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCQkJfSAgICAgICAgICAgICAgIAorCQl9IC8qZW5kIG9mIHNlY3Rpb25zKi8KKzwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIHBhcmFsbGVsICovCisJa25vd25fc3VtID0gMTEgKiAzICsgNzsKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fZmlyc3Rwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU2YWUwZGYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fbGFzdHByaXZhdGUuYwpAQCAtMCwwICsxLDczIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBpMCA9IC0xOworCWludCBzdW0gPSAwOworICAgICAgICBpbnQgaTsKKyAgICAgICAgaW50IHN1bTAgPSAwOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIGkwID0gLTE7CisgICAgc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uICAKKwkgICAgeworCQlzdW0wID0gMDsKKwkJZm9yIChpID0gMTsgaSA8IDQwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9IC8qIGVuZCBvZiBzZWN0aW9uICovCisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDQwMDsgaSA8IDcwMDsgaSsrKQorCQl7CisJCSAgICBzdW0wID0gc3VtMCArIGk7CisJCSAgICBpMCA9IGk7CisJCX0KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwqLworCSAgICB9CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCXN1bTAgPSAwOworCQlmb3IoaSA9IDcwMDsgaSA8IDEwMDA7IGkrKykKKwkJeworCQkgICAgc3VtMCA9IHN1bTAgKyBpOworCQkgICAgaTAgPSBpOworCQl9CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsKi8KKwkgICAgfQorCX0gLyogZW5kIG9mIHNlY3Rpb25zKi8KKwk8L29tcHRzOm9ycGhhbj4KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCovICAgIAorICAgIGtub3duX3N1bSA9ICg5OTkgKiAxMDAwKSAvIDI7CisgICAgcmV0dXJuICgoa25vd25fc3VtID09IHN1bSkgJiYgKGkwID09IDk5OSkgKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25fcHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4zOTlhMmY4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uX3ByaXZhdGUuYwpAQCAtMCwwICsxLDY5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIHByaXZhdGUgZGlyZWN0aXZlIGJ5IHVwY291bnRpbmcgYSB2YXJpYWJsZSBpbiBhIHRvIHNldmVyYWwgc2VjdGlvbnMgc3BsaXR0ZWQgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgc3VtOworCWludCBzdW0wOworICAgIGludCBpOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGtub3duX3N1bTsKKworICAgIHN1bSA9IDc7CisgICAgc3VtMCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworCTxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnByaXZhdGUoc3VtMCxpKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9uIAorCSAgICB7CisJCTxvbXB0czpjaGVjaz4KKyAgICAgICAgc3VtMCA9IDA7CisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisJCWZvciAoaSA9IDE7IGkgPCA0MDA7IGkrKykKKwkJICAgIHN1bTAgPSBzdW0wICsgaTsKKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJICAgIHN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwkgICAgfSAgICAKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNDAwOyBpIDwgNzAwOyBpKyspCisJCSAgICBzdW0wID0gc3VtMCArIGk7CisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICBzdW0gPSBzdW0gKyBzdW0wOworCQl9IC8qZW5kIG9mIGNyaXRpY2FsICovCisJICAgIH0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkgICAgeworICAgICAgICAgIDxvbXB0czpjaGVjaz4KKwkJc3VtMCA9IDA7CisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKwkJZm9yIChpID0gNzAwOyBpIDwgMTAwMDsgaSsrKQorCQkgICAgc3VtMCA9IHN1bTAgKyBpOworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkJeworCQkgICAgc3VtID0gc3VtICsgc3VtMDsKKwkJfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCSAgICB9ICAgICAgICAgICAgICAgCisJfSAvKmVuZCBvZiBzZWN0aW9ucyovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICBrbm93bl9zdW0gPSAoOTk5ICogMTAwMCkgLyAyICsgNzsKKyAgICByZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOyAKK30gLyogZW5kIG9mIGNoZWNrX3NlY3Rpb25fcHJpdmF0ZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zZWN0aW9uc19ub3dhaXQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYjkxYTM3NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfbm93YWl0LmMKQEAgLTAsMCArMSw2NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBmb3Igbm93YWl0IGRpcmVjdGl2ZS4gSXQgZmlsbHMgYW4gYXJyYXkgd2l0aCB2YWx1ZXMgYW5kIG9wZXJhdGVzIG9uIHRoZXNlIGluIHRoZSBmb2xsb3dpbmcuPC9vbXB0czpkZXNjcmlwdGlvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnZlcnNpb24+MS4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBzZWN0aW9ucywgb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2VjdGlvbnNfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKwk8b21wdHM6b3JwaGFuOnZhcnM+CisJCWludCByZXN1bHQ7CisJCWludCBjb3VudDsKKwk8L29tcHRzOm9ycGhhbjp2YXJzPgorCWludCBqOworCisJcmVzdWx0ID0gMDsKKwljb3VudCA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKwk8b21wdHM6b3JwaGFuPgorCWludCByYW5rOworCisJcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSAoKTsKKwkKKyNwcmFnbWEgb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5ub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBlbnRlcnMgZmlyc3Qgc2VjdGlvbiBhbmQgZ2V0cyBzbGVlcGluZy5cbiIsIHJhbmspOworCQkJCW15X3NsZWVwKFNMRUVQVElNRSk7CisJCQkJY291bnQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgd29rZSB1cCBhbiBzZXQgY291bnQgdG8gMS5cbiIsIHJhbmspOworI3ByYWdtYSBvbXAgZmx1c2goY291bnQpCisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZnByaW50ZiAobG9nRmlsZSwgIlRocmVhZCBuciAlZCBleGVjdXRlZCB3b3JrIGluIHRoZSBmaXJzdCBzZWN0aW9uLlxuIiwgcmFuayk7CisJCQl9CisJCX0KKy8qIEJlZ2luIG9mIHNlY29uZCBzZWN0aW9ucyBlbnZpcm9ubWVudCAqLworI3ByYWdtYSBvbXAgc2VjdGlvbnMKKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJUaHJlYWQgbnIgJWQgZXhlY3V0ZWQgd29yayBpbiB0aGUgc2Vjb25kIHNlY3Rpb24uXG4iLCByYW5rKTsKKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmcHJpbnRmIChsb2dGaWxlLCAiVGhyZWFkIG5yICVkIGV4ZWN1dGVkIHdvcmsgaW4gdGhlIHNlY29uZCBzZWN0aW9uIGFuZCBjb250cm9scyB0aGUgdmFsdWUgb2YgY291bnRcbiIsIHJhbmspOworCQkJCWlmIChjb3VudCA9PSAwKQorCQkJCQlyZXN1bHQgPSAxOworCQkJCWZwcmludGYgKGxvZ0ZpbGUsICJjb3V0IHdhcyAlZCIsIGNvdW50KTsKKwkJCX0KKwkJfQorCTwvb21wdHM6b3JwaGFuPgorCX0KKwkKKwlyZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdlNzgyOWEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NlY3Rpb25zX3JlZHVjdGlvbi5jCkBAIC0wLDAgKzEsNjEzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zZWN0aW9uc19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgc3VtOworCWludCBrbm93bl9zdW07CisJZG91YmxlIGRwdCxkc3VtOworCWRvdWJsZSBka25vd25fc3VtOworCWRvdWJsZSBkdD0wLjU7CQkJCS8qIGJhc2Ugb2YgZ2VvbWV0cmljIHJvdyBmb3IgKyBhbmQgLSB0ZXN0Ki8KKwlkb3VibGUgcm91bmRpbmdfZXJyb3I9IDEuRS05OworCWludCBkaWZmOworCWRvdWJsZSBkZGlmZjsKKwlpbnQgcHJvZHVjdDsKKwlpbnQga25vd25fcHJvZHVjdDsKKwlpbnQgbG9naWNfYW5kOworCWludCBiaXRfYW5kOworCWludCBsb2dpY19vcjsKKwlpbnQgYml0X29yOworCWludCBleGNsdXNpdl9iaXRfb3I7CisJaW50IGxvZ2ljc1sxMDAwXTsKKwlpbnQgaTsKKwlpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisJLyogIGludCBteV9pc2xhcmdlcjsqLworCS8qaW50IGlzX2xhcmdlcj0xOyovCisKKyAgICBzdW0gPTc7CisgICAgZHB0ID0xOworICAgIGRzdW09MDsKKyAgICBwcm9kdWN0ID0xOworCWxvZ2ljX2FuZD0xOworCWJpdF9hbmQ9MTsKKwlsb2dpY19vcj0wOworCWJpdF9vcj0wOworCWV4Y2x1c2l2X2JpdF9vcj0wOworICAgIHJlc3VsdCA9IDA7CisJZHQgPSAxLi8zLjsKKwlrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNzsKKzxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6c3VtKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCXN1bT1zdW0raTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJc3VtPXN1bStpOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGtub3duX3N1bSE9c3VtKQorCXsKKwkJKytyZXN1bHQ7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIiwgc3VtLGtub3duX3N1bSk7CisJfQorCisJZGlmZiA9ICg5OTkqMTAwMCkvMjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0xO2k8MzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWRpZmY9ZGlmZi1pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlkaWZmPWRpZmYtaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihkaWZmICE9IDApCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAwLlxuIixkaWZmKTsKKwl9CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTY7aTwxMjsrK2kpCisJCQkJeworCQkJCQlkc3VtICs9IHBvdyhkdCxpKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTEyO2k8MjA7KytpKQorCQkJCXsKKwkJCQkJZHN1bSArPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZHN1bS1ka25vd25fc3VtKSA+IHJvdW5kaW5nX2Vycm9yICkKKwl7CisJCXJlc3VsdCsrOyAKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICVmIGluc3RlYWQgb2YgJWYgKERpZmZlcmVuY2U6ICVFKVxuIixkc3VtLGRrbm93bl9zdW0sIGRzdW0tZGtub3duX3N1bSk7CisJfQorCisJZHB0PTE7CisKKwlmb3IgKGk9MDtpPDIwOysraSkKKwl7CisJCWRwdCo9ZHQ7CisJfQorCWZwcmludGYobG9nRmlsZSwiXG4iKTsKKwlkZGlmZiA9ICgxLWRwdCkvKDEtZHQpOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT0wO2k8NjsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT02O2k8MTI7KytpKQorCQkJCXsKKwkJCQkJZGRpZmYgLT0gcG93KGR0LGkpOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTI7aTwyMDsrK2kpCisJCQkJeworCQkJCQlkZGlmZiAtPSBwb3coZHQsaSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIGZhYnMoZGRpZmYpID4gcm91bmRpbmdfZXJyb3IpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAlRSBpbnN0ZWFkIG9mIDAuMFxuIixkZGlmZik7CisJfQorCisKKwlrbm93bl9wcm9kdWN0ID0gMzYyODgwMDsKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0xO2k8MztpKyspCisJCQkJeworCQkJCQlwcm9kdWN0ICo9IGk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTM7aTw3O2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NztpPDExO2krKykKKwkJCQl7CisJCQkJCXByb2R1Y3QgKj0gaTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisKKwlpZihrbm93bl9wcm9kdWN0ICE9IHByb2R1Y3QpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBQcm9kdWN0IHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgJWQgaW5zdGVhZCBvZiAlZFxuIixwcm9kdWN0LGtub3duX3Byb2R1Y3QpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKCFsb2dpY19hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxXG4iKTsKKwl9CisKKwlsb2dpY19hbmQgPSAxOworCWxvZ2ljc1s1MDFdID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oJiY6bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX2FuZCA9IChsb2dpY19hbmQgJiYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTcwMDtpPDEwMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfYW5kID0gKGxvZ2ljX2FuZCAmJiBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDJcbiIpOworCX0KKworCWZvcihpPTA7aTwxMDAwO2krKykKKwl7CisJCWxvZ2ljc1tpXT0wOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHx8OmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTE7aTwzMDA7aSsrKQorCQkJCXsKKwkJCQkJbG9naWNfb3IgPSAobG9naWNfb3IgfHwgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yIChpPTMwMDtpPDcwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9NzAwO2k8MTAwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKworCWlmKGxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiXG5FcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDFcbiIpOworCX0KKworCWxvZ2ljX29yID0gMDsKKwlsb2dpY3NbNTAxXT0xOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24ofHw6bG9naWNfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MTtpPDMwMDtpKyspCisJCQkJeworCQkJCQlsb2dpY19vciA9IChsb2dpY19vciB8fCBsb2dpY3NbaV0pOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IgKGk9MzAwO2k8NzAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvciAoaT03MDA7aTwxMDAwO2krKykKKwkJCQl7CisJCQkJCWxvZ2ljX29yID0gKGxvZ2ljX29yIHx8IGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorCQl9CisJfQorCisJaWYoIWxvZ2ljX29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyXG4iKTsKKwl9CisKKworCWZvcihpPTA7aTwxMDAwOysraSkKKwl7CisJCWxvZ2ljc1tpXT0xOworCX0KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0wO2k8MzAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9hbmQgPSAoYml0X2FuZCAmIGxvZ2ljc1tpXSk7CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CQorCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IChiaXRfYW5kICYgbG9naWNzW2ldKTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoIWJpdF9hbmQpCisJeworCQlyZXN1bHQrKzsKKwkJZnByaW50Zihsb2dGaWxlLCJFcnJvciBpbiBCSVQgQU5EIHBhcnQgMVxuIik7CisJfQorCisJYml0X2FuZCA9IDE7CisJbG9naWNzWzUwMV09MDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCY6Yml0X2FuZCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X2FuZCA9IGJpdF9hbmQgJiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQliaXRfYW5kID0gYml0X2FuZCAmIGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X2FuZCkKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEJJVCBBTkQgcGFydCAyXG4iKTsKKwl9CisKKwlmb3IoaT0wO2k8MTAwMDtpKyspCisJeworCQlsb2dpY3NbaV09MDsKKwl9CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAorCXsKKyNwcmFnbWEgb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbih8OmJpdF9vcik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPjwvb21wdHM6Y3Jvc3NjaGVjaz4KKwkJeworI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTA7aTwzMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsKKwkJCQlmb3IoaT03MDA7aTwxMDAwOysraSkKKwkJCQl7CisJCQkJCWJpdF9vciA9IGJpdF9vciB8IGxvZ2ljc1tpXTsKKwkJCQl9CisJCQl9CisJCX0KKwl9CisJaWYoYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMVxuIik7CisJfQorCWJpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKHw6Yml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQliaXRfb3IgPSBiaXRfb3IgfCBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJYml0X29yID0gYml0X29yIHwgbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gQklUIE9SIHBhcnQgMlxuIik7CisJfQorCisJZm9yKGk9MDtpPDEwMDA7aSsrKQorCXsKKwkJbG9naWNzW2ldPTA7CisJfQorCisjcHJhZ21hIG9tcCBwYXJhbGxlbCAKKwl7CisjcHJhZ21hIG9tcCBzZWN0aW9ucyBwcml2YXRlKGkpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oXjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz48L29tcHRzOmNyb3NzY2hlY2s+CisJCXsKKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJewkKKwkJCQlmb3IoaT0zMDA7aTw3MDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKyNwcmFnbWEgb21wIHNlY3Rpb24KKwkJCXsJCisJCQkJZm9yKGk9NzAwO2k8MTAwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorCQl9CisJfQorCWlmKGV4Y2x1c2l2X2JpdF9vcikKKwl7CisJCXJlc3VsdCsrOworCQlmcHJpbnRmKGxvZ0ZpbGUsIkVycm9yIGluIEVYQ0xVU0lWIEJJVCBPUiBwYXJ0IDFcbiIpOworCX0KKworCWV4Y2x1c2l2X2JpdF9vciA9IDA7CisJbG9naWNzWzUwMV09MTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisJeworI3ByYWdtYSBvbXAgc2VjdGlvbnMgcHJpdmF0ZShpKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKF46ZXhjbHVzaXZfYml0X29yKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+PC9vbXB0czpjcm9zc2NoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBzZWN0aW9uCisJCQl7CisJCQkJZm9yKGk9MDtpPDMwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTMwMDtpPDcwMDsrK2kpCisJCQkJeworCQkJCQlleGNsdXNpdl9iaXRfb3IgPSBleGNsdXNpdl9iaXRfb3IgXiBsb2dpY3NbaV07CisJCQkJfQorCQkJfQorI3ByYWdtYSBvbXAgc2VjdGlvbgorCQkJeworCQkJCWZvcihpPTcwMDtpPDEwMDA7KytpKQorCQkJCXsKKwkJCQkJZXhjbHVzaXZfYml0X29yID0gZXhjbHVzaXZfYml0X29yIF4gbG9naWNzW2ldOworCQkJCX0KKwkJCX0KKwkJfQorCX0KKwlpZighZXhjbHVzaXZfYml0X29yKQorCXsKKwkJcmVzdWx0Kys7CisJCWZwcmludGYobG9nRmlsZSwiRXJyb3IgaW4gRVhDTFVTSVYgQklUIE9SIHBhcnQgMlxuIik7CisJfQorPC9vbXB0czpvcnBoYW4+CisJLypwcmludGYoIlxuUmVzdWx0OiVkXG4iLHJlc3VsdCk7Ki8KKwlyZXR1cm4gKHJlc3VsdD09MCk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDMyYjBkMgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlLmMKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGRpcmVjdGl2ZSBieSBjb250cm9sbGluZyBob3cgb2Z0ZW4gYSBkaXJlY3RpdmUgaXMgY2FsbGVkIGluIGFuIG9tcCBzaW5nbGUgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkKK3sKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisJaW50IG5yX3RocmVhZHNfaW5fc2luZ2xlOworCWludCByZXN1bHQ7CisJaW50IG5yX2l0ZXJhdGlvbnM7CisJaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gMDsKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworCisjcHJhZ21hIG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgeworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgPC9vbXB0czpjaGVjaz4KKwkJeyAgCisjcHJhZ21hIG9tcCBmbHVzaAorCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCQl9IC8qIGVuZCBvZiBzaW5nbGUgKi8gICAgCisJICAgIDwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAgKi8KKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKHJlc3VsdCA9PSAwKSAmJiAobnJfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZSovCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfY29weXByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYmM3Y2Q1NAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX2NvcHlwcml2YXRlLmMKQEAgLTAsMCArMSw1MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGNvcHlwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdsZSBjb3B5cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJsbGVsLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCitpbnQgajsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaikKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3NpbmdsZV9jb3B5cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSkgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICByZXN1bHQgPSAwOworICAgIG5yX2l0ZXJhdGlvbnMgPSAwOworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisJPG9tcHRzOm9ycGhhbj4KKwkgICAgaW50IGk7CisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJICAgIHsKKwkJLyoKKwkJICAgaW50IHRocmVhZDsKKwkJICAgdGhyZWFkID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQkgKi8KKyNwcmFnbWEgb21wIHNpbmdsZSA8b21wdHM6Y2hlY2s+Y29weXByaXZhdGUoaik8L29tcHRzOmNoZWNrPgorCQl7CisJCSAgICBucl9pdGVyYXRpb25zKys7CisJCSAgICBqID0gaTsKKwkJICAgIC8qcHJpbnRmICgidGhyZWFkICVkIGFzc2lnbnMsIGogPSAlZCwgaSA9ICVkXG4iLCB0aHJlYWQsIGosIGkpOyovCisJCX0KKwkJLyoJI3ByYWdtYSBvbXAgYmFycmllciovCisjcHJhZ21hIG9tcCBjcml0aWNhbAorCQl7CisJCSAgICAvKnByaW50ZiAoInRocmVhZCA9ICVkLCBqID0gJWQsIGkgPSAlZFxuIiwgdGhyZWFkLCBqLCBpKTsqLworCQkgICAgcmVzdWx0ID0gcmVzdWx0ICsgaiAtIGk7CisJCX0KKyNwcmFnbWEgb21wIGJhcnJpZXIKKwkgICAgfSAvKiBlbmQgb2YgZm9yICovCisJPC9vbXB0czpvcnBoYW4+CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3NpbmdsZV9ub3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi45YjdhMjUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfbm93YWl0LmMKQEAgLTAsMCArMSw2MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgYXRvbWljPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IG15X2l0ZXJhdGlvbnM7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15X2l0ZXJhdGlvbnMpCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9zaW5nbGVfbm93YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKwlpbnQgbnJfaXRlcmF0aW9uczsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgaW50IHRvdGFsX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgbXlfaXRlcmF0aW9ucyA9IDA7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkKKyAgICB7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwkgICAgPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmNoZWNrPgorCQl7CisjcHJhZ21hIG9tcCBhdG9taWMgIAorCQkgICAgbnJfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworICAgIH0gLyogZW5kIG9mIHBhcmFsbGVsICovCisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCW15X2l0ZXJhdGlvbnMgPSAwOworCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKwkJeworCQkgICAgbXlfaXRlcmF0aW9ucysrOworCQl9IC8qIGVuZCBvZiBzaW5nbGUqLyAgICAKKwkgICAgPC9vbXB0czpvcnBoYW4+CisJfSAvKiBlbmQgb2YgZm9yICAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisJICAgIHRvdGFsX2l0ZXJhdGlvbnMgKz0gbXlfaXRlcmF0aW9uczsKKwl9CisKKyAgICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworICAgIHJldHVybiAoKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSAmJiAodG90YWxfaXRlcmF0aW9ucyA9PSBMT09QQ09VTlQpKTsKK30gLyogZW5kIG9mIGNoZWNrX3NpbmdsZV9ub3dhaXQqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfc2luZ2xlX3ByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5hNzUwMmM3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF9zaW5nbGVfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNpbmdsZSBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNpbmdlbCBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBmbHVzaCxvbXAgc2luZ2xlIG5vd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK2ludCBteWl0ID0gMDsKKyNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXlpdCkKK2ludCBteXJlc3VsdCA9IDA7CisjcHJhZ21hIG9tcCB0aHJlYWRwcml2YXRlKG15cmVzdWx0KQorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorCWludCBucl90aHJlYWRzX2luX3NpbmdsZTsKKwlpbnQgcmVzdWx0OworCWludCBucl9pdGVyYXRpb25zOworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisKKyAgICBteWl0ID0gMDsKKyAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgbnJfaXRlcmF0aW9ucyA9IDA7CisgICAgcmVzdWx0ID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgcHJpdmF0ZShpKQorICAgIHsKKwlteXJlc3VsdCA9IDA7CisJbXlpdCA9IDA7CisJZm9yIChpID0gMDsgaSA8IExPT1BDT1VOVDsgaSsrKQorCXsKKwk8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5wcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKSA8L29tcHRzOmNoZWNrPm5vd2FpdAorCSAgICB7ICAKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwOworI3ByYWdtYSBvbXAgZmx1c2gKKwkJbnJfdGhyZWFkc19pbl9zaW5nbGUrKzsKKyNwcmFnbWEgb21wIGZsdXNoICAgICAgICAgICAgICAgICAgICAgICAgIAorCQlteWl0Kys7CisJCW15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZTsKKwkgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovICAgIAorCTwvb21wdHM6b3JwaGFuPgorCX0gLyogZW5kIG9mIGZvciAqLworI3ByYWdtYSBvbXAgY3JpdGljYWwKKwl7CisgICAgICAgICAgICByZXN1bHQgKz0gbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIG5yX2l0ZXJhdGlvbnMgKz0gbXlpdDsKKwl9CisgICAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9IC8qIGVuZCBvZiBjaGVja19zaW5nbGUgcHJpdmF0ZSAqLyAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFzay5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFlODk3OTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2suYwpAQCAtMCwwICsxLDUyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0YXNrIGRpcmVjdGl2ZS4gVGhlIGlkZWEgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGluIGEgc2luZ2xlIHJlZ2lvbi4gV2UgbGV0IHBhdXNlIHRoZSB0YXNrcyBnZW5lcmF0ZWQgc28gdGhhdCBvdGhlciB0aHJlYWRzIGdldCBzaGVkdWxlZCB0byB0aGUgbmV3bHkgb3BlbmVkIHRhc2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFzazwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPihGSUxFICogbG9nRmlsZSl7CisgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCB0aWRzW05VTV9UQVNLU107CisgICAgaW50IGk7CisgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCit7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICB7CisgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgKiB3aGljaCB3aWxsIGJlIHByaXZhdGUgZm9yIGVhY2ggdGFzayBiZWNhdXNlIG90aGVyd2lzZSBpdCB3aWxsIGJlIG92ZXJ3cml0dGVuCisgICAgICAgICAgICAgKiBpZiB0aGUgZXhlY3V0aW9uIG9mIHRoZSB0YXNrIHRha2VzIGxvbmdlciB0aGFuIHRoZSB0aW1lIHdoaWNoIGlzIG5lZWRlZCB0byAKKyAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgKi8KKyAgICAgICAgICAgIGludCBteWk7CisgICAgICAgICAgICBteWkgPSBpOworCis8b21wdHM6Y2hlY2s+I3ByYWdtYSBvbXAgdGFzazwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisKKyAgICAgICAgICAgICAgICB0aWRzW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCit9IC8qZW5kIG9mIHBhcmFsbGVsICovCisKKy8qIE5vdyB3ZSBja2VjayBpZiBtb3JlIHRoYW4gb25lIHRocmVhZCBleGVjdXRlZCB0aGUgdGFza3MuICovCisgICAgZm9yIChpID0gMTsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzBdICE9IHRpZHNbaV0pCisgICAgICAgICAgICByZXR1cm4gMTsKKyAgICB9CisgICAgcmV0dXJuIDA7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpbmFsLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNGUwMGM1ZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19maW5hbC5jCkBAIC0wLDAgKzEsNTIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIGZpbmFsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgIm9tcF9teV9zbGVlcC5oIgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2ZpbmFsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHRpZHNbTlVNX1RBU0tTXTsKKyAgICBpbnQgaTsKKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGludCBlcnJvcjsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAvKiBGaXJzdCB3ZSBoYXZlIHRvIHN0b3JlIHRoZSB2YWx1ZSBvZiB0aGUgbG9vcCBpbmRleCBpbiBhIG5ldyB2YXJpYWJsZQorICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICogaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZSB3aGljaCBpcyBuZWVkZWQgdG8gCisgICAgICAgICAgICAgKiBlbnRlciB0aGUgbmV4dCBzdGVwIG9mIHRoZSBsb29wIQorICAgICAgICAgICAgICovCisgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgbXlpID0gaTsKKworICAgICAgICAgICAgI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+ZmluYWwoaT49MTApPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICBteV9zbGVlcCAoU0xFRVBUSU1FKTsKKworICAgICAgICAgICAgICAgIHRpZHNbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgICAgfSAvKiBlbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KK30gLyplbmQgb2YgcGFyYWxsZWwgKi8KKworLyogTm93IHdlIGNrZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4gKi8KKyAgICBmb3IgKGkgPSAxMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmICh0aWRzWzEwXSAhPSB0aWRzW2ldKQorICAgICAgICAgICAgZXJyb3IrKzsKKyAgICB9CisgICAgcmV0dXJuIChlcnJvcj09MCk7Cit9IC8qIGVuZCBvZiBjaGVja19wYXJhbGxlbF9mb3JfcHJpdmF0ZSAqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43YWEwNzQ2Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ZpcnN0cHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZmlyc3Rwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gdW5lcXVhbCB6ZXJvIHdoaWNoIGdldHMgZGVjbGFyZWQgZmlyc3Rwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaCxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaTsKKyAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IHN1bSA9IDEyMzQ7CisgICAgaW50IGtub3duX3N1bTsKKyAgICBpbnQgcmVzdWx0ID0gMDsgLyogY291bnRzIHRoZSB3cm9uZyBzdW1zIGZyb20gdGFza3MgKi8KKyAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAga25vd25fc3VtID0gMTIzNCArIChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgICB7CisjcHJhZ21hIG9tcCBzaW5nbGUKKyAgICAgICAgeworICAgICAgICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKQorICAgICAgICAgICAgeworICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUoc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBpbnQgajsKKyAgICAgICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8PSBMT09QQ09VTlQ7IGorKykgeworI3ByYWdtYSBvbXAgZmx1c2gKKyAgICAgICAgICAgICAgICAgICAgICAgIHN1bSArPSBqOworICAgICAgICAgICAgICAgICAgICB9CisKKyAgICAgICAgICAgICAgICAgICAgLyogY2hlY2sgaWYgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0ICovCisgICAgICAgICAgICAgICAgICAgIGlmIChzdW0gIT0ga25vd25fc3VtKSB7CisjcHJhZ21hIG9tcCBjcml0aWNhbCAKKyAgICAgICAgICAgICAgICAgICAgICB7IHJlc3VsdCsrOyB9CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2lmLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYzA3YWIyZgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19pZi5jCkBAIC0wLDAgKzEsNDMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgaWYgY2xhdXNlIG9mIHRoZSBvbXAgdGFzayBkaXJlY3RpdmUuIFRoZSBpZGVhciBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24gYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGUgcGFyZW50IHRocmVhZCBub3cgc2hhbGwgc2V0IGEgY291bnRlciB2YXJpYWJsZSB3aGljaCB0aGUgcGF1c2VkIHRhc2sgc2hhbGwgZXZhbHVhdGUgd2hlbiB3b2tlIHVwLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBpZjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaWY8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQgY29uZGl0aW9uX2ZhbHNlOworICAgIGludCBjb3VudDsKKyAgICBpbnQgcmVzdWx0OworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgY291bnQ9MDsKKyAgICBjb25kaXRpb25fZmFsc2UgPSAobG9nRmlsZSA9PSBOVUxMKTsKKyNwcmFnbWEgb21wIHBhcmFsbGVsIAoreworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+aWYgKGNvbmRpdGlvbl9mYWxzZSk8L29tcHRzOmNoZWNrPiBzaGFyZWQoY291bnQsIHJlc3VsdCkKKyAgICAgICAgeworICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRV9MT05HKTsKKy8vI3ByYWdtYSBvbXAgZmx1c2ggKGNvdW50KQorICAgICAgICAgICAgcmVzdWx0ID0gKDAgPT0gY291bnQpOworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKworICAgICAgICBjb3VudCA9IDE7CisvLyNwcmFnbWEgb21wIGZsdXNoIChjb3VudCkKKworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgcmV0dXJuIHJlc3VsdDsKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZS5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iYjhmMGVmCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUuYwpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgcHJpdmF0ZSB3b3JrcyBwcm9wZXJseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCisKKworLyogVXRpbGl0eSBmdW5jdGlvbiBkbyBzcGVuZCBzb21lIHRpbWUgaW4gYSBsb29wICovCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19pbXBfZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+IChGSUxFICogbG9nRmlsZSkKK3sKKyAgICBpbnQgaT01OworICAgIGludCBrID0gMDsKKyAgICBpbnQgcmVzdWx0ID0gMDsKKyAgICBpbnQgdGFza19yZXN1bHQgPSAxOworICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKGkpCisgICAgeworICAgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICB7CisgICAgIAorICAgICAgICAKKyAgICAgICAgICBmb3IgKGsgPSAwOyBrIDwgTlVNX1RBU0tTOyBrKyspCisJICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIHRhc2sgc2hhcmVkKHJlc3VsdCAsIHRhc2tfcmVzdWx0PG9tcHRzOmNyb3NzY2hlY2s+LCBpPC9vbXB0czpjcm9zc2NoZWNrPikKKyAgICAgICAgICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCQkgIC8vY2hlY2sgaWYgaSBpcyBwcml2YXRlCisgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGkgIT0gNSkKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICB0YXNrX3Jlc3VsdCA9IDA7CisgICAgICAgICAgICAgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgICAgICAgICBmb3IoaiA9IDA7IGogPCBOVU1fVEFTS1M7IGorKykKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBmaXJzdHByaXZhdGUgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgfQorCQl9CisKKwkgICNwcmFnbWEgb21wIHRhc2t3YWl0CisJICByZXN1bHQgPSAodGFza19yZXN1bHQgJiYgaT09NSk7CisgICAgICAgfQorICAgICAgICAgICAgICAgIAorICAgIH0KKyAgICAKKyAgICByZXR1cm4gcmVzdWx0OworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19wcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU5ZTI2ZGQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfcHJpdmF0ZS5jCkBAIC0wLDAgKzEsNTMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHdoaWNoIGdldHMgZGVjbGFyZWQgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIGZsdXNoLG9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxtYXRoLmg+CisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorCisvKiBVdGlsaXR5IGZ1bmN0aW9uIGRvIHNwZW5kIHNvbWUgdGltZSBpbiBhIGxvb3AgKi8KK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4gKEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBpOworICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICBpbnQga25vd25fc3VtOworICAgIGludCBzdW0gPSAwOworICAgIGludCByZXN1bHQgPSAwOyAvKiBjb3VudHMgdGhlIHdyb25nIHN1bXMgZnJvbSB0YXNrcyAqLworICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDI7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykKKyAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorI3ByYWdtYSBvbXAgdGFzayA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0pPC9vbXB0czpjaGVjaz4gc2hhcmVkKHJlc3VsdCwga25vd25fc3VtKQorICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgaW50IGo7CisJCSAgICAvL2lmIHN1bSBpcyBwcml2YXRlLCBpbml0aWFsaXplIHRvIDAKKwkJICAgIDxvbXB0czpjaGVjaz5zdW0gPSAwOzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgIGZvciAoaiA9IDA7IGogPD0gTE9PUENPVU5UOyBqKyspIHsKKyNwcmFnbWEgb21wIGZsdXNoCisgICAgICAgICAgICAgICAgICAgICAgICBzdW0gKz0gajsKKyAgICAgICAgICAgICAgICAgICAgfQorICAgICAgICAgICAgICAgICAgICAvKiBjaGVjayBpZiBjYWxjdWxhdGVkIHN1bSB3YXMgcmlnaHQgKi8KKyAgICAgICAgICAgICAgICAgICAgaWYgKHN1bSAhPSBrbm93bl9zdW0pIHsKKyNwcmFnbWEgb21wIGNyaXRpY2FsIAorICAgICAgICAgICAgICAgICAgICAgICAgcmVzdWx0Kys7CisgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgICAgfQkvKiBlbmQgb2YgZm9yICovCisgICAgICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICAgIH0JLyogZW5kIG9mIHBhcmFsbGVsKi8KKworICAgIHJldHVybiAocmVzdWx0ID09IDApOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza19zaGFyZWQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi43NGMyMTA5Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3NoYXJlZC5jCkBAIC0wLDAgKzEsNDcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4gVGVzdCB0byBzZWUgaWYgaW1wbGllZCBzaGFyZWQgd29ya3MgY29ycmVjdGx5PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSwgb21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKKworCisKKy8qIFV0aWxpdHkgZnVuY3Rpb24gZG8gc3BlbmQgc29tZSB0aW1lIGluIGEgbG9vcCAqLworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfaW1wX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPiAoRklMRSAqIGxvZ0ZpbGUpCit7CisgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgaW50IGk7CisgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgIGk9MDsKKyAgICBpbnQgayA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisKKyAgICNwcmFnbWEgb21wIHBhcmFsbGVsCisgICAgeworICAgICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgICAgICAgIGZvciAoayA9IDA7IGsgPCBOVU1fVEFTS1M7IGsrKykgICAgICAgICAgIAorICAgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjcm9zc2NoZWNrPiBmaXJzdHByaXZhdGUoaSkgPC9vbXB0czpjcm9zc2NoZWNrPiA8b21wdHM6Y2hlY2s+IHNoYXJlZChpKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICAgICAgICB7CisgICAgICAgICAgICAgICAgICAgICAgICAgICNwcmFnbWEgb21wIGF0b21pYworICAgICAgICAgICAgICAgICAgICAgICAgICAgIGkrKzsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgLy90aGlzIHNob3VsZCBiZSBzaGFyZWQgaW1wbGljaXRseQorICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKKyAgICAgICAgICAgICAgICAgICAgICAgIH0KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPiAKKyAgICAgICAgICAgICAgICAgIH0KKworICAgIH0KKworcmVzdWx0ID0gaTsKK3JldHVybiAoKHJlc3VsdCA9PSBOVU1fVEFTS1MpKTsKKyAgICAgCit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrX3VudGllZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNkNmViZTIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2tfdW50aWVkLmMKQEAgLTAsMCArMSw2OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3QgZm9yIHVudGllZCBjbGF1c2UuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayB1bnRpZWQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgdGFza3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8bWF0aC5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKyNpbmNsdWRlICJvbXBfbXlfc2xlZXAuaCIKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2tfdW50aWVkPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKworICA8b21wdHM6b3JwaGFuOnZhcnM+CisgIGludCBpOworICBpbnQgY291bnQ7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGNvdW50ID0gMDsKKyAgCisgIC8qaW5pdGlhbGl6YXRpb24qLworICBmb3IgKGk9MDsgaTwgTlVNX1RBU0tTOyBpKyspeworICAgIHN0YXJ0X3RpZFtpXT0wOworICAgIGN1cnJlbnRfdGlkW2ldPTA7CisgIH0KKyAgCisgICNwcmFnbWEgb21wIHBhcmFsbGVsIGZpcnN0cHJpdmF0ZShpKQorICB7CisgICAgI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgeworICAgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIGludCBteWkgPSBpOworICAgICAgICAjcHJhZ21hIG9tcCB0YXNrIDxvbXB0czpjaGVjaz51bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICB7CisgICAgICAgICAgbXlfc2xlZXAoU0xFRVBUSU1FKTsKKyAgICAgICAgICBzdGFydF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIGN1cnJlbnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNrd2FpdAorICAgICAgICAgIAorICAgICAgICAgIDxvbXB0czpjaGVjaz5pZigoc3RhcnRfdGlkW215aV0gJTIpICE9MCl7PC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgICBjdXJyZW50X3RpZFtteWldID0gb21wX2dldF90aHJlYWRfbnVtKCk7CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIH0gLyogZW5kIG9mIGlmICovIAorICAgICAgICAgIGVsc2UgeworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0KKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorCisgICAgICAgIH0gLyplbmQgb2Ygb21wIHRhc2sgKi8KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKyAgICB9IC8qIGVuZCBvZiBzaW5nbGUgKi8KKyAgfSAvKiBlbmQgb2YgcGFyYWxsZWwgKi8KKworICBmb3IgKGk9MDtpPE5VTV9UQVNLUzsgaSsrKQorICB7CisgICAgcHJpbnRmKCJzdGFydF90aWRbJWRdPSVkLCBjdXJyZW50X3RpZFslZF09JWRcbiIsaSwgc3RhcnRfdGlkW2ldLCBpICwgY3VycmVudF90aWRbaV0pOworICAgIGlmIChjdXJyZW50X3RpZFtpXSA9PSBzdGFydF90aWRbaV0pCisgICAgICBjb3VudCsrOworICB9CisgIHJldHVybiAoY291bnQ8TlVNX1RBU0tTKTsKK30KKzwvb21wdHM6dGVzdGNvZGU+CisKKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza3dhaXQuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ODc2MWYyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90YXNrd2FpdC5jCkBAIC0wLDAgKzEsNzUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2t3YWl0IGRpcmVjdGl2ZS4gRmlyc3Qgd2UgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MsIHdoaWNoIHNldCB0aGUgZWxlbWVudHMgb2YgYW4gYXJyYXkgdG8gYSBzcGVjaWZpYyB2YWx1ZS4gVGhlbiB3ZSBkbyBhIHRhc2t3YWl0IGFuZCBjaGVjayBpZiBhbGwgdGFza3MgZmluaXNoZWQgbWVhbmluZyBhbGwgYXJyYXkgZWxlbWVudHMgY29udGFpbiB0aGUgcmlnaHQgdmFsdWUuIFRoZW4gd2UgZ2VuZXJhdGUgYSBzZWNvbmQgc2V0IHNldHRpbmcgdGhlIGFycmF5IGVsZW1lbnRzIHRvIGFub3RoZXIgdmFsdWUuIEFmdGVyIHRoZSBwYXJhbGxlbCByZWdpb24gd2UgY2hlY2sgaWYgYWxsIHRhc2tzIG9mIHRoZSBzZWNvbmQgc2V0IGZpbmlzaGVkIGFuZCB3ZXJlIGV4ZWN1dGVkIGFmdGVyIHRoZSB0YXNrcyBvZiB0aGUgZmlyc3Qgc2V0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3dhaXQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCB0YXNrPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rhc2t3YWl0PC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKXsKKyAgICBpbnQgcmVzdWx0MSA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIG5vdCBmaW5pc2hlZCB0YXNrcyBhZnRlciB0aGUgdGFza3dhaXQgKi8KKyAgICBpbnQgcmVzdWx0MiA9IDA7ICAgICAvKiBTdG9yZXMgbnVtYmVyIG9mIHdyb25nIGFycmF5IGVsZW1lbnRzIGF0IHRoZSBlbmQgKi8KKworICAgIGludCBhcnJheVtOVU1fVEFTS1NdOworICAgIGludCBpOworCisgICAgLyogZmlsbCBhcnJheSAqLworICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgIGFycmF5W2ldID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgCisgICAgeworI3ByYWdtYSBvbXAgc2luZ2xlCisgICAgICAgIHsKKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICAgICAgICAgIC8qIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAgICAgICAgICogd2hpY2ggd2lsbCBiZSBwcml2YXRlIGZvciBlYWNoIHRhc2sgYmVjYXVzZSBvdGhlcndpc2UgaXQgd2lsbCBiZSBvdmVyd3JpdHRlbgorICAgICAgICAgICAgICAgICAqIGlmIHRoZSBleGVjdXRpb24gb2YgdGhlIHRhc2sgdGFrZXMgbG9uZ2VyIHRoYW4gdGhlIHRpbWUgd2hpY2ggaXMgbmVlZGVkIHRvIAorICAgICAgICAgICAgICAgICAqIGVudGVyIHRoZSBuZXh0IHN0ZXAgb2YgdGhlIGxvb3AhCisgICAgICAgICAgICAgICAgICovCisgICAgICAgICAgICAgICAgaW50IG15aTsKKyAgICAgICAgICAgICAgICBteWkgPSBpOworI3ByYWdtYSBvbXAgdGFzaworICAgICAgICAgICAgICAgIHsKKyAgICAgICAgICAgICAgICAgICAgbXlfc2xlZXAgKFNMRUVQVElNRSk7CisgICAgICAgICAgICAgICAgICAgIGFycmF5W215aV0gPSAxOworICAgICAgICAgICAgICAgIH0gLyogZW5kIG9mIG9tcCB0YXNrICovCisgICAgICAgICAgICB9IC8qIGVuZCBvZiBmb3IgKi8KKworPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4jcHJhZ21hIG9tcCB0YXNrd2FpdDwvb21wdHM6Y2hlY2s+Cis8L29tcHRzOm9ycGhhbj4KKworICAgICAgICAgICAgLyogY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQgKi8KKyAgICAgICAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgCisgICAgICAgICAgICAgICAgaWYgKGFycmF5W2ldICE9IDEpCisgICAgICAgICAgICAgICAgICAgIHJlc3VsdDErKzsKKworICAgICAgICAgICAgLyogZ2VuZXJhdGUgc29tZSBtb3JlIHRhc2tzIHdoaWNoIG5vdyBzaGFsbCBvdmVyd3JpdGUgCisgICAgICAgICAgICAgKiB0aGUgdmFsdWVzIGluIHRoZSB0aWRzIGFycmF5ICovCisgICAgICAgICAgICBmb3IgKGkgPSAwOyBpIDwgTlVNX1RBU0tTOyBpKyspIHsKKyAgICAgICAgICAgICAgICBpbnQgbXlpOworICAgICAgICAgICAgICAgIG15aSA9IGk7CisjcHJhZ21hIG9tcCB0YXNrCisgICAgICAgICAgICAgICAgeworICAgICAgICAgICAgICAgICAgICBhcnJheVtteWldID0gMjsKKyAgICAgICAgICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICAgICAgfSAvKiBlbmQgb2YgZm9yICovCisKKyAgICAgICAgfSAvKiBlbmQgb2Ygc2luZ2xlICovCisgICAgfSAvKmVuZCBvZiBwYXJhbGxlbCAqLworCisgICAgLyogZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXM6ICovCisgICAgZm9yIChpID0gMDsgaSA8IE5VTV9UQVNLUzsgaSsrKSB7CisgICAgICAgIGlmIChhcnJheVtpXSAhPSAyKQorICAgICAgICAgICAgcmVzdWx0MisrOworICAgIH0KKworICAgIHJldHVybiAoKHJlc3VsdDEgPT0gMCkgJiYgKHJlc3VsdDIgPT0gMCkpOworfQorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGFza3lpZWxkLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjFkMTI3MWUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rhc2t5aWVsZC5jCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHRhc2t5aWVsZCBkaXJlY3RpdmUuIEZpcnN0IGdlbmVyYXRlIGEgc2V0IG9mIHRhc2tzIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlbiB3ZSByZXN1bWUgaGFsZiBvZiB0aGVtIGFuZCBjaGVjayB3aGV0aGVyIHRoZXkgYXJlIHNjaGVkdWxlZCBieSBkaWZmZXJlbnQgdGhyZWFkczwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFza3lpZWxkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHRhc2t3YWl0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgPG1hdGguaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSAib21wX215X3NsZWVwLmgiCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNreWllbGQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpeworCisgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgaW50IGk7CisgIGludCBjb3VudCA9IDA7CisgIGludCBzdGFydF90aWRbTlVNX1RBU0tTXTsKKyAgaW50IGN1cnJlbnRfdGlkW05VTV9UQVNLU107CisgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgIGZvciAoaT0wOyBpPCBOVU1fVEFTS1M7IGkrKyl7CisgICAgc3RhcnRfdGlkW2ldPTA7CisgICAgY3VycmVudF90aWRbaV09MDsKKyAgfQorICAKKyAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKyAgeworICAgICNwcmFnbWEgb21wIHNpbmdsZQorICAgIHsKKyAgICAgIGZvciAoaSA9IDA7IGkgPCBOVU1fVEFTS1M7IGkrKykgeworICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBpbnQgbXlpID0gaTsKKyAgICAgICAgPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRhc2sgdW50aWVkPC9vbXB0czpjaGVjaz4KKyAgICAgICAgeworICAgICAgICAgIG15X3NsZWVwKFNMRUVQVElNRSk7CisgICAgICAgICAgc3RhcnRfdGlkW215aV0gPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgICAKKyAgICAgICAgICAjcHJhZ21hIG9tcCB0YXNreWllbGQKKyAgICAgICAgICAKKyAgICAgICAgICBpZigoc3RhcnRfdGlkW215aV0gJTIpID09MCl7CisgICAgICAgICAgICBteV9zbGVlcChTTEVFUFRJTUUpOworICAgICAgICAgICAgY3VycmVudF90aWRbbXlpXSA9IG9tcF9nZXRfdGhyZWFkX251bSgpOworICAgICAgICAgIH0gLyplbmQgb2YgaWYqLworICAgICAgICB9IC8qIGVuZCBvZiBvbXAgdGFzayAqLworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgIH0gLyogZW5kIG9mIGZvciAqLworICAgIH0gLyogZW5kIG9mIHNpbmdsZSAqLworICB9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLworCisgIGZvciAoaT0wO2k8TlVNX1RBU0tTOyBpKyspCisgIHsKKyAgICAvL3ByaW50Zigic3RhcnRfdGlkWyVkXT0lZCwgY3VycmVudF90aWRbJWRdPSVkXG4iLGksIHN0YXJ0X3RpZFtpXSwgaSAsIGN1cnJlbnRfdGlkW2ldKTsKKyAgICBpZiAoY3VycmVudF90aWRbaV0gPT0gc3RhcnRfdGlkW2ldKQorICAgICAgY291bnQrKzsKKyAgfQorICByZXR1cm4gKGNvdW50PE5VTV9UQVNLUyk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorCis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbG9jay5jIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lODg5ZGZiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90ZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0bG9jayBmdW5jdGlvbi4gVGhlIHRlc3QgY291bnRzIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aGljaCBpcyBidWlsZCB3aXRoIGEgdGVzdF9sb2NrIGluIGFuIGVuZGxlc3MgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisKK29tcF9sb2NrX3QgbGNrOworCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbG9jayAoJmxjayk7CisKKyNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChsY2spICAKKyAgICB7CisKKyNwcmFnbWEgb21wIGZvcgorCWZvciAoaSA9IDA7IGkgPCBMT09QQ09VTlQ7IGkrKykKKwl7CisJICAgIC8qb21wX3NldF9sb2NrKCZsY2spOyovCisJICAgIDxvbXB0czpvcnBoYW4+CisJCTxvbXB0czpjaGVjaz53aGlsZSAoIW9tcF90ZXN0X2xvY2sgKCZsY2spKQorCQl7fTs8L29tcHRzOmNoZWNrPgorCSAgICA8L29tcHRzOm9ycGhhbj4KKyNwcmFnbWEgb21wIGZsdXNoCisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlKys7CisjcHJhZ21hIG9tcCBmbHVzaCAgICAgICAgICAgCisJICAgIG5yX2l0ZXJhdGlvbnMrKzsKKwkgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUtLTsKKwkgICAgcmVzdWx0ID0gcmVzdWx0ICsgbnJfdGhyZWFkc19pbl9zaW5nbGU7CisJICAgIDxvbXB0czpjaGVjaz5vbXBfdW5zZXRfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X2xvY2soJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7CisKK30KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3Rlc3RfbmVzdF9sb2NrLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThkNmE0NQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGVzdF9uZXN0X2xvY2suYwpAQCAtMCwwICsxLDQ4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0X25lc3RfbG9jayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGUgIm9tcF90ZXN0c3VpdGUuaCIKKworCitzdGF0aWMgb21wX25lc3RfbG9ja190IGxjazsKKworaW50IDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworICAgIAorICAgIGludCBucl90aHJlYWRzX2luX3NpbmdsZSA9IDA7CisgICAgaW50IHJlc3VsdCA9IDA7CisgICAgaW50IG5yX2l0ZXJhdGlvbnMgPSAwOworICAgIGludCBpOworCisgICAgb21wX2luaXRfbmVzdF9sb2NrICgmbGNrKTsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwgc2hhcmVkKGxjaykgCisgICAgeworCisjcHJhZ21hIG9tcCBmb3IKKwlmb3IgKGkgPSAwOyBpIDwgTE9PUENPVU5UOyBpKyspCisJeworCSAgICAvKm9tcF9zZXRfbG9jaygmbGNrKTsqLworPG9tcHRzOm9ycGhhbj4KKwkgICAgPG9tcHRzOmNoZWNrPndoaWxlKCFvbXBfdGVzdF9uZXN0X2xvY2sgKCZsY2spKQorCSAgICB7fTs8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisjcHJhZ21hIG9tcCBmbHVzaAorCSAgICBucl90aHJlYWRzX2luX3NpbmdsZSsrOworI3ByYWdtYSBvbXAgZmx1c2ggICAgICAgICAgIAorCSAgICBucl9pdGVyYXRpb25zKys7CisJICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlLS07CisJICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlOworCSAgICA8b21wdHM6Y2hlY2s+b21wX3Vuc2V0X25lc3RfbG9jayAoJmxjayk7PC9vbXB0czpjaGVjaz4KKwl9CisgICAgfQorICAgIG9tcF9kZXN0cm95X25lc3RfbG9jayAoJmxjayk7CisKKyAgICByZXR1cm4gKChyZXN1bHQgPT0gMCkgJiYgKG5yX2l0ZXJhdGlvbnMgPT0gTE9PUENPVU5UKSk7Cit9Cis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMgYi9yYzMvdGVzdHN1aXRlL2Mvb21wX3RocmVhZHByaXZhdGUuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44ZTRkN2FhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlLmMKQEAgLTAsMCArMSw5NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGhyZWFkcHJpdmF0ZSBkaXJlY3RpdmUgYnkgZmlsbGluZyBhbiBhcnJheSB3aXRoIHJhbmRvbSBudW1iZXJzIGluIGFuIHBhcmFsbGVsaXNlZCByZWdpb24uIEVhY2ggdGhyZWFkIGdlbmVyYXRlcyBvbmUgbnVtYmVyIG9mIHRoZSBhcnJheSBhbmQgc2F2ZXMgdGhpcyBpbiBhIHRlbXBvcmFyeSB0aHJlYWRwcml2YXRlIHZhcmlhYmxlLiBJbiBhIHNlY29uZCBwYXJhbGxlbGlzZWQgcmVnaW9uIHRoZSB0ZXN0IGNvbnRyb2xzLCB0aGF0IHRoZSB0ZW1wb3JhcnkgdmFyaWFibGUgY29udGFpbnMgc3RpbGwgdGhlIGZvcm1lciB2YWx1ZSBieSBjb21wYXJpbmcgaXQgd2l0aCB0aGUgb25lIGluIHRoZSBhcnJheS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRocmVhZHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsb21wX3NldF9keW5hbWljLG9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorLyoKKyAqIFRocmVhZHByaXZhdGUgaXMgdGVzdGVkIGluIDIgd2F5czoKKyAqIDEuIFRoZSBnbG9iYWwgdmFyaWFibGUgZGVjbGFyZWQgYXMgdGhyZWFkcHJpdmF0ZSBzaG91bGQgaGF2ZQorICogICAgbG9jYWwgY29weSBmb3IgZWFjaCB0aHJlYWQuIE90aGVyd2lzZSByYWNlIGNvbmRpdGlvbiBhbmQgCisgKiAgICB3cm9uZyByZXN1bHQuCisgKiAyLiBJZiB0aGUgdmFsdWUgb2YgbG9jYWwgY29weSBpcyByZXRhaW5lZCBmb3IgdGhlIHR3byBhZGphY2VudAorICogICAgcGFyYWxsZWwgcmVnaW9ucworICovCisjaW5jbHVkZSAib21wX3Rlc3RzdWl0ZS5oIgorI2luY2x1ZGUgPHN0ZGxpYi5oPgorI2luY2x1ZGUgPHN0ZGlvLmg+CisKK3N0YXRpYyBpbnQgc3VtMD0wOworc3RhdGljIGludCBteXZhbHVlID0gMDsKKworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoc3VtMCk8L29tcHRzOmNoZWNrPgorPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUobXl2YWx1ZSk8L29tcHRzOmNoZWNrPgorCisKK2ludCA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90aHJlYWRwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KEZJTEUgKiBsb2dGaWxlKQoreworCWludCBzdW0gPSAwOworCWludCBrbm93bl9zdW07CisJaW50IGk7IAorCWludCBpdGVyOworCWludCAqZGF0YTsKKwlpbnQgc2l6ZTsKKwlpbnQgZmFpbGVkID0gMDsKKwlpbnQgbXlfcmFuZG9tOworCW9tcF9zZXRfZHluYW1pYygwKTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHByaXZhdGUoaSkgCisgICAgeworCSAgc3VtMCA9IDA7CisgICAgICAjcHJhZ21hIG9tcCBmb3IgCisJICAgIGZvciAoaSA9IDE7IGkgPD0gTE9PUENPVU5UOyBpKyspCisJCXsKKwkJCXN1bTAgPSBzdW0wICsgaTsKKwkJfSAvKmVuZCBvZiBmb3IqLworICAgICAgI3ByYWdtYSBvbXAgY3JpdGljYWwKKwkgIHsKKwkgICAgICBzdW0gPSBzdW0gKyBzdW0wOworCSAgfSAvKmVuZCBvZiBjcml0aWNhbCAqLworCX0gLyogZW5kIG9mIHBhcmFsbGVsICovICAgIAorCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwkvKiB0aGUgbmV4dCBwYXJhbGxlbCByZWdpb24gaXMganVzdCB1c2VkIHRvIGdldCB0aGUgbnVtYmVyIG9mIHRocmVhZHMqLworCW9tcF9zZXRfZHluYW1pYygwKTsKKyAgICAjcHJhZ21hIG9tcCBwYXJhbGxlbAorCXsKKyAgICAgICNwcmFnbWEgb21wIG1hc3RlcgorCSAgeworCQkJc2l6ZT1vbXBfZ2V0X251bV90aHJlYWRzKCk7CisJCQlkYXRhPShpbnQqKSBtYWxsb2Moc2l6ZSpzaXplb2YoaW50KSk7CisJICB9CisJfS8qIGVuZCBwYXJhbGxlbCovCisKKworCXNyYW5kKDQ1KTsKKwlmb3IgKGl0ZXIgPSAwOyBpdGVyIDwgMTAwOyBpdGVyKyspeworCQlteV9yYW5kb20gPSByYW5kKCk7CS8qIHJhbmRvbSBudW1iZXIgZ2VuZXJhdG9yIGlzIGNhbGxlZCBpbnNpZGUgc2VyaWFsIHJlZ2lvbiovCisKKwkvKiB0aGUgZmlyc3QgcGFyYWxsZWwgcmVnaW9uIGlzIHVzZWQgdG8gaW5pdGlhbGl5ZSBteXZhbHVlIGFuZCB0aGUgYXJyYXkgd2l0aCBteV9yYW5kb20rcmFuayovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJICAgIGludCByYW5rOworCQlyYW5rID0gb21wX2dldF90aHJlYWRfbnVtICgpOworCQlteXZhbHVlID0gZGF0YVtyYW5rXSA9IG15X3JhbmRvbSArIHJhbms7CisJfQorCisJLyogdGhlIHNlY29uZCBwYXJhbGxlbCByZWdpb24gdmVyaWZpZXMgdGhhdCB0aGUgdmFsdWUgb2YgIm15dmFsdWUiIGlzIHJldGFpbmVkICovCisgICAgI3ByYWdtYSBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uKCs6ZmFpbGVkKQorCXsKKwkgICAgaW50IHJhbms7CisJCXJhbmsgPSBvbXBfZ2V0X3RocmVhZF9udW0gKCk7CisJCWZhaWxlZCA9IGZhaWxlZCArIChteXZhbHVlICE9IGRhdGFbcmFua10pOworCQlpZihteXZhbHVlICE9IGRhdGFbcmFua10peworCQkgIGZwcmludGYgKGxvZ0ZpbGUsICIgbXl2YWx1ZSA9ICVkLCBkYXRhW3JhbmtdPSAlZFxuIiwgbXl2YWx1ZSwgZGF0YVtyYW5rXSk7CisJCX0KKwl9CisgIH0KKyAgZnJlZSAoZGF0YSk7CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pICYmICFmYWlsZWQ7CisKK30gLyogZW5kIG9mIGNoZWNrX3RocmVhZHByaXZhdGUqLworPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYyBiL3JjMy90ZXN0c3VpdGUvYy9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IuYwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wMzQzNTlkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jL29tcF90aHJlYWRwcml2YXRlX2Zvci5jCkBAIC0wLDAgKzEsNDQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyBpZiBhIHZhcmlhYmxlIGRlY2xhcmVkIGFzIHRocmVhZHByaXZhdGUgY2FuIGJlIHVzZWQgYXMgYSBsb29waW5kZXguPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0aHJlYWRwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyNpbmNsdWRlICJvbXBfdGVzdHN1aXRlLmgiCisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8c3RkaW8uaD4KKworc3RhdGljIGludCBpOworPG9tcHRzOmNoZWNrPiNwcmFnbWEgb21wIHRocmVhZHByaXZhdGUoaSk8L29tcHRzOmNoZWNrPgorCitpbnQgPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZV9mb3I8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oRklMRSAqIGxvZ0ZpbGUpCit7CisJCWludCBrbm93bl9zdW07CisJCWludCBzdW07CisJCWtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMjsKKwkJc3VtID0gMDsKKworI3ByYWdtYSBvbXAgcGFyYWxsZWwKKwl7CisJCWludCBzdW0wID0gMDsKKyNwcmFnbWEgb21wIGZvcgorCQlmb3IgKGkgPSAxOyBpIDw9IExPT1BDT1VOVDsgaSsrKQorCQl7CisJCQlzdW0wID0gc3VtMCArIGk7CisJCX0gLyplbmQgb2YgZm9yKi8KKyNwcmFnbWEgb21wIGNyaXRpY2FsCisJCXsKKwkJCXN1bSA9IHN1bSArIHN1bTA7CisJCX0gLyplbmQgb2YgY3JpdGljYWwgKi8KKwl9IC8qIGVuZCBvZiBwYXJhbGxlbCAqLyAgICAKKwkKKwlpZiAoa25vd25fc3VtICE9IHN1bSApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIiBrbm93bl9zdW0gPSAlZCwgc3VtID0gJWRcbiIsIGtub3duX3N1bSwgc3VtKTsKKwl9CisKKwlyZXR1cm4gKGtub3duX3N1bSA9PSBzdW0pOworCit9IC8qIGVuZCBvZiBjaGVja190aHJlYWRwcml2YXRlKi8KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZiBiL3JjMy90ZXN0c3VpdGUvY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9jb21tb25fdXRpbGl0eS5mCkBAIC0wLDAgKzEsNTcgQEAKKyAgICAgIHN1YnJvdXRpbmUgcHJpbnRfcmVzdWx0KHMsY3Jvc3NmYWlsZWQsTSxuYW1lKSAgICAgCisgICAgICBpbXBsaWNpdCBub25lCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorCSAgIHJlYWwgY2VydAorCSAgIGludGVnZXIgTSxjcm9zc2ZhaWxlZAorCSAgIGludGVnZXIgcworCSAgIGNoYXJhY3RlciAobGVuPTExKSA6OiBjCisgCSAgIGNoYXJhY3RlciAobGVuPTE4KSA6OiBjMgorCSAgIGNlcnQ9MTAwLjAqY3Jvc3NmYWlsZWQvTQorISAgICAgICAgICAgcHJpbnQgKiwgImNlcnQiLCBjZXJ0LCAiY3Jvc3MgIiwgY3Jvc3NmYWlsZWQKKyEJdGVzdDE9aHVuZHJlZCpjcm9zc2ZhaWxlZAorCSAgIGM9IiUgY2VydGFpbnR5IgorCSAgIGMyPSIgLi4uIHZlcmlmaWVkIHdpdGggIgorICAgICAgaWYocy5lcS4xKSB0aGVuCisgICAgICAgICB3cml0ZSAoKiwiKEEsIEEsIEY3LjIsIEEpIikgbmFtZSwgYzIsIGNlcnQsIGMKKyAgICAgIGVsc2UKKyAgICAgICAgIHdyaXRlICgqLCIoQSxBKSIpIG5hbWUsIiAuLi4gRkFJTEVEIgorICAgICAgZW5kaWYKKwkgICBlbmQKKworICAgICAgc3Vicm91dGluZSBkb190ZXN0KHRlc3RfZnVuYyxjcm9zc190ZXN0X2Z1bmMsbmFtZSxOLGZhaWxlZCwKKyAgICAgeCAgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCkKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGludGVnZXIgc3VjY2VlZAorICAgICAgaW50ZWdlciBjcm9zc2ZhaWwKKyAgICAgIGludGVnZXIgZmFpbGVkCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6dGVzdF9mdW5jCisgICAgICBpbnRlZ2VyLCBleHRlcm5hbDo6Y3Jvc3NfdGVzdF9mdW5jCisgICAgICBjaGFyYWN0ZXIgKGxlbj0qKTo6bmFtZQorICAgICAgaW50ZWdlciBmYWlsCisgICAgICBpbnRlZ2VyIE4saQorICAgICAgaW50ZWdlciBudW1fdGVzdHMsY3Jvc3NjaGVja2VkCisgICAgICBudW1fdGVzdHM9bnVtX3Rlc3RzKzEKKyAgICAgIHN1Y2NlZWQ9MQorICAgICAgY3Jvc3NmYWlsPTAKKyAgICAgIGZhaWw9MAorICAgICAgZG8gaT0xLE4KKyAgICAgICAgIGlmKHRlc3RfZnVuYygpLmVxLjApIHRoZW4KKyAgICAgICAgICAgIHN1Y2NlZWQ9MAorICAgICAgICAgICAgZmFpbD1mYWlsKzEKKyAgICAgICAgICAgIGV4aXQKKyAgICAgICAgIGVuZCBpZgorICAgICAgICAgaWYoY3Jvc3NfdGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorISAgICAgICAgICAgIHByaW50ICosIGNyb3NzZmFpbAorICAgICAgICAgICAgY3Jvc3NmYWlsPWNyb3NzZmFpbCsxLjAgCisgICAgICAgICBlbmQgaWYKKyAgICAgIGVuZGRvCisgICAgICAKKyAgICAgIGlmIChmYWlsIC5uZS4gMCkgdGhlbgorICAgICAgICAgZmFpbGVkPWZhaWxlZCsxCisgICAgICBlbHNlCisgICAgICAgICBpZihjcm9zc2ZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICAgICBjcm9zc2NoZWNrZWQ9Y3Jvc3NjaGVja2VkKzEKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kaWYKKyAgICAgIGNhbGwgcHJpbnRfcmVzdWx0KHN1Y2NlZWQsY3Jvc3NmYWlsLE4sbmFtZSkKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL09NUDFfVEVTVCBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTE2NGNlMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9PTVAxX1RFU1QKQEAgLTAsMCArMSwzNiBAQAoraGFzX29wZW5tcAorb21wX25lc3RlZAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitkb19vcmRlcmVkCitkb19yZWR1Y3Rpb24KK2RvX3ByaXZhdGUKK2RvX2ZpcnN0cHJpdmF0ZQorZG9fbGFzdHByaXZhdGUKK3NlY3Rpb25fcmVkdWN0aW9uCitzZWN0aW9uX3ByaXZhdGUKK3NlY3Rpb25fZmlyc3Rwcml2YXRlCitzZWN0aW9uX2xhc3Rwcml2YXRlCitzaW5nbGUKK3NpbmdsZV9wcml2YXRlCitzaW5nbGVfbm93YWl0CitwYXJfZG9fb3JkZXJlZAorcGFyX2RvX3JlZHVjdGlvbgorcGFyX2RvX3ByaXZhdGUKK3Bhcl9kb19maXJzdHByaXZhdGUKK3Bhcl9kb19sYXN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fcmVkdWN0aW9uCitwYXJfc2VjdGlvbl9wcml2YXRlCitwYXJfc2VjdGlvbl9maXJzdHByaXZhdGUKK3Bhcl9zZWN0aW9uX2xhc3Rwcml2YXRlCitvbXBfbWFzdGVyX3RocmVhZAorb21wX2NyaXRpY2FsCitvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2ZsdXNoCitvbXBfdGhyZWFkcHJpdmF0ZQorb21wX2NvcHlpbgorb21wX2xvY2sKK29tcF90ZXN0bG9jaworb21wX25lc3RfbG9jaworb21wX25lc3RfdGVzdGxvY2sKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9PTVAyX1RFU1QgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNDc2NjUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vT01QMl9URVNUCkBAIC0wLDAgKzEsNSBAQAorb21wX251bV90aHJlYWRzCitvbXBfd29ya3NoYXJlCitvbXBfdGltZQorb21wX3RpY2tzX3RpbWUKK3NpbmdsZV9jb3B5cHJpdmF0ZQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2NvbW1vbl91dGlsaXR5LmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vY29tbW9uX3V0aWxpdHkuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mNmQxMDc4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2NvbW1vbl91dGlsaXR5LmYKQEAgLTAsMCArMSw1NyBAQAorICAgICAgc3Vicm91dGluZSBwcmludF9yZXN1bHQocyxjcm9zc2ZhaWxlZCxNLG5hbWUpICAgICAKKyAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisJICAgcmVhbCBjZXJ0CisJICAgaW50ZWdlciBNLGNyb3NzZmFpbGVkCisJICAgaW50ZWdlciBzCisJICAgY2hhcmFjdGVyIChsZW49MTEpIDo6IGMKKyAJICAgY2hhcmFjdGVyIChsZW49MTgpIDo6IGMyCisJICAgY2VydD0xMDAuMCpjcm9zc2ZhaWxlZC9NCishICAgICAgICAgICBwcmludCAqLCAiY2VydCIsIGNlcnQsICJjcm9zcyAiLCBjcm9zc2ZhaWxlZAorIQl0ZXN0MT1odW5kcmVkKmNyb3NzZmFpbGVkCisJICAgYz0iJSBjZXJ0YWludHkiCisJICAgYzI9IiAuLi4gdmVyaWZpZWQgd2l0aCAiCisgICAgICBpZihzLmVxLjEpIHRoZW4KKyAgICAgICAgIHdyaXRlICgqLCIoQSwgQSwgRjcuMiwgQSkiKSBuYW1lLCBjMiwgY2VydCwgYworICAgICAgZWxzZQorICAgICAgICAgd3JpdGUgKCosIihBLEEpIikgbmFtZSwiIC4uLiBGQUlMRUQiCisgICAgICBlbmRpZgorCSAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGRvX3Rlc3QodGVzdF9mdW5jLGNyb3NzX3Rlc3RfZnVuYyxuYW1lLE4sZmFpbGVkLAorICAgICB4ICBudW1fdGVzdHMsY3Jvc3NjaGVja2VkKQorICAgICAgaW1wbGljaXQgbm9uZQorICAgICAgaW50ZWdlciBzdWNjZWVkCisgICAgICBpbnRlZ2VyIGNyb3NzZmFpbAorICAgICAgaW50ZWdlciBmYWlsZWQKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjp0ZXN0X2Z1bmMKKyAgICAgIGludGVnZXIsIGV4dGVybmFsOjpjcm9zc190ZXN0X2Z1bmMKKyAgICAgIGNoYXJhY3RlciAobGVuPSopOjpuYW1lCisgICAgICBpbnRlZ2VyIGZhaWwKKyAgICAgIGludGVnZXIgTixpCisgICAgICBpbnRlZ2VyIG51bV90ZXN0cyxjcm9zc2NoZWNrZWQKKyAgICAgIG51bV90ZXN0cz1udW1fdGVzdHMrMQorICAgICAgc3VjY2VlZD0xCisgICAgICBjcm9zc2ZhaWw9MAorICAgICAgZmFpbD0wCisgICAgICBkbyBpPTEsTgorICAgICAgICAgaWYodGVzdF9mdW5jKCkuZXEuMCkgdGhlbgorICAgICAgICAgICAgc3VjY2VlZD0wCisgICAgICAgICAgICBmYWlsPWZhaWwrMQorICAgICAgICAgICAgZXhpdAorICAgICAgICAgZW5kIGlmCisgICAgICAgICBpZihjcm9zc190ZXN0X2Z1bmMoKS5lcS4wKSB0aGVuCishICAgICAgICAgICAgcHJpbnQgKiwgY3Jvc3NmYWlsCisgICAgICAgICAgICBjcm9zc2ZhaWw9Y3Jvc3NmYWlsKzEuMCAKKyAgICAgICAgIGVuZCBpZgorICAgICAgZW5kZG8KKyAgICAgIAorICAgICAgaWYgKGZhaWwgLm5lLiAwKSB0aGVuCisgICAgICAgICBmYWlsZWQ9ZmFpbGVkKzEKKyAgICAgIGVsc2UKKyAgICAgICAgIGlmKGNyb3NzZmFpbCAubmUuIDApIHRoZW4KKyAgICAgICAgICAgIGNyb3NzY2hlY2tlZD1jcm9zc2NoZWNrZWQrMQorICAgICAgICAgZW5kIGlmCisgICAgICBlbmRpZgorICAgICAgY2FsbCBwcmludF9yZXN1bHQoc3VjY2VlZCxjcm9zc2ZhaWwsTixuYW1lKQorICAgICAgZW5kCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fY29sbGFwc2UuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19jb2xsYXBzZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE4MTcyNTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fY29sbGFwc2UuZgpAQCAtMCwwICsxLDY3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aXRoIG9tcCBmb3IgY29sbGFwc2UgY2xhdXNlLiBCaW5kIHdpdGggdHdvIGxvb3BzLiBXaXRob3V0IHRoZSBjb2xsYXBzZSBjbGF1c2UsIHRoZSBmaXJzdCBsb29wIHdpbGwgbm90IGJlIG9yZGVyZWQ8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIGNvbGxhcHNlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBkbyBzY2hlZHVsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBMT0dJQ0FMIEZVTkNUSU9OIGNoZWNrX2lzX2xhcmdlcihpKQorICAgICAgICBpbXBsaWNpdCBub25lCisgICAgICAgIElOVEVHRVIgOjogaQorICAgICAgICBJTlRFR0VSLCBzYXZlIDo6IGxhc3RfaQorICAgICAgICBMT0dJQ0FMIDo6IGlzX2xhcmdlcgorCisgICAgICAgIGlmIChpIC5lcS4gMSkgbGFzdF9pID0gMAorCisgICAgICAgIGlzX2xhcmdlciA9IChpIC5nZS4gbGFzdF9pKSAuYW5kLiAoKGktbGFzdF9pKSAubGUuIDEpCisgICAgICAgIGxhc3RfaSA9IGkKKworICAgICAgICBjaGVja19pc19sYXJnZXIgPSBpc19sYXJnZXIKKworICAgICAgRU5EIEZVTkNUSU9OIGNoZWNrX2lzX2xhcmdlcgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fY29sbGFwc2U8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgaSwgagorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBMT0dJQ0FMIGNoZWNrX2lzX2xhcmdlcgorICAgICAgICBMT0dJQ0FMIG15X2lzX2xhcmdlcgorICAgICAgICBMT0dJQ0FMIGlzX2xhcmdlcgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpc19sYXJnZXIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIGlzX2xhcmdlciA9IC50cnVlLgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKG15X2lzX2xhcmdlcikKKzxvbXB0czpvcnBoYW4+CisgICAgICAgIG15X2lzX2xhcmdlciA9IC50cnVlLgorISRvbXAgZG8gcHJpdmF0ZShpLGopIHNjaGVkdWxlKHN0YXRpYywxKSA8b21wdHM6Y2hlY2s+Y29sbGFwc2UoMik8L29tcHRzOmNoZWNrPgorISRvbXArICAgb3JkZXJlZAorICAgICAgICBETyBpPTEsMTAwCisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+CisgICAgICAgICAgbXlfaXNfbGFyZ2VyID0gY2hlY2tfaXNfbGFyZ2VyKGkpIC5hbmQuIG15X2lzX2xhcmdlcgorICAgICAgICAgIDwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgICBETyBqPTEsMDAKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBvcmRlcmVkCisgICAgICAgICAgICBteV9pc19sYXJnZXIgPSBjaGVja19pc19sYXJnZXIoaSkgLmFuZC4gbXlfaXNfbGFyZ2VyCishJG9tcCBlbmQgb3JkZXJlZAorICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgRU5EIERPCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBpc19sYXJnZXIgPSBpc19sYXJnZXIgLmFuZC4gbXlfaXNfbGFyZ2VyCishJG9tcCBlbmQgY3JpdGljYWwKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgIGlmIChpc19sYXJnZXIpIHRoZW4KKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgIGVsc2UKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgIGVuZCBpZgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2ZpcnN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjA3OTIzNjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSw1NiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgZG8gZmlyc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIGhhcyBhIGZpcnN0cHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBkbyBmaXJzdHByaXZhdGUuIEZpcnN0IGl0IHN0b3JlcyB0aGUgcmVzdWx0IG9mIGl0cyBsYXN0IGl0ZXJhdGlvbiBpbiB2YXJpYWJsZSAoMikuIFRoZW4gaXQgc3RvcmVzIHRoZSB2YWx1ZSBvZiB0aGUgdmFyaWFibGUgKDIpIGluIGl0cyBmaXJzdHByaXZhdGUgdmFyaWFibGUgKDEpLiBBdCB0aGUgZW5kIGFsbCBmaXJzdHByaXZhdGUgdmFyaWFibGVzICgxKSBhcmUgYWRkZWQgdG8gYSB0b3RhbCBzdW0gaW4gYSBjcml0aWNhbCBzZWN0aW9uIGFuZCBjb21wYXJlZCB3aXRoIHRoZSBjb3JyZWN0IHJlc3VsdC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBwYXJhbGxlbCBwcml2YXRlLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIG51bXRocmVhZHMKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtMCwgc3VtMSwgaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLCBzdW0xLCBpCis8L29tcHRzOm9ycGhhbjp2YXJzPgorICAKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0wID0gMTIzNDUKKyAgICAgICAgc3VtMSA9IDAKKyAgCisgIAorISRvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKHN1bTEpCishJG9tcCBzaW5nbGUKKyAgICAgICAgbnVtdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorISRvbXAgZW5kIHNpbmdsZQorCisKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyA8b21wdHM6Y2hlY2s+Zmlyc3Rwcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlIChzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIHN1bTEgPSBzdW0wCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKworCishJG9tcCBjcml0aWNhbAorICAgICAgICBXUklURSAoMSwqKSBzdW0wCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTEKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisKKworICAgICAgICBrbm93bl9zdW09MTIzNDUqbnVtdGhyZWFkcysgKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRm91bmQgc3VtIHdhcyIsIHN1bSwgImluc3RlYWQgb2YiLCBrbm93bl9zdW0KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19sYXN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX2xhc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDIwMmU1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsMzkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGRvIGxhc3Rwcml2YXRlIGNsYXVzZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIGxvb3AuIEVhY2ggdGhyZWFkIHNhdmVzIHRoZSBuZXh0IHN1bW1hbmQgaW4gYSBsYXN0cHJpdmF0ZSB2YXJpYWJsZSBpMC4gQXQgdGhlIGVuZCBpMCBpcyBjb21wYXJlZCB0byB0aGUgdmFsdWUgb2YgdGhlIGV4cGVjdGVkIGxhc3Qgc3VtbWFuZC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czp2ZXJzaW9uPjIuMDwvb21wdHM6dmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlLCBvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0KKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBzdW0wLGkwLGkKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtMCxpMCxpCis8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgaTAgPSAtMQorISRvbXAgcGFyYWxsZWwgZmlyc3Rwcml2YXRlKHN1bTApCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoc3RhdGljLDcpIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKzxvbXB0czpjaGVjaz4hJG9tcCBlbmQgZG88L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIGkwIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19vcmRlcmVkLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmIwODdmODEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fb3JkZXJlZC5mCkBAIC0wLDAgKzEsNzMgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOmRpcmVjdGl2ZT5kbyBvcmRlcmVkPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyYWxsZWwgcHJpdmF0ZSwgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiBpX2lzbGFyZ2VyKGkpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBpLCBpc2xhcmdlcgorICAgICAgICBJTlRFR0VSIGxhc3RfaQorICAgICAgICBDT01NT04gL215Y29tLyBsYXN0X2kKKyAgICAgICAgSUYgKCBpIC5HVC4gbGFzdF9pKSBUSEVOCisgICAgICAgICAgaXNsYXJnZXIgPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBpc2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElmCisgICAgICAgIGxhc3RfaSA9IGkKKyAgICAgICAgaV9pc2xhcmdlciA9IGlzbGFyZ2VyCisgICAgICBFTkQKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtLCBpc19sYXJnZXIKKyAgICAgICAgSU5URUdFUiBsYXN0X2kKKyAgICAgICAgSU5URUdFUiBpX2lzbGFyZ2VyCisgICAgICAgIENPTU1PTiAvbXljb20vIGxhc3RfaQorCis8b21wdHM6b3JwaGFuOnBhcm1zPiBpIDwvb21wdHM6b3JwaGFuOnBhcm1zPgorCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLCBpLCBteV9pc2xhcmdlcgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBteV9pc2xhcmdlciwgc3VtCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBsYXN0X2kgPSAwCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKG15X2lzbGFyZ2VyKQorICAgICAgICBteV9pc2xhcmdlciA9IDEKKyEkb21wIGRvIHNjaGVkdWxlKHN0YXRpYywxKSBvcmRlcmVkCisgICAgICAgIERPIGk9MSwgOTkKKzxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+CishJG9tcCBvcmRlcmVkCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIElGIChpX2lzbGFyZ2VyKGkpIC5FUS4gMSAuQU5ELiBteV9pc2xhcmdlciAuRVEuIDEpIFRIRU4KKyAgICAgICAgICAgIG15X2lzbGFyZ2VyID0gMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIG15X2lzbGFyZ2VyID0gMAorICAgICAgICAgIEVORCBJRgorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKzxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBvcmRlcmVkCis8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBJRiAoaXNfbGFyZ2VyIC5FUS4gMSAuQU5ELiBteV9pc2xhcmdlciAuRVEuIDEgKSBUSEVOCisgICAgICAgICAgaXNfbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNfbGFyZ2VyID0gMAorICAgICAgICBFTkQgSUYKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIGtub3duX3N1bSA9ICg5OSoxMDApLzIKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0gLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19wcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJlNTg3Y2YKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsNjcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGRvIHByaXZhdGUgY2xhdXNlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcC4gRWFjaCB0aHJlYWQgaGFzIGEgcHJpdmF0ZSB2YXJpYWJsZSAoMSkgYW5kIGFuIHZhcmlhYmxlICgyKSBkZWNsYXJlZCBieSBmb3IgcHJpdmF0ZS4gRmlyc3QgaXQgc3RvcmVzIHRoZSByZXN1bHQgb2YgaXRzIGxhc3QgaXRlcmF0aW9uIGluIHZhcmlhYmxlICgyKS4gVGhlbiB0aGlzIHRocmVhZCB3YWl0cyBzb21lIHRpbWUgYmVmb3JlIGl0IHN0b3JlcyB0aGUgdmFsdWUgb2YgdGhlIHZhcmlhYmxlICgyKSBpbiBpdHMgcHJpdmF0ZSB2YXJpYWJsZSAoMSkuIEF0IHRoZSBiZWdpbm5pbmcgb2YgdGhlIG5leHQgaXRlcmF0aW9uIHRoZSB2YWx1ZSBvZiAoMSkgaXMgYXNzaWduZWQgdG8gKDIpLiBBdCB0aGUgZW5kIGFsbCBwcml2YXRlIHZhcmlhYmxlcyAoMSkgYXJlIGFkZGVkIHRvIGEgdG90YWwgc3VtIGluIGEgY3JpdGljYWwgc2VjdGlvbiBhbmQgY29tcGFyZWQgd2l0aCB0aGUgY29ycmVjdCByZXN1bHQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6dmVyc2lvbj4yLjA8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsIG9tcCBmbHVzaCwgb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIFNVQlJPVVRJTkUgZG9fc29tZV93b3JrKCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgSU5UUklOU0lDIHNxcnQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBzdW0KKworICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bT0wLjAKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQtMQorICAgICAgICAgIHN1bSA9IHN1bSArIHNxcnQoUkVBTChpKSkKKyAgICAgICAgRU5ERE8KKworICAgICAgRU5ECisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19wcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSwga25vd25fc3VtCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtMCwgc3VtMSwgaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0wLCBzdW0xLCBpCis8L29tcHRzOm9ycGhhbjp2YXJzPiAgICAgICAgCisKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICAgIHN1bSAgPSAwCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIHN1bTEgPSAwCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoc3VtMSkKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgc3VtMSA9IDAKKworPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTApPC9vbXB0czpjaGVjaz4gc2NoZWR1bGUoc3RhdGljLDEpCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtMCA9IHN1bTEKKyEkb21wIGZsdXNoCisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgQ0FMTCBkb19zb21lX3dvcmsoKQorISRvbXAgZmx1c2gKKyEgICAgICAgICAgcHJpbnQgKiwgc3VtMAorICAgICAgICAgIHN1bTEgPSBzdW0wCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBrbm93bl9zdW0gPSAoTE9PUENPVU5UKihMT09QQ09VTlQrMSkpLzIKKyEgICAgICAgIHByaW50ICosICJzdW06Iiwgc3VtLCAia25vd25fc3VtIiwga25vd25fc3VtCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJiMjVhNDUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fcmVkdWN0aW9uLmYKQEAgLTAsMCArMSw1MTQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGRvIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2ljaCBhbGwgaXRzIG9wdGlvbnMuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyByZWR1Y3Rpb248L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5kb19yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtCisgICAgICAgIElOVEVHRVIga25vd25fcHJvZHVjdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHJvdW5kaW5nX2Vycm9yLCBkcHQKKyAgICAgICAgSU5URUdFUiBkb3VibGVfRElHSVRTCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIFBBUkFNRVRFUiAoa25vd25fcHJvZHVjdD0zNjI4ODAwKQorICAgICAgICBQQVJBTUVURVIgKHJvdW5kaW5nX2Vycm9yPTEuRS02KQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIHN1bSxkaWZmLHByb2R1Y3QsaQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRzdW0sZGRpZmYsZHQKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBMT0dJQ0FMIGxvZ2ljcyhMT09QQ09VTlQpCisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgSU5URUdFUiBpbnRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLHByb2R1Y3QsZGlmZixpLGRzdW0sZGRpZmYsZHQsbG9naWNfYW5kLAorICAgICAmICAgIGxvZ2ljX29yLGxvZ2ljX2Vxdixsb2dpY19uZXF2LGxvZ2ljcyxiaXRfYW5kLGJpdF9vcixpbnRfYXJyYXksCisgICAgICYgICAgZXhjbHVzaXZfYml0X29yLG1pbl92YWx1ZSxkbWluLGRtYXgsZF9hcnJheSxtYXhfdmFsdWUKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIFBBUkFNRVRFUiAoZG91YmxlX0RJR0lUUz0yMCxNQVhfRkFDVE9SPTEwKQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBkdCA9IDEuLzMuCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorICAgICAgICBwcm9kdWN0ID0gMQorICAgICAgICBzdW0yID0gMAorICAgICAgICBzdW0gPSAwCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICByZXN1bHQgPTAgCisgICAgICAgIGxvZ2ljX2FuZCA9IC50cnVlLgorICAgICAgICBsb2dpY19vciA9IC5mYWxzZS4KKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsIDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsIDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24gKC06IGRpZmYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworIAorICAgICAgICBJRihkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICAgQUJTKGRzdW0gLSBka25vd25fc3VtKSAuR1QuIHJvdW5kaW5nX2Vycm9yICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgIGRzdW0gLSBka25vd25fc3VtLCIpIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgZHB0ID0gMQorCisKKyAgICAgIAorICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLTpkZGlmZik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsIERPVUJMRV9ESUdJVFMtMQorICAgICAgICAgIGRkaWZmID0gZGRpZmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCo6cHJvZHVjdCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTUFYX0ZBQ1RPUgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19vcikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2VxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguTkVRVi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm5lcXYuOmxvZ2ljX25lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEKKyAgICAgICAgRU5EIERPCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EICggYml0X2FuZCwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSU9SOmJpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBJb3IoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIE9SIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5nZS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjptaW5fdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIG1pbl92YWx1ZSA9IE1JTihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtaW5fdmFsdWUgLkdULiAoMTAtTE9PUENPVU5UKSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWF4X3ZhbHVlID0gLTMyNzY4CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDptYXhfdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOmRtaW4pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDpkbWF4KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGRtYXggLkxULiBMT09QQ09VTlQqZHQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZHluYW1pYy5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xOGY4YmE3Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2R5bmFtaWMuZgpAQCAtMCwwICsxLDkwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGR5bmFtaWMgb3B0aW9uIG9mIHRoZSBvbXAgZG8gc2NoZWR1bGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZG8gc2NoZWR1bGUoZHluYW1pYyk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGRvIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3NjaGVkdWxlX2R5bmFtaWM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIENIQVJBQ1RFUiozMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtLG9tcF9nZXRfbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiB0aHJlYWRzCisgICAgICAgIElOVEVHRVIgY291bnQsIHRtcF9jb3VudAorICAgICAgICBJTlRFR0VSLEFMTE9DQVRBQkxFOjogdG1wKDopCisgICAgICAgIElOVEVHRVIgaWkKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKworPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIENGRE1BWF9TSVpFCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZETUFYX1NJWkUgPSAxMDAwKQorICAgICAgICBJTlRFR0VSIGksdGlkcygwOkNGRE1BWF9TSVpFLTEpLHRpZCxjaHVua19zaXplCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksdGlkcyx0aWQsY2h1bmtfc2l6ZQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjaHVua19zaXplID0gNworICAgICAgICBjb3VudCA9IDAKKyAgICAgICAgdG1wX2NvdW50ID0gMAorICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIGlpID0gMAorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHRpZCkKKyAgICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCkKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyA8b21wdHM6Y2hlY2s+c2NoZWR1bGUoZHluYW1pYyxjaHVua19zaXplKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MCwgQ0ZETUFYX1NJWkUtMQorICAgICAgICAgIHRpZHMoaSkgPSB0aWQKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgRE8gaT0wLCBDRkRNQVhfU0laRSAtIDIKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLm5lLiB0aWRzKGkrMSkgKSBUSEVOCisgICAgICAgICAgICBjb3VudCA9IGNvdW50ICsgMQorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgRE8KKyAKKyAgICAgICAgQUxMT0NBVEUoIHRtcCgwOmNvdW50KSApCisgICAgICAgIHRtcCgwKSA9IDEKKyAKKyAgICAgICAgRE8gaSA9IDAsIENGRE1BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdG1wX2NvdW50IC5HVC4gY291bnQgKSBUSEVOCisgICAgICAgICAgICBXUklURSgqLCopICItLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgIFdSSVRFKCosKikgIlRlc3RpbnRlcm5hbCBFcnJvcjogTGlzdCB0b28gc21hbGwhISEiCisgICAgICAgICAgICBXUklURSgqLCopICItLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgICAgICAgIEdPVE8gMTAKKyAgICAgICAgICBFTkQgSWYKKyAgICAgICAgICBJRiAoIHRpZHMoaSkgLk5FLiB0aWRzKGkrMSkgKSB0aGVuCisgICAgICAgICAgICB0bXBfY291bnQgPSB0bXBfY291bnQgKyAxCisgICAgICAgICAgICB0bXAodG1wX2NvdW50KSA9IDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICB0bXAodG1wX2NvdW50KSA9IHRtcCh0bXBfY291bnQpICsxCisgICAgICAgICAgRU5EIElGIAorICAgICAgICBFTkQgRE8gICAgICAgICAgCisKKyEuLi4gaXMgZHluYW1pYyBzdGF0ZW1lbnQgd29ya2luZz8gCisKKyAxMCAgICAgRE8gaT0wLCBjb3VudCAtMQorICAgICAgICAgIElGICggTU9EKHRtcChpKSxjaHVua19zaXplKSAubmUuIDAgKSBUSEVOCishIC4uLiBpdCBpcyBwb3NzaWJsZSBmb3IgMiBhZGphY2VudCBjaHVua3MgYXNzaWduZWQgdG8gYSBzYW1lIHRocmVhZCAKKyAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgIFdSSVRFKDEsKikgIlRoZSBpbnRlcm1lZGlhdGUgZGlzcGF0Y2ggaGFzIHdyb25nIGNodW5rc2l6ZS4iCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIElGICggTU9EKHRtcChjb3VudCksIGNodW5rX3NpemUpIC5ORS4gCisgICAgICYgICAgIE1PRCAoQ0ZETUFYX1NJWkUsIGNodW5rX3NpemUpICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJ0aGUgbGFzdCBkaXNwYXRjaCBoYXMgd3JvbmcgY2h1bmtzaXplLiIKKyAgICAgICAgRU5EIElGCisgICAgICAgICAKKyAgICAgICAgSUYgKCByZXN1bHQgLmVxLiAwKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL2RvX3NjaGVkdWxlX2d1aWRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjVkMGU3ZWQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfZ3VpZGVkLmYKQEAgLTAsMCArMSwxNzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgZ3VpZGVkIG9wdGlvbiBvZiB0aGUgb21wIGRvIHNjaGVkdWxlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGRvIHNjaGVkdWxlKGd1aWRlZCk8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2gsb21wIGRvIG5vd2FpdCxvbXAgY3JpdGljYWwsb21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICEgVE9ETzoKKyAgISBDLiBOaWV0aGFtbWVyOgorICAhICAgICAgIEZpbmQgY2hlY2sgdG8gZGVjaWRlIGlmIHRoZSB0ZXN0IHdhcyBydW4gYXMgc2NoZWR1bGUoc3RhdGljKSBiZWNhdXNlCisgICEgICAgICAgdGhpcyBhbHNvIGNhbiBwYXNzIHRoZSB0ZXN0IGlmIHRoZSB3b3JrIGlzIGRpdmlkZWQgaW50byB0aHJlYWQtY291bnRzIAorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPmRvX3NjaGVkdWxlX2d1aWRlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0sb21wX2dldF9udW1fdGhyZWFkcworICAgICAgICBDSEFSQUNURVIqMjAgbG9nZmlsZQorICAgICAgICBJTlRFR0VSIHRocmVhZHMKKyAgICAgICAgSU5URUdFUiB0bXBfY291bnQKKyAgICAgICAgSU5URUdFUiwgYWxsb2NhdGFibGUgOjogdG1wKDopCisgICAgICAgIElOVEVHRVIgaWksIGZsYWcKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKyAgICAgICAgSU5URUdFUiBleHBlY3RlZAorICAgICAgICBJTlRFR0VSIG9wZW53b3JrCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gYworCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgSU5URUdFUiB0aWQKKyAgICAgICAgSU5URUdFUiBjb3VudAorCisgICAgICAgIElOVEVHRVIgREVMQVkgCisgICAgICAgIElOVEVHRVIgTUFYX1RJTUUKKyAgICAgICAgSU5URUdFUiBDRlNNQVhfU0laRQorCishIC4uLiBjaG9vc2Ugc21hbGwgaXRlcmF0aW9uIHNwYWNlIGZvciBzbWFsbCBzeW5jLiBvdmVyaGVhZAorICAgICAgICBQQVJBTUVURVIgKERFTEFZID0gMSkKKyAgICAgICAgUEFSQU1FVEVSIChNQVhfVElNRSA9IDUpCisgICAgICAgIFBBUkFNRVRFUiAoQ0ZTTUFYX1NJWkUgPSAxNTApCisKKyAgICAgICAgSU5URUdFUiBub3RvdXQKKyAgICAgICAgSU5URUdFUiBtYXhpdGVyCisgICAgICAgIElOVEVHRVIgdGlkcygwOkNGU01BWF9TSVpFLTEpCisKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbm90b3V0LG1heGl0ZXIsdGlkcworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0ID0gMAorICAgICAgICBub3RvdXQgPSAxCisgICAgICAgIG1heGl0ZXIgPSAwCisgICAgICAgIGNvdW50ID0gMAorICAgICAgICB0bXBfY291bnQgPSAwCisgICAgICAgIG9wZW53b3JrID0gQ0ZTTUFYX1NJWkUKKzxvbXB0czpjaGVjaz4KKworISBEZXRlcm1pbmUgdGhlIG51bWJlciBvZiBhdmFpbGFibGUgdGhyZWFkcworISRvbXAgcGFyYWxsZWwgCishJG9tcCBzaW5nbGUKKyAgICAgICAgdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMoKQorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggdGhyZWFkcyAuTFQuIDIpIFRIRU4KKyAgICAgICAgICBQUklOVCAqLCJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIFdSSVRFKDEsKikgIlRoaXMgdGVzdCBvbmx5IHdvcmtzIHdpdGggYXQgbGVhc3QgdHdvIHRocmVhZHMiCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgICBTVE9QCisgICAgICAgIEVORCBJRgorCishIC4uLiBOb3cgdGhlIHJlYWwgcGFyYWxsZWwgd29yazoKKyEgLi4uIEVhY2ggdGhyZWFkIHdpbGwgc3RhcnQgaW1tZWRpYXRlbHkgd2l0aCB0aGUgZmlyc3QgY2h1bmsuCisgICAgCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHRpZCxjb3VudCkgc2hhcmVkKHRpZHMsbWF4aXRlcikKKyAgICAgICAgdGlkID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIHNjaGVkdWxlKGd1aWRlZCkKKyAgICAgICAgRE8gaSA9IDAgLCBDRlNNQVhfU0laRS0xCisgICAgICAgICAgY291bnQgPSAwCishJG9tcCBmbHVzaChtYXhpdGVyKQorICAgICAgICAgIElGICggaSAuR1QuIG1heGl0ZXIgKSBUSEVOICAgICAgICAgICAgICAgICAKKyEkb21wIGNyaXRpY2FsCisgICAgICAgICAgICBtYXhpdGVyID0gaQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgRU5EIElGCisKKyEuLiAgICAgICAgIGlmIGl0IGlzIG5vdCBvdXIgdHVybiB3ZSB3YWl0CishICAgICAgICAgICBhKSB1bnRpbCBhbm90aGVyIHRocmVhZCBleGVjdXRlZCBhbiBpdGVyYXRpb24KKyEgICAgICAgICAgIHdpdGggYSBoaWdoZXIgaXRlcmF0aW9uIGNvdW50CishICAgICAgICAgICBiKSB3ZSBhcmUgYXQgdGhlIGVuZCBvZiB0aGUgbG9vcCAoZmlyc3QgdGhyZWFkIGZpbmlzaGVkCishICAgICAgICAgICAgIGFuZCBzZXQgbm90b3V0PTAgT1IKKyEgICAgICAgICAgIGMpIHRpbWVvdXQgYXJyaXZlZCAKKworISRvbXAgZmx1c2gobWF4aXRlcixub3RvdXQpCisgICAgICAgICAgSUYgKCBub3RvdXQgLkdFLiAxIC5BTkQuIGNvdW50IC5MVC4gTUFYX1RJTUUKKyAgICAgJiAgICAgICAgIC5BTkQuIG1heGl0ZXIgLkVRLiBpICkgVEhFTgorICAgICAgICAgICAgICBETyBXSElMRSAoIG5vdG91dCAuR0UuIDEgLkFORC4gY291bnQgLkxULiBNQVhfVElNRQorICAgICAmICAgICAgICAgIC5BTkQuIG1heGl0ZXIgLkVRLiBpICkKKyAgICAgICAgICAgICAgICBDQUxMIHNsZWVwKERFTEFZKQorICAgICAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyBERUxBWQorICAgICAgICAgICAgICBFTkQgRE8gICAgICAgICAKKyAgICAgICAgICBFTkQgSUYKKyAgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbyBub3dhaXQKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisKKyAgICAgICAgbm90b3V0ID0gMAorISRvbXAgZmx1c2gobm90b3V0KQorCishJG9tcCBlbmQgcGFyYWxsZWwgCisKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIQorISBldmFsdWF0aW9uIG9mIHRoZSB2YWx1ZXMKKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIQorICAgICAgICBjb3VudCA9IDAKKworICAgICAgICBETyBpPTAsIENGU01BWF9TSVpFIC0gMgorICAgICAgICAgIElGICggdGlkcyhpKSAuTkUuIHRpZHMoaSsxKSApIFRIRU4KKyAgICAgICAgICAgIGNvdW50ID0gY291bnQgKyAxCisgICAgICAgICAgRU5EIElGCisgICAgICAgIEVORCBETworCisgICAgICAgIEFMTE9DQVRFKCB0bXAoMDpjb3VudCkgICkKKyAgICAgICAgdG1wX2NvdW50ID0gMAorICAgICAgICB0bXAoMCkgPSAxCishIC4uLiBjYWxjdWxhdGUgdGhlIGNodW5rc2l6ZSBmb3IgZWFjaCBkaXNwYXRjaAorCisgICAgICAgIERPIGk9MCwgQ0ZTTUFYX1NJWkUgLSAyCisgICAgICAgICAgSUYgKCB0aWRzKGkpIC5FUS4gdGlkcyhpKzEpICkgVEhFTgorICAgICAgICAgICB0bXAodG1wX2NvdW50KSA9IHRtcCh0bXBfY291bnQpICsgMQorICAgICAgICAgIEVMU0UKKyAgICAgICAgICAgIHRtcF9jb3VudCA9IHRtcF9jb3VudCArIDEKKyAgICAgICAgICAgIHRtcCh0bXBfY291bnQpID0gMQorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgRE8KKworISAuLi4gQ2hlY2sgaWYgY2h1bmsgc2l6ZXMgYXJlIGRlY3JlYXNlZCB1bnRpbCBlcXVhbHMgdG8gCishIC4uLiB0aGUgc3BlY2lmaWVkIG9uZSwgaWdub3JlIHRoZSBsYXN0IGRpc3BhdGNoIAorISAuLi4gZm9yIHBvc3NpYmxlIHNtYWxsZXIgcmVtYWluZGVyCisKKyEgRGV0ZXJtaW5lIHRoZSBjb25zdGFudCAKKyAgICAgICAgZXhwZWN0ZWQgPSBvcGVud29yayAvIHRocmVhZHMKKyAgICAgICAgYyA9IHJlYWwodG1wKDApKSAvIHJlYWwoZXhwZWN0ZWQpCisgICAgICAgIFdSSVRFKDEsKikgIkZvdW5kIGNvbnN0YW50IHRvIGJlICIsIGMKKworICAgICAgICBETyBpID0gMCwgY291bnQgLSAyCisgICAgICAgICAgV1JJVEUoMSwqKSAib3BlbjoiLCBvcGVud29yaywgInNpemU6IiwgdG1wKGkpCisgICAgICAgICAgSUYgKGV4cGVjdGVkIC5HVC4gMSkgVEhFTgorICAgICAgICAgICAgZXhwZWN0ZWQgPSBjICogb3BlbndvcmsgLyB0aHJlYWRzCisgICAgICAgICAgRU5EIElGCisKKyAgICAgICAgICBJRiAoYWJzKHRtcChpKSAtIGV4cGVjdGVkKSAuR0UuIDIgKSBUSEVOCisgICAgICAgICAgICByZXN1bHQgPSAxCisgICAgICAgICAgICBXUklURSgxLCopICJDaHVua3NpemUgZGlmZmVyZWQgZnJvbSBleHBlY3RlZCAiLAorICAgICAmICAgICAgICAgInZhbHVlOiAiLHRtcChpKSwgImluc3RlYWQgIiwgZXhwZWN0ZWQKKyAgICAgICAgICBFTkQgSUYKKworICAgICAgICAgIElGIChpIC5HVC4gMCAuQU5ELiAodG1wKGktMSkgLSB0bXAoaSkpIC5MVC4gMCkgVEhFTgorICAgICAgICAgICAgV1JJVEUoMSwqKSAiQ2h1bmtzaXplIGRpZCBub3QgZGVjcmVhc2U6ICIsIHRtcChpKSwKKyAgICAgJiAgICAgICAgICJpbnN0ZWFkIix0bXAoaS0xKQorICAgICAgICAgIEVORCBJRgorCisgICAgICAgICAgb3BlbndvcmsgPSBvcGVud29yayAtIHRtcChpKSAgCisgICAgICAgIEVORCBETworCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEgCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6Y2hlY2s+Cis8b21wdHM6Y3Jvc3NjaGVjaz4KKyAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICBFTkQKKzwvb21wdHM6Y3Jvc3NjaGVjaz4KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tdHBzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vZG9fc2NoZWR1bGVfc3RhdGljLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uN2FiMDJmOAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9kb19zY2hlZHVsZV9zdGF0aWMuZgpAQCAtMCwwICsxLDcwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIHN0YXRpYyBvcHRpb24gb2YgdGhlIG9tcCBkbyBzY2hlZHVsZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBkbyBzY2hlZHVsZShzdGF0aWMpPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGRvIG5vd2FpdCxvbXAgZmx1c2gsb21wIGNyaXRpY2FsLG9tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+ZG9fc2NoZWR1bGVfc3RhdGljPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bSxvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIENIQVJBQ1RFUiozMCBsb2dmaWxlCisgICAgICAgIElOVEVHRVIgdGhyZWFkcworICAgICAgICBJTlRFR0VSIGNvdW50CisgICAgICAgIElOVEVHRVIgaWkKKyAgICAgICAgSU5URUdFUiByZXN1bHQKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBDRlNNQVhfU0laRQorICAgICAgICBQQVJBTUVURVIgKENGU01BWF9TSVpFID0gMTAwMCkKKyAgICAgICAgSU5URUdFUiBpLHRpZHMoMDpDRlNNQVhfU0laRS0xKSwgdGlkLCBjaHVua19zaXplCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGksdGlkLHRpZHMsY2h1bmtfc2l6ZQorPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjaHVua19zaXplID0gNworICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIGlpID0gMAorCishJG9tcCBwYXJhbGxlbCAKKyEkb21wIHNpbmdsZQorICAgICAgICB0aHJlYWRzID0gb21wX2dldF9udW1fdGhyZWFkcygpCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIHRocmVhZHMgLkxULiAyKSBUSEVOCisgICAgICAgICAgUFJJTlQgKiwiVGhpcyB0ZXN0IG9ubHkgd29ya3Mgd2l0aCBhdCBsZWFzdCB0d28gdGhyZWFkcyIKKyAgICAgICAgICBXUklURSgxLCopICJUaGlzIHRlc3Qgb25seSB3b3JrcyB3aXRoIGF0IGxlYXN0IHR3byB0aHJlYWRzIgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgICAgU1RPUAorICAgICAgICBFTFNFCisgICAgICAgICAgV1JJVEUoMSwqKSAiVXNpbmcgYW4gaW50ZXJuYWwgY291bnQgb2YgIixDRlNNQVhfU0laRQorICAgICAgICAgIFdSSVRFKDEsKikgIlVzaW5nIGEgc3BlY2lmaWVkIGNodW5rc2l6ZSBvZiAiLGNodW5rX3NpemUKKyAgICAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUodGlkKSBzaGFyZWQodGlkcykKKyAgICAgICAgICB0aWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKQorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIDxvbXB0czpjaGVjaz5zY2hlZHVsZShzdGF0aWMsY2h1bmtfc2l6ZSk8L29tcHRzOmNoZWNrPgorICAgICAgICAgIERPIGkgPSAwICxDRlNNQVhfU0laRSAtMQorICAgICAgICAgICAgdGlkcyhpKSA9IHRpZAorICAgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgICAgRE8gaSA9IDAsIENGU01BWF9TSVpFLTEKKyEuLi4gcm91bmQtcm9iaW4gZm9yIHN0YXRpYyBjaHVuaworICAgICAgICAgICAgaWkgPSBtb2QoIGkvY2h1bmtfc2l6ZSx0aHJlYWRzKQorICAgICAgICAgICAgSUYgKHRpZHMoaSkgLk5FLiBpaSApIFRIRU4KKyAgICAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICAgICBXUklURSgxLCopIkl0ZXJhdGlvbiAiLGksInNob3VsZCBiZSBhc3NpZ25lZCB0byAiLAorICAgICAmICAgICAgICAgICBpaSwiaW5zdGVhZCBvZiAiLHRpZHMoaSkKKyAgICAgICAgICAgIEVORCBJRgorICAgICAgICAgIEVORCBETworICAgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCApVEhFTgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgICBFTFNFCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9oYXNfb3Blbm1wLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1ODVlZjIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vaGFzX29wZW5tcC5mCkBAIC0wLDAgKzEsMjUgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnZlcnNpb24+Mi4wPC9vbXB0czp2ZXJzaW9uPgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0aW5nIGlmIHRoZSBjb25kaXRpb25hbCBjb21waWxhdGlvbiBpcyBzdXBwb3J0ZWQgb3Igbm90LiAgCitZaSBXZW4gYXQgMDUwMzIwMDQ6IERvIHdlIHdhbnQgdG8gd3JpdGUgdHdvIHZlcnNpb25zIG9mIGhhc19vbXA/ICBib3RoIEMyMzQ1Njc4OSAKK2FuZCAjaWZkZWYgZm9ybWF0cyBhcmUgc3VwcG9zZWQgdG8gd29yay4gQXQgbGVhc3QgU3VuJ3MgY29tcGlsZXIgY2Fubm90IGRlYWwgd2l0aCAKK3RoZSBzZWNvbmQgZm9ybWF0ICgjaWZkZWYpPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+CisKKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5oYXNfb3Blbm1wPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKworPG9tcHRzOmNoZWNrPgorIXZlcnNpb24gMS4KKyFDMjM0NTY3ODkgCishJCAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKworISB2ZXJzaW9uIDIuCishI2lmZGVmIF9PUEVOTVAKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyEjZW5kaWYKKzwvb21wdHM6Y2hlY2s+CisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYXRvbWljLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmVlNzQ0NTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2F0b21pYy5mCkBAIC0wLDAgKzEsNTg4IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBhdG9taWMgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBwYXJhbGxlbGl6ZWQgbG9vcCB3aXRoIGFuIGF0b21pYyBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBhdG9taWM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyEqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBGdW5jdGlvbnM6IG9tcF9hdG9taWMKKyEgY2hhbmdlICJjaGFyYWN0ZXIqMjAiIGludG8gImNoYXJhY3RlciAoTEVOPTIwKTo6IgorISBnZXQgcmlkIG9mIHRoZSAidGFiIiBrZXkgYnkgWmhlbnlpbmcgTGl1LCBvbiBPY3QuIDE2LCAyMDA1LgorISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2F0b21pYzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBJTlRFR0VSIHN1bTIsIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIGtub3duX3Byb2R1Y3QsIGludF9jb25zdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHJvdW5kaW5nX2Vycm9yLCBkcHQKKyAgICAgICAgSU5URUdFUiBkb3VibGVfRElHSVRTCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTIpCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLGksZGlmZixwcm9kdWN0CisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxkdCxkZGlmZgorICAgICAgICBMT0dJQ0FMIGxvZ2ljX2FuZCwgbG9naWNfb3IsIGxvZ2ljX2Vxdixsb2dpY19uZXF2CisgICAgICAgIElOVEVHRVIgYml0X2FuZCwgYml0X29yCisgICAgICAgIElOVEVHRVIgZXhjbHVzaXZfYml0X29yCisgICAgICAgIElOVEVHRVIgbWluX3ZhbHVlLCBtYXhfdmFsdWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkbWluLCBkbWF4CisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBpbnRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0scHJvZHVjdCxkaWZmLGksZHN1bSxkZGlmZixkdCxsb2dpY19hbmQsCisgICAgICYgICAgbG9naWNfb3IsbG9naWNfZXF2LGxvZ2ljX25lcXYsbG9naWNzLGJpdF9hbmQsYml0X29yLGludF9hcnJheSwKKyAgICAgJiAgICBleGNsdXNpdl9iaXRfb3IsbWluX3ZhbHVlLGRtaW4sZG1heCxkX2FycmF5LG1heF92YWx1ZQorICAgICAgICBJTlRFR0VSIE1BWF9GQUNUT1IKKyAgICAgICAgUEFSQU1FVEVSIChkb3VibGVfRElHSVRTPTIwLE1BWF9GQUNUT1I9MTApCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPTEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgIHN1bSwiaW5zdGVhZCBvZiAiLCBrbm93bl9zdW0KKyAgICAgICAgRU5EIElmCisKKyAgICAgICAgZGlmZiA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPTEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRpZmYgPSBkaWZmIC0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgIGRpZmYsImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgZm9yIGRvdWJsZXMKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIGRwdCA9IDEKKworICAgICAgICBETyBpPTEsIERPVUJMRV9ESUdJVFMKKyAgICAgICAgICBkcHQ9IGRwdCAqIGR0CisgICAgICAgIEVORCBETworICAgICAgICBka25vd25fc3VtID0gKDEtZHB0KS8oMS1kdCkKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MCxET1VCTEVfRElHSVRTLTEKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworIAorICAgICAgICBJRiAoZHN1bSAuTkUuIGRrbm93bl9zdW0gLkFORC4gCisgICAgICYgICAgIEFCUyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBzdW0gd2l0aCBkb3VibGVzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihEaWZmZXJlbmNlOiAiLAorICAgICAmICAgICAgIGRzdW0gLSBka25vd25fc3VtLCIpIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgZHB0ID0gMQorCisgICAgICAKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkZGlmZiA9ICggMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0wLCBET1VCTEVfRElHSVRTLTEKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBBQlMoZGRpZmYpIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkZGlmZiwiaW5zdGVhZCBvZiAwLjAiCisgICAgICAgIEVORCBJRgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsTUFYX0ZBQ1RPUgorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfYW5kKSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAobG9naWNfb3IpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19vciA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19vciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgT1IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIEVRViwgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5UUlVFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19lcXYgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCAuTk9ULiBsb2dpY19uZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyEuLi4gaWFuZChJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gQU5EIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5MVC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJZgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiggYml0X2FuZCAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBJb3IoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIE9SIG9mIAorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLiAKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICBiaXRfb3IgPSBJb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5sZS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgZG8gCisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKzxvbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxMCAtIGkKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbWluX3ZhbHVlID0gNjU1MzUKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBkbyAKKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorPG9tcHRzOmNoZWNrPgorISRvbXAgYXRvbWljCis8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIG1heF92YWx1ZSAuTFQuIExPT1BDT1VOVCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBpbnRlZ2VyIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gdGVzdCBkb3VibGUgbWluLCBtYXgKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCis8b21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0gIDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2JhcnJpZXIuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfYmFycmllci5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUxMjU5OTQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2JhcnJpZXIuZgpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBiYXJyaWVyIGRpcmVjdGl2ZS4gVGhlIHRlc3QgICAgY3JlYXRlcyBzZXZlcmFsIHRocmVhZHMgYW5kIHNlbmRzIG9uZSBvZiB0aGVtIHNsZWVwaW5nIGJlZm9yZSBzZXR0aW5nIGEgZmxhZy4gIEFmdGVyIHRoZSBiYXJyaWVyIHRoZSBvdGhlciBvbmVzIGRvIHNvbWUgbGl0dGxlIHdvcmsgZGVwZW5kaW5nIG9uIHRoZSBmbGFnLjwvICAgb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgYmFycmllcjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorCisgICAgICBTVUJST1VUSU5FIGRvX3NvbWVfd29yazMoKQorICAgICAgICBSRUFMIGkKKyAgICAgICAgSU5UUklOU0lDIHNxcnQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBzdW0KKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwLjAKKyAgICAgICAgRE8gV0hJTEUgKGkgPCBMT09QQ09VTlQtMSkKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzcXJ0KGkpCisgICAgICAgICAgaSA9IGkgKyAxCisgICAgICAgIEVORCBETworICAgICAgRU5ECisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfYmFycmllcjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzbGVlcHRpbWUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgSU5URUdFUiByZXN1bHQxLCByZXN1bHQyLCByYW5rCisgICAgICAgIHJlc3VsdDEgPSAwCisgICAgICAgIHJlc3VsdDIgPSAwCisgICAgICAgIHNsZWVwdGltZSA9IDEKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpCishICAgICAgICBQUklOVCAqLCAicmFuayIsIHJhbmsKKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMSApIFRIRU4KKyAgICAgICAgICBDQUxMIHNsZWVwKHNsZWVwdGltZSkKKyAgICAgICAgICByZXN1bHQyID0gMworICAgICAgICBFTkQgSUYKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgYmFycmllcgorICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgSUYgKCByYW5rIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICByZXN1bHQxID0gcmVzdWx0MgorICAgICAgICBFTkQgSUYKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRiAoIHJlc3VsdDEgLkVRLiAzICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jb3B5aW4uZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzE0ZjE0OQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY29weWluLmYKQEAgLTAsMCArMSw0NyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgY29weWluIGRpcmVjdGl2ZS48LyAgIG9tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGNvcHlpbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CishIENoYW5nZWxvZzoKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfY29weWluPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBJTlRFR0VSLCBTQVZFOjpzdW0xIAorISAgICAgICAgaW1wbGljaXRseSBieSBvbXBfdGhyZWFkcHJpdmF0ZSwgc2VlIHNwZWMyNSBDaGFwLiAyLjguMgorICAgICAgICBJTlRFR0VSIHN1bTEKKyAgICAgICAgQ09NTU9OIC9jc3VtMS8gc3VtMQorICAgICAgICBJTlRFR0VSIHN1bSwgaSwgdGhyZWFkcworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sIGksIHRocmVhZHMKKyEgICBDLiBOaWV0aGFtbWVyIDMwLjExLjA2OiBtb3ZlZCB0aHJlYWRwcml2YXRlIHN0YXRlbWVudCBpbnRvIHRoZSBvcnBoYW5lZAorISAgICAgIGZ1bmN0aW9uCishJG9tcCB0aHJlYWRwcml2YXRlKC9jc3VtMS8pCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBzdW0xID0gNworICAgICAgICB0aHJlYWRzID0gMAorCQk8b21wdHM6b3JwaGFuPgorISRvbXAgcGFyYWxsZWwgPG9tcHRzOmNoZWNrPmNvcHlpbihzdW0xKTwvb21wdHM6Y2hlY2s+CishICAgICAgICBwcmludCAqLCJzdW0xIixzdW0xCishJG9tcCBkbworICAgICAgICBETyBpPTEsIDk5OQorICAgICAgICAgIHN1bTEgPSBzdW0xICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTEKKyAgICAgICAgdGhyZWFkcyA9IHRocmVhZHMgKyAxCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbAorCQk8L29tcHRzOm9ycGhhbj4KKyAgICAgICAga25vd25fc3VtID0gOTk5KjEwMDAvMiArIDcqdGhyZWFkcworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfY3JpdGljYWwuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi44OTJkZDJiCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9jcml0aWNhbC5mCkBAIC0wLDAgKzEsNTkgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIGNyaXRpY2FsIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHJlZ2lvbiB3aXRoaW4gYSBjcml0aWNhbCBzZWN0aW9uLgorCis8L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIGNyaXRpY2FsPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2NyaXRpY2FsPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaSxqLG15aSxteWosIHN1bQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sIG15aSwgbXlqCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgbXlpID0gMAorICAgICAgICBteWogPSA1MDAKKyEkb21wIHBhcmFsbGVsCishJG9tcCBzZWN0aW9ucworCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAwICwgNDk5CisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgIHN1bSA9IHN1bSArIG15aQorICAgICAgICAgICBteWkgPSBteWkgKyAxCisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaiA9IDUwMCAsIDk5OQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICBzdW0gPSBzdW0gKyBteWoKKyAgICAgICAgICAgbXlqID0gbXlqICsgMQorICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHNlY3Rpb25zCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gOTk5KjEwMDAvMgorICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgV1JJVEUgKDEsKikgIkZvdW5kIHN1bSB3YXMiLCBzdW0sICJpbnN0ZWFkIiwga25vd25fc3VtCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2ZsdXNoLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMzBkYWY1MAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZmx1c2guZgpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBmbHVzaCBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBmbHVzaDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBiYXJyaWVyPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9mbHVzaDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiByZXN1bHQxLCBkdW1teSwgcmFuaworICAgICAgICBJTlRFR0VSIG9tcF9nZXRfdGhyZWFkX251bQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgcmVzdWx0MgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyByZXN1bHQyCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHJlc3VsdDE9MAorICAgICAgICByZXN1bHQyPTAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpCishJG9tcCBiYXJyaWVyCisgICAgICAgIElGICggcmFuayAuRVEuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0MiA9IDMKKyAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGZsdXNoKHJlc3VsdDIpCisgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgICBkdW1teSA9IHJlc3VsdDIKKyAgICAgICAgRU5EIElGCisgICAgICAgIElGICggcmFuayAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgY2FsbCBzbGVlcCgxKQorICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZmx1c2gocmVzdWx0MikKKyAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQyCisgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyEgICAgICAgIFBSSU5UICosIjE6IiwgcmVzdWx0MSwgIjI6IiwgcmVzdWx0MiwgImR1bW15IiwgZHVtbXkKKyAgICAgICAgSUYgKCAocmVzdWx0MSAuRVEuIHJlc3VsdDIpIC5BTkQuIChyZXN1bHQyIC5FUS4gZHVtbXkpIC5BTkQuCisgICAgICYgICAgICAgKHJlc3VsdDIgLkVRLiAzKSApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X251bV90aHJlYWRzLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQ2N2FkOWYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2dldF9udW1fdGhyZWFkcy5mCkBAIC0wLDAgKzEsMzcgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGF0IHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIHJldHVybnMgdGhlIGNvcnJlY3QgbnVtYmVyIG9mIHRocmVhZHMuIFRoZXJlZm9yIGl0IGNvdW50cyB1cCBhIHZhcmlhYmxlIGluIGEgcGFyYWxsZWxpemVkIHNlY3Rpb24gYW5kIGNvbXBhcnMgdGhpcyB2YWx1ZSB3aXRoIHRoZSByZXN1bHQgb2YgdGhlIG9tcF9nZXRfbnVtX3RocmVhZHMgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWwsc29tcCBzaW5nbGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfbnVtX3RocmVhZHM8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTlRFR0VSIG50aHJlYWRzCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcworCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgbnRocmVhZHNfbGliCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzX2xpYgorCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBudGhyZWFkcz0wCisgICAgICAgIG50aHJlYWRzX2xpYj0tMQorCishJG9tcCBwYXJhbGxlbAorIXNoYXJlZChudGhyZWFkcyxudGhyZWFkc19saWIpCishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzaW5nbGUKKwkJPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPgorICAgICAgICBudGhyZWFkc19saWI9b21wX2dldF9udW1fdGhyZWFkcygpCisJCTwvb21wdHM6Y2hlY2s+CisJCTwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGIChudGhyZWFkcyAuRVEuIG50aHJlYWRzX2xpYikgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X3d0aWNrcy5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9nZXRfd3RpY2tzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzYyZDAzZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfZ2V0X3d0aWNrcy5mCkBAIC0wLDAgKzEsMjggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX2dldF93dGljayBmdW5jdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX2dldF93dGljazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9nZXRfd3RpY2tzPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHRpY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gdGljaworICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCis8L29tcHRzOm9ycGhhbjp2YXJzPgorISAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBvbXBfZ2V0X3d0aWNrCisgICAgICAgIHRpY2sgPSAxCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKzxvbXB0czpjaGVjaz4KKyAgICAgICAgdGljaz1vbXBfZ2V0X3d0aWNLKCkKKzwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIFdSSVRFKDEsKikgIndvcmsgdG9vayIsdGljaywic2VjLiB0aW1lLiIKKyAgICAgICAgSUYodGljayAuR1QuIDAuIC5BTkQuIHRpY2sgLkxULiAwLjAxKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX2luX3BhcmFsbGVsLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNDVlZGZmNgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfaW5fcGFyYWxsZWwuZgpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCBvbXBfaW5fcGFyYWxsZWwgcmV0dXJucyBmYWxzZSB3aGVuIGNhbGxlZCBmcm9tIGEgc2VyaWFsIHJlZ2lvbiBhbmQgdHJ1ZSB3aGVuIGNhbGxlZCB3aXRoaW4gYSBwYXJhbGxlbCByZWdpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9pbl9wYXJhbGxlbDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCishICAgY2hlY2tzIHRoYXQgZmFsc2UgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgZnJvbSBzZXJpYWwgcmVnaW9uCishICAgYW5kIHRydWUgaXMgcmV0dXJuZWQgd2hlbiBjYWxsZWQgd2l0aGluIHBhcmFsbGVsIHJlZ2lvbgorICAgICAgICBMT0dJQ0FMIG9tcF9pbl9wYXJhbGxlbAorCQk8b21wdHM6b3JwaGFuOnZhcnM+CishICAgICAgICBMT0dJQ0FMIG9tcF9pbl9wYXJhbGxlbAorICAgICAgICBMT0dJQ0FMIHNlcmlhbCwgcGFyYWxsZWwKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc2VyaWFsLCBwYXJhbGxlbAorCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBzZXJpYWw9LlRSVUUuCisgICAgICAgIHBhcmFsbGVsPS5GQUxTRS4KKworCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIHNlcmlhbD1vbXBfaW5fcGFyYWxsZWwoKQorCQk8L29tcHRzOmNoZWNrPgorCQk8L29tcHRzOm9ycGhhbj4KKworISRvbXAgcGFyYWxsZWwKKyEkb21wIHNpbmdsZQorCQk8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CisgICAgICAgIHBhcmFsbGVsPW9tcF9pbl9wYXJhbGxlbCgpOworCQk8L29tcHRzOmNoZWNrPgorCQk8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKC5OT1QuIHNlcmlhbCkgLkFORC4gKHBhcmFsbGVsKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbG9jay5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjkwMjZjNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbG9jay5mCkBAIC0wLDAgKzEsNTggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wX3NldF9sb2NrICBhbmQgdGhlIG9tcF91bnNldF9sb2NrIGZ1bmN0aW9uIGJ5IGNvdW50aW5nIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aXRoIGxvY2tzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUKKyAgICAgICAgSU5URUdFUiBucl9pdGVyYXRpb25zCisgICAgICAgIElOVEVHRVIgaQorIWxvY2sgdmFyaWFibGUKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTE9DS19LSU5EKSA6OiBsb2NrCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGxvY2sKKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyFyZXN1bHQgaXM6CishICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAxIC0tIGlmIHRoZSB0ZXN0IHN1Y2NlZWRzCisgICAgICAgIENBTEwgb21wX2luaXRfbG9jayhsb2NrKQorICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICByZXN1bHQ9MAorISRvbXAgcGFyYWxsZWwgc2hhcmVkKGxvY2ssbnJfdGhyZWFkc19pbl9zaW5nbGUsbnJfaXRlcmF0aW9ucyxyZXN1bHQpCishJG9tcCBkbworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgb21wX3NldF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlKzEKKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZT1ucl90aHJlYWRzX2luX3NpbmdsZS0xCisgICAgICAgICAgcmVzdWx0PXJlc3VsdCtucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBDQUxMIG9tcF91bnNldF9sb2NrKGxvY2spCisgICAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBvbXBfZGVzdHJveV9sb2NrKGxvY2spCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORElmCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlci5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi42NWUxZjNkCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9tYXN0ZXIuZgpAQCAtMCwwICsxLDM5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXI8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisJCTxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBudGhyZWFkcywgZXhlY3V0aW5nX3RocmVhZAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBudGhyZWFkcywgZXhlY3V0aW5nX3RocmVhZAorCQk8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBudGhyZWFkcz0wCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9LTEKKworISRvbXAgcGFyYWxsZWwKKwkJPG9tcHRzOm9ycGhhbj4KKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgbWFzdGVyCisJCTwvb21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICBudGhyZWFkcyA9IG50aHJlYWRzICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGV4ZWN1dGluZ190aHJlYWQ9b21wX2dldF90aHJlYWRfbnVtKCkKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG1hc3RlcgorCQk8L29tcHRzOmNoZWNrPgorCQk8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKG50aHJlYWRzIC5FUS4gMSkgLkFORC4gKGV4ZWN1dGluZ190aHJlYWQgLkVRLiAwKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX21hc3Rlcl8zLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTIyMmM0OAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbWFzdGVyXzMuZgpAQCAtMCwwICsxLDQ5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBtYXN0ZXIgZGlyZWN0aXZlIGJ5IGNvdW50aW5nIHVwIGEgdmFyaWFibGUgaW4gYSBvbXAgbWFzdGVyIHNlY3Rpb24uIEl0IGFsc28gY2hlY2tzIHRoYXQgdGhlIG1hc3RlciB0aHJlYWQgaGFzIHRoZSB0aHJlYWQgbnVtYmVyIDAgYXMgc3BlY2lmaWVkIGluIHRoZSBPcGVuTVAgc3RhbmRhcmQgdmVyc2lvbiAzLjAuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBtYXN0ZXI8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9tYXN0ZXJfMzwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkCisgICAgICAgIElOVEVHRVIgdGlkX3Jlc3VsdCAhIGNvdW50cyB1cCB0aGUgbnVtYmVyIG9mIHdyb25nIHRocmVhZCBuby4KKyAgICAgICAgICAgICAgICAgICAgICAgICAgICEgZm9yIHRoZSBtYXN0ZXIgdGhyZWFkCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG50aHJlYWRzLCBleGVjdXRpbmdfdGhyZWFkLCB0aWRfcmVzdWx0CisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHRpZF9yZXN1bHQgPSAwCisgICAgICAgIG50aHJlYWRzPTAKKyAgICAgICAgZXhlY3V0aW5nX3RocmVhZD0tMQorCishJG9tcCBwYXJhbGxlbAorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCBtYXN0ZXIKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgaWYgKG9tcF9nZXRfdGhyZWFkX251bSgpIC5uZS4gMCkgdGhlbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIHRpZF9yZXN1bHQgPSB0aWRfcmVzdWx0ICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIGVuZCBpZgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgbnRocmVhZHMgPSBudGhyZWFkcyArIDEKKyEkb21wIGVuZCBjcml0aWNhbAorICAgICAgICBleGVjdXRpbmdfdGhyZWFkPW9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIGVuZCBtYXN0ZXIKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIChudGhyZWFkcyAuRVEuIDEpIC5BTkQuIChleGVjdXRpbmdfdGhyZWFkIC5FUS4gMCkgLkFORC4KKyAgICAgJiAgICAgICAodGlkX3Jlc3VsdCAuRVEuIDApICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0X2xvY2suZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uOWI5ZTNhYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbmVzdF9sb2NrLmYKQEAgLTAsMCArMSw1OSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfc2V0X25lc3RfbG9jayBhbmQgdGhlIG9tcF91bnNldF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9uZXN0X2xvY2s8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgZmx1c2g8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9uZXN0X2xvY2s8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCishcmVzdWx0IGlzOgorISAgMCAtLSBpZiB0aGUgdGVzdCBmYWlscworISAgMSAtLSBpZiB0aGUgdGVzdCBzdWNjZWVkcworICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF9saWIuaCIKKyAgICAgICAgSU5URUdFUiAoS0lORD1PTVBfTkVTVF9MT0NLX0tJTkQpIDo6IGxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIG9tcF9pbml0X25lc3RfbG9jayhsb2NrKQorICAgICAgICByZXN1bHQ9MAorCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIENBTEwgb21wX3NldF9uZXN0X2xvY2sobG9jaykKKyAgICAgICAgICAgICAgICA8L29tcHRzOmNoZWNrPgorICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISRvbXAgZmx1c2gKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgbnJfaXRlcmF0aW9ucz1ucl9pdGVyYXRpb25zKzEKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUtMQorICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIENBTEwgb21wX3Vuc2V0X25lc3RfbG9jayhsb2NrKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICBDQUxMIG9tcF9kZXN0cm95X25lc3RfbG9jayhsb2NrKQorISAgICAgICAgICAgICAgIFBSSU5UICosIHJlc3VsdCwgbnJfaXRlcmF0aW9ucworICAgICAgICBJRihyZXN1bHQuRVEuMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX25lc3RlZC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41NDM1MTUxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9uZXN0ZWQuZgpAQCAtMCwwICsxLDUzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCBpZiB0aGUgY29tcGlsZXIgc3VwcG9ydCBuZXN0ZWQgcGFyYWxsZWxpc20uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6dmVyc2lvbj4yLjU8L29tcHRzOnZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm5lc3RlZHRlc3Q8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF9uZXN0ZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBjb3VudGVyCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGNvdW50ZXIKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgY291bnRlciA9MAorICAgICAgICAKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISQgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5UUlVFLikKKyEjaWZkZWYgX09QRU5NUAorISAgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5UUlVFLikgCishI2VuZGlmCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDxvbXB0czpjcm9zc2NoZWNrPgorISQgICAgICBDQUxMIE9NUF9TRVRfTkVTVEVEKC5GQUxTRS4pCishI2lmZGVmIF9PUEVOTVAKKyEgICAgICAgQ0FMTCBPTVBfU0VUX05FU1RFRCguRkFMU0UuKQorISNlbmRpZgorICAgICAgICA8L29tcHRzOmNyb3NzY2hlY2s+CisKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisKKyEkb21wIHBhcmFsbGVsCishJG9tcCBjcml0aWNhbAorICAgICAgICAgIGNvdW50ZXIgPSBjb3VudGVyIC0gMQorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgCisgICAgICAgIElGIChjb3VudGVyIC5FUS4gMCApIFRIRU4KKyAgICAgICAgICAgV1JJVEUgKDEsKikgIkNvdW50ZXIgd2FzIDAiCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgV1JJVEUgKDEsKikgIkNvdW50ZXIgd2FzIiwgY291bnRlcgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTkQgSUYgCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX251bV90aHJlYWRzLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTFlZGU3MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfbnVtX3RocmVhZHMuZgpAQCAtMCwwICsxLDYwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhhdCB0aGUgb21wX2dldF9udW1fdGhyZWFkcyByZXR1cm5zIHRoZSBjb3JyZWN0IG51bWJlciBvZiB0aHJlYWRzLiBUaGVyZWZvciBpdCBjb3VudHMgdXAgYSB2YXJpYWJsZSBpbiBhIHBhcmFsbGVsaXplZCBzZWN0aW9uIGFuZCBjb21wYXJzIHRoaXMgdmFsdWUgd2l0aCB0aGUgcmVzdWx0IG9mIHRoZSBvbXBfZ2V0X251bV90aHJlYWRzIGZ1bmN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXBfZ2V0X251bV90aHJlYWRzPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX251bV90aHJlYWRzPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGksIG1heF90aHJlYWRzCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcworPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIGZhaWxlZCx0aHJlYWRzLG50aHJlYWRzLHRtcAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBmYWlsZWQsdGhyZWFkcyxudGhyZWFkcworPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBmYWlsZWQgPSAwCisgICAgICAgIG1heF90aHJlYWRzID0gMAorICAgICAgICAgCishJG9tcCBwYXJhbGxlbAorISRvbXAgbWFzdGVyCisgICAgICAgIG1heF90aHJlYWRzID0gT01QX0dFVF9OVU1fVEhSRUFEUygpICAgICAgIAorISRvbXAgZW5kIG1hc3RlcgorISRvbXAgZW5kIHBhcmFsbGVsCishICAgICAgICAgcHJpbnQgKiwgIm1heCB0aHJlYWRzOiIsbWF4X3RocmVhZHMKKworIVlpIFdlbiBhZGRlZCBvbXBfU2V0X2R5bmFtaWNzIGhlcmUgdG8gbWFrZSBzdXJlIG51bV90aHJlYWRzIGNsYXVzZSB3b3JrCishVGhhbmtzIHRvIERyLiBZaW4gTWEgaW4gQWJzb2Z0LiBzaG91bGQgYmUgbm90IGJlIGNhbGxlZCBiZWZvcmUgdGhlIHRlc3QgbG9vcAorIWJlY2F1c2UgaXQgYWxsb3dzIHRoZSBkeW5hbWljIGFkanVzdG1lbnQgb2YgdGhlIG51bWJlciBvZiB0aHJlYWRzIGF0IHJ1bnRpbWUKKyFpbnN0ZWFkIG9mIHVzaW5nIHRoZSBtYXhfdGhyZWFkcyBzZXQuIAorCisgICAgICAgICFDQUxMIE9NUF9TRVRfRFlOQU1JQyguVFJVRS4pCisgICAgICAgIERPIHRocmVhZHMgPSAxLCBtYXhfdGhyZWFkcworICAgICAgICAgIG50aHJlYWRzID0gMAorICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgcGFyYWxsZWwgbnVtX3RocmVhZHModGhyZWFkcykgcmVkdWN0aW9uKCs6ZmFpbGVkKQorISAgICAgICAgICBwcmludCAqLCB0aHJlYWRzLCBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICB0bXAgPSBvbXBfZ2V0X251bV90aHJlYWRzKCkKKyAgICAgICAgICBJRiAoIHRocmVhZHMgLk5FLiB0bXAgKSBUSEVOCisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgICBXUklURSAoMSwqKSAiRXJyb3I6IGZvdW5kICIsIHRtcCwgIiBpbnN0ZWFkIG9mICIsCisgICAgICYgICAgICAgICAgdGhyZWFkcywgIiB0aHJlYWRzIgorICAgICAgICAgIEVORCBJRgorISRvbXAgYXRvbWljCisgICAgICAgICAgbnRocmVhZHMgPSBudGhyZWFkcyArIDEKKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorISAgICAgICAgICAgIHByaW50ICosIHRocmVhZHMsIG50aHJlYWRzCisgICAgICAgICAgPG9tcHRzOmNoZWNrPklGICggbnRocmVhZHMgLk5FLiB0aHJlYWRzICkgVEhFTjwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgPG9tcHRzOmNyb3NzY2hlY2s+SUYgKCBudGhyZWFkcyAuRVEuIHRocmVhZHMgKSBUSEVOPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgICAgZmFpbGVkID0gZmFpbGVkICsgMQorICAgICAgICAgIEVORCBJRgorICAgICAgICBFTkQgRE8KKworICAgICAgICBJRihmYWlsZWQgLk5FLiAwKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVORCBJRgorICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF9zaW5nbGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTg4MjFjYQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfc2luZ2xlLmYKQEAgLTAsMCArMSw0MCBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgc2luZ2xlIGRpcmVjdGl2ZSBieSBjb250cm9sbGluZyBob3cgb2Z0ZW4gYSBkaXJlY3RpdmUgaXMgY2FsbGVkIGluIGFuIG9tcCBzaW5nbGUgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmFsbGVsIHByaXZhdGUsb21wIGZsdXNoPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfc2luZ2xlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGkKKwkJPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0CisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICByZXN1bHQ9MAorICAgICAgICBucl9pdGVyYXRpb25zPTAKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5ULTEKKwkJPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNpbmdsZQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl90aHJlYWRzX2luX3NpbmdsZSA9IG5yX3RocmVhZHNfaW5fc2luZ2xlICsgMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zID0gbnJfaXRlcmF0aW9ucyArIDEKKyAgICAgICAgICA8b21wdHM6Y2hlY2s+bnJfdGhyZWFkc19pbl9zaW5nbGUgPSBucl90aHJlYWRzX2luX3NpbmdsZSAtIDE8L29tcHRzOmNoZWNrPgorICAgICAgICAgIDxvbXB0czpjcm9zc2NoZWNrPm5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIG5yX3RocmVhZHNfaW5fc2luZ2xlCishJG9tcCBlbmQgc2luZ2xlCisJCTwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCApIFRIRU4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFzay5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMjczZDdiMAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFzay5mCkBAIC0wLDAgKzEsNTAgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYSBvZiB0aGUgdGVzdHMgaXMgdG8gZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBsZXQgcGF1c2UgdGhlIHRhc2tzIGdlbmVyYXRlZCBzbyB0aGF0IG90aGVyIHRocmVhZHMgZ2V0IHNoZWR1bGVkIHRvIHRoZSBuZXdseSBvcGVuZWQgdGFza3MuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzLCBvbXBfZ2V0X3RocmVhZF9udW0KKyAgICAgICAgRVhURVJOQUwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBteWoKKyAgICAgICAgSU5URUdFUiBpLGoKKyAgICAgICAgSU5URUdFUiB0aWRzKE5VTV9UQVNLUykKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaix0aWRzCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CishJG9tcCBwYXJhbGxlbCBwcml2YXRlKG15aikgc2hhcmVkKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgaiA9IGkKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgbXlqID0gagorICAgICAgICA8b21wdHM6Y2hlY2s+CishJG9tcCB0YXNrCisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgdGlkcyhteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICAgPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGVuZCBkbworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKworICAgICAgICAhIGNoZWNrIGlmIG1vcmUgdGhhbiBvbmUgdGhyZWFkIGV4ZWN1dGVkIHRoZSB0YXNrcy4KKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAodGlkcygxKSAubmUuIHRpZHMoaSkpIHRoZW4KKyAgICAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgICAgZW5kIGlmCisgICAgICAgIGVuZCBkbworCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2E3NzU5ZQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19maXJzdHByaXZhdGUuZgpAQCAtMCwwICsxLDU0IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGZpcnN0cHJpdmF0ZSBjbGF1c2Ugb2YgdGhlIHRhc2sgZGlyZWN0aXZlLiBXZSBjcmVhdGUgYSBzZXQgb2YgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uLiBXZSBkZWZpbmVzIGEgdmFyaWFibGUgbmFtZWQgc3VtIHVuZXF1YWwgemVybyB3aGljaCBnZXRzIGRlY2xhcmVkIGZpcnN0cHJpdmF0ZSBmb3IgZWFjaCB0YXNrLiBOb3cgZWFjaCB0YXNrIGNhbGN1YWx0ZXMgYSBzdW0gdXNpbmcgdGhpcyBwcml2YXRlIHZhcmlhYmxlLiBCZWZvcmUgZWFjaCBjYWxjdWFsYXRpb24gc3RlcCB3ZSBpbnRyb2R1Y2UgYSBmbHVzaCBjb21tYW5kIHNvIHRoYXQgbWF5YmUgdGhlIHByaXZhdGUgdmFyaWFiZWwgZ2V0cyBiYWQuIEF0IHRoZSBlbmQgd2UgY2hlY2sgaWYgdGhlIGNhbGN1bGF0ZWQgc3VtIHdhcyByaWdodC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgSU5URUdFUiBqLGkKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15X3N1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIHJzbHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbXlfc3VtLCBrbm93bl9zdW0sIHJzbHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBteV9zdW0gPSAxMjM0CisgICAgICAgIGtub3duX3N1bSA9IDEyMzQgKyAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworISRvbXAgcGFyYWxsZWwgcHJpdmF0ZShqKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz5maXJzdHByaXZhdGUobXlfc3VtKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgZG8gaiA9IDAsIExPT1BDT1VOVAorISRvbXAgZmx1c2gKKyAgICAgICAgICAgIG15X3N1bSA9IG15X3N1bSArIGoKKyAgICAgICAgICBlbmQgZG8KKworICAgICAgICAgICEgY2hlY2sgaWYgY2FsY3VsYXRlZCBteV9zdW0gd2FzIHJpZ2h0CisgICAgICAgICAgaWYgKG15X3N1bSAubmUuIGtub3duX3N1bSkgdGhlbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIHJzbHQgPSByc2x0ICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgZW5kIGlmCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBpZiAocnNsdCAuZXEuIDApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfaWYuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19pZi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjE0OWY0NTcKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfaWYuZgpAQCAtMCwwICsxLDQ1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIGlmIGNsYXVzZSBvZiB0aGUgb21wIHRhc2sgZGlyZWN0aXZlLiBUaGUgaWRlYXIgb2YgdGhlIHRlc3RzIGlzIHRvIGdlbmVyYXRlIGEgdGFza3MgaW4gYSBzaW5nbGUgcmVnaW9uIGFuZCBwYXVzZSBpdCBpbW1lZGlhdGVseS4gVGhlIHBhcmVudCB0aHJlYWQgbm93IHNoYWxsIHNldCBhIGNvdW50ZXIgdmFyaWFibGUgd2hpY2ggdGhlIHBhdXNlZCB0YXNrIHNoYWxsIGV2YWx1YXRlIHdoZW4gd29rZSB1cC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjMuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHRhc2sgaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgc2luZ2xlLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX2lmPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgZXh0ZXJuYWwgbXlfc2xlZXAKKyAgICAgICAgSU5URUdFUiBkdW1teQorICAgICAgICBMT0dJQ0FMIGNvbmRpdGlvbl9mYWxzZQorICAgICAgICBJTlRFR0VSIGNudAorICAgICAgICBJTlRFR0VSIHJzbHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gY29uZGl0aW9uX2ZhbHNlLCBjbnQsIHJzbHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBjbnQgPSAwCisgICAgICAgIGNvbmRpdGlvbl9mYWxzZSA9IChkdW1teSAuZXEuIDMxNDE1OSkKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIHNpbmdsZQorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgdGFzayA8b21wdHM6Y2hlY2s+aWYgKGNvbmRpdGlvbl9mYWxzZSk8L29tcHRzOmNoZWNrPiBzaGFyZWQoY250LHJzbHQpCisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUVfTE9ORykKKyEkb21wIGZsdXNoCisgICAgICAgICAgaWYgKGNudCAuZXEuIDApIHRoZW4KKyAgICAgICAgICAgICAgcnNsdCA9IDEKKyAgICAgICAgICBlbHNlCisgICAgICAgICAgICAgIHJzbHQgPSAwCisgICAgICAgICAgZW5kIGlmCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgY250ID0gMQorISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IHJzbHQKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrX3ByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNWU0NGJjNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19wcml2YXRlLmYKQEAgLTAsMCArMSw1NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwcml2YXRlIGNsYXVzZSBvZiB0aGUgdGFzayBkaXJlY3RpdmUuIFdlIGNyZWF0ZSBhIHNldCBvZiB0YXNrcyBpbiBhIHNpbmdsZSByZWdpb24uIFdlIGRlZmluZXMgYSB2YXJpYWJsZSBuYW1lZCBzdW0gd2hpY2ggZ2V0cyBkZWNsYXJlZCBwcml2YXRlIGZvciBlYWNoIHRhc2suIE5vdyBlYWNoIHRhc2sgY2FsY3VhbHRlcyBhIHN1bSB1c2luZyB0aGlzIHByaXZhdGUgdmFyaWFibGUuIEJlZm9yZSBlYWNoIGNhbGN1YWxhdGlvbiBzdGVwIHdlIGludHJvZHVjZSBhIGZsdXNoIGNvbW1hbmQgc28gdGhhdCBtYXliZSB0aGUgcHJpdmF0ZSB2YXJpYWJlbCBnZXRzIGJhZC4gQXQgdGhlIGVuZCB3ZSBjaGVjayBpZiB0aGUgY2FsY3VsYXRlZCBzdW0gd2FzIHJpZ2h0Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzayBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHNpbmdsZSxvbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza19maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgSU5URUdFUiBqLGkKKyAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBleHRlcm5hbCBteV9zbGVlcAorICAgICAgICBJTlRFR0VSIG15X3N1bQorICAgICAgICBJTlRFR0VSIGtub3duX3N1bQorICAgICAgICBJTlRFR0VSIHJzbHQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbXlfc3VtLCBrbm93bl9zdW0sIHJzbHQKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICBteV9zdW0gPSAwCisgICAgICAgIHJzbHQgPSAwCisgICAgICAgIGtub3duX3N1bSA9IChMT09QQ09VTlQgKiAoTE9PUENPVU5UICsgMSkpIC8gMgorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGopCishJG9tcCBzaW5nbGUKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyEkb21wIHRhc2sgPG9tcHRzOmNoZWNrPnByaXZhdGUobXlfc3VtKTwvb21wdHM6Y2hlY2s+IHNoYXJlZChyc2x0LCBrbm93bl9zdW0pCisgICAgICAgICAgPG9tcHRzOmNoZWNrPm15X3N1bSA9IDA8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGRvIGogPSAwLCBMT09QQ09VTlQKKyAgICAgICAgICAgIG15X3N1bSA9IG15X3N1bSArIGoKKyAgICAgICAgICBlbmQgZG8KKworICAgICAgICAgICEgY2hlY2sgaWYgY2FsY3VsYXRlZCBteV9zdW0gd2FzIHJpZ2h0CisgICAgICAgICAgaWYgKG15X3N1bSAubmUuIGtub3duX3N1bSkgdGhlbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgICAgIHJzbHQgPSByc2x0ICsgMQorISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgICAgZW5kIGlmCishJG9tcCBlbmQgdGFzaworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgZW5kIGRvCishJG9tcCBlbmQgc2luZ2xlCishJG9tcCBlbmQgcGFyYWxsZWwKKworICAgICAgICBpZiAocnNsdCAuZXEuIDApIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfc2hhcmVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTg1NjRiMwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza19zaGFyZWQuZgpAQCAtMCwwICsxLDQ3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+IFRlc3QgdG8gc2VlIGlmIGltcGxpZWQgc2hhcmVkIHdvcmtzIGNvcnJlY3RseTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+My4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGFzazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3NoYXJlZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgcnNsdAorICAgICAgICBJTlRFR0VSIGsKKworICAgICAgICBpID0gMAorICAgICAgICBrID0gMAorICAgICAgICByc2x0ID0gMAorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGspIHNoYXJlZChpKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGs9MSwgTlVNX1RBU0tTCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCB0YXNrIDxvbXB0czpjcm9zc2NoZWNrPmZpcnN0cHJpdmF0ZShpKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wKyAgICAgPG9tcHRzOmNoZWNrPnNoYXJlZChpKTwvb21wdHM6Y2hlY2s+CishJG9tcCBhdG9taWMKKyAgICAgICAgICAgIGkgPSBpICsgMQorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGVuZCBkbworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgcnNsdCA9IGkKKyAgICAgICAgaWYgKHJzbHQgLmVxLiBOVU1fVEFTS1MpIHRoZW4KKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIGVsc2UKKyAgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIGVuZCBpZgorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2tfdW50aWVkLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTU4ZTkzNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGFza191bnRpZWQuZgpAQCAtMCwwICsxLDYzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCBmb3IgdW50aWVkIGNsYXVzZS4gRmlyc3QgZ2VuZXJhdGUgYSBzZXQgb2YgdGFza3MgYW5kIHBhdXNlIGl0IGltbWVkaWF0ZWx5LiBUaGVuIHdlIHJlc3VtZSBoYWxmIG9mIHRoZW0gYW5kIGNoZWNrIHdoZXRoZXIgdGhleSBhcmUgc2NoZWR1bGVkIGJ5IGRpZmZlcmVudCB0aHJlYWRzPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrIHVudGllZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTkNMVURFICJvbXBfbXlfc2xlZXAuZiIKKworICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF90YXNrX3VudGllZDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIEVYVEVSTkFMIG15X3NsZWVwCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcywgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIElOVEVHRVIgbXlqCisgICAgICAgIElOVEVHRVIgaSxqCisgICAgICAgIElOVEVHRVIgY250CisgICAgICAgIElOVEVHRVIgc3RhcnRfdGlkKE5VTV9UQVNLUykKKyAgICAgICAgSU5URUdFUiBjdXJyZW50X3RpZChOVU1fVEFTS1MpCisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIGosIGNudCwgc3RhcnRfdGlkLCBjdXJyZW50X3RpZAorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGNudCA9IDAKKyAgICAgICAgZG8gaSA9IDEsIE5VTV9UQVNLUworICAgICAgICAgIHN0YXJ0X3RpZChpKSA9IDAKKyAgICAgICAgICBjdXJyZW50X3RpZChpKSA9IDAKKyAgICAgICAgZW5kIGRvCisKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUobXlqKSBzaGFyZWQoaikKKyEkb21wIHNpbmdsZQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICBqID0gaQorICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICBteWogPSBqCishJG9tcCB0YXNrIDxvbXB0czpjaGVjaz51bnRpZWQ8L29tcHRzOmNoZWNrPgorICAgICAgICAgIGNhbGwgbXlfc2xlZXAoU0xFRVBUSU1FKQorICAgICAgICAgIHN0YXJ0X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyEkb21wIHRhc2t3YWl0CisgICAgICA8b21wdHM6Y2hlY2s+aWYgKE1PRChzdGFydF90aWQobXlqKSwyKSAubmUuIDApIHRoZW48L29tcHRzOmNoZWNrPgorICAgICAgICBjYWxsIG15X3NsZWVwKFNMRUVQVElNRSkKKyAgICAgICAgY3VycmVudF90aWQobXlqKSA9IG9tcF9nZXRfdGhyZWFkX251bSgpCisgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgZWxzZQorICAgICAgICBjdXJyZW50X3RpZChteWopID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyAgICAgICBlbmQgaWY8L29tcHRzOmNoZWNrPgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIGVuZCBkbworISRvbXAgZW5kIHNpbmdsZQorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKworICAgICAgICAhIGNoZWNrIGlmIGF0IGxlYXN0IG9uZSB1bnRpZWQgdGFzayBzd2l0Y2hlZCB0aHJlYWRzCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAgaWYgKGN1cnJlbnRfdGlkKGkpIC5uZS4gc3RhcnRfdGlkKGkpKSB0aGVuCisgICAgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90YXNrd2FpdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjJhYTk0YzQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rhc2t3YWl0LmYKQEAgLTAsMCArMSw4MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgdGFza3dhaXQgZGlyZWN0aXZlLiBGaXJzdCB3ZSBnZW5lcmF0ZSBhIHNldCBvZiB0YXNrcywgd2hpY2ggc2V0IHRoZSBlbGVtZW50cyBvZiBhbiBhcnJheSB0byBhIHNwZWNpZmljIHZhbHVlLiBUaGVuIHdlIGRvIGEgdGFza3dhaXQgYW5kIGNoZWNrIGlmIGFsbCB0YXNrcyBmaW5pc2hlZCBtZWFuaW5nIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZS4gVGhlbiB3ZSBnZW5lcmF0ZSBhIHNlY29uZCBzZXQgc2V0dGluZyB0aGUgYXJyYXkgZWxlbWVudHMgdG8gYW5vdGhlciB2YWx1ZS4gQWZ0ZXIgdGhlIHBhcmFsbGVsIHJlZ2lvbiB3ZSBjaGVjayBpZiBhbGwgdGFza3Mgb2YgdGhlIHNlY29uZCBzZXQgZmluaXNoZWQgYW5kIHdlcmUgZXhlY3V0ZWQgYWZ0ZXIgdGhlIHRhc2tzIG9mIHRoZSBmaXJzdCBzZXQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4zLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCB0YXNrd2FpdDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBzaW5nbGUsb21wIHRhc2s8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5DTFVERSAib21wX215X3NsZWVwLmYiCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGFza3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgSU5URUdFUiByZXN1bHQxLCByZXN1bHQyCisgICAgICAgIElOVEVHRVIgYXJyYXkoTlVNX1RBU0tTKQorICAgICAgICBJTlRFR0VSIGksIG15aQorICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIGV4dGVybmFsIG15X3NsZWVwCisgICAgICAgIDwvb21wdHM6b3JwaGFuOnZhcnM+CisKKyAgICAgICAgcmVzdWx0MSA9IDAKKyAgICAgICAgcmVzdWx0MiA9IDAKKworICAgICAgICAhIGZpbGwgYXJyYXkKKyAgICAgICAgZG8gaSA9IDEsIE5VTV9UQVNLUworICAgICAgICAgIGFycmF5KGkpID0gMAorICAgICAgICBlbmQgZG8KKworISRvbXAgcGFyYWxsZWwgc2hhcmVkKGkpIHByaXZhdGUobXlpKQorISRvbXAgc2luZ2xlCisgICAgICAgIGRvIGk9MSwgTlVNX1RBU0tTCisgICAgICAgICAhIEZpcnN0IHdlIGhhdmUgdG8gc3RvcmUgdGhlIHZhbHVlIG9mIHRoZSBsb29wIGluZGV4IGluIGEgbmV3IHZhcmlhYmxlCisgICAgICAgICAhIHdoaWNoIHdpbGwgYmUgcHJpdmF0ZSBmb3IgZWFjaCB0YXNrIGJlY2F1c2Ugb3RoZXJ3aXNlIGl0IHdpbGwgYmUKKyAgICAgICAgICEgb3ZlcndyaXR0ZW4gaWYgdGhlIGV4ZWN1dGlvbiBvZiB0aGUgdGFzayB0YWtlcyBsb25nZXIgdGhhbiB0aGUgdGltZQorICAgICAgICAgISB3aGljaCBpcyBuZWVkZWQgdG8gZW50ZXIgdGhlIG5leHQgc3RlcCBvZiB0aGUgbG9vcCEKKworICAgICAgICAgbXlpID0gaQorCishJG9tcCB0YXNrCisgICAgICAgICAgY2FsbCBteV9zbGVlcChTTEVFUFRJTUUpCisgICAgICAgICAgYXJyYXkobXlpKSA9IDEKKyEkb21wIGVuZCB0YXNrCisgICAgICAgIGVuZCBkbworCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIDxvbXB0czpjaGVjaz4KKyEkb21wIHRhc2t3YWl0CisgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgIDwvb21wdHM6b3JwaGFuPgorCisgICAgICAgICEgY2hlY2sgaWYgYWxsIHRhc2tzIHdlcmUgZmluaXNoZWQKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoYXJyYXkoaSkgLm5lLiAxKSB0aGVuCisgICAgICAgICAgICAgIHJlc3VsdDEgPSByZXN1bHQxICsgMQorICAgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQgZG8KKworICAgICAgICAhIGdlbmVyYXRlIHNvbWUgbW9yZSB0YXNrcyB3aGljaCBub3cgc2hhbGwgb3ZlcndyaXRlIHRoZSB2YWx1ZXNpbiB0aGUKKyAgICAgICAgISBhcnJheQorICAgICAgICBkbyBpPTEsIE5VTV9UQVNLUworICAgICAgICAgIG15aSA9IGkKKyEkb21wIHRhc2sKKyAgICAgICAgICBhcnJheShteWkpID0gMgorISRvbXAgZW5kIHRhc2sKKyAgICAgICAgZW5kIGRvCisKKyEkb21wIGVuZCBzaW5nbGUKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgICEgZmluYWwgY2hlY2ssIGlmIGFsbCBhcnJheSBlbGVtZW50cyBjb250YWluIHRoZSByaWdodCB2YWx1ZXMKKyAgICAgICAgZG8gaT0xLCBOVU1fVEFTS1MKKyAgICAgICAgICBpZiAoYXJyYXkoaSkgLm5lLiAyKSB0aGVuCisgICAgICAgICAgICByZXN1bHQyID0gcmVzdWx0MiArIDEKKyAgICAgICAgICBlbmQgaWYKKyAgICAgICAgZW5kIGRvCisKKyAgICAgICAgaWYgKCAocmVzdWx0MSAuZXEuIDApIC5hbmQuIChyZXN1bHQyIC5lcS4gMCkgKSB0aGVuCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBlbmQgaWYKKworICAgICAgRU5EIEZVTkNUSU9OCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0X25lc3RfbG9jay5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTZkMjQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RfbmVzdF9sb2NrLmYKQEAgLTAsMCArMSw2MSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfdGVzdF9uZXN0X2xvY2sgZnVuY3Rpb24uPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF90ZXN0X25lc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3RfbmVzdF9sb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorIXJlc3VsdCBpczoKKyEgICAgICAwIC0tIGlmIHRoZSB0ZXN0IGZhaWxzCishICAgICAgMSAtLSBpZiB0aGUgdGVzdCBzdWNjZWVkcworICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgaW5jbHVkZSAib21wX2xpYi5oIgorICAgICAgICBJTlRFR0VSIChLSU5EPU9NUF9ORVNUX0xPQ0tfS0lORCkgOjogbG9jaworICAgICAgICBDT01NT04gL29ycGh2YXJzLyBsb2NrCisgICAgICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorISAgICAgICAgSU5URUdFUiAgbGNrCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKworICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICBDQUxMIE9NUF9JTklUX05FU1RfTE9DSyhsb2NrKQorICAgICAgICByZXN1bHQ9MAorCishJG9tcCBwYXJhbGxlbCBzaGFyZWQobG9jayxucl90aHJlYWRzX2luX3NpbmdsZSxucl9pdGVyYXRpb25zLHJlc3VsdCkKKyEkb21wIGRvCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgICAgRE8gV0hJTEUoT01QX1RFU1RfTkVTVF9MT0NLKGxvY2spIC5FUS4gMCkKKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgT01QX1VOU0VUX05FU1RfTE9DSyhsb2NrKQorICAgICAgICAgICAgICAgICAgPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6b3JwaGFuPgorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIENBTEwgb21wX2Rlc3Ryb3lfbmVzdF9sb2NrKGxvY2spCishICAgICAgICAgICAgICAgcHJpbnQgKiwgcmVzdWx0LCBucl9pdGVyYXRpb25zCisgICAgICAgIElGKHJlc3VsdC5FUS4wIC5BTkQuIG5yX2l0ZXJhdGlvbnMgLkVRLiBMT09QQ09VTlQpIFRIRU4KKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3Rsb2NrLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uM2IxMzA0ZAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGVzdGxvY2suZgpAQCAtMCwwICsxLDU3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcF90ZXN0bG9jayBmdW5jdGlvbi4gVGhlIHRlc3QgY291bnRzIHRoZSB0aHJlYWRzIGVudGVyaW5nIGFuZCBleGl0aW5nIGEgc2luZ2xlIHJlZ2lvbiB3aGljaCBpcyBidWlsZCB3aXRoIGEgdGVzdF9sb2NrIGluIGFuIGVuZGxlc3MgbG9vcC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wX3Rlc3RfbG9jazwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+b21wX3Rlc3Rsb2NrPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTlRFR0VSIG5yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucworICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBpbmNsdWRlICJvbXBfbGliLmgiCisgICAgICAgIElOVEVHRVIgKEtJTkQ9T01QX0xPQ0tfS0lORCk6OmxvY2sKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbG9jaworICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgbnJfaXRlcmF0aW9ucz0wCisgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPTAKKyAgICAgICAgQ0FMTCBPTVBfSU5JVF9MT0NLKGxvY2spCisgICAgICAgIHJlc3VsdD0wCisKKyEkb21wIHBhcmFsbGVsIHNoYXJlZChsb2NrLG5yX3RocmVhZHNfaW5fc2luZ2xlLG5yX2l0ZXJhdGlvbnMscmVzdWx0KQorISRvbXAgZG8KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICAgIDxvbXB0czpjaGVjaz4KKyAgICAgICAgICBETyBXSElMRSAoLk5PVC4gT01QX1RFU1RfTE9DSyhsb2NrKSkKKyAgICAgICAgICBFTkQgRE8KKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGZsdXNoCisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9bnJfdGhyZWFkc19pbl9zaW5nbGUrMQorISRvbXAgZmx1c2gKKyAgICAgICAgICBucl9pdGVyYXRpb25zPW5yX2l0ZXJhdGlvbnMrMQorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlPW5yX3RocmVhZHNfaW5fc2luZ2xlLTEKKyAgICAgICAgICByZXN1bHQ9cmVzdWx0K25yX3RocmVhZHNfaW5fc2luZ2xlCisgICAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorICAgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICAgIENBTEwgT01QX1VOU0VUX0xPQ0sobG9jaykKKyAgICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgZG8KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBDQUxMIE9NUF9ERVNUUk9ZX0xPQ0sobG9jaykKKyEgICAgICAgICAgICAgICBwcmludCAqLCByZXN1bHQsIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgSUYocmVzdWx0LkVRLjAgLkFORC4gbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT49MQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3Rlc3RzdWl0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi40MmQ0ODIxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF90ZXN0c3VpdGUuZgpAQCAtMCwwICsxLDIgQEAKKwlpbnRlZ2VyIExPT1BDT1VOVAorCXBhcmFtZXRlciAoTE9PUENPVU5UPTEwMDApCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3RocmVhZHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfdGhyZWFkcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmM5MjA0OTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3RocmVhZHByaXZhdGUuZgpAQCAtMCwwICsxLDg5IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCB0aHJlYWRwcml2YXRlIGRpcmVjdGl2ZSBieSBmaWxsaW5nIGFuIGFycmF5IHdpdGggcmFuZG9tIG51bWJlcnMgaW4gYW4gcGFyYWxsZWxpc2VkIHJlZ2lvbi4gRWFjaCB0aHJlYWQgZ2VuZXJhdGVzIG9uZSBudW1iZXIgb2YgdGhlIGFycmF5IGFuZCBzYXZlcyB0aGlzIGluIGEgdGVtcG9yYXJ5IHRocmVhZHByaXZhdGUgdmFyaWFibGUuIEluIGEgc2Vjb25kIHBhcmFsbGVsaXNlZCByZWdpb24gdGhlIHRlc3QgY29udHJvbHMsIHRoYXQgdGhlIHRlbXBvcmFyeSB2YXJpYWJsZSBjb250YWlucyBzdGlsbCB0aGUgZm9ybWVyIHZhbHVlIGJ5IGNvbXBhcmluZyBpdCB3aXRoIHRoZSBvbmUgaW4gdGhlIGFycmF5Ljwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgdGhyZWFkcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXBfc2V0X2R5bmFtaWMsb21wX2dldF9udW1fdGhyZWFkcyxvbXAgbWFzdGVyPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyFZaSBXZW4gbW9kaWZpZWQgdGhpcyBmdW5jdGlvbiBmcm9tIGhpcyBvd24gdW5kZXJzdGFuZGluZyBvZiB0aGUgc2VtYW50aWNzCishb2YgQyB2ZXJzaW9uIGF0IDA1MDQyMDA0CishVGhlIHVuZGVlc3RhbmRpbmcgaXMgdGhhdCBzdW0wIGFuZCBteXZhbHVlIGNhbiBiZSBsb2NhbCBzdGF0aWMgdmFyaWFibGVzCishb2YgdGhlIGNoa19vbXBfdGhyZWFkcHJpdmF0ZSBmdW5jdGlvbi4gVGhlcmUgaXMgbm8gbmVlZCB0byB1c2UgY29tbW9uCishYmxvY2sKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfdGhyZWFkcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIGtub3duX3N1bSwgaSAsIGl0ZXIsIHJhbmssc2l6ZSwgZmFpbGVkCisgICAgICAgIElOVEVHRVIgb21wX2dldF9udW1fdGhyZWFkcywgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIFJFQUwgbXlfcmFuZG9tCisgICAgICAgIFJFQUwsIEFMTE9DQVRBQkxFOjogZGF0YSg6KQorICAgICAgICBJTlRFR0VSIHJhbmRvbV9zaXplCisgICAgICAgIElOVFJJTlNJQyByYW5kb21fbnVtYmVyCisgICAgICAgIElOVFJJTlNJQyByYW5kb21fc2VlZAorICAgICAgICBFWFRFUk5BTCBvbXBfc2V0X2R5bmFtaWMKKworIVlpIFdlbiBtb2RpZmllZCBhdCAwNTA0MjAwNCA6IGFkZCAic2F2ZSIKKyAgICAgICAgSU5URUdFUiwgU0FWRTo6IHN1bTAKKyAgICAgICAgUkVBTCwgU0FWRTo6bXl2YWx1ZQorIVlpIFdlbiBjb21tZW50ZWQgdHdvIGNvbW1vbiBibG9ja3MKKyEJY29tbW9uL2NzdW0wLyBzdW0wCishCWNvbW1vbi9jbXl2YWx1ZS8gbXl2YWx1ZQorISEhISEhISEhISRvbXAgdGhyZWFkcHJpdmF0ZSgvY3N1bTAvLC9jbXl2YWx1ZS8pCisJCTxvbXB0czpjaGVjaz4KKyEkb21wIHRocmVhZHByaXZhdGUoc3VtMCxteXZhbHVlKQorCQk8L29tcHRzOmNoZWNrPgorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisKKyAgICAgICAgc3VtID0gMAorICAgICAgICBmYWlsZWQgPSAwCisgICAgICAgIHN1bTA9MAorICAgICAgICBteXZhbHVlPTAKKyAgICAgICAgcmFuZG9tX3NpemU9NDUKKyAgICAgICAgQ0FMTCBvbXBfc2V0X2R5bmFtaWMoLkZBTFNFLikKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIHN1bTAgPSAwCishJG9tcCBkbworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5ORS4gc3VtICkgVEhFTgorICAgICAgICAgIFBSSU5UICosICcga25vd25fc3VtID0nLCBrbm93bl9zdW0sICcsIHN1bSA9JyxzdW0KKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgQ0FMTCBvbXBfc2V0X2R5bmFtaWMoLkZBTFNFLikKKworISRvbXAgcGFyYWxsZWwKKyEkb21wIG1hc3RlcgorICAgICAgICBzaXplID0gb21wX2dldF9udW1fdGhyZWFkcygpCisgICAgICAgIEFMTE9DQVRFICggZGF0YShzaXplKSApCishJG9tcCBlbmQgbWFzdGVyCishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgQ0FMTCBSQU5ET01fU0VFRChTSVpFPXJhbmRvbV9zaXplKQorICAgICAgICBETyBpdGVyID0gMCwgOTkKKyAgICAgICAgICBDQUxMIFJBTkRPTV9OVU1CRVIoSEFSVkVTVD1teV9yYW5kb20pCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKHJhbmspCisgICAgICAgICAgcmFuayA9IG9tcF9nZXRfdGhyZWFkX251bSgpKzEKKyAgICAgICAgICBteXZhbHVlID0gbXlfcmFuZG9tICsgcmFuaworICAgICAgICAgIGRhdGEocmFuaykgPSBteXZhbHVlCishJG9tcCBlbmQgcGFyYWxsZWwKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUocmFuaykKKyAgICAgICAgICByYW5rID0gb21wX2dldF90aHJlYWRfbnVtKCkrMQorICAgICAgICAgIElGICggbXl2YWx1ZSAuTkUuIGRhdGEocmFuaykgKSBUSEVOCisgICAgICAgICAgICBmYWlsZWQgPSBmYWlsZWQgKyAxCisgICAgICAgICAgICBQUklOVCAqLCAnIG15dmFsdWUgPScsbXl2YWx1ZSwnIGRhdGEocmFuayk9JywgZGF0YShyYW5rKQorICAgICAgICAgIEVORCBJRgorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIEVORCBETworICAgICAgICBERUFMTE9DQVRFKCBkYXRhKQorICAgICAgICBJRiAoIChrbm93bl9zdW0gLkVRLiBzdW0pIC5BTkQuIChmYWlsZWQgLk5FLiAxKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAgCisgICAgICAgIGVuZCBpZgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYThmYWEyNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9vbXBfd29ya3NoYXJlLmYKQEAgLTAsMCArMSwxNDIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyBpZiBXT1JLU0hBUkUgaXMgcHJlc2VudC48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHdvcmtzaGFyZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyEgRnVuY3Rpb246IG9tcF93b3Jrc2hhcmUKKyEgCishIGJ5IENodW5odWEgTGlhbywgVW5pdmVyc2l0eSBvZiBIb3VzdG9uCishIE9jdC4gMjAwNSAtIEZpcnN0IHZlcnNpb24KKyEgCishIFRoZSBpZGVhIGZvciB0aGUgdGVzdCBpcyB0aGF0IGlmIFdPUktTSEFSRSBpcyBub3QgcHJlc2VudCwKKyEgdGhlIGFycmF5IGFzc2lnbm1lbnQgaW4gUEFSQUxMRUwgcmVnaW9uIHdpbGwgYmUgZXhlY3V0ZWQgYnkgZWFjaCAKKyEgdGhyZWFkIGFuZCB0aGVuIHdyb25nZnVsbHkgcmVwZWF0ZWQgc2V2ZXJhbCB0aW1lcy4KKyEKKyEgVE9ETzpEbyB3ZSBuZWVkIHRlc3QgZm9yIFdIRVJFIGFuZCBGT1JBTEw/CishIEEgc2ltcGxlIHRlc3QgZm9yIFdIRVJFIGFuZCBGT1JBTEwgaXMgYWRkZWQgYnkgWmhlbnlpbmcgTGl1CishKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93b3Jrc2hhcmU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0LGkKKyAgICAgICAgSU5URUdFUiBzY2FsYXIwMixzY2FsYXIxMixzY2FsYXIyMixzY2FsYXIzMixjb3VudAorICAgICAgICBSRUFMLCBESU1FTlNJT04oMTAwMCk6OkZGCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc2NhbGFyMCxzY2FsYXIxLHNjYWxhcjIsc2NhbGFyMworICAgICAgICBJTlRFR0VSLCBESU1FTlNJT04oMTAwMCk6OkFBLEJCLENDCisgICAgICAgIFJFQUwsIERJTUVOU0lPTigxMDAwKTo6REQKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc2NhbGFyMCxzY2FsYXIxLHNjYWxhcjIsc2NhbGFyMywKKyAgICAgJiAgICAgIEFBLEJCLENDLERECis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIHNjYWxhcjA9MAorICAgICAgICBzY2FsYXIwMj0wCisgICAgICAgIHNjYWxhcjE9MAorICAgICAgICBzY2FsYXIxMj0wCisgICAgICAgIHNjYWxhcjI9MAorICAgICAgICBzY2FsYXIyMj0wCisgICAgICAgIHNjYWxhcjM9MAorICAgICAgICBzY2FsYXIzMj0wCisgCisgICAgICAgIGNvdW50ID0gMAorCisgICAgICAgIEFBPTAKKyAgICAgICAgQkI9MAorCisgICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICAgQ0MoaSkgPSBpCisgICAgICAgICAgRkYoaSkgPSAxLjAvaQorICAgICAgICBlbmQgZG8KKworISRPTVAgUEFSQUxMRUwKKzxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+ISRPTVAgICBXT1JLU0hBUkU8L29tcHRzOmNoZWNrPgorCishIHRlc3QgaWYgd29yayBpcyBkaXZpZGVkIG9yIG5vdCBmb3IgYXJyYXkgYXNzaWdubWVudAorICAgICAgICBBQT1BQSsxCisKKyEgdGVzdCBpZiBzY2FsYXIgYXNzaWdubWVudCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgb2Ygd29yaworICAgICAgICBzY2FsYXIwPXNjYWxhcjArMSAKKworISB0ZXN0IGlmIGF0b21pYyBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgb2Ygd29yaworISRPTVAgQVRPTUlDCisgICAgICAgIHNjYWxhcjE9c2NhbGFyMSsxIAorISB0ZXN0IGlmIGNyaXRpY2FsIGlzIHRyZWF0ZWQgYXMgYSBzaW5nbGUgdW5pdCBvZiB3b3JrCishJE9NUCBDUklUSUNBTAorICAgICAgICBzY2FsYXIyPXNjYWxhcjIrMQorISRPTVAgRU5EIENSSVRJQ0FMCisKKyEgdGVzdCBpZiBQQVJBTExFTCBpcyB0cmVhdGVkIGFzIGEgc2luZ2xlIHVuaXQgb2Ygd29yaworISRPTVAgUEFSQUxMRUwKKyAgICAgICAgc2NhbGFyMz1zY2FsYXIzKzEKKyEkT01QIEVORCBQQVJBTExFTAorCisgICAgICAgIFdIRVJFICggQ0MgLm5lLiAwICkgREQgPSAxLjAvQ0MKKworICAgICAgICBGT1JBTEwgKEk9MToxMDAwKSBDQyhpKSA9IC1pCisKKzxvbXB0czpjaGVjaz4hJE9NUCAgIEVORCBXT1JLU0hBUkU8L29tcHRzOmNoZWNrPgorPC9vbXB0czpvcnBoYW4+CishJE9NUCBFTkQgUEFSQUxMRUwKKworIXNlcXVlbnRpYWwgZXF1aXZhbGVudCBzdGF0ZW1lbnRzIGZvciBjb21wYXJpc29uIAorICAgICAgIEJCPUJCKzEKKyAgICAgICBzY2FsYXIwMj1zY2FsYXIwMisxCisgICAgICAgc2NhbGFyMTI9c2NhbGFyMTIrMQorICAgICAgIHNjYWxhcjIyPXNjYWxhcjIyKzEKKyAgICAgICBzY2FsYXIzMj1zY2FsYXIzMisxCisKKyEgICAgICB3cml0ZSAoMSwqKSAiY2s6c3VtIG9mIEFBIGlzIixTVU0oQUEpLCIgc3VtIG9mIEJCIGlzICIsc3VtKEJCKQorICAgICAgIGlmIChTVU0oQUEpLz1TVU0oQkIpKSB0aGVuCisgICAgICAgICAgICB3cml0ZSgxLCopICJBcnJheSBhc3NpZ25tZW50IGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgICAgICByZXN1bHQ9cmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMC89c2NhbGFyMDIpIHRoZW4KKyAgICAgICAgICB3cml0ZSgxLCopICJTY2FsYXIgYXNzaWdubWVudCBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgaWYgKHNjYWxhcjEvPXNjYWxhcjEyKSB0aGVuCisgICAgICAgICAgd3JpdGUoMSwqKSAiQXRvbWljIGluc2lkZSBXT1JLU0hBUkUgaGFzIHNvbWUgcHJvYmxlbSIKKyAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArMQorICAgICAgIGVuZGlmCisgICAgICAgaWYgKHNjYWxhcjIvPXNjYWxhcjIyKSB0aGVuCisgICAgICAgICAgd3JpdGUoMSwqKSAiQ1JJVElDQUwgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsxCisgICAgICAgZW5kaWYKKyAgICAgICBpZiAoc2NhbGFyMy89c2NhbGFyMzIpIHRoZW4KKyAgICAgICAgICAgd3JpdGUoMSwqKSAiUEFSQUxMRUwgaW5zaWRlIFdPUktTSEFSRSBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKzEKKyAgICAgICBlbmRpZgorICAgICAgIGRvIGk9MSwxMDAwCisgICAgICAgICBpZiAoIGFicyggREQoaSktIEZGKGkpKSAuZ3QuIDEuMEUtNCApIHRoZW4KKwkgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgIGVuZCBpZgorICAgICAgIGVuZCBkbworICAgICAgIGlmICggY291bnQgLm5lLiAwICkgdGhlbgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIHdyaXRlKDEsKikgIldIRVJFIGhhcyBzb21lIHByb2JsZW0iCisgICAgICAgZW5kIGlmCisKKyAgICAgICBjb3VudCA9IDAKKyAgICAgICBkbyBpPTEsMTAwMAorICAgICAgICAgaWYgKCBDQyhpKSAubmUuIC1pICkgdGhlbgorICAgICAgICAgICAgY291bnQgPSBjb3VudCArIDEKKyAgICAgICAgIGVuZCBpZgorICAgICAgIGVuZCBkbworICAgICAgIGlmICggY291bnQgLm5lLiAwICkgdGhlbgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIHdyaXRlKDEsKikgIkZPUkFMTCBoYXMgc29tZSBwcm9ibGVtIgorICAgICAgIGVuZCBpZgorCisKKyFpZiBhbnl0aGluZyBpcyB3cm9uZywgc2V0IHJldHVybiB2YWx1ZSB0byAwCisgICAgICAgaWYgKHJlc3VsdD09MCkgdGhlbgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgZWxzZQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgZW5kIGlmCisgICAgICAgZW5kCis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93b3Jrc2hhcmVfZGVmYXVsdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NzRjNDMKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3dvcmtzaGFyZV9kZWZhdWx0LmYKQEAgLTAsMCArMSwzNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgbWFzdGVyIGRpcmVjdGl2ZSBieSBjb3VudGluZyB1cCBhIHZhcmlhYmxlIGluIGEgb21wIG1hc3RlciBzZWN0aW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgd29ya3NoYXJlIGRlZmF1bHQ8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPm9tcF93b3Jrc2hhcmVfZGVmYXVsdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0KKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKyAgICAgICAgSU5URUdFUiBteXN1bQorICAgICAgICBJTlRFR0VSIGkKKworICAgICAgICBrbm93bl9zdW0gPSA5OTkqMTAwMC8yCisKKyEkb21wIHBhcmFsbGVsIGRlZmF1bHQocHJpdmF0ZSkgc2hhcmVkKHN1bSkKKyEkb21wIGRvIAorICAgICAgICBETyBpID0gMSwgOTk5CisgICAgICAgICAgIG15c3VtID0gbXlzdW0gKyBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIGRvIAorCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBteXN1bQorISRvbXAgZW5kIGNyaXRpY2FsCisKKyEkb21wIGVuZCBwYXJhbGxlbAorCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL29tcF93dGltZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjU1NzMzNGYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vb21wX3d0aW1lLmYKQEAgLTAsMCArMSw0MyBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXBfZ2V0X3d0aW1lIGZ1bmN0aW9uLiBJdCBjb21wYXJlcyB0aGUgdGltZSB3aXRoIHdoaWNoIGlzIGNhbGxlZCBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggdGhlIHRpbWUgaXQgdG9vayBieSBtZXNzdXJpbmcgdGhlIGRpZmZlcmVuY2UgYmV0d2VlbiB0aGUgY2FsbCBvZiB0aGUgc2xlZXAgZnVuY3Rpb24gYW5kIGl0cyBlbmQuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcF9nZXRfd3RpbWU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5vbXBfd3RpbWU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBzdGFydAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGVuZHRpbWUKKyAgICAgICAgQ09NTU9OIHN0YXJ0LCBlbmR0aW1lCisgICAgICAgIGluY2x1ZGUgIm9tcF9saWIuaCIKKyAgICAgICAgPC9vbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiB3YWl0X3RpbWUKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBtZWFzdXJlZF90aW1lCisgICAgICAgIElOVEVHRVIgZmlsZXVuaXQKKyAgICAgICAgd2FpdF90aW1lPTEKKworICAgICAgICBzdGFydCA9IDA7CisgICAgICAgIGVuZHRpbWUgPSAwOworCisgICAgICAgICAgICAgICAgPG9tcHRzOm9ycGhhbj4KKyAgICAgICAgICAgICAgICA8b21wdHM6Y2hlY2s+CisgICAgICAgIHN0YXJ0PW9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIENBTEwgc2xlZXAod2FpdF90aW1lKQorICAgICAgICAgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgICAgICAgICAgPG9tcHRzOmNoZWNrPgorICAgICAgICBlbmR0aW1lPW9tcF9nZXRfd3RpbWUoKQorICAgICAgICAgICAgICAgIDwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIG1lYXN1cmVkX3RpbWU9ZW5kdGltZS1zdGFydAorICAgICAgICBXUklURSgxLCopICJ3b3JrIHRvb2siLG1lYXN1cmVkX3RpbWUsInNlYy4gdGltZS4iCisgICAgICAgIElGKG1lYXN1cmVkX3RpbWUuR1QuMC45OSp3YWl0X3RpbWUgLkFORC4KKyAgICAgJiBtZWFzdXJlZF90aW1lIC5MVC4gMS4wMSp3YWl0X3RpbWUpIFRIRU4KKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0wCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19maXJzdHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNzlhZTUyNwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fZmlyc3Rwcml2YXRlLmYKQEAgLTAsMCArMSwyNiBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBvbXAgcGFyYWxsZWwgZG8gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLHBhciBkbyBwcml2YXRlPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fZmlyc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIHN1bSxrbm93bl9zdW0sIGkyLCBpCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0wCisgICAgICAgIGkyID0gMworISRvbXAgcGFyYWxsZWwgZG8gPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShpMik8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjcm9zc2NoZWNrPiByZWR1Y3Rpb24oKzpzdW0pCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgKCBpKyBpMikKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yKzMqTE9PUENPVU5UCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9faWYuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4wYjdmYzlhCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19pZi5mCkBAIC0wLDAgKzEsMzIgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGZvciBpZiBkaXJlY3RpdmUuIE5lZWRzIGF0IGxlYXN0IHR3byB0aHJlYWRzLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gaWY8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz48L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19pZjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBvbXBfZ2V0X251bV90aHJlYWRzCisgICAgICAgIElOVEVHRVIgc3VtLGtub3duX3N1bSwgaSwgbnVtX3RocmVhZHMKKyAgICAgICAgSU5URUdFUiBjb250cm9sCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorCisgICAgICAgIGNvbnRyb2wgPSAwCishJG9tcCBwYXJhbGxlbCBkbyA8b21wdHM6Y2hlY2s+aWYgKGNvbnRyb2wgPT0gMSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgICBudW1fdGhyZWFkcyA9IG9tcF9nZXRfbnVtX3RocmVhZHMgKCkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAgV1JJVEUgKDEsKikgIk51bWJlciBvZiB0aHJlYWRzIGRldGVybWluZWQgYnk6IlwKKyAgICAgICAgICAgICAgICAgICAgIm9tZ19nZXRfbnVtX3RocmVhc2Q6IiwgbnVtX3RocmVhZHMKKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIG51bV90aHJlYWRzIC5FUS4gMSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi4xODAyMTBjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9kb19sYXN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsMjggQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIGRvIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRvIGxhc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+cGFyIGRvIHJlZHVjdGlvbiwgcGFyIGRvIHByaXZhdGU8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9kb19sYXN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIGtub3duX3N1bSwgaSAsIGkwCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgc3VtID0gMAorICAgICAgICBpMCA9IC0xCisKKyEkb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbigrOnN1bSkgc2NoZWR1bGUoc3RhdGljLDcpIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICggKGtub3duX3N1bSAuRVEuIHN1bSkgLkFORC4gKGkwIC5FUS4gTE9PUENPVU5UKSApIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgICAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX29yZGVyZWQuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fb3JkZXJlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzZDRjZDAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX29yZGVyZWQuZgpAQCAtMCwwICsxLDY3IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBvcmRlcmVkIGRpcmVjdGl2ZTwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gb3JkZXJlZDwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPnBhciBzY2hlZHVsZSBzdGF0PC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyEgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorISBIZWxwZXIgZnVuY3Rpb24gaXNfbGFyZ2VyCishICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gaV9pc2xhcmdlcjIoaSkKKyAgICAgICAgSU1QTElDSVQgTk9ORQorICAgICAgICBJTlRFR0VSIGkKKyAgICAgICAgSU5URUdFUiBsYXN0X2ksaXNsYXJnZXIKKyAgICAgICAgQ09NTU9OIC9jb20vIGxhc3RfaQorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCishICAgICAgICBwcmludCAqLCAibGFzdF9pIixsYXN0X2ksICJpIiwgaQorISBsYXN0X2kgaXMgYSBnbG9iYWwgdmFyaWFibGUKKyAgICAgICAgSUYgKCBpIC5HVC4gbGFzdF9pICkgVEhFTgorICAgICAgICAgIGlzbGFyZ2VyID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgaXNsYXJnZXIgPSAwCisgICAgICAgIEVORCBJRgorICAgICAgICBsYXN0X2kgPSBpCisgICAgICAgIGlfaXNsYXJnZXIyID0gaXNsYXJnZXIKKyAgICAgIEVORCBGVU5DVElPTgorCisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX29yZGVyZWQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIENPTU1PTiAvY29tLyBsYXN0X2kKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0saSwgbGFzdF9pCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaXNfbGFyZ2VyLHN1bSxpX2lzbGFyZ2VyMgorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpc19sYXJnZXIsc3VtLGkKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIAorICAgICAgICBzdW09MAorICAgICAgICBpc19sYXJnZXI9MQorICAgICAgICBsYXN0X2k9MAorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoc3RhdGljLCAxKSBvcmRlcmVkCisgICAgICAgIERPIGk9MSwgOTkKKyAgICAgICAgICAgICAgICA8b21wdHM6b3JwaGFuPgorCQk8b21wdHM6Y2hlY2s+CishJG9tcCBvcmRlcmVkCisJCTwvb21wdHM6Y2hlY2s+CisgICAgICAgIElGKCBpX2lzbGFyZ2VyMihpKSAuRVEuIDEgLkFORC4gaXNfbGFyZ2VyIC5FUS4gMSApIFRIRU4gIAorICAgICAgICAgIGlzX2xhcmdlciA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIGlzX2xhcmdlciA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICAgIHN1bSA9IHN1bSArIGkKKwkJPG9tcHRzOmNoZWNrPgorISRvbXAgZW5kIG9yZGVyZWQKKwkJPC9vbXB0czpjaGVjaz4KKyAgICAgICAgICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKyAgICAgICAga25vd25fc3VtID0gKDk5KjEwMCkvMgorIVlpIFdlbjsgU3VuIGNvbXBpbGVyIHdpbGwgZmFpbCBzb21ldGltZXMKKyEgICAgICAgIHByaW50ICosICJzdW0iLCBzdW0sICJrcyIsIGtub3duX3N1bSwgImxhIiwgaXNfbGFyZ2VyCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIGlzX2xhcmdlciAuRVEuIDEgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3ByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmRkMzlhYjkKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3ByaXZhdGUuZgpAQCAtMCwwICsxLDQ2IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyBwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIGRvIHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5wYXIgZG8gcmVkdWN0aW9uLG9tcCBmbHVzaDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBTVUJST1VUSU5FIGRvX3NvbWVfd29yazIoKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIFJFQUwgaQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHN1bQorICAgICAgICBJTlRSSU5TSUMgc3FydAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIHN1bSA9IDAuMAorICAgICAgICBpID0gMAorICAgICAgICBETyBXSElMRSAoaSA8IExPT1BDT1VOVCkKKyAgICAgICAgICAgc3VtID0gc3VtICsgc3FydChpKQorICAgICAgICAgICBpID0gaSArIDEKKyAgICAgICAgRU5EIERPCisgICAgICBFTkQKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCisKKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5wYXJfZG9fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sa25vd25fc3VtLCBpLCBpMiwgaTMKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorICAgICAgICBzdW0gPSAwCisKKyEkb21wIHBhcmFsbGVsIGRvIHJlZHVjdGlvbigrOnN1bSkgPG9tcHRzOmNoZWNrPnByaXZhdGUoaTIpPC9vbXB0czpjaGVjaz4gc2NoZWR1bGUoc3RhdGljLDEpCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaTIgPSBpCishJG9tcCBmbHVzaAorICAgICAgICAgIENBTEwgZG9fc29tZV93b3JrMigpCishJG9tcCBmbHVzaAorICAgICAgICAgIHN1bSA9IHN1bSArIGkyCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgICAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCooTE9PUENPVU5UKzEpKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfZG9fcmVkdWN0aW9uLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjlhM2Y0NTUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX2RvX3JlZHVjdGlvbi5mCkBAIC0wLDAgKzEsNDE1IEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBkbyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgZG8gcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX2RvX3JlZHVjdGlvbjwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTIsIGtub3duX3N1bSwgaSwgaTIsZGlmZgorICAgICAgICBJTlRFR0VSIHByb2R1Y3Qsa25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxka25vd25fc3VtLGR0LGRwdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHJvdW5kaW5nX2Vycm9yLCBkZGlmZgorICAgICAgICBJTlRFR0VSIGRvdWJsZV9ESUdJVFMKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBpbnRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAoZG91YmxlX0RJR0lUUz0yMCxNQVhfRkFDVE9SPTEwKQorICAgICAgICBQQVJBTUVURVIgKHJvdW5kaW5nX2Vycm9yPTEuRS02KQorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsIDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKzpzdW0pPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGIChrbm93bl9zdW0gLk5FLiBzdW0pIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRpZmYgPSAoTE9PUENPVU5UICogKExPT1BDT1VOVCArIDEpKSAvIDIKKworCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsIDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24gKC06IGRpZmYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9MSwgTE9PUENPVU5UCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisgIAorICAgICAgICBJRiAoIGRpZmYgLk5FLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkaWZmZXJlbmNlIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBzdW0sImluc3RlYWQgb2YgMC4iCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgZm9yIGRvdWJsZXMKKyAgICAgICAgZHN1bSA9MC4KKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdD0gZHB0ICogZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRrbm93bl9zdW0gPSAoMS1kcHQpLygxLWR0KQorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTAsRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworIAorICAgICAgICBJRihkc3VtIC5ORS4gZGtub3duX3N1bSAuQU5ELiAKKyAgICAgJiAgICBhYnMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgIGRzdW0sImluc3RlYWQgb2YgIixka25vd25fc3VtLCIoRGlmZmVyZW5jZTogIiwKKyAgICAgJiAgICAgIGRzdW0gLSBka25vd25fc3VtLCIpIgorICAgICAgICBFTkQgSUYKKyAgICAgICAgZHB0ID0gMQorCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgIGRwdCA9IGRwdCpkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGRpZmYgPSAoIDEtZHB0KS8oMS1kdCkKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0wLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRGlmZmVyZW5jZSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkZGlmZiwiaW5zdGVhZCBvZiAwLjAiCisgICAgICAgIEVORCBJRgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxNQVhfRkFDVE9SCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGIChrbm93bl9wcm9kdWN0IC5ORS4gcHJvZHVjdCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHByb2R1Y3QsIiBpbnN0ZWFkIG9mIixrbm93bl9wcm9kdWN0IAorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKC5OT1QuIGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIGxvZ2ljX2FuZCA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBBTkQgcGFzcyAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLkZBTFNFLgorICAgICAgICBFTkQgRE8KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5vci4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX29yICkgVEhFbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBPUiBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgRVFWLCB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkVRVi46bG9naWNfZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguRVFWLjpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBsb2dpY19lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCishLi4uIFRlc3QgbG9naWMgTkVRViwgd2hpY2ggaXMgdW5pcXVlIGluIEZvcnRyYW4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGIChsb2dpY19uZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBsb2dpY19uZXF2ID0gLkZBTFNFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguTkVRVi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5uZXF2LiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElBTkQ6Yml0X2FuZCk8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorIS4uLiBpYW5kKEksSik6IFJldHVybnMgdmFsdWUgcmVzdWx0aW5nIGZyb20gYm9vbGVhbiBBTkQgb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggYml0X2FuZCAuTFQuIDEgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMAorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgcmVkdWN0aW9uKElPUjpiaXRfb3IpCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YgCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouIAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIGRvCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKElPUjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggYml0X29yIC5MRS4gMCkgdGhlbgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJRU9SOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorICAgICAgICBETyBpID0gMSwgTE9PUENPVU5UCisgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJZW9yIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgZXhjbHVzaXZfYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gSUVPUihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGV4Y2x1c2l2X2JpdF9vciAubGUuIDApIHRoZW4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSWVvciBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsIGRvIHNjaGVkdWxlKGR5bmFtaWMsMSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNSU46bWluX3ZhbHVlKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9IE1JTihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICAgaW50X2FycmF5KGkpID0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtYXhfdmFsdWUgPSAtMzI3NjgKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDptYXhfdmFsdWUpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgICAgbWF4X3ZhbHVlID0gTUFYKG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggbWF4X3ZhbHVlIC5MVC4gTE9PUENPVU5UIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IGRvdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgZF9hcnJheShpKSA9IDEwIC0gaSpkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWluID0gMioqMTAKKyAgICAgICAgZHQgPSAwLjUKKworISRvbXAgcGFyYWxsZWwgZG8gc2NoZWR1bGUoZHluYW1pYywxKSA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjpkbWluKTwvb21wdHM6Y2hlY2s+CisgICAgICAgIERPIGkgPSAxLCBMT09QQ09VTlQKKyAgICAgICAgICBkbWluPSBNSU4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgZG8KKworICAgICAgICBJRiAoIGRtaW4gLkdULiAoMTAtZHQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRvdWJsZSBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBkX2FycmF5KGkpID0gaSAqIGR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtYXg9IC0gKDIqKjEwKQorCishJG9tcCBwYXJhbGxlbCBkbyBzY2hlZHVsZShkeW5hbWljLDEpIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24obWF4OmRtYXgpPC9vbXB0czpjaGVjaz4KKyAgICAgICAgRE8gaSA9IDEsIExPT1BDT1VOVAorICAgICAgICAgIGRtYXg9IG1heChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBkbworCisgICAgICAgIElGICggZG1heCAuTFQuIExPT1BDT1VOVCpkdCApVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBkb3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gIDAKKyAgICAgICAgRU5EIElGCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9maXJzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5iMzJiODVjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsMzQgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIGZpcnN0cHJpdmF0ZSBjbGF1c2UuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czpkZXBlbmRlbmNlcz5vbXAgY3JpdGljYWw8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bQorICAgICAgICBzdW0gPSA3CisgICAgICAgIHN1bTAgPSAxMQorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4gIAorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwgCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorPG9tcHRzOmNyb3NzY2hlY2s+ISRvbXAgc2VjdGlvbjwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorPG9tcHRzOmNyb3NzY2hlY2s+ISRvbXAgc2VjdGlvbjwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9IDExKjMgKyA3CisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9sYXN0cHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmQ5YzcyMWQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUuZgpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZTwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fbGFzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtLCBzdW0wLCBrbm93bl9zdW0sIGkgLGkwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgaTAgPSAtMQorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmxhc3Rwcml2YXRlKGkwKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShpMCk8L29tcHRzOmNyb3NzY2hlY2s+IHByaXZhdGUoaSxzdW0wKQorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwPWkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yCishICAgICAgICBwcmludCAqLCAic3VtIiwgc3VtLCAia3MiLCBrbm93bl9zdW0sIGkwCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIGkwIC5FUS4gOTk5ICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9wYXJfc2VjdGlvbl9wcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmZkMGFjMGUKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcHJpdmF0ZS5mCkBAIC0wLDAgKzEsODYgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlIGNsYXVzZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb24gcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbDwvb21wdHM6ZGVwZW5kZW5jZXM+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+cGFyX3NlY3Rpb25fcHJpdmF0ZTwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTAsIGtub3duX3N1bSwgaQorICAgICAgICBzdW0gPSA3CisgICAgICAgIHN1bTAgPSAwCishJG9tcCBwYXJhbGxlbCBzZWN0aW9uczxvbXB0czpjaGVjaz5wcml2YXRlKHN1bTAsaSk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaSk8L29tcHRzOmNyb3NzY2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuZXEuIHN1bSApIHRoZW4KKyAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORCAKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CisKKyAgICAgICAgaW50ZWdlciBmdW5jdGlvbiBjcnNjaGtfcGFyX3NlY3Rpb25fcHJpdmF0ZSgpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgaW50ZWdlciBzdW0sIHN1bTAsIGtub3duX3N1bSwgaQorICAgICAgICBzdW0gPSA3CisgICAgICAgIHN1bTAgPSAwCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBwcml2YXRlKGkpCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGRvIGk9MSwgMzk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIGVuZCBkbworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIGRvIGk9NDAwLCA2OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgZW5kIGRvCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgZG8gaT03MDAsIDk5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBlbmQgZG8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisgICAgICAgIGtub3duX3N1bSA9ICg5OTkqMTAwMCkvMis3CisgICAgICAgIGlmICgga25vd25fc3VtIC5lcS4gc3VtICkgdGhlbgorICAgICAgICAgIGNyc2Noa19wYXJfc2VjdGlvbl9wcml2YXRlID0gMQorICAgICAgICBlbHNlCisgICAgICAgICAgY3JzY2hrX3Bhcl9zZWN0aW9uX3ByaXZhdGUgPSAwCisgICAgICAgIGVuZCBpZgorICAgICAgICBlbmQKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Bhcl9zZWN0aW9uX3JlZHVjdC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmFkZGUzMDQKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vcGFyX3NlY3Rpb25fcmVkdWN0LmYKQEAgLTAsMCArMSw2MzEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbiBkaXJlY3RpdmUgd2l0aCBhbGwgaXRzIG9wdGlvbi48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHBhcmFsbGVsIHNlY3Rpb25zIHJlZHVjdGlvbjwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnBhcl9zZWN0aW9uX3JlZHVjdDwvb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPigpCisgICAgICAgIElNUExJQ0lUIE5PTkUKKyAgICAgICAgSU5URUdFUiBzdW0sIHN1bTIsIGtub3duX3N1bSwgaSwgaTIsZGlmZgorICAgICAgICBJTlRFR0VSIHByb2R1Y3Qsa25vd25fcHJvZHVjdCxpbnRfY29uc3QKKyAgICAgICAgSU5URUdFUiBNQVhfRkFDVE9SCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHN1bSxka25vd25fc3VtLGR0LGRwdAorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHJvdW5kaW5nX2Vycm9yLCBkZGlmZgorICAgICAgICBJTlRFR0VSIERPVUJMRV9ESUdJVFMKKyAgICAgICAgTE9HSUNBTCBsb2dpY19hbmQsIGxvZ2ljX29yLCBsb2dpY19lcXYsbG9naWNfbmVxdgorICAgICAgICBJTlRFR0VSIGJpdF9hbmQsIGJpdF9vcgorICAgICAgICBJTlRFR0VSIGV4Y2x1c2l2X2JpdF9vcgorICAgICAgICBJTlRFR0VSIG1pbl92YWx1ZSwgbWF4X3ZhbHVlCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZG1pbiwgZG1heAorICAgICAgICBJTlRFR0VSIHJlc3VsdAorICAgICAgICBJTkNMVURFICJvbXBfdGVzdHN1aXRlLmYiCisgICAgICAgIExPR0lDQUwgbG9naWNzKExPT1BDT1VOVCkKKyAgICAgICAgSU5URUdFUiBpbnRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBQQVJBTUVURVIgKGludF9jb25zdD0xMCxrbm93bl9wcm9kdWN0PTM2Mjg4MDApCisgICAgICAgIFBBUkFNRVRFUiAoRE9VQkxFX0RJR0lUUz0yMCxNQVhfRkFDVE9SPTEwKQorICAgICAgICBQQVJBTUVURVIgKHJvdW5kaW5nX2Vycm9yPTEuRS02KQorCisgICAgICAgIElOVEVHRVIgY3V0MSwgY3V0MiwgY3V0MywgY3V0NAorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljX29yID0gLkZBTFNFLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4pCisgICAgICAgIGN1dDIgPSBjdXQxICsgMQorICAgICAgICBjdXQzID0gMiAqIGN1dDEKKyAgICAgICAgY3V0NCA9IGN1dDMgKyAxCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0xLCBjdXQxCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0MiwgY3V0MworICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoa25vd25fc3VtIC5ORS4gc3VtKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgc3VtLCJpbnN0ZWFkIG9mICIsIGtub3duX3N1bQorICAgICAgICBFTkQgSUYKKworICAgICAgICBkaWZmID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZGlmZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0xLCBjdXQxCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgZGlmZiA9IGRpZmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBkaWZmID0gZGlmZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKyAgCisgICAgICAgIElGICggZGlmZiAuTkUuIDAgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGRpZmZlcmVuY2Ugd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIHN1bSwiaW5zdGVhZCBvZiAwLiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBmb3IgZG91YmxlcworICAgICAgICBkc3VtID0wLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKCs6ZHN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTAsNgorICAgICAgICAgICBkc3VtID0gZHN1bSArIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTIKKyAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMyxET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgCisgICAgICAgIElGKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgICBBQlMoZHN1bSAtIGRrbm93bl9zdW0pIC5HVC4gcm91bmRpbmdfZXJyb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIHN1bSB3aXRoIGRvdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgICBkc3VtLCJpbnN0ZWFkIG9mICIsZGtub3duX3N1bSwiKERpZmZlcmVuY2U6ICIsCisgICAgICYgICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorICAgICAgICBkcHQgPSAxCisKKworICAgICAgCisgICAgICAgIERPIGk9MSwgRE9VQkxFX0RJR0lUUworICAgICAgICAgICBkcHQgPSBkcHQqZHQKKyAgICAgICAgRU5EIERPCisgICAgICAgIGRkaWZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC06ZGRpZmYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLCA2CisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsIDEyCisgICAgICAgICAgZGRpZmYgPSBkZGlmZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEzLCBET1VCTEVfRElHSVRTLTEKKyAgICAgICAgICBkZGlmZiA9IGRkaWZmIC0gZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIEFCUyhkZGlmZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBEaWZmZXJlbmNlIHdpdGggZG91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgIGRkaWZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oKjpwcm9kdWN0KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwzCisgICAgICAgICAgIHByb2R1Y3QgPSBwcm9kdWN0ICogaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT00LDYKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTAKKyAgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gUHJvZHVjdCB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5BTkQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBpZiAoLm5vdC4gbG9naWNfYW5kKSB0aGVuCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXJ0IDEiCisgICAgICAgIGVuZCBpZgorCisKKyAgICAgICAgbG9naWNfYW5kID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLkFORC46bG9naWNfYW5kKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGIChsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhc3MgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5PUi46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguT1IuOmxvZ2ljX29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgbG9naWNzKGkpID0gLlRSVUUuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoLk5PVC4gbG9naWNfZXF2KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX2VxdiA9IC5UUlVFLgorICAgICAgICBsb2dpY3MoTE9PUENPVU5ULzIpID0gLkZBTFNFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5FUVYuOmxvZ2ljX2Vxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX2VxdiA9IGxvZ2ljX2VxdiAuRVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGxvZ2ljX2VxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBORVFWLCB3aGljaCBpcyB1bmlxdWUgaW4gRm9ydHJhbgorICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljcyhpKSA9IC5GQUxTRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguTkVRVi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAobG9naWNfbmVxdikgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBORVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfbmVxdiA9IC5GQUxTRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5UUlVFLgorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5ORVFWLjpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggLk5PVC4gbG9naWNfbmVxdiApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMQorICAgICAgICBFTkQgRE8KKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUFORDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9hbmQgPSBJQU5EKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGJpdF9hbmQgLkxULiAxICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgYml0X2FuZCA9IDEKKyAgICAgICAgaW50X2FycmF5KExPT1BDT1VOVC8yKSA9IDAKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJQU5EOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IElBTkQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gSUFORCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYoIGJpdF9hbmQgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElBTkQgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishLi4uIElvcihJLEopOiBSZXR1cm5zIHZhbHVlIHJlc3VsdGluZyBmcm9tIGJvb2xlYW4gT1Igb2YKKyEuLi4gcGFpciBvZiBiaXRzIGluIGVhY2ggb2YgSSBhbmQgSi4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSU9SKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBiaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihJT1I6Yml0X29yKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9vciA9IElPUihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBJT1IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBJb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgIGludF9hcnJheShpKSA9IDAKKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkdFLiAxKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oSUVPUjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBJRU9SKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IElFT1IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMTAgLSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1pbl92YWx1ZSA9IDY1NTM1CisKKyEkb21wIHBhcmFsbGVsIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oTUlOOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIG1pbl92YWx1ZSA9IE1JTihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgbWluX3ZhbHVlID0gTUlOKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIG1pbl92YWx1ZSA9IE1JTihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIG1pbl92YWx1ZSAuR1QuICgxMC1MT09QQ09VTlQpIClUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUlOIgorICAgICAgICBFTkQgSUYKKworCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1BWDptYXhfdmFsdWUpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIG1heF92YWx1ZSA9IE1BWChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBtYXhfdmFsdWUgPSBNQVgobWF4X3ZhbHVlLGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsIHNlY3Rpb25zCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNQVgiCisgICAgICAgIEVORCBJRgorCishLi4uIHRlc3QgZG91YmxlIG1pbiwgbWF4CisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBkX2FycmF5KGkpID0gMTAgLSBpKmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRtaW4gPSAyKioxMAorICAgICAgICBkdCA9IDAuNQorCishJG9tcCBwYXJhbGxlbCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKE1JTjpkbWluKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSAxLCBjdXQxCisgICAgICAgICAgZG1pbj0gTUlOKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGRtaW49IE1JTihkbWluLGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIGVuZCBwYXJhbGxlbCBzZWN0aW9ucworCisgICAgICAgIElGICggZG1pbiAuR1QuICgxMC1kdCkgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgZF9hcnJheShpKSA9IGkgKiBkdAorICAgICAgICBFTkQgRE8KKworICAgICAgICBkbWF4PSAtICgyKioxMCkKKworISRvbXAgcGFyYWxsZWwgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihNQVg6ZG1heCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgIGRtYXg9IE1BWChkbWF4LGRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICBkbWF4PSBNQVgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBkbWF4PSBNQVgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBlbmQgcGFyYWxsZWwgc2VjdGlvbnMKKworICAgICAgICBJRiAoIGRtYXggLmx0LiBMT09QQ09VTlQqZHQgKVRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gZG91YmxlIE1BWCIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgSUYgKCByZXN1bHQgLkVRLiAwICkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9ICAwCisgICAgICAgIEVORCBJRgorCisgICAgICAgIENMT1NFKDIpCisKKyAgICAgIEVORCBGVU5DVElPTgorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fZmlyc3Rwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNjMwMDU4YQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX2ZpcnN0cHJpdmF0ZS5mCkBAIC0wLDAgKzEsNDEgQEAKKzxvbXB0czp0ZXN0PgorPG9tcHRzOnRlc3RkZXNjcmlwdGlvbj5UZXN0IHdoaWNoIGNoZWNrcyB0aGUgb21wIHNlY3Rpb24gZmlyc3Rwcml2YXRlIGRpcmVjdGl2ZSBieSBhZGRpbmcgYSB2YXJpYWJsZSB3aGljaCBpcyBkZWZpbmVkIGJlZm9yZSB0aGUgcGFyYWxsZWwgcmVnaW9uLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgZmlyc3Rwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2VjdGlvbl9maXJzdHByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLHN1bTAKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gc3VtLHN1bTAKKzwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDExCishJG9tcCBwYXJhbGxlbAorICAgICAgICA8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPmZpcnN0cHJpdmF0ZShzdW0wKTwvb21wdHM6Y2hlY2s+PG9tcHRzOmNyb3NzY2hlY2s+cHJpdmF0ZShzdW0wKTwvb21wdHM6Y3Jvc3NjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAxMSozKzcKKyAgICAgICAgSUYgKCBrbm93bl9zdW0gLkVRLiBzdW0pIFRIRU4KKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQKKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9sYXN0cHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi41YmE3MTQ4Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fbGFzdHByaXZhdGUuZgpAQCAtMCwwICsxLDYyIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlIGRpcmVjdGl2ZS48L29tcHRzOnRlc3RkZXNjcmlwdGlvbj4KKzxvbXB0czpvbXB2ZXJzaW9uPjIuMDwvb21wdHM6b21wdmVyc2lvbj4KKzxvbXB0czpkaXJlY3RpdmU+b21wIHNlY3Rpb24gbGFzdHByaXZhdGU8L29tcHRzOmRpcmVjdGl2ZT4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX2xhc3Rwcml2YXRlPC9vbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSU5URUdFUiBrbm93bl9zdW0KKworICAgICAgICA8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgaSwgaTAsIHN1bSwgc3VtMAorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBpLGkwLHN1bQorICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgaTAgPSAtMQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5sYXN0cHJpdmF0ZShpMCk8L29tcHRzOmNoZWNrPjxvbXB0czpjcm9zc2NoZWNrPnByaXZhdGUoaTApPC9vbXB0czpjcm9zc2NoZWNrPiBwcml2YXRlKGksc3VtMCkKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT0xLCAzOTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgICBpMCA9IGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIHNlY3Rpb24KKyAgICAgICAgc3VtMCA9IDAKKyAgICAgICAgRE8gaT00MDAsIDY5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICAgIGkwID0gaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTcwMCwgOTk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgICAgaTAgPSBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBlbmQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgZW5kIHBhcmFsbGVsCisKKyAgICAgICAga25vd25fc3VtID0gKDk5OSoxMDAwKS8yCisgICAgICAgIElGICgga25vd25fc3VtIC5FUS4gc3VtIC5BTkQuIGkwIC5FUS4gOTk5ICkgVEhFTgorICAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXRzOnRlc3Q+CisKKwpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjI4YjgwOTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2VjdGlvbl9wcml2YXRlLmYKQEAgLTAsMCArMSw1NSBAQAorPG9tcHRzOnRlc3Q+Cis8b21wdHM6dGVzdGRlc2NyaXB0aW9uPlRlc3Qgd2hpY2ggY2hlY2tzIHRoZSBwYXJhbGxlbCBzZWN0aW9uIHByaXZhdGUgY2xhdXNlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgcGFyYWxsZWwgc2VjdGlvbiBwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zZWN0aW9uX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIga25vd25fc3VtCis8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgc3VtLHN1bTAsaQorICAgICAgICBDT01NT04gL29ycGh2YXJzLyBzdW0sc3VtMCxpCis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHN1bSA9IDcKKyAgICAgICAgc3VtMCA9IDAKKyEkb21wIHBhcmFsbGVsCisgICAgICAgIDxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cHJpdmF0ZShzdW0wLGkpPC9vbXB0czpjaGVjaz48b21wdHM6Y3Jvc3NjaGVjaz5wcml2YXRlKGkpPC9vbXB0czpjcm9zc2NoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTEsIDM5OQorICAgICAgICAgIHN1bTAgPSBzdW0wICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIGNyaXRpY2FsCisgICAgICAgIHN1bSA9IHN1bSArIHN1bTAKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgc2VjdGlvbgorICAgICAgICBzdW0wID0gMAorICAgICAgICBETyBpPTQwMCwgNjk5CisgICAgICAgICAgc3VtMCA9IHN1bTAgKyBpCisgICAgICAgIEVORCBETworISRvbXAgY3JpdGljYWwKKyAgICAgICAgc3VtID0gc3VtICsgc3VtMAorISRvbXAgZW5kIGNyaXRpY2FsCishJG9tcCBzZWN0aW9uCisgICAgICAgIHN1bTAgPSAwCisgICAgICAgIERPIGk9NzAwLCA5OTkKKyAgICAgICAgICBzdW0wID0gc3VtMCArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICBzdW0gPSBzdW0gKyBzdW0wCishJG9tcCBlbmQgY3JpdGljYWwKKyEkb21wIGVuZCBzZWN0aW9ucworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBrbm93bl9zdW0gPSAoOTk5KjEwMDApLzIrNworICAgICAgICBJRiAoIGtub3duX3N1bSAuRVEuIHN1bSkgVEhFTgorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+ID0gMAorICAgICAgICBFTkQgSUYKKyAgICAgIEVORAorPC9vbXB0czp0ZXN0Y29kZT4KKzwvb21wdHM6dGVzdD4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3JlZHVjdGlvbi5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NlY3Rpb25fcmVkdWN0aW9uLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZDdlNzBmOQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zZWN0aW9uX3JlZHVjdGlvbi5mCkBAIC0wLDAgKzEsNzQzIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzZWN0aW9ucyByZWR1Y3Rpb24gZGlyZWN0aXZlIHdpdGggYWxsIGl0cyBvcHRpb25zLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2VjdGlvbnMgcmVkdWN0aW9uPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6dGVzdGNvZGU+CisgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2VjdGlvbl9yZWR1Y3Rpb248L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgc3VtMiwga25vd25fc3VtLCBpMgorICAgICAgICBJTlRFR0VSIGtub3duX3Byb2R1Y3QsaW50X2NvbnN0CisgICAgICAgIElOVEVHRVIgTUFYX0ZBQ1RPUgorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRrbm93bl9zdW0sZHB0CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgUEFSQU1FVEVSIChpbnRfY29uc3Q9MTAsa25vd25fcHJvZHVjdD0zNjI4ODAwKQorCisgICAgICAgIDxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGR1bW15CisgICAgICAgIElOVEVHRVIgc3VtLCBkSUZmCisgICAgICAgIERPVUJMRSBQUkVDSVNJT04gZHQKKyAgICAgICAgRE9VQkxFIFBSRUNJU0lPTiBkc3VtLCBkZElGZgorICAgICAgICBJTlRFR0VSIHByb2R1Y3QKKyAgICAgICAgTE9HSUNBTCBsb2dpY3MoTE9PUENPVU5UKQorICAgICAgICBJTlRFR0VSIGludF9hcnJheShMT09QQ09VTlQpCisgICAgICAgIExPR0lDQUwgbG9naWNfYW5kLCBsb2dpY19vciwgbG9naWNfZXF2LGxvZ2ljX25lcXYKKyAgICAgICAgSU5URUdFUiBiaXRfYW5kLCBiaXRfb3IKKyAgICAgICAgSU5URUdFUiBleGNsdXNpdl9iaXRfb3IKKyAgICAgICAgSU5URUdFUiBtaW5fdmFsdWUsIG1heF92YWx1ZQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRfYXJyYXkoTE9PUENPVU5UKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIGRtaW4sIGRtYXgKKworICAgICAgICBJTlRFR0VSIERPVUJMRV9ESUdJVFMKKyAgICAgICAgSU5URUdFUiBjdXQxLCBjdXQyLCBjdXQzLCBjdXQ0CisgICAgICAgIFBBUkFNRVRFUiAoRE9VQkxFX0RJR0lUUz0yMCxNQVhfRkFDVE9SPTEwKQorICAgICAgICBET1VCTEUgUFJFQ0lTSU9OIHJvdW5kaW5nX2Vycm9yCisgICAgICAgIFBBUkFNRVRFUiAocm91bmRpbmdfZXJyb3I9MS5FLTYpCisKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gaSxzdW0sZElGZixwcm9kdWN0LGR0LGRzdW0sZGRJRmYsbG9naWNfYW5kLAorICAgICAmICAgIGxvZ2ljX29yLGxvZ2ljX2Vxdixsb2dpY19uZXF2LGxvZ2ljcyxpbnRfYXJyYXksYml0X2FuZCxiaXRfb3IsCisgICAgICYgICAgZXhjbHVzaXZfYml0X29yLG1pbl92YWx1ZSxkbWluLGRtYXgsZF9hcnJheSxtYXhfdmFsdWUKKyAgICAgICAgCisgICAgICAgIGN1dDEgPSBOSU5UKExPT1BDT1VOVCAvIDMuMykKKyAgICAgICAgY3V0MiA9IGN1dDEgKyAxCisgICAgICAgIGN1dDMgPSBjdXQxICogMgorICAgICAgICBjdXQ0ID0gY3V0MyArIDEKKworICAgICAgICA8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIGR0ID0gMS4vMy4KKyAgICAgICAga25vd25fc3VtID0gKExPT1BDT1VOVCAqIChMT09QQ09VTlQgKyAxKSkgLyAyCisgICAgICAgIHByb2R1Y3QgPSAxCisgICAgICAgIHN1bTIgPSAwCisgICAgICAgIHN1bSA9IDAKKyAgICAgICAgZHN1bSA9IDAuCisgICAgICAgIHJlc3VsdCA9MCAKKyAgICAgICAgbG9naWNfYW5kID0gLnRydWUuCisgICAgICAgIGxvZ2ljX29yID0gLmZhbHNlLgorICAgICAgICBiaXRfYW5kID0gMQorICAgICAgICBiaXRfb3IgPSAwCisgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IDAKKyAgICAgICAgY3V0MSA9IE5JTlQoTE9PUENPVU5UIC8gMy4zKQorICAgICAgICBjdXQyID0gY3V0MSArIDEKKyAgICAgICAgY3V0MyA9IGN1dDEgKiAyCisgICAgICAgIGN1dDQgPSBjdXQzICsgMQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIHByaXZhdGUoaSkgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOnN1bSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0xLCBjdXQxCisgICAgICAgICAgc3VtID0gc3VtICsgaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9Y3V0MiwgY3V0MworICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIHN1bSA9IHN1bSArIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3N1bSAuTkUuIHN1bSkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggaW50ZWdlcnM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICBzdW0sImluc3RlYWQgb2YgIiwga25vd25fc3VtCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRJRmYgPSBrbm93bl9zdW0KKworCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiAoLTogZElGZik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0xLCBjdXQxCisgICAgICAgICAgZElGZiA9IGRJRmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQyLCBjdXQzCisgICAgICAgICAgZElGZiA9IGRJRmYgLSBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBkSUZmID0gZElGZiAtIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisgIAorICAgICAgICBJRiAoIGRJRmYgLk5FLiAwICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gZElGZmVyZW5jZSB3aXRoIGludGVnZXJzOiBSZXN1bHQgd2FzICIsCisgICAgICYgICAgc3VtLCJpbnN0ZWFkIG9mIDAuIgorICAgICAgICBFTkQgSUYKKworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCishICAgVGVzdCBmb3IgRE91YmxlcworISoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiohCisgICAgICAgIGRzdW0gPSAwLgorICAgICAgICBkcHQgPSAxCisKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0PSBkcHQgKiBkdAorICAgICAgICBFTkQgRE8KKyAgICAgICAgZGtub3duX3N1bSA9ICgxLWRwdCkvKDEtZHQpCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigrOmRzdW0pPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0wLDYKKyAgICAgICAgICAgICAgZHN1bSA9IGRzdW0gKyBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LDEyCisgICAgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MTMsRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgICAgIGRzdW0gPSBkc3VtICsgZHQqKmkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAKKyAgICAgICAgSUYgKGRzdW0gLk5FLiBka25vd25fc3VtIC5BTkQuIAorICAgICAmICAgIGFicyhkc3VtIC0gZGtub3duX3N1bSkgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gc3VtIHdpdGggRE91YmxlczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgZHN1bSwiaW5zdGVhZCBvZiAiLGRrbm93bl9zdW0sIihESUZmZXJlbmNlOiAiLAorICAgICAmICAgICAgZHN1bSAtIGRrbm93bl9zdW0sIikiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGRwdCA9IDEKKyAgICAgICAgRE8gaT0xLCBET1VCTEVfRElHSVRTCisgICAgICAgICAgZHB0ID0gZHB0KmR0CisgICAgICAgIEVORCBETworCisgICAgICAgIGRkSUZmID0gKCAxLWRwdCkvKDEtZHQpCishJG9tcCBwYXJhbGxlbAorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigtOmRkSUZmKTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MCwgNgorICAgICAgICAgIGRkSUZmID0gZGRJRmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT03LCAxMgorICAgICAgICAgIGRkSUZmID0gZGRJRmYgLSBkdCoqaQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xMywgRE9VQkxFX0RJR0lUUy0xCisgICAgICAgICAgZGRJRmYgPSBkZElGZiAtIGR0KippCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGFicyhkZElGZikgLkdULiByb3VuZGluZ19lcnJvciApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRElGZmVyZW5jZSB3aXRoIERPdWJsZXM6IFJlc3VsdCB3YXMgIiwKKyAgICAgJiAgICAgIGRkSUZmLCJpbnN0ZWFkIG9mIDAuMCIKKyAgICAgICAgRU5EIElGCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigqOnByb2R1Y3QpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLDMKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9NCw2CisgICAgICAgICAgcHJvZHVjdCA9IHByb2R1Y3QgKiBpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTcsMTAKKyAgICAgICAgICBwcm9kdWN0ID0gcHJvZHVjdCAqIGkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGtub3duX3Byb2R1Y3QgLk5FLiBwcm9kdWN0KSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIFByb2R1Y3Qgd2l0aCBpbnRlZ2VyczogUmVzdWx0IHdhcyAiLAorICAgICAmICAgICAgcHJvZHVjdCwiIGluc3RlYWQgb2YiLGtub3duX3Byb2R1Y3QgCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguYW5kLjpsb2dpY19hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsY3V0MworICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICBsb2dpY19hbmQgPSBsb2dpY19hbmQgLkFORC4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19hbmQpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgQU5EIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBsb2dpY19hbmQgPSAuVFJVRS4KKyAgICAgICAgbG9naWNzKExPT1BDT1VOVC8yKSA9IC5GQUxTRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5hbmQuOmxvZ2ljX2FuZCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsY3V0MQorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgbG9naWNfYW5kID0gbG9naWNfYW5kIC5BTkQuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgIGxvZ2ljX2FuZCA9IGxvZ2ljX2FuZCAuQU5ELiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX2FuZCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIEFORCBwYXNzIDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuRkFMU0UuCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oLm9yLjpsb2dpY19vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX29yID0gbG9naWNfb3IgLk9SLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX29yKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfb3IgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5vci46bG9naWNfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfb3IgPSBsb2dpY19vciAuT1IuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19vciA9IGxvZ2ljX29yIC5PUi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggLk5PVC4gbG9naWNfb3IgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGxvZ2ljIE9SIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyEuLi4gVGVzdCBsb2dpYyBFUVYsIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuVFJVRS4KKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguZXF2Ljpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICguTk9ULiBsb2dpY19lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgRVFWIHBhcnQgMSIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgbG9naWNfZXF2ID0gLlRSVUUuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuRkFMU0UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbiguZXF2Ljpsb2dpY19lcXYpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLGN1dDEKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLGN1dDMKKyAgICAgICAgICAgbG9naWNfZXF2ID0gbG9naWNfZXF2IC5lcXYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LExPT1BDT1VOVAorICAgICAgICAgICBsb2dpY19lcXYgPSBsb2dpY19lcXYgLmVxdi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggbG9naWNfZXF2ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBsb2dpYyBFUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworIS4uLiBUZXN0IGxvZ2ljIE5FUVYsIHdoaWNoIGlzIHVuaXF1ZSBpbiBGb3J0cmFuCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICBsb2dpY3MoaSkgPSAuZmFsc2UuCisgICAgICAgIEVORCBETworCisgICAgICAgIGxvZ2ljX25lcXYgPSAuZmFsc2UuCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbigubmVxdi46bG9naWNfbmVxdik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICBsb2dpY19uZXF2ID0gbG9naWNfbmVxdiAuTkVRVi4gbG9naWNzKGkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKGxvZ2ljX25lcXYpIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gbG9naWMgTkVRViBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGxvZ2ljX25lcXYgPSAuRkFMU0UuCisgICAgICAgIGxvZ2ljcyhMT09QQ09VTlQvMikgPSAuVFJVRS4KKworISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKC5uZXF2Ljpsb2dpY19uZXF2KTwvb21wdHM6Y2hlY2s+CishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSxjdXQxCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MixjdXQzCisgICAgICAgICAgIGxvZ2ljX25lcXYgPSBsb2dpY19uZXF2IC5ORVFWLiBsb2dpY3MoaSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCxMT09QQ09VTlQKKyAgICAgICAgICAgbG9naWNfbmVxdiA9IGxvZ2ljX25lcXYgLk5FUVYuIGxvZ2ljcyhpKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIC5OT1QuIGxvZ2ljX25lcXYgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIHdyaXRlKDEsKikgIkVycm9yIGluIGxvZ2ljIE5FUVYgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsIExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAxCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaWFuZDpiaXRfYW5kKTwvb21wdHM6Y2hlY2s+CishLi4uIGlhbmQoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIEFORCBvZgorIS4uLiBwYWlyIG9mIGJpdHMgaW4gZWFjaCBvZiBJIGFuZCBKLgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPTEsIGN1dDEKKyAgICAgICAgIGJpdF9hbmQgPSBpYW5kKGJpdF9hbmQsaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICBiaXRfYW5kID0gaWFuZChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0NCwgTE9PUENPVU5UCisgICAgICAgICBiaXRfYW5kID0gaWFuZChiaXRfYW5kLGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBiaXRfYW5kIC5sdC4gMSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgd3JpdGUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIGJpdF9hbmQgPSAxCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAwCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpYW5kOmJpdF9hbmQpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X2FuZCA9IGlhbmQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQyLCBjdXQzCisgICAgICAgICAgYml0X2FuZCA9IGlhbmQgKCBiaXRfYW5kLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfYW5kID0gaWFuZCAoIGJpdF9hbmQsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGKCBiaXRfYW5kIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSUFORCBwYXJ0IDIiCisgICAgICAgIEVORCBJRgorCisgICAgICAgIERPIGk9MSwgTE9PUENPVU5UCisgICAgICAgICAgaW50X2FycmF5KGkpID0gMAorICAgICAgICBFTkQgRE8KKworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaW9yOmJpdF9vcik8L29tcHRzOmNoZWNrPgorIS4uLiBJb3IoSSxKKTogUmV0dXJucyB2YWx1ZSByZXN1bHRpbmcgZnJvbSBib29sZWFuIE9SIG9mCishLi4uIHBhaXIgb2YgYml0cyBpbiBlYWNoIG9mIEkgYW5kIEouCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9MSwgY3V0MQorICAgICAgICAgIGJpdF9vciA9IGlvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDIsIGN1dDMKKyAgICAgICAgICBiaXRfb3IgPSBpb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT1jdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICBiaXRfb3IgPSBpb3IoYml0X29yLCBpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIEVORCBzZWN0aW9ucworPC9vbXB0czpvcnBoYW4+CishJG9tcCBFTkQgcGFyYWxsZWwKKworICAgICAgICBJRiAoIGJpdF9vciAuR0UuIDEpIFRIRU4KKyAgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIElvciBwYXJ0IDEiCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgYml0X29yID0gMAorICAgICAgICBpbnRfYXJyYXkoTE9PUENPVU5ULzIpID0gMQorISRvbXAgcGFyYWxsZWwKKzxvbXB0czpvcnBoYW4+CishJG9tcCBzZWN0aW9ucyA8b21wdHM6Y2hlY2s+cmVkdWN0aW9uKGlvcjpiaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaT0xLCBjdXQxCisgICAgICAgICAgYml0X29yID0gSW9yKGJpdF9vciwgaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGk9Y3V0MiwgY3V0MworICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpPWN1dDQsIExPT1BDT1VOVAorICAgICAgICAgIGJpdF9vciA9IElvcihiaXRfb3IsIGludF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggYml0X29yIC5MRS4gMCkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gSW9yIHBhcnQgMiIKKyAgICAgICAgRU5EIElGCisKKyAgICAgICAgRE8gaT0xLCBMT09QQ09VTlQKKyAgICAgICAgICBpbnRfYXJyYXkoaSkgPSAwCisgICAgICAgIEVORCBETworCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24oaWVvcjpleGNsdXNpdl9iaXRfb3IpPC9vbXB0czpjaGVjaz4KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IDEsIGN1dDEKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIGV4Y2x1c2l2X2JpdF9vciA9IGllb3IoZXhjbHVzaXZfYml0X29yLCBpbnRfYXJyYXkoaSkpCisgICAgICAgIEVORCBETworISRvbXAgRU5EIHNlY3Rpb25zCis8L29tcHRzOm9ycGhhbj4KKyEkb21wIEVORCBwYXJhbGxlbAorCisgICAgICAgIElGICggZXhjbHVzaXZfYml0X29yIC5HRS4gMSkgVEhFTgorICAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAxIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSAwCisgICAgICAgIGludF9hcnJheShMT09QQ09VTlQvMikgPSAxCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihpZW9yOmV4Y2x1c2l2X2JpdF9vcik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQyLCBjdXQzCisgICAgICAgICAgICBleGNsdXNpdl9iaXRfb3IgPSBpZW9yKGV4Y2x1c2l2X2JpdF9vciwgaW50X2FycmF5KGkpKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDQsIExPT1BDT1VOVAorICAgICAgICAgICAgZXhjbHVzaXZfYml0X29yID0gaWVvcihleGNsdXNpdl9iaXRfb3IsIGludF9hcnJheShpKSkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBleGNsdXNpdl9iaXRfb3IgLkxFLiAwKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIEllb3IgcGFydCAyIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGludF9hcnJheShpKSA9IDEwIC0gaQorICAgICAgICBFTkQgRE8KKworICAgICAgICBtaW5fdmFsdWUgPSA2NTUzNQorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24obWluOm1pbl92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgbWluX3ZhbHVlID0gbWluKG1pbl92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9IG1pbihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIG1pbl92YWx1ZSA9IG1pbihtaW5fdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtaW5fdmFsdWUgLkdULiAoMTAtTE9PUENPVU5UKSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gaW50ZWdlciBNSU4iCisgICAgICAgIEVORCBJRgorCisKKyAgICAgICAgRE8gaT0xLExPT1BDT1VOVAorICAgICAgICAgICBpbnRfYXJyYXkoaSkgPSBpCisgICAgICAgIEVORCBETworCisgICAgICAgIG1heF92YWx1ZSA9IC0zMjc2OAorCishJG9tcCBwYXJhbGxlbAorPG9tcHRzOm9ycGhhbj4KKyEkb21wIHNlY3Rpb25zIDxvbXB0czpjaGVjaz5yZWR1Y3Rpb24obWF4Om1heF92YWx1ZSk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgbWF4X3ZhbHVlID0gbWF4KG1heF92YWx1ZSxpbnRfYXJyYXkoaSkgKQorICAgICAgICBFTkQgRE8KKyEkb21wIHNlY3Rpb24KKyAgICAgICAgRE8gaSA9IGN1dDIsIGN1dDMKKyAgICAgICAgICAgIG1heF92YWx1ZSA9IG1heChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBzZWN0aW9uCisgICAgICAgIERPIGkgPSBjdXQ0LCBMT09QQ09VTlQKKyAgICAgICAgICAgIG1heF92YWx1ZSA9IG1heChtYXhfdmFsdWUsaW50X2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBtYXhfdmFsdWUgLkxULiBMT09QQ09VTlQgKSBUSEVOCisgICAgICAgICAgcmVzdWx0ID0gcmVzdWx0ICsgMQorICAgICAgICAgIFdSSVRFKDEsKikgIkVycm9yIGluIGludGVnZXIgTUFYIgorICAgICAgICBFTkQgSUYKKworIS4uLiB0ZXN0IERPdWJsZSBtaW4sIG1heAorICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSAxMCAtIGkqZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1pbiA9IDIqKjEwCisgICAgICAgIGR0ID0gMC41CisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtaW46ZG1pbik8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZG1pbj0gbWluKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgZG1pbj0gbWluKGRtaW4sZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWluPSBtaW4oZG1pbixkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWluIC5HVC4gKDEwLWR0KSApIFRIRU4KKyAgICAgICAgICByZXN1bHQgPSByZXN1bHQgKyAxCisgICAgICAgICAgV1JJVEUoMSwqKSAiRXJyb3IgaW4gRE91YmxlIE1JTiIKKyAgICAgICAgRU5EIElGCisKKworICAgICAgICBETyBpPTEsTE9PUENPVU5UCisgICAgICAgICAgIGRfYXJyYXkoaSkgPSBpICogZHQKKyAgICAgICAgRU5EIERPCisKKyAgICAgICAgZG1heD0gLSAoMioqMTApCisKKyEkb21wIHBhcmFsbGVsCis8b21wdHM6b3JwaGFuPgorISRvbXAgc2VjdGlvbnMgPG9tcHRzOmNoZWNrPnJlZHVjdGlvbihtYXg6ZG1heCk8L29tcHRzOmNoZWNrPgorISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gMSwgY3V0MQorICAgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0MiwgY3V0MworICAgICAgICAgICAgZG1heD0gbWF4KGRtYXgsZF9hcnJheShpKSApCisgICAgICAgIEVORCBETworISRvbXAgc2VjdGlvbgorICAgICAgICBETyBpID0gY3V0NCwgTE9PUENPVU5UCisgICAgICAgICAgICBkbWF4PSBtYXgoZG1heCxkX2FycmF5KGkpICkKKyAgICAgICAgRU5EIERPCishJG9tcCBFTkQgc2VjdGlvbnMKKzwvb21wdHM6b3JwaGFuPgorISRvbXAgRU5EIHBhcmFsbGVsCisKKyAgICAgICAgSUYgKCBkbWF4IC5MVC4gTE9PUENPVU5UKmR0ICkgVEhFTgorICAgICAgICAgIHJlc3VsdCA9IHJlc3VsdCArIDEKKyAgICAgICAgICBXUklURSgxLCopICJFcnJvciBpbiBET3VibGUgTUFYIgorICAgICAgICBFTkQgSUYKKworICAgICAgICBJRiAoIHJlc3VsdCAuRVEuIDAgKSBUSEVOCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMQorICAgICAgICBFTFNFCisgICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAgMAorICAgICAgICBFTkQgSUYKKworICAgICAgICBDTE9TRSgyKQorCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX2NvcHlwcml2YXRlLmYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uMDg3OGE2NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfY29weXByaXZhdGUuZgpAQCAtMCwwICsxLDQxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgY29weXByaXZhdGUgZGlyZWN0aXZlLjwvb21wdHM6dGVzdGRlc2NyaXB0aW9uPgorPG9tcHRzOm9tcHZlcnNpb24+Mi4wPC9vbXB0czpvbXB2ZXJzaW9uPgorPG9tcHRzOmRpcmVjdGl2ZT5vbXAgc2luZ2xlIGNvcHlwcml2YXRlPC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIHBhcmxsZWwsb21wIGNyaXRpY2FsPC9vbXB0czpkZXBlbmRlbmNlcz4KKzxvbXB0czp0ZXN0Y29kZT4KKyAgICAgIElOVEVHRVIgRlVOQ1RJT04gPG9tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT5zaW5nbGVfY29weXByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgb21wX2dldF90aHJlYWRfbnVtCisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKzxvbXB0czpvcnBoYW46dmFycz4KKyAgICAgICAgSU5URUdFUiBpLGosdGhyZWFkLG5yX2l0ZXJhdGlvbnMscmVzdWx0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIG5yX2l0ZXJhdGlvbnMscmVzdWx0Cis8L29tcHRzOm9ycGhhbjp2YXJzPgorCisgICAgICAgIHJlc3VsdD0wCisgICAgICAgIG5yX2l0ZXJhdGlvbnM9MAorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGksaix0aHJlYWQpCisgICAgICAgIDxvbXB0czpvcnBoYW4+CisgICAgICAgIERPIGk9MCxMT09QQ09VTlQtMQorICAgICAgICAgIHRocmVhZD1PTVBfR0VUX1RIUkVBRF9OVU0oKQorISRvbXAgc2luZ2xlIAorICAgICAgICAgIG5yX2l0ZXJhdGlvbnM9bnJfaXRlcmF0aW9ucysxCisgICAgICAgICAgaj1pCishJG9tcCBlbmQgc2luZ2xlIDxvbXB0czpjaGVjaz5jb3B5cHJpdmF0ZShqKTwvb21wdHM6Y2hlY2s+CishJG9tcCBjcml0aWNhbAorICAgICAgICAgIHJlc3VsdD1yZXN1bHQrai1pOworISRvbXAgZW5kIGNyaXRpY2FsCisgICAgICAgIEVORCBETworICAgICAgICA8L29tcHRzOm9ycGhhbj4KKyEkb21wIGVuZCBwYXJhbGxlbAorICAgICAgICBJRihyZXN1bHQgLkVRLiAwIC5BTkQuIAorICAgICAmICAgICBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPj0xCisgICAgICAgIEVMU0UKKyAgICAgICAgICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+PTAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX25vd2FpdC5mIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5mOTQ0YWY1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3NpbmdsZV9ub3dhaXQuZgpAQCAtMCwwICsxLDUwIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+PC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nbGUgbm93YWl0PC9vbXB0czpkaXJlY3RpdmU+Cis8b21wdHM6ZGVwZW5kZW5jZXM+b21wIGNyaXRpY2FsLG9tcCBhdG9taWM8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgSU5URUdFUiBGVU5DVElPTiA8b21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lPnNpbmdsZV9ub3dhaXQ8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgcmVzdWx0LCB0b3RhbF9pdGVyYXRpb25zLCBteV9pdGVyYXRpb25zLGkKKyAgICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorPG9tcHRzOm9ycGhhbjp2YXJzPgorICAgICAgICBJTlRFR0VSIG5yX2l0ZXJhdGlvbnMKKyAgICAgICAgQ09NTU9OIC9vcnBodmFycy8gbnJfaXRlcmF0aW9ucworPC9vbXB0czpvcnBoYW46dmFycz4KKworICAgICAgICByZXN1bHQ9MAorICAgICAgICBucl9pdGVyYXRpb25zPTAKKyAgICAgICAgdG90YWxfaXRlcmF0aW9ucz0wCisgICAgICAgIG15X2l0ZXJhdGlvbnM9MAorCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGkpCisgICAgICAgIERPIGk9MCwgTE9PUENPVU5UIC0xCisgICAgICAgIDxvbXB0czpvcnBoYW4+Cis8b21wdHM6Y2hlY2s+ISRvbXAgc2luZ2xlPC9vbXB0czpjaGVjaz4KKyEkb21wIGF0b21pYworICAgICAgICAgIG5yX2l0ZXJhdGlvbnMgPSBucl9pdGVyYXRpb25zICsgMQorPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKyAgICAgICAgPC9vbXB0czpvcnBoYW4+CisgICAgICAgIEVORCBETworISRvbXAgZW5kIHBhcmFsbGVsCishJG9tcCBwYXJhbGxlbCBwcml2YXRlKGksbXlfaXRlcmF0aW9ucykKKyAgICAgICAgbXlfaXRlcmF0aW9ucyA9IDAKKyAgICAgICAgRE8gaT0wLCBMT09QQ09VTlQgLTEKKzxvbXB0czpjaGVjaz4hJG9tcCBzaW5nbGU8L29tcHRzOmNoZWNrPgorICAgICAgICAgIG15X2l0ZXJhdGlvbnMgPSBteV9pdGVyYXRpb25zICsgMQorPG9tcHRzOmNoZWNrPiEkb21wIGVuZCBzaW5nbGUgbm93YWl0PC9vbXB0czpjaGVjaz4KKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICB0b3RhbF9pdGVyYXRpb25zID0gdG90YWxfaXRlcmF0aW9ucyArIG15X2l0ZXJhdGlvbnMKKyEkb21wIGVuZCBjcml0aWNhbAorISRvbXAgZW5kIHBhcmFsbGVsCisgICAgICAgIElGICggbnJfaXRlcmF0aW9ucyAuRVEuIExPT1BDT1VOVCAuQU5ELgorICAgICAmICAgICB0b3RhbF9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UICkgVEhFTgorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDAKKyAgICAgICAgRU5EIElGCisgICAgICBFTkQgRlVOQ1RJT04KKzwvb21wdHM6dGVzdGNvZGU+Cis8L29tcHRzOnRlc3Q+CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX3ByaXZhdGUuZiBiL3JjMy90ZXN0c3VpdGUvZm9ydHJhbi9zaW5nbGVfcHJpdmF0ZS5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjdhZDRhNmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vc2luZ2xlX3ByaXZhdGUuZgpAQCAtMCwwICsxLDUxIEBACis8b21wdHM6dGVzdD4KKzxvbXB0czp0ZXN0ZGVzY3JpcHRpb24+VGVzdCB3aGljaCBjaGVja3MgdGhlIG9tcCBzaW5nbGUgcHJpdmF0ZSBkaXJlY3RpdmUuPC9vbXB0czp0ZXN0ZGVzY3JpcHRpb24+Cis8b21wdHM6b21wdmVyc2lvbj4yLjA8L29tcHRzOm9tcHZlcnNpb24+Cis8b21wdHM6ZGlyZWN0aXZlPm9tcCBzaW5nZWwgcHJpdmF0ZTwvb21wdHM6ZGlyZWN0aXZlPgorPG9tcHRzOmRlcGVuZGVuY2VzPm9tcCBjcml0aWNhbCxvbXAgZmx1c2gsb21wIHNpbmdsZSBub3dhaXQ8L29tcHRzOmRlcGVuZGVuY2VzPgorPG9tcHRzOnRlc3Rjb2RlPgorICAgICAgICBJTlRFR0VSIEZVTkNUSU9OIDxvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWU+c2luZ2xlX3ByaXZhdGU8L29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZT4oKQorICAgICAgICBJTVBMSUNJVCBOT05FCisgICAgICAgIElOVEVHRVIgbnJfaXRlcmF0aW9ucywgaQorCQk8b21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOVEVHRVIgcmVzdWx0CisgICAgICAgIElOVEVHRVIgbnJfdGhyZWFkc19pbl9zaW5nbGUsIG15cmVzdWx0LCBteWl0CisgICAgICAgIENPTU1PTiAvb3JwaHZhcnMvIHJlc3VsdCxucl9pdGVyYXRpb25zCisJCTwvb21wdHM6b3JwaGFuOnZhcnM+CisgICAgICAgIElOQ0xVREUgIm9tcF90ZXN0c3VpdGUuZiIKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorICAgICAgICByZXN1bHQ9MAorICAgICAgICBteXJlc3VsdD0wCisgICAgICAgIG15aXQ9MAorICAgICAgICBucl9pdGVyYXRpb25zPTAKKyEkb21wIHBhcmFsbGVsIHByaXZhdGUoaSwgbXlyZXN1bHQsIG15aXQpCis8b21wdHM6b3JwaGFuPgorICAgICAgICBteXJlc3VsdCA9IDAKKyAgICAgICAgbXlpdCA9IDAKKyAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGU9MAorISRvbXAgYmFycmllcgorICAgICAgICBETyBpPTAsIExPT1BDT1VOVCAtMQorISRvbXAgc2luZ2xlIDxvbXB0czpjaGVjaz5wcml2YXRlKG5yX3RocmVhZHNfaW5fc2luZ2xlKTwvb21wdHM6Y2hlY2s+CisgICAgICAgICAgbnJfdGhyZWFkc19pbl9zaW5nbGUgPSAwCishJG9tcCBmbHVzaAorICAgICAgICAgIG5yX3RocmVhZHNfaW5fc2luZ2xlID0gbnJfdGhyZWFkc19pbl9zaW5nbGUgKyAxCishJG9tcCBmbHVzaAorICAgICAgICAgIG15aXQgPSBteWl0ICsgMQorICAgICAgICAgIG15cmVzdWx0ID0gbXlyZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZQorISRvbXAgZW5kIHNpbmdsZSBub3dhaXQKKyAgICAgICAgRU5EIERPCishJG9tcCBjcml0aWNhbAorICAgICAgICByZXN1bHQgPSByZXN1bHQgKyBucl90aHJlYWRzX2luX3NpbmdsZQorICAgICAgICBucl9pdGVyYXRpb25zID0gbnJfaXRlcmF0aW9ucyArIG15aXQKKyEkb21wIGVuZCBjcml0aWNhbAorPC9vbXB0czpvcnBoYW4+CishJG9tcCBlbmQgcGFyYWxsZWwKKyAgICAgICAgV1JJVEUoMSwqKSAicmVzdWx0IGlzIixyZXN1bHQsIm5yX2l0IGlzIixucl9pdGVyYXRpb25zCisgICAgICAgIElGICggcmVzdWx0IC5FUS4gMCAuQU5ELiBucl9pdGVyYXRpb25zIC5FUS4gTE9PUENPVU5UKSBUSEVOCisgICAgICAgICAgPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPiA9IDEKKyAgICAgICAgRUxTRQorICAgICAgICAgIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gPSAwCisgICAgICAgIEVORCBJRgorICAgICAgRU5ECis8L29tcHRzOnRlc3Rjb2RlPgorPC9vbXB0czp0ZXN0PgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0IGIvcmMzL3Rlc3RzdWl0ZS9mb3J0cmFuL3Rlc3RsaXN0LWYudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjQxNzY2ZTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL2ZvcnRyYW4vdGVzdGxpc3QtZi50eHQKQEAgLTAsMCArMSw0NSBAQAorZG9fZmlyc3Rwcml2YXRlLmYKK2RvX2xhc3Rwcml2YXRlCitkb19vcmRlcmVkCitkb19wcml2YXRlCitkb19yZWR1Y3Rpb24KKyNkb19zY2hlZHVsZV9keW5hbWljCisjZG9fc2NoZWR1bGVfZ3VpZGVkCisjZG9fc2NoZWR1bGVfc3RhdGljCitoYXNfb3Blbm1wCisjb21wX2F0b21pYworb21wX2JhcnJpZXIKK29tcF9jb3B5aW4KK29tcF9jcml0aWNhbAorI29tcF9mbHVzaAorb21wX2dldF9udW1fdGhyZWFkcworb21wX2luX3BhcmFsbGVsCitvbXBfbG9jaworb21wX21hc3Rlcgorb21wX25lc3RfbG9jaworb21wX25lc3RfdGVzdGxvY2sKK29tcF9uZXN0ZWQKK29tcF9udW1fdGhyZWFkcworb21wX3Rlc3Rsb2NrCitvbXBfdGVzdHN1aXRlCitvbXBfdGhyZWFkcHJpdmF0ZQorI29tcF90aWNrc190aW1lCisjb21wX3dvcmtzaGFyZQorI29tcF93dGltZQorI3Bhcl9kb2ZpcnN0cHJpdmF0ZQorI3Bhcl9kb19sYXN0cHJpdmF0ZQorI3Bhcl9kb19vcmRlcmVkCisjcGFyX2RvX3ByaXZhdGUKKyNwYXJfZG9fcmVkdWN0aW9uCisjcGFyX3NlY3Rpb25pcnN0cHJpdmF0ZS5mCisjcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKKyNwYXJfc2VjdGlvbl9wcml2YXRlCisjcGFyX3NlY3Rpb25fcmVkdWN0aW9uCisjc2VjdGlvbmlyc3Rwcml2YXRlLmYKKyNzZWN0aW9uX2xhc3Rwcml2YXRlCisjc2VjdGlvbl9wcml2YXRlCisjc2VjdGlvbl9yZWR1Y3Rpb24KKyNzaW5nbGUKKyNzaW5nbGVfY29weXByaXZhdGUKKyNzaW5nbGVfbm93YWl0Cisjc2luZ2xlX3ByaXZhdGUKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmYgYi9yYzMvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmUzY2IwNGIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5mCkBAIC0wLDAgKzEsMjYgQEAKKyEgVXRpbGl0eSBmdW5jdGlvbnMgdG8gaGF2ZSBhIHNsZWVwIGZ1bmN0aW9uIHdpdGggYmV0dGVyIHJlc29sdXRpb24gYW5kCishIHdoaWNoIG9ubHkgc3RvcHMgb25lIHRocmVhZC4KKworICAgICAgc3Vicm91dGluZSBteV9zbGVlcChzbGVlcHRpbWUpCisgICAgICAgIGltcGxpY2l0IG5vbmUKKyAgICAgICAgZG91YmxlIHByZWNpc2lvbiA6OiBzbGVlcHRpbWUKKyAgICAgICAgaW50ZWdlciA6OiB1CisgICAgICAgIGludGVnZXIgOjogdCg4KQorICAgICAgICBpbnRlZ2VyIDo6IG1zMSwgbXMyCisgICAgICAgIGludGVnZXIgOjogY250CisKKyAgICAgICAgdSA9IHNsZWVwdGltZSAqIDEwMDAKKworICAgICAgICBjYWxsIGRhdGVfYW5kX3RpbWUodmFsdWVzPXQpCisKKyAgICAgICAgISBjYWxjdWxhdGUgc3RhcnQgdGltZSBpbiBtcworICAgICAgICBtczEgPSB0KDgpICsgdCg3KSoxMDAwICsgdCg2KSo2MDAwMCArIHQoNSkqMzYwMDAwMAorCisgICAgICAgIG1zMiA9IG1zMQorICAgICAgICBjbnQgPSAwCisgICAgICAgIGRvIHdoaWxlICggKG1zMiAtIG1zMSkgPCB1KQorICAgICAgICAgICAgY2FsbCBkYXRlX2FuZF90aW1lKHZhbHVlcz10KQorICAgICAgICAgICAgbXMyID0gdCg4KSArIHQoNykqMTAwMCArIHQoNikqNjAwMDAgKyB0KDUpKjM2MDAwMDAKKyAgICAgICAgICAgIGNudCA9IGNudCsxCisgICAgICAgIGVuZCBkbworICAgICAgZW5kIHN1YnJvdXRpbmUKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wX215X3NsZWVwLmggYi9yYzMvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgzOTBhNWIKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcF9teV9zbGVlcC5oCkBAIC0wLDAgKzEsMzUgQEAKKyNpZm5kZWYgTVlfU0xFRVBfSAorI2RlZmluZSBNWV9TTEVFUF9ICisKKyNpbmNsdWRlIDxzdGRpby5oPgorI2luY2x1ZGU8c3RkbGliLmg+CisjaW5jbHVkZTx1bmlzdGQuaD4KKworI2luY2x1ZGUgPHN5cy90aW1lcy5oPiAKKyNpbmNsdWRlIDxzeXMvdGltZS5oPgorI2luY2x1ZGUgPHRpbWUuaD4KKyNpbmNsdWRlIDxlcnJuby5oPgorCisvKiEgVXRpbGl0eSBmdW5jdGlvbiB0byBoYXZlIGEgc2xlZXAgZnVuY3Rpb24gd2l0aCBiZXR0ZXIgcmVzb2x1dGlvbiBhbmQgd2hpY2ggb25seSBzdG9wcyBvbmUgdGhyZWFkLiAqLworCitzdGF0aWMgdm9pZCBteV9zbGVlcChkb3VibGUgc2xlZXB0aW1lKXsKKyAgc3RydWN0IHRpbWV2YWwgdHY7CisgIHN0cnVjdCB0aW1lem9uZSB0enA7CisgIGRvdWJsZSBzdGFydDsKKyAgZG91YmxlIHJlYWw7CisgIGlmKGdldHRpbWVvZmRheSgmdHYsJnR6cCkhPTApIHsKKyAgICBwZXJyb3IoImdldF90aW1lOiAiKTsKKyAgICBleGl0KC0xKTsKKyAgfQorICBzdGFydCA9IChkb3VibGUpdHYudHZfc2VjICsgKChkb3VibGUpdHYudHZfdXNlYy8xMDAwMDAwLjApOworICByZWFsPXN0YXJ0OworICB3aGlsZSggKHJlYWwtc3RhcnQpPHNsZWVwdGltZSl7CisgICAgaWYoZ2V0dGltZW9mZGF5KCZ0diwmdHpwKSE9MCkgeworICAgICAgcGVycm9yKCJnZXRfdGltZTogIik7CisgICAgICBleGl0KC0xKTsKKyAgICB9CisgICAgcmVhbCA9IChkb3VibGUpdHYudHZfc2VjICsgKChkb3VibGUpdHYudHZfdXNlYy8xMDAwMDAwLjApOworICB9Cit9CisKKyNlbmRpZgpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmYgYi9yYzMvdGVzdHN1aXRlL29tcF90ZXN0c3VpdGUuZgpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5lMTM1MzEzCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmYKQEAgLTAsMCArMSwxNCBAQAorICAgICAgSU5URUdFUiBOICFUaGUgbnVtYmVyIG9mIHRpbWVzIGVhY2ggdGVzdCBpcyBydW4KKyAgICAgIFBBUkFNRVRFUiAoTj0xKQorICAgICAgQ0hBUkFDVEVSKjggT01QVFNfVkVSU0lPTgorICAgICAgUEFSQU1FVEVSIChPTVBUU19WRVJTSU9OPSIzLjAuYSIpCisgICAgICBJTlRFR0VSIExPT1BDT1VOVCAhVGhlIG51bWJlciBvZiB0aW1lcyBlYWNoIGxvb3AgaXMgcnVuCisgICAgICBQQVJBTUVURVIgKExPT1BDT1VOVD0xMDAwKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTTEVFUFRJTUUKKyAgICAgIFBBUkFNRVRFUiAoU0xFRVBUSU1FID0gLjAxKQorICAgICAgRE9VQkxFIFBSRUNJU0lPTiBTTEVFUFRJTUVfTE9ORworICAgICAgUEFSQU1FVEVSIChTTEVFUFRJTUVfTE9ORyA9IDAuNSkKKyAgICAgIElOVEVHRVIgTlVNX1RBU0tTCisgICAgICBQQVJBTUVURVIgKE5VTV9UQVNLUz0yNSkKKyAgICAgIElOVEVHRVIgTUFYX1RBU0tTX1BFUl9USFJFQUQKKyAgICAgIFBBUkFNRVRFUiAoTUFYX1RBU0tTX1BFUl9USFJFQUQ9NSkKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5oIGIvcmMzL3Rlc3RzdWl0ZS9vbXBfdGVzdHN1aXRlLmgKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uYTgwOGQ5MgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wX3Rlc3RzdWl0ZS5oCkBAIC0wLDAgKzEsMTY0IEBACisvKiBHbG9iYWwgaGVhZGVyZmlsZSBvZiB0aGUgT3Blbk1QIFRlc3RzdWl0ZSAqLworCisvKiBUaGlzIGZpbGUgd2FzIGNyZWF0ZWQgd2l0aCB0aGUgb21wdHNfbWFrZUhlYWRlci5wbCBzY3JpcHQgdXNpbmcgdGhlIGZvbGxvd2luZyBvcGlvbnM6ICovCisvKiAtZj1vbXB0cy1jLmNvbmYgLXQ9YyAgKi8KKworCisjaWZuZGVmIE9NUF9URVNUU1VJVEVfSAorI2RlZmluZSBPTVBfVEVTVFNVSVRFX0gKKworI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8b21wLmg+CisKKy8qIFZlcnNpb24gaW5mbyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE9NUFRTX1ZFUlNJT04gIjMuMGEiCisKKy8qIEdlbmVyYWwgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIExPT1BDT1VOVCAJMTAwMAorI2RlZmluZSBSRVBFVElUSU9OUyAJICAyMAorLyogZm9sbG93aW5nIHRpbWVzIGFyZSBpbiBzZWNvbmRzICovCisjZGVmaW5lIFNMRUVQVElNRQkgMC4wMQorI2RlZmluZSBTTEVFUFRJTUVfTE9ORwkgMC41CisKKy8qIERlZmluaXRpb25zIGZvciB0YXNrcyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqLworLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKiovCisjZGVmaW5lIE5VTV9UQVNLUyAgICAgICAgICAgICAgMjUKKyNkZWZpbmUgTUFYX1RBU0tTX1BFUl9USFJFQUQgICAgNQoraW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3Igb3JkZXJlZCAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG9yZGVyZWQgKi8KK2ludCB0ZXN0X29tcF90YXNrX2ltcF9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2tfaW1wX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgdGVzdF9vbXBfdGFza3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2t3YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrd2FpdChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrd2FpdCAqLworaW50IHRlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGJhcnJpZXIgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2JhcnJpZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgYmFycmllciAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGlmICovCitpbnQgdGVzdF9vbXBfYXRvbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBhdG9taWMgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2F0b21pYyhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBhdG9taWMgKi8KK2ludCB0ZXN0X29tcF9nZXRfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworaW50IGNyb3NzdGVzdF9vbXBfZ2V0X251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX2dldF9udW1fdGhyZWFkcyAqLworaW50IHRlc3Rfb21wX3NlY3Rpb25fcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2VjdGlvbiBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zZWN0aW9uX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2VjdGlvbiBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfaWYoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGlmICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9pZihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBpZiAqLworaW50IHRlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2xvY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfbG9jayAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NoYXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2hhcmVkICovCitpbnQgdGVzdF9vbXBfdGFza19pbXBfc2hhcmVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ltcF9zaGFyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3Rhc2tfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2VjdGlvbiBsYXN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzZWN0aW9uIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9mb3JfYXV0byhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGF1dG8gKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9hdXRvKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBhdXRvICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpYyhGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIHNjaGVkdWxlKHN0YXRpYykgKi8KK2ludCB0ZXN0X29tcF90aHJlYWRwcml2YXRlX2ZvcihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfdGhyZWFkcHJpdmF0ZV9mb3IoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGhyZWFkcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3Rhc2tfdW50aWVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNrIHVudGllZCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza191bnRpZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayB1bnRpZWQgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGVfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBzaW5nbGUgbm93YWl0ICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdsZSBub3dhaXQgKi8KK2ludCB0ZXN0X29tcF9jcml0aWNhbChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgY3JpdGljYWwgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2NyaXRpY2FsKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGNyaXRpY2FsICovCitpbnQgdGVzdF9vbXBfZ2V0X3d0aWNrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF93dGljayhGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfd3RpY2sgKi8KK2ludCB0ZXN0X29tcF9zaW5nbGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdsZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2luZ2xlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNpbmdsZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfdGFza3lpZWxkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0YXNreWllbGQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2t5aWVsZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNreWllbGQgKi8KK2ludCB0ZXN0X2hhc19vcGVubXAoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3IgX09QRU5NUCAqLworaW50IGNyb3NzdGVzdF9oYXNfb3Blbm1wKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3IgX09QRU5NUCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBsYXN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9sYXN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfbGFzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGxhc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfc2VjdGlvbnNfZmlyc3Rwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBzZWN0aW9ucyBmaXJzdHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF90ZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX3Rlc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX3Rlc3RfbG9jayAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgc2VjdGlvbnMgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX251bV90aHJlYWRzKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBwYXJlbGxlbCBudW1fdGhyZWFkcyAqLworaW50IGNyb3NzdGVzdF9vbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyZWxsZWwgbnVtX3RocmVhZHMgKi8KK2ludCB0ZXN0X29tcF9mb3JfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3IgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciByZWR1Y3Rpb24gKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uc19ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdCAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbnNfbm93YWl0KEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHBhcmFsbGVsIHNlY3Rpb25zIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX3JlZHVjdGlvbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgcmVkdWN0aW9uICovCitpbnQgdGVzdF9vbXBfbmVzdGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX25lc3RlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9uZXN0ZWQgKi8KK2ludCB0ZXN0X29tcF90aHJlYWRwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCB0aHJlYWRwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90aHJlYWRwcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHRocmVhZHByaXZhdGUgKi8KK2ludCB0ZXN0X29tcF9zZWN0aW9uc19yZWR1Y3Rpb24oRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbnNfcmVkdWN0aW9uKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIHNlY3Rpb25zIHJlZHVjdGlvbiAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9ndWlkZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShndWlkZWQpICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfc2NoZWR1bGVfZ3VpZGVkKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShndWlkZWQpICovCitpbnQgdGVzdF9vbXBfdGFza19maW5hbChGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBmaW5hbCAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19maW5hbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGZpbmFsICovCitpbnQgdGVzdF9vbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBwYXJhbGxlbCBmb3IgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2ZsdXNoKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmbHVzaCAqLworaW50IGNyb3NzdGVzdF9vbXBfZmx1c2goRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZmx1c2ggKi8KK2ludCB0ZXN0X29tcF9mb3JfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9wcml2YXRlKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX29yZGVyZWQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBvcmRlcmVkICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3Jfb3JkZXJlZChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBmb3Igb3JkZXJlZCAqLworaW50IHRlc3Rfb21wX3NpbmdsZV9jb3B5cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgc2luZ2xlIGNvcHlwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfY29weXByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgc2luZ2xlIGNvcHlwcml2YXRlICovCitpbnQgdGVzdF9vbXBfdGFza19pZihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgdGFzayBpZiAqLworaW50IGNyb3NzdGVzdF9vbXBfdGFza19pZihGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGlmICovCitpbnQgdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZpcnN0cHJpdmF0ZSAqLworaW50IGNyb3NzdGVzdF9vbXBfc2VjdGlvbl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZmlyc3Rwcml2YXRlICovCitpbnQgdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoc3RhdGljKSAqLworaW50IGNyb3NzdGVzdF9vbXBfZm9yX3NjaGVkdWxlX3N0YXRpY18zKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShzdGF0aWMpICovCitpbnQgdGVzdF9vbXBfdGFza19maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgZmlyc3Rwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF90YXNrX2ZpcnN0cHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCB0YXNrIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX2Zvcl9jb2xsYXBzZShGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9mb3JfY29sbGFwc2UoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGNvbGxhcHNlICovCitpbnQgdGVzdF9vbXBfaW5fcGFyYWxsZWwoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX2luX3BhcmFsbGVsICovCitpbnQgY3Jvc3N0ZXN0X29tcF9pbl9wYXJhbGxlbChGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9pbl9wYXJhbGxlbCAqLworaW50IHRlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcCBmb3Igc2NoZWR1bGUoZHluYW1pYykgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wIGZvciBzY2hlZHVsZShkeW5hbWljKSAqLworaW50IHRlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIGZvciBmaXJzdHByaXZhdGUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9maXJzdHByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgZm9yIGZpcnN0cHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX21hc3RlcihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgY3Jvc3N0ZXN0X29tcF9tYXN0ZXIoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgdGVzdF9vbXBfc2luZ2xlX3ByaXZhdGUoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHNpbmdlbCBwcml2YXRlICovCitpbnQgY3Jvc3N0ZXN0X29tcF9zaW5nbGVfcHJpdmF0ZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcCBzaW5nZWwgcHJpdmF0ZSAqLworaW50IHRlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHRhc2sgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3Rhc2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgdGFzayAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGRlZmF1bHQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX3BhcmFsbGVsX2RlZmF1bHQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZGVmYXVsdCAqLworaW50IHRlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIHBhcmFsbGVsIGZvciBub3dhaXQgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2Zvcl9ub3dhaXQoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgZm9yIG5vd2FpdCAqLworaW50IHRlc3Rfb21wX3Rlc3RfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF90ZXN0X25lc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfdGVzdF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXBfdGVzdF9uZXN0X2xvY2sgKi8KK2ludCB0ZXN0X29tcF9uZXN0X2xvY2soRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IGNyb3NzdGVzdF9vbXBfbmVzdF9sb2NrKEZJTEUgKiBsb2dmaWxlKTsgIC8qIENyb3NzdGVzdCBmb3Igb21wX25lc3RfbG9jayAqLworaW50IHRlc3Rfb21wX3BhcmFsbGVsX2NvcHlpbihGSUxFICogbG9nZmlsZSk7ICAvKiBUZXN0IGZvciBvbXAgcGFyYWxsZWwgY29weWluICovCitpbnQgY3Jvc3N0ZXN0X29tcF9wYXJhbGxlbF9jb3B5aW4oRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgcGFyYWxsZWwgY29weWluICovCitpbnQgdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogVGVzdCBmb3Igb21wIG1hc3RlciAqLworaW50IGNyb3NzdGVzdF9vbXBfbWFzdGVyXzMoRklMRSAqIGxvZ2ZpbGUpOyAgLyogQ3Jvc3N0ZXN0IGZvciBvbXAgbWFzdGVyICovCitpbnQgdGVzdF9vbXBfZ2V0X3d0aW1lKEZJTEUgKiBsb2dmaWxlKTsgIC8qIFRlc3QgZm9yIG9tcF9nZXRfd3RpbWUgKi8KK2ludCBjcm9zc3Rlc3Rfb21wX2dldF93dGltZShGSUxFICogbG9nZmlsZSk7ICAvKiBDcm9zc3Rlc3QgZm9yIG9tcF9nZXRfd3RpbWUgKi8KKworI2VuZGlmCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzLWMuY29uZiBiL3JjMy90ZXN0c3VpdGUvb21wdHMtYy5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmYxMGI5NTAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzLWMuY29uZgpAQCAtMCwwICsxLDE5IEBACisjaW5jbHVkZSA8c3RkaW8uaD4KKyNpbmNsdWRlIDxvbXAuaD4KKworLyogVmVyc2lvbiBpbmZvICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgT01QVFNfVkVSU0lPTiAiMy4wYSIKKworLyogR2VuZXJhbCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTE9PUENPVU5UIAkxMDAwCisjZGVmaW5lIFJFUEVUSVRJT05TIAkgIDIwCisvKiBmb2xsb3dpbmcgdGltZXMgYXJlIGluIHNlY29uZHMgKi8KKyNkZWZpbmUgU0xFRVBUSU1FCSAwLjAxCisjZGVmaW5lIFNMRUVQVElNRV9MT05HCSAwLjUKKworLyogRGVmaW5pdGlvbnMgZm9yIHRhc2tzICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICovCisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KKyNkZWZpbmUgTlVNX1RBU0tTICAgICAgICAgICAgICAyNQorI2RlZmluZSBNQVhfVEFTS1NfUEVSX1RIUkVBRCAgICA1CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzLWYuY29uZiBiL3JjMy90ZXN0c3VpdGUvb21wdHMtZi5jb25mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjUyNWFmMzAKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzLWYuY29uZgpAQCAtMCwwICsxIEBACishRW1wdHkgY29uZmlnIGZpbGUKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHMuY29uZiBiL3JjMy90ZXN0c3VpdGUvb21wdHMuY29uZgpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zMzEzNWI1Ci0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0cy5jb25mCkBAIC0wLDAgKzEsMjYgQEAKKzxjb25maWc+Cis8Z2xvYmFsY29uZmlnPgorPGxvZ2ZpbGU+b21wdHMubG9nPC9sb2dmaWxlPgorPHNpbmdsZXRlc3R0aW1lb3V0PjEyMDwvc2luZ2xldGVzdHRpbWVvdXQ+Cis8ZGlzcGxheWVycm9ycz4xPC9kaXNwbGF5ZXJyb3JzPgorPGRpc3BsYXl3YXJuaW5ncz4wPC9kaXNwbGF5d2FybmluZ3M+Cis8ZW52c2V0dGhyZWFkc2NvbW1hbmQ+T01QX05VTV9USFJFQURTPSVuOyBleHBvcnQgT01QX05VTV9USFJFQURTOzwvZW52c2V0dGhyZWFkc2NvbW1hbmQ+Cis8cmVzdWx0c2ZpbGU+cmVzdWx0cy50eHQ8L3Jlc3VsdHNmaWxlPgorPG51bXRocmVhZHM+ODwvbnVtdGhyZWFkcz4KKzwvZ2xvYmFsY29uZmlnPgorCis8bGFuZ3VhZ2VzPgorPGxhbmd1YWdlPgorPGxhbmd1YWdlbmFtZT5jPC9sYW5ndWFnZW5hbWU+Cis8ZGlyPmM8L2Rpcj4KKzxmaWxlZXh0ZW5zaW9uPmM8L2ZpbGVleHRlbnNpb24+Cis8dGVtcGxhdGVwYXJzZXJuYW1lPnRlbXBsYXRlX3BhcnNlcl9jLnBsPC90ZW1wbGF0ZXBhcnNlcm5hbWU+Cis8L2xhbmd1YWdlPgorPGxhbmd1YWdlPgorPGxhbmd1YWdlbmFtZT5mb3J0cmFuPC9sYW5ndWFnZW5hbWU+Cis8ZGlyPmZvcnRyYW48L2Rpcj4KKzxmaWxlZXh0ZW5zaW9uPmY8L2ZpbGVleHRlbnNpb24+Cis8dGVtcGxhdGVwYXJzZXJuYW1lPnRlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsPC90ZW1wbGF0ZXBhcnNlcm5hbWU+Cis8L2xhbmd1YWdlPgorPC9sYW5ndWFnZXM+Cis8L2NvbmZpZz4KZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbCBiL3JjMy90ZXN0c3VpdGUvb21wdHNfbWFrZUhlYWRlci5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi43MjEyY2VjCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19tYWtlSGVhZGVyLnBsCkBAIC0wLDAgKzEsMTAxIEBACisjIS91c3IvYmluL3BlcmwgLXcKKworIyBvbXB0c19tYWtlSGVhZGVyIFtvcHRpb25zXSAtZj1OQU1FIC10PURJUgorIworIyBDcmVhdHMgdGhlIGhlYWRlcmZpbGUgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiB0aGUgdGVtcGxhdGVmaWxlcyAKKyMgd2l0Y2ggYXJlIGluIHRoZSBkZWZhdWx0L2V4cGxpY2l0ZWx5IHNwZWNpZmllZCBkaXIgYW5kIHRoZSBzZXR0aW5ncyBpbiB0aGUKKyMgZ2l2ZW4gY29uZmlnIGZpbGUuIAorIyAKKyMgQVRURU5USU9OOgorIwlBdCB0aGUgbW9tZW50IGl0IGJ1aWx0cyBvbmx5IGEgYy1oZWFkZXJmaWxlIQorIworIyAtZj1GSUxFTkFNRTogVXNpbmcgZmlsZSBGSUxFTkFNRSBhcyBjb25maWdmaWxlCisjIC10PURJUjoJRGlyZWN0b3J5IGhvbGRpbmcgdGhlIHRlbXBsYXRlIGZpbGVzCisjIAorIyBvcHRpb25zCisjIC1pPUZJTEVOQU1FOiBJbmNsdWRlIG90aGVyIEhlYWRlcmZpbGUuIFRoZSBmaWxlcyB0byBiZSBpbmNsdWRlZCBtdXN0IGJlIHNwZWNpZmllZAorIyAJYWZ0ZXIgc2V0dGluZyB0aGlzIG9wdGlvbi4gKE5vdCBpbXBsZW1lbnRlZCB5ZXQuKQorIyAtbz1GSUxFTkFNRTogb3V0cHV0ZmlsZW5hbWUgKGRlZmF1bHQgaXMgIm9tcF90ZXN0c3VpdGUuaCIpCisKKyRoZWFkZXJmaWxlID0gIlwvXCogR2xvYmFsIGhlYWRlcmZpbGUgb2YgdGhlIE9wZW5NUCBUZXN0c3VpdGUgXCpcL1xuXG5cL1wqIFRoaXMgZmlsZSB3YXMgY3JlYXRlZCB3aXRoIHRoZSBvbXB0c19tYWtlSGVhZGVyLnBsIHNjcmlwdCB1c2luZyB0aGUgZm9sbG93aW5nIG9waW9uczpcICpcL1xuXC9cKiAiOworaWYoQEFSR1YgPiAwKQoreworCWZvcmVhY2ggJG9wdCAoQEFSR1YpCisJeworCQkkaGVhZGVyZmlsZSAuPSAiJG9wdCAiOworCX0KK30KK2Vsc2UKK3sKKwkkaGVhZGVyZmlsZSAuPSAiTm8gb3B0aW9ucyB3ZXJlIHNwZWNpZmllZCI7Cit9CiskaGVhZGVyZmlsZSAuPSIgXCpcL1xuXG5cbiI7CisKK3VzZSBHZXRvcHQ6Okxvbmc7CitHZXRPcHRpb25zKCItbz1zIiA9PiBcJG91dGZpbGUsICItZj1zIiA9PlwkY29uZmlnZmlsZSwgIi10PXMiID0+IFwkdGVtcGxhdGVkaXIsICItaT1zIiA9PiBcJGluY2x1ZGUpOworCiskaW5jbHVkZSA9ICIiOworCisKKyMgR2V0dGluZyBhbmQgdmVyaWZ5aW5nIHRoZSBuZWNlc3Nhcnkgb3B0aW9uczoKK2lmKCEkY29uZmlnZmlsZSkgewkKKwlkaWUgIkNvbmZpZyBmaWxlIG5hbWUgaXMgbWlzc2luZy4iOworfQkKK2Vsc2UgeworICAgIGlmICghKC1lICRjb25maWdmaWxlKSkgeworCSAgZGllICJDb3VsZCBub3QgZmluZCBjb25maWcgZmlsZSAkY29uZmlnZmlsZS4iOworCX0KK30KKwkKK2lmKCEkdGVtcGxhdGVkaXIpIHsJCisJZGllICJEaXJlY3RvcnluYW1lIGlzIG1pc3NpbmcuIjsKK30JCisKK2lmKCEkb3V0ZmlsZSl7CisJJG91dGZpbGUgPSAib21wX3Rlc3RzdWl0ZS5oIjsJIyBzZXR0aW5nIGRlZmF1bHQgdmFsdWUgZm9yIHRoZSBoZWFkZXJmaWxlCit9CisKKworCisjQGluY2x1ZGVmaWxlczsJCQkJCSMgbGlzdCBob2xpbmcgZXh0cmEgaW5jbHVkZWZpbGVzIHNwZWNpZmllZCBieSB0aGUgdXNlciAKKworCisjIGdlbmVyYXRpbmcgdGhlIGhlYWQgb2YgdGhlIGluY2x1ZGVndWFyZDoKKyRoZWFkZXJmaWxlIC49ICJcI2lmbmRlZiBPTVBfVEVTVFNVSVRFX0hcblwjZGVmaW5lIE9NUF9URVNUU1VJVEVfSFxuXG4iOworCisjIGluc2VydGluZyBnZW5lcmFsIHNldHRpbmdzIG91dCBvZiB0aGUgY29uZmlnZmlsZToKK29wZW4oT01QVFNfQ09ORiwkY29uZmlnZmlsZSkgb3IgZGllICJDb3VsZCBub3Qgb3BlbiB0aGUgZ2xvYmFsIGNvbmZpZyBmaWxlICRjb25maWdmaWxlLiI7Cit3aGlsZSg8T01QVFNfQ09ORj4peworCSRoZWFkZXJmaWxlIC49ICRfOworfQorY2xvc2UoT01QVFNfQ09ORik7CisKKyMgc2VhcmNoaW5nIHRoZSB0ZXN0czoKK29wZW5kaXIgVEVNUExBVEVESVIsICR0ZW1wbGF0ZWRpciBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIGRpciAkdGVtcGxhdGVkaXIuIjsKK0B0ZW1wbGF0ZXMgPSBncmVwIC8oLiopXC5jLywgcmVhZGRpciBURU1QTEFURURJUjsKK2Nsb3NlZGlyIFRFTVBMQVRFRElSOworCisjIGluc2VydGluZyB0aGUgZnVuY3Rpb24gZGVjbGFyYXRpb25zOgorZm9yZWFjaCAkdGVtcGxhdGUgKEB0ZW1wbGF0ZXMpeworCSRzb3VyY2UgPSAiIjsKKwlvcGVuKFRFTVBMQVRFLCR0ZW1wbGF0ZWRpci4iLyIuJHRlbXBsYXRlKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBmb2xsb3dpbmcgc291cmNlZmlsZTogIi4kdGVtcGxhdGVkaXIuIi8iLiR0ZW1wbGF0ZTsKKwl3aGlsZSg8VEVNUExBVEU+KXsKKwkJJHNvdXJjZSAuPSAkXzsKKwl9CisJY2xvc2UoVEVNUExBVEUpOworCSRzb3VyY2UgPX4gL1w8b21wdHNcOnRlc3Rjb2RlXDpmdW5jdGlvbm5hbWVcPiguKilcPFwvb21wdHNcOnRlc3Rjb2RlXDpmdW5jdGlvbm5hbWVcPi87CisJJGZ1bmN0aW9ubmFtZSA9ICQxLiIoRklMRSBcKiBsb2dmaWxlKTsiOworCSRzb3VyY2UgPX4gL1w8b21wdHNcOmRpcmVjdGl2ZVw+KC4qKVw8XC9vbXB0c1w6ZGlyZWN0aXZlXD4vOworCSRkaXJlY3RpdmUgPSAkMTsKKwkkaGVhZGVyZmlsZSAuPSAiaW50IHRlc3RfIi4kZnVuY3Rpb25uYW1lLiIgIC8qIFRlc3QgZm9yICIuJGRpcmVjdGl2ZS4iICovXG4iOworCSRoZWFkZXJmaWxlIC49ICJpbnQgY3Jvc3N0ZXN0XyIuJGZ1bmN0aW9ubmFtZS4iICAvKiBDcm9zc3Rlc3QgZm9yICIuJGRpcmVjdGl2ZS4iICovXG4iOworfQorCisjIGluc2VydGluZyB0aGUgZW5kIG9mIHRoZSBpbmNsdWRlZ3VhcmQ6CiskaGVhZGVyZmlsZSAuPSAiXG4jZW5kaWYiOworCisjIGNyYWV0aW5nIHRoZSBoZWFkZXJmaWxlOgorb3BlbihPVVRGSUxFLCI+Ii4kb3V0ZmlsZSkgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIHRoZSBoYWVkYWVyZmlsZSAoJG91dGZpbGUpIjsKK3ByaW50IE9VVEZJTEUgJGhlYWRlcmZpbGUuIlxuIjsKK2Nsb3NlKE9VVEZJTEUpOworCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzX3BhcnNlci5wbCBiL3JjMy90ZXN0c3VpdGUvb21wdHNfcGFyc2VyLnBsCm5ldyBmaWxlIG1vZGUgMTAwNzU1CmluZGV4IDAwMDAwMDAuLjk4ZDcyNzEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzX3BhcnNlci5wbApAQCAtMCwwICsxLDE2NyBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBTT1VSQ0VGSUxFCisjIAorIyBDcmVhdHMgdGhlIHRlc3RzIGFuZCB0aGUgY3Jvc3N0ZXN0cyBmb3IgdGhlIE9wZW5NUC1UZXN0c3VpdGUgb3V0IG9mIGFuIHRlbXBsYXRlZmlsZXMgd2hpY2ggYXJlIGdpdmVuIHRvIHRoZSBwcm9ncmFtbS4KKyMgCisjIE9wdGlvbnM6CisjIC10ZXN0OiAJbWFrZSB0ZXN0CisjIC1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtb3JwaGFuCWlmIHBvc3NpYmxlIGdlbmVyYXRlIHRlc3RzIHVzaW5nIG9ycGhhbiByZWdpb25zIChub3QgaW1wbGVtZW50ZWQgeWV0KQorIyAtbGFuZz1MQU5HCXByZXByb2Nlc3NpbmcgZm9yIGxhbmd1YWdlIExBTkcsIHdoZXJlIExBTkcgaXMgb25lIG9mIHRoZSBmb2xsb3dpbmcgbGFuZ3VhZ2VzOgorIwkJYywgZm9ydHJhbgorIyAtbz1GSUxFTkFNRQlvdXRwdXRmaWxlIChvbmx5IHdoZW4gb25lIHRlbXBsYXRlZmlsZSBpcyBzcGVjaWZpZWQpCisKKworIyBVc2luZyBHZXRvcHQ6OmxvbmcgdG8gZXh0cmFjdCB0aGUgcHJvZ3JhbW0gb3B0aW9ucwordXNlIEdldG9wdDo6TG9uZzsKKyMgVXNpbmcgZnVuY3Rpb25zOiBTZXQgb2Ygc3Vicm91dGluZXMgdG8gbW9kaWZ5IHRoZSB0ZXN0Y29kZQordXNlIG9tcHRzX3BhcnNlckZ1bmN0aW9uczsKKworIyBHZXR0aW5nIGdpdmVuIG9wdGlvbnMKK0dldE9wdGlvbnMoIi10ZXN0IiA9PiBcJHRlc3QsIi1jcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAiLW89cyIgPT4gXCRvdXRwdXRmaWxlLCAiLW9ycGhhbiIgPT4gXCRvcnBoYW4sICItZiEiLCAiLWxhbmc9cyIgPT4gXCRsYW5ndWFnZSk7CisKKyMgUmVtYWluaW5nIGFyZ3VtZW50cyBhcmUgdGhlIHRlbXBsYXRlZmlsZXMuIAorIyBBZGRpbmcgdGhlc2UgdG8gdGhlIGxpc3Qgb2YgdG8gYmUgcGFyc2VkIGZpbGVzIGlmIHRoZXkgZXhpc3QuCitmb3JlYWNoICRmaWxlKEBBUkdWKQoreworCWlmKC1lICRmaWxlKXsgcHVzaChAc291cmNlZmlsZXMsJGZpbGUpOyB9CisJZWxzZSB7IHByaW50ICJFcnJvcjogVW5rbm93biBPcHRpb24gJGZpbGVcbiI7IH0KK30KKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCitpZihAc291cmNlZmlsZXMgPT0gMCl7ZGllICJObyBmaWxlcyB0byBwYXJzZSBhcmUgc3BlY2lmaWVkISI7fQoraWYoJG91dHB1dGZpbGUgJiYgKEBzb3VyY2VmaWxlcyAhPSAxIHx8ICgkdGVzdCAmJiAkY3Jvc3N0ZXN0KSApICl7ZGllICJUaGVyZSB3ZXJlIG11bHRpcGxlIGZpbGVzIGZvciBvbmUgb3V0cHV0ZmlsZXMgc3BlY2lmaWVkISI7fSAKKyMgcHJlcGFyYXRpb25zIGZvcHIgb3JwaGFuIHRlc3RzCitpZigkb3JwaGFuKXsgJG9ycGhhbnByZWZpeCA9ICJvcnBoYW5lZCI7IH0KK2Vsc2UgeyAkb3JwaGFucHJlZml4ID0gIiI7IH0KKyMgcHJlcGFyYXRpb25zIGZvciB0ZXN0IC8gY3Jvc3N0ZXN0CitpZigkdGVzdCl7cHVzaChAdGVzdHR5cGVzLCJ0ZXN0Iik7IAorIyAlY2hlY2tzWyd0ZXN0J109ImNoZWNrIjsKK30KK2lmKCRjcm9zc3Rlc3Qpe3B1c2goQHRlc3R0eXBlcywiY3Rlc3QiKTsKKyMgJWNoZWNrc1snY3Jvc3N0ZXN0J109ImNyb3NzY2hlY2siOworfQorIyBwcmVwYXJhdGlvbnMgYW5kIGNoZWNrcyBmb3IgbGFuZ3VhZ2UKK2lmKCRsYW5ndWFnZSBlcSJjIikgeyAkZXh0ZW5zaW9uID0gImMiO30KK2Vsc2lmKCRsYW5ndWFnZSBlcSAiZm9ydHJhbiIgb3IgJGxhbmd1YWdlIGVxICJmIikgeyAkbGFuZ3VhZ2UgPSAiZiI7ICRleHRlbnNpb24gPSAiZiI7fQorZWxzZSB7IGRpZSAiWW91IG11c3Qgc3BlY2lmeSBhIHZhbGlkIGxhbmd1YWdlISI7IH0KKyAgICAKKworIyBSZWFkaW5nIHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSB0ZXN0cyBpbnRvIEBzb3VyY2VzCitmb3JlYWNoICRzcmNmaWxlIChAc291cmNlZmlsZXMpCit7CisJIyBSZWFkaW5nIHRoZSBjb250ZW50IG9mIHRoZSBjdXJyZW50IHNvdXJjZWZpbGUJaW50byAkc3JjCisJb3BlbihURVNULCRzcmNmaWxlKSBvciBwcmludCAiRXJyb3I6IENvdWxkIG5vdCBvcGVuIHRlbXBsYXRlICRzcmNmaWxlXG4iOworCXdoaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KKwljbG9zZShURVNUKTsKKwkjIEFkZGluZyB0aGUgY29udGVudCAkc3JjIHRvIHRoZSBlbmQgb2YgdGhlIGxpc3QgQHNvdXJjZXMKKwlwdXNoKEBzb3VyY2VzLCRzcmMpOworfQorCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworaWYoJGxhbmd1YWdlIGVxICJjIikgeyAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuYyI7IH0KK2Vsc2lmKCRsYW5ndWFnZSBlcSAiZiIpIHsgJG1haW5wcm9jc3JjID0gIm9tcHRzX3N0YW5kYWxvbmVQcm9jLmYiOyB9IAorb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peworCSRtYWlucHJvYyAuPSAkXzsKK30KKworZm9yZWFjaCAkdGVzdHR5cGUgKEB0ZXN0dHlwZXMpCit7CisgIGZvcmVhY2ggJHNyYyhAc291cmNlcykKKyAgeworIyBTb21lIHRlbXBvcmFyeSB0ZXN0aW5mb3JtYXRpb246CisgICAgKCRkZXNjcmlwdGlvbikgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGRlc2NyaXB0aW9uJywkc3JjKTsKKyAgICAoJGRpcmVjdGl2ZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6ZGlyZWN0aXZlJywkc3JjKTsKKyAgICAoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkc3JjKTsKKworICAgIG9wZW4oT1VURklMRSwiPiIuJGxhbmd1YWdlLiRvcnBoYW5wcmVmaXguJHRlc3R0eXBlLiJfIi4kZnVuY3Rpb25uYW1lLiIuIi4kZXh0ZW5zaW9uKSBvciBkaWUoIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIik7CisKKyMgQ3JlYXRpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIHRlc3Q6CisgICAgKCRjb2RlKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZScsJHNyYyk7CisjIFB1dHRpbmcgdG9nZXRoZXIgdGhlIGZ1bmN0aW9ucyBhbmQgdGhlIG1haW5wcm9ncmFtbToKKyAgICAkY29kZSAuPSAkbWFpbnByb2M7CisgICAgCisjIGdldCB0aGUgcGFyYW1ldGVycyA8b21wdHM6b3JwaGFuOnBhcmFtcz4gYnkgam9vbgorIyB0aGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQKKyAgICAoJHBhcm1zKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46cGFybXMnLCRjb2RlKTsKKyAgICAoJHBhcm1zKSA9IGxlYXZlX3NpbmdsZV9zcGFjZSgkcGFybXMpOworIyB0byByZW1vdmUgcGFyYW1ldGVycyB0YWcgYmV0d2VlbiAnb21wdHM6b3JwaGFuOnBhcm1zJyBieSBqb29uCisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywkY29kZSk7CisgICAgCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKKyAgICBpZigkb3JwaGFuKQorICAgIHsKKyMgR2V0IHRoZSBnbG9iYWwgdmFyaWFibGVzOgorICAgICAgQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygib21wdHM6b3JwaGFuOnZhcnMiLCRjb2RlKTsKKyAgICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgICAgZm9yZWFjaCAkXyAoQGRlZnMpCisgICAgICB7CisJI3ByaW50ICRfOworCWlmKG5vdCAvXlsgXSokL2dzKSB7ICRvcnBodmFyc2RlZiA9IGpvaW4oIlxuIiwkb3JwaHZhcnNkZWYsJF8pOyB9IAorCSNwcmludCAiT0tcbiIuJG9ycGh2YXJzZGVmOyAKKyAgICAgIH0KKyAgICAgIGlmKCRsYW5ndWFnZSBlcSAiZiIpCisgICAgICB7CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gc3Vicm91dGluZXM6CisJJG9ycGhmdW5jcyA9IGNyZWF0ZV9vcnBoX2ZvcnRyYW5mdW5jdGlvbnMoIiR0ZXN0dHlwZV8iLCAkY29kZSk7CisjIFJlcGxhY2Ugb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKwkoJGNvZGUpID0gb3JwaGFuX3JlZ2lvbnMyZm9ydHJhbmZ1bmN0aW9ucyggIiR0ZXN0dHlwZV8iLCAoJGNvZGUpICk7CisJKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisgICAgI3RvIGZpbmQgb3JwaGFuIGNhbGwgc3RhdGVtZXRuIGFuZCBhZGQgcGFyYW1ldGVycworICAgIAorIyBQdXQgYWxsIHRvZ2V0aGVyOgorCSRjb2RlID0gJGNvZGUgLiAkb3JwaGZ1bmNzOworICAgICAgfQorICAgICAgZWxzaWYoJGxhbmd1YWdlIGVxICJjIikKKyAgICAgIHsKKyMgR2VuZXJhdGUgcHJlZGVjbGFyYXRpb25zIGZvciBvcnBhaG4gZnVuY3Rpb25zOgorCSRvcnBoZnVuY3NkZWZzID0gb3JwaF9mdW5jdGlvbnNfZGVjbGFyYXRpb25zKCIkdGVzdHR5cGVfIiwkY29kZSk7CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gZnVuY3Rpb25zOgorCSRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9jZnVuY3Rpb25zKCIkdGVzdHR5cGVfIiwkY29kZSk7CisjIFJlcGxhOmUgb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxsczoKKwkoJGNvZGUpID0gb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucyggIiR0ZXN0dHlwZV8iLCAoJGNvZGUpICk7CisjIERlbGV0aW5nIHRoZSBmb3JtZXIgZGVjbGFyYXRpb25zIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIG9ycGhhbiByZWdpb25zOgorCSgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCgkY29kZSkpOworIyBQdXQgYWxsIHRvZ2V0aGVyOgorCSRjb2RlID0gIiNpbmNsdWRlIFwib21wX3Rlc3RzdWl0ZS5oXCJcbiIuJG9ycGh2YXJzZGVmIC4gJG9ycGhmdW5jc2RlZnMgLiAkY29kZSAuICRvcnBoZnVuY3M7CisgICAgICB9CisgICAgICBlbHNlIHsKKwlwcmludCAiQW4gZXJyb3Igb2NjdXJyZWQhIjsKKyAgICAgIH0KKyAgICB9CisjIHJlbW92ZSBwYXJhbWV0ZXJzIGJldHdlZW4gPG9tcHRzOm9ycGhhbjpwYXJtcz4gdGFncywgYWRkZWQgYnkgam9vbgorICAgICgkY29kZSk9IHJlcGxhY2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywkY29kZSk7CisgICAgCisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW4nLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjp2YXJzJywnJywnJywoJGNvZGUpKTsKKworIyByZW1vdmUgcGFyYW1ldGVycyBiZXR3ZWVuIGZvciBvcnBoYW5lZCBkaXJlY3RpdmUgcGFyYW1ldGVzLCBhZGRlZCBieSBqb29uCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnBhcm1zJywnJywnJywoJGNvZGUpKTsKKyAgICAKKyAgICBpZigkdGVzdHR5cGUgZXEgInRlc3QiKSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSB0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0czogCisgICAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjaGVjaycsJycsJycsKCRjb2RlKSk7CisgICAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCgkY29kZSkpOwkJCisgICAgfQorICAgIGVsc2lmKCR0ZXN0dHlwZSBlcSAiY3Rlc3QiKSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSBjcm9zc3Rlc3Rjb2RlIGFuZCByZW1vdmUgdGhlIGNvZGUgZm9yIHRoZSB0ZXN0czogCisgICAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCisgICAgfQorIyBNYWtpbmcgc29tZSBmaW5hbCBtb2RpZmljYXRpb25zOgorICAgICgkY29kZSkgPSByZXBsYWNlX3RhZ3MoJ3Rlc3RmdW5jdGlvbm5hbWUnLCR0ZXN0dHlwZS4iXyIuJGZ1bmN0aW9ubmFtZSwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdkaXJlY3RpdmUnLCRkaXJlY3RpdmUsKCRjb2RlKSk7CisgICAgKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGVzY3JpcHRpb24nLCRkZXNjcmlwdGlvbiwoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCR0ZXN0dHlwZS4iXyIsJycsKCRjb2RlKSApOworIwkkY29kZSA9ICAiXCNpbmNsdWRlIFwib21wX3Rlc3RzdWl0ZS5oXCJcbiIuJGNvZGU7CisjIFdyaXRlIHRoZSByZXN1bHQgaW50byB0aGUgZmlsZSBhbmQgY2xvc2UgaXQ6CisgICAgcHJpbnQgT1VURklMRSAkY29kZTsKKyAgICBjbG9zZShPVVRGSUxFKTsKKyAgfQorfQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXJGdW5jdGlvbnMucG0gYi9yYzMvdGVzdHN1aXRlL29tcHRzX3BhcnNlckZ1bmN0aW9ucy5wbQpuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zOGNlZGIwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19wYXJzZXJGdW5jdGlvbnMucG0KQEAgLTAsMCArMSwyODAgQEAKKyMhL3Vzci9iaW4vcGVybCAtdworCisjIGZ1bmN0aW9ucy5wbQorIyBUaGlzIHBhY2thZ2UgY29udGFpbnMgYSBzZXQgb2Ygc3Vicm91dGluZXMgdG8gbW9kaWZ5IHRoZSB0ZW1wbGF0ZXMgZm9yIHRoZSBvcGVuTVAgVGVzdHVpdGUuCisKKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3Vicm91dGluZXMgdG8gZXh0cmFjdCwgbW9kaWZ5IG9yIGRlbGV0ZSB0YWdzIGZyb20gdGhlIHRlbXBsYXRlCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIExJU1QgZ2V0X3RhZ192YWx1ZXMoICR0YWduYW1lLCAkc3RyaW5nICkKKyMgc3VicnV0aW5lIHRvIGdldCB0aGUgdGV4dCBlbmNsb2RlZCBieSBhIHRhZy4KKyMgUmV0dXJucyBhIGxpc3QgY29udGFpbmluZyB0aGUgaW5uZXIgdGV4dHMgb2YgdGhlIGZvdW5kIHRhZ3MKK3N1YiBnZXRfdGFnX3ZhbHVlcworeworCW15ICggJHRhZ25hbWUsICRzdHJpbmcgKTsKKwkoICR0YWduYW1lLCAkc3RyaW5nICkgPSBAXzsKKwlteSAoQHRtcCxAdG1wMik7CisgICAJQHRtcCA9IHNwbGl0KC9cPCR0YWduYW1lXD4vLCRzdHJpbmcpOyAKKwlmb3JlYWNoICRfKEB0bXApeworCQlwdXNoKEB0bXAyLHNwbGl0KC9cPFwvJHRhZ25hbWVcPi8pKTsKKwl9CisJbXkoQHJlc3VsdCwkaSk7CisJJGk9MTsgIyBjb3V0ZXIgdG8gZ2V0IG9ubHkgZXZlcnkgc2Vjb25kIGl0ZW0KKwlmb3JlYWNoICRfKEB0bXAyKXsKKwkJaWYoJGklMiBlcSAwKXsKKwkJCXB1c2goQHJlc3VsdCwkXyk7CisJCX0KKwkJJGkrKzsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCByZXBsYWNlX3RhZ3MoICR0YWduYW1lLCAkcmVwbGFjZXN0cmluZywgQGxpc3QgKQorIyBzdWJydXRpbmUgdG8gcmVwbGFjZSB0YWdzIGJ5IGEgcmVwbGFjZXN0cmluZy4gCisjIFJldHVybnMgYSBsaXN0IG9mIHRoZSBzcmluZ3MgYWZ0ZXIgY29udmVyc2lvbi4KK3N1YiByZXBsYWNlX3RhZ3MKK3sKKwlteSAoJHRhZ25hbWUsICRyZXBsYWNlc3RyaW5nLCBAc3RyaW5nbGlzdCwgQHJlc3VsdCk7CisJKCR0YWduYW1lLCAkcmVwbGFjZXN0cmluZywgQHN0cmluZ2xpc3QpID0gQF87CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jJHJlcGxhY2VzdHJpbmcjZ3M7CisJCXB1c2goQHJlc3VsdCwkXyk7CisJfQorCXJldHVybiBAcmVzdWx0OworfQorCisjIExJU1QgZW5sYXJnZV90YWdzKCAkdGFnbmFtZSwgJGJlZm9yZSwgJGFmdGVyLCBAbGlzdCApCisjIHN1YnJ1dGluZSB0byByZXBsYWNlIHRhZ3MgYnkgdGhlIHRhZ3MgYWRkZWQgYnkgYSBzdHJpbmcgYmVmb3JlIGFuZCBhZnRlci4gCisjIFJldHVybnMgYSBsaXN0IG9mIHRoZSBzcmluZ3MgYWZ0ZXIgY29udmVyc2lvbi4KK3N1YiBlbmxhcmdlX3RhZ3MKK3sKKwlteSAoJHRhZ25hbWUsICRiZWZvcmUsICRhZnRlciwgQHN0cmluZ2xpc3QsQHJlc3VsdCk7CisJKCR0YWduYW1lLCAkYmVmb3JlLCAkYWZ0ZXIsIEBzdHJpbmdsaXN0KSA9IEBfOworCWZvcmVhY2ggJF8oQHN0cmluZ2xpc3QpIHsKKwkJcyNcPCR0YWduYW1lXD4oLio/KVw8XC8kdGFnbmFtZVw+IyRiZWZvcmUkMSRhZnRlciNnczsKKwkJcHVzaChAcmVzdWx0LCRfKTsKKwl9CisJcmV0dXJuIEByZXN1bHQ7Cit9CisKKyMgTElTVCBkZWxldGVfdGFncyggJHRhZ25hbWUsIEBsaXN0ICkKKyMgc3VicnV0aW5lIHRvIGRlbGV0ZSB0YWdzIGluIGEgc3RyaW5nLiAKKyMgUmV0dXJucyBhIGxpc3Qgb2YgdGhlIGNsZWFyZWQgc3RyaW5ncworc3ViIGRlbGV0ZV90YWdzCit7CisJbXkoJHRhZ25hbWUsQHN0cmluZ2xpc3QpOworCSgkdGFnbmFtZSwgQHN0cmluZ2xpc3QpID0gQF87CisJbXkoQHJlc3VsdCk7CisJZm9yZWFjaCAkXyhAc3RyaW5nbGlzdCkgeworCQlzI1w8JHRhZ25hbWVcPiguKj8pXDxcLyR0YWduYW1lXD4jI2dzOworCQlwdXNoKEByZXN1bHQsJF8pOworCX0KKwlyZXR1cm4gQHJlc3VsdDsKK30KKworCisKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHN1YnJvdXRpbmVzIGZvciBnZW5lcmF0aW5nICJvcnBhaG5lZCIgdGVzdHMgCQkJCQkKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisKKyMgU0NBTEFSIGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMoICRwcmVmaXgsICRjb2RlICkKKyMgcmV0dXJucyBhIHN0cmluZyBjb250YWluaW5nIHRoZSBkZWZpbml0aW9ucyBvZiB0aGUgZnVuY3Rpb25zIGZvciB0aGUgCisjIG9ycGhhbiByZWdpb25zLgorc3ViIGNyZWF0ZV9vcnBoX2NmdW5jdGlvbnMKK3sKKwlteSAoJGNvZGUsQGRlZnMpOworCSgkY29kZSkgPSBAXzsKKwlAZGVmcyA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW4nLCRjb2RlKTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJbXkgKCBAcmVzdWx0LCRmdW5jdGlvbnNyYywgJGkpOworCSRmdW5jdGlvbnNyYyA9ICAiXG4vKiBBdXRvbWF0aWNhbGx5IGdlbmVyYXRlZCBkZWZpbml0aW9ucyBvZiB0aGUgb3JwaGFuIGZ1bmN0aW9ucyAqL1xuIjsKKworCSRpID0gMTsKKwlmb3JlYWNoIChAZGVmcykgeworCQkkZnVuY3Rpb25zcmMgLj0gIlxudm9pZCBvcnBoJGlcXyRmdW5jdGlvbm5hbWUgKEZJTEUgKiBsb2dGaWxlKSB7IjsKKwkJJGZ1bmN0aW9uc3JjIC49ICRfOworCQkkZnVuY3Rpb25zcmMgLj0gIlxufVxuIjsKKwkJJGkrKzsKKwl9CisJJGZ1bmN0aW9uc3JjIC49ICIvKiBFbmQgb2YgYXV0b21hdGljYWxseSBnZW5lcmF0ZWQgZGVmaW5pdGlvbnMgKi9cbiI7CisJcmV0dXJuICRmdW5jdGlvbnNyYzsKK30KKworIyBTQ0FMQVIgY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3RyaW5nIGNvbnRhaW5pbmcgdGhlIGRlZmluaXRpb25zIG9mIHRoZSBmdW5jdGlvbnMgZm9yIHRoZSAKKyMgb3JwaGFuIHJlZ2lvbnMuCitzdWIgY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucworeworCW15ICgkcHJlZml4LCRjb2RlLEBkZWZzLCRvcnBoYW5fcGFybXMpOworCSgkcHJlZml4LCRjb2RlLCRvcnBoYW5fcGFybXMpID0gQF87CisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuJywkY29kZSk7CisKKyAgICAjdG8gcmVtb3ZlIHNwYWNlIGFuZCBwdXQgYSBzaW5nbGUgc3BhY2UKKyAgICBpZigkb3JwaGFuX3Bhcm1zIG5lICIiKQorICAgIHsKKyAgICAgICRvcnBoYW5fcGFybXMgPX4gcy9bIFx0XSsvL3NnOworICAgICAgJG9ycGhhbl9wYXJtcyA9fiBzL1sgXHRdK1xuL1xuL3NnOworICAgIH0KKyAgICAKKwkoJG9ycGhhbnZhcnNkZWZzKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czpvcnBoYW46dmFycycsJGNvZGUpOworCWZvcmVhY2ggKEB2YXJzZGVmKSB7CisJCWlmIChub3QgL1teIFxuJF0qLyl7ICRvcnBoYW52YXJzZGVmcyA9IGpvaW4oIlxuIiwkb3JwaGFudmFyc2RlZiwkXyk7fQorCX0KKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisJbXkgKCBAcmVzdWx0LCRmdW5jdGlvbnNyYywgJGkpOworCSRmdW5jdGlvbnNyYyA9ICAiXG4hIERlZmluaXRpb25zIG9mIHRoZSBvcnBoYW4gZnVuY3Rpb25zXG4iOworCSRpID0gMTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJJGZ1bmN0aW9uc3JjIC49ICJcbiAgICAgIFNVQlJPVVRJTkUgb3JwaCRpXF8kcHJlZml4XF8kZnVuY3Rpb25uYW1lXCgkb3JwaGFuX3Bhcm1zXClcbiAgICAgICI7CisgICAgICAgICRmdW5jdGlvbnNyYyAuPSAiSU5DTFVERSBcIm9tcF90ZXN0c3VpdGUuZlwiXG4iOworCQkkZnVuY3Rpb25zcmMgLj0gJG9ycGhhbnZhcnNkZWZzLiJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAkXzsKKwkJJGZ1bmN0aW9uc3JjIC49ICJcbiI7CisJCSRmdW5jdGlvbnNyYyAuPSAiICAgICAgRU5EIFNVQlJPVVRJTkVcbiEgRW5kIG9mIGRlZmluaXRpb25cblxuIjsKKwkJJGkrKzsKKwl9CisJcmV0dXJuICRmdW5jdGlvbnNyYzsKK30KKworIyBMSVNUIG9ycGhhbl9yZWdpb25zMmNmdW5jdGlvbnMoICRwcmVmaXgsIEBjb2RlICkKKyMgcmVwbGFjZXMgb3JwaGFuIHJlZ2lvbnMgYnkgZnVuY3Rpb25jYWxscyBpbiBDL0MrKy4KK3N1YiBvcnBoYW5fcmVnaW9uczJjZnVuY3Rpb25zCit7CisJbXkgKCRjb2RlLCAkaSwgJGZ1bmN0aW9ubmFtZSk7CisJKCRjb2RlKSA9IEBfOworCSRpID0gMTsKKwkoJGZ1bmN0aW9ubmFtZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkY29kZSk7CisgICAgICAgIHdoaWxlKCAvXDxvbXB0c1w6b3JwaGFuXD4oLiopXDxcL29tcHRzXDpvcnBoYW5cPi9zKSB7CisgICAgICAgICAgICBzI1w8b21wdHNcOm9ycGhhblw+KC4qPylcPFwvb21wdHNcOm9ycGhhblw+I29ycGgkaVxfJGZ1bmN0aW9ubmFtZSAobG9nRmlsZSk7I3M7CisgICAgICAgICAgICAkaSsrOworICAgICAgICB9CisJcmV0dXJuICRjb2RlOworfQorCisjIExJU1Qgb3JwaGFuX3JlZ2lvbnMyZm9ydHJhbmZ1bmN0aW9ucyggJHByZWZpeCwgQGNvZGUgKQorIyByZXBsYWNlcyBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzIGluIGZvcnRyYW4KK3N1YiBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zCit7CisJbXkgKCAkcHJlZml4LCBAY29kZSwgJG15X3Bhcm1zLCAkaSwgJGZ1bmN0aW9ubmFtZSk7CisJKCRwcmVmaXgsICgkY29kZSksICRteV9wYXJtcykgPSBAXzsKKwkkaSA9IDE7CisJKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJGNvZGUpOworCWZvcmVhY2ggJF8oKCRjb2RlKSkKKwl7CisJCXdoaWxlKCAvXDxvbXB0c1w6b3JwaGFuXD4oLiopXDxcL29tcHRzXDpvcnBoYW5cPi9zKQorCQl7CisJCQlzI1w8b21wdHNcOm9ycGhhblw+KC4qPylcPFwvb21wdHNcOm9ycGhhblw+IyAgICAgIENBTEwgb3JwaCRpXF8kcHJlZml4XF8kZnVuY3Rpb25uYW1lXCgkbXlfcGFybXNcKTsjczsKKwkJCSRpKys7CisJCX0KKwl9CisJcmV0dXJuICgkY29kZSk7Cit9CisKKyMgU0NBTEFSIG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucyggJHByZWZpeCwgJGNvZGUgKQorIyByZXR1cm5zIGEgc3JpbmcgaW5jbHVkaW5nIHRoZSBkZWNsYXJhdGlvbiBvZiB0aGUgZnVuY3Rpb25zIHVzZWQgCisjIGluIHRoZSBvcnBoYW4gcmVnaW9ucy4gVGhlIGZ1bmN0aW9uIG5hbWVzIGFyZSBnZW5lcmF0ZWQgdXNpbmcgCisjIHRoZSAkcHJlZml4IGFzIHByZWZpeCBmb3IgdGhlIGZ1bmN0aW9ubmFtZS4KK3N1YiBvcnBoX2Z1bmN0aW9uc19kZWNsYXJhdGlvbnMKK3sKKwlteSAoJHByZWZpeCwgJGNvZGUpOworCSgkcHJlZml4LCAkY29kZSkgPSBAXzsKKwlteSAoIEBkZWZzLCAkcmVzdWx0ICk7CisJCisJIyBjcmVhdGluZyBkZWNsYXJhdGlvbnMgZm9yIGxhdGVyIHVzZWQgZnVuY3Rpb25zCisJJHJlc3VsdCAuPSAiXG5cbi8qIERlY2xhcmF0aW9uIG9mIHRoZSBmdW5jdGlvbnMgY29udGFpbmluZyB0aGUgY29kZSBmb3IgdGhlIG9ycGhhbiByZWdpb25zICovXG4jaW5jbHVkZSA8c3RkaW8uaD5cbiI7CisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuJywkY29kZSk7CisJbXkgKCRmdW5jdGlvbm5hbWUsJGkpOworCSgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRjb2RlKTsKKwkkaSA9IDE7CisJZm9yZWFjaCAkXyhAZGVmcykgeworCQkkcmVzdWx0IC49ICJcbnZvaWQgb3JwaCRpXF8kcHJlZml4XF8kZnVuY3Rpb25uYW1lICggRklMRSAqIGxvZ0ZpbGUgKTsiOworCQkkaSsrOworCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uICovXG5cbiI7CisJcmV0dXJuICRyZXN1bHQ7Cit9CisKKyMgU0NBTEFSIG1ha2VfZ2xvYmFsX3ZhcnNfZGVmaW5pdGlvbiggJGNvZGUgKQorIyByZXR1cm5zIGEgc3JpbmcgaW5jbHVkaW5nIHRoZSBkZWNsYXJhdGlvbiBmb3IgdGhlIHZhcnMgbmVlZGVkIHRvCisjIGJlIGRlY2xhcmVkIGdsb2JhbCBmb3IgdGhlIG9ycGhhbiByZWdpb24uCitzdWIgbWFrZV9nbG9iYWxfdmFyc19kZWYKK3sKKwlteSAoICRjb2RlICk7CisJKCRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQsIEB0bXAsIEB0bXAyICwkcHJlZGVmaW5pdGlvbnMpOworCQorCSMgY3JlYXRpbmcgZ2xvYmFsIGRlY2xhcmF0aW9ucyBmb3IgdGhlIHZhcmlhYmxlcy4KKwkkcmVzdWx0ICA9ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIHZhcmlhYmxlcyB1c2VkIGluIHRoZSBvcnBoYW4gcmVnaW9uLiAqL1xuIjsKKwkKKwkjIGdldCBhbGwgdGFncyBjb250YWluaW5nIHRoZSB2YXJpYWJsZSBkZWZpbml0aW9ucworCUBkZWZzID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjp2YXJzJywkY29kZSk7CisJZm9yZWFjaCAkXyhAZGVmcykKKwl7CisJCSMgY3V0dGluZyB0aGUgZGlmZmVyZW50IGRlY2xhcmF0aW9ucyBpbiB0aGUgc2FtZSB0YWcgYnkgdGhlICc7JyBhcyBjdXR0bWFyaworCQlAdG1wID0gc3BsaXQoLzsvLCRfKTsKKwkJZm9yZWFjaCAkXyhAdG1wKQorCQl7CisJCQkjIHJlcGxhY2luZyBuZXdsaW5lcyBhbmQgZG91YmxlIHNwYWNlcworCQkJcy9cbi8vZ3M7CisJCQlzLyAgLy9nczsKKwkJCSMgcHV0IHRoZSBuZXcgZGVjbGFyYXRpb24gYXQgdGhlIGVuZCBvZiAkcmVzdWx0CisJCQlpZigkXyBuZSAiIil7ICRyZXN1bHQgLj0gIlxuICRfOyI7IH0KKwkJfQorCX0KKwkkcmVzdWx0IC49ICJcblxuLyogRW5kIG9mIGRlY2xhcmF0aW9uLiAqL1xuXG4iOworCXJldHVybiAkcmVzdWx0OworfQorCisjIFNDQUxBUiBleHRlcm5fdmFyc19kZWZpbml0aW9uKCAkY29kZSApCisjIHJldHVybnMgYSBzcmluZyBpbmNsdWRpbmcgdGhlIGRlY2xhcmF0aW9uIGZvciB0aGUgdmFycyBuZWVkZWQgdG8KKyMgYmUgZGVjbGFyZWQgZXh0ZXJuIGZvciB0aGUgb3JwaGFuIHJlZ2lvbi4KK3N1YiBleHRlcm5fdmFyc19kZWYKK3sKKwlteSAoICRjb2RlICk7CisJKCRjb2RlKSA9IEBfOworCW15ICggQGRlZnMsICRyZXN1bHQsIEB0bXAsIEB0bXAyICwkcHJlZGVmaW5pdGlvbnMpOworCQorCSMgY3JlYXRpbmcgZGVjbGFyYXRpb25zIGZvciB0aGUgZXh0ZXJuIHZhcmlhYmxlcy4KKwkkcmVzdWx0ICA9ICJcblxuLyogRGVjbGFyYXRpb24gb2YgdGhlIGV4dGVybiB2YXJpYWJsZXMgdXNlZCBpbiB0aGUgb3JwaGFuIHJlZ2lvbi4gKi9cbiI7CisJIyAkcmVzdWx0IC49ICJcbiNpbmNsdWRlIDxzdGRpby5oPlxuI2luY2x1ZGUgPG9tcC5oPlxuIjsKKwkkcmVzdWx0IC49ICJcbmV4dGVybiBGSUxFICogbG9nRmlsZTsiOworCQorCSMgZ2V0IGFsbCB0YWdzIGNvbnRhaW5pbmcgdGhlIHZhcmlhYmxlIGRlZmluaXRpb25zCisJQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6b3JwaGFuOnZhcnMnLCRjb2RlKTsKKwlmb3JlYWNoICRfKEBkZWZzKQorCXsKKwkJIyBjdXR0aW5nIHRoZSBkaWZmZXJlbnQgZGVjbGFyYXRpb25zIGluIHRoZSBzYW1lIHRhZyBieSB0aGUgJzsnIGFzIGN1dHRtYXJrCisJCUB0bXAgPSBzcGxpdCgvOy8sJF8pOworCQlmb3JlYWNoICRfKEB0bXApCisJCXsKKwkJCSMgcmVwbGFjaW5nIG5ld2xpbmVzIGFuZCBkb3VibGUgc3BhY2VzCisJCQlzL1xuLy9nczsKKwkJCXMvICAvL2dzOworCQkJIyBjdXR0aW5nIG9mZiBkZWZpbml0aW9ucworCQkJQHRtcDIgPSBzcGxpdCgiPSIsJF8pOworCQkJIyBwdXQgdGhlIG5ldyBkZWNsYXJhdGlvbiBhdCB0aGUgZW5kIG9mICRyZXN1bHQKKwkJCSRyZXN1bHQgLj0gIlxuZXh0ZXJuICR0bXAyWzBdOyI7CisJCX0KKwl9CisJJHJlc3VsdCAuPSAiXG5cbi8qIEVuZCBvZiBkZWNsYXJhdGlvbi4gKi9cblxuIjsKKwlyZXR1cm4gJHJlc3VsdDsKK30KKworc3ViIGxlYXZlX3NpbmdsZV9zcGFjZQoreworICBteSgkc3RyKTsKKyAgKCRzdHIpPUBfOworICBpZigkc3RyIG5lICIiKQorICB7CisgICAgJHN0ciA9fiBzL15bIFx0XSsvIC87CisgICAgJHN0ciA9fiBzL1sgXHRdK1xuJC9cbi87CisgICAgJHN0ciA9fiBzL1sgXHRdKy8vZzsKKyAgfQorICByZXR1cm4gJHN0cjsKK30KKworcmV0dXJuIDE7CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMgYi9yYzMvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTkxYjU5MwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvb21wdHNfc3RhbmRhbG9uZVByb2MuYwpAQCAtMCwwICsxLDUxIEBACitpbnQgbWFpbigpCit7CisJaW50IGk7CQkJLyogTG9vcCBpbmRleCAqLworCWludCByZXN1bHQ7CQkvKiByZXR1cm4gdmFsdWUgb2YgdGhlIHByb2dyYW0gKi8KKwlpbnQgZmFpbGVkPTA7IAkJLyogTnVtYmVyIG9mIGZhaWxlZCB0ZXN0cyAqLworCWludCBzdWNjZXNzPTA7CQkvKiBudW1iZXIgb2Ygc3VjY2VlZGVkIHRlc3RzICovCisJc3RhdGljIEZJTEUgKiBsb2dGaWxlOwkvKiBwb2ludGVyIG9udG8gdGhlIGxvZ2ZpbGUgKi8KKwlzdGF0aWMgY29uc3QgY2hhciAqIGxvZ0ZpbGVOYW1lID0gIjx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4ubG9nIjsJLyogbmFtZSBvZiB0aGUgbG9nZmlsZSAqLworCisKKwkvKiBPcGVuIGEgbmV3IExvZ2ZpbGUgb3Igb3ZlcndyaXRlIHRoZSBleGlzdGluZyBvbmUuICovCisJbG9nRmlsZSA9IGZvcGVuKGxvZ0ZpbGVOYW1lLCJ3KyIpOworCisJcHJpbnRmKCIjIyMjIyMjIyBPcGVuTVAgVmFsaWRhdGlvbiBTdWl0ZSBWICVzICMjIyMjI1xuIiwgT01QVFNfVkVSU0lPTiApOworCXByaW50ZigiIyMgUmVwZXRpdGlvbnM6ICUzZCAgICAgICAgICAgICAgICAgICAgICAgIyMjI1xuIixSRVBFVElUSU9OUyk7CisJcHJpbnRmKCIjIyBMb29wIENvdW50IDogJTZkICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLExPT1BDT1VOVCk7CisJcHJpbnRmKCIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjXG4iKTsKKwlwcmludGYoIlRlc3RpbmcgPGRpcmVjdGl2ZT48L2RpcmVjdGl2ZT5cblxuIik7CisKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgJXMgIyMjIyMjXG4iLCBPTVBUU19WRVJTSU9OICk7CisJZnByaW50Zihsb2dGaWxlLCIjIyBSZXBldGl0aW9uczogJTNkICAgICAgICAgICAgICAgICAgICAgICAjIyMjXG4iLFJFUEVUSVRJT05TKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIExvb3AgQ291bnQgOiAlNmQgICAgICAgICAgICAgICAgICAgICMjIyNcbiIsTE9PUENPVU5UKTsKKwlmcHJpbnRmKGxvZ0ZpbGUsIiMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyNcbiIpOworCWZwcmludGYobG9nRmlsZSwiVGVzdGluZyA8ZGlyZWN0aXZlPjwvZGlyZWN0aXZlPlxuXG4iKTsKKworCWZvciAoIGkgPSAwOyBpIDwgUkVQRVRJVElPTlM7IGkrKyApIHsKKwkJZnByaW50ZiAobG9nRmlsZSwgIlxuXG4lZC4gcnVuIG9mIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4gb3V0IG9mICVkXG5cbiIsaSsxLFJFUEVUSVRJT05TKTsKKwkJaWYoPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPihsb2dGaWxlKSl7CisJCQlmcHJpbnRmKGxvZ0ZpbGUsIlRlc3Qgc3VjY2Vzc2Z1bC5cbiIpOworCQkJc3VjY2VzcysrOworCQl9CisJCWVsc2UgeworCQkJZnByaW50Zihsb2dGaWxlLCJFcnJvcjogVGVzdCBmYWlsZWQuXG4iKTsKKwkJCXByaW50ZigiRXJyb3I6IFRlc3QgZmFpbGVkLlxuIik7CisJCQlmYWlsZWQrKzsKKwkJfQorCX0KKworICAgIGlmKGZhaWxlZD09MCl7CisJCWZwcmludGYobG9nRmlsZSwiXG5EaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLlxuIik7CisJCXByaW50ZigiRGlyZWN0aXZlIHdvcmtlZCB3aXRob3V0IGVycm9ycy5cbiIpOworCQlyZXN1bHQ9MDsKKwl9CisJZWxzZXsKKwkJZnByaW50Zihsb2dGaWxlLCJcbkRpcmVjdGl2ZSBmYWlsZWQgdGhlIHRlc3QgJWkgdGltZXMgb3V0IG9mICVpLiAlaSB3ZXJlIHN1Y2Nlc3NmdWxcbiIsZmFpbGVkLFJFUEVUSVRJT05TLHN1Y2Nlc3MpOworCQlwcmludGYoIkRpcmVjdGl2ZSBmYWlsZWQgdGhlIHRlc3QgJWkgdGltZXMgb3V0IG9mICVpLlxuJWkgdGVzdChzKSB3ZXJlIHN1Y2Nlc3NmdWxcbiIsZmFpbGVkLFJFUEVUSVRJT05TLHN1Y2Nlc3MpOworCQlyZXN1bHQgPSAoaW50KSAoKChkb3VibGUpIGZhaWxlZCAvIChkb3VibGUpIFJFUEVUSVRJT05TICkgKiAxMDAgKTsKKwl9CisJcHJpbnRmICgiUmVzdWx0OiAlaVxuIiwgcmVzdWx0KTsKKwlyZXR1cm4gcmVzdWx0OworfQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mIGIvcmMzL3Rlc3RzdWl0ZS9vbXB0c19zdGFuZGFsb25lUHJvYy5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhZmNhYjYKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL29tcHRzX3N0YW5kYWxvbmVQcm9jLmYKQEAgLTAsMCArMSw2OCBAQAorIVRoaXMgaXMgdGhlIG1haW4gZHJpdmVyIHRvIGludm9rZSBkaWZmZXJlbnQgdGVzdCBmdW5jdGlvbnMKKyAgICAgIFBST0dSQU0gPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPl9tYWluCisgICAgICBJTVBMSUNJVCBOT05FCisgICAgICBJTlRFR0VSIGZhaWxlZCwgc3VjY2VzcyAhTnVtYmVyIG9mIGZhaWxlZC9zdWNjZWVkZWQgdGVzdHMKKyAgICAgIElOVEVHRVIgbnVtX3Rlc3RzLGNyb3NzY2hlY2tlZCwgY3Jvc3NmYWlsZWQsIGoKKyAgICAgIElOVEVHRVIgdGVtcCx0ZW1wMQorICAgICAgSU5DTFVERSAib21wX3Rlc3RzdWl0ZS5mIgorCisgICAgICBJTlRFR0VSIDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4KKworCisgICAgICBDSEFSQUNURVIqNTAgbG9nZmlsZW5hbWUgIVBvaW50ZXIgdG8gbG9nZmlsZQorICAgICAgSU5URUdFUiByZXN1bHQgCisKKyAgICAgIG51bV90ZXN0cyA9IDAKKyAgICAgIGNyb3NzY2hlY2tlZCA9IDAKKyAgICAgIGNyb3NzZmFpbGVkID0gMAorICAgICAgcmVzdWx0ID0gMQorICAgICAgZmFpbGVkID0gMAorCisgICAgICAhT3BlbiBhIG5ldyBsb2dmaWxlIG9yIG92ZXJ3cml0ZSB0aGUgZXhpc3Rpbmcgb25lLgorICAgICAgbG9nZmlsZW5hbWUgPSAiYmluL2ZvcnRyYW4vPHRlc3RmdW5jdGlvbm5hbWU+PC90ZXN0ZnVuY3Rpb25uYW1lPi5sb2ciCishICAgICAgV1JJVEUgKCosKikgIkVudGVyIGxvZ0ZpbGVuYW1lOiIgCishICAgICAgUkVBRCAgKCosKikgbG9nZmlsZW5hbWUKKworICAgICAgT1BFTiAoMSwgRklMRSA9IGxvZ2ZpbGVuYW1lKQorIAorICAgICAgV1JJVEUgKCosKikgIiMjIyMjIyMjIE9wZW5NUCBWYWxpZGF0aW9uIFN1aXRlIFYgMy4wYSAjIyMjIyMiCisgICAgICBXUklURSAoKiwqKSAiIyMgUmVwZXRpdGlvbnM6IiwgTiAKKyAgICAgIFdSSVRFICgqLCopICIjIyBMb29wIENvdW50IDoiLCBMT09QQ09VTlQKKyAgICAgIFdSSVRFICgqLCopICIjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIgorICAgICAgV1JJVEUgKCosKikKKworICAgICAgY3Jvc3NmYWlsZWQ9MAorICAgICAgcmVzdWx0PTEKKyAgICAgIFdSSVRFICgxLCopICItLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLSIKKyAgICAgIFdSSVRFICgxLCopICJUZXN0aW5nIDxkaXJlY3RpdmU+PC9kaXJlY3RpdmU+IgorICAgICAgV1JJVEUgKDEsKikgIi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tIgorICAgICAgV1JJVEUgKDEsKikgCisgICAgICBXUklURSAoMSwqKSAidGVzdG5hbWU6IDx0ZXN0ZnVuY3Rpb25uYW1lPjwvdGVzdGZ1bmN0aW9ubmFtZT4iCisgICAgICBXUklURSAoMSwqKSAiKENyb3NzdGVzdHMgc2hvdWxkIGZhaWwpIgorICAgICAgV1JJVEUgKDEsKikKKyAgICAgIAorICAgICAgRE8gaiA9IDEsIE4KKyAgICAgICAgdGVtcCA9ICA8dGVzdGZ1bmN0aW9ubmFtZT48L3Rlc3RmdW5jdGlvbm5hbWU+KCkKKyAgICAgICAgSUYgKHRlbXAgLkVRLiAxKSBUSEVOCisgICAgICAgICAgV1JJVEUgKDEsKikgIGosICIuIHRlc3Qgc3VjY2Vzc2Z1bC4iCisgICAgICAgICAgc3VjY2VzcyA9IHN1Y2Nlc3MgKyAxCisgICAgICAgIEVMU0UKKyAgICAgICAgICBXUklURSAoMSwqKSAiRXJyb3I6ICIsaiwgIi4gdGVzdCBmYWlsZWQuIgorICAgICAgICAgIGZhaWxlZCA9IGZhaWxlZCArIDEKKyAgICAgICAgRU5ESUYKKyAgICAgIEVORCBETworCisgICAgICAKKyAgICAgIElGIChmYWlsZWQgLkVRLiAwKSBUSEVOCisgICAgICAgIFdSSVRFICgxLCopICJEaXJlY3RpdmUgd29ya2VkIHdpdGhvdXQgZXJyb3JzLiIKKyAgICAgICAgV1JJVEUgKCosKikgIkRpcmVjdGl2ZSB3b3JrZWQgd2l0aG91dCBlcnJvcnMuIgorICAgICAgICByZXN1bHQgPSAwCisgICAgICAgIFdSSVRFICgqLCopICJSZXN1bHQ6IixyZXN1bHQKKyAgICAgIEVMU0UKKyAgICAgICAgV1JJVEUgKDEsKikgIkRpcmVjdGl2ZSBmYWlsZWQgdGhlIHRlc3QgIiwgZmFpbGVkLCAiIHRpbWVzLiIKKyAgICAgICAgV1JJVEUgKCosKikgIkRpcmVjdGl2ZSBmYWlsZWQgdGhlIHRlc3QgIiwgZmFpbGVkLCAiIHRpbWVzLiIKKyAgICAgICAgcmVzdWx0ID0gZmFpbGVkICogMTAwIC8gTgorICAgICAgICBXUklURSAoKiwqKSAiUmVzdWx0OiIscmVzdWx0CisgICAgICBFTkRJRgorICAgICAgQ0FMTCBFWElUIChyZXN1bHQpCisgICAgICBFTkQgUFJPR1JBTSAKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvcnVudGVzdC5wbCBiL3JjMy90ZXN0c3VpdGUvcnVudGVzdC5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi4zNDcyMzUxCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS9ydW50ZXN0LnBsCkBAIC0wLDAgKzEsNTkyIEBACisjIS91c3IvYmluL2VudiBwZXJsCisKKyMgcnVudGVzdCBbb3B0aW9uc10gRklMRU5BTUUKKyMKKyMgUmVhZCB0aGUgZmlsZSBGSUxFTkFNRS4gRWFjaCBsaW5lIGNvbnRhaW5zIGEgdGVzdC4KKyMgQ29udmVydCB0ZW1wbGF0ZSB0byB0ZXN0IGFuZCBjcm9zc3Rlc3QuCisjIElmIHBvc3NpbGJsZSBnZW5lcmF0ZSBvcnBoYW5lZCB0ZXN0dmVyc2lvbnMsIHRvby4KKyMgVXNlIG1ha2UgdG8gY29tcGlsZSB0aGUgdGVzdAorCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworIyBHbG9iYWwgY29uZmlndXJhdGlvbiBvcHRpb25zIGZvciB0aGUgcnVudGVzdHNjcmlwdCBpdHNlbGY6CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIG5hbWUgb2YgdGhlIGdsb2JhbCBjb25maWd1cmF0aW9uIGZpbGUgZm9yIHRoZSB0ZXN0c3VpdGU6CiskY29uZmlnX2ZpbGUgICAgPSAib21wdHMuY29uZiI7CiskbG9nZmlsZSAgICAgICAgPSAib21wdHMubG9nIjsgIyBvdmVyd3JpdGVhYmxlIGJ5IHZhbHVlIGluIGNvbmZpZyBmaWxlCiskZW52X3NldF90aHJlYWRzX2NvbW1hbmQgPSAnT01QX05VTV9USFJFQURTPSVuOyBleHBvcnQgT01QX05VTV9USFJFQURTOyc7CiskZGVidWdfbW9kZSAgICAgPSAwOworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQWZ0ZXIgdGhpcyBsaW5lIHRoZSBzY3JpcHQgcGFydCBiZWdpbnMhIERvIG5vdCBlZGl0IGFuaXRoaW5nIGJlbG93CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisKKyMgTmFtZXNwYWNlczoKK3VzZSBHZXRvcHQ6Okxvbmc7CisjdXNlIFVuaXg6OlBJRDsKK3VzZSBEYXRhOjpEdW1wZXI7Cit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEV4dHJhY3RpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygiaGVscCIsCisgICAgICAibGlzdGxhbmd1YWdlcyIsCisgICAgICAibGFuZz1zIiwKKyAgICAgICJsaXN0IiwKKyAgICAgICJ0ZXN0aW5mbz1zIiwKKyAgICAgICJudW10aHJlYWRzPWkiLAorICAgICAgInRlc3Q9cyIsCisgICAgICAiY29tcGlsZSEiLAorICAgICAgInJ1biEiLAorICAgICAgIm9ycGhhbiEiLAorICAgICAgInJlc3VsdGZpbGU9cyIKKyAgICAgICk7CisKKyMgR2V0IGdsb2JhbCBjb25maWd1cmF0aW5vIG9wdGlvbnMgZnJvbSBjb25maWcgZmlsZToKK2lmKCEgLWUgJGNvbmZpZ19maWxlKXsgZXJyb3IgKCJDb3VsZCBub3QgZmluZCBjb25maWcgZmlsZSAkY29uZmlnX2ZpbGVcbiIsIDEpO30KK29wZW4gKENPTkZJRywgIjwkY29uZmlnX2ZpbGUiKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuIGNvbmZpZyBmaWxlICRjb25maWdfZmlsZVxuIiwgMik7Cit3aGlsZSAoPENPTkZJRz4pIHsgJGNvbmZpZyAuPSAkXzsgfQorY2xvc2UgKENPTkZJRyk7CisKKygkbG9nZmlsZSkgPSBnZXRfdGFnX3ZhbHVlcyAoImxvZ2ZpbGUiLCAkY29uZmlnKTsKKygkdGltZW91dCkgPSBnZXRfdGFnX3ZhbHVlcyAoInNpbmdsZXRlc3R0aW1lb3V0IiwgJGNvbmZpZyk7CisoJGRpc3BsYXlfZXJyb3JzKSA9IGdldF90YWdfdmFsdWVzKCJkaXNwbGF5ZXJyb3JzIiwgJGNvbmZpZyk7CisoJGRpc3BsYXlfd2FybmluZ3MpID0gZ2V0X3RhZ192YWx1ZXMgKCJkaXNwbGF5d2FybmluZ3MiLCAkY29uZmlnKTsKKygkbnVtdGhyZWFkcykgPSBnZXRfdGFnX3ZhbHVlcyAoIm51bXRocmVhZHMiLCAkY29uZmlnKTsKKygkZW52X3NldF90aHJlYWRzX2NvbW1hbmQpID0gZ2V0X3RhZ192YWx1ZXMoImVudnNldHRocmVhZHNjb21tYW5kIiwkY29uZmlnKTsKKyRlbnZfc2V0X3RocmVhZHNfY29tbWFuZCA9fiBzL1wlbi8kbnVtdGhyZWFkcy9nOworQGxhbmd1YWdlcyA9IGdldF90YWdfdmFsdWVzICgibGFuZ3VhZ2UiLCAkY29uZmlnKTsKKworaWYgKCFkZWZpbmVkKCRvcHRfY29tcGlsZSkpIHskb3B0X2NvbXBpbGUgPSAxO30KK2lmICghZGVmaW5lZCgkb3B0X3J1bikpICAgICB7JG9wdF9ydW4gPSAxO30KK2lmICghZGVmaW5lZCgkb3B0X29ycGhhbikpIHskb3B0X29ycGhhbiA9IDE7fQoraWYgKCFkZWZpbmVkKCRvcHRfcmVzdWx0c2ZpbGUpKSB7KCRvcHRfcmVzdWx0c2ZpbGUpID0gZ2V0X3RhZ192YWx1ZXMoInJlc3VsdHNmaWxlIiwgJGNvbmZpZyk7fQoraWYgKCBkZWZpbmVkKCRvcHRfbnVtdGhyZWFkcykgJiYgKCRvcHRfbnVtdGhyZWFkcyA+IDApKSB7JG51bXRocmVhZHMgPSAkb3B0X251bXRocmVhZHM7fQoraWYgKCRkZWJ1Z19tb2RlKSB7CitwcmludCA8PEVPRjsKK1Rlc3RzdWl0ZSBjb25maWd1cmF0aW9uOgorTG9nZmlsZSA9ICRsb2dmaWxlCitUaW1lb3V0ID0gJHRpbWVvdXQgc2Vjb25kcworTGFuZ3VhZ2U6ICAkb3B0X2xhbmcKK0Rpc3BsYXkgZXJyb3JzOiAgICRkaXNwbGF5X2Vycm9ycworRGlzcGxheSB3YXJuaW5nczogJGRpc3BsYXlfd2FybmluZ3MKK1Jlc3VsdHNmaWxlOiAgICAgICRvcHRfcmVzdWx0c2ZpbGUKK051bXRocmVhZHM6ICRudW10aHJlYWRzCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KK0VPRgorfQorCiskbnVtX2NvbnN0cnVjcyAgICA9IDA7CiskbnVtX3Rlc3RzICAgICAgICA9IDA7CiskbnVtX2ZhaWxlZF90ZXN0cyA9IDA7CiskbnVtX3N1Y2Nlc3NmdWxfdGVzdHMgICA9IDA7CiskbnVtX3ZlcmlmaWVkX3Rlc3RzICAgICA9IDA7CiskbnVtX2ZhaWxlZF9jb21waWxhdGlvbiA9IDA7CisKKyRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZCA9IDA7CiskbnVtX25vcm1hbF90ZXN0c19jb21waWxlX2Vycm9yID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3RpbWVkX291dCA9IDA7CiskbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsID0gMDsKKyRudW1fbm9ybWFsX3Rlc3RzX3ZlcmlmaWVkID0gMDsKKworJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQgPSAwOworJG51bV9vcnBoYW5lZF90ZXN0c19jb21waWxlX2Vycm9yID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfdGltZWRfb3V0ID0gMDsKKyRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bCA9IDA7CiskbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkID0gMDsKKworaWYgKCRvcHRfaGVscCkgICAgICAgICB7IHByaW50X2hlbHBfdGV4dCAoKTsgICBleGl0IDA7IH0KK2lmICgkb3B0X2xpc3RsYW5ndWFnZXMpeyBwcmludF9hdmFpbF9sYW5ncyAoKTsgZXhpdCAwOyB9CitpZiAoJG9wdF9saXN0KSAgICAgeyBwcmludF9hdmFpbF90ZXN0cyAoKTsgICBleGl0IDA7IH0KK2lmICgkb3B0X3Rlc3RpbmZvKSB7IHByaW50X3Rlc3RpbmZvICgpOyAgICAgIGV4aXQgMDsgfQoraWYgKCRvcHRfdGVzdCkgICAgIHsgd3JpdGVfcmVzdWx0X2ZpbGVfaGVhZCgpOworICAgICAgICAgICAgICAgICAgICAgZXhlY3V0ZV9zaW5nbGVfdGVzdCAoKTsgZXhpdCAwOyB9CitpZiAoLWUgJEFSR1ZbMF0pICAgeyB3cml0ZV9yZXN1bHRfZmlsZV9oZWFkKCk7CisgICAgICAgICAgICAgICAgICAgICBleGVjdXRlX3Rlc3RsaXN0KCRBUkdWWzBdKTsgcHJpbnRfcmVzdWx0cygpOworICAgICAgICAgICAgICAgICAgICAgcmVzdWx0X3N1bW1hcnkoKTsgZXhpdCAwO30KKworIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgc3ViIGZ1bmN0aW9uIGRlZmluaXRpb25zCisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworCisjIEZ1bmN0aW9uIHdoaWNoIHByaW50cyB0aGUgcmVzdWx0cyBmaWxlCitzdWIgcHJpbnRfcmVzdWx0cworeworICAgIHN5c3RlbSgiZWNobzsgY2F0ICRvcHRfcmVzdWx0c2ZpbGU7IGVjaG87Iik7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggcHJpbnRzIGEgc3VtbWFyeSBvZiBhbGwgdGVzdAorc3ViIHJlc3VsdF9zdW1tYXJ5Cit7CisgICAgbXkgJG51bV9kaXJlY3RpdmVzID0gQHRlc3RfcmVzdWx0czsKKworICAgIHByaW50IDw8RU9GOworCitTdW1tYXJ5OgorUyBOdW1iZXIgb2YgdGVzdGVkIE9wZW4gTVAgY29uc3RydWN0czogJG51bV9jb25zdHJ1Y3RzCitTIE51bWJlciBvZiB1c2VkIHRlc3RzOiAgICAgICAgICAgICAgICAkbnVtX3Rlc3RzCitTIE51bWJlciBvZiBmYWlsZWQgdGVzdHM6ICAgICAgICAgICAgICAkbnVtX2ZhaWxlZF90ZXN0cworUyBOdW1iZXIgb2Ygc3VjY2Vzc2Z1bCB0ZXN0czogICAgICAgICAgJG51bV9zdWNjZXNzZnVsX3Rlc3RzCitTICsgZnJvbSB0aGlzIHdlcmUgdmVyaWZpZWQ6ICAgICAgICAgICAkbnVtX3ZlcmlmaWVkX3Rlc3RzCisKK05vcm1hbCB0ZXN0czoKK04gTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX2ZhaWxlZAorTiArIGZyb20gdGhpcyBmYWlsIGNvbXBpbGF0aW9uOiAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvcgorTiArIGZyb20gdGhpcyB0aW1lZCBvdXQgICAgICAgICAgICAgICAgJG51bV9ub3JtYWxfdGVzdHNfdGltZWRfb3V0CitOIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c19zdWNjZXNzZnVsCitOICsgZnJvbSB0aGlzIHdlcmUgdmVyaWZpZWQ6ICAgICAgICAgICAkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZAorCitPcnBoYW5lZCB0ZXN0czoKK08gTnVtYmVyIG9mIGZhaWxlZCB0ZXN0czogICAgICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfZmFpbGVkCitPICsgZnJvbSB0aGlzIGZhaWwgY29tcGlsYXRpb246ICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3IKK08gKyBmcm9tIHRoaXMgdGltZWQgb3V0ICAgICAgICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfdGltZWRfb3V0CitPIE51bWJlciBvZiBzdWNjZXNzZnVsIHRlc3RzOiAgICAgICAgICAkbnVtX29ycGhhbmVkX3Rlc3RzX3N1Y2Nlc3NmdWwKK08gKyBmcm9tIHRoaXMgd2VyZSB2ZXJpZmllZDogICAgICAgICAgICRudW1fb3JwaGFuZWRfdGVzdHNfdmVyaWZpZWQKK0VPRgorCit9CisKKyMgRnVuY3Rpb24gdGhhdCBleGVjdXRlc3QgdGhlIHRlc3RzIHNwZWNpZmllZCBpbiB0aGUgZ2l2ZW4gbGlzdAorc3ViIGV4ZWN1dGVfdGVzdGxpc3QKK3sKKyAgICBteSAoJGZpbGVuYW1lKSA9IEBfOworICAgICMgb3BlbmluZyB0ZXN0bGlzdAorICAgIG9wZW4oVEVTVFMsJGZpbGVuYW1lKSBvciBlcnJvciAoIkNvdWxkIG5vdCBvcGVuICAkZmlsZW5hbWVcbiIsIDEpOworVEVTVDogd2hpbGUgKDxURVNUUz4pIHsKKyAgICAgICAgaWYgKC9eXHMqIy8pIHtuZXh0IFRFU1Q7fQorICAgICAgICBpZiAoL15ccyokLykge25leHQgVEVTVDt9CisgICAgICAgICRvcHRfdGVzdCA9ICRfOworICAgICAgICBjaG9tcCAoJG9wdF90ZXN0KTsKKyAgICAgICAgZXhlY3V0ZV9zaW5nbGVfdGVzdCAoKTsKKyAgICB9CisjIHByaW50IER1bXBlcihAdGVzdF9yZXN1bHRzKTsKK30KKworIyBGdW5jdGlvbiB0aGF0IGV4ZWN1dGVzIGEgc3lzdGVtIGNvbW1hbmQgYnV0IHRha2VzIGNhcmUgb2YgdGhlIGdsb2JhbCB0aW1lb3V0CisjIElmIGNvbW1hbmQgZGlkIG5vdCBmaW5pc2ggaW5iZXR3ZWVuIHJldHVybnMgJy0nIG90aGVyd2lzZSB0aGUgZXhpdCBzdGF0dXMgb2YKKyMgdGhlIHN5c3RlbSBjb21tYW5kCitzdWIgdGltZWRfc3lzX2NvbW1hbmQKK3sKKyAgICBteSAoJGNvbW1hbmQpID0gQF87CisgICAgbXkgJGV4aXRfc3RhdHVzID0gJy0nOworCisjIHNldCB1cCB0aGUgdGltZW91dCBmb3IgdGhlIGNvbW1hbmQKKyAgICBldmFsIHsKKyAgICAgICAgbG9jYWwgJFNJR3tBTFJNfSA9IHN1YiB7ZGllICJhbGFybVxuIn07CisgICAgICAgIGFsYXJtICR0aW1lb3V0OworICAgICAgICBsb2dfbWVzc2FnZV9hZGQgKCJTdGFydGluZyBjb21tYW5kIFwiJGNvbW1hbmRcIiIpOworICAgICAgICAkZXhpdF9zdGF0dXMgPSBzeXN0ZW0gKCRjb21tYW5kKTsKKyAgICAgICAgYWxhcm0gMDsKKyAgICB9OworIyBjaGVjayBpZiBjb21tYW5kIGZpbmlzaGVkIGR1cmluZyB0aGUgbWF4aW11bSBleGVjdXRpb24gdGltZQorICAgIGlmICgkQCBlcSAiYWxhcm1cbiIpIHsKKyMgdGVzdCB0aW1lZCBvdXQKKyMJCW15ICRwaWQgPSBVbml4OjpQSUQtPm5ldygpOworIwkJJHBpZC0+Z2V0X3BpZG9mKCRjb21tYW5kLCAxKTsKKyMJCSRwaWQtPmtpbGwoKTsKKyAgICAgICAgaWYgKCRkZWJ1Z19tb2RlKSB7CisJICAgIGxvZ19tZXNzYWdlX2FkZCAoIkNvbW1hbmQgXCIkY29tbWFuZFwiIHJlYWNoZWQgbWF4IGV4ZWN1dGlvbiB0aW1lLlxuIik7CisgICAgICAgIH0KKyAgICAgICAgcmV0dXJuICJUTyI7CisgICAgfQorIyB0ZXN0IGZpbmlzaGVkCisgICAgcmV0dXJuICRleGl0X3N0YXR1czsKK30KKworIyBGdW5jdGlvbiB0aGF0IHJ1bnMgdGhlIHRlc3RzIGdpdmVuIGFzIGEgYXJyYXkgY29udGFpbmluZyB0aGUgdGVzdG5hbWVzCisjIFJldHVybnMgYW4gYXJyYXkgY29udGFpbmluZyB0aGUgcGVyY2VudCB2YWx1ZXMgb2YgdGhlIHBhc3NlZCB0ZXN0cyBhbmQgdGhlCisjIHN1Y2Nlc3NmdWwgY3Jvc3N0ZXN0cy4KK3N1YiBydW5fdGVzdAoreworICAgIG15ICgkdGVzdG5hbWUsICRvcnBoYW4pID0gQF87CisgICAgbXkgJGJpbl9uYW1lLCAkY2Jpbl9uYW1lOworICAgIG15ICRjbWQsICRleGl0X3N0YXR1cywgJGZhaWxlZDsKKyAgICBteSAkcmVzdWx0dGVzdCwgJHJlc3VsdGN0ZXN0OworCisjIHBhdGggdG8gdGVzdCBhbmQgY3Jvc3N0ZXN0IGVpdGhlciBpbiBub3JtYWwgb3IgaW4gb3JwaGFuZWQgdmVyc2lvbgorICAgIGlmICgkb3JwaGFuKSB7CisgICAgICAgICRiaW5fbmFtZSAgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJGNiaW5fbmFtZSA9ICJiaW4vJG9wdF9sYW5nL29ycGhfY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICB9IGVsc2UgeworICAgICAgICAkYmluX25hbWUgID0gImJpbi8kb3B0X2xhbmcvdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkY2Jpbl9uYW1lID0gImJpbi8kb3B0X2xhbmcvY3Rlc3RfJHRlc3RuYW1lIjsKKyAgICB9CisjIENoZWNrIGlmIGV4ZWN1dGFibGVzIGV4aXN0CisgICAgaWYgKCEgLWUgJGJpbl9uYW1lKSB7CisgICAgICAgIHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCBleGVjdXRhYmxlIFwiJGJpbl9uYW1lXCIuIik7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICctJywgJ2Nyb3NzdGVzdCcgPT4gJy0nKTsKKyAgICB9CisjIHJ1biB0aGUgdGVzdAorICAgICRjbWQgPSAiJGVudl9zZXRfdGhyZWFkc19jb21tYW5kIC4vJGJpbl9uYW1lID4kYmluX25hbWUub3V0IjsKKyAgICBwcmludCAiUnVubmluZyB0ZXN0IHdpdGggJG51bXRocmVhZHMgdGhyZWFkcyAuIjsKKyAgICAkZXhpdF9zdGF0dXMgPSB0aW1lZF9zeXNfY29tbWFuZCAoJGNtZCk7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgaWYgdGVzdCBmaW5pc2hlZCB3aXRoaW4gbWF4IGV4ZWN1dGlvbiB0aW1lCisgICAgaWYgKCRleGl0X3N0YXR1cyBlcSAnVE8nKSB7CisgICAgICAgIHByaW50ICIuLi4uIGZhaWxlZCAodGltZW91dClcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICdUTycsICdjcm9zc3Rlc3QnID0+ICctJykKKyAgICB9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgY2hlY2sgaWYgYWxsIHRlc3RzIHdlcmUgc3VjY2Vzc2Z1bAorICAgICRmYWlsZWQgPSAkZXhpdF9zdGF0dXMgPj4gODsKKyAgICBpZiAoJGZhaWxlZCA8IDAgb3IgJGZhaWxlZCA+IDEwMCkgeyAkZmFpbGVkID0gMTAwOyB9CisgICAgJHJlc3VsdHRlc3QgPSAxMDAgLSAkZmFpbGVkOworICAgIGlmICgkcmVzdWx0dGVzdCBlcSAxMDApIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gc3VjY2VzcyAuLi4iOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ICIuLi4uIGZhaWxlZCAkZmFpbGVkXCUgb2YgdGhlIHRlc3RzXG4iOworICAgICAgICByZXR1cm4gKCd0ZXN0JyA9PiAkcmVzdWx0dGVzdCwgJ2Nyb3NzdGVzdCcgPT4gJy0nKTsKKyAgICB9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKworIyBkbyBjcm9zc3Rlc3QKKyMgY2hlY2sgaWYgZXhlY3V0YWJsZSBleGlzdAorICAgIGlmICghIC1lICRjYmluX25hbWUpIHsKKyAgICAgICAgdGVzdF9lcnJvciAoIkNvdWxkIG5vdCBmaW5kIGV4ZWN1dGFibGUgXCIkY2Jpbl9uYW1lXCIuIik7CisgICAgICAgIHByaW50ICIuLi4gbm90IHZlcmlmaWVkIChjcm9zc3Rlc3QgbWlzc2luZylcbiI7CisgICAgICAgIHJldHVybiAoJ3Rlc3QnID0+ICRyZXN1bHR0ZXN0LCAnY3Jvc3N0ZXN0JyA9PiAnLScpOworICAgIH0KKyMgcnVuIGNyb3NzdGVzdAorIyBUZXN0IHdhcyBzdWNjZXNzZnVsLCBzbyBpdCBtYWtlcyBzZW5zZSB0byBydW4gdGhlIGNyb3NzdGVzdAorICAgICRjbWQgPSAiJGVudl9zZXRfdGhyZWFkc19jb21tYW5kIC4vJGNiaW5fbmFtZSA+ICRjYmluX25hbWUub3V0IjsKKyAgICAkZXhpdF9zdGF0dXMgPSB0aW1lZF9zeXNfY29tbWFuZCAoJGNtZCk7CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgQ2hlY2sgaWYgY3Jvc3N0ZXN0IGZpbmlzaGVkIHdpdGhpbiBtYXggZXhlY3V0aW9uIHRpbWUKKyAgICBpZiAoJGV4aXRfc3RhdHVzIGVxICdUTycpIHsKKyAgICAgICAgcHJpbnQgIi4uLiBub3QgdmVyaWZpZWQgKHRpbWVvdXQpXG4iOworICAgICAgICByZXR1cm4gKCd0ZXN0JyA9PiAkcmVzdWx0LCAnY3Jvc3N0ZXN0JyA9PiAnVE8nKTsKKyAgICB9CisjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgdGVzdCBpZiBjcm9zc3Rlc3RzIGZhaWxlZCBhcyBleHBlY3RlZAorICAgICRyZXN1bHRjdGVzdCA9ICRleGl0X3N0YXR1cyA+PiA4OworICAgIGlmICgkcmVzdWx0Y3Rlc3QgPiAwKSB7CisgICAgICAgIHByaW50ICIuLi4gYW5kIHZlcmlmaWVkIHdpdGggJHJlc3VsdGN0ZXN0XCUgY2VydGFpbnR5XG4iOworICAgIH0gZWxzZSB7CisgICAgICAgIHByaW50ICIuLi4gYnV0IG1pZ2h0IGJlIGx1Y2t5XG4iOworICAgIH0KKyAgICByZXR1cm4gKCd0ZXN0JyA9PiAkcmVzdWx0dGVzdCwgJ2Nyb3NzdGVzdCcgPT4gJHJlc3VsdGN0ZXN0KTsKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIworfQorCisjIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSB0ZXN0IGJpbmFyaWVzIG91dCBvZiB0aGUgc291cmNlY29kZQorc3ViIGNvbXBpbGVfc3JjCit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBwcmludCAiQ29tcGlsaW5nIHNvdXJlcyAuLi4uLi4uLi4uLi4iOworICAgIGlmICgkb3JwaGFuKSB7CisjIE1ha2Ugb3JwaGFuZWQgdGVzdHMKKyAgICAgICAgJGV4ZWNfbmFtZSAgICAgPSAiYmluLyRvcHRfbGFuZy9vcnBoX3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJGNyb3NzZXhlX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX2N0ZXN0XyR0ZXN0bmFtZSI7CisgICAgICAgICRyZXN1bHR0ZXN0ICA9IHN5c3RlbSAoIm1ha2UgJGV4ZWNfbmFtZSA+ICRleGVjX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgICAgICAkcmVzdWx0Y3Rlc3QgPSBzeXN0ZW0gKCJtYWtlICRjcm9zc2V4ZV9uYW1lID4gJGNyb3NzZXhlX25hbWVcX2NvbXBpbGUubG9nIiApOworICAgIH0gZWxzZSB7CisjIE1ha2UgdGVzdAorICAgICAgICAkZXhlY19uYW1lICAgICA9ICJiaW4vJG9wdF9sYW5nL3Rlc3RfJHRlc3RuYW1lIjsKKyAgICAgICAgJGNyb3NzZXhlX25hbWUgPSAiYmluLyRvcHRfbGFuZy9jdGVzdF8kdGVzdG5hbWUiOworICAgICAgICAkcmVzdWx0dGVzdCAgPSBzeXN0ZW0gKCJtYWtlICRleGVjX25hbWUgPiAkZXhlY19uYW1lXF9jb21waWxlLmxvZyIgKTsKKyAgICAgICAgJHJlc3VsdGN0ZXN0ID0gc3lzdGVtICgibWFrZSAkY3Jvc3NleGVfbmFtZSA+ICRjcm9zc2V4ZV9uYW1lXF9jb21waWxlLmxvZyIgKTsKKyAgICB9CisgICAgaWYgKCRyZXN1bHR0ZXN0KSB7IHRlc3RfZXJyb3IgKCJDb21waWxhdGlvbiBvZiB0aGUgdGVzdCBmYWlsZWQuIik7IH0KKyAgICBpZiAoJHJlc3VsdGN0ZXN0KXsgdGVzdF9lcnJvciAoIkNvbXBpbGF0aW9uIG9mIHRoZSBjcm9zc3Rlc3QgZmFpbGVkLiIpOyB9CisKKyAgICBpZiAoJHJlc3VsdHRlc3Qgb3IgJHJlc3VsdGN0ZXN0KSB7CisgICAgICAgIHByaW50ICIuLi4uIGZhaWxlZFxuIjsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gc3VjY2Vzc1xuIjsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfQorfQorCisjIEZ1bmN0aW9uIHdoaWNoIHByZXBhcmUgdGhlIGRpcmVjdG9yeSBzdHJ1Y3R1cmU6CitzdWIgaW5pdF9kaXJlY3Rvcnlfc3RydWN0dXJlCit7CisgICAgbXkgKCRsYW5ndWFnZSkgPSBAXzsKKyAgICBpZiAoLWUgImJpbiIgJiYgLWQgImJpbiIpIHsgd2FybmluZyAoIk9sZCBiaW5hcnkgZGlyZWN0b3J5IGRldGVjdGVkISIpO30KKyAgICBlbHNlIHsgc3lzdGVtICgibWtkaXIgYmluIik7IH0KKyAgICBpZiAoLWUgImJpbi8kbGFuZ3VhZ2UiICYmIC1kICJiaW4vJGxhbmd1YWdlIikgeworICAgICAgICB3YXJuaW5nICgiT2xkIGJpbmFyeSBkaXJlY3RvcnkgZm9yIGxhbmd1YWdlICRsYW5ndWFnZSBmb3VuZC4iKTt9CisgICAgZWxzZSB7IHN5c3RlbSAoIm1rZGlyIGJpbi8kbGFuZ3VhZ2UiKTsgfQorfQorCisjIEZ1bmN0aW9uIHRoYXQgZ2VuZXJhdGVzIHRoZSBzb3VyY2Vjb2RlIGZvciB0aGUgZ2l2ZW4gdGVzdAorc3ViIG1ha2Vfc3JjCit7CisgICAgbXkgKCR0ZXN0bmFtZSwgJG9ycGhhbikgPSBAXzsKKyAgICBteSAkdGVtcGxhdGVfZmlsZTsKKyAgICBteSAkc3JjX25hbWU7CisKKyAgICAkdGVtcGxhdGVfZmlsZSA9ICIkZGlyLyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICBpZiAoIS1lICR0ZW1wbGF0ZV9maWxlKSB7IHRlc3RfZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBmb3IgXCIkdGVzdG5hbWVcIiIpOyB9CisKKyAgICBwcmludCAiR2VuZXJhdGluZyBzb3VyY2VzIC4uLi4uLi4uLi4iOworICAgIGlmICgkb3JwaGFuKSB7CisjIE1ha2Ugb3JwaGFuZWQgdGVzdHMKKyAgICAgICAgJHNyY19uYW1lID0gImJpbi8kb3B0X2xhbmcvb3JwaF90ZXN0XyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS10ZXN0IC0tb3JwaGFuICR0ZW1wbGF0ZV9maWxlICRzcmNfbmFtZSIpOworICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy9vcnBoX2N0ZXN0XyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICAgICAgJHJlc3VsdGN0ZXN0ID0gc3lzdGVtICgiLi8kdGVtcGxhdGVwYXJzZXJuYW1lIC0tY3Jvc3N0ZXN0IC0tb3JwaGFuICR0ZW1wbGF0ZV9maWxlICRzcmNfbmFtZSIpOworICAgIH0gZWxzZSB7CisjIE1ha2UgdGVzdAorICAgICAgICAkc3JjX25hbWUgPSAiYmluLyRvcHRfbGFuZy90ZXN0XyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICAgICAgJHJlc3VsdHRlc3QgPSBzeXN0ZW0gKCIuLyR0ZW1wbGF0ZXBhcnNlcm5hbWUgLS10ZXN0IC0tbm9vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgICAgICRzcmNfbmFtZSA9ICJiaW4vJG9wdF9sYW5nL2N0ZXN0XyR0ZXN0bmFtZS4kZXh0ZW5zaW9uIjsKKyAgICAgICAgJHJlc3VsdGN0ZXN0ID0gc3lzdGVtICgiLi8kdGVtcGxhdGVwYXJzZXJuYW1lIC0tY3Jvc3N0ZXN0IC0tbm9vcnBoYW4gJHRlbXBsYXRlX2ZpbGUgJHNyY19uYW1lIik7CisgICAgfQorICAgIGlmICgkcmVzdWx0dGVzdCkgeyB0ZXN0X2Vycm9yICgiR2VuZXJhdGlvbiBvZiBzb3VyY2Vjb2RlIGZvciB0aGUgdGVzdCBmYWlsZWQuIik7IH0KKyAgICBpZiAoJHJlc3VsdGN0ZXN0KXsgdGVzdF9lcnJvciAoIkdlbmVyYXRpb24gb2Ygc291cmNlY29kZSBmb3IgdGhlIGNyb3NzdGVzdCBmYWlsZWQuIik7IH0KKworICAgIGlmICgkcmVzdWx0dGVzdCBvciAkcmVzdWx0Y3Rlc3QpIHsKKyAgICAgICAgcHJpbnQgIi4uLi4gZmFpbGVkXG4iOworICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgcHJpbnQgIi4uLi4gc3VjY2Vzc1xuIjsKKyAgICAgICByZXR1cm4gMTsKKyAgICB9Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggY2hlY2tzIGlmIGEgZ2l2ZW4gdGVzdCBpcyBvcnBoYW5hYmxlCitzdWIgdGVzdF9pc19vcnBoYW5hYmxlCit7CisgICAgbXkgKCR0ZXN0bmFtZSkgPSBAXzsKKyAgICBteSAkc3JjOworICAgIG15ICRmaWxlID0gIiRkaXIvJHRlc3RuYW1lLiRleHRlbnNpb24iOworICAgIGlmKCEgLWUgJGZpbGUpeyB0ZXN0X2Vycm9yICgiQ291bGQgbm90IGZpbmQgdGVzdCBmaWxlICRmaWxlXG4iKTt9CisgICAgb3BlbiAoVEVTVCwgIjwkZmlsZSIpIG9yIHRlc3RfZXJyb3IgKCJDb3VsZCBub3Qgb3BlbiB0ZXN0IGZpbGUgJGZpbGVcbiIpOworICAgIHdoaWxlICg8VEVTVD4pIHsgJHNyYyAuPSAkXzsgfQorICAgIGNsb3NlIChURVNUKTsKKyAgICByZXR1cm4gJHNyYyA9fi9vbXB0czpvcnBoYW4vOworfQorCitzdWIgd3JpdGVfcmVzdWx0X2ZpbGVfaGVhZAoreworICAgIG9wZW4gKFJFU1VMVFMsICI+JG9wdF9yZXN1bHRzZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gZmlsZSAnJG9wdF9yZXN1bHRzZmlsZScgdG8gd3JpdGUgcmVzdWx0cy4iLCAxKTsKKyAgICAkcmVzdWx0bGluZSA9IHNwcmludGYgIiUtMjVzICUtc1xuIiwgIiNUZXN0ZWQgRGlyZWN0aXZlIiwgIlx0dFx0Y3RcdG90XHRvY3QiOworICAgIHByaW50IFJFU1VMVFMgJHJlc3VsdGxpbmU7Cit9CisKKyMgRnVuY3Rpb24gd2hpY2ggYWRkcyBhIHJlc3VsdCB0byB0aGUgbGlzdCBvZiByZXN1bHRzCitzdWIgYWRkX3Jlc3VsdAoreworICAgIG15ICgkdGVzdG5hbWUsICRyZXN1bHQpID0gQF87CisjCXByaW50IER1bXBlcihAeyRyZXN1bHR9KTsKKworICAgICRudW1fY29uc3RydWN0cysrOworCisgICAgb3BlbiAoUkVTVUxUUywgIj4+JG9wdF9yZXN1bHRzZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gZmlsZSAnJG9wdF9yZXN1bHRzZmlsZScgdG8gd3JpdGUgcmVzdWx0cy4iLCAxKTsKKworICAgIGlmICgkeyRyZXN1bHR9WzBdWzBdKSB7CisJCSRudW1fdGVzdHMgKys7fQorCisJaWYgKCRvcHRfY29tcGlsZSBhbmQgJHskcmVzdWx0fVswXVsxXSBlcSAwKSB7CisJCSR7JHJlc3VsdH1bMF1bMl17dGVzdH0gICAgICA9ICdjZSc7CisJCSR7JHJlc3VsdH1bMF1bMl17Y3Jvc3N0ZXN0fSA9ICctJzsKKwkJJG51bV9ub3JtYWxfdGVzdHNfY29tcGlsZV9lcnJvcisrOworCSAgICAkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwl9CisKKyAgICBpZiAoJG9wdF9ydW4gYW5kICR7JHJlc3VsdH1bMF1bMl0gYW5kICR7JHJlc3VsdH1bMF1bMl17dGVzdH0gbmUgJ2NlJykgeworICAgICAgICBpZiAoJHskcmVzdWx0fVswXVsyXXt0ZXN0fSA9PSAxMDApIHsKKyAgICAgICAgICAgICRudW1fbm9ybWFsX3Rlc3RzX3N1Y2Nlc3NmdWwrKzsKKyAgICAgICAgICAgIGlmICgkeyRyZXN1bHR9WzBdWzJde2Nyb3NzdGVzdH0gPT0gMTAwKXsKKwkJCQkkbnVtX25vcm1hbF90ZXN0c192ZXJpZmllZCsrO30KKwkJfSBlbHNpZiAoJHskcmVzdWx0fVswXVsyXXt0ZXN0fSBlcSAnVE8nKXsKKwkJCSRudW1fbm9ybWFsX3Rlc3RzX3RpbWVkX291dCsrOworCQkJJG51bV9ub3JtYWxfdGVzdHNfZmFpbGVkKys7CisJCX0gZWxzZSB7CisJCQkkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQrKzsKKwkJfQorICAgIH0KKyAgICAkcmVzdWx0bGluZSA9ICIkeyRyZXN1bHR9WzBdWzJde3Rlc3R9XHQkeyRyZXN1bHR9WzBdWzJde2Nyb3NzdGVzdH1cdCI7CisKKyAgICBpZiAoJHskcmVzdWx0fVsxXVswXSkgeworCQkkbnVtX3Rlc3RzICsrO30KKyAgICBlbHNlIHsgJHJlc3VsdGxpbmUgLj0gIi1cdC1cbiI7IH0KKworICAgIGlmICgkb3B0X2NvbXBpbGUgYW5kICR7JHJlc3VsdH1bMV1bMV0gZXEgMCkgeworCQkkeyRyZXN1bHR9WzFdWzJde3Rlc3R9ICAgICAgPSAnY2UnOworCQkkeyRyZXN1bHR9WzFdWzJde2Nyb3NzdGVzdH0gPSAnLSc7CisJCSRudW1fb3JwaGFuZWRfdGVzdHNfY29tcGlsZV9lcnJvcisrOworCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworCX0KKworICAgIGlmICgkb3B0X3J1biBhbmQgJHskcmVzdWx0fVsxXVsyXSBhbmQgJHskcmVzdWx0fVsxXVsyXXt0ZXN0fSBuZSAnY2UnKSB7CisgICAgICAgIGlmICgkeyRyZXN1bHR9WzFdWzJde3Rlc3R9ID09IDEwMCkgeworICAgICAgICAgICAgJG51bV9vcnBoYW5lZF90ZXN0c19zdWNjZXNzZnVsKys7CisgICAgICAgICAgICBpZiAoJHskcmVzdWx0fVsxXVsyXXtjcm9zc3Rlc3R9ID09IDEwMCl7CisJCQkJJG51bV9vcnBoYW5lZF90ZXN0c192ZXJpZmllZCsrO30KKwkJfSBlbHNpZiAoJHskcmVzdWx0fVsxXVsyXXt0ZXN0fSBlcSAnVE8nKXsKKwkJCSRudW1fb3JwaGFuZWRfdGVzdHNfdGltZWRfb3V0Kys7CisJCQkkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZCsrOworICAgICAgICB9IGVsc2UgeworCQkJJG51bV9vcnBoYW5lZF90ZXN0c19mYWlsZWQrKzsKKwkJfQorICAgIH0KKyAgICAkcmVzdWx0bGluZSAuPSAiJHskcmVzdWx0fVsxXVsyXXt0ZXN0fVx0JHskcmVzdWx0fVsxXVsyXXtjcm9zc3Rlc3R9XG4iOworCisgICAgJG51bV9mYWlsZWRfdGVzdHMgPSAkbnVtX25vcm1hbF90ZXN0c19mYWlsZWQgKyAkbnVtX29ycGhhbmVkX3Rlc3RzX2ZhaWxlZDsKKwkkbnVtX2ZhaWxlZF9jb21waWxhdGlvbiA9ICRudW1fbm9ybWFsX3Rlc3RzX2NvbXBpbGVfZXJyb3IgKyAkbnVtX29ycGhhbmVkX3Rlc3RzX2NvbXBpbGVfZXJyb3I7CisJJG51bV9zdWNjZXNzZnVsX3Rlc3RzID0gJG51bV9ub3JtYWxfdGVzdHNfc3VjY2Vzc2Z1bCArICRudW1fb3JwaGFuZWRfdGVzdHNfc3VjY2Vzc2Z1bDsKKwkkbnVtX3ZlcmlmaWVkX3Rlc3RzID0gJG51bV9ub3JtYWxfdGVzdHNfdmVyaWZpZWQgKyAkbnVtX29ycGhhbmVkX3Rlc3RzX3ZlcmlmaWVkOworCisgICAgJHJlc3VsdGxpbmUyID0gc3ByaW50ZiAiJS0yNXMgJS1zIiwgIiR0ZXN0bmFtZSIsICJcdCRyZXN1bHRsaW5lIjsKKyAgICBwcmludCBSRVNVTFRTICRyZXN1bHRsaW5lMjsKK30KKworIyBGdW5jdGlvbiB3aGljaCBleGVjdXRlcyBhIHNpbmdsZSB0ZXN0CitzdWIgZXhlY3V0ZV9zaW5nbGVfdGVzdAoreworICAgIG15IEByZXN1bHQ7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncyAoJG9wdF9sYW5nKTsKKyAgICBpbml0X2RpcmVjdG9yeV9zdHJ1Y3R1cmUgKCRvcHRfbGFuZyk7CisgICAgbG9nX21lc3NhZ2VfYWRkICgiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIjoiKTsKKyAgICBwcmludCAiVGVzdGluZyBmb3IgXCIkb3B0X3Rlc3RcIjpcbiI7CisjIHRlc3RzIGluIG5vcm1hbCBtb2RlCisgICAgaWYgKCRvcHRfY29tcGlsZSl7ICRyZXN1bHRbMF1bMF0gPSBtYWtlX3NyYyAoJG9wdF90ZXN0LCAwKTsKKyAgICAgICAgICAgICAgICAgICAgICAgJHJlc3VsdFswXVsxXSA9IGNvbXBpbGVfc3JjICgkb3B0X3Rlc3QsIDApO30KKyAgICBpZiAoJG9wdF9ydW4gJiYgJHJlc3VsdFswXVsxXSA9PSAxKSB7CisgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMF1bMl0gPSB7cnVuX3Rlc3QgKCRvcHRfdGVzdCwgMCl9O30KKyMgdGVzdHMgaW4gb3JwaGFuZWQgbW9kZQorICAgIGlmICgkb3B0X29ycGhhbiAmJiB0ZXN0X2lzX29ycGhhbmFibGUoJG9wdF90ZXN0KSl7CisgICAgICAgIGxvZ19tZXNzYWdlX2FkZCAoIlRlc3RpbmcgZm9yIFwiJG9wdF90ZXN0XCIgaW4gb3JwaGFuZWQgbW9kZToiKTsKKyAgICAgICAgcHJpbnQgIisgb3JwaGFuZWQgbW9kZTpcbiI7CisgICAgICAgIGlmICgkb3B0X2NvbXBpbGUpIHsgJHJlc3VsdFsxXVswXSA9IG1ha2Vfc3JjICgkb3B0X3Rlc3QsIDEpOworICAgICAgICAgICAgICAgICAgICAgICAgICAgICRyZXN1bHRbMV1bMV0gPSBjb21waWxlX3NyYyAoJG9wdF90ZXN0LCAxKTt9CisgICAgICAgIGlmICgkb3B0X3J1biAmJiAkcmVzdWx0WzFdWzFdID09IDEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAkcmVzdWx0WzFdWzJdID0ge3J1bl90ZXN0ICgkb3B0X3Rlc3QsIDEpfTt9CisgICAgfQorICAgIGFkZF9yZXN1bHQoJG9wdF90ZXN0LCBcQHJlc3VsdCk7Cit9CisKKyMgRnVuY3Rpb24gdGhhdCBwcmludHMgaW5mbyBhYm91dCBhIGdpdmVuIHRlc3QKK3N1YiBwcmludF90ZXN0aW5mbworeworICAgIGluaXRfbGFuZ3VhZ2Vfc2V0dGluZ3MoJG9wdF9sYW5nKTsKKyAgICBteSAkZG9jID0gIiI7CisgICAgbXkgJGZpbGUgPSAkZGlyLiIvIi4kb3B0X3Rlc3RpbmZvLiIuIi4kZXh0ZW5zaW9uOworICAgIGlmICghIC1lICRmaWxlKSB7ZXJyb3IgKCJDb3VsZCBub3QgZmluZCB0ZW1wbGF0ZSBmb3IgdGVzdCAkb3B0X3Rlc3RpbmZvIiwgNSk7fQorICAgIG9wZW4gKFRFU1QsIjwkZmlsZSIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgZmlsZSBcIiRmaWxlXCIgZm9yIHRlc3QgJG9wdF90ZXN0aW5mbyIsIDYpOworICAgIHdoaWxlICg8VEVTVD4pIHskZG9jIC49ICRfO30KKyAgICBjbG9zZSAoVEVTVCk7CisKKyAgICAobXkgJG9tcF92ZXJzaW9uKSA9IGdldF90YWdfdmFsdWVzICgib21wdHM6b21wdmVyc2lvbiIsICRkb2MpOworICAgIChteSAkZGVwZW5kZW5jZXMpID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czpkZXBlbmRlbmNlcyIsICRkb2MpOworICAgIChteSAkZGVzY3JpcHRpb24pID0gZ2V0X3RhZ192YWx1ZXMgKCJvbXB0czp0ZXN0ZGVzY3JpcHRpb24iLCAkZG9jKTsKKyAgICBteSAkb3JwaGFuYWJsZSA9ICdubyc7CisgICAgaWYgKCRkb2MgPX4gL29tcHRzOm9ycGhhbi8pIHskb3JwaGFuYWJsZSA9ICd5ZXMnO30KKyAgICBwcmludCA8PEVPRjsKK0luZm8gZm9yIHRlc3QgJG9wdF90ZXN0aW5mbzoKK09wZW4gTVAgc3RhbmRhcmQ6ICRvbXBfdmVyc2lvbgorT3JwaGFuZWQgbW9kZTogJG9ycGhhbmFibGUKK0RlcGVuZGVuY2llczogICRkZXBlbmRlbmNlcworRGVzY3JpcHRpb246ICAgJGRlc2NyaXB0aW9uCitFT0YKK30KKworIyBGdW5jdGlvbiB0aGF0IGluaXRpYWxpemVzIHRoZSBzZXR0aW5ncyBmb3IgdGhlIGdpdmVuIGxhbmd1YWdlCitzdWIgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncworeworICAgIG15ICgkbGFuZ3VhZ2UpID0gQF87CisgICAgZm9yZWFjaCBteSAkbGFuZyAoQGxhbmd1YWdlcykgeworICAgICAgICAobXkgJG5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJsYW5ndWFnZW5hbWUiLCAkbGFuZyk7CisgICAgICAgIGlmICgkbmFtZSBlcSAkbGFuZ3VhZ2UpIHsKKyAgICAgICAgICAgICgkZXh0ZW5zaW9uKSA9IGdldF90YWdfdmFsdWVzICgiZmlsZWV4dGVuc2lvbiIsICRsYW5nKTsKKyAgICAgICAgICAgICgkZGlyKSAgICAgICA9IGdldF90YWdfdmFsdWVzICgiZGlyIiwgJGxhbmcpOworICAgICAgICAgICAgKCR0ZW1wbGF0ZXBhcnNlcm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCJ0ZW1wbGF0ZXBhcnNlcm5hbWUiLCAkbGFuZyk7CisgICAgICAgICAgICBsYXN0OworICAgICAgICB9CisgICAgfQorICAgICMgQ2hlY2sgaWYgd2UgZm91bmQgdGhlIHNwZWNpZmllZCBsYW5ndWFnZSBpbiB0aGUgY29uZmlnIGZpbGUKKyAgICBpZiAoISRleHRlbnNpb24gYW5kICEkZGlyKSB7CisgICAgICBlcnJvciAoIkxhbmd1YWdlICRsYW5ndWFnZSBjb3VsZCBub3QgYmUgZm91bmQuXG4iLCAzKTsKKyAgICB9Cit9CisKKworCisjIEZ1bmN0aW9uIHRoYXQgcHJpbnRzIGFsbCBhdmFpbGFibGUgdGVzdHMgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZQorc3ViIHByaW50X2F2YWlsX3Rlc3RzCit7CisgICAgaW5pdF9sYW5ndWFnZV9zZXR0aW5ncygkb3B0X2xhbmcpOworICAgIG15IEB0ZXN0czsKKyAgICBvcGVuZGlyKERJUiwiJGRpciIpIG9yIGVycm9yICgiQ291bGQgbm90IG9wZW4gZGlyZWN0b3J5ICRkaXIiLCA0KTsKKyAgICB3aGlsZSgkXyA9IHJlYWRkaXIoRElSKSkgeyBpZiAoL1wuJGV4dGVuc2lvbiQvKSB7cy9cLiRleHRlbnNpb24vLzsgcHVzaCAoQHRlc3RzLCAkXyk7fX0KKyAgICBjbG9zZWRpcihESVIpOworICAgIHByaW50ICJGb3VuZCAiLihAdGVzdHMpLiIgdGVzdHM6XG4iLiAiLSIgeCAzMCAuICJcbiI7CisgICAgZm9yZWFjaCAoQHRlc3RzKSB7IHByaW50ICRfLiJcbiI7fQorfQorCisjIEZ1bmN0aW9uIHRoYXQgcHJpbnRzIGFsbCBhdmFpbGFibGUgdGVzdHMgZm9yIHRoZSBnaXZlbiBsYW5ndWFnZQorc3ViIHByaW50X2F2YWlsX2xhbmdzCit7CisgICAgaWYgKEBsYW5ndWFnZXMgPiAwKSB7CisgICAgICAgIHByaW50ICJBdmFpbGFibGUgbGFuZ3VhZ2VzOlxuIjsKKyAgICAgICAgZm9yZWFjaCAoQGxhbmd1YWdlcykgeworICAgICAgICAgICAgKG15ICRuYW1lKSA9IGdldF90YWdfdmFsdWVzICgibGFuZ3VhZ2VuYW1lIiwgJF8pOworICAgICAgICAgICAgcHJpbnQgIiRuYW1lXG4iOworICAgICAgICB9CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnQgIk5vIGxhbmd1YWdlcyBhdmFpbGFibGVcbiI7CisgICAgfQorfQorCisjIEZ1bmN0aW9uIHRoYXQgcHJpbnRzIHRoZSBlcnJvciBtZXNzYWdlCitzdWIgcHJpbnRfaGVscF90ZXh0Cit7CisgICAgcHJpbnQgPDxFT0Y7CitydW50ZXN0LnBsIFtvcHRpb25zXSBbRklMRV0KKworRXhlY3V0ZXMgdGhlIHRlc3RzIGxpc3RlZCBpbiBGSUxFLiBGSUxFIGhhcyB0byBjb250YWluIHRoZSBuYW1lcyBvZiB0aGUgdGVzdHMsCitvbmUgdGVzdCBwZXIgbGluZS4gTGluZXMgc3RhcnRpbmcgd2l0aCAnIycgd2lsbCBiZSBpZ25vcmVkLgorQSBsYW5ndWFnZSBoYXMgdG8gYmUgc3BlY2lmaWVkIGZvciBhbGwgY29tbWFuZHMgZXhjZXB0IC0taGVscCBhbmQgLS1saXN0bGFuZ3VhZ2VzLgorCitPcHRpb25zOgorICAtLWhlbHAgICAgICAgICAgICBkaXNwbGF5cyB0aGlzIGhlbHAgbWVzc2FnZQorICAtLWxpc3RsYW5ndWFnZXMgICBsaXN0cyBhbGwgYXZhaWxhYmxlIGxhbmd1YWdlcworICAtLWxhbmc9cyAgICAgICAgICBzZWxlY3QgbGFuZ3VhZ2UKKyAgLS1saXN0ICAgICAgICAgICAgbGlzdCBhdmFpbGFibGUgdGVzdHMgZm9yIGEgbGFuZ3VhZ2UKKyAgLS10ZXN0aW5mbz1OQU1FICAgc2hvdyBpbmZvIGZvciB0ZXN0IE5BTUUKKyAgLS1udW10aHJlYWRzPU5VTSAgc2V0IG51bWJlciBvZiB0aHJlYWRzIChvdmVyd3JpdGVzIGNvbmZpZyBmaWxlIHNldHRpbmdzKQorICAtLXRlc3Q9TkFNRSAgICAgICBleGVjdXRlIHNpbmdsZSB0ZXN0IE5BTUUKKyAgLS1ub2NvbXBpbGUgICAgICAgZG8gbm90IGNvbXBpbGUgdGVzdHMKKyAgLS1ub3J1biAgICAgICAgICAgZG8gbm90IHJ1biB0ZXN0cworICAtLW5vb3JwaGFuICAgICAgICBzd2l0Y2ggb2Ygb3JwaGFuZWQgdGVzdHMKKyAgLS1yZXN1bHRmaWxlPU5BTUUgdXNlIE5BTUUgYXMgcmVzdWx0ZmlsZSAob3ZlcndyaXRlcyBjb25maWcgZmlsZSBzZXR0aW5ncykKK0VPRgorfQorCisjIEZ1bmN0aW9uIHRoYXQgd3JpdGVzIGFuIGVycm9yIG1lc3NhZ2UgZm9yIGEgZmFpbGVkIHRlc3QgLyBwYXJ0IG9mIGEgdGVzdAorc3ViIHRlc3RfZXJyb3IKK3sKKyAgIG15ICgkbWVzc2FnZSkgPSBAXzsKKyAgIGxvZ19tZXNzYWdlX2FkZCAoIkVSUk9SOiAkbWVzc2FnZSIpOworICAgaWYgKCRkaXNwbGF5X2Vycm9ycyBlcSAxKSB7IHByaW50IFNUREVSUiAiRVJST1I6ICRtZXNzYWdlXG4iOyB9Cit9CisKKyMgRnVuY3Rpb24gdGhhdCByZXR1cm5zIGFuIHdhcm5pbmcgbWVzc2FnZQorc3ViIHdhcm5pbmcgeworICBteSAoJG1lc3NhZ2UpID0gQF87CisgIGlmICgkZGlzcGxheV93YXJuaW5ncyBlcSAxKSB7IHByaW50ICJXYXJuaW9uZzogJG1lc3NhZ2VcbiI7IH0KKyAgbG9nX21lc3NhZ2VfYWRkICgiV2FybmluZzogJG1lc3NhZ2UiKTsKK30KKworIyBGdW5jdGlvbiB0aGF0IHJldHVybnMgYW4gZXJyb3IgbWVzc2FnZSBhbmQgZXhpdHMgd2l0aCB0aGUgc3BlY2lmaWVkIGVycm9yIGNvZGUKK3N1YiBlcnJvciB7CisgIG15ICgkbWVzc2FnZSwgJGVycm9yX2NvZGUpID0gQF87CisgIGlmICgkZGlzcGxheV9lcnJvcnMgZXEgMSkgeyBwcmludCBTVERFUlIgIkVSUk9SOiAkbWVzc2FnZVxuIjsgfQorICBsb2dfbWVzc2FnZV9hZGQgKCJFUlJPUjogJG1lc3NhZ2UiKTsKKyAgZXhpdCAoJGVycm9yX2NvZGUpOworfQorCisjIEZ1bmN0aW9uIHdoaWNoIGFkZHMgYW4gbmV3IGVudHJ5IGludG8gdGhlIGxvZ2ZpbGUgdG9nZXRoZXIgd2l0aCBhIHRpbWVzdGFtcAorc3ViIGxvZ19tZXNzYWdlX2FkZAoreworICAgIChteSAkbWVzc2FnZSkgPSBAXzsKKyAgICAoJHNlYywkbWluLCRob3VyLCRtZGF5LCRtb24sJHllYXIsJHdkYXksJHlkYXQsJGlzZHN0KSA9IGxvY2FsdGltZSgpOworICAgIGlmKGxlbmd0aCgkaG91cikgPT0gMSkgeyAkaG91cj0iMCRob3VyIjsgfQorICAgIGlmKGxlbmd0aCgkbWluKSA9PSAxKSAgeyAkbWluPSIwJG1pbiI7ICAgfQorICAgIGlmKGxlbmd0aCgkc2VjKSA9PSAxKSAgeyAkc2VjPSIwJHNlYyI7ICAgfQorICAgICRtb249JG1vbisxOworICAgICR5ZWFyPSR5ZWFyKzE5MDA7CisgICAgb3BlbiAoTE9HRklMRSwiPj4kbG9nZmlsZSIpIG9yIGRpZSAiRVJST1I6IENvdWxkIG5vdCBjcmVhdGUgJGxvZ2ZpbGVcbiI7CisgICAgcHJpbnQgTE9HRklMRSAiJG1kYXkvJG1vbi8keWVhciAkaG91ci4kbWluLiRzZWM6ICRtZXNzYWdlXG4iOworfQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfYy5wbCBiL3JjMy90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwKbmV3IGZpbGUgbW9kZSAxMDA3NTUKaW5kZXggMDAwMDAwMC4uM2Q2ZjM0NgotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvdGVtcGxhdGVfcGFyc2VyX2MucGwKQEAgLTAsMCArMSwxMTQgQEAKKyMhL3Vzci9iaW4vZW52IHBlcmwKKworIyBvbXB0c19wYXJzZXIgW29wdGlvbl0gSU5GSUxFIE9VVEZJTEUKKyMgCisjIENyZWF0cyB0aGUgdGVzdHMgYW5kIHRoZSBjcm9zc3Rlc3RzIGZvciB0aGUgT3Blbk1QLVRlc3RzdWl0ZSBvdXQgb2YgYW4gdGVtcGxhdGVmaWxlcyB3aGljaCBhcmUgZ2l2ZW4gdG8gdGhlIHByb2dyYW1tLgorIyAKKyMgT3B0aW9uczoKKyMgLS10ZXN0OiAJbWFrZSB0ZXN0CisjIC0tY3Jvc3N0ZXN0OiAJbWFrZSBjcm9zc3Rlc3QKKyMgLS1vcnBoYW4JaWYgcG9zc2libGUgZ2VuZXJhdGUgdGVzdHMgdXNpbmcgb3JwaGFuIAorIworIyBSZXR1cm46CisjICAgICAgIFN1Y2NlczogICAgICAgICAgICAgICAgIDAKKyMgICAgICAgVGVtcGxhdGUgbm90IGZvdW5kICAgICAgLTEKKyMKKworIyBVc2luZyBHZXRvcHQ6OmxvbmcgdG8gZXh0cmFjdCB0aGUgcHJvZ3JhbW0gb3B0aW9ucwordXNlIEdldG9wdDo6TG9uZzsKKyMgVXNpbmcgZnVuY3Rpb25zOiBTZXQgb2Ygc3Vicm91dGluZXMgdG8gbW9kaWZ5IHRoZSB0ZXN0Y29kZQordXNlIG9tcHRzX3BhcnNlckZ1bmN0aW9uczsKKworIyBHZXR0aW5nIGdpdmVuIG9wdGlvbnMKK0dldE9wdGlvbnMoInRlc3QiID0+IFwkdGVzdCwiY3Jvc3N0ZXN0IiA9PiBcJGNyb3NzdGVzdCwgIm9ycGhhbiEiID0+IFwkb3JwaGFuKTsKKworIyBSZW1haW5pbmcgYXJndW1lbnRzIGFyZSB0aGUgdGVtcGxhdGVmaWxlcy4gCisjIEFkZGluZyB0aGVzZSB0byB0aGUgbGlzdCBvZiB0byBiZSBwYXJzZWQgZmlsZXMgaWYgdGhleSBleGlzdC4KKworbXkgJHRlbXBsYXRlZmlsZTsKK215ICRzb3VyY2VmaWxlOworbXkgJG1haW5wcm9jc3JjID0gIm9tcHRzX3N0YW5kYWxvbmVQcm9jLmMiOyAKKworJHRlbXBsYXRlZmlsZSA9ICRBUkdWWzBdOworJG91dGZpbGUgPSAkQVJHVlsxXTsKKworaWYgKCEtZSAkdGVtcGxhdGVmaWxlKSB7CisgICAgcHJpbnQgIlRlbWFwbHRlIGZpbGUgbm90IGZvdW5kIjsKKyAgICBleGl0IC0xOworfQorCisJCisjIENoZWNraW5nIGlmIG9wdGlvbnMgd2VyZSB2YWxpZDoKKyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjCisjIHByZXBhcmF0aW9ucyBhbmQgY2hlY2tzIGZvciBzb3VyY2VmaWxlcworCisjIFJlYWRpbmcgdGhlIHRlbXBsYXRlIGZvciB0aGUgdGVzdHMgCitvcGVuKFRFU1QsJHRlbXBsYXRlZmlsZSkgb3IgZGllICJFcnJvcjogQ291bGQgbm90IG9wZW4gdGVtcGxhdGUgJHNyY2ZpbGVcbiI7Cit3aGlsZSg8VEVTVD4peyAkc3JjIC49ICRfOyB9CitjbG9zZShURVNUKTsKKworIyBFeHRyYWN0aW5nIHRoZSBzb3VyY2UgZm9yIHRoZSBtYWlucHJvZ3JhbW0gYW5kIHNhdmluZyBpdCBpbiAkbWFpbnByb2NzcmMKK29wZW4oTUFJTlBST0MsJG1haW5wcm9jc3JjKSBvciBkaWUgIkNvdWxkIG5vdCBvcGVuIHRoZSBzb3VyY2VmaWxlIGZvciB0aGUgbWFpbiBwcm9ncmFtICRtYWlucHJvY3NyYyI7Cit3aGlsZSg8TUFJTlBST0M+KXsgJG1haW5wcm9jIC49ICRfOyB9CitjbG9zZSAoTUFJTlBST0MpOworCisjIFNvbWUgdGVtcG9yYXJ5IHRlc3RpbmZvcm1hdGlvbjoKK215ICgkZGVzY3JpcHRpb24pICA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6dGVzdGRlc2NyaXB0aW9uJywkc3JjKTsKK215ICgkZGlyZWN0aXZlKSAgICA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6ZGlyZWN0aXZlJywkc3JjKTsKK215ICgkZnVuY3Rpb25uYW1lKSA9IGdldF90YWdfdmFsdWVzICgnb21wdHM6dGVzdGNvZGU6ZnVuY3Rpb25uYW1lJywkc3JjKTsKKworb3BlbiAoT1VURklMRSwiPiRvdXRmaWxlIikgb3IgZGllICJDb3VsZCBub3QgY3JlYXRlIHRoZSBvdXRwdXQgZmlsZSBmb3IgJGRpcmVjdGl2ZSI7CisKKyMgQ3JlYXRpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIHRlc3Q6CitteSAoJGNvZGUpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOnRlc3Rjb2RlJywkc3JjKTsKKyMgUHV0dGluZyB0b2dldGhlciB0aGUgZnVuY3Rpb25zIGFuZCB0aGUgbWFpbnByb2dyYW1tOgorJGNvZGUgLj0gJG1haW5wcm9jOworCitteSAkdGVzdHByZWZpeCA9ICIiOworCisjIE1ha2UgbW9kaWZpY2F0aW9ucyBmb3IgdGhlIG9ycGhhbmVkIHRlc3R2ZXJzaW9uIGlmIG5lY2Vzc2FyeToKK2lmICgkb3JwaGFuKSB7CisjIEdldCB0aGUgZ2xvYmFsIHZhcmlhYmxlczoKKyAgICBAZGVmcyA9IGdldF90YWdfdmFsdWVzKCJvbXB0czpvcnBoYW46dmFycyIsJGNvZGUpOworICAgICRvcnBodmFyc2RlZiA9ICIiOworICAgIGZvcmVhY2ggKEBkZWZzKSB7CisgICAgICAgICRvcnBodmFyc2RlZiA9IGpvaW4oIlxuIiwkb3JwaHZhcnNkZWYsJF8pOyAKKyAgICB9CisjIEdlbmVyYXRlIHByZWRlY2xhcmF0aW9ucyBmb3Igb3JwYWhuIGZ1bmN0aW9uczoKKyAgICAkb3JwaGZ1bmNzZGVmcyA9IG9ycGhfZnVuY3Rpb25zX2RlY2xhcmF0aW9ucygkY29kZSk7CisjIEdlbmVyYXRlIHRoZSBvcnBoYW4gZnVuY3Rpb25zOgorICAgICRvcnBoZnVuY3MgPSBjcmVhdGVfb3JwaF9jZnVuY3Rpb25zKCRjb2RlKTsKKyMgUmVwbGE6ZSBvcnBoYW4gcmVnaW9ucyBieSBmdW5jdGlvbmNhbGxzOgorICAgICRjb2RlID0gb3JwaGFuX3JlZ2lvbnMyY2Z1bmN0aW9ucygkY29kZSk7CisjIERlbGV0aW5nIHRoZSBmb3JtZXIgZGVjbGFyYXRpb25zIG9mIHRoZSB2YXJpYWJsZXMgaW4gdGhlIG9ycGhhbiByZWdpb25zOgorICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCgkY29kZSkpOworIyBQdXQgYWxsIHRvZ2V0aGVyOgorICAgICRjb2RlID0gIiNpbmNsdWRlIFwib21wX3Rlc3RzdWl0ZS5oXCJcbiIgLiAkb3JwaHZhcnNkZWYgLiAkb3JwaGZ1bmNzZGVmcyAuICRjb2RlIC4gJG9ycGhmdW5jczsKKyAgICAkdGVzdHByZWZpeCAuPSAib3JwaF8iOworfQorCisjIFJlbW92ZSByZW1haW5pbmcgbWFya3MgZm9yIHRoZSBvcnBhaG4gcmVnaW9ucyBhbmQgaXRzIHZhcmlhYmxlczoKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbicsJycsJycsKCRjb2RlKSk7CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisKK2lmKCR0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSB0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKKyAgICAkdGVzdHByZWZpeCAuPSAidGVzdF8iOworfQorZWxzaWYoJGNyb3NzdGVzdCkgeworIyBSZW1vdmUgdGhlIG1hcmtzIGZvciB0aGUgY3Jvc3N0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgdGVzdHM6IAorICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOmNyb3NzY2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y2hlY2snLCgkY29kZSkpOwkJCisgICAgJHRlc3RwcmVmaXggLj0gImN0ZXN0XyI7Cit9CisjIE1ha2luZyBzb21lIGZpbmFsIG1vZGlmaWNhdGlvbnM6CisoJGNvZGUpID0gcmVwbGFjZV90YWdzKCd0ZXN0ZnVuY3Rpb25uYW1lJywkdGVzdHByZWZpeC4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGlyZWN0aXZlJywkZGlyZWN0aXZlLCgkY29kZSkpOworKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGVzY3JpcHRpb24nLCRkZXNjcmlwdGlvbiwoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsJHRlc3RwcmVmaXgsJycsKCRjb2RlKSApOworIwkkY29kZSA9ICAiXCNpbmNsdWRlIFwib21wX3Rlc3RzdWl0ZS5oXCJcbiIuJGNvZGU7CisjIFdyaXRlIHRoZSByZXN1bHQgaW50byB0aGUgZmlsZSBhbmQgY2xvc2UgaXQ6CitwcmludCBPVVRGSUxFICRjb2RlOworY2xvc2UoT1VURklMRSk7CmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL3RlbXBsYXRlX3BhcnNlcl9mb3J0cmFuLnBsIGIvcmMzL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbApuZXcgZmlsZSBtb2RlIDEwMDc1NQppbmRleCAwMDAwMDAwLi41NzBhNGUwCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3Rlc3RzdWl0ZS90ZW1wbGF0ZV9wYXJzZXJfZm9ydHJhbi5wbApAQCAtMCwwICsxLDExNSBAQAorIyEvdXNyL2Jpbi9lbnYgcGVybAorCisjIG9tcHRzX3BhcnNlciBbb3B0aW9uXSBJTkZJTEUgT1VURklMRQorIyAKKyMgQ3JlYXRzIHRoZSB0ZXN0cyBhbmQgdGhlIGNyb3NzdGVzdHMgZm9yIHRoZSBPcGVuTVAtVGVzdHN1aXRlIG91dCBvZiBhbiB0ZW1wbGF0ZWZpbGVzIHdoaWNoIGFyZSBnaXZlbiB0byB0aGUgcHJvZ3JhbW0uCisjIAorIyBPcHRpb25zOgorIyAtLXRlc3Q6IAltYWtlIHRlc3QKKyMgLS1jcm9zc3Rlc3Q6IAltYWtlIGNyb3NzdGVzdAorIyAtLW9ycGhhbglpZiBwb3NzaWJsZSBnZW5lcmF0ZSB0ZXN0cyB1c2luZyBvcnBoYW4gCisjCisjIFJldHVybjoKKyMgICAgICAgU3VjY2VzOiAgICAgICAgICAgICAgICAgMAorIyAgICAgICBUZW1wbGF0ZSBub3QgZm91bmQgICAgICAtMQorIworCisjIFVzaW5nIEdldG9wdDo6bG9uZyB0byBleHRyYWN0IHRoZSBwcm9ncmFtbSBvcHRpb25zCit1c2UgR2V0b3B0OjpMb25nOworIyBVc2luZyBmdW5jdGlvbnM6IFNldCBvZiBzdWJyb3V0aW5lcyB0byBtb2RpZnkgdGhlIHRlc3Rjb2RlCit1c2Ugb21wdHNfcGFyc2VyRnVuY3Rpb25zOworCisjIEdldHRpbmcgZ2l2ZW4gb3B0aW9ucworR2V0T3B0aW9ucygidGVzdCIgPT4gXCR0ZXN0LCJjcm9zc3Rlc3QiID0+IFwkY3Jvc3N0ZXN0LCAib3JwaGFuISIgPT4gXCRvcnBoYW4pOworCisjIFJlbWFpbmluZyBhcmd1bWVudHMgYXJlIHRoZSB0ZW1wbGF0ZWZpbGVzLiAKKyMgQWRkaW5nIHRoZXNlIHRvIHRoZSBsaXN0IG9mIHRvIGJlIHBhcnNlZCBmaWxlcyBpZiB0aGV5IGV4aXN0LgorCitteSAkdGVtcGxhdGVmaWxlOworbXkgJHNvdXJjZWZpbGU7CitteSAkbWFpbnByb2NzcmMgPSAib21wdHNfc3RhbmRhbG9uZVByb2MuZiI7IAorCiskdGVtcGxhdGVmaWxlID0gJEFSR1ZbMF07Ciskb3V0ZmlsZSA9ICRBUkdWWzFdOworCitpZiAoIS1lICR0ZW1wbGF0ZWZpbGUpIHsKKyAgICBwcmludCAiVGVtYXBsdGUgZmlsZSBub3QgZm91bmQiOworICAgIGV4aXQgLTE7Cit9CisKKwkKKyMgQ2hlY2tpbmcgaWYgb3B0aW9ucyB3ZXJlIHZhbGlkOgorIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKKyMgcHJlcGFyYXRpb25zIGFuZCBjaGVja3MgZm9yIHNvdXJjZWZpbGVzCisKKyMgUmVhZGluZyB0aGUgdGVtcGxhdGUgZm9yIHRoZSB0ZXN0cyAKK29wZW4oVEVTVCwkdGVtcGxhdGVmaWxlKSBvciBkaWUgIkVycm9yOiBDb3VsZCBub3Qgb3BlbiB0ZW1wbGF0ZSAkc3JjZmlsZVxuIjsKK3doaWxlKDxURVNUPil7ICRzcmMgLj0gJF87IH0KK2Nsb3NlKFRFU1QpOworCisjIEV4dHJhY3RpbmcgdGhlIHNvdXJjZSBmb3IgdGhlIG1haW5wcm9ncmFtbSBhbmQgc2F2aW5nIGl0IGluICRtYWlucHJvY3NyYworb3BlbihNQUlOUFJPQywkbWFpbnByb2NzcmMpIG9yIGRpZSAiQ291bGQgbm90IG9wZW4gdGhlIHNvdXJjZWZpbGUgZm9yIHRoZSBtYWluIHByb2dyYW0gJG1haW5wcm9jc3JjIjsKK3doaWxlKDxNQUlOUFJPQz4peyAkbWFpbnByb2MgLj0gJF87IH0KK2Nsb3NlIChNQUlOUFJPQyk7CisKKyMgU29tZSB0ZW1wb3JhcnkgdGVzdGluZm9ybWF0aW9uOgorKCRkZXNjcmlwdGlvbikgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0ZGVzY3JpcHRpb24nLCRzcmMpOworKCRkaXJlY3RpdmUpICAgID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czpkaXJlY3RpdmUnLCRzcmMpOworKCRmdW5jdGlvbm5hbWUpID0gZ2V0X3RhZ192YWx1ZXMgKCdvbXB0czp0ZXN0Y29kZTpmdW5jdGlvbm5hbWUnLCRzcmMpOworCitvcGVuIChPVVRGSUxFLCI+JG91dGZpbGUiKSBvciBkaWUgIkNvdWxkIG5vdCBjcmVhdGUgdGhlIG91dHB1dCBmaWxlIGZvciAkZGlyZWN0aXZlIjsKKworIyBDcmVhdGluZyB0aGUgc291cmNlIGZvciB0aGUgdGVzdDoKKygkY29kZSkgPSBnZXRfdGFnX3ZhbHVlcygnb21wdHM6dGVzdGNvZGUnLCRzcmMpOworIyBQdXR0aW5nIHRvZ2V0aGVyIHRoZSBmdW5jdGlvbnMgYW5kIHRoZSBtYWlucHJvZ3JhbW06CiskY29kZSAuPSAkbWFpbnByb2M7CisKKyN0aGFua3MgdG8gRHIuIFlpbiBNYSBpbiBBYnNvZnQsIGdldCB0aGUgcGFyYW1ldGVycyA8b21wdHM6b3JwaGFuOnBhcmFtcz4gYnkgam9vbgorICgkcGFybXMpID0gZ2V0X3RhZ192YWx1ZXMoJ29tcHRzOm9ycGhhbjpwYXJtcycsKCRjb2RlKSk7CisgKCRwYXJtcykgPSBsZWF2ZV9zaW5nbGVfc3BhY2UoJHBhcm1zKTsKKyAoJGNvZGUpID0gcmVwbGFjZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCRjb2RlKTsKKworIyBNYWtlIG1vZGlmaWNhdGlvbnMgZm9yIHRoZSBvcnBoYW5lZCB0ZXN0dmVyc2lvbiBpZiBuZWNlc3Nhcnk6CitpZiAoJG9ycGhhbikgeworIyBHZXQgdGhlIGdsb2JhbCB2YXJpYWJsZXM6CisgICAgQGRlZnMgPSBnZXRfdGFnX3ZhbHVlcygib21wdHM6b3JwaGFuOnZhcnMiLCRjb2RlKTsKKyAgICAkb3JwaHZhcnNkZWYgPSAiIjsKKyAgICBmb3JlYWNoIChAZGVmcykgeworICAgICAgICBpZiAobm90IC9eWyBdKiQvZ3MpIHsgJG9ycGh2YXJzZGVmID0gam9pbigiXG4iLCRvcnBodmFyc2RlZiwkXyk7IH0gCisgICAgfQorIyBHZW5lcmF0ZSB0aGUgb3JwaGFuIHN1YnJvdXRpbmVzOgorICAgICAgICAkb3JwaGZ1bmNzID0gY3JlYXRlX29ycGhfZm9ydHJhbmZ1bmN0aW9ucyAoIiIsICgkY29kZSksKCRwYXJtcykpOworIyBSZXBsYWNlIG9ycGhhbiByZWdpb25zIGJ5IGZ1bmN0aW9uY2FsbHM6CisgICAgICAgICgkY29kZSkgPSBvcnBoYW5fcmVnaW9uczJmb3J0cmFuZnVuY3Rpb25zICgiIiwgKCRjb2RlKSwoJHBhcm1zKSk7CisgICAgICAgICgkY29kZSkgPSBlbmxhcmdlX3RhZ3MgKCdvbXB0czpvcnBoYW46dmFycycsJycsJycsKCRjb2RlKSk7CisjIHRvIGZpbmQgb3JwaGFuIGNhbGwgc3RhdGVtZW50IGFuZCBhZGQgcGFyYW1ldGVycywgYnkgam9vbgorICAgICAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW46cGFybXMnLCcnLCcnLCgkY29kZSkpOworIyBQdXQgYWxsIHRvZ2V0aGVyOgorICAgICAgICAkY29kZSA9ICRjb2RlIC4gJG9ycGhmdW5jczsKK30KKworIyBSZW1vdmUgcmVtYWluaW5nIG1hcmtzIGZvciB0aGUgb3JwYWhuIHJlZ2lvbnMgYW5kIGl0cyB2YXJpYWJsZXM6CisoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpvcnBoYW4nLCcnLCcnLCgkY29kZSkpOworKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6b3JwaGFuOnZhcnMnLCcnLCcnLCgkY29kZSkpOworIyByZW1vdmUgcGFyYW1ldGVycyBiZXR3ZWVuIGZvciBvcnBoYW5lZCBkaXJlY3RpdmUgcGFyYW1ldGVzLCBhZGRlZCBieWpvb24KKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOm9ycGhhbjpwYXJtcycsJycsJycsKCRjb2RlKSk7CisKK2lmKCR0ZXN0KSB7CisjIFJlbW92ZSB0aGUgbWFya3MgZm9yIHRoZSB0ZXN0Y29kZSBhbmQgcmVtb3ZlIHRoZSBjb2RlIGZvciB0aGUgY3Jvc3N0ZXN0czogCisgICAgKCRjb2RlKSA9IGVubGFyZ2VfdGFncygnb21wdHM6Y2hlY2snLCcnLCcnLCgkY29kZSkpOworICAgICgkY29kZSkgPSBkZWxldGVfdGFncygnb21wdHM6Y3Jvc3NjaGVjaycsKCRjb2RlKSk7CQkKK30KK2Vsc2lmKCRjcm9zc3Rlc3QpIHsKKyMgUmVtb3ZlIHRoZSBtYXJrcyBmb3IgdGhlIGNyb3NzdGVzdGNvZGUgYW5kIHJlbW92ZSB0aGUgY29kZSBmb3IgdGhlIHRlc3RzOiAKKyAgICAoJGNvZGUpID0gZW5sYXJnZV90YWdzKCdvbXB0czpjcm9zc2NoZWNrJywnJywnJywoJGNvZGUpKTsKKyAgICAoJGNvZGUpID0gZGVsZXRlX3RhZ3MoJ29tcHRzOmNoZWNrJywoJGNvZGUpKTsJCQorfQorIyBNYWtpbmcgc29tZSBmaW5hbCBtb2RpZmljYXRpb25zOgorKCRjb2RlKSA9IHJlcGxhY2VfdGFncygndGVzdGZ1bmN0aW9ubmFtZScsInRlc3RfIi4kZnVuY3Rpb25uYW1lLCgkY29kZSkpOworKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGlyZWN0aXZlJywkZGlyZWN0aXZlLCgkY29kZSkpOworKCRjb2RlKSA9IHJlcGxhY2VfdGFncygnZGVzY3JpcHRpb24nLCRkZXNjcmlwdGlvbiwoJGNvZGUpKTsKKygkY29kZSkgPSBlbmxhcmdlX3RhZ3MoJ29tcHRzOnRlc3Rjb2RlOmZ1bmN0aW9ubmFtZScsInRlc3RfIiwnJywoJGNvZGUpICk7CisjCSRjb2RlID0gICJcI2luY2x1ZGUgXCJvbXBfdGVzdHN1aXRlLmhcIlxuIi4kY29kZTsKKyMgV3JpdGUgdGhlIHJlc3VsdCBpbnRvIHRoZSBmaWxlIGFuZCBjbG9zZSBpdDoKK3ByaW50IE9VVEZJTEUgJGNvZGU7CitjbG9zZShPVVRGSUxFKTsKZGlmZiAtLWdpdCBhL3JjMy90ZXN0c3VpdGUvdGVzdGxpc3QtYy50eHQgYi9yYzMvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjgxM2EyMTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL3Rlc3RsaXN0LWMudHh0CkBAIC0wLDAgKzEsNjggQEAKKyMgTGlzdCBjb250YWluaW5nIHRoZSB0ZXN0cyBvZiB0aGUgT3Blbk1QVmFsaWRhaW9uIFN1aXRlIGF2YWlsYWJsZSB0byBjaGVjaworIyB0aGUgYyBpbXBsZW1lbnRhdGlvbi4KK2hhc19vcGVubXAKK29tcF9hdG9taWMKK29tcF9iYXJyaWVyCitvbXBfY3JpdGljYWwKK29tcF9mbHVzaAorb21wX2Zvcl9maXJzdHByaXZhdGUKK29tcF9mb3JfbGFzdHByaXZhdGUKK29tcF9mb3Jfb3JkZXJlZAorb21wX2Zvcl9wcml2YXRlCitvbXBfZm9yX3JlZHVjdGlvbgorb21wX2Zvcl9zY2hlZHVsZV9keW5hbWljCitvbXBfZm9yX3NjaGVkdWxlX2d1aWRlZAorb21wX2Zvcl9zY2hlZHVsZV9zdGF0aWMKK29tcF9mb3Jfbm93YWl0CitvbXBfZ2V0X251bV90aHJlYWRzCitvbXBfZ2V0X3d0aWNrCitvbXBfZ2V0X3d0aW1lCitvbXBfaW5fcGFyYWxsZWwKK29tcF9sb2NrCitvbXBfbWFzdGVyCitvbXBfbmVzdF9sb2NrCitvbXBfcGFyYWxsZWxfY29weWluCitvbXBfcGFyYWxsZWxfZm9yX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9sYXN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX2Zvcl9vcmRlcmVkCitvbXBfcGFyYWxsZWxfZm9yX3ByaXZhdGUKK29tcF9wYXJhbGxlbF9mb3JfcmVkdWN0aW9uCitvbXBfcGFyYWxsZWxfbnVtX3RocmVhZHMKK29tcF9wYXJhbGxlbF9zZWN0aW9uc19maXJzdHByaXZhdGUKK29tcF9wYXJhbGxlbF9zZWN0aW9uc19sYXN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX3NlY3Rpb25zX3ByaXZhdGUKK29tcF9wYXJhbGxlbF9zZWN0aW9uc19yZWR1Y3Rpb24KK29tcF9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorb21wX3NlY3Rpb25fbGFzdHByaXZhdGUKK29tcF9zZWN0aW9uX3ByaXZhdGUKK29tcF9zZWN0aW9uc19yZWR1Y3Rpb24KK29tcF9zZWN0aW9uc19ub3dhaXQKK29tcF9wYXJhbGxlbF9mb3JfaWYKK29tcF9zaW5nbGVfY29weXByaXZhdGUKK29tcF9zaW5nbGVfbm93YWl0CitvbXBfc2luZ2xlX3ByaXZhdGUKK29tcF9zaW5nbGUKK29tcF90ZXN0X2xvY2sKK29tcF90ZXN0X25lc3RfbG9jaworb21wX3RocmVhZHByaXZhdGUKK29tcF9wYXJhbGxlbF9kZWZhdWx0CitvbXBfcGFyYWxsZWxfc2hhcmVkCitvbXBfcGFyYWxsZWxfcHJpdmF0ZQorb21wX3BhcmFsbGVsX2ZpcnN0cHJpdmF0ZQorb21wX3BhcmFsbGVsX2lmCitvbXBfcGFyYWxsZWxfcmVkdWN0aW9uCisKKyMgTmV3IHRlc3RzIGZvciBPcGVuTVAgMy4wCitvbXBfZm9yX2NvbGxhcHNlCitvbXBfbWFzdGVyXzMKK29tcF90YXNrCitvbXBfdGFza19pZgorb21wX3Rhc2tfdW50aWVkCitvbXBfdGFza19zaGFyZWQKK29tcF90YXNrX3ByaXZhdGUKK29tcF90YXNrX2ZpcnN0cHJpdmF0ZQorb21wX3Rhc2t3YWl0CisKKyMgTmV3IHRlc3RzIGZvciBPcGVuTVAgMy4xCitvbXBfdGFza3lpZWxkCitvbXBfdGFza19maW5hbApkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS90ZXN0bGlzdC1mLnR4dCBiL3JjMy90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uNTUzODlhNQotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvdGVzdGxpc3QtZi50eHQKQEAgLTAsMCArMSw2MyBAQAorIyBMaXN0IGNvbnRhaW5pbmcgdGhlIHRlc3RzIG9mIHRoZSBPcGVuTVBWYWxpZGFpb24gU3VpdGUgYXZhaWxhYmxlIHRvIGNoZWNrCisjIHRoZSBmb3J0YW4gaW1wbGVtZW50YXRpb24uCitkb19maXJzdHByaXZhdGUKK2RvX2xhc3Rwcml2YXRlCitkb19vcmRlcmVkCitkb19wcml2YXRlCitkb19yZWR1Y3Rpb24KK2RvX3NjaGVkdWxlX2R5bmFtaWMKK2RvX3NjaGVkdWxlX2d1aWRlZAorZG9fc2NoZWR1bGVfc3RhdGljCitoYXNfb3Blbm1wCitvbXBfYXRvbWljCitvbXBfYmFycmllcgorb21wX2NvcHlpbgorb21wX2NyaXRpY2FsCitvbXBfZmx1c2gKK29tcF9nZXRfbnVtX3RocmVhZHMKK29tcF9pbl9wYXJhbGxlbAorb21wX2xvY2sKK29tcF9tYXN0ZXIKK29tcF9uZXN0X2xvY2sKK29tcF90ZXN0X25lc3RfbG9jaworb21wX25lc3RlZAorb21wX251bV90aHJlYWRzCitvbXBfdGVzdGxvY2sKK29tcF90aHJlYWRwcml2YXRlCitvbXBfZ2V0X3d0aWNrcworIyMjb21wX3dvcmtzaGFyZV9kZWZhdWx0CitvbXBfd29ya3NoYXJlCisjIyMgQnJhdWNodCBtYW4gZGVuIG9kZXIgb2JpZ2VuIGVyd2VpdGVybj8KK29tcF93dGltZQorcGFyX2RvX2ZpcnN0cHJpdmF0ZQorcGFyX2RvX2xhc3Rwcml2YXRlCitwYXJfZG9fb3JkZXJlZAorcGFyX2RvX3ByaXZhdGUKK3Bhcl9kb19yZWR1Y3Rpb24KK3Bhcl9zZWN0aW9uX2ZpcnN0cHJpdmF0ZQorcGFyX3NlY3Rpb25fbGFzdHByaXZhdGUKK3Bhcl9zZWN0aW9uX3ByaXZhdGUKK3Bhcl9zZWN0aW9uX3JlZHVjdAorc2VjdGlvbl9maXJzdHByaXZhdGUKK3NlY3Rpb25fbGFzdHByaXZhdGUKK3NlY3Rpb25fcHJpdmF0ZQorc2VjdGlvbl9yZWR1Y3Rpb24KK29tcF9zaW5nbGUKK3NpbmdsZV9jb3B5cHJpdmF0ZQorc2luZ2xlX25vd2FpdAorc2luZ2xlX3ByaXZhdGUKKworIyBOZXcgdGVzdHMgZm9yIE9wZW5NUCAzLjAKK2RvX2NvbGxhcHNlCitvbXBfbWFzdGVyXzMKK29tcF90YXNrCitvbXBfdGFza19pZgorb21wX3Rhc2tfdW50aWVkCitvbXBfdGFza19zaGFyZWQKK29tcF90YXNrX3ByaXZhdGUKK29tcF90YXNrX2ZpcnN0cHJpdmF0ZQorb21wX3Rhc2t3YWl0CisKKyMgTmV3IHRlc3RzIGZvciBPcGVuTVAgMy4xCisjb21wX3Rhc2t5aWVsZAorI29tcF90YXNrX2ZpbmFsCmRpZmYgLS1naXQgYS9yYzMvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMgYi9yYzMvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uY2EwMTUzNAotLS0gL2Rldi9udWxsCisrKyBiL3JjMy90ZXN0c3VpdGUvdGVzdHNfdG9faW50ZWdyYXRlL29tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuYwpAQCAtMCwwICsxLDY3IEBACisvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqXAorICBFeHRlbmRlZCB2ZXJzaW9uIG9mIG9tcF9zZXRfdW5zZXRfbG9jay5jIGZvciB0ZXN0aW5nIGhpbnRlZCBsb2Nrcy4KKyAgQ2hlY2sgdG8gbWFrZSBzdXJlIE9wZW5NUCBsb2NrcyBndWFyYW50ZWUgbXV0dWFsIAorICBleGNsdXNpb24gZm9yIG11bHRpcGxlIHRocmVhZHMuCitcKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLworCQorI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5jbHVkZSA8c3RkbGliLmg+CisjaW5jbHVkZSA8b21wLmg+CisKK3ZvaWQgY3NjYWxsKGludCBpZCwgaW50IG5bMTAwMF0sIGludCAqcGFzc2VkLCBvbXBfbG9ja190ICpsb2NrKSB7CisgICAgaW50IGk7CisKKyAgICBvbXBfc2V0X2xvY2soIGxvY2sgKTsKKyAgICBmb3IgKGkgPSAwOyBpIDwgMTAwMDsgaSsrKSB7CisgICAgICAgIG5baV0gPSBpZDsKKyAgICB9CisgICAgZm9yIChpID0gMDsgaSA8IDEwMDA7IGkrKykgeworICAgICAgICBpZiAoIG5baV0gIT0gaWQgKSB7CisgICAgICAgICAgICAqcGFzc2VkID0gMDsKKyAgICAgICAgfQorICAgIH0KKyAgICBvbXBfdW5zZXRfbG9jayggbG9jayApOworfQorCitpbnQgaGludGVkX2xvY2soa21wX2xvY2tfaGludF90IGhpbnQpIHsKKyAgICBpbnQgcGFzc2VkLCBuWzEwMDBdLCBqLCBpZDsKKyAgICBvbXBfbG9ja190IGxvY2s7CisgICAgCisgICAgcGFzc2VkID0gMTsKKworICAgIGttcF9pbml0X2xvY2tfaGludGVkKCZsb2NrLCBoaW50KTsKKworICAgICNwcmFnbWEgb21wIHBhcmFsbGVsIHNoYXJlZChuLCBwYXNzZWQsIGxvY2spIHByaXZhdGUoaWQsIGopCQorICAgIHsKKyAgICAgICAgaWQgPSBvbXBfZ2V0X3RocmVhZF9udW0oKTsKKyAgICAgICAgZm9yIChqID0gMTsgaiA8PSAxMDAwMDsgaisrKSB7CisgICAgICAgICAgICBjc2NhbGwoIGlkLCBuLCAmcGFzc2VkLCAmbG9jayApOworICAgICAgICB9CisgICAgfQorCisgICAgb21wX2Rlc3Ryb3lfbG9jaygmbG9jayk7CisKKyAgICBpZiAocGFzc2VkKSB7CisgICAgICAgIHJldHVybiAwOworICAgIH0gZWxzZSB7CisgICAgICAgIHJldHVybiAxOworICAgIH0KK30KKworaW50IG1haW4oKSB7CisgICAgaW50IHJldCA9IDA7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uZSk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfY29udGVuZGVkKTsKKyAgICByZXQgKz0gaGludGVkX2xvY2soa21wX2xvY2tfaGludF91bmNvbnRlbmRlZCk7CisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfbm9uc3BlY3VsYXRpdmUpOworICAgIHJldCArPSBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X3NwZWN1bGF0aXZlKTsKKyAgICAvLyBUaGlzIG9uZSB3aWxsIGVtaXQgV2FybmluZyBvbiBtYWNoaW5lcyB3aXRoIG5vIFRTWC4gCisgICAgcmV0ICs9IGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfYWRhcHRpdmUpOworICAgIGlmIChyZXQpIHsKKyAgICAgICAgcHJpbnRmKCIgVGVzdCAlcyBmYWlsZWRcbiIsIF9fRklMRV9fKTsKKyAgICAgICAgcmV0dXJuIDE7CisgICAgfSBlbHNlIHsKKyAgICAgICAgcHJpbnRmKCIgVGVzdCAlcyBwYXNzZWRcbiIsIF9fRklMRV9fKTsKKyAgICAgICAgcmV0dXJuIDA7CisgICAgfQorfQpkaWZmIC0tZ2l0IGEvcmMzL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIGIvcmMzL3Rlc3RzdWl0ZS90ZXN0c190b19pbnRlZ3JhdGUvb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmY3NDNkMzgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvdGVzdHN1aXRlL3Rlc3RzX3RvX2ludGVncmF0ZS9vbXBfc2V0X3Vuc2V0X2xvY2tfaGludGVkLmYKQEAgLTAsMCArMSw5MCBAQAorIQorISBNb2RpZmllZCB2ZXJzaW9uIG9mIG9tcF9zZXRfdW5zZXRfbG9jay5GLCB1c2luZyBoaW50ZWQgbG9jayBBUEkKKyEKKyAgICAgIHByb2dyYW0gb21wX3NldF91bnNldF9sb2NrX2hpbnRlZAorCisgICAgICBpbnRlZ2VyIHJldAorI2lmIGRlZmluZWQoX09QRU5NUCkKKyAgICAgIGluY2x1ZGUgJ29tcF9saWIuaCcKKworICAgICAgcmV0ID0gMAorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X25vbmUsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9jb250ZW5kZWQsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF91bmNvbnRlbmRlZCwgcmV0KQorICAgICAgY2FsbCBoaW50ZWRfbG9jayhrbXBfbG9ja19oaW50X25vbnNwZWN1bGF0aXZlLCByZXQpCisgICAgICBjYWxsIGhpbnRlZF9sb2NrKGttcF9sb2NrX2hpbnRfc3BlY3VsYXRpdmUsIHJldCkKKyAgICAgIGNhbGwgaGludGVkX2xvY2soa21wX2xvY2tfaGludF9hZGFwdGl2ZSwgcmV0KQorI2Vsc2UKKyAgICAgIHJldCA9IDAKKyNlbmRpZgorCisgICAgICBpZiAocmV0IC5lcS4gMCkgdGhlbgorICAgICAgICAgIHByaW50ICosICdUZXN0IG9tcF9zZXRfdW5zZXRfbG9ja19oaW50ZWQuZiBwYXNzZWQnCisgICAgICBlbHNlCisgICAgICAgICAgcHJpbnQgKiwgJ1Rlc3Qgb21wX3NldF91bnNldF9sb2NrX2hpbnRlZC5mIGZhaWxlZCcKKyAgICAgIGVuZGlmCisKKyAgICAgIHN0b3AKKyAgICAgIGVuZAorCisgICAgICBzdWJyb3V0aW5lIGhpbnRlZF9sb2NrKGxvY2tfaGludCwgcmV0KQorI2lmIGRlZmluZWQoX09QRU5NUCkKKyAgICAgIGluY2x1ZGUgJ29tcF9saWIuaCcKKyAgICAgIGludGVnZXIob21wX2xvY2tfa2luZCkgbG9jaworICAgICAgaW50ZWdlcihrbXBfbG9ja19oaW50X2tpbmQpIGxvY2tfaGludAorI2Vsc2UKKyAgICAgIGludGVnZXIgbG9jaworICAgICAgaW50ZWdlciBsb2NrX2hpbnQKKyNlbmRpZgorICAgICAgaW50ZWdlciByZXQKKyAgICAgIGxvZ2ljYWwgcGFzc2VkCisgICAgICBpbnRlZ2VyIG4oMTAwMCksIGosIGlkCisgICAgICAKKyAgICAgIHBhc3NlZCA9IC5UUlVFLgorCisgICAgICBjYWxsIGttcF9pbml0X2xvY2tfaGludGVkKGxvY2ssIGxvY2tfaGludCkKKworISRvbXAgIHBhcmFsbGVsCishJG9tcCYgICAgIHNoYXJlZCAgICAgICAobixwYXNzZWQsbG9jaykKKyEkb21wJiAgICAgcHJpdmF0ZSAgICAgIChpZCxqKSAgICAgIAorI2lmIGRlZmluZWQoX09QRU5NUCkgJiYgIWRlZmluZWQoX0FTU1VSRSkKKyAgICAgIGlkID0gb21wX2dldF90aHJlYWRfbnVtKCkKKyNlbHNlCisgICAgICBpZCA9IDAKKyNlbmRpZgorI2lmIGRlZmluZWQoX0FTU1VSRSkKKyAgICAgIGRvIGogPSAxLCAxMAorI2Vsc2UKKyAgICAgIGRvIGogPSAxLCAxMDAwMAorI2VuZGlmCisgICAgICAgICAgY2FsbCBjc2NhbGwoaWQsIG4sIHBhc3NlZCwgbG9jaykKKyAgICAgIGVuZGRvCishJG9tcCAgZW5kIHBhcmFsbGVsCisKKyAgICAgIGNhbGwgb21wX2Rlc3Ryb3lfbG9jayhsb2NrKQorCisgICAgICBpZiAoLm5vdC4gcGFzc2VkKSB0aGVuCisgICAgICAgICAgcmV0ID0gcmV0ICsgMQorICAgICAgZW5kaWYKKworICAgICAgZW5kCisKKyAgICAgIHN1YnJvdXRpbmUgY3NjYWxsKGlkLCBuLCBwYXNzZWQsIGxvY2spCisjaWYgZGVmaW5lZChfT1BFTk1QKQorICAgICAgICBpbmNsdWRlICdvbXBfbGliLmgnCisgICAgICBpbnRlZ2VyKG9tcF9sb2NrX2tpbmQpIGxvY2sKKyNlbHNlCisgICAgICBpbnRlZ2VyIGxvY2sKKyNlbmRpZgorICAgICAgaW50ZWdlciBpZCwgaSwgbigxMDAwKQorICAgICAgbG9naWNhbCBwYXNzZWQKKworICAgICAgY2FsbCBvbXBfc2V0X2xvY2sobG9jaykKKyAgICAgIGRvIGkgPSAxLDEwMDAKKyAgICAgICAgICBuKGkpID0gaWQKKyAgICAgIGVuZGRvCisgICAgICBkbyBpID0gMSwxMDAwCisgICAgICAgICAgaWYgKG4oaSkgLm5lLiBpZCkgcGFzc2VkID0gLkZBTFNFLgorICAgICAgZW5kZG8KKyAgICAgIGNhbGwgb21wX3Vuc2V0X2xvY2sobG9jaykKKyAgICAgIGVuZApkaWZmIC0tZ2l0IGEvcmMzL3d3dy9SRUFETUUudHh0IGIvcmMzL3d3dy9SRUFETUUudHh0Cm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLmE4NmQzZTgKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvd3d3L1JFQURNRS50eHQKQEAgLTAsMCArMSwxMTUgQEAKKworICAgICAgICAgICAgICAgUkVBRE1FIGZvciB0aGUgTExWTSogT3Blbk1QKiBSdW50aW1lIExpYnJhcnkKKyAgICAgICAgICAgICAgID09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK0hvdyB0byBCdWlsZCBEb2N1bWVudGF0aW9uCis9PT09PT09PT09PT09PT09PT09PT09PT09PQorCitUaGUgbWFpbiBkb2N1bWVudGF0aW9uIGlzIGluIERveHlnZW4qIGZvcm1hdCwgYW5kIHRoaXMgZGlzdHJpYnV0aW9uCitzaG91bGQgY29tZSB3aXRoIHByZS1idWlsdCBQREYgZG9jdW1lbnRhdGlvbiBpbiBkb2MvUmVmZXJlbmNlLnBkZi4KK0hvd2V2ZXIsIGFuIEhUTUwgdmVyc2lvbiBjYW4gYmUgYnVpbHQgYnkgZXhlY3V0aW5nOgorCislIGRveHlnZW4gZG9jL2RveHlnZW4vY29uZmlnCisKK2luIHRoZSBydW50aW1lIGRpcmVjdG9yeS4KKworVGhhdCB3aWxsIHByb2R1Y2UgSFRNTCBkb2N1bWVudGF0aW9uIGluIHRoZSBkb2MvZG94eWdlbi9nZW5lcmF0ZWQKK2RpcmVjdG9yeSwgd2hpY2ggY2FuIGJlIGFjY2Vzc2VkIGJ5IHBvaW50aW5nIGEgd2ViIGJyb3dzZXIgYXQgdGhlCitpbmRleC5odG1sIGZpbGUgdGhlcmUuCisKK0lmIHlvdSBkb24ndCBoYXZlIERveHlnZW4gaW5zdGFsbGVkLCB5b3UgY2FuIGRvd25sb2FkIGl0IGZyb20KK3d3dy5kb3h5Z2VuLm9yZy4KKworCitIb3cgdG8gQnVpbGQgdGhlIExMVk0qIE9wZW5NUCogUnVudGltZSBMaWJyYXJ5Cis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CitJbi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWJ1aWxkCiskIG1rZGlyIGJ1aWxkICYmIGNkIGJ1aWxkCiskIGNtYWtlIHBhdGgvdG8vbGx2bSAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2Ugb21wCisKK091dC1vZi10cmVlIGJ1aWxkOgorCiskIGNkIHdoZXJlLXlvdS13YW50LXRvLWxpdmUKK0NoZWNrIG91dCBvcGVubXAKKyQgY2Qgd2hlcmUteW91LXdhbnQtdG8tbGl2ZS9vcGVubXAvcnVudGltZQorJCBta2RpciBidWlsZCAmJiBjZCBidWlsZAorJCBjbWFrZSBwYXRoL3RvL29wZW5tcCAtRENNQUtFX0NfQ09NUElMRVI9PEMgY29tcGlsZXI+IC1EQ01BS0VfQ1hYX0NPTVBJTEVSPTxDKysgY29tcGlsZXI+CiskIG1ha2UKKworRm9yIGRldGFpbHMgYWJvdXQgYnVpbGRpbmcsIHBsZWFzZSBsb29rIGF0IEJ1aWxkX1dpdGhfQ01ha2UudHh0CisKK0FyY2hpdGVjdHVyZXMgU3VwcG9ydGVkCis9PT09PT09PT09PT09PT09PT09PT09PQorKiBJQS0zMiBhcmNoaXRlY3R1cmUKKyogSW50ZWwoUikgNjQgYXJjaGl0ZWN0dXJlCisqIEludGVsKFIpIE1hbnkgSW50ZWdyYXRlZCBDb3JlIEFyY2hpdGVjdHVyZQorKiBBUk0qIGFyY2hpdGVjdHVyZQorKiBBYXJjaDY0ICg2NC1iaXQgQVJNKSBhcmNoaXRlY3R1cmUKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAoYmlnIGVuZGlhbikKKyogSUJNKFIpIFBvd2VyIGFyY2hpdGVjdHVyZSAobGl0dGxlIGVuZGlhbikKKworU3VwcG9ydGVkIFJUTCBCdWlsZCBDb25maWd1cmF0aW9ucworPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQorCitTdXBwb3J0ZWQgQXJjaGl0ZWN0dXJlczogSUEtMzIgYXJjaGl0ZWN0dXJlLCBJbnRlbChSKSA2NCwgYW5kCitJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUKKworICAgICAgICAgICAgICAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCisgICAgICAgICAgICAgIHwgICBpY2MvaWNsICAgICB8ICAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tfAorfCBMaW51eCogT1MgICB8ICAgWWVzKDEsNSkgICAgfCAgWWVzKDIsNCkgICB8IFllcyg0LDYsNykgICB8Cit8IEZyZWVCU0QqICAgIHwgICBObyAgICAgICAgICB8ICBObyAgICAgICAgIHwgWWVzKDQsNiw3LDgpIHwKK3wgT1MgWCogICAgICAgfCAgIFllcygxLDMsNCkgIHwgIE5vICAgICAgICAgfCBZZXMoNCw2LDcpICAgfAorfCBXaW5kb3dzKiBPUyB8ICAgWWVzKDEsNCkgICAgfCAgTm8gICAgICAgICB8IE5vICAgICAgICAgICB8CistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIElBLTMyIGFyY2hpdGVjdHVyZSBhbmQgSW50ZWwoUikgNjQsIGljYy9pY2wgdmVyc2lvbnMgMTIueCBhcmUKKyAgICBzdXBwb3J0ZWQgKDEyLjEgaXMgcmVjb21tZW5kZWQpLgorKDIpIEdDQyogdmVyc2lvbiA0LjcgaXMgc3VwcG9ydGVkLgorKDMpIEZvciBpY2Mgb24gT1MgWCosIE9TIFgqIHZlcnNpb24gMTAuNS44IGlzIHN1cHBvcnRlZC4KKyg0KSBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUgbm90IHN1cHBvcnRlZC4KKyg1KSBPbiBJbnRlbChSKSBNYW55IEludGVncmF0ZWQgQ29yZSBBcmNoaXRlY3R1cmUsIGljYy9pY2wgdmVyc2lvbnMgMTMuMAorICAgIG9yIGxhdGVyIGFyZSByZXF1aXJlZC4KKyg2KSBDbGFuZyogdmVyc2lvbiAzLjMgaXMgc3VwcG9ydGVkLgorKDcpIENsYW5nKiBjdXJyZW50bHkgZG9lcyBub3Qgb2ZmZXIgYSBzb2Z0d2FyZS1pbXBsZW1lbnRlZCAxMjggYml0IGV4dGVuZGVkCisgICAgcHJlY2lzaW9uIHR5cGUuICBUaHVzLCBhbGwgZW50cnkgcG9pbnRzIHJlbGlhbnQgb24gdGhpcyB0eXBlIGFyZSByZW1vdmVkCisgICAgZnJvbSB0aGUgbGlicmFyeSBhbmQgY2Fubm90IGJlIGNhbGxlZCBpbiB0aGUgdXNlciBwcm9ncmFtLiAgVGhlIGZvbGxvd2luZworICAgIGZ1bmN0aW9ucyBhcmUgbm90IGF2YWlsYWJsZToKKyAgICBfX2ttcGNfYXRvbWljX2NtcGx4MTZfKgorICAgIF9fa21wY19hdG9taWNfZmxvYXQxNl8qCisgICAgX19rbXBjX2F0b21pY18qX2ZwCisoOCkgQ29tbXVuaXR5IGNvbnRyaWJ1dGlvbiBwcm92aWRlZCBBUyBJUywgbm90IHRlc3RlZCBieSBJbnRlbC4KKworU3VwcG9ydGVkIEFyY2hpdGVjdHVyZXM6IElCTShSKSBQb3dlciA3IGFuZCBQb3dlciA4CisKKyAgICAgICAgICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKyAgICAgICAgICAgICAgfCAgIGdjYyAgICAgIHwgICBjbGFuZyAgICAgIHwKKy0tLS0tLS0tLS0tLS0tfC0tLS0tLS0tLS0tLXwtLS0tLS0tLS0tLS0tLXwKK3wgTGludXgqIE9TICAgfCAgWWVzKDEsMikgIHwgWWVzKDMsNCkgICAgIHwKKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworKDEpIE9uIFBvd2VyIDcsIGdjYyB2ZXJzaW9uIDQuOC4yIGlzIHN1cHBvcnRlZC4KKygyKSBPbiBQb3dlciA4LCBnY2MgdmVyc2lvbiA0LjguMiBpcyBzdXBwb3J0ZWQuCisoMykgT24gUG93ZXIgNywgY2xhbmcgdmVyc2lvbiAzLjcgaXMgc3VwcG9ydGVkLgorKDQpIE9uIFBvd2VyIDgsIGNsYW5nIHZlcnNpb24gMy43IGlzIHN1cHBvcnRlZC4KKworCitGcm9udC1lbmQgQ29tcGlsZXJzIHRoYXQgd29yayB3aXRoIHRoaXMgUlRMCis9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09CisKK1RoZSBmb2xsb3dpbmcgY29tcGlsZXJzIGFyZSBrbm93biB0byBkbyBjb21wYXRpYmxlIGNvZGUgZ2VuZXJhdGlvbiBmb3IKK3RoaXMgUlRMOiBjbGFuZyAoZnJvbSB0aGUgT3Blbk1QIGRldmVsb3BtZW50IGJyYW5jaCBhdAoraHR0cDovL2NsYW5nLW9tcC5naXRodWIuaW8vICksIEludGVsIGNvbXBpbGVycywgR0NDLiAgU2VlIHRoZSBkb2N1bWVudGF0aW9uCitmb3IgbW9yZSBkZXRhaWxzLgorCistLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQorCitOb3RpY2VzCis9PT09PT09CisKKypPdGhlciBuYW1lcyBhbmQgYnJhbmRzIG1heSBiZSBjbGFpbWVkIGFzIHRoZSBwcm9wZXJ0eSBvZiBvdGhlcnMuCmRpZmYgLS1naXQgYS9yYzMvd3d3L1JlZmVyZW5jZS5wZGYgYi9yYzMvd3d3L1JlZmVyZW5jZS5wZGYKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4uZTk3YzQwYwotLS0gL2Rldi9udWxsCisrKyBiL3JjMy93d3cvUmVmZXJlbmNlLnBkZgpCaW5hcnkgZmlsZXMgZGlmZmVyCmRpZmYgLS1naXQgYS9yYzMvd3d3L2NvbnRlbnQuY3NzIGIvcmMzL3d3dy9jb250ZW50LmNzcwpuZXcgZmlsZSBtb2RlIDEwMDY0NAppbmRleCAwMDAwMDAwLi5kY2E2YTMyCi0tLSAvZGV2L251bGwKKysrIGIvcmMzL3d3dy9jb250ZW50LmNzcwpAQCAtMCwwICsxLDI3IEBACitodG1sIHsgbWFyZ2luOiAwcHg7IH0gYm9keSB7IG1hcmdpbjogOHB4OyB9CisKK2h0bWwsIGJvZHkgeworICBwYWRkaW5nOjBweDsKKyAgZm9udC1zaXplOnNtYWxsOyBmb250LWZhbWlseToiTHVjaWRhIEdyYW5kZSIsICJMdWNpZGEgU2FucyBVbmljb2RlIiwgQXJpYWwsIFZlcmRhbmEsIEhlbHZldGljYSwgc2Fucy1zZXJpZjsgYmFja2dyb3VuZC1jb2xvcjogI2ZmZjsgY29sb3I6ICMyMjI7CisgIGxpbmUtaGVpZ2h0OjEuNTsKK30KKworaDEsIGgyLCBoMywgdHQgeyBjb2xvcjogIzAwMCB9CisKK2gxIHsgcGFkZGluZy10b3A6MHB4OyBtYXJnaW4tdG9wOjBweDt9CitoMiB7IGNvbG9yOiMzMzMzMzM7IHBhZGRpbmctdG9wOjAuNWVtOyB9CitoMyB7IHBhZGRpbmctdG9wOiAwLjVlbTsgbWFyZ2luLWJvdHRvbTogLTAuMjVlbTsgY29sb3I6IzJkNThiN30KK2xpIHsgcGFkZGluZy1ib3R0b206IDAuNWVtOyB9Cit1bCB7IHBhZGRpbmctbGVmdDoxLjVlbTsgfQorCisvKiBTbGlkZXMgKi8KK0lNRy5pbWdfc2xpZGUgeworICAgIGRpc3BsYXk6IGJsb2NrOworICAgIG1hcmdpbi1sZWZ0OiBhdXRvOworICAgIG1hcmdpbi1yaWdodDogYXV0bworfQorCisuaXRlbVRpdGxlIHsgY29sb3I6IzJkNThiNyB9CisKKy8qIFRhYmxlcyAqLwordHIgeyB2ZXJ0aWNhbC1hbGlnbjp0b3AgfQpkaWZmIC0tZ2l0IGEvcmMzL3d3dy9pbmRleC5odG1sIGIvcmMzL3d3dy9pbmRleC5odG1sCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjNhYTY4MmEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvd3d3L2luZGV4Lmh0bWwKQEAgLTAsMCArMSwyMzggQEAKKzwhRE9DVFlQRSBIVE1MIFBVQkxJQyAiLS8vVzNDLy9EVEQgSFRNTCA0LjAxLy9FTiIKKyAgICAgICAgICAiaHR0cDovL3d3dy53My5vcmcvVFIvaHRtbDQvc3RyaWN0LmR0ZCI+Cis8IS0tIE1hdGVyaWFsIHVzZWQgZnJvbTogSFRNTCA0LjAxIHNwZWNzOiBodHRwOi8vd3d3LnczLm9yZy9UUi9odG1sNDAxLyAtLT4KKzxodG1sPgorPGhlYWQ+CisgIDxNRVRBIGh0dHAtZXF1aXY9IkNvbnRlbnQtVHlwZSIgY29udGVudD0idGV4dC9odG1sOyBjaGFyc2V0PUlTTy04ODU5LTEiPgorICA8dGl0bGU+T3Blbk1QKiA6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L3RpdGxlPgorICA8bGluayB0eXBlPSJ0ZXh0L2NzcyIgcmVsPSJzdHlsZXNoZWV0IiBocmVmPSJtZW51LmNzcyI+CisgIDxsaW5rIHR5cGU9InRleHQvY3NzIiByZWw9InN0eWxlc2hlZXQiIGhyZWY9ImNvbnRlbnQuY3NzIj4KKzwvaGVhZD4KKworPGJvZHk+Cis8ZGl2IGlkPSJtZW51Ij4KKyAgPGRpdj4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvIj5MTFZNIEhvbWU8L2E+CisgIDwvZGl2PgorCisgIDxkaXYgY2xhc3M9InN1Ym1lbnUiPgorICAgIDxsYWJlbD5PcGVuTVAgSW5mbzwvbGFiZWw+CisgICAgPGEgaHJlZj0iL2luZGV4Lmh0bWwiPkFib3V0PC9hPgorICA8L2Rpdj4KKworICA8ZGl2IGNsYXNzPSJzdWJtZW51Ij4KKyAgICA8bGFiZWw+UXVpY2sgTGlua3M8L2xhYmVsPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9saXN0cy5sbHZtLm9yZy9tYWlsbWFuL2xpc3RpbmZvL29wZW5tcC1kZXYiPm9wZW5tcC1kZXY8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xpc3RzLmxsdm0ub3JnL21haWxtYW4vbGlzdGluZm8vb3Blbm1wLWNvbW1pdHMiPm9wZW5tcC1jb21taXRzPC9hPgorICAgIDxhIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9idWdzLyI+QnVnIFJlcG9ydHM8L2E+CisgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL3N2bi9sbHZtLXByb2plY3Qvb3Blbm1wL3RydW5rLyI+QnJvd3NlIFNWTjwvYT4KKyAgICA8YSBocmVmPSJodHRwOi8vbGx2bS5vcmcvdmlld3ZjL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsvIj5Ccm93c2UgVmlld1ZDPC9hPgorICA8L2Rpdj4KKzwvZGl2PgorCis8ZGl2IGlkPSJjb250ZW50Ij4KKyAgPCEtLSoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi0tPgorICA8aDE+T3Blbk1QJnJlZzs6IFN1cHBvcnQgZm9yIHRoZSBPcGVuTVAgbGFuZ3VhZ2U8L2gxPgorICA8IS0tKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLS0+CisKKyAgPHA+VGhlIE9wZW5NUCBzdWJwcm9qZWN0IG9mIExMVk0gY29udGFpbnMgdGhlCisgICAgIGNvbXBvbmVudHMgcmVxdWlyZWQgdG8gYnVpbGQgYW4gZXhlY3V0YWJsZSBPcGVuTVAgcHJvZ3JhbSB0aGF0IGFyZQorICAgICBvdXRzaWRlIHRoZSBjb21waWxlciBpdHNlbGYuCisgIDwvcD4KKworICA8cD5IZXJlIHlvdSBjYW4gZmluZCA6LQorICAgIDx1bD4KKyAgICAgIDxsaT4KKyAgICAgICAgdGhlIGNvZGUgZm9yIHRoZSBydW50aW1lIGxpYnJhcnkgYWdhaW5zdCB3aGljaAorICAgICAgICBjb2RlIGNvbXBpbGVkIGJ5IDx0dD5jbGFuZyAtZm9wZW5tcDwvdHQ+IG11c3QgYmUgbGlua2VkIGJlZm9yZSBpdAorICAgICAgICBjYW4gcnVuLgorICAgICAgPC9saT4KKyAgICAgIDxsaT4KKyAgICAgICAgdGhlIGxpYnJhcnkgdGhhdCBzdXBwb3J0cyBvZmZsb2FkIHRvIHRhcmdldCBkZXZpY2VzIChpbgorICAgICAgICAib2ZmbG9hZCIpCisgICAgICA8L2xpPgorICAgICAgPGxpPgorICAgICAgICB0aGUgT3BlblVIIHRlc3Qtc3VpdGUgdXNlZCB0byB2YWxpZGF0ZSB0aGUgT3Blbk1QIHJ1bnRpbWUKKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgPC9wPgorCisgIDxwPlN1cHBvcnQgZm9yIHRoZSBwYXJ0cyBvZiB0aGUgT3Blbk1QIDQuMCAoYW5kIGxhdGVyKSBsYW5ndWFnZSB0aGF0IGFyZSBub3QKKyAgYXNzb2NpYXRlZCB3aXRoIHRoZSAidGFyZ2V0IiBjb25zdHJ1Y3RzIGFyZSBjb250YWluZWQgaW4gdGhlCisgICJydW50aW1lIiBkaXJlY3RvcnkuIFN1cHBvcnQgZm9yIG9mZmxvYWRpbmcgY29tcHV0YXRpb24gdmlhIHRoZQorICAidGFyZ2V0IiBkaXJlY3RpdmUgaXMgaW4gdGhlIHNlcGFyYXRlICJvZmZsb2FkIiBkaXJlY3RvcnkuIFRoYXQKKyAgYnVpbGRzIGEgbGlicmFyeSB0aGF0IHByb3ZpZGVzIHRoZSBpbnRlcmZhY2VzIGZvciB0cmFuc2ZlcnJpbmcgY29kZQorICBhbmQgZGF0YSB0byBhdHRhY2hlZCBjb21wdXRhdGlvbmFsIGRldmljZXMgc3VjaCBhcworICB0aGUgSW50ZWwmcmVnIFhlb24gUGhpJiMwMTUzIGNvcHJvY2Vzc29yIG9yIEdQVXMuCisgIFRoZSBSRUFETUUudHh0IGluIHRoZSAib2ZmbG9hZCIKKyAgZGlyZWN0b3J5IGRlc2NyaWJlcyBob3cgdG8gYnVpbGQgdGhlIG9mZmxvYWQgbGlicmFyeS4KKyAgPC9wPgorCisgIDxwPkFsbCBvZiB0aGUgY29kZSBoZXJlIGlzIDxhCisgICAgIGhyZWY9Imh0dHA6Ly9sbHZtLm9yZy9kb2NzL0RldmVsb3BlclBvbGljeS5odG1sI2xpY2Vuc2UiPmR1YWwgbGljZW5zZWQ8L2E+CisgICAgIHVuZGVyIHRoZSBNSVQgbGljZW5zZSBhbmQgdGhlIFVJVUMgTGljZW5zZSAoYSBCU0QtbGlrZSBsaWNlbnNlKS4KKyAgICAgVGhlIExJQ0VOU0UudHh0IGZpbGUgYXQgdGhlIHRvcCBvZiB0aGUgT3Blbk1QIHByb2plY3QgY29udGFpbnMKKyAgICAgdGhlIGxpY2Vuc2UgdGV4dCBhbmQgYXNzb2NpYXRlZCBwYXRlbnQgZ3JhbnRzLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9ImRpci1zdHJ1Y3R1cmUiPlN0YXR1czwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICAgPHA+V2l0aCB0aGUgcmVsZWFzZSBvZiBDbGFuZyAzLjguMCwgT3Blbk1QIDMuMSBzdXBwb3J0IGlzIGVuYWJsZWQgaW4KKyAgIENsYW5nIGJ5IGRlZmF1bHQsIGFuZCB0aGUgT3Blbk1QIHJ1bnRpbWUgaXMgdGhlcmVmb3JlIGJ1aWx0IGFzIGEKKyAgIG5vcm1hbCBwYXJ0IG9mIHRoZSBDbGFuZyBidWlsZCwgYW5kIGRpc3RyaWJ1dGVkIHdpdGggdGhlIGJpbmFyeQorICAgZGlzdHJpYnV0aW9ucy5Zb3UgZG8gbm90LCB0aGVyZWZvcmUsIG5lZWQgZXhwbGljaXRseSB0byBjaGVjayBvdXQgdGhpcyBjb2RlLCBvcgorICAgYnVpbGQgaXQgb3V0IG9mIHRyZWU7IGEgbm9ybWFsIENsYW5nIGNoZWNrIG91dCBhbmQgYnVpbGQgd2lsbAorICAgYXV0b21hdGljYWxseSBpbmNsdWRlIGJ1aWxkaW5nIHRoZXNlIHJ1bnRpbWUgbGlicmFyaWVzLgorICAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyIGlkPSJnb2FscyI+RmVhdHVyZXMgYW5kIEdvYWxzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCisgICAgPHVsPgorICAgICAgICA8bGk+U3VwcG9ydCBmb3IgdGhlIDxhIGhyZWY9Imh0dHA6Ly93d3cub3Blbm1wLm9yZy9tcC1kb2N1bWVudHMvT3Blbk1QMy4xLnBkZiI+T3Blbk1QCisgICAgICAgICAgMy4xIHN0YW5kYXJkIChQREYpPC9hPiBoYXMgYmVlbiBhY2hpZXZlZCBpbiB0aGUgQ2xhbmcgMy44LjAKKyAgICAgICAgICByZWxlYXNlLgorICAgICAgICA8L2xpPgorCisgICAgICAgIDxsaT5TdXBwb3J0IGZvciB0aGUKKyA8YSBocmVmPSJodHRwOi8vd3d3Lm9wZW5tcC5vcmcvbXAtZG9jdW1lbnRzL09wZW5NUDQuMC4wLnBkZiI+T3Blbk1QCisgICAgICAgICAgNC4wIHN0YW5kYXJkIChQREYpPC9hPiBhbmQgPGEgaHJlZj0iaHR0cDovL3d3dy5vcGVubXAub3JnL21wLWRvY3VtZW50cy9PcGVuTVA0LjUucGRmIj5PcGVuTVAKKyAgICAgICAgICA0LjUgc3RhbmRhcmQgKFBERik8L2E+IGlzIG5vdyBiZWluZyBpbXBsZW1lbnRlZC4gKFNvbWUgT3Blbk1QIDQuMAorICAgICAgICAgIGFuZCA0LjUgZmVhdHVyZXMgYXJlIGFscmVhZHkgYXZhaWxhYmxlKS4KKyAgICAgICAgPGxpPkhpZ2ggcGVyZm9ybWFuY2UuPC9saT4KKyAgICAgICAgPGxpPkFCSSBjb21wYXRpYmlsaXR5IHdpdGggPGEgaHJlZj0iaHR0cDovL2djYy5nbnUub3JnIj5HY2M8L2E+IGFuZAorICAgICAgICA8YSBocmVmPSJodHRwOi8vc29mdHdhcmUuaW50ZWwuY29tL2VuLXVzL2ludGVsLWNvbXBpbGVycyI+SW50ZWwncworICAgICAgICBleGlzdGluZyBPcGVuTVAgY29tcGlsZXJzLjwvYT4KKyAgICAgICAgV2UgY3VycmVudGx5IGhhdmUgYmluYXJ5IGNvbXBhdGliaWxpdHkgd2l0aCBPcGVuTVAKKyAgICAgICAgMy4xIGNvZGUgY29tcGlsZWQgYnkgZ2NjIDQuOSwgaG93ZXZlciB3ZSBkbyBub3QgaGF2ZSBzdXBwb3J0CisgICAgICAgIGZvciBPcGVuTVAgNC4wIGNvZGUgdGhhdCB1c2VzIHRhc2sgY2FuY2VsbGF0aW9uIHdoZW4gY29tcGlsZWQKKyAgICAgICAgYnkgZ2NjIDQuOS4gSG93IHdlIHdpbGwgc3VwcG9ydCBzdWNoIGNvZGUgcmVtYWlucyBhIHJlc2VhcmNoIGlzc3VlLgorICAgICAgICA8L2xpPgorICAgIDwvdWw+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9IndoeSI+V2h5IGhhdmUgdGhlIHJ1bnRpbWUgY29kZSBoZXJlPzwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICA8cD5JdCBtYWtlcyBzZW5zZSB0byBoYXZlIHRoZSBydW50aW1lIHNvdXJjZXMgaW4gdGhlIHNhbWUgcGxhY2UKKyAgICAoYW5kIHdpdGggdGhlIHNhbWUgbGljZW5zZSkgYXMgdGhlIGNvbXBpbGVyLgorICA8L3A+CisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDIgaWQ9InJlcXVpcmVtZW50cyI+UGxhdGZvcm0gU3VwcG9ydDwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworICAgPHA+VGhlIHJ1bnRpbWUgY2FuIGJlIGJ1aWx0IHdpdGggZ2NjLCBpY2Mgb3IgY2xhbmcuIEhvd2V2ZXIsIG5vdGUKKyAgIHRoYXQgYSBydW50aW1lIGJ1aWx0IHdpdGggY2xhbmcgY2Fubm90IGJlIGd1YXJhbnRlZWQgdG8gd29yayB3aXRoCisgICBPcGVuTVAgY29kZSBjb21waWxlZCBieSB0aGUgb3RoZXIgY29tcGlsZXJzLCBzaW5jZSBjbGFuZyBkb2VzIG5vdCBzdXBwb3J0CisgICBhIDEyOC1iaXQgZmxvYXQgdHlwZSwgYW5kIGNhbm5vdCB0aGVyZWZvcmUgZ2VuZXJhdGUgdGhlIGNvZGUgdXNlZAorICAgZm9yIHJlZHVjdGlvbnMgb2YgdGhhdCB0eXBlICh3aGljaCBtYXkgb2NjdXIgaW4gdXNlciBjb2RlIGNvbXBpbGVkCisgICBieSB0aGUgb3RoZXIgY29tcGlsZXJzKS4KKyAgIDwvcD4KKworICA8cD5UaGUgT3Blbk1QIHJ1bnRpbWUgaXMga25vd24gdG8gd29yayBvbgorICAgIDx1bD4KKyAgICAgIDxsaT5BUk0mcmVnOyZuYnNwOyBhcmNoaXRlY3R1cmUgcHJvY2Vzc29yczwvbGk+CisgICAgICA8bGk+UG93ZXJQQyZ0cmFkZTsmbmJzcDsgcHJvY2Vzc29yczwvbGk+CisgICAgICA8bGk+MzIgYW5kIDY0IGJpdCBYODYKKyAgICAgICAgcHJvY2Vzc29ycyB3aGVuIGNvbXBpbGVkIHdpdGggY2xhbmcsIHdpdGggdGhlIEludGVsIGNvbXBpbGVyCisgICAgICAgIG9yIHdpdGggZ2NjLCBhbmQgYWxzbyB0aGUgSW50ZWwmcmVnOyZuYnNwO1hlb24gUGhpJnRyYWRlOyBwcm9kdWN0IGZhbWlseSwgd2hlbiBjb21waWxlZCB3aXRoCisgICAgICAgIHRoZSBJbnRlbCBjb21waWxlci4KKyAgICAgIDwvbGk+CisgICAgPC91bD4KKyAgICBQb3J0cyB0byBvdGhlciBhcmNoaXRlY3R1cmVzIGFuZCBvcGVyYXRpbmcgc3lzdGVtcyBhcmUgd2VsY29tZS4KKyAgPC9wPgorCisgIDxwPkEgZnVsbCBPUyBhbmQgYXJjaGllY3R1cmUgY29tcGF0aWJpbGl0eSBtYXRyaXggaXMgaW4KKyAgICA8YSBocmVmPSJSRUFETUUudHh0Ij5SRUFETUUudHh0PC9hPgorICA8L3A+CisKKworICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisgIDxoMj5HZXQgaXQgYW5kIGdldCBpbnZvbHZlZCE8L2gyPgorICA8IS0tPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09LS0+CisKKyAgPHA+Rmlyc3QgcGxlYXNlIHJldmlldyBvdXIKKyAgICAgPGEgaHJlZj0iaHR0cDovL2xsdm0ub3JnL2RvY3MvRGV2ZWxvcGVyUG9saWN5Lmh0bWwiPkRldmVsb3BlcidzIFBvbGljeTwvYT4uCisKKyAgPHA+VG8gY2hlY2sgb3V0IHRoZSBjb2RlLCB1c2U6PC9wPgorCisgIDx1bD4KKyAgPGxpPjxjb2RlPnN2biBjbyBodHRwOi8vbGx2bS5vcmcvc3ZuL2xsdm0tcHJvamVjdC9vcGVubXAvdHJ1bmsgb3Blbm1wPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+CisgICAgIE5vdGUgdGhhdCBmb3IgYW4gaW4tdHJlZSBidWlsZCwgeW91IHNob3VsZCBjaGVjayBvdXQgb3Blbm1wIHRvIGxsdm0vcHJvamVjdHMuCisgIDwvcD4KKworICA8cD5Jbi10cmVlIGJ1aWxkOjwvcD4KKyAgPHVsPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlPC9jb2RlPjwvbGk+CisgICAgPGxpPkNoZWNrIG91dCBvcGVubXAgaW50byBsbHZtL3Byb2plY3RzPC9saT4KKyAgICA8bGk+PGNvZGU+Y2Qgd2hlcmUteW91LXdhbnQtdG8tYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+bWtkaXIgYnVpbGQgJmFtcDsmYW1wOyBjZCBidWlsZDwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5jbWFrZSBwYXRoL3RvL2xsdm0gLURDTUFLRV9DX0NPTVBJTEVSPSZsdDtDIGNvbXBpbGVyJmd0OyAtRENNQUtFX0NYWF9DT01QSUxFUj0mbHQ7QysrIGNvbXBpbGVyJmd0OzwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5tYWtlIG9tcDwvY29kZT48L2xpPgorICA8L3VsPgorCisgIDxwPk91dC1vZi10cmVlIGJ1aWxkOjwvcD4KKyAgPHVsPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlPC9jb2RlPjwvbGk+CisgICAgPGxpPkNoZWNrIG91dCBvcGVubXA8L2xpPgorICAgIDxsaT48Y29kZT5jZCB3aGVyZS15b3Utd2FudC10by1saXZlL29wZW5tcC9ydW50aW1lPC9jb2RlPjwvbGk+CisgICAgPGxpPjxjb2RlPm1rZGlyIGJ1aWxkICZhbXA7JmFtcDsgY2QgYnVpbGQ8L2NvZGU+PC9saT4KKyAgICA8bGk+PGNvZGU+Y21ha2UgcGF0aC90by9vcGVubXAgLURDTUFLRV9DX0NPTVBJTEVSPSZsdDtDIGNvbXBpbGVyJmd0OyAtRENNQUtFX0NYWF9DT01QSUxFUj0mbHQ7QysrIGNvbXBpbGVyJmd0OzwvY29kZT48L2xpPgorICAgIDxsaT48Y29kZT5tYWtlPC9jb2RlPjwvbGk+CisgIDwvdWw+CisKKyAgPHA+RnVsbCBkZXRhaWxzIG9mIGhvdyB0byBidWlsZCBhcmUgaW4gdGhlCisgICAgPGEgaHJlZj0iUkVBRE1FLnR4dCI+UkVBRE1FLnR4dDwvYT4gYW5kIEJ1aWxkX1dpdGhfQ01ha2UudHh0IChpbnNpZGUgdGhlIHJ1bnRpbWUvIHN1YmRpcmVjdG9yeSkKKyAgPC9wPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgzPk5vdGVzPC9oMz4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorCis8cD4KKworPC9wPgorCisgIDxwPlNlbmQgZGlzY3Vzc2lvbnMgdG8gdGhlCisgICg8YSBocmVmPSJodHRwOi8vbGlzdHMubGx2bS5vcmcvbWFpbG1hbi9saXN0aW5mby9vcGVubXAtZGV2Ij5PcGVuTVAgbWFpbGluZyBsaXN0PC9hPikuPC9wPgorCisKKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorICA8aDI+RGVzaWduIERvY3VtZW50czwvaDI+CisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKworPHVsPgorPGxpPjxhIGhyZWY9IlJlZmVyZW5jZS5wZGYiPlJ1bnRpbWUgZGVzaWduIChQREYpPC9hPjwvbGk+Cis8L3VsPgorCisgIDwhLS09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0tLT4KKyAgPGgyPkNvcHlyaWdodCBub3RpY2VzPC9oMj4KKyAgPCEtLT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PS0tPgorPHVsPgorPGxpPgorICBUaGUgT3Blbk1QIG5hbWUgYW5kIHRoZSBPcGVuTVAgbG9nbyBhcmUgcmVnaXN0ZXJlZCB0cmFkZW1hcmtzIG9mIHRoZQorICBPcGVuTVAgQXJjaGl0ZWN0dXJlIFJldmlldyBCb2FyZC4KKzwvbGk+Cis8bGk+CisgIEludGVsIGlzIGEgdHJhZGVtYXJrIG9mIEludGVsIENvcnBvcmF0aW9uIGluIHRoZSBVLlMuIGFuZC9vciBvdGhlcgorICBjb3VudHJpZXMuCis8L2xpPgorPGxpPgorICBQb3dlclBDIGlzIGEgdHJhZGVtYXJrIG9mIElCTSBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3Igb3RoZXIKKyAgY291bnRyaWVzLgorPC9saT4KKzxsaT4KKyAgQVJNIGlzIGEgdHJhZGVtYXJrIG9mIEFSTSBDb3Jwb3JhdGlvbiBpbiB0aGUgVS5TLiBhbmQvb3IKKyAgb3RoZXIgY291bnRyaWVzLgorPC9saT4KKzwvdWw+Cis8L2Rpdj4KKzwvYm9keT4KKzwvaHRtbD4KZGlmZiAtLWdpdCBhL3JjMy93d3cvbWVudS5jc3MgYi9yYzMvd3d3L21lbnUuY3NzCm5ldyBmaWxlIG1vZGUgMTAwNjQ0CmluZGV4IDAwMDAwMDAuLjRhODg3YjEKLS0tIC9kZXYvbnVsbAorKysgYi9yYzMvd3d3L21lbnUuY3NzCkBAIC0wLDAgKzEsMzkgQEAKKy8qKioqKioqKioqKioqKiovCisvKiBwYWdlIGxheW91dCAqLworLyoqKioqKioqKioqKioqKi8KKworW2lkPW1lbnVdIHsKKwlwb3NpdGlvbjpmaXhlZDsKKwl3aWR0aDoyNWV4OworfQorW2lkPWNvbnRlbnRdIHsKKwkvKiAqKioqKiAgRURJVCBUSElTIFZBTFVFIElGIENPTlRFTlQgT1ZFUkxBUFMgTUVOVSAqKioqKiAqLworCXBvc2l0aW9uOmFic29sdXRlOworICBsZWZ0OjI5ZXg7CisJcGFkZGluZy1yaWdodDo0ZXg7Cit9CisKKy8qKioqKioqKioqKioqKi8KKy8qIG1lbnUgc3R5bGUgKi8KKy8qKioqKioqKioqKioqKi8KKworI21lbnUgLnN1Ym1lbnUgeworCXBhZGRpbmctdG9wOjFlbTsKKwlkaXNwbGF5OmJsb2NrOworfQorCisjbWVudSBsYWJlbCB7CisJZGlzcGxheTpibG9jazsKKwlmb250LXdlaWdodDogYm9sZDsKKwl0ZXh0LWFsaWduOiBjZW50ZXI7CisJYmFja2dyb3VuZC1jb2xvcjogcmdiKDE5MiwxOTIsMTkyKTsKK30KKyNtZW51IGEgeworCXBhZGRpbmc6MCAuMmVtOworCWRpc3BsYXk6YmxvY2s7CisJdGV4dC1hbGlnbjogY2VudGVyOworCWJhY2tncm91bmQtY29sb3I6IHJnYigyMzUsMjM1LDIzNSk7Cit9CisjbWVudSBhOnZpc2l0ZWQgeworCWNvbG9yOnJnYigxMDAsNTAsMTAwKTsKK30K